summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2009-05-22 01:27:01 -0700
committerMathias Agopian <mathias@google.com>2009-05-22 02:16:08 -0700
commit947f4f4d384ea26eb2145cc070a3eed42c59534a (patch)
treeedc5fb1e6e808a2b809720f44b6236ebe93b577b /core
parent6158b1bf0364da1582468a98ec09d004ba99deec (diff)
parent0690519fcde1ccb189081aa79df61436f65686c2 (diff)
downloadframeworks_base-947f4f4d384ea26eb2145cc070a3eed42c59534a.zip
frameworks_base-947f4f4d384ea26eb2145cc070a3eed42c59534a.tar.gz
frameworks_base-947f4f4d384ea26eb2145cc070a3eed42c59534a.tar.bz2
merge master to master_gl
Diffstat (limited to 'core')
-rw-r--r--core/java/android/app/ActivityManagerNative.java34
-rw-r--r--core/java/android/app/ApplicationErrorReport.java295
-rw-r--r--core/java/android/app/DatePickerDialog.java2
-rw-r--r--core/java/android/app/IActivityManager.java26
-rw-r--r--core/java/android/app/SearchDialog.java95
-rw-r--r--core/java/android/app/SuggestionsAdapter.java35
-rw-r--r--core/java/android/backup/BackupDataOutput.java28
-rw-r--r--core/java/android/backup/FileBackupHelper.java7
-rw-r--r--core/java/android/bluetooth/Database.java200
-rw-r--r--core/java/android/content/AbstractSyncableContentProvider.java172
-rw-r--r--core/java/android/content/ContentProvider.java24
-rw-r--r--core/java/android/content/ContentProviderOperation.java358
-rw-r--r--core/java/android/content/ContentProviderResult.java39
-rw-r--r--core/java/android/content/OperationApplicationException.java36
-rw-r--r--core/java/android/content/pm/ApplicationInfo.java24
-rw-r--r--core/java/android/content/pm/PackageParser.java48
-rwxr-xr-xcore/java/android/gesture/Gesture.java298
-rw-r--r--core/java/android/gesture/GestureConstants.java26
-rw-r--r--core/java/android/gesture/GestureLibrary.java346
-rwxr-xr-xcore/java/android/gesture/GestureOverlayView.java419
-rw-r--r--core/java/android/gesture/GesturePoint.java46
-rw-r--r--core/java/android/gesture/GestureStroke.java215
-rwxr-xr-xcore/java/android/gesture/GestureUtilities.java444
-rwxr-xr-xcore/java/android/gesture/Instance.java115
-rw-r--r--core/java/android/gesture/InstanceLearner.java91
-rwxr-xr-xcore/java/android/gesture/Learner.java83
-rw-r--r--core/java/android/gesture/LetterRecognizer.java273
-rw-r--r--core/java/android/gesture/OrientedBoundingBox.java85
-rwxr-xr-xcore/java/android/gesture/Prediction.java33
-rw-r--r--core/java/android/gesture/TouchThroughGestureListener.java171
-rw-r--r--core/java/android/net/http/RequestQueue.java73
-rw-r--r--core/java/android/os/Build.java22
-rw-r--r--core/java/android/os/LatencyTimer.java94
-rw-r--r--core/java/android/os/Process.java14
-rw-r--r--core/java/android/pim/EventRecurrence.java14
-rw-r--r--core/java/android/provider/Checkin.java5
-rw-r--r--core/java/android/provider/Contacts.java35
-rw-r--r--core/java/android/provider/Im.java104
-rw-r--r--core/java/android/provider/Settings.java155
-rw-r--r--core/java/android/server/search/SearchManagerService.java31
-rw-r--r--core/java/android/server/search/Searchables.java9
-rw-r--r--core/java/android/syncml/pim/PropertyNode.java194
-rw-r--r--core/java/android/syncml/pim/VBuilderCollection.java100
-rw-r--r--core/java/android/syncml/pim/VDataBuilder.java293
-rw-r--r--core/java/android/syncml/pim/VParser.java17
-rw-r--r--core/java/android/syncml/pim/vcard/ContactStruct.java922
-rw-r--r--core/java/android/syncml/pim/vcard/VCardComposer.java35
-rw-r--r--core/java/android/syncml/pim/vcard/VCardDataBuilder.java442
-rw-r--r--core/java/android/syncml/pim/vcard/VCardEntryCounter.java63
-rw-r--r--core/java/android/syncml/pim/vcard/VCardNestedException.java27
-rw-r--r--core/java/android/syncml/pim/vcard/VCardParser_V21.java638
-rw-r--r--core/java/android/syncml/pim/vcard/VCardParser_V30.java111
-rw-r--r--core/java/android/syncml/pim/vcard/VCardSourceDetector.java140
-rw-r--r--core/java/android/text/format/DateFormat.java50
-rw-r--r--core/java/android/text/format/DateUtils.java100
-rw-r--r--core/java/android/text/format/Time.java15
-rw-r--r--core/java/android/util/CharsetUtils.java13
-rw-r--r--core/java/android/view/MotionEvent.java73
-rw-r--r--core/java/android/view/SurfaceView.java13
-rw-r--r--core/java/android/view/View.java62
-rw-r--r--core/java/android/view/ViewRoot.java29
-rw-r--r--core/java/android/view/Window.java6
-rw-r--r--core/java/android/view/WindowManager.java18
-rw-r--r--core/java/android/webkit/gears/AndroidRadioDataProvider.java10
-rw-r--r--core/java/android/widget/ExpandableListView.java5
-rw-r--r--core/java/android/widget/ImageButton.java32
-rw-r--r--core/java/android/widget/ListView.java60
-rw-r--r--core/java/android/widget/TextView.java78
-rw-r--r--core/java/com/android/internal/app/IBatteryStats.aidl4
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java26
-rw-r--r--core/java/com/google/android/net/GoogleHttpClient.java120
-rw-r--r--core/jni/ActivityManager.cpp6
-rw-r--r--core/jni/Android.mk3
-rw-r--r--core/jni/AndroidRuntime.cpp10
-rw-r--r--core/jni/CursorWindow.cpp2
-rw-r--r--core/jni/CursorWindow.h2
-rw-r--r--core/jni/android/graphics/Bitmap.cpp2
-rw-r--r--core/jni/android/graphics/Region.cpp2
-rw-r--r--core/jni/android_backup_BackupDataOutput.cpp70
-rw-r--r--core/jni/android_backup_FileBackupHelper.cpp9
-rw-r--r--core/jni/android_bluetooth_Database.cpp183
-rw-r--r--core/jni/android_hardware_Camera.cpp2
-rw-r--r--core/jni/android_location_GpsLocationProvider.cpp2
-rw-r--r--core/jni/android_media_AudioTrack.cpp4
-rw-r--r--core/jni/android_opengl_GLES10.cpp25
-rw-r--r--core/jni/android_text_format_Time.cpp11
-rw-r--r--core/jni/android_util_Binder.cpp10
-rw-r--r--core/jni/android_util_Binder.h2
-rw-r--r--core/jni/android_util_Process.cpp37
-rw-r--r--core/jni/com_google_android_gles_jni_GLImpl.cpp25
-rw-r--r--core/res/AndroidManifest.xml26
-rw-r--r--core/res/res/drawable/search_spinner.xml36
-rwxr-xr-xcore/res/res/drawable/search_spinner_anim1.pngbin0 -> 523 bytes
-rwxr-xr-xcore/res/res/drawable/search_spinner_anim10.pngbin0 -> 529 bytes
-rwxr-xr-xcore/res/res/drawable/search_spinner_anim11.pngbin0 -> 525 bytes
-rwxr-xr-xcore/res/res/drawable/search_spinner_anim12.pngbin0 -> 527 bytes
-rwxr-xr-xcore/res/res/drawable/search_spinner_anim2.pngbin0 -> 525 bytes
-rwxr-xr-xcore/res/res/drawable/search_spinner_anim3.pngbin0 -> 522 bytes
-rwxr-xr-xcore/res/res/drawable/search_spinner_anim4.pngbin0 -> 519 bytes
-rwxr-xr-xcore/res/res/drawable/search_spinner_anim5.pngbin0 -> 521 bytes
-rwxr-xr-xcore/res/res/drawable/search_spinner_anim6.pngbin0 -> 509 bytes
-rwxr-xr-xcore/res/res/drawable/search_spinner_anim7.pngbin0 -> 517 bytes
-rwxr-xr-xcore/res/res/drawable/search_spinner_anim8.pngbin0 -> 533 bytes
-rwxr-xr-xcore/res/res/drawable/search_spinner_anim9.pngbin0 -> 534 bytes
-rw-r--r--core/res/res/drawable/stat_ecb_mode.pngbin0 -> 625 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_data_dormant_1xrtt.pngbin0 -> 1081 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_data_dormant_evdo.pngbin0 -> 1008 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_roaming_cdma_0.pngbin0 -> 377 bytes
-rw-r--r--core/res/res/drawable/stat_sys_roaming_cdma_flash.xml25
-rwxr-xr-xcore/res/res/drawable/stat_sys_roaming_cdma_flash_anim0.pngbin0 -> 150 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_roaming_cdma_flash_anim1.pngbin0 -> 377 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_signal_cdma_0.pngbin0 -> 701 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_signal_cdma_1.pngbin0 -> 714 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_signal_cdma_2.pngbin0 -> 706 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_signal_cdma_3.pngbin0 -> 702 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_signal_cdma_4.pngbin0 -> 621 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_signal_evdo_0.pngbin0 -> 912 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_signal_evdo_1.pngbin0 -> 925 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_signal_evdo_2.pngbin0 -> 904 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_signal_evdo_3.pngbin0 -> 907 bytes
-rwxr-xr-xcore/res/res/drawable/stat_sys_signal_evdo_4.pngbin0 -> 823 bytes
-rw-r--r--core/res/res/layout/google_web_content_helper_layout.xml26
-rw-r--r--core/res/res/layout/search_bar.xml1
-rw-r--r--core/res/res/raw/latin_lowercasebin0 -> 28494 bytes
-rw-r--r--core/res/res/values-ar-rEG/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-bg-rBG/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-ca-rES/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-cs-rCZ/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-cs/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-cs/strings.xml101
-rw-r--r--core/res/res/values-da-rDK/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-de-rAT/donottranslate-cldr.xml75
-rw-r--r--core/res/res/values-de-rCH/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-de-rDE/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-de-rLI/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-de/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-de/strings.xml101
-rw-r--r--core/res/res/values-el-rGR/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-en-rAU/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-en-rAU/strings.xml10
-rw-r--r--core/res/res/values-en-rCA/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-en-rGB/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-en-rIE/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-en-rIN/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-en-rNZ/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-en-rSG/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-en-rSG/strings.xml10
-rw-r--r--core/res/res/values-en-rUS/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-en-rZA/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-es-rES/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-es-rUS/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-es-rUS/strings.xml101
-rw-r--r--core/res/res/values-es/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-es/strings.xml101
-rw-r--r--core/res/res/values-fi-rFI/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-fr-rBE/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-fr-rCA/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-fr-rCH/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-fr-rFR/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-fr/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-fr/strings.xml101
-rw-r--r--core/res/res/values-he-rIL/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-hi-rIN/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-hu-rHU/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-id-rID/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-it-rCH/donottranslate-cldr.xml103
-rw-r--r--core/res/res/values-it-rIT/donottranslate-cldr.xml103
-rw-r--r--core/res/res/values-it/donottranslate-cldr.xml103
-rw-r--r--core/res/res/values-it/strings.xml101
-rw-r--r--core/res/res/values-ja-rJP/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-ja/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-ja/strings.xml101
-rw-r--r--core/res/res/values-ko-rKR/donottranslate-cldr.xml96
-rw-r--r--core/res/res/values-ko/donottranslate-cldr.xml96
-rw-r--r--core/res/res/values-ko/strings.xml101
-rw-r--r--core/res/res/values-lt-rLT/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-lv-rLV/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-nb/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-nb/strings.xml99
-rw-r--r--core/res/res/values-nl-rBE/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-nl-rNL/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-nl/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-nl/strings.xml101
-rw-r--r--core/res/res/values-pl-rPL/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-pl/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-pl/strings.xml101
-rw-r--r--core/res/res/values-pt-rBR/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-pt-rPT/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-ro-rRO/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-ru-rRU/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-ru/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-ru/strings.xml101
-rw-r--r--core/res/res/values-sk-rSK/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-sl-rSI/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-sr-rRS/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-sv-rSE/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-th-rTH/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-tr-rTR/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-uk-rUA/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-vi-rVN/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-zh-rCN/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-zh-rCN/strings.xml101
-rw-r--r--core/res/res/values-zh-rTW/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values-zh-rTW/strings.xml101
-rw-r--r--core/res/res/values/arrays.xml3
-rw-r--r--core/res/res/values/attrs.xml17
-rw-r--r--core/res/res/values/colors.xml3
-rw-r--r--core/res/res/values/config.xml4
-rw-r--r--core/res/res/values/donottranslate-cldr.xml108
-rw-r--r--core/res/res/values/public.xml64
-rw-r--r--core/res/res/values/strings.xml424
-rw-r--r--core/res/res/values/themes.xml1
-rw-r--r--core/res/res/xml/eri.xml118
213 files changed, 14805 insertions, 3050 deletions
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 541f413..16f0a30 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -998,6 +998,20 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
return true;
}
+ case STOP_APP_SWITCHES_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ stopAppSwitches();
+ reply.writeNoException();
+ return true;
+ }
+
+ case RESUME_APP_SWITCHES_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ resumeAppSwitches();
+ reply.writeNoException();
+ return true;
+ }
+
case PEEK_SERVICE_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
Intent service = Intent.CREATOR.createFromParcel(data);
@@ -2182,5 +2196,25 @@ class ActivityManagerProxy implements IActivityManager
return res;
}
+ public void stopAppSwitches() throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ mRemote.transact(STOP_APP_SWITCHES_TRANSACTION, data, reply, 0);
+ reply.readException();
+ reply.recycle();
+ data.recycle();
+ }
+
+ public void resumeAppSwitches() throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ mRemote.transact(RESUME_APP_SWITCHES_TRANSACTION, data, reply, 0);
+ reply.readException();
+ reply.recycle();
+ data.recycle();
+ }
+
private IBinder mRemote;
}
diff --git a/core/java/android/app/ApplicationErrorReport.java b/core/java/android/app/ApplicationErrorReport.java
new file mode 100644
index 0000000..72cbff4
--- /dev/null
+++ b/core/java/android/app/ApplicationErrorReport.java
@@ -0,0 +1,295 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Log;
+import android.util.Printer;
+
+/**
+ * Describes an application error.
+ *
+ * A report has a type, which is one of
+ * <ul>
+ * <li> {@link #TYPE_CRASH} application crash. Information about the crash
+ * is stored in {@link #crashInfo}.
+ * <li> {@link #TYPE_ANR} application not responding. Information about the
+ * ANR is stored in {@link #anrInfo}.
+ * <li> {@link #TYPE_NONE} uninitialized instance of {@link ApplicationErrorReport}.
+ * </ul>
+ *
+ * @hide
+ */
+
+public class ApplicationErrorReport implements Parcelable {
+ /**
+ * Uninitialized error report.
+ */
+ public static final int TYPE_NONE = 0;
+
+ /**
+ * An error report about an application crash.
+ */
+ public static final int TYPE_CRASH = 1;
+
+ /**
+ * An error report about an application that's not responding.
+ */
+ public static final int TYPE_ANR = 2;
+
+ /**
+ * Type of this report. Can be one of {@link #TYPE_NONE},
+ * {@link #TYPE_CRASH} or {@link #TYPE_ANR}.
+ */
+ public int type;
+
+ /**
+ * Package name of the application.
+ */
+ public String packageName;
+
+ /**
+ * Package name of the application which installed the application this
+ * report pertains to.
+ * This identifies which Market the application came from.
+ */
+ public String installerPackageName;
+
+ /**
+ * Process name of the application.
+ */
+ public String processName;
+
+ /**
+ * Time at which the error occurred.
+ */
+ public long time;
+
+ /**
+ * If this report is of type {@link #TYPE_CRASH}, contains an instance
+ * of CrashInfo describing the crash; otherwise null.
+ */
+ public CrashInfo crashInfo;
+
+ /**
+ * If this report is of type {@link #TYPE_ANR}, contains an instance
+ * of AnrInfo describing the ANR; otherwise null.
+ */
+ public AnrInfo anrInfo;
+
+ /**
+ * Create an uninitialized instance of {@link ApplicationErrorReport}.
+ */
+ public ApplicationErrorReport() {
+ }
+
+ /**
+ * Create an instance of {@link ApplicationErrorReport} initialized from
+ * a parcel.
+ */
+ ApplicationErrorReport(Parcel in) {
+ type = in.readInt();
+ packageName = in.readString();
+ installerPackageName = in.readString();
+ processName = in.readString();
+ time = in.readLong();
+
+ switch (type) {
+ case TYPE_CRASH:
+ crashInfo = new CrashInfo(in);
+ break;
+ case TYPE_ANR:
+ anrInfo = new AnrInfo(in);
+ break;
+ }
+ }
+
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(type);
+ dest.writeString(packageName);
+ dest.writeString(installerPackageName);
+ dest.writeString(processName);
+ dest.writeLong(time);
+
+ switch (type) {
+ case TYPE_CRASH:
+ crashInfo.writeToParcel(dest, flags);
+ break;
+ case TYPE_ANR:
+ anrInfo.writeToParcel(dest, flags);
+ break;
+ }
+ }
+
+ /**
+ * Describes an application crash.
+ */
+ public static class CrashInfo {
+ /**
+ * Class name of the exception that caused the crash.
+ */
+ public String exceptionClassName;
+
+ /**
+ * File which the exception was thrown from.
+ */
+ public String throwFileName;
+
+ /**
+ * Class which the exception was thrown from.
+ */
+ public String throwClassName;
+
+ /**
+ * Method which the exception was thrown from.
+ */
+ public String throwMethodName;
+
+ /**
+ * Stack trace.
+ */
+ public String stackTrace;
+
+ /**
+ * Create an uninitialized instance of CrashInfo.
+ */
+ public CrashInfo() {
+ }
+
+ /**
+ * Create an instance of CrashInfo initialized from a Parcel.
+ */
+ public CrashInfo(Parcel in) {
+ exceptionClassName = in.readString();
+ throwFileName = in.readString();
+ throwClassName = in.readString();
+ throwMethodName = in.readString();
+ stackTrace = in.readString();
+ }
+
+ /**
+ * Save a CrashInfo instance to a parcel.
+ */
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(exceptionClassName);
+ dest.writeString(throwFileName);
+ dest.writeString(throwClassName);
+ dest.writeString(throwMethodName);
+ dest.writeString(stackTrace);
+ }
+
+ /**
+ * Dump a CrashInfo instance to a Printer.
+ */
+ public void dump(Printer pw, String prefix) {
+ pw.println(prefix + "exceptionClassName: " + exceptionClassName);
+ pw.println(prefix + "throwFileName: " + throwFileName);
+ pw.println(prefix + "throwClassName: " + throwClassName);
+ pw.println(prefix + "throwMethodName: " + throwMethodName);
+ pw.println(prefix + "stackTrace: " + stackTrace);
+ }
+ }
+
+ /**
+ * Describes an application not responding error.
+ */
+ public static class AnrInfo {
+ /**
+ * Activity name.
+ */
+ public String activity;
+
+ /**
+ * Description of the operation that timed out.
+ */
+ public String cause;
+
+ /**
+ * Additional info, including CPU stats.
+ */
+ public String info;
+
+ /**
+ * Create an uninitialized instance of AnrInfo.
+ */
+ public AnrInfo() {
+ }
+
+ /**
+ * Create an instance of AnrInfo initialized from a Parcel.
+ */
+ public AnrInfo(Parcel in) {
+ activity = in.readString();
+ cause = in.readString();
+ info = in.readString();
+ }
+
+ /**
+ * Save an AnrInfo instance to a parcel.
+ */
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(activity);
+ dest.writeString(cause);
+ dest.writeString(info);
+ }
+
+ /**
+ * Dump an AnrInfo instance to a Printer.
+ */
+ public void dump(Printer pw, String prefix) {
+ pw.println(prefix + "activity: " + activity);
+ pw.println(prefix + "cause: " + cause);
+ pw.println(prefix + "info: " + info);
+ }
+ }
+
+ public static final Parcelable.Creator<ApplicationErrorReport> CREATOR
+ = new Parcelable.Creator<ApplicationErrorReport>() {
+ public ApplicationErrorReport createFromParcel(Parcel source) {
+ return new ApplicationErrorReport(source);
+ }
+
+ public ApplicationErrorReport[] newArray(int size) {
+ return new ApplicationErrorReport[size];
+ }
+ };
+
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * Dump the report to a Printer.
+ */
+ public void dump(Printer pw, String prefix) {
+ pw.println(prefix + "type: " + type);
+ pw.println(prefix + "packageName: " + packageName);
+ pw.println(prefix + "installerPackageName: " + installerPackageName);
+ pw.println(prefix + "processName: " + processName);
+ pw.println(prefix + "time: " + time);
+
+ switch (type) {
+ case TYPE_CRASH:
+ crashInfo.dump(pw, prefix);
+ break;
+ case TYPE_ANR:
+ anrInfo.dump(pw, prefix);
+ break;
+ }
+ }
+}
diff --git a/core/java/android/app/DatePickerDialog.java b/core/java/android/app/DatePickerDialog.java
index 863cbcc..78bbb4f 100644
--- a/core/java/android/app/DatePickerDialog.java
+++ b/core/java/android/app/DatePickerDialog.java
@@ -46,7 +46,6 @@ public class DatePickerDialog extends AlertDialog implements OnClickListener,
private final DatePicker mDatePicker;
private final OnDateSetListener mCallBack;
private final Calendar mCalendar;
- private final java.text.DateFormat mDateFormat;
private final java.text.DateFormat mTitleDateFormat;
private final String[] mWeekDays;
@@ -108,7 +107,6 @@ public class DatePickerDialog extends AlertDialog implements OnClickListener,
DateFormatSymbols symbols = new DateFormatSymbols();
mWeekDays = symbols.getShortWeekdays();
- mDateFormat = DateFormat.getMediumDateFormat(context);
mTitleDateFormat = java.text.DateFormat.
getDateInstance(java.text.DateFormat.FULL);
mCalendar = Calendar.getInstance();
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 56b29c1..d15a154 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -44,9 +44,30 @@ import java.util.List;
* {@hide}
*/
public interface IActivityManager extends IInterface {
+ /**
+ * Returned by startActivity() if the start request was canceled because
+ * app switches are temporarily canceled to ensure the user's last request
+ * (such as pressing home) is performed.
+ */
+ public static final int START_SWITCHES_CANCELED = 4;
+ /**
+ * Returned by startActivity() if an activity wasn't really started, but
+ * the given Intent was given to the existing top activity.
+ */
public static final int START_DELIVERED_TO_TOP = 3;
+ /**
+ * Returned by startActivity() if an activity wasn't really started, but
+ * a task was simply brought to the foreground.
+ */
public static final int START_TASK_TO_FRONT = 2;
+ /**
+ * Returned by startActivity() if the caller asked that the Intent not
+ * be executed if it is the recipient, and that is indeed the case.
+ */
public static final int START_RETURN_INTENT_TO_CALLER = 1;
+ /**
+ * Activity was started successfully as normal.
+ */
public static final int START_SUCCESS = 0;
public static final int START_INTENT_NOT_RESOLVED = -1;
public static final int START_CLASS_NOT_FOUND = -2;
@@ -225,6 +246,9 @@ public interface IActivityManager extends IInterface {
public boolean shutdown(int timeout) throws RemoteException;
+ public void stopAppSwitches() throws RemoteException;
+ public void resumeAppSwitches() throws RemoteException;
+
/*
* Private non-Binder interfaces
*/
@@ -371,4 +395,6 @@ public interface IActivityManager extends IInterface {
int PEEK_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+84;
int PROFILE_CONTROL_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+85;
int SHUTDOWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+86;
+ int STOP_APP_SWITCHES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+87;
+ int RESUME_APP_SWITCHES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+88;
}
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index 343380c..aaaf7bf 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -31,7 +31,13 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.Cursor;
+import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
+import android.location.Criteria;
+import android.location.Location;
+import android.location.LocationListener;
+import android.location.LocationManager;
+import android.location.LocationProvider;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
@@ -103,6 +109,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
private Button mGoButton;
private ImageButton mVoiceButton;
private View mSearchPlate;
+ private AnimationDrawable mWorkingSpinner;
// interaction with searchable application
private SearchableInfo mSearchable;
@@ -143,6 +150,15 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
private final WeakHashMap<String, Drawable> mOutsideDrawablesCache =
new WeakHashMap<String, Drawable>();
+ // Objects we keep around for requesting location updates when the dialog is started
+ // (and canceling them when the dialog is stopped). We don't actually make use of the
+ // updates ourselves here, so the LocationListener is just a dummy which doesn't do
+ // anything. We only do this here so that other suggest providers which wish to provide
+ // location-based suggestions are more likely to get a good fresh location.
+ private LocationManager mLocationManager;
+ private LocationProvider mLocationProvider;
+ private LocationListener mDummyLocationListener;
+
/**
* Constructor - fires it up and makes it look like the search UI.
*
@@ -182,6 +198,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
mGoButton = (Button) findViewById(com.android.internal.R.id.search_go_btn);
mVoiceButton = (ImageButton) findViewById(com.android.internal.R.id.search_voice_btn);
mSearchPlate = findViewById(com.android.internal.R.id.search_plate);
+ mWorkingSpinner = (AnimationDrawable) getContext().getResources().
+ getDrawable(com.android.internal.R.drawable.search_spinner);
// attach listeners
mSearchAutoComplete.addTextChangedListener(mTextWatcher);
@@ -217,6 +235,37 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
mVoiceAppSearchIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
+
+ mLocationManager =
+ (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
+
+ if (mLocationManager != null) {
+ Criteria criteria = new Criteria();
+ criteria.setAccuracy(Criteria.ACCURACY_COARSE);
+
+ String providerName = mLocationManager.getBestProvider(criteria, true);
+
+ if (providerName != null) {
+ mLocationProvider = mLocationManager.getProvider(providerName);
+ }
+
+ // Just a dumb listener that doesn't do anything - requesting location updates here
+ // is only intended to give location-based suggestion providers the best chance
+ // of getting a good fresh location.
+ mDummyLocationListener = new LocationListener() {
+ public void onLocationChanged(Location location) {
+ }
+
+ public void onProviderDisabled(String provider) {
+ }
+
+ public void onProviderEnabled(String provider) {
+ }
+
+ public void onStatusChanged(String provider, int status, Bundle extras) {
+ }
+ };
+ }
}
/**
@@ -239,7 +288,6 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
return doShow(initialQuery, selectInitialQuery, componentName, appSearchData, globalSearch);
}
-
/**
* Called in response to a press of the hard search button in
* {@link #onKeyDown(int, KeyEvent)}, this method toggles between in-app
@@ -360,6 +408,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
// receive broadcasts
getContext().registerReceiver(mBroadcastReceiver, mCloseDialogsFilter);
getContext().registerReceiver(mBroadcastReceiver, mPackageFilter);
+
+ startLocationUpdates();
}
/**
@@ -372,6 +422,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
public void onStop() {
super.onStop();
+ stopLocationUpdates();
+
// TODO: Removing the listeners means that they never get called, since
// Dialog.dismissDialog() calls onStop() before sendDismissMessage().
setOnCancelListener(null);
@@ -396,6 +448,43 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
}
/**
+ * Asks the LocationManager for location updates so that it goes and gets a fresh location
+ * if needed.
+ */
+ private void startLocationUpdates() {
+ if (mLocationManager != null && mLocationProvider != null) {
+ mLocationManager.requestLocationUpdates(mLocationProvider.getName(),
+ 0, 0, mDummyLocationListener, getContext().getMainLooper());
+ }
+
+ }
+
+ /**
+ * Makes sure to stop listening for location updates to save battery.
+ */
+ private void stopLocationUpdates() {
+ mLocationManager.removeUpdates(mDummyLocationListener);
+ }
+
+ /**
+ * Sets the search dialog to the 'working' state, which shows a working spinner in the
+ * right hand size of the text field.
+ *
+ * @param working true to show spinner, false to hide spinner
+ */
+ public void setWorking(boolean working) {
+ if (working) {
+ mSearchAutoComplete.setCompoundDrawablesWithIntrinsicBounds(
+ null, null, mWorkingSpinner, null);
+ mWorkingSpinner.start();
+ } else {
+ mSearchAutoComplete.setCompoundDrawablesWithIntrinsicBounds(
+ null, null, null, null);
+ mWorkingSpinner.stop();
+ }
+ }
+
+ /**
* Closes and gets rid of the suggestions adapter.
*/
private void closeSuggestionsAdapter() {
@@ -563,8 +652,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
// attach the suggestions adapter, if suggestions are available
// The existence of a suggestions authority is the proxy for "suggestions available here"
if (mSearchable.getSuggestAuthority() != null) {
- mSuggestionsAdapter = new SuggestionsAdapter(getContext(), mSearchable,
- mOutsideDrawablesCache);
+ mSuggestionsAdapter = new SuggestionsAdapter(getContext(), this, mSearchable,
+ mOutsideDrawablesCache, mGlobalSearchMode);
mSearchAutoComplete.setAdapter(mSuggestionsAdapter);
}
}
diff --git a/core/java/android/app/SuggestionsAdapter.java b/core/java/android/app/SuggestionsAdapter.java
index 6a02fc9..2fe9a8d 100644
--- a/core/java/android/app/SuggestionsAdapter.java
+++ b/core/java/android/app/SuggestionsAdapter.java
@@ -25,6 +25,7 @@ import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
+import android.os.Bundle;
import android.server.search.SearchableInfo;
import android.text.Html;
import android.text.TextUtils;
@@ -45,12 +46,18 @@ import java.util.WeakHashMap;
* @hide
*/
class SuggestionsAdapter extends ResourceCursorAdapter {
+ // The value used to query a cursor whether it is still expecting more input,
+ // so we can correctly display (or not display) the 'working' spinner in the search dialog.
+ public static final String IS_WORKING = "isWorking";
+
private static final boolean DBG = false;
private static final String LOG_TAG = "SuggestionsAdapter";
+ private SearchDialog mSearchDialog;
private SearchableInfo mSearchable;
private Context mProviderContext;
private WeakHashMap<String, Drawable> mOutsideDrawablesCache;
+ private boolean mGlobalSearchMode;
// Cached column indexes, updated when the cursor changes.
private int mFormatCol;
@@ -61,12 +68,13 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
private int mIconBitmap1Col;
private int mIconBitmap2Col;
- public SuggestionsAdapter(Context context, SearchableInfo searchable,
- WeakHashMap<String, Drawable> outsideDrawablesCache) {
+ public SuggestionsAdapter(Context context, SearchDialog searchDialog, SearchableInfo searchable,
+ WeakHashMap<String, Drawable> outsideDrawablesCache, boolean globalSearchMode) {
super(context,
com.android.internal.R.layout.search_dropdown_item_icons_2line,
null, // no initial cursor
true); // auto-requery
+ mSearchDialog = searchDialog;
mSearchable = searchable;
// set up provider resources (gives us icons, etc.)
@@ -74,6 +82,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
mProviderContext = mSearchable.getProviderContext(mContext, activityContext);
mOutsideDrawablesCache = outsideDrawablesCache;
+ mGlobalSearchMode = globalSearchMode;
}
/**
@@ -118,6 +127,28 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
mIconBitmap1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1_BITMAP);
mIconBitmap2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_2_BITMAP);
}
+ updateWorking();
+ }
+
+ @Override
+ public void notifyDataSetChanged() {
+ super.notifyDataSetChanged();
+ updateWorking();
+ }
+
+ /**
+ * Updates the search dialog according to the current working status of the cursor.
+ */
+ private void updateWorking() {
+ if (!mGlobalSearchMode || mCursor == null) return;
+
+ Bundle request = new Bundle();
+ request.putString(SearchManager.EXTRA_DATA_KEY, IS_WORKING);
+ Bundle response = mCursor.respond(request);
+ if (response.containsKey(IS_WORKING)) {
+ boolean isWorking = response.getBoolean(IS_WORKING);
+ mSearchDialog.setWorking(isWorking);
+ }
}
/**
diff --git a/core/java/android/backup/BackupDataOutput.java b/core/java/android/backup/BackupDataOutput.java
index 555494e..25ae15b 100644
--- a/core/java/android/backup/BackupDataOutput.java
+++ b/core/java/android/backup/BackupDataOutput.java
@@ -22,24 +22,30 @@ import java.io.FileDescriptor;
/** @hide */
public class BackupDataOutput {
- /* package */ FileDescriptor fd;
+ int mBackupWriter;
+ private Context mContext;
public static final int OP_UPDATE = 1;
public static final int OP_DELETE = 2;
public BackupDataOutput(Context context, FileDescriptor fd) {
- this.fd = fd;
+ mContext = context;
+ if (fd == null) throw new NullPointerException();
+ mBackupWriter = ctor(fd);
+ if (mBackupWriter == 0) {
+ throw new RuntimeException("Native initialization failed with fd=" + fd);
+ }
}
- public void close() {
- // do we close the fd?
+ protected void finalize() throws Throwable {
+ try {
+ dtor(mBackupWriter);
+ } finally {
+ super.finalize();
+ }
}
- public native void flush();
- public native void write(byte[] buffer);
- public native void write(int oneByte);
- public native void write(byte[] buffer, int offset, int count);
-
- public native void writeOperation(int op);
- public native void writeKey(String key);
+
+ private native static int ctor(FileDescriptor fd);
+ private native static void dtor(int mBackupWriter);
}
diff --git a/core/java/android/backup/FileBackupHelper.java b/core/java/android/backup/FileBackupHelper.java
index 05159dc..ec16eb1 100644
--- a/core/java/android/backup/FileBackupHelper.java
+++ b/core/java/android/backup/FileBackupHelper.java
@@ -53,15 +53,12 @@ public class FileBackupHelper {
}
// oldStateFd can be null
FileDescriptor oldStateFd = oldState != null ? oldState.getFileDescriptor() : null;
- if (data.fd == null) {
- throw new NullPointerException();
- }
FileDescriptor newStateFd = newState.getFileDescriptor();
if (newStateFd == null) {
throw new NullPointerException();
}
- int err = performBackup_native(basePath, oldStateFd, data.fd, newStateFd, files);
+ int err = performBackup_native(basePath, oldStateFd, data.mBackupWriter, newStateFd, files);
if (err != 0) {
throw new RuntimeException("Backup failed"); // TODO: more here
@@ -69,5 +66,5 @@ public class FileBackupHelper {
}
native private static int performBackup_native(String basePath, FileDescriptor oldState,
- FileDescriptor data, FileDescriptor newState, String[] files);
+ int data, FileDescriptor newState, String[] files);
}
diff --git a/core/java/android/bluetooth/Database.java b/core/java/android/bluetooth/Database.java
deleted file mode 100644
index fef641a..0000000
--- a/core/java/android/bluetooth/Database.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.bluetooth;
-
-import android.bluetooth.RfcommSocket;
-
-import android.util.Log;
-
-import java.io.*;
-import java.util.*;
-
-/**
- * The Android Bluetooth API is not finalized, and *will* change. Use at your
- * own risk.
- *
- * A low-level API to the Service Discovery Protocol (SDP) Database.
- *
- * Allows service records to be added to the local SDP database. Once added,
- * these services will be advertised to remote devices when they make SDP
- * queries on this device.
- *
- * Currently this API is a thin wrapper to the bluez SDP Database API. See:
- * http://wiki.bluez.org/wiki/Database
- * http://wiki.bluez.org/wiki/HOWTO/ManagingServiceRecords
- * @hide
- */
-public final class Database {
- private static Database mInstance;
-
- private static final String sLogName = "android.bluetooth.Database";
-
- /**
- * Class load time initialization
- */
- static {
- classInitNative();
- }
- private native static void classInitNative();
-
- /**
- * Private to enforce singleton property
- */
- private Database() {
- initializeNativeDataNative();
- }
- private native void initializeNativeDataNative();
-
- protected void finalize() throws Throwable {
- try {
- cleanupNativeDataNative();
- } finally {
- super.finalize();
- }
- }
- private native void cleanupNativeDataNative();
-
- /**
- * Singelton accessor
- * @return The singleton instance of Database
- */
- public static synchronized Database getInstance() {
- if (mInstance == null) {
- mInstance = new Database();
- }
- return mInstance;
- }
-
- /**
- * Advertise a service with an RfcommSocket.
- *
- * This adds the service the SDP Database with the following attributes
- * set: Service Name, Protocol Descriptor List, Service Class ID List
- * TODO: Construct a byte[] record directly, rather than via XML.
- * @param socket The rfcomm socket to advertise (by channel).
- * @param serviceName A short name for this service
- * @param uuid
- * Unique identifier for this service, by which clients
- * can search for your service
- * @return Handle to the new service record
- */
- public int advertiseRfcommService(RfcommSocket socket,
- String serviceName,
- UUID uuid) throws IOException {
- String xmlRecord =
- "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
- "<record>\n" +
- " <attribute id=\"0x0001\">\n" + // ServiceClassIDList
- " <sequence>\n" +
- " <uuid value=\""
- + uuid.toString() + // UUID for this service
- "\"/>\n" +
- " </sequence>\n" +
- " </attribute>\n" +
- " <attribute id=\"0x0004\">\n" + // ProtocolDescriptorList
- " <sequence>\n" +
- " <sequence>\n" +
- " <uuid value=\"0x0100\"/>\n" + // L2CAP
- " </sequence>\n" +
- " <sequence>\n" +
- " <uuid value=\"0x0003\"/>\n" + // RFCOMM
- " <uint8 value=\"" +
- socket.getPort() + // RFCOMM port
- "\" name=\"channel\"/>\n" +
- " </sequence>\n" +
- " </sequence>\n" +
- " </attribute>\n" +
- " <attribute id=\"0x0100\">\n" + // ServiceName
- " <text value=\"" + serviceName + "\"/>\n" +
- " </attribute>\n" +
- "</record>\n";
- Log.i(sLogName, xmlRecord);
- return addServiceRecordFromXml(xmlRecord);
- }
-
-
- /**
- * Add a new service record.
- * @param record The byte[] record
- * @return A handle to the new record
- */
- public synchronized int addServiceRecord(byte[] record) throws IOException {
- int handle = addServiceRecordNative(record);
- Log.i(sLogName, "Added SDP record: " + Integer.toHexString(handle));
- return handle;
- }
- private native int addServiceRecordNative(byte[] record)
- throws IOException;
-
- /**
- * Add a new service record, using XML.
- * @param record The record as an XML string
- * @return A handle to the new record
- */
- public synchronized int addServiceRecordFromXml(String record) throws IOException {
- int handle = addServiceRecordFromXmlNative(record);
- Log.i(sLogName, "Added SDP record: " + Integer.toHexString(handle));
- return handle;
- }
- private native int addServiceRecordFromXmlNative(String record)
- throws IOException;
-
- /**
- * Update an exisiting service record.
- * @param handle Handle to exisiting record
- * @param record The updated byte[] record
- */
- public synchronized void updateServiceRecord(int handle, byte[] record) {
- try {
- updateServiceRecordNative(handle, record);
- } catch (IOException e) {
- Log.e(getClass().toString(), e.getMessage());
- }
- }
- private native void updateServiceRecordNative(int handle, byte[] record)
- throws IOException;
-
- /**
- * Update an exisiting record, using XML.
- * @param handle Handle to exisiting record
- * @param record The record as an XML string.
- */
- public synchronized void updateServiceRecordFromXml(int handle, String record) {
- try {
- updateServiceRecordFromXmlNative(handle, record);
- } catch (IOException e) {
- Log.e(getClass().toString(), e.getMessage());
- }
- }
- private native void updateServiceRecordFromXmlNative(int handle, String record)
- throws IOException;
-
- /**
- * Remove a service record.
- * It is only possible to remove service records that were added by the
- * current connection.
- * @param handle Handle to exisiting record to be removed
- */
- public synchronized void removeServiceRecord(int handle) {
- try {
- removeServiceRecordNative(handle);
- } catch (IOException e) {
- Log.e(getClass().toString(), e.getMessage());
- }
- }
- private native void removeServiceRecordNative(int handle) throws IOException;
-}
diff --git a/core/java/android/content/AbstractSyncableContentProvider.java b/core/java/android/content/AbstractSyncableContentProvider.java
index 1452985..05781f4 100644
--- a/core/java/android/content/AbstractSyncableContentProvider.java
+++ b/core/java/android/content/AbstractSyncableContentProvider.java
@@ -17,6 +17,8 @@ import java.util.Collections;
import java.util.Map;
import java.util.Vector;
import java.util.ArrayList;
+import java.util.Set;
+import java.util.HashSet;
import com.google.android.collect.Maps;
@@ -55,6 +57,9 @@ public abstract class AbstractSyncableContentProvider extends SyncableContentPro
return mIsTemporary;
}
+ private final ThreadLocal<Boolean> mApplyingBatch = new ThreadLocal<Boolean>();
+ private final ThreadLocal<Set<Uri>> mPendingBatchNotifications = new ThreadLocal<Set<Uri>>();
+
/**
* Indicates whether or not this ContentProvider contains a full
* set of data or just diffs. This knowledge comes in handy when
@@ -243,26 +248,37 @@ public abstract class AbstractSyncableContentProvider extends SyncableContentPro
public final int update(final Uri url, final ContentValues values,
final String selection, final String[] selectionArgs) {
mDb = mOpenHelper.getWritableDatabase();
- mDb.beginTransaction();
+ final boolean notApplyingBatch = !applyingBatch();
+ if (notApplyingBatch) {
+ mDb.beginTransaction();
+ }
try {
if (isTemporary() && mSyncState.matches(url)) {
int numRows = mSyncState.asContentProvider().update(
url, values, selection, selectionArgs);
- mDb.setTransactionSuccessful();
+ if (notApplyingBatch) {
+ mDb.setTransactionSuccessful();
+ }
return numRows;
}
int result = updateInternal(url, values, selection, selectionArgs);
- mDb.setTransactionSuccessful();
-
+ if (notApplyingBatch) {
+ mDb.setTransactionSuccessful();
+ }
if (!isTemporary() && result > 0) {
- getContext().getContentResolver().notifyChange(url, null /* observer */,
- changeRequiresLocalSync(url));
+ if (notApplyingBatch) {
+ getContext().getContentResolver().notifyChange(url, null /* observer */,
+ changeRequiresLocalSync(url));
+ } else {
+ mPendingBatchNotifications.get().add(url);
+ }
}
-
return result;
} finally {
- mDb.endTransaction();
+ if (notApplyingBatch) {
+ mDb.endTransaction();
+ }
}
}
@@ -270,44 +286,74 @@ public abstract class AbstractSyncableContentProvider extends SyncableContentPro
public final int delete(final Uri url, final String selection,
final String[] selectionArgs) {
mDb = mOpenHelper.getWritableDatabase();
- mDb.beginTransaction();
+ final boolean notApplyingBatch = !applyingBatch();
+ if (notApplyingBatch) {
+ mDb.beginTransaction();
+ }
try {
if (isTemporary() && mSyncState.matches(url)) {
int numRows = mSyncState.asContentProvider().delete(url, selection, selectionArgs);
- mDb.setTransactionSuccessful();
+ if (notApplyingBatch) {
+ mDb.setTransactionSuccessful();
+ }
return numRows;
}
int result = deleteInternal(url, selection, selectionArgs);
- mDb.setTransactionSuccessful();
+ if (notApplyingBatch) {
+ mDb.setTransactionSuccessful();
+ }
if (!isTemporary() && result > 0) {
- getContext().getContentResolver().notifyChange(url, null /* observer */,
- changeRequiresLocalSync(url));
+ if (notApplyingBatch) {
+ getContext().getContentResolver().notifyChange(url, null /* observer */,
+ changeRequiresLocalSync(url));
+ } else {
+ mPendingBatchNotifications.get().add(url);
+ }
}
return result;
} finally {
- mDb.endTransaction();
+ if (notApplyingBatch) {
+ mDb.endTransaction();
+ }
}
}
+ private boolean applyingBatch() {
+ return mApplyingBatch.get() != null && mApplyingBatch.get();
+ }
+
@Override
public final Uri insert(final Uri url, final ContentValues values) {
mDb = mOpenHelper.getWritableDatabase();
- mDb.beginTransaction();
+ final boolean notApplyingBatch = !applyingBatch();
+ if (notApplyingBatch) {
+ mDb.beginTransaction();
+ }
try {
if (isTemporary() && mSyncState.matches(url)) {
Uri result = mSyncState.asContentProvider().insert(url, values);
- mDb.setTransactionSuccessful();
+ if (notApplyingBatch) {
+ mDb.setTransactionSuccessful();
+ }
return result;
}
Uri result = insertInternal(url, values);
- mDb.setTransactionSuccessful();
+ if (notApplyingBatch) {
+ mDb.setTransactionSuccessful();
+ }
if (!isTemporary() && result != null) {
- getContext().getContentResolver().notifyChange(url, null /* observer */,
- changeRequiresLocalSync(url));
+ if (notApplyingBatch) {
+ getContext().getContentResolver().notifyChange(url, null /* observer */,
+ changeRequiresLocalSync(url));
+ } else {
+ mPendingBatchNotifications.get().add(url);
+ }
}
return result;
} finally {
- mDb.endTransaction();
+ if (notApplyingBatch) {
+ mDb.endTransaction();
+ }
}
}
@@ -343,6 +389,92 @@ public abstract class AbstractSyncableContentProvider extends SyncableContentPro
}
/**
+ * <p>
+ * Start batch transaction. {@link #endTransaction} MUST be called after
+ * calling this method. Those methods should be used like this:
+ * </p>
+ *
+ * <pre class="prettyprint">
+ * boolean successful = false;
+ * beginBatch()
+ * try {
+ * // Do something related to mDb
+ * successful = true;
+ * return ret;
+ * } finally {
+ * endBatch(successful);
+ * }
+ * </pre>
+ *
+ * @hide This method should be used only when {@link #applyBatch} is not enough and must be
+ * used with {@link #endBatch}.
+ * e.g. If returned value has to be used during one transaction, this method might be useful.
+ */
+ public final void beginBatch() {
+ // initialize if this is the first time this thread has applied a batch
+ if (mApplyingBatch.get() == null) {
+ mApplyingBatch.set(false);
+ mPendingBatchNotifications.set(new HashSet<Uri>());
+ }
+
+ if (applyingBatch()) {
+ throw new IllegalStateException(
+ "applyBatch is not reentrant but mApplyingBatch is already set");
+ }
+ SQLiteDatabase db = getDatabase();
+ db.beginTransaction();
+ boolean successful = false;
+ try {
+ mApplyingBatch.set(true);
+ successful = true;
+ } finally {
+ if (!successful) {
+ // Something unexpected happened. We must call endTransaction() at least.
+ db.endTransaction();
+ }
+ }
+ }
+
+ /**
+ * <p>
+ * Finish batch transaction. If "successful" is true, try to call
+ * mDb.setTransactionSuccessful() before calling mDb.endTransaction().
+ * This method MUST be used with {@link #beginBatch()}.
+ * </p>
+ *
+ * @hide This method must be used with {@link #beginTransaction}
+ */
+ public final void endBatch(boolean successful) {
+ try {
+ if (successful) {
+ // setTransactionSuccessful() must be called just once during opening the
+ // transaction.
+ mDb.setTransactionSuccessful();
+ }
+ } finally {
+ mApplyingBatch.set(false);
+ getDatabase().endTransaction();
+ for (Uri url : mPendingBatchNotifications.get()) {
+ getContext().getContentResolver().notifyChange(url, null /* observer */,
+ changeRequiresLocalSync(url));
+ }
+ }
+ }
+
+ public ContentProviderResult[] applyBatch(ContentProviderOperation[] operations)
+ throws OperationApplicationException {
+ boolean successful = false;
+ beginBatch();
+ try {
+ ContentProviderResult[] results = super.applyBatch(operations);
+ successful = true;
+ return results;
+ } finally {
+ endBatch(successful);
+ }
+ }
+
+ /**
* Check if changes to this URI can be syncable changes.
* @param uri the URI of the resource that was changed
* @return true if changes to this URI can be syncable changes, false otherwise
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index 3a8de6e..c204dda 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -629,4 +629,26 @@ public abstract class ContentProvider implements ComponentCallbacks {
ContentProvider.this.onCreate();
}
}
-}
+
+ /**
+ * Applies each of the {@link ContentProviderOperation} objects and returns an array
+ * of their results. Passes through OperationApplicationException, which may be thrown
+ * by the call to {@link ContentProviderOperation#apply}.
+ * If all the applications succeed then a {@link ContentProviderResult} array with the
+ * same number of elements as the operations will be returned. It is implementation-specific
+ * how many, if any, operations will have been successfully applied if a call to
+ * apply results in a {@link OperationApplicationException}.
+ * @param operations the operations to apply
+ * @return the results of the applications
+ * @throws OperationApplicationException thrown if an application fails.
+ * See {@link ContentProviderOperation#apply} for more information.
+ */
+ public ContentProviderResult[] applyBatch(ContentProviderOperation[] operations)
+ throws OperationApplicationException {
+ ContentProviderResult[] results = new ContentProviderResult[operations.length];
+ for (int i = 0; i < operations.length; i++) {
+ results[i] = operations[i].apply(this, results, i);
+ }
+ return results;
+ }
+} \ No newline at end of file
diff --git a/core/java/android/content/ContentProviderOperation.java b/core/java/android/content/ContentProviderOperation.java
new file mode 100644
index 0000000..148cc35
--- /dev/null
+++ b/core/java/android/content/ContentProviderOperation.java
@@ -0,0 +1,358 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content;
+
+import android.net.Uri;
+import android.database.Cursor;
+
+import java.util.Map;
+
+public class ContentProviderOperation {
+ private final static int TYPE_INSERT = 1;
+ private final static int TYPE_UPDATE = 2;
+ private final static int TYPE_DELETE = 3;
+ private final static int TYPE_COUNT = 4;
+
+ private final int mType;
+ private final Uri mUri;
+ private final String mSelection;
+ private final String[] mSelectionArgs;
+ private final ContentValues mValues;
+ private final Integer mExpectedCount;
+ private final ContentValues mValuesBackReferences;
+ private final Map<Integer, Integer> mSelectionArgsBackReferences;
+
+ private static final String[] COUNT_COLUMNS = new String[]{"count(*)"};
+
+ /**
+ * Creates a {@link ContentProviderOperation} by copying the contents of a
+ * {@link Builder}.
+ */
+ private ContentProviderOperation(Builder builder) {
+ mType = builder.mType;
+ mUri = builder.mUri;
+ mValues = builder.mValues;
+ mSelection = builder.mSelection;
+ mSelectionArgs = builder.mSelectionArgs;
+ mExpectedCount = builder.mExpectedCount;
+ mSelectionArgsBackReferences = builder.mSelectionArgsBackReferences;
+ mValuesBackReferences = builder.mValuesBackReferences;
+ }
+
+ /**
+ * Create a {@link Builder} suitable for building an insert {@link ContentProviderOperation}.
+ * @param uri The {@link Uri} that is the target of the insert.
+ * @return a {@link Builder}
+ */
+ public static Builder newInsert(Uri uri) {
+ return new Builder(TYPE_INSERT, uri);
+ }
+
+ /**
+ * Create a {@link Builder} suitable for building an update {@link ContentProviderOperation}.
+ * @param uri The {@link Uri} that is the target of the update.
+ * @return a {@link Builder}
+ */
+ public static Builder newUpdate(Uri uri) {
+ return new Builder(TYPE_UPDATE, uri);
+ }
+
+ /**
+ * Create a {@link Builder} suitable for building a delete {@link ContentProviderOperation}.
+ * @param uri The {@link Uri} that is the target of the delete.
+ * @return a {@link Builder}
+ */
+ public static Builder newDelete(Uri uri) {
+ return new Builder(TYPE_DELETE, uri);
+ }
+
+ /**
+ * Create a {@link Builder} suitable for building a count query. When used in conjunction
+ * with {@link Builder#withExpectedCount(int)} this is useful for checking that the
+ * uri/selection has the expected number of rows.
+ * {@link ContentProviderOperation}.
+ * @param uri The {@link Uri} to query.
+ * @return a {@link Builder}
+ */
+ public static Builder newCountQuery(Uri uri) {
+ return new Builder(TYPE_COUNT, uri);
+ }
+
+ /**
+ * Applies this operation using the given provider. The backRefs array is used to resolve any
+ * back references that were requested using
+ * {@link Builder#withValueBackReferences(ContentValues)} and
+ * {@link Builder#withSelectionBackReferences(java.util.Map)}.
+ * @param provider the {@link ContentProvider} on which this batch is applied
+ * @param backRefs a {@link ContentProviderResult} array that will be consulted
+ * to resolve any requested back references.
+ * @param numBackRefs the number of valid results on the backRefs array.
+ * @return a {@link ContentProviderResult} that contains either the {@link Uri} of the inserted
+ * row if this was an insert otherwise the number of rows affected.
+ * @throws OperationApplicationException thrown if either the insert fails or
+ * if the number of rows affected didn't match the expected count
+ */
+ public ContentProviderResult apply(ContentProvider provider, ContentProviderResult[] backRefs,
+ int numBackRefs) throws OperationApplicationException {
+ ContentValues values = resolveValueBackReferences(backRefs, numBackRefs);
+ String[] selectionArgs =
+ resolveSelectionArgsBackReferences(backRefs, numBackRefs);
+
+ if (mType == TYPE_INSERT) {
+ Uri newUri = provider.insert(mUri, values);
+ if (newUri == null) {
+ throw new OperationApplicationException("insert failed");
+ }
+ return new ContentProviderResult(newUri);
+ }
+
+ int numRows;
+ if (mType == TYPE_DELETE) {
+ numRows = provider.delete(mUri, mSelection, selectionArgs);
+ } else if (mType == TYPE_UPDATE) {
+ numRows = provider.update(mUri, values, mSelection, selectionArgs);
+ } else if (mType == TYPE_COUNT) {
+ Cursor cursor = provider.query(mUri, COUNT_COLUMNS, mSelection, selectionArgs, null);
+ try {
+ if (!cursor.moveToNext()) {
+ throw new RuntimeException("since we are doing a count query we should always "
+ + "be able to move to the first row");
+ }
+ if (cursor.getCount() != 1) {
+ throw new RuntimeException("since we are doing a count query there should "
+ + "always be exacly row, found " + cursor.getCount());
+ }
+ numRows = cursor.getInt(0);
+ } finally {
+ cursor.close();
+ }
+ } else {
+ throw new IllegalStateException("bad type, " + mType);
+ }
+
+ if (mExpectedCount != null && mExpectedCount != numRows) {
+ throw new OperationApplicationException("wrong number of rows: " + numRows);
+ }
+
+ return new ContentProviderResult(numRows);
+ }
+
+ /**
+ * The ContentValues back references are represented as a ContentValues object where the
+ * key refers to a column and the value is an index of the back reference whose
+ * valued should be associated with the column.
+ * @param backRefs an array of previous results
+ * @param numBackRefs the number of valid previous results in backRefs
+ * @return the ContentValues that should be used in this operation application after
+ * expansion of back references. This can be called if either mValues or mValuesBackReferences
+ * is null
+ * @VisibleForTesting this is intended to be a private method but it is exposed for
+ * unit testing purposes
+ */
+ public ContentValues resolveValueBackReferences(
+ ContentProviderResult[] backRefs, int numBackRefs) {
+ if (mValuesBackReferences == null) {
+ return mValues;
+ }
+ final ContentValues values;
+ if (mValues == null) {
+ values = new ContentValues();
+ } else {
+ values = new ContentValues(mValues);
+ }
+ for (Map.Entry<String, Object> entry : mValuesBackReferences.valueSet()) {
+ String key = entry.getKey();
+ Integer backRefIndex = mValuesBackReferences.getAsInteger(key);
+ if (backRefIndex == null) {
+ throw new IllegalArgumentException("values backref " + key + " is not an integer");
+ }
+ values.put(key, backRefToValue(backRefs, numBackRefs, backRefIndex));
+ }
+ return values;
+ }
+
+ /**
+ * The Selection Arguments back references are represented as a Map of Integer->Integer where
+ * the key is an index into the selection argument array (see {@link Builder#withSelection})
+ * and the value is the index of the previous result that should be used for that selection
+ * argument array slot.
+ * @param backRefs an array of previous results
+ * @param numBackRefs the number of valid previous results in backRefs
+ * @return the ContentValues that should be used in this operation application after
+ * expansion of back references. This can be called if either mValues or mValuesBackReferences
+ * is null
+ * @VisibleForTesting this is intended to be a private method but it is exposed for
+ * unit testing purposes
+ */
+ public String[] resolveSelectionArgsBackReferences(
+ ContentProviderResult[] backRefs, int numBackRefs) {
+ if (mSelectionArgsBackReferences == null) {
+ return mSelectionArgs;
+ }
+ String[] newArgs = new String[mSelectionArgs.length];
+ System.arraycopy(mSelectionArgs, 0, newArgs, 0, mSelectionArgs.length);
+ for (Map.Entry<Integer, Integer> selectionArgBackRef
+ : mSelectionArgsBackReferences.entrySet()) {
+ final Integer selectionArgIndex = selectionArgBackRef.getKey();
+ final int backRefIndex = selectionArgBackRef.getValue();
+ newArgs[selectionArgIndex] = backRefToValue(backRefs, numBackRefs, backRefIndex);
+ }
+ return newArgs;
+ }
+
+ /**
+ * Return the string representation of the requested back reference.
+ * @param backRefs an array of results
+ * @param numBackRefs the number of items in the backRefs array that are valid
+ * @param backRefIndex which backRef to be used
+ * @throws ArrayIndexOutOfBoundsException thrown if the backRefIndex is larger than
+ * the numBackRefs
+ * @return the string representation of the requested back reference.
+ */
+ private static String backRefToValue(ContentProviderResult[] backRefs, int numBackRefs,
+ Integer backRefIndex) {
+ if (backRefIndex > numBackRefs) {
+ throw new ArrayIndexOutOfBoundsException("asked for back ref " + backRefIndex
+ + " but there are only " + numBackRefs + " back refs");
+ }
+ ContentProviderResult backRef = backRefs[backRefIndex];
+ String backRefValue;
+ if (backRef.uri != null) {
+ backRefValue = backRef.uri.getLastPathSegment();
+ } else {
+ backRefValue = String.valueOf(backRef.count);
+ }
+ return backRefValue;
+ }
+
+ /**
+ * Used to add parameters to a {@link ContentProviderOperation}. The {@link Builder} is
+ * first created by calling {@link ContentProviderOperation#newInsert(android.net.Uri)},
+ * {@link ContentProviderOperation#newUpdate(android.net.Uri)},
+ * {@link ContentProviderOperation#newDelete(android.net.Uri)} or
+ * {@link ContentProviderOperation#newCountQuery(android.net.Uri)}. The withXXX methods
+ * can then be used to add parameters to the builder. See the specific methods to find for
+ * which {@link Builder} type each is allowed. Call {@link #build} to create the
+ * {@link ContentProviderOperation} once all the parameters have been supplied.
+ */
+ public static class Builder {
+ private final int mType;
+ private final Uri mUri;
+ private String mSelection;
+ private String[] mSelectionArgs;
+ private ContentValues mValues;
+ private Integer mExpectedCount;
+ private ContentValues mValuesBackReferences;
+ private Map<Integer, Integer> mSelectionArgsBackReferences;
+
+ /** Create a {@link Builder} of a given type. The uri must not be null. */
+ private Builder(int type, Uri uri) {
+ if (uri == null) {
+ throw new IllegalArgumentException("uri must not be null");
+ }
+ mType = type;
+ mUri = uri;
+ }
+
+ /** Create a ContentroviderOperation from this {@link Builder}. */
+ public ContentProviderOperation build() {
+ return new ContentProviderOperation(this);
+ }
+
+ /**
+ * Add a {@link ContentValues} of back references. The key is the name of the column
+ * and the value is an integer that is the index of the previous result whose
+ * value should be used for the column. The value is added as a {@link String}.
+ * A column value from the back references takes precedence over a value specified in
+ * {@link #withValues}.
+ * This can only be used with builders of type insert or update.
+ * @return this builder, to allow for chaining.
+ */
+ public Builder withValueBackReferences(ContentValues backReferences) {
+ if (mType != TYPE_INSERT && mType != TYPE_UPDATE) {
+ throw new IllegalArgumentException(
+ "only inserts and updates can have value back-references");
+ }
+ mValuesBackReferences = backReferences;
+ return this;
+ }
+
+ /**
+ * Add a {@link Map} of back references. The integer key is the index of the selection arg
+ * to set and the integer value is the index of the previous result whose
+ * value should be used for the arg. If any value at that index of the selection arg
+ * that was specified by {@likn withSelection} will be overwritten.
+ * This can only be used with builders of type update, delete, or count query.
+ * @return this builder, to allow for chaining.
+ */
+ public Builder withSelectionBackReferences(Map<Integer, Integer> backReferences) {
+ if (mType != TYPE_COUNT && mType != TYPE_UPDATE && mType != TYPE_DELETE) {
+ throw new IllegalArgumentException(
+ "only deletes, updates and counts can have selection back-references");
+ }
+ mSelectionArgsBackReferences = backReferences;
+ return this;
+ }
+
+ /**
+ * The ContentValues to use. This may be null. These values may be overwritten by
+ * the corresponding value specified by {@link #withValueBackReferences(ContentValues)}.
+ * This can only be used with builders of type insert or update.
+ * @return this builder, to allow for chaining.
+ */
+ public Builder withValues(ContentValues values) {
+ if (mType != TYPE_INSERT && mType != TYPE_UPDATE) {
+ throw new IllegalArgumentException("only inserts and updates can have values");
+ }
+ mValues = values;
+ return this;
+ }
+
+ /**
+ * The selection and arguments to use. An occurrence of '?' in the selection will be
+ * replaced with the corresponding occurence of the selection argument. Any of the
+ * selection arguments may be overwritten by a selection argument back reference as
+ * specified by {@link #withSelectionBackReferences}.
+ * This can only be used with builders of type update, delete, or count query.
+ * @return this builder, to allow for chaining.
+ */
+ public Builder withSelection(String selection, String[] selectionArgs) {
+ if (mType != TYPE_DELETE && mType != TYPE_UPDATE && mType != TYPE_COUNT) {
+ throw new IllegalArgumentException(
+ "only deletes, updates and counts can have selections");
+ }
+ mSelection = selection;
+ mSelectionArgs = selectionArgs;
+ return this;
+ }
+
+ /**
+ * If set then if the number of rows affected by this operation do not match
+ * this count {@link OperationApplicationException} will be throw.
+ * This can only be used with builders of type update, delete, or count query.
+ * @return this builder, to allow for chaining.
+ */
+ public Builder withExpectedCount(int count) {
+ if (mType != TYPE_DELETE && mType != TYPE_UPDATE && mType != TYPE_COUNT) {
+ throw new IllegalArgumentException(
+ "only deletes, updates and counts can have expected counts");
+ }
+ mExpectedCount = count;
+ return this;
+ }
+ }
+}
diff --git a/core/java/android/content/ContentProviderResult.java b/core/java/android/content/ContentProviderResult.java
new file mode 100644
index 0000000..2e34e40
--- /dev/null
+++ b/core/java/android/content/ContentProviderResult.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content;
+
+import android.net.Uri;
+
+/**
+ * Contains the result of the application of a {@link ContentProviderOperation}. It is guaranteed
+ * to have exactly one of {@link #uri} or {@link #count} set.
+ */
+public class ContentProviderResult {
+ public final Uri uri;
+ public final Integer count;
+
+ public ContentProviderResult(Uri uri) {
+ if (uri == null) throw new IllegalArgumentException("uri must not be null");
+ this.uri = uri;
+ this.count = null;
+ }
+
+ public ContentProviderResult(int count) {
+ this.count = count;
+ this.uri = null;
+ }
+} \ No newline at end of file
diff --git a/core/java/android/content/OperationApplicationException.java b/core/java/android/content/OperationApplicationException.java
new file mode 100644
index 0000000..d4101bf
--- /dev/null
+++ b/core/java/android/content/OperationApplicationException.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content;
+
+/**
+ * Thrown when an application of a {@link ContentProviderOperation} fails due the specified
+ * constraints.
+ */
+public class OperationApplicationException extends Exception {
+ public OperationApplicationException() {
+ super();
+ }
+ public OperationApplicationException(String message) {
+ super(message);
+ }
+ public OperationApplicationException(String message, Throwable cause) {
+ super(message, cause);
+ }
+ public OperationApplicationException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 88ac04c..ad022e7 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -123,13 +123,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
* Value for {@link #flags}: this is set of the application has set
* its android:targetSdkVersion to something >= the current SDK version.
*/
- public static final int FLAG_TARGETS_SDK = 1<<8;
-
- /**
- * Value for {@link #flags}: this is set of the application has set
- * its android:targetSdkVersion to something >= the current SDK version.
- */
- public static final int FLAG_TEST_ONLY = 1<<9;
+ public static final int FLAG_TEST_ONLY = 1<<8;
/**
* Flags associated with the application. Any combination of
@@ -137,7 +131,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
* {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and
* {@link #FLAG_ALLOW_TASK_REPARENTING}
* {@link #FLAG_ALLOW_CLEAR_USER_DATA}, {@link #FLAG_UPDATED_SYSTEM_APP},
- * {@link #FLAG_TARGETS_SDK}.
+ * {@link #FLAG_TEST_ONLY}.
*/
public int flags = 0;
@@ -182,6 +176,16 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
public int[] supportsDensities;
/**
+ * The minimum SDK version this application targets. It may run on earilier
+ * versions, but it knows how to work with any new behavior added at this
+ * version. Will be {@link android.os.Build.VERSION_CODES#CUR_DEVELOPMENT}
+ * if this is a development build and the app is targeting that. You should
+ * compare that this number is >= the SDK version number at which your
+ * behavior was introduced.
+ */
+ public int targetSdkVersion;
+
+ /**
* When false, indicates that all components within this application are
* considered disabled, regardless of their individually set enabled status.
*/
@@ -200,6 +204,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
pw.println(prefix + "publicSourceDir=" + publicSourceDir);
pw.println(prefix + "sharedLibraryFiles=" + sharedLibraryFiles);
pw.println(prefix + "dataDir=" + dataDir);
+ pw.println(prefix + "targetSdkVersion=" + targetSdkVersion);
pw.println(prefix + "enabled=" + enabled);
pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName);
pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes));
@@ -246,6 +251,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
sharedLibraryFiles = orig.sharedLibraryFiles;
dataDir = orig.dataDir;
uid = orig.uid;
+ targetSdkVersion = orig.targetSdkVersion;
enabled = orig.enabled;
manageSpaceActivityName = orig.manageSpaceActivityName;
descriptionRes = orig.descriptionRes;
@@ -276,6 +282,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
dest.writeStringArray(sharedLibraryFiles);
dest.writeString(dataDir);
dest.writeInt(uid);
+ dest.writeInt(targetSdkVersion);
dest.writeInt(enabled ? 1 : 0);
dest.writeString(manageSpaceActivityName);
dest.writeInt(descriptionRes);
@@ -305,6 +312,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
sharedLibraryFiles = source.readStringArray();
dataDir = source.readString();
uid = source.readInt();
+ targetSdkVersion = source.readInt();
enabled = source.readInt() != 0;
manageSpaceActivityName = source.readString();
descriptionRes = source.readInt();
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 88907c1..78462f1 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -55,6 +55,30 @@ import java.util.jar.JarFile;
* {@hide}
*/
public class PackageParser {
+ /** @hide */
+ public static class NewPermissionInfo {
+ public final String name;
+ public final int sdkVersion;
+ public final int fileVersion;
+
+ public NewPermissionInfo(String name, int sdkVersion, int fileVersion) {
+ this.name = name;
+ this.sdkVersion = sdkVersion;
+ this.fileVersion = fileVersion;
+ }
+ }
+
+ /**
+ * List of new permissions that have been added since 1.0.
+ * NOTE: These must be declared in SDK version order, with permissions
+ * added to older SDKs appearing before those added to newer SDKs.
+ * @hide
+ */
+ public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] = new PackageParser.NewPermissionInfo[] {
+ new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_SDCARD,
+ android.os.Build.VERSION_CODES.DONUT,
+ 0)
+ };
private String mArchiveSourcePath;
private String[] mSeparateProcesses;
@@ -616,7 +640,6 @@ public class PackageParser {
final Package pkg = new Package(pkgName);
boolean foundApp = false;
- boolean targetsSdk = false;
TypedArray sa = res.obtainAttributes(attrs,
com.android.internal.R.styleable.AndroidManifest);
@@ -774,11 +797,10 @@ public class PackageParser {
return null;
}
// If the code matches, it definitely targets this SDK.
- targetsSdk = true;
- } else if (targetVers >= mSdkVersion) {
- // If they have explicitly targeted our current version
- // or something after it, then note this.
- targetsSdk = true;
+ pkg.applicationInfo.targetSdkVersion
+ = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT;
+ } else {
+ pkg.applicationInfo.targetSdkVersion = targetVers;
}
if (minVers > mSdkVersion) {
@@ -824,8 +846,18 @@ public class PackageParser {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY;
}
- if (targetsSdk) {
- pkg.applicationInfo.flags |= ApplicationInfo.FLAG_TARGETS_SDK;
+ final int NP = PackageParser.NEW_PERMISSIONS.length;
+ for (int ip=0; ip<NP; ip++) {
+ final PackageParser.NewPermissionInfo npi
+ = PackageParser.NEW_PERMISSIONS[ip];
+ if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) {
+ break;
+ }
+ if (!pkg.requestedPermissions.contains(npi.name)) {
+ Log.i(TAG, "Impliciting adding " + npi.name + " to old pkg "
+ + pkg.packageName);
+ pkg.requestedPermissions.add(npi.name);
+ }
}
if (pkg.usesLibraries.size() > 0) {
diff --git a/core/java/android/gesture/Gesture.java b/core/java/android/gesture/Gesture.java
new file mode 100755
index 0000000..14530a1
--- /dev/null
+++ b/core/java/android/gesture/Gesture.java
@@ -0,0 +1,298 @@
+/*
+ * Copyright (C) 2008-2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.RectF;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Log;
+
+import java.io.IOException;
+import java.io.DataOutputStream;
+import java.io.DataInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+
+/**
+ * A gesture can have a single or multiple strokes
+ */
+
+public class Gesture implements Parcelable {
+ private static final long GESTURE_ID_BASE = System.currentTimeMillis();
+
+ private static final int BITMAP_RENDERING_WIDTH = 2;
+
+ private static final boolean BITMAP_RENDERING_ANTIALIAS = true;
+ private static final boolean BITMAP_RENDERING_DITHER = true;
+
+ private static int sGestureCount = 0;
+
+ private RectF mBoundingBox;
+
+ // the same as its instance ID
+ private long mGestureID;
+
+ private final ArrayList<GestureStroke> mStrokes = new ArrayList<GestureStroke>();
+
+ public Gesture() {
+ mGestureID = GESTURE_ID_BASE + sGestureCount++;
+ }
+
+ /**
+ * @return all the strokes of the gesture
+ */
+ public ArrayList<GestureStroke> getStrokes() {
+ return mStrokes;
+ }
+
+ /**
+ * @return the number of strokes included by this gesture
+ */
+ public int getStrokesCount() {
+ return mStrokes.size();
+ }
+
+ /**
+ * Add a stroke to the gesture
+ *
+ * @param stroke
+ */
+ public void addStroke(GestureStroke stroke) {
+ mStrokes.add(stroke);
+
+ if (mBoundingBox == null) {
+ mBoundingBox = new RectF(stroke.boundingBox);
+ } else {
+ mBoundingBox.union(stroke.boundingBox);
+ }
+ }
+
+ /**
+ * Get the total length of the gesture. When there are multiple strokes in
+ * the gesture, this returns the sum of the lengths of all the strokes
+ *
+ * @return the length of the gesture
+ */
+ public float getLength() {
+ int len = 0;
+ final ArrayList<GestureStroke> strokes = mStrokes;
+ final int count = strokes.size();
+
+ for (int i = 0; i < count; i++) {
+ len += strokes.get(i).length;
+ }
+
+ return len;
+ }
+
+ /**
+ * @return the bounding box of the gesture
+ */
+ public RectF getBoundingBox() {
+ return mBoundingBox;
+ }
+
+ /**
+ * Set the id of the gesture
+ *
+ * @param id
+ */
+ void setID(long id) {
+ mGestureID = id;
+ }
+
+ /**
+ * @return the id of the gesture
+ */
+ public long getID() {
+ return mGestureID;
+ }
+
+ /**
+ * draw the gesture
+ *
+ * @param canvas
+ */
+ void draw(Canvas canvas, Paint paint) {
+ final ArrayList<GestureStroke> strokes = mStrokes;
+ final int count = strokes.size();
+
+ for (int i = 0; i < count; i++) {
+ strokes.get(i).draw(canvas, paint);
+ }
+ }
+
+ /**
+ * Create a bitmap of the gesture with a transparent background
+ *
+ * @param width width of the target bitmap
+ * @param height height of the target bitmap
+ * @param edge the edge
+ * @param numSample
+ * @param color
+ * @return the bitmap
+ */
+ public Bitmap toBitmap(int width, int height, int edge, int numSample, int color) {
+ final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ final Canvas canvas = new Canvas(bitmap);
+
+ canvas.translate(edge, edge);
+
+ final Paint paint = new Paint();
+ paint.setAntiAlias(BITMAP_RENDERING_ANTIALIAS);
+ paint.setDither(BITMAP_RENDERING_DITHER);
+ paint.setColor(color);
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeJoin(Paint.Join.ROUND);
+ paint.setStrokeCap(Paint.Cap.ROUND);
+ paint.setStrokeWidth(BITMAP_RENDERING_WIDTH);
+
+ final ArrayList<GestureStroke> strokes = mStrokes;
+ final int count = strokes.size();
+
+ for (int i = 0; i < count; i++) {
+ Path path = strokes.get(i).toPath(width - 2 * edge, height - 2 * edge, numSample);
+ canvas.drawPath(path, paint);
+ }
+
+ return bitmap;
+ }
+
+ /**
+ * Create a bitmap of the gesture with a transparent background
+ *
+ * @param width
+ * @param height
+ * @param edge
+ * @param color
+ * @return the bitmap
+ */
+ public Bitmap toBitmap(int width, int height, int edge, int color) {
+ final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ final Canvas canvas = new Canvas(bitmap);
+
+ canvas.translate(edge, edge);
+
+ final Paint paint = new Paint();
+ paint.setAntiAlias(BITMAP_RENDERING_ANTIALIAS);
+ paint.setDither(BITMAP_RENDERING_DITHER);
+ paint.setColor(color);
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeJoin(Paint.Join.ROUND);
+ paint.setStrokeCap(Paint.Cap.ROUND);
+ paint.setStrokeWidth(BITMAP_RENDERING_WIDTH);
+
+ final ArrayList<GestureStroke> strokes = mStrokes;
+ final int count = strokes.size();
+
+ for (int i = 0; i < count; i++) {
+ strokes.get(i).draw(canvas, paint);
+ }
+
+ return bitmap;
+ }
+
+ void serialize(DataOutputStream out) throws IOException {
+ final ArrayList<GestureStroke> strokes = mStrokes;
+ final int count = strokes.size();
+
+ // Write gesture ID
+ out.writeLong(mGestureID);
+ // Write number of strokes
+ out.writeInt(count);
+
+ for (int i = 0; i < count; i++) {
+ strokes.get(i).serialize(out);
+ }
+ }
+
+ static Gesture deserialize(DataInputStream in) throws IOException {
+ final Gesture gesture = new Gesture();
+
+ // Gesture ID
+ gesture.mGestureID = in.readLong();
+ // Number of strokes
+ final int count = in.readInt();
+
+ for (int i = 0; i < count; i++) {
+ gesture.addStroke(GestureStroke.deserialize(in));
+ }
+
+ return gesture;
+ }
+
+ public static final Parcelable.Creator<Gesture> CREATOR = new Parcelable.Creator<Gesture>() {
+ public Gesture createFromParcel(Parcel in) {
+ Gesture gesture = null;
+ final long gestureID = in.readLong();
+
+ final DataInputStream inStream = new DataInputStream(
+ new ByteArrayInputStream(in.createByteArray()));
+
+ try {
+ gesture = deserialize(inStream);
+ } catch (IOException e) {
+ Log.e(GestureConstants.LOG_TAG, "Error reading Gesture from parcel:", e);
+ } finally {
+ GestureUtilities.closeStream(inStream);
+ }
+
+ if (gesture != null) {
+ gesture.mGestureID = gestureID;
+ }
+
+ return gesture;
+ }
+
+ public Gesture[] newArray(int size) {
+ return new Gesture[size];
+ }
+ };
+
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeLong(mGestureID);
+
+ boolean result = false;
+ final ByteArrayOutputStream byteStream =
+ new ByteArrayOutputStream(GestureConstants.IO_BUFFER_SIZE);
+ final DataOutputStream outStream = new DataOutputStream(byteStream);
+
+ try {
+ serialize(outStream);
+ result = true;
+ } catch (IOException e) {
+ Log.e(GestureConstants.LOG_TAG, "Error writing Gesture to parcel:", e);
+ } finally {
+ GestureUtilities.closeStream(outStream);
+ GestureUtilities.closeStream(byteStream);
+ }
+
+ if (result) {
+ out.writeByteArray(byteStream.toByteArray());
+ }
+ }
+
+ public int describeContents() {
+ return 0;
+ }
+}
+
diff --git a/core/java/android/gesture/GestureConstants.java b/core/java/android/gesture/GestureConstants.java
new file mode 100644
index 0000000..230db0c
--- /dev/null
+++ b/core/java/android/gesture/GestureConstants.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+interface GestureConstants {
+ static final int STROKE_STRING_BUFFER_SIZE = 1024;
+ static final int STROKE_POINT_BUFFER_SIZE = 100; // number of points
+
+ static final int IO_BUFFER_SIZE = 32 * 1024; // 32K
+
+ static final String LOG_TAG = "Gestures";
+}
diff --git a/core/java/android/gesture/GestureLibrary.java b/core/java/android/gesture/GestureLibrary.java
new file mode 100644
index 0000000..1cf192e
--- /dev/null
+++ b/core/java/android/gesture/GestureLibrary.java
@@ -0,0 +1,346 @@
+/*
+ * Copyright (C) 2008-2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+import android.util.Log;
+import android.os.SystemClock;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.DataOutputStream;
+import java.io.DataInputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.Map;
+
+import static android.gesture.GestureConstants.LOG_TAG;
+
+/**
+ * GestureLibrary maintains gesture examples and makes predictions on a new
+ * gesture
+ */
+//
+// File format for GestureLibrary:
+//
+// Nb. bytes Java type Description
+// -----------------------------------
+// Header
+// 2 bytes short File format version number
+// 4 bytes int Number of entries
+// Entry
+// X bytes UTF String Entry name
+// 4 bytes int Number of gestures
+// Gesture
+// 8 bytes long Gesture ID
+// 4 bytes int Number of strokes
+// Stroke
+// 4 bytes int Number of points
+// Point
+// 4 bytes float X coordinate of the point
+// 4 bytes float Y coordinate of the point
+// 8 bytes long Time stamp
+//
+public class GestureLibrary {
+ public static final int SEQUENCE_INVARIANT = 1;
+ // when SEQUENCE_SENSITIVE is used, only single stroke gestures are currently allowed
+ public static final int SEQUENCE_SENSITIVE = 2;
+
+ // ORIENTATION_SENSITIVE and ORIENTATION_INVARIANT are only for SEQUENCE_SENSITIVE gestures
+ public static final int ORIENTATION_INVARIANT = 1;
+ public static final int ORIENTATION_SENSITIVE = 2;
+
+ private static final short FILE_FORMAT_VERSION = 1;
+
+ private static final boolean PROFILE_LOADING_SAVING = false;
+
+ private int mSequenceType = SEQUENCE_SENSITIVE;
+ private int mOrientationStyle = ORIENTATION_SENSITIVE;
+
+ private final String mGestureFileName;
+
+ private final HashMap<String, ArrayList<Gesture>> mNamedGestures =
+ new HashMap<String, ArrayList<Gesture>>();
+
+ private Learner mClassifier;
+
+ private boolean mChanged = false;
+
+ /**
+ * @param path where gesture data is stored
+ */
+ public GestureLibrary(String path) {
+ mGestureFileName = path;
+ mClassifier = new InstanceLearner();
+ }
+
+ /**
+ * Specify how the gesture library will handle orientation.
+ * Use ORIENTATION_INVARIANT or ORIENTATION_SENSITIVE
+ *
+ * @param style
+ */
+ public void setOrientationStyle(int style) {
+ mOrientationStyle = style;
+ }
+
+ public int getOrientationStyle() {
+ return mOrientationStyle;
+ }
+
+ /**
+ * @param type SEQUENCE_INVARIANT or SEQUENCE_SENSITIVE
+ */
+ public void setSequenceType(int type) {
+ mSequenceType = type;
+ }
+
+ /**
+ * @return SEQUENCE_INVARIANT or SEQUENCE_SENSITIVE
+ */
+ public int getSequenceType() {
+ return mSequenceType;
+ }
+
+ /**
+ * Get all the gesture entry names in the library
+ *
+ * @return a set of strings
+ */
+ public Set<String> getGestureEntries() {
+ return mNamedGestures.keySet();
+ }
+
+ /**
+ * Recognize a gesture
+ *
+ * @param gesture the query
+ * @return a list of predictions of possible entries for a given gesture
+ */
+ public ArrayList<Prediction> recognize(Gesture gesture) {
+ Instance instance = Instance.createInstance(mSequenceType, gesture, null);
+ return mClassifier.classify(mSequenceType, instance.vector);
+ }
+
+ /**
+ * Add a gesture for the entry
+ *
+ * @param entryName entry name
+ * @param gesture
+ */
+ public void addGesture(String entryName, Gesture gesture) {
+ if (entryName == null || entryName.length() == 0) {
+ return;
+ }
+ ArrayList<Gesture> gestures = mNamedGestures.get(entryName);
+ if (gestures == null) {
+ gestures = new ArrayList<Gesture>();
+ mNamedGestures.put(entryName, gestures);
+ }
+ gestures.add(gesture);
+ mClassifier.addInstance(Instance.createInstance(mSequenceType, gesture, entryName));
+ mChanged = true;
+ }
+
+ /**
+ * Remove a gesture from the library. If there are no more gestures for the
+ * given entry, the gesture entry will be removed.
+ *
+ * @param entryName entry name
+ * @param gesture
+ */
+ public void removeGesture(String entryName, Gesture gesture) {
+ ArrayList<Gesture> gestures = mNamedGestures.get(entryName);
+ if (gestures == null) {
+ return;
+ }
+
+ gestures.remove(gesture);
+
+ // if there are no more samples, remove the entry automatically
+ if (gestures.isEmpty()) {
+ mNamedGestures.remove(entryName);
+ }
+
+ mClassifier.removeInstance(gesture.getID());
+
+ mChanged = true;
+ }
+
+ /**
+ * Remove a entry of gestures
+ *
+ * @param entryName the entry name
+ */
+ public void removeEntry(String entryName) {
+ mNamedGestures.remove(entryName);
+ mClassifier.removeInstances(entryName);
+ mChanged = true;
+ }
+
+ /**
+ * Get all the gestures of an entry
+ *
+ * @param entryName
+ * @return the list of gestures that is under this name
+ */
+ public ArrayList<Gesture> getGestures(String entryName) {
+ ArrayList<Gesture> gestures = mNamedGestures.get(entryName);
+ if (gestures != null) {
+ return new ArrayList<Gesture>(gestures);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Save the gesture library
+ */
+ public boolean save() {
+ if (!mChanged) {
+ return true;
+ }
+
+ boolean result = false;
+ DataOutputStream out = null;
+
+ try {
+ File file = new File(mGestureFileName);
+ if (!file.getParentFile().exists()) {
+ if (!file.getParentFile().mkdirs()) {
+ return false;
+ }
+ }
+
+ long start;
+ if (PROFILE_LOADING_SAVING) {
+ start = SystemClock.elapsedRealtime();
+ }
+
+ final HashMap<String, ArrayList<Gesture>> maps = mNamedGestures;
+
+ out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file),
+ GestureConstants.IO_BUFFER_SIZE));
+ // Write version number
+ out.writeShort(FILE_FORMAT_VERSION);
+ // Write number of entries
+ out.writeInt(maps.size());
+
+ for (Map.Entry<String, ArrayList<Gesture>> entry : maps.entrySet()) {
+ final String key = entry.getKey();
+ final ArrayList<Gesture> examples = entry.getValue();
+ final int count = examples.size();
+
+ // Write entry name
+ out.writeUTF(key);
+ // Write number of examples for this entry
+ out.writeInt(count);
+
+ for (int i = 0; i < count; i++) {
+ examples.get(i).serialize(out);
+ }
+ }
+
+ out.flush();
+
+ if (PROFILE_LOADING_SAVING) {
+ long end = SystemClock.elapsedRealtime();
+ Log.d(LOG_TAG, "Saving gestures library = " + (end - start) + " ms");
+ }
+
+ mChanged = false;
+ result = true;
+ } catch (IOException ex) {
+ Log.d(LOG_TAG, "Failed to save gestures:", ex);
+ } finally {
+ GestureUtilities.closeStream(out);
+ }
+
+ return result;
+ }
+
+ /**
+ * Load the gesture library
+ */
+ public boolean load() {
+ boolean result = false;
+
+ final File file = new File(mGestureFileName);
+ if (file.exists()) {
+ DataInputStream in = null;
+ try {
+ in = new DataInputStream(new BufferedInputStream(
+ new FileInputStream(mGestureFileName), GestureConstants.IO_BUFFER_SIZE));
+
+ long start;
+ if (PROFILE_LOADING_SAVING) {
+ start = SystemClock.elapsedRealtime();
+ }
+
+ // Read file format version number
+ final short versionNumber = in.readShort();
+ switch (versionNumber) {
+ case 1:
+ readFormatV1(in);
+ break;
+ }
+
+ if (PROFILE_LOADING_SAVING) {
+ long end = SystemClock.elapsedRealtime();
+ Log.d(LOG_TAG, "Loading gestures library = " + (end - start) + " ms");
+ }
+
+ result = true;
+ } catch (IOException ex) {
+ Log.d(LOG_TAG, "Failed to load gestures:", ex);
+ } finally {
+ GestureUtilities.closeStream(in);
+ }
+ }
+
+ return result;
+ }
+
+ private void readFormatV1(DataInputStream in) throws IOException {
+ final Learner classifier = mClassifier;
+ final HashMap<String, ArrayList<Gesture>> namedGestures = mNamedGestures;
+ namedGestures.clear();
+
+ // Number of entries in the library
+ final int entriesCount = in.readInt();
+
+ for (int i = 0; i < entriesCount; i++) {
+ // Entry name
+ final String name = in.readUTF();
+ // Number of gestures
+ final int gestureCount = in.readInt();
+
+ final ArrayList<Gesture> gestures = new ArrayList<Gesture>(gestureCount);
+ for (int j = 0; j < gestureCount; j++) {
+ final Gesture gesture = Gesture.deserialize(in);
+ gestures.add(gesture);
+ classifier.addInstance(Instance.createInstance(mSequenceType, gesture, name));
+ }
+
+ namedGestures.put(name, gestures);
+ }
+ }
+}
diff --git a/core/java/android/gesture/GestureOverlayView.java b/core/java/android/gesture/GestureOverlayView.java
new file mode 100755
index 0000000..bffd12e
--- /dev/null
+++ b/core/java/android/gesture/GestureOverlayView.java
@@ -0,0 +1,419 @@
+/*
+ * Copyright (C) 2008-2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BlurMaskFilter;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.Rect;
+import android.graphics.Color;
+import android.os.Handler;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+import java.util.ArrayList;
+
+/**
+ * A (transparent) overlay for gesture input that can be placed on top of other
+ * widgets. The view can also be opaque.
+ */
+
+public class GestureOverlayView extends View {
+ static final float TOUCH_TOLERANCE = 3;
+
+ // TODO: Move all these values into XML attributes
+ private static final int TRANSPARENT_BACKGROUND = 0x00000000;
+
+ // TODO: SHOULD BE A TOTAL DURATION
+ private static final float FADING_ALPHA_CHANGE = 0.15f;
+ private static final long FADING_OFFSET = 300;
+ private static final long FADING_REFRESHING_RATE = 16;
+
+ private static final int GESTURE_STROKE_WIDTH = 12;
+ private static final boolean GESTURE_RENDERING_ANTIALIAS = true;
+
+ private static final boolean DITHER_FLAG = true;
+
+ public static final int DEFAULT_GESTURE_COLOR = 0xFFFFFF00;
+ public static final int DEFAULT_UNCERTAIN_GESTURE_COLOR = Color.argb(60, 255, 255, 0);
+
+ private static final int REFRESH_RANGE = 10;
+
+ private static final BlurMaskFilter BLUR_MASK_FILTER =
+ new BlurMaskFilter(1, BlurMaskFilter.Blur.NORMAL);
+
+ private Paint mGesturePaint;
+
+ private final Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG);
+ private Bitmap mBitmap; // with transparent background
+ private Canvas mBitmapCanvas;
+
+ private int mCertainGestureColor = DEFAULT_GESTURE_COLOR;
+ private int mUncertainGestureColor = DEFAULT_UNCERTAIN_GESTURE_COLOR;
+
+ // for rendering immediate ink feedback
+ private Rect mInvalidRect = new Rect();
+
+ private Path mPath;
+
+ private float mX;
+ private float mY;
+
+ private float mCurveEndX;
+ private float mCurveEndY;
+
+ // current gesture
+ private Gesture mCurrentGesture = null;
+
+ // TODO: Make this a list of WeakReferences
+ private final ArrayList<OnGestureListener> mOnGestureListeners = new ArrayList<OnGestureListener>();
+ private ArrayList<GesturePoint> mPointBuffer = null;
+
+ // fading out effect
+ private boolean mIsFadingOut = false;
+ private float mFadingAlpha = 1;
+
+ private Handler mHandler = new Handler();
+
+ private final Runnable mFadingOut = new Runnable() {
+ public void run() {
+ if (mIsFadingOut) {
+ mFadingAlpha -= FADING_ALPHA_CHANGE;
+ if (mFadingAlpha <= 0) {
+ mIsFadingOut = false;
+ mPath = null;
+ mCurrentGesture = null;
+ mBitmap.eraseColor(TRANSPARENT_BACKGROUND);
+ } else {
+ mHandler.postDelayed(this, FADING_REFRESHING_RATE);
+ }
+ invalidate();
+ }
+ }
+ };
+
+ public GestureOverlayView(Context context) {
+ super(context);
+ init();
+ }
+
+ public GestureOverlayView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ public ArrayList<GesturePoint> getCurrentStroke() {
+ return mPointBuffer;
+ }
+
+ public Gesture getCurrentGesture() {
+ return mCurrentGesture;
+ }
+
+ /**
+ * Set Gesture color
+ *
+ * @param color
+ */
+ public void setGestureDrawingColor(int color) {
+ mGesturePaint.setColor(color);
+ if (mCurrentGesture != null) {
+ mBitmap.eraseColor(TRANSPARENT_BACKGROUND);
+ mCurrentGesture.draw(mBitmapCanvas, mGesturePaint);
+ }
+ }
+
+ public void setGestureColor(int color) {
+ mCertainGestureColor = color;
+ }
+
+ public void setUncertainGestureColor(int color) {
+ mUncertainGestureColor = color;
+ }
+
+ public int getUncertainGestureColor() {
+ return mUncertainGestureColor;
+ }
+
+ public int getGestureColor() {
+ return mCertainGestureColor;
+ }
+
+ /**
+ * Set the gesture to be shown in the view
+ *
+ * @param gesture
+ */
+ public void setCurrentGesture(Gesture gesture) {
+ if (mCurrentGesture != null) {
+ clear(false);
+ }
+
+ mCurrentGesture = gesture;
+
+ if (gesture != null) {
+ if (mBitmapCanvas != null) {
+ gesture.draw(mBitmapCanvas, mGesturePaint);
+ invalidate();
+ }
+ }
+ }
+
+ private void init() {
+ mGesturePaint = new Paint();
+
+ final Paint gesturePaint = mGesturePaint;
+ gesturePaint.setAntiAlias(GESTURE_RENDERING_ANTIALIAS);
+ gesturePaint.setColor(DEFAULT_GESTURE_COLOR);
+ gesturePaint.setStyle(Paint.Style.STROKE);
+ gesturePaint.setStrokeJoin(Paint.Join.ROUND);
+ gesturePaint.setStrokeCap(Paint.Cap.ROUND);
+ gesturePaint.setStrokeWidth(GESTURE_STROKE_WIDTH);
+ gesturePaint.setDither(DITHER_FLAG);
+
+ mPath = null;
+ }
+
+ @Override
+ protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
+ super.onSizeChanged(width, height, oldWidth, oldHeight);
+
+ if (width <= 0 || height <= 0) {
+ return;
+ }
+
+ int targetWidth = width > oldWidth ? width : oldWidth;
+ int targetHeight = height > oldHeight ? height : oldHeight;
+
+ if (mBitmap != null) mBitmap.recycle();
+
+ mBitmap = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888);
+ if (mBitmapCanvas != null) {
+ mBitmapCanvas.setBitmap(mBitmap);
+ } else {
+ mBitmapCanvas = new Canvas(mBitmap);
+ }
+ mBitmapCanvas.drawColor(TRANSPARENT_BACKGROUND);
+
+ if (mCurrentGesture != null) {
+ mCurrentGesture.draw(mBitmapCanvas, mGesturePaint);
+ }
+ }
+
+ public void addOnGestureListener(OnGestureListener listener) {
+ mOnGestureListeners.add(listener);
+ }
+
+ public void removeOnGestureListener(OnGestureListener listener) {
+ mOnGestureListeners.remove(listener);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ // draw double buffer
+ if (mIsFadingOut) {
+ mBitmapPaint.setAlpha((int) (255 * mFadingAlpha));
+ canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
+ } else {
+ mBitmapPaint.setAlpha(255);
+ canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
+ }
+
+ // draw the current stroke
+ if (mPath != null) {
+ canvas.drawPath(mPath, mGesturePaint);
+ }
+ }
+
+ /**
+ * Clear up the overlay
+ *
+ * @param fadeOut whether the gesture on the overlay should fade out
+ * gradually or disappear immediately
+ */
+ public void clear(boolean fadeOut) {
+ if (fadeOut) {
+ mFadingAlpha = 1;
+ mIsFadingOut = true;
+ mHandler.removeCallbacks(mFadingOut);
+ mHandler.postDelayed(mFadingOut, FADING_OFFSET);
+ } else {
+ mPath = null;
+ mCurrentGesture = null;
+ if (mBitmap != null) {
+ mBitmap.eraseColor(TRANSPARENT_BACKGROUND);
+ invalidate();
+ }
+ }
+ }
+
+ public void cancelFadingOut() {
+ mIsFadingOut = false;
+ mHandler.removeCallbacks(mFadingOut);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (!isEnabled()) {
+ return true;
+ }
+
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ Rect rect = touchStart(event);
+ invalidate(rect);
+ break;
+ case MotionEvent.ACTION_MOVE:
+ rect = touchMove(event);
+ if (rect != null) {
+ invalidate(rect);
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ touchUp(event);
+ invalidate();
+ break;
+ }
+
+ return true;
+ }
+
+ private Rect touchStart(MotionEvent event) {
+ // pass the event to handlers
+ final ArrayList<OnGestureListener> listeners = mOnGestureListeners;
+ final int count = listeners.size();
+ for (int i = 0; i < count; i++) {
+ OnGestureListener listener = listeners.get(i);
+ listener.onGestureStarted(this, event);
+ }
+
+ // if there is fading out going on, stop it.
+ if (mIsFadingOut) {
+ mIsFadingOut = false;
+ mHandler.removeCallbacks(mFadingOut);
+ mBitmap.eraseColor(TRANSPARENT_BACKGROUND);
+ mCurrentGesture = null;
+ }
+
+ float x = event.getX();
+ float y = event.getY();
+
+ mX = x;
+ mY = y;
+
+ if (mCurrentGesture == null) {
+ mCurrentGesture = new Gesture();
+ }
+
+ mPointBuffer = new ArrayList<GesturePoint>();
+ mPointBuffer.add(new GesturePoint(x, y, event.getEventTime()));
+
+ mPath = new Path();
+ mPath.moveTo(x, y);
+
+ mInvalidRect.set((int) x - REFRESH_RANGE, (int) y - REFRESH_RANGE,
+ (int) x + REFRESH_RANGE, (int) y + REFRESH_RANGE);
+
+ mCurveEndX = x;
+ mCurveEndY = y;
+
+ return mInvalidRect;
+ }
+
+ private Rect touchMove(MotionEvent event) {
+ Rect areaToRefresh = null;
+
+ float x = event.getX();
+ float y = event.getY();
+
+ float dx = Math.abs(x - mX);
+ float dy = Math.abs(y - mY);
+
+ if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
+
+ // start with the curve end
+ mInvalidRect.set((int) mCurveEndX - REFRESH_RANGE, (int) mCurveEndY - REFRESH_RANGE,
+ (int) mCurveEndX + REFRESH_RANGE, (int) mCurveEndY + REFRESH_RANGE);
+
+ mCurveEndX = (x + mX) / 2;
+ mCurveEndY = (y + mY) / 2;
+ mPath.quadTo(mX, mY, mCurveEndX, mCurveEndY);
+
+ // union with the control point of the new curve
+ mInvalidRect.union((int) mX - REFRESH_RANGE, (int) mY - REFRESH_RANGE,
+ (int) mX + REFRESH_RANGE, (int) mY + REFRESH_RANGE);
+
+ // union with the end point of the new curve
+ mInvalidRect.union((int) mCurveEndX - REFRESH_RANGE, (int) mCurveEndY - REFRESH_RANGE,
+ (int) mCurveEndX + REFRESH_RANGE, (int) mCurveEndY + REFRESH_RANGE);
+
+ areaToRefresh = mInvalidRect;
+
+ mX = x;
+ mY = y;
+ }
+
+
+ mPointBuffer.add(new GesturePoint(x, y, event.getEventTime()));
+
+ // pass the event to handlers
+ final ArrayList<OnGestureListener> listeners = mOnGestureListeners;
+ final int count = listeners.size();
+ for (int i = 0; i < count; i++) {
+ listeners.get(i).onGesture(this, event);
+ }
+
+ return areaToRefresh;
+ }
+
+ private void touchUp(MotionEvent event) {
+ // add the stroke to the current gesture
+ mCurrentGesture.addStroke(new GestureStroke(mPointBuffer));
+
+ // add the stroke to the double buffer
+ mGesturePaint.setMaskFilter(BLUR_MASK_FILTER);
+ mBitmapCanvas.drawPath(mPath, mGesturePaint);
+ mGesturePaint.setMaskFilter(null);
+
+ // pass the event to handlers
+ final ArrayList<OnGestureListener> listeners = mOnGestureListeners;
+ final int count = listeners.size();
+ for (int i = 0; i < count; i++) {
+ listeners.get(i).onGestureEnded(this, event);
+ }
+
+ mPath = null;
+ mPointBuffer = null;
+ }
+
+ /**
+ * An interface for processing gesture events
+ */
+ public static interface OnGestureListener {
+ public void onGestureStarted(GestureOverlayView overlay, MotionEvent event);
+
+ public void onGesture(GestureOverlayView overlay, MotionEvent event);
+
+ public void onGestureEnded(GestureOverlayView overlay, MotionEvent event);
+ }
+}
diff --git a/core/java/android/gesture/GesturePoint.java b/core/java/android/gesture/GesturePoint.java
new file mode 100644
index 0000000..3698011
--- /dev/null
+++ b/core/java/android/gesture/GesturePoint.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2008-2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+
+/**
+ * A timed point of a gesture stroke
+ */
+
+public class GesturePoint {
+ public final float x;
+ public final float y;
+
+ public final long timestamp;
+
+ public GesturePoint(float x, float y, long t) {
+ this.x = x;
+ this.y = y;
+ timestamp = t;
+ }
+
+ static GesturePoint deserialize(DataInputStream in) throws IOException {
+ // Read X and Y
+ final float x = in.readFloat();
+ final float y = in.readFloat();
+ // Read timestamp
+ final long timeStamp = in.readLong();
+ return new GesturePoint(x, y, timeStamp);
+ }
+}
diff --git a/core/java/android/gesture/GestureStroke.java b/core/java/android/gesture/GestureStroke.java
new file mode 100644
index 0000000..5160a76
--- /dev/null
+++ b/core/java/android/gesture/GestureStroke.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2008-2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.RectF;
+
+import java.io.IOException;
+import java.io.DataOutputStream;
+import java.io.DataInputStream;
+import java.util.ArrayList;
+
+/**
+ * A gesture stroke started on a touch down and ended on a touch up.
+ */
+public class GestureStroke {
+ public final RectF boundingBox;
+
+ public final float length;
+ public final float[] points;
+
+ private final long[] timestamps;
+ private Path mCachedPath;
+
+ /**
+ * Construct a gesture stroke from a list of gesture points
+ *
+ * @param points
+ */
+ public GestureStroke(ArrayList<GesturePoint> points) {
+ final int count = points.size();
+ final float[] tmpPoints = new float[count * 2];
+ final long[] times = new long[count];
+
+ RectF bx = null;
+ float len = 0;
+ int index = 0;
+
+ for (int i = 0; i < count; i++) {
+ final GesturePoint p = points.get(i);
+ tmpPoints[i * 2] = p.x;
+ tmpPoints[i * 2 + 1] = p.y;
+ times[index] = p.timestamp;
+
+ if (bx == null) {
+ bx = new RectF();
+ bx.top = p.y;
+ bx.left = p.x;
+ bx.right = p.x;
+ bx.bottom = p.y;
+ len = 0;
+ } else {
+ len += Math.sqrt(Math.pow(p.x - tmpPoints[(i - 1) * 2], 2)
+ + Math.pow(p.y - tmpPoints[(i -1 ) * 2 + 1], 2));
+ bx.union(p.x, p.y);
+ }
+ index++;
+ }
+
+ timestamps = times;
+ this.points = tmpPoints;
+ boundingBox = bx;
+ length = len;
+ }
+
+ /**
+ * Draw the gesture with a given canvas and paint
+ *
+ * @param canvas
+ */
+ void draw(Canvas canvas, Paint paint) {
+ if (mCachedPath == null) {
+ final float[] localPoints = points;
+ final int count = localPoints.length;
+
+ Path path = null;
+
+ float mX = 0;
+ float mY = 0;
+
+ for (int i = 0; i < count; i += 2) {
+ float x = localPoints[i];
+ float y = localPoints[i + 1];
+ if (path == null) {
+ path = new Path();
+ path.moveTo(x, y);
+ mX = x;
+ mY = y;
+ } else {
+ float dx = Math.abs(x - mX);
+ float dy = Math.abs(y - mY);
+ if (dx >= 3 || dy >= 3) {
+ path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
+ mX = x;
+ mY = y;
+ }
+ }
+ }
+
+ mCachedPath = path;
+ }
+
+ canvas.drawPath(mCachedPath, paint);
+ }
+
+ /**
+ * Convert the stroke to a Path based on the number of points
+ *
+ * @param width the width of the bounding box of the target path
+ * @param height the height of the bounding box of the target path
+ * @param numSample the number of points needed
+ *
+ * @return the path
+ */
+ public Path toPath(float width, float height, int numSample) {
+ final float[] pts = GestureUtilities.temporalSampling(this, numSample);
+ final RectF rect = boundingBox;
+
+ final Matrix matrix = new Matrix();
+ matrix.setTranslate(-rect.left, -rect.top);
+ matrix.postScale(width / rect.width(), height / rect.height());
+ matrix.mapPoints(pts);
+
+ float mX = 0;
+ float mY = 0;
+
+ Path path = null;
+
+ final int count = pts.length;
+
+ for (int i = 0; i < count; i += 2) {
+ float x = pts[i];
+ float y = pts[i + 1];
+ if (path == null) {
+ path = new Path();
+ path.moveTo(x, y);
+ mX = x;
+ mY = y;
+ } else {
+ float dx = Math.abs(x - mX);
+ float dy = Math.abs(y - mY);
+ if (dx >= GestureOverlayView.TOUCH_TOLERANCE ||
+ dy >= GestureOverlayView.TOUCH_TOLERANCE) {
+ path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
+ mX = x;
+ mY = y;
+ }
+ }
+ }
+
+ return path;
+ }
+
+ void serialize(DataOutputStream out) throws IOException {
+ final float[] pts = points;
+ final long[] times = timestamps;
+ final int count = points.length;
+
+ // Write number of points
+ out.writeInt(count / 2);
+
+ for (int i = 0; i < count; i += 2) {
+ // Write X
+ out.writeFloat(pts[i]);
+ // Write Y
+ out.writeFloat(pts[i + 1]);
+ // Write timestamp
+ out.writeLong(times[i / 2]);
+ }
+ }
+
+ static GestureStroke deserialize(DataInputStream in) throws IOException {
+ // Number of points
+ final int count = in.readInt();
+
+ final ArrayList<GesturePoint> points = new ArrayList<GesturePoint>(count);
+ for (int i = 0; i < count; i++) {
+ points.add(GesturePoint.deserialize(in));
+ }
+
+ return new GestureStroke(points);
+ }
+
+ /**
+ * Invalidate the cached path that is used to render the stroke
+ */
+ public void clearPath() {
+ if (mCachedPath != null) mCachedPath.rewind();
+ }
+
+ /**
+ * Compute an oriented bounding box of the stroke
+ * @return OrientedBoundingBox
+ */
+ public OrientedBoundingBox computeOrientedBoundingBox() {
+ return GestureUtilities.computeOrientedBoundingBox(points);
+ }
+}
diff --git a/core/java/android/gesture/GestureUtilities.java b/core/java/android/gesture/GestureUtilities.java
new file mode 100755
index 0000000..e47856c
--- /dev/null
+++ b/core/java/android/gesture/GestureUtilities.java
@@ -0,0 +1,444 @@
+/*
+ * Copyright (C) 2008-2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+import android.graphics.RectF;
+import android.graphics.Matrix;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.io.Closeable;
+import java.io.IOException;
+
+import static android.gesture.GestureConstants.*;
+
+final class GestureUtilities {
+ private static final int TEMPORAL_SAMPLING_RATE = 16;
+
+ private GestureUtilities() {
+ }
+
+ /**
+ * Closes the specified stream.
+ *
+ * @param stream The stream to close.
+ */
+ static void closeStream(Closeable stream) {
+ if (stream != null) {
+ try {
+ stream.close();
+ } catch (IOException e) {
+ Log.e(LOG_TAG, "Could not close stream", e);
+ }
+ }
+ }
+
+ static float[] spatialSampling(Gesture gesture, int sampleMatrixDimension) {
+ final float targetPatchSize = sampleMatrixDimension - 1; // edge inclusive
+ float[] sample = new float[sampleMatrixDimension * sampleMatrixDimension];
+ Arrays.fill(sample, 0);
+
+ RectF rect = gesture.getBoundingBox();
+ float sx = targetPatchSize / rect.width();
+ float sy = targetPatchSize / rect.height();
+ float scale = sx < sy ? sx : sy;
+
+ Matrix trans = new Matrix();
+ trans.setScale(scale, scale);
+ trans.preTranslate(-rect.centerX(), -rect.centerY());
+ trans.postTranslate(targetPatchSize / 2, targetPatchSize / 2);
+
+ final ArrayList<GestureStroke> strokes = gesture.getStrokes();
+ final int count = strokes.size();
+
+ int size;
+ float xpos;
+ float ypos;
+
+ for (int index = 0; index < count; index++) {
+ final GestureStroke stroke = strokes.get(index);
+ size = stroke.points.length;
+
+ final float[] pts = new float[size];
+
+ trans.mapPoints(pts, 0, stroke.points, 0, size / 2);
+ float segmentEndX = -1;
+ float segmentEndY = -1;
+
+ for (int i = 0; i < size; i += 2) {
+
+ float segmentStartX = pts[i] < 0 ? 0 : pts[i];
+ float segmentStartY = pts[i + 1] < 0 ? 0 : pts[i + 1];
+
+ if (segmentStartX > targetPatchSize) {
+ segmentStartX = targetPatchSize;
+ }
+
+ if (segmentStartY > targetPatchSize) {
+ segmentStartY = targetPatchSize;
+ }
+
+ plot(segmentStartX, segmentStartY, sample, sampleMatrixDimension);
+
+ if (segmentEndX != -1) {
+ // evaluate horizontally
+ if (segmentEndX > segmentStartX) {
+ xpos = (float) Math.ceil(segmentStartX);
+ float slope = (segmentEndY - segmentStartY) / (segmentEndX - segmentStartX);
+ while (xpos < segmentEndX) {
+ ypos = slope * (xpos - segmentStartX) + segmentStartY;
+ plot(xpos, ypos, sample, sampleMatrixDimension);
+ xpos++;
+ }
+ } else if (segmentEndX < segmentStartX){
+ xpos = (float) Math.ceil(segmentEndX);
+ float slope = (segmentEndY - segmentStartY) / (segmentEndX - segmentStartX);
+ while (xpos < segmentStartX) {
+ ypos = slope * (xpos - segmentStartX) + segmentStartY;
+ plot(xpos, ypos, sample, sampleMatrixDimension);
+ xpos++;
+ }
+ }
+
+ // evaluating vertically
+ if (segmentEndY > segmentStartY) {
+ ypos = (float) Math.ceil(segmentStartY);
+ float invertSlope = (segmentEndX - segmentStartX) / (segmentEndY - segmentStartY);
+ while (ypos < segmentEndY) {
+ xpos = invertSlope * (ypos - segmentStartY) + segmentStartX;
+ plot(xpos, ypos, sample, sampleMatrixDimension);
+ ypos++;
+ }
+ } else if (segmentEndY < segmentStartY) {
+ ypos = (float) Math.ceil(segmentEndY);
+ float invertSlope = (segmentEndX - segmentStartX) / (segmentEndY - segmentStartY);
+ while (ypos < segmentStartY) {
+ xpos = invertSlope * (ypos - segmentStartY) + segmentStartX;
+ plot(xpos, ypos, sample, sampleMatrixDimension);
+ ypos++;
+ }
+ }
+ }
+
+ segmentEndX = segmentStartX;
+ segmentEndY = segmentStartY;
+ }
+ }
+
+
+ return sample;
+ }
+
+ private static void plot(float x, float y, float[] sample, int sampleSize) {
+ x = x < 0 ? 0 : x;
+ y = y < 0 ? 0 : y;
+ int xFloor = (int) Math.floor(x);
+ int xCeiling = (int) Math.ceil(x);
+ int yFloor = (int) Math.floor(y);
+ int yCeiling = (int) Math.ceil(y);
+
+ // if it's an integer
+ if (x == xFloor && y == yFloor) {
+ int index = yCeiling * sampleSize + xCeiling;
+ if (sample[index] < 1){
+ sample[index] = 1;
+ }
+ } else {
+ double topLeft = Math.sqrt(Math.pow(xFloor - x, 2) + Math.pow(yFloor - y, 2));
+ double topRight = Math.sqrt(Math.pow(xCeiling - x, 2) + Math.pow(yFloor - y, 2));
+ double btmLeft = Math.sqrt(Math.pow(xFloor - x, 2) + Math.pow(yCeiling - y, 2));
+ double btmRight = Math.sqrt(Math.pow(xCeiling - x, 2) + Math.pow(yCeiling - y, 2));
+ double sum = topLeft + topRight + btmLeft + btmRight;
+
+ double value = topLeft / sum;
+ int index = yFloor * sampleSize + xFloor;
+ if (value > sample[index]){
+ sample[index] = (float) value;
+ }
+
+ value = topRight / sum;
+ index = yFloor * sampleSize + xCeiling;
+ if (value > sample[index]){
+ sample[index] = (float) value;
+ }
+
+ value = btmLeft / sum;
+ index = yCeiling * sampleSize + xFloor;
+ if (value > sample[index]){
+ sample[index] = (float) value;
+ }
+
+ value = btmRight / sum;
+ index = yCeiling * sampleSize + xCeiling;
+ if (value > sample[index]){
+ sample[index] = (float) value;
+ }
+ }
+ }
+
+ /**
+ * Featurize a stroke into a vector of a given number of elements
+ *
+ * @param stroke
+ * @param sampleSize
+ * @return a float array
+ */
+ static float[] temporalSampling(GestureStroke stroke, int sampleSize) {
+ final float increment = stroke.length / (sampleSize - 1);
+ int vectorLength = sampleSize * 2;
+ float[] vector = new float[vectorLength];
+ float distanceSoFar = 0;
+ float[] pts = stroke.points;
+ float lstPointX = pts[0];
+ float lstPointY = pts[1];
+ int index = 0;
+ float currentPointX = Float.MIN_VALUE;
+ float currentPointY = Float.MIN_VALUE;
+ vector[index] = lstPointX;
+ index++;
+ vector[index] = lstPointY;
+ index++;
+ int i = 0;
+ int count = pts.length / 2;
+ while (i < count) {
+ if (currentPointX == Float.MIN_VALUE) {
+ i++;
+ if (i >= count) {
+ break;
+ }
+ currentPointX = pts[i * 2];
+ currentPointY = pts[i * 2 + 1];
+ }
+ float deltaX = currentPointX - lstPointX;
+ float deltaY = currentPointY - lstPointY;
+ float distance = (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY);
+ if (distanceSoFar + distance >= increment) {
+ float ratio = (increment - distanceSoFar) / distance;
+ float nx = lstPointX + ratio * deltaX;
+ float ny = lstPointY + ratio * deltaY;
+ vector[index] = nx;
+ index++;
+ vector[index] = ny;
+ index++;
+ lstPointX = nx;
+ lstPointY = ny;
+ distanceSoFar = 0;
+ } else {
+ lstPointX = currentPointX;
+ lstPointY = currentPointY;
+ currentPointX = Float.MIN_VALUE;
+ currentPointY = Float.MIN_VALUE;
+ distanceSoFar += distance;
+ }
+ }
+
+ for (i = index; i < vectorLength; i += 2) {
+ vector[i] = lstPointX;
+ vector[i + 1] = lstPointY;
+ }
+ return vector;
+ }
+
+ /**
+ * Calculate the centroid
+ *
+ * @param points
+ * @return the centroid
+ */
+ static float[] computeCentroid(float[] points) {
+ float centerX = 0;
+ float centerY = 0;
+ int count = points.length;
+ for (int i = 0; i < count; i++) {
+ centerX += points[i];
+ i++;
+ centerY += points[i];
+ }
+ float[] center = new float[2];
+ center[0] = 2 * centerX / count;
+ center[1] = 2 * centerY / count;
+
+ return center;
+ }
+
+ /**
+ * calculate the variance-covariance matrix, treat each point as a sample
+ *
+ * @param points
+ * @return the covariance matrix
+ */
+ private static double[][] computeCoVariance(float[] points) {
+ double[][] array = new double[2][2];
+ array[0][0] = 0;
+ array[0][1] = 0;
+ array[1][0] = 0;
+ array[1][1] = 0;
+ int count = points.length;
+ for (int i = 0; i < count; i++) {
+ float x = points[i];
+ i++;
+ float y = points[i];
+ array[0][0] += x * x;
+ array[0][1] += x * y;
+ array[1][0] = array[0][1];
+ array[1][1] += y * y;
+ }
+ array[0][0] /= (count / 2);
+ array[0][1] /= (count / 2);
+ array[1][0] /= (count / 2);
+ array[1][1] /= (count / 2);
+
+ return array;
+ }
+
+ static float computeTotalLength(float[] points) {
+ float sum = 0;
+ int count = points.length - 4;
+ for (int i = 0; i < count; i += 2) {
+ float dx = points[i + 2] - points[i];
+ float dy = points[i + 3] - points[i + 1];
+ sum += Math.sqrt(dx * dx + dy * dy);
+ }
+ return sum;
+ }
+
+ static double computeStraightness(float[] points) {
+ float totalLen = computeTotalLength(points);
+ float dx = points[2] - points[0];
+ float dy = points[3] - points[1];
+ return Math.sqrt(dx * dx + dy * dy) / totalLen;
+ }
+
+ static double computeStraightness(float[] points, float totalLen) {
+ float dx = points[2] - points[0];
+ float dy = points[3] - points[1];
+ return Math.sqrt(dx * dx + dy * dy) / totalLen;
+ }
+
+ /**
+ * Calculate the squared Euclidean distance between two vectors
+ *
+ * @param vector1
+ * @param vector2
+ * @return the distance
+ */
+ static double squaredEuclideanDistance(float[] vector1, float[] vector2) {
+ double squaredDistance = 0;
+ int size = vector1.length;
+ for (int i = 0; i < size; i++) {
+ float difference = vector1[i] - vector2[i];
+ squaredDistance += difference * difference;
+ }
+ return squaredDistance / size;
+ }
+
+ /**
+ * Calculate the cosine distance between two instances
+ *
+ * @param vector1
+ * @param vector2
+ * @return the distance between 0 and Math.PI
+ */
+ static double cosineDistance(float[] vector1, float[] vector2) {
+ float sum = 0;
+ int len = vector1.length;
+ for (int i = 0; i < len; i++) {
+ sum += vector1[i] * vector2[i];
+ }
+ return Math.acos(sum);
+ }
+
+ static OrientedBoundingBox computeOrientedBoundingBox(ArrayList<GesturePoint> pts) {
+ GestureStroke stroke = new GestureStroke(pts);
+ float[] points = temporalSampling(stroke, TEMPORAL_SAMPLING_RATE);
+ return computeOrientedBoundingBox(points);
+ }
+
+ static OrientedBoundingBox computeOrientedBoundingBox(float[] points) {
+ float[] meanVector = computeCentroid(points);
+ return computeOrientedBoundingBox(points, meanVector);
+ }
+
+ static OrientedBoundingBox computeOrientedBoundingBox(float[] points, float[] centroid) {
+ Matrix tr = new Matrix();
+ tr.setTranslate(-centroid[0], -centroid[1]);
+ tr.mapPoints(points);
+
+ double[][] array = computeCoVariance(points);
+ double[] targetVector = computeOrientation(array);
+
+ float angle;
+ if (targetVector[0] == 0 && targetVector[1] == 0) {
+ angle = -90;
+ } else { // -PI<alpha<PI
+ angle = (float) Math.atan2(targetVector[1], targetVector[0]);
+ angle = (float) (180 * angle / Math.PI);
+ android.graphics.Matrix trans = new android.graphics.Matrix();
+ trans.setRotate(-angle);
+ trans.mapPoints(points);
+ }
+
+ float minx = Float.MAX_VALUE;
+ float miny = Float.MAX_VALUE;
+ float maxx = Float.MIN_VALUE;
+ float maxy = Float.MIN_VALUE;
+ int count = points.length;
+ for (int i = 0; i < count; i++) {
+ if (points[i] < minx) {
+ minx = points[i];
+ }
+ if (points[i] > maxx) {
+ maxx = points[i];
+ }
+ i++;
+ if (points[i] < miny) {
+ miny = points[i];
+ }
+ if (points[i] > maxy) {
+ maxy = points[i];
+ }
+ }
+
+ return new OrientedBoundingBox(angle, centroid[0], centroid[1], maxx - minx, maxy - miny);
+ }
+
+ private static double[] computeOrientation(double[][] covarianceMatrix) {
+ double[] targetVector = new double[2];
+ if (covarianceMatrix[0][1] == 0 || covarianceMatrix[1][0] == 0) {
+ targetVector[0] = 1;
+ targetVector[1] = 0;
+ }
+
+ double a = -covarianceMatrix[0][0] - covarianceMatrix[1][1];
+ double b = covarianceMatrix[0][0] * covarianceMatrix[1][1] - covarianceMatrix[0][1]
+ * covarianceMatrix[1][0];
+ double value = a / 2;
+ double rightside = Math.sqrt(Math.pow(value, 2) - b);
+ double lambda1 = -value + rightside;
+ double lambda2 = -value - rightside;
+ if (lambda1 == lambda2) {
+ targetVector[0] = 0;
+ targetVector[1] = 0;
+ } else {
+ double lambda = lambda1 > lambda2 ? lambda1 : lambda2;
+ targetVector[0] = 1;
+ targetVector[1] = (lambda - covarianceMatrix[0][0]) / covarianceMatrix[0][1];
+ }
+ return targetVector;
+ }
+}
diff --git a/core/java/android/gesture/Instance.java b/core/java/android/gesture/Instance.java
new file mode 100755
index 0000000..7922fab
--- /dev/null
+++ b/core/java/android/gesture/Instance.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2008-2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+import android.graphics.Matrix;
+
+/**
+ * An instance represents a sample if the label is available or a query if the
+ * label is null.
+ */
+class Instance {
+ private static final int SEQUENCE_SAMPLE_SIZE = 16;
+
+ private static final int PATCH_SAMPLE_SIZE = 16;
+
+ private final static float[] ORIENTATIONS = {
+ 0, 45, 90, 135, 180, -0, -45, -90, -135, -180
+ };
+
+ // the feature vector
+ final float[] vector;
+
+ // the label can be null
+ final String label;
+
+ // the id of the instance
+ final long id;
+
+ private Instance(long id, float[] sample, String sampleName) {
+ this.id = id;
+ vector = sample;
+ label = sampleName;
+ }
+
+ private void normalize() {
+ float[] sample = vector;
+ float sum = 0;
+
+ int size = sample.length;
+ for (int i = 0; i < size; i++) {
+ sum += sample[i] * sample[i];
+ }
+
+ float magnitude = (float) Math.sqrt(sum);
+ for (int i = 0; i < size; i++) {
+ sample[i] /= magnitude;
+ }
+ }
+
+ /**
+ * create a learning instance for a single stroke gesture
+ *
+ * @param gesture
+ * @param label
+ * @return the instance
+ */
+ static Instance createInstance(int samplingType, Gesture gesture, String label) {
+ float[] pts;
+ Instance instance;
+ if (samplingType == GestureLibrary.SEQUENCE_SENSITIVE) {
+ pts = temporalSampler(samplingType, gesture);
+ instance = new Instance(gesture.getID(), pts, label);
+ instance.normalize();
+ } else {
+ pts = spatialSampler(gesture);
+ instance = new Instance(gesture.getID(), pts, label);
+ }
+ return instance;
+ }
+
+ private static float[] spatialSampler(Gesture gesture) {
+ return GestureUtilities.spatialSampling(gesture, PATCH_SAMPLE_SIZE);
+ }
+
+ private static float[] temporalSampler(int samplingType, Gesture gesture) {
+ float[] pts = GestureUtilities.temporalSampling(gesture.getStrokes().get(0),
+ SEQUENCE_SAMPLE_SIZE);
+ float[] center = GestureUtilities.computeCentroid(pts);
+ float orientation = (float) Math.atan2(pts[1] - center[1], pts[0] - center[0]);
+ orientation *= 180 / Math.PI;
+
+ float adjustment = -orientation;
+ if (samplingType == GestureLibrary.ORIENTATION_SENSITIVE) {
+ int count = ORIENTATIONS.length;
+ for (int i = 0; i < count; i++) {
+ float delta = ORIENTATIONS[i] - orientation;
+ if (Math.abs(delta) < Math.abs(adjustment)) {
+ adjustment = delta;
+ }
+ }
+ }
+
+ Matrix m = new Matrix();
+ m.setTranslate(-center[0], -center[1]);
+ m.postRotate(adjustment);
+ m.mapPoints(pts);
+
+ return pts;
+ }
+
+}
diff --git a/core/java/android/gesture/InstanceLearner.java b/core/java/android/gesture/InstanceLearner.java
new file mode 100644
index 0000000..1739cdc
--- /dev/null
+++ b/core/java/android/gesture/InstanceLearner.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2008-2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+import android.util.Config;
+import android.util.Log;
+import static android.gesture.GestureConstants.*;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.TreeMap;
+
+/**
+ * An implementation of an instance-based learner
+ */
+
+class InstanceLearner extends Learner {
+ @Override
+ ArrayList<Prediction> classify(int gestureType, float[] vector) {
+ ArrayList<Prediction> predictions = new ArrayList<Prediction>();
+ ArrayList<Instance> instances = getInstances();
+ int count = instances.size();
+ TreeMap<String, Double> label2score = new TreeMap<String, Double>();
+ for (int i = 0; i < count; i++) {
+ Instance sample = instances.get(i);
+ if (sample.vector.length != vector.length) {
+ continue;
+ }
+ double distance;
+ if (gestureType == GestureLibrary.SEQUENCE_SENSITIVE) {
+ distance = GestureUtilities.cosineDistance(sample.vector, vector);
+ } else {
+ distance = GestureUtilities.squaredEuclideanDistance(sample.vector, vector);
+ }
+ double weight;
+ if (distance == 0) {
+ weight = Double.MAX_VALUE;
+ } else {
+ weight = 1 / distance;
+ }
+ Double score = label2score.get(sample.label);
+ if (score == null || weight > score) {
+ label2score.put(sample.label, weight);
+ }
+ }
+
+ double sum = 0;
+ for (String name : label2score.keySet()) {
+ double score = label2score.get(name);
+ sum += score;
+ predictions.add(new Prediction(name, score));
+ }
+
+ // normalize
+ for (Prediction prediction : predictions) {
+ prediction.score /= sum;
+ }
+
+ Collections.sort(predictions, new Comparator<Prediction>() {
+ public int compare(Prediction object1, Prediction object2) {
+ double score1 = object1.score;
+ double score2 = object2.score;
+ if (score1 > score2) {
+ return -1;
+ } else if (score1 < score2) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+ });
+
+ return predictions;
+ }
+}
diff --git a/core/java/android/gesture/Learner.java b/core/java/android/gesture/Learner.java
new file mode 100755
index 0000000..feacde5
--- /dev/null
+++ b/core/java/android/gesture/Learner.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2008-2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+import java.util.ArrayList;
+
+/**
+ * The abstract class of a gesture learner
+ */
+abstract class Learner {
+ private final ArrayList<Instance> mInstances = new ArrayList<Instance>();
+
+ /**
+ * Add an instance to the learner
+ *
+ * @param instance
+ */
+ void addInstance(Instance instance) {
+ mInstances.add(instance);
+ }
+
+ /**
+ * Retrieve all the instances
+ *
+ * @return instances
+ */
+ ArrayList<Instance> getInstances() {
+ return mInstances;
+ }
+
+ /**
+ * Remove an instance based on its id
+ *
+ * @param id
+ */
+ void removeInstance(long id) {
+ ArrayList<Instance> instances = mInstances;
+ int count = instances.size();
+ for (int i = 0; i < count; i++) {
+ Instance instance = instances.get(i);
+ if (id == instance.id) {
+ instances.remove(instance);
+ return;
+ }
+ }
+ }
+
+ /**
+ * Remove all the instances of a category
+ *
+ * @param name the category name
+ */
+ void removeInstances(String name) {
+ final ArrayList<Instance> toDelete = new ArrayList<Instance>();
+ final ArrayList<Instance> instances = mInstances;
+ final int count = instances.size();
+
+ for (int i = 0; i < count; i++) {
+ final Instance instance = instances.get(i);
+ // the label can be null, as specified in Instance
+ if ((instance.label == null && name == null) || instance.label.equals(name)) {
+ toDelete.add(instance);
+ }
+ }
+ instances.removeAll(toDelete);
+ }
+
+ abstract ArrayList<Prediction> classify(int gestureType, float[] vector);
+}
diff --git a/core/java/android/gesture/LetterRecognizer.java b/core/java/android/gesture/LetterRecognizer.java
new file mode 100644
index 0000000..4476746
--- /dev/null
+++ b/core/java/android/gesture/LetterRecognizer.java
@@ -0,0 +1,273 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.util.Log;
+
+import java.io.BufferedInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+
+import static android.gesture.GestureConstants.LOG_TAG;
+
+public class LetterRecognizer {
+ public final static int RECOGNIZER_LATIN_LOWERCASE = 0;
+ static final String GESTURE_FILE_NAME = "letters.gestures";
+
+ private final static int ADJUST_RANGE = 3;
+
+ private SigmoidUnit[] mHiddenLayer;
+ private SigmoidUnit[] mOutputLayer;
+
+ private final String[] mClasses;
+
+ private final int mPatchSize;
+
+ private GestureLibrary mGestureLibrary;
+
+ private static class SigmoidUnit {
+ final float[] mWeights;
+
+ private boolean mComputed;
+ private float mResult;
+
+ SigmoidUnit(float[] weights) {
+ mWeights = weights;
+ }
+
+ private float compute(float[] inputs) {
+ if (!mComputed) {
+ float sum = 0;
+
+ final int count = inputs.length;
+ final float[] weights = mWeights;
+
+ for (int i = 0; i < count; i++) {
+ sum += inputs[i] * weights[i];
+ }
+ sum += weights[weights.length - 1];
+
+ mResult = 1.0f / (float) (1 + Math.exp(-sum));
+ mComputed = true;
+ }
+ return mResult;
+ }
+ }
+
+ public static LetterRecognizer getLetterRecognizer(Context context, int type) {
+ switch (type) {
+ case RECOGNIZER_LATIN_LOWERCASE: {
+ return createFromResource(context, com.android.internal.R.raw.latin_lowercase);
+ }
+ }
+ return null;
+ }
+
+ private LetterRecognizer(int numOfInput, int numOfHidden, String[] classes) {
+ mPatchSize = (int) Math.sqrt(numOfInput);
+ mHiddenLayer = new SigmoidUnit[numOfHidden];
+ mClasses = classes;
+ mOutputLayer = new SigmoidUnit[classes.length];
+ }
+
+ public ArrayList<Prediction> recognize(Gesture gesture) {
+ float[] query = GestureUtilities.spatialSampling(gesture, mPatchSize);
+ ArrayList<Prediction> predictions = classify(query);
+ adjustPrediction(gesture, predictions);
+ return predictions;
+ }
+
+ private ArrayList<Prediction> classify(float[] vector) {
+ final float[] intermediateOutput = compute(mHiddenLayer, vector);
+ final float[] output = compute(mOutputLayer, intermediateOutput);
+ final ArrayList<Prediction> predictions = new ArrayList<Prediction>();
+
+ double sum = 0;
+
+ final String[] classes = mClasses;
+ final int count = classes.length;
+
+ for (int i = 0; i < count; i++) {
+ double score = output[i];
+ sum += score;
+ predictions.add(new Prediction(classes[i], score));
+ }
+
+ for (int i = 0; i < count; i++) {
+ predictions.get(i).score /= sum;
+ }
+
+ Collections.sort(predictions, new Comparator<Prediction>() {
+ public int compare(Prediction object1, Prediction object2) {
+ double score1 = object1.score;
+ double score2 = object2.score;
+ if (score1 > score2) {
+ return -1;
+ } else if (score1 < score2) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+ });
+ return predictions;
+ }
+
+ private float[] compute(SigmoidUnit[] layer, float[] input) {
+ final float[] output = new float[layer.length];
+ final int count = layer.length;
+
+ for (int i = 0; i < count; i++) {
+ output[i] = layer[i].compute(input);
+ }
+
+ return output;
+ }
+
+ private static LetterRecognizer createFromResource(Context context, int resourceID) {
+ final Resources resources = context.getResources();
+
+ DataInputStream in = null;
+ LetterRecognizer classifier = null;
+
+ try {
+ in = new DataInputStream(new BufferedInputStream(resources.openRawResource(resourceID),
+ GestureConstants.IO_BUFFER_SIZE));
+
+ final int version = in.readShort();
+
+ switch (version) {
+ case 1:
+ classifier = readV1(in);
+ break;
+ }
+
+ } catch (IOException e) {
+ Log.d(LOG_TAG, "Failed to load handwriting data:", e);
+ } finally {
+ GestureUtilities.closeStream(in);
+ }
+
+ return classifier;
+ }
+
+ private static LetterRecognizer readV1(DataInputStream in) throws IOException {
+
+ final int iCount = in.readInt();
+ final int hCount = in.readInt();
+ final int oCount = in.readInt();
+
+ final String[] classes = new String[oCount];
+ for (int i = 0; i < classes.length; i++) {
+ classes[i] = in.readUTF();
+ }
+
+ final LetterRecognizer classifier = new LetterRecognizer(iCount, hCount, classes);
+ final SigmoidUnit[] hiddenLayer = new SigmoidUnit[hCount];
+ final SigmoidUnit[] outputLayer = new SigmoidUnit[oCount];
+
+ for (int i = 0; i < hCount; i++) {
+ final float[] weights = new float[iCount + 1];
+ for (int j = 0; j <= iCount; j++) {
+ weights[j] = in.readFloat();
+ }
+ hiddenLayer[i] = new SigmoidUnit(weights);
+ }
+
+ for (int i = 0; i < oCount; i++) {
+ final float[] weights = new float[hCount + 1];
+ for (int j = 0; j <= hCount; j++) {
+ weights[j] = in.readFloat();
+ }
+ outputLayer[i] = new SigmoidUnit(weights);
+ }
+
+ classifier.mHiddenLayer = hiddenLayer;
+ classifier.mOutputLayer = outputLayer;
+
+ return classifier;
+ }
+
+ /**
+ * TODO: Publish this API once we figure out where we should save the personzlied
+ * gestures, and how to do so across all apps
+ *
+ * @hide
+ */
+ public boolean save() {
+ if (mGestureLibrary != null) {
+ return mGestureLibrary.save();
+ }
+ return false;
+ }
+
+ /**
+ * TODO: Publish this API once we figure out where we should save the personzlied
+ * gestures, and how to do so across all apps
+ *
+ * @hide
+ */
+ public void setPersonalizationEnabled(boolean enabled) {
+ if (enabled) {
+ mGestureLibrary = new GestureLibrary(GESTURE_FILE_NAME);
+ mGestureLibrary.setSequenceType(GestureLibrary.SEQUENCE_INVARIANT);
+ mGestureLibrary.load();
+ } else {
+ mGestureLibrary = null;
+ }
+ }
+
+ /**
+ * TODO: Publish this API once we figure out where we should save the personzlied
+ * gestures, and how to do so across all apps
+ *
+ * @hide
+ */
+ public void addExample(String letter, Gesture example) {
+ if (mGestureLibrary != null) {
+ mGestureLibrary.addGesture(letter, example);
+ }
+ }
+
+ private void adjustPrediction(Gesture query, ArrayList<Prediction> predictions) {
+ if (mGestureLibrary != null) {
+ final ArrayList<Prediction> results = mGestureLibrary.recognize(query);
+ final HashMap<String, Prediction> topNList = new HashMap<String, Prediction>();
+
+ for (int j = 0; j < ADJUST_RANGE; j++) {
+ Prediction prediction = predictions.remove(0);
+ topNList.put(prediction.name, prediction);
+ }
+
+ final int count = results.size();
+ for (int j = count - 1; j >= 0 && !topNList.isEmpty(); j--) {
+ final Prediction item = results.get(j);
+ final Prediction original = topNList.get(item.name);
+ if (original != null) {
+ predictions.add(0, original);
+ topNList.remove(item.name);
+ }
+ }
+ }
+ }
+}
diff --git a/core/java/android/gesture/OrientedBoundingBox.java b/core/java/android/gesture/OrientedBoundingBox.java
new file mode 100644
index 0000000..f1335ee
--- /dev/null
+++ b/core/java/android/gesture/OrientedBoundingBox.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2008-2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+import android.graphics.Matrix;
+import android.graphics.Path;
+
+/**
+ * An oriented bounding box
+ */
+public class OrientedBoundingBox {
+ public final float squareness;
+
+ public final float width;
+ public final float height;
+
+ public final float orientation;
+
+ public final float centerX;
+ public final float centerY;
+
+ OrientedBoundingBox(float angle, float cx, float cy, float w, float h) {
+ orientation = angle;
+ width = w;
+ height = h;
+ centerX = cx;
+ centerY = cy;
+ float ratio = w / h;
+ if (ratio > 1) {
+ squareness = 1 / ratio;
+ } else {
+ squareness = ratio;
+ }
+ }
+
+ /**
+ * Currently used for debugging purpose only.
+ *
+ * @hide
+ */
+ public Path toPath() {
+ Path path = new Path();
+ float[] point = new float[2];
+ point[0] = -width / 2;
+ point[1] = height / 2;
+ Matrix matrix = new Matrix();
+ matrix.setRotate(orientation);
+ matrix.postTranslate(centerX, centerY);
+ matrix.mapPoints(point);
+ path.moveTo(point[0], point[1]);
+
+ point[0] = -width / 2;
+ point[1] = -height / 2;
+ matrix.mapPoints(point);
+ path.lineTo(point[0], point[1]);
+
+ point[0] = width / 2;
+ point[1] = -height / 2;
+ matrix.mapPoints(point);
+ path.lineTo(point[0], point[1]);
+
+ point[0] = width / 2;
+ point[1] = height / 2;
+ matrix.mapPoints(point);
+ path.lineTo(point[0], point[1]);
+
+ path.close();
+
+ return path;
+ }
+}
diff --git a/core/java/android/gesture/Prediction.java b/core/java/android/gesture/Prediction.java
new file mode 100755
index 0000000..ce6ad57
--- /dev/null
+++ b/core/java/android/gesture/Prediction.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2008-2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+public class Prediction {
+ public final String name;
+
+ public double score;
+
+ Prediction(String label, double predictionScore) {
+ name = label;
+ score = predictionScore;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+}
diff --git a/core/java/android/gesture/TouchThroughGestureListener.java b/core/java/android/gesture/TouchThroughGestureListener.java
new file mode 100644
index 0000000..7621ddf
--- /dev/null
+++ b/core/java/android/gesture/TouchThroughGestureListener.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2008-2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.gesture;
+
+import android.view.MotionEvent;
+import android.view.View;
+
+import java.util.ArrayList;
+import java.lang.ref.WeakReference;
+
+/**
+ * TouchThroughGesturing implements the interaction behavior that allows a user
+ * to gesture over a regular UI widget such as ListView and at the same time,
+ * still allows a user to perform basic interactions (clicking, scrolling and panning)
+ * with the underlying widget.
+ */
+public class TouchThroughGestureListener implements GestureOverlayView.OnGestureListener {
+ public static final int SINGLE_STROKE = 0;
+ public static final int MULTIPLE_STROKE = 1;
+
+ // TODO: Add properties for all these
+ private static final float STROKE_LENGTH_THRESHOLD = 30;
+ private static final float SQUARENESS_THRESHOLD = 0.275f;
+ private static final float ANGLE_THRESHOLD = 40;
+
+ private boolean mIsGesturing = false;
+
+ private float mTotalLength;
+
+ private float mX;
+ private float mY;
+
+ private WeakReference<View> mModel;
+
+ private int mGestureType = SINGLE_STROKE;
+
+ // TODO: Use WeakReferences
+ private final ArrayList<OnGesturePerformedListener> mPerformedListeners =
+ new ArrayList<OnGesturePerformedListener>();
+
+ private boolean mStealEvents = false;
+
+ public TouchThroughGestureListener(View model) {
+ this(model, false);
+ }
+
+ public TouchThroughGestureListener(View model, boolean stealEvents) {
+ mModel = new WeakReference<View>(model);
+ mStealEvents = stealEvents;
+ }
+
+ /**
+ *
+ * @param type SINGLE_STROKE or MULTIPLE_STROKE
+ */
+ public void setGestureType(int type) {
+ mGestureType = type;
+ }
+
+ public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {
+ if (mGestureType == MULTIPLE_STROKE) {
+ overlay.cancelFadingOut();
+ }
+
+ mX = event.getX();
+ mY = event.getY();
+ mTotalLength = 0;
+ mIsGesturing = false;
+
+ if (mGestureType == SINGLE_STROKE || overlay.getCurrentGesture() == null
+ || overlay.getCurrentGesture().getStrokesCount() == 0) {
+ overlay.setGestureDrawingColor(overlay.getUncertainGestureColor());
+ }
+
+ dispatchEventToModel(event);
+ }
+
+ private void dispatchEventToModel(MotionEvent event) {
+ View v = mModel.get();
+ if (v != null) v.dispatchTouchEvent(event);
+ }
+
+ public void onGesture(GestureOverlayView overlay, MotionEvent event) {
+ //noinspection PointlessBooleanExpression
+ if (!mStealEvents) {
+ dispatchEventToModel(event);
+ }
+
+ if (mIsGesturing) {
+ return;
+ }
+
+ final float x = event.getX();
+ final float y = event.getY();
+ final float dx = x - mX;
+ final float dy = y - mY;
+
+ mTotalLength += (float) Math.sqrt(dx * dx + dy * dy);
+ mX = x;
+ mY = y;
+
+ if (mTotalLength > STROKE_LENGTH_THRESHOLD) {
+ final OrientedBoundingBox box =
+ GestureUtilities.computeOrientedBoundingBox(overlay.getCurrentStroke());
+ float angle = Math.abs(box.orientation);
+ if (angle > 90) {
+ angle = 180 - angle;
+ }
+ if (box.squareness > SQUARENESS_THRESHOLD || angle < ANGLE_THRESHOLD) {
+ mIsGesturing = true;
+ overlay.setGestureDrawingColor(overlay.getGestureColor());
+ if (mStealEvents) {
+ event = MotionEvent.obtain(event.getDownTime(), System.currentTimeMillis(),
+ MotionEvent.ACTION_UP, x, y, event.getPressure(), event.getSize(),
+ event.getMetaState(), event.getXPrecision(), event.getYPrecision(),
+ event.getDeviceId(), event.getEdgeFlags());
+ }
+ }
+ }
+
+ if (mStealEvents) {
+ dispatchEventToModel(event);
+ }
+ }
+
+ public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {
+ if (mIsGesturing) {
+ overlay.clear(true);
+
+ final ArrayList<OnGesturePerformedListener> listeners = mPerformedListeners;
+ final int count = listeners.size();
+
+ for (int i = 0; i < count; i++) {
+ listeners.get(i).onGesturePerformed(overlay, overlay.getCurrentGesture());
+ }
+ } else {
+ dispatchEventToModel(event);
+ overlay.clear(false);
+ }
+ }
+
+ public void addOnGestureActionListener(OnGesturePerformedListener listener) {
+ mPerformedListeners.add(listener);
+ }
+
+ public void removeOnGestureActionListener(OnGesturePerformedListener listener) {
+ mPerformedListeners.remove(listener);
+ }
+
+ public boolean isGesturing() {
+ return mIsGesturing;
+ }
+
+ public static interface OnGesturePerformedListener {
+ public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture);
+ }
+}
diff --git a/core/java/android/net/http/RequestQueue.java b/core/java/android/net/http/RequestQueue.java
index 66d5722..54a1cce 100644
--- a/core/java/android/net/http/RequestQueue.java
+++ b/core/java/android/net/http/RequestQueue.java
@@ -52,10 +52,44 @@ public class RequestQueue implements RequestFeeder {
private Context mContext;
+ private static class RequestSet {
+ private final LinkedList<Request> mHighPriority;
+ private final LinkedList<Request> mLowPriority;
+
+ RequestSet() {
+ mHighPriority = new LinkedList<Request>();
+ mLowPriority = new LinkedList<Request>();
+ }
+
+ void add(Request req, boolean head) {
+ LinkedList l = mLowPriority;
+ if (req.mHighPriority) {
+ l = mHighPriority;
+ }
+ if (head) {
+ l.addFirst(req);
+ } else {
+ l.add(req);
+ }
+ }
+
+ Request removeFirst() {
+ if (!mHighPriority.isEmpty()) {
+ return mHighPriority.removeFirst();
+ } else if (!mLowPriority.isEmpty()) {
+ return mLowPriority.removeFirst();
+ }
+ return null;
+ }
+
+ boolean isEmpty() {
+ return mHighPriority.isEmpty() && mLowPriority.isEmpty();
+ }
+ };
/**
* Requests, indexed by HttpHost (scheme, host, port)
*/
- private LinkedHashMap<HttpHost, LinkedList<Request>> mPending;
+ private LinkedHashMap<HttpHost, RequestSet> mPending;
/* Support for notifying a client when queue is empty */
private boolean mClientWaiting = false;
@@ -344,7 +378,7 @@ public class RequestQueue implements RequestFeeder {
public RequestQueue(Context context, int connectionCount) {
mContext = context;
- mPending = new LinkedHashMap<HttpHost, LinkedList<Request>>(32);
+ mPending = new LinkedHashMap<HttpHost, RequestSet>(32);
mActivePool = new ActivePool(connectionCount);
mActivePool.startup();
@@ -480,7 +514,7 @@ public class RequestQueue implements RequestFeeder {
req = new Request(method, httpHost, mProxyHost, uri.mPath, bodyProvider,
bodyLength, eventHandler, headers, highPriority);
- queueRequest(req, highPriority);
+ queueRequest(req, false);
mActivePool.mTotalRequest++;
@@ -520,19 +554,24 @@ public class RequestQueue implements RequestFeeder {
HttpLog.v("dump()");
StringBuilder dump = new StringBuilder();
int count = 0;
- Iterator<Map.Entry<HttpHost, LinkedList<Request>>> iter;
+ Iterator<Map.Entry<HttpHost, RequestSet>> iter;
// mActivePool.log(dump);
if (!mPending.isEmpty()) {
iter = mPending.entrySet().iterator();
while (iter.hasNext()) {
- Map.Entry<HttpHost, LinkedList<Request>> entry = iter.next();
+ Map.Entry<HttpHost, RequestSet> entry = iter.next();
String hostName = entry.getKey().getHostName();
StringBuilder line = new StringBuilder("p" + count++ + " " + hostName + " ");
- LinkedList<Request> reqList = entry.getValue();
- ListIterator reqIter = reqList.listIterator(0);
+ RequestSet reqList = entry.getValue();
+ ListIterator reqIter = reqList.mHighPriority.listIterator(0);
+ while (iter.hasNext()) {
+ Request request = (Request)iter.next();
+ line.append(request + " ");
+ }
+ reqIter = reqList.mLowPriority.listIterator(0);
while (iter.hasNext()) {
Request request = (Request)iter.next();
line.append(request + " ");
@@ -564,7 +603,7 @@ public class RequestQueue implements RequestFeeder {
Request ret = null;
if (mNetworkConnected && mPending.containsKey(host)) {
- LinkedList<Request> reqList = mPending.get(host);
+ RequestSet reqList = mPending.get(host);
ret = reqList.removeFirst();
if (reqList.isEmpty()) {
mPending.remove(host);
@@ -597,18 +636,14 @@ public class RequestQueue implements RequestFeeder {
protected synchronized void queueRequest(Request request, boolean head) {
HttpHost host = request.mProxyHost == null ? request.mHost : request.mProxyHost;
- LinkedList<Request> reqList;
+ RequestSet reqList;
if (mPending.containsKey(host)) {
reqList = mPending.get(host);
} else {
- reqList = new LinkedList<Request>();
+ reqList = new RequestSet();
mPending.put(host, reqList);
}
- if (head) {
- reqList.addFirst(request);
- } else {
- reqList.add(request);
- }
+ reqList.add(request, head);
}
@@ -621,12 +656,12 @@ public class RequestQueue implements RequestFeeder {
}
/* helper */
- private Request removeFirst(LinkedHashMap<HttpHost, LinkedList<Request>> requestQueue) {
+ private Request removeFirst(LinkedHashMap<HttpHost, RequestSet> requestQueue) {
Request ret = null;
- Iterator<Map.Entry<HttpHost, LinkedList<Request>>> iter = requestQueue.entrySet().iterator();
+ Iterator<Map.Entry<HttpHost, RequestSet>> iter = requestQueue.entrySet().iterator();
if (iter.hasNext()) {
- Map.Entry<HttpHost, LinkedList<Request>> entry = iter.next();
- LinkedList<Request> reqList = entry.getValue();
+ Map.Entry<HttpHost, RequestSet> entry = iter.next();
+ RequestSet reqList = entry.getValue();
ret = reqList.removeFirst();
if (reqList.isEmpty()) {
requestQueue.remove(entry.getKey());
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 5487c54..101336b 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -38,6 +38,9 @@ public class Build {
/** The name of the underlying board, like "goldfish". */
public static final String BOARD = getString("ro.product.board");
+ /** The manufacturer of the product/hardware. */
+ public static final String MANUFACTURER = getString("ro.product.manufacturer");
+
/** The brand (e.g., carrier) the software is customized for, if any. */
public static final String BRAND = getString("ro.product.brand");
@@ -87,6 +90,12 @@ public class Build {
*/
public static class VERSION_CODES {
/**
+ * Magic version number for a current development build, which has
+ * not yet turned into an official release.
+ */
+ public static final int CUR_DEVELOPMENT = 10000;
+
+ /**
* October 2008: The original, first, version of Android. Yay!
*/
public static final int BASE = 1;
@@ -98,6 +107,19 @@ public class Build {
* May 2009: Android 1.5.
*/
public static final int CUPCAKE = 3;
+ /**
+ * Current work on "Donut" development branch.
+ *
+ * <p>Applications targeting this or a later release will get these
+ * new changes in behavior:</p>
+ * <ul>
+ * <li> They must explicitly request the
+ * {@link android.Manifest.permission#WRITE_SDCARD} permission to be
+ * able to modify the contents of the SD card. (Apps targeting
+ * earlier versions will always request the permission.)
+ * </ul>
+ */
+ public static final int DONUT = CUR_DEVELOPMENT;
}
/** The type of build, like "user" or "eng". */
diff --git a/core/java/android/os/LatencyTimer.java b/core/java/android/os/LatencyTimer.java
new file mode 100644
index 0000000..ed2f0f9e
--- /dev/null
+++ b/core/java/android/os/LatencyTimer.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import android.util.Log;
+
+import java.util.HashMap;
+
+/**
+ * A class to help with measuring latency in your code.
+ *
+ * Suggested usage:
+ * 1) Instanciate a LatencyTimer as a class field.
+ * private [static] LatencyTimer mLt = new LatencyTimer(100, 1000);
+ * 2) At various points in the code call sample with a string and the time delta to some fixed time.
+ * The string should be unique at each point of the code you are measuring.
+ * mLt.sample("before processing event", System.nanoTime() - event.getEventTimeNano());
+ * processEvent(event);
+ * mLt.sample("after processing event ", System.nanoTime() - event.getEventTimeNano());
+ *
+ * @hide
+ */
+public final class LatencyTimer
+{
+ final String TAG = "LatencyTimer";
+ final int mSampleSize;
+ final int mScaleFactor;
+ volatile HashMap<String, long[]> store = new HashMap<String, long[]>();
+
+ /**
+ * Creates a LatencyTimer object
+ * @param sampleSize number of samples to collect before printing out the average
+ * @param scaleFactor divisor used to make each sample smaller to prevent overflow when
+ * (sampleSize * average sample value)/scaleFactor > Long.MAX_VALUE
+ */
+ public LatencyTimer(int sampleSize, int scaleFactor) {
+ if (scaleFactor == 0) {
+ scaleFactor = 1;
+ }
+ mScaleFactor = scaleFactor;
+ mSampleSize = sampleSize;
+ }
+
+ /**
+ * Add a sample delay for averaging.
+ * @param tag string used for printing out the result. This should be unique at each point of
+ * this called.
+ * @param delta time difference from an unique point of reference for a particular iteration
+ */
+ public void sample(String tag, long delta) {
+ long[] array = getArray(tag);
+
+ // array[mSampleSize] holds the number of used entries
+ final int index = (int) array[mSampleSize]++;
+ array[index] = delta;
+ if (array[mSampleSize] == mSampleSize) {
+ long totalDelta = 0;
+ for (long d : array) {
+ totalDelta += d/mScaleFactor;
+ }
+ array[mSampleSize] = 0;
+ Log.i(TAG, tag + " average = " + totalDelta / mSampleSize);
+ }
+ }
+
+ private long[] getArray(String tag) {
+ long[] data = store.get(tag);
+ if (data == null) {
+ synchronized(store) {
+ data = store.get(tag);
+ if (data == null) {
+ data = new long[mSampleSize + 1];
+ store.put(tag, data);
+ data[mSampleSize] = 0;
+ }
+ }
+ }
+ return data;
+ }
+}
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 30acef9..333c7cb 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -604,6 +604,20 @@ public class Process {
*/
public static final native void setThreadGroup(int tid, int group)
throws IllegalArgumentException, SecurityException;
+ /**
+ * Sets the scheduling group for a process and all child threads
+ * @hide
+ * @param pid The indentifier of the process to change.
+ * @param group The target group for this process.
+ *
+ * @throws IllegalArgumentException Throws IllegalArgumentException if
+ * <var>tid</var> does not exist.
+ * @throws SecurityException Throws SecurityException if your process does
+ * not have permission to modify the given thread, or to use the given
+ * priority.
+ */
+ public static final native void setProcessGroup(int pid, int group)
+ throws IllegalArgumentException, SecurityException;
/**
* Set the priority of the calling thread, based on Linux priorities. See
diff --git a/core/java/android/pim/EventRecurrence.java b/core/java/android/pim/EventRecurrence.java
index edf69ee..3ea9b4a 100644
--- a/core/java/android/pim/EventRecurrence.java
+++ b/core/java/android/pim/EventRecurrence.java
@@ -408,13 +408,13 @@ public class EventRecurrence
private String dayToString(Resources r, int day) {
switch (day) {
- case SU: return r.getString(com.android.internal.R.string.sunday);
- case MO: return r.getString(com.android.internal.R.string.monday);
- case TU: return r.getString(com.android.internal.R.string.tuesday);
- case WE: return r.getString(com.android.internal.R.string.wednesday);
- case TH: return r.getString(com.android.internal.R.string.thursday);
- case FR: return r.getString(com.android.internal.R.string.friday);
- case SA: return r.getString(com.android.internal.R.string.saturday);
+ case SU: return r.getString(com.android.internal.R.string.day_of_week_long_sunday);
+ case MO: return r.getString(com.android.internal.R.string.day_of_week_long_monday);
+ case TU: return r.getString(com.android.internal.R.string.day_of_week_long_tuesday);
+ case WE: return r.getString(com.android.internal.R.string.day_of_week_long_wednesday);
+ case TH: return r.getString(com.android.internal.R.string.day_of_week_long_thursday);
+ case FR: return r.getString(com.android.internal.R.string.day_of_week_long_friday);
+ case SA: return r.getString(com.android.internal.R.string.day_of_week_long_saturday);
default: throw new IllegalArgumentException("bad day argument: " + day);
}
}
diff --git a/core/java/android/provider/Checkin.java b/core/java/android/provider/Checkin.java
index 3c23db0..f2c275e 100644
--- a/core/java/android/provider/Checkin.java
+++ b/core/java/android/provider/Checkin.java
@@ -137,6 +137,8 @@ public final class Checkin {
CRASHES_TRUNCATED,
ELAPSED_REALTIME_SEC,
ELAPSED_UPTIME_SEC,
+ HTTP_REQUEST,
+ HTTP_REUSED,
HTTP_STATUS,
PHONE_GSM_REGISTERED,
PHONE_GPRS_ATTEMPTED,
@@ -351,6 +353,3 @@ public final class Checkin {
}
}
}
-
-
-
diff --git a/core/java/android/provider/Contacts.java b/core/java/android/provider/Contacts.java
index a6450f3..0829cfb 100644
--- a/core/java/android/provider/Contacts.java
+++ b/core/java/android/provider/Contacts.java
@@ -349,27 +349,33 @@ public class Contacts {
}
/**
- * Adds a person to the My Contacts group.
- *
- * @param resolver the resolver to use
- * @param personId the person to add to the group
- * @return the URI of the group membership row
- * @throws IllegalStateException if the My Contacts group can't be found
+ * @hide Used in vCard parser code.
*/
- public static Uri addToMyContactsGroup(ContentResolver resolver, long personId) {
- long groupId = 0;
+ public static long tryGetMyContactsGroupId(ContentResolver resolver) {
Cursor groupsCursor = resolver.query(Groups.CONTENT_URI, GROUPS_PROJECTION,
Groups.SYSTEM_ID + "='" + Groups.GROUP_MY_CONTACTS + "'", null, null);
if (groupsCursor != null) {
try {
if (groupsCursor.moveToFirst()) {
- groupId = groupsCursor.getLong(0);
+ return groupsCursor.getLong(0);
}
} finally {
groupsCursor.close();
}
}
+ return 0;
+ }
+ /**
+ * Adds a person to the My Contacts group.
+ *
+ * @param resolver the resolver to use
+ * @param personId the person to add to the group
+ * @return the URI of the group membership row
+ * @throws IllegalStateException if the My Contacts group can't be found
+ */
+ public static Uri addToMyContactsGroup(ContentResolver resolver, long personId) {
+ long groupId = tryGetMyContactsGroupId(resolver);
if (groupId == 0) {
throw new IllegalStateException("Failed to find the My Contacts group");
}
@@ -884,6 +890,17 @@ public class Contacts {
public static final int TYPE_OTHER = 3;
/**
+ * @hide This is temporal. TYPE_MOBILE should be added to TYPE in the future.
+ */
+ public static final int MOBILE_EMAIL_TYPE_INDEX = 2;
+
+ /**
+ * @hide This is temporal. TYPE_MOBILE should be added to TYPE in the future.
+ * This is not "mobile" but "CELL" since vCard uses it for identifying mobile phone.
+ */
+ public static final String MOBILE_EMAIL_TYPE_NAME = "_AUTO_CELL";
+
+ /**
* The user defined label for the the contact method.
* <P>Type: TEXT</P>
*/
diff --git a/core/java/android/provider/Im.java b/core/java/android/provider/Im.java
index 898c321..c36f508 100644
--- a/core/java/android/provider/Im.java
+++ b/core/java/android/provider/Im.java
@@ -973,7 +973,7 @@ public class Im {
/**
* Gets the Uri to query messages by provider.
*
- * @param providerId the server provider id.
+ * @param providerId the service provider id.
* @return the Uri
*/
public static final Uri getContentUriByProvider(long providerId) {
@@ -983,21 +983,74 @@ public class Im {
}
/**
- * Gets the Uri to query groupchat messages by thread id.
+ * Gets the Uri to query off the record messages by account.
*
- * @param threadId the thread id of the groupchat message.
+ * @param accountId the account id.
* @return the Uri
*/
- public static final Uri getGroupChatContentUriByThreadId(long threadId) {
- Uri.Builder builder = GROUP_CHAT_CONTENT_URI_MESSAGES_BY_THREAD_ID.buildUpon();
+ public static final Uri getContentUriByAccount(long accountId) {
+ Uri.Builder builder = CONTENT_URI_BY_ACCOUNT.buildUpon();
+ ContentUris.appendId(builder, accountId);
+ return builder.build();
+ }
+
+ /**
+ * Gets the Uri to query off the record messages by thread id.
+ *
+ * @param threadId the thread id of the message.
+ * @return the Uri
+ */
+ public static final Uri getOtrMessagesContentUriByThreadId(long threadId) {
+ Uri.Builder builder = OTR_MESSAGES_CONTENT_URI_BY_THREAD_ID.buildUpon();
ContentUris.appendId(builder, threadId);
return builder.build();
}
/**
+ * @deprecated
+ *
+ * Gets the Uri to query off the record messages by account and contact.
+ *
+ * @param accountId the account id of the contact.
+ * @param username the user name of the contact.
+ * @return the Uri
+ */
+ public static final Uri getOtrMessagesContentUriByContact(long accountId, String username) {
+ Uri.Builder builder = OTR_MESSAGES_CONTENT_URI_BY_ACCOUNT_AND_CONTACT.buildUpon();
+ ContentUris.appendId(builder, accountId);
+ builder.appendPath(username);
+ return builder.build();
+ }
+
+ /**
+ * Gets the Uri to query off the record messages by provider.
+ *
+ * @param providerId the service provider id.
+ * @return the Uri
+ */
+ public static final Uri getOtrMessagesContentUriByProvider(long providerId) {
+ Uri.Builder builder = OTR_MESSAGES_CONTENT_URI_BY_PROVIDER.buildUpon();
+ ContentUris.appendId(builder, providerId);
+ return builder.build();
+ }
+
+ /**
+ * Gets the Uri to query off the record messages by account.
+ *
+ * @param accountId the account id.
+ * @return the Uri
+ */
+ public static final Uri getOtrMessagesContentUriByAccount(long accountId) {
+ Uri.Builder builder = OTR_MESSAGES_CONTENT_URI_BY_ACCOUNT.buildUpon();
+ ContentUris.appendId(builder, accountId);
+ return builder.build();
+ }
+
+ /**
* The content:// style URL for this table
*/
- public static final Uri CONTENT_URI = Uri.parse("content://im/messages");
+ public static final Uri CONTENT_URI =
+ Uri.parse("content://im/messages");
/**
* The content:// style URL for messages by thread id
@@ -1018,32 +1071,47 @@ public class Im {
Uri.parse("content://im/messagesByProvider");
/**
- * The content:// style URL for groupchat messages.
+ * The content:// style URL for messages by account
*/
- public static final Uri GROUP_CHAT_CONTENT_URI = Uri.parse("content://im/groupMessages");
+ public static final Uri CONTENT_URI_BY_ACCOUNT =
+ Uri.parse("content://im/messagesByAccount");
/**
- * The content:// style URL for groupchat messages by thread id
+ * The content:// style url for off the record messages
*/
- public static final Uri GROUP_CHAT_CONTENT_URI_MESSAGES_BY_THREAD_ID =
- Uri.parse("content://im/groupMessagesByThreadId");
+ public static final Uri OTR_MESSAGES_CONTENT_URI =
+ Uri.parse("content://im/otrMessages");
/**
- * The MIME type of {@link #CONTENT_URI} providing a directory of groupchat messages.
+ * The content:// style url for off the record messages by thread id
*/
- public static final String GROUP_CHAT_CONTENT_TYPE =
- "vnd.android.cursor.dir/im-groupMessages";
+ public static final Uri OTR_MESSAGES_CONTENT_URI_BY_THREAD_ID =
+ Uri.parse("content://im/otrMessagesByThreadId");
/**
- * The MIME type of a {@link #CONTENT_URI} subdirectory of a single groupchat message.
+ * The content:// style url for off the record messages by account and contact
*/
- public static final String GROUP_CHAT_CONTENT_ITEM_TYPE =
- "vnd.android.cursor.item/im-groupMessages";
+ public static final Uri OTR_MESSAGES_CONTENT_URI_BY_ACCOUNT_AND_CONTACT =
+ Uri.parse("content://im/otrMessagesByAcctAndContact");
+
+ /**
+ * The content:// style URL for off the record messages by provider
+ */
+ public static final Uri OTR_MESSAGES_CONTENT_URI_BY_PROVIDER =
+ Uri.parse("content://im/otrMessagesByProvider");
+
+ /**
+ * The content:// style URL for off the record messages by account
+ */
+ public static final Uri OTR_MESSAGES_CONTENT_URI_BY_ACCOUNT =
+ Uri.parse("content://im/otrMessagesByAccount");
+
/**
* The MIME type of {@link #CONTENT_URI} providing a directory of
* people.
*/
- public static final String CONTENT_TYPE = "vnd.android.cursor.dir/im-messages";
+ public static final String CONTENT_TYPE =
+ "vnd.android.cursor.dir/im-messages";
/**
* The MIME type of a {@link #CONTENT_URI} subdirectory of a single
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 79b4e97..abe3274 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -148,7 +148,7 @@ public final class Settings {
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_WIFI_SETTINGS =
"android.settings.WIFI_SETTINGS";
-
+
/**
* Activity Action: Show settings to allow configuration of a static IP
* address for Wi-Fi.
@@ -305,7 +305,7 @@ public final class Settings {
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_QUICK_LAUNCH_SETTINGS =
"android.settings.QUICK_LAUNCH_SETTINGS";
-
+
/**
* Activity Action: Show settings to manage installed applications.
* <p>
@@ -319,7 +319,7 @@ public final class Settings {
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_MANAGE_APPLICATIONS_SETTINGS =
"android.settings.MANAGE_APPLICATIONS_SETTINGS";
-
+
/**
* Activity Action: Show settings for system update functionality.
* <p>
@@ -329,7 +329,7 @@ public final class Settings {
* Input: Nothing.
* <p>
* Output: Nothing.
- *
+ *
* @hide
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
@@ -349,7 +349,7 @@ public final class Settings {
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_SYNC_SETTINGS =
"android.settings.SYNC_SETTINGS";
-
+
/**
* Activity Action: Show settings for selecting the network operator.
* <p>
@@ -404,7 +404,7 @@ public final class Settings {
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_MEMORY_CARD_SETTINGS =
"android.settings.MEMORY_CARD_SETTINGS";
-
+
// End of Intent actions for Settings
private static final String JID_RESOURCE_PREFIX = "android";
@@ -495,7 +495,7 @@ public final class Settings {
public static final String SYS_PROP_SETTING_VERSION = "sys.settings_system_version";
private static volatile NameValueCache mNameValueCache = null;
-
+
private static final HashSet<String> MOVED_TO_SECURE;
static {
MOVED_TO_SECURE = new HashSet<String>(30);
@@ -901,12 +901,12 @@ public final class Settings {
* plugged in.
*/
public static final int WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED = 1;
-
+
/**
* Value for {@link #WIFI_SLEEP_POLICY} to never go to sleep.
*/
public static final int WIFI_SLEEP_POLICY_NEVER = 2;
-
+
/**
* Whether to use static IP and other static network attributes.
* <p>
@@ -1115,12 +1115,12 @@ public final class Settings {
* Note: This is a one-off setting that will be removed in the future
* when there is profile support. For this reason, it is kept hidden
* from the public APIs.
- *
+ *
* @hide
*/
- public static final String NOTIFICATIONS_USE_RING_VOLUME =
+ public static final String NOTIFICATIONS_USE_RING_VOLUME =
"notifications_use_ring_volume";
-
+
/**
* The mapping of stream type (integer) to its setting.
*/
@@ -1204,7 +1204,7 @@ public final class Settings {
* feature converts two spaces to a "." and space.
*/
public static final String TEXT_AUTO_PUNCTUATE = "auto_punctuate";
-
+
/**
* Setting to showing password characters in text editors. 1 = On, 0 = Off
*/
@@ -1286,13 +1286,13 @@ public final class Settings {
* boolean (1 or 0).
*/
public static final String SOUND_EFFECTS_ENABLED = "sound_effects_enabled";
-
+
/**
* Whether the haptic feedback (long presses, ...) are enabled. The value is
* boolean (1 or 0).
*/
public static final String HAPTIC_FEEDBACK_ENABLED = "haptic_feedback_enabled";
-
+
// Settings moved to Settings.Secure
/**
@@ -1337,7 +1337,7 @@ public final class Settings {
*/
@Deprecated
public static final String INSTALL_NON_MARKET_APPS = Secure.INSTALL_NON_MARKET_APPS;
-
+
/**
* @deprecated Use {@link android.provider.Settings.Secure#LOCATION_PROVIDERS_ALLOWED}
* instead
@@ -1350,7 +1350,7 @@ public final class Settings {
*/
@Deprecated
public static final String LOGGING_ID = Secure.LOGGING_ID;
-
+
/**
* @deprecated Use {@link android.provider.Settings.Secure#NETWORK_PREFERENCE} instead
*/
@@ -1390,7 +1390,7 @@ public final class Settings {
*/
@Deprecated
public static final String USB_MASS_STORAGE_ENABLED = Secure.USB_MASS_STORAGE_ENABLED;
-
+
/**
* @deprecated Use {@link android.provider.Settings.Secure#USE_GOOGLE_MAIL} instead
*/
@@ -1428,7 +1428,7 @@ public final class Settings {
@Deprecated
public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY =
Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY;
-
+
/**
* @deprecated Use {@link android.provider.Settings.Secure#WIFI_NUM_OPEN_NETWORKS_KEPT}
* instead
@@ -1464,7 +1464,7 @@ public final class Settings {
@Deprecated
public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS =
Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS;
-
+
/**
* @deprecated Use
* {@link android.provider.Settings.Secure#WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED} instead
@@ -1840,19 +1840,19 @@ public final class Settings {
* Whether the device has been provisioned (0 = false, 1 = true)
*/
public static final String DEVICE_PROVISIONED = "device_provisioned";
-
+
/**
* List of input methods that are currently enabled. This is a string
* containing the IDs of all enabled input methods, each ID separated
* by ':'.
*/
public static final String ENABLED_INPUT_METHODS = "enabled_input_methods";
-
+
/**
* Host name and port for a user-selected proxy.
*/
public static final String HTTP_PROXY = "http_proxy";
-
+
/**
* Whether the package installer should allow installation of apps downloaded from
* sources other than the Android Market (vending machine).
@@ -1861,12 +1861,12 @@ public final class Settings {
* 0 = only allow installing from the Android Market
*/
public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
-
+
/**
* Comma-separated list of location providers that activities may access.
*/
public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
-
+
/**
* The Logging ID (a unique 64-bit value) as a hex string.
* Used as a pseudonymous identifier for logging.
@@ -1888,19 +1888,19 @@ public final class Settings {
* connectivity service should touch this.
*/
public static final String NETWORK_PREFERENCE = "network_preference";
-
- /**
+
+ /**
*/
public static final String PARENTAL_CONTROL_ENABLED = "parental_control_enabled";
-
- /**
+
+ /**
*/
public static final String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update";
-
- /**
+
+ /**
*/
public static final String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";
-
+
/**
* Settings classname to launch when Settings is clicked from All
* Applications. Needed because of user testing between the old
@@ -1908,18 +1908,18 @@ public final class Settings {
*/
// TODO: 881807
public static final String SETTINGS_CLASSNAME = "settings_classname";
-
+
/**
* USB Mass Storage Enabled
*/
public static final String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
-
+
/**
* If this setting is set (to anything), then all references
* to Gmail on the device must change to Google Mail.
*/
public static final String USE_GOOGLE_MAIL = "use_google_mail";
-
+
/**
* If accessibility is enabled.
*/
@@ -1942,64 +1942,64 @@ public final class Settings {
*/
public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON =
"wifi_networks_available_notification_on";
-
+
/**
* Delay (in seconds) before repeating the Wi-Fi networks available notification.
* Connecting to a network will reset the timer.
*/
public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY =
"wifi_networks_available_repeat_delay";
-
+
/**
* The number of radio channels that are allowed in the local
* 802.11 regulatory domain.
* @hide
*/
public static final String WIFI_NUM_ALLOWED_CHANNELS = "wifi_num_allowed_channels";
-
+
/**
* When the number of open networks exceeds this number, the
* least-recently-used excess networks will be removed.
*/
public static final String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
-
+
/**
* Whether the Wi-Fi should be on. Only the Wi-Fi service should touch this.
*/
public static final String WIFI_ON = "wifi_on";
-
+
/**
* The acceptable packet loss percentage (range 0 - 100) before trying
* another AP on the same network.
*/
public static final String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE =
"wifi_watchdog_acceptable_packet_loss_percentage";
-
+
/**
* The number of access points required for a network in order for the
* watchdog to monitor it.
*/
public static final String WIFI_WATCHDOG_AP_COUNT = "wifi_watchdog_ap_count";
-
+
/**
* The delay between background checks.
*/
public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS =
"wifi_watchdog_background_check_delay_ms";
-
+
/**
* Whether the Wi-Fi watchdog is enabled for background checking even
* after it thinks the user has connected to a good access point.
*/
public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED =
"wifi_watchdog_background_check_enabled";
-
+
/**
* The timeout for a background ping
*/
public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS =
"wifi_watchdog_background_check_timeout_ms";
-
+
/**
* The number of initial pings to perform that *may* be ignored if they
* fail. Again, if these fail, they will *not* be used in packet loss
@@ -2008,7 +2008,7 @@ public final class Settings {
*/
public static final String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT =
"wifi_watchdog_initial_ignored_ping_count";
-
+
/**
* The maximum number of access points (per network) to attempt to test.
* If this number is reached, the watchdog will no longer monitor the
@@ -2016,7 +2016,7 @@ public final class Settings {
* networks containing multiple APs whose DNS does not respond to pings.
*/
public static final String WIFI_WATCHDOG_MAX_AP_CHECKS = "wifi_watchdog_max_ap_checks";
-
+
/**
* Whether the Wi-Fi watchdog is enabled.
*/
@@ -2031,24 +2031,24 @@ public final class Settings {
* The number of pings to test if an access point is a good connection.
*/
public static final String WIFI_WATCHDOG_PING_COUNT = "wifi_watchdog_ping_count";
-
+
/**
* The delay between pings.
*/
public static final String WIFI_WATCHDOG_PING_DELAY_MS = "wifi_watchdog_ping_delay_ms";
-
+
/**
* The timeout per ping.
*/
public static final String WIFI_WATCHDOG_PING_TIMEOUT_MS = "wifi_watchdog_ping_timeout_ms";
-
+
/**
* The maximum number of times we will retry a connection to an access
* point for which we have failed in acquiring an IP address from DHCP.
* A value of N means that we will make N+1 connection attempts in all.
*/
public static final String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
-
+
/**
* Maximum amount of time in milliseconds to hold a wakelock while waiting for mobile
* data connectivity to be established after a disconnect from Wi-Fi.
@@ -2078,20 +2078,29 @@ public final class Settings {
public static final String CDMA_SUBSCRIPTION_MODE = "subscription_mode";
/**
- * represents current active phone class
- * 1 = GSM-Phone, 0 = CDMA-Phone
+ * The preferred network mode 7 = Global
+ * 6 = EvDo only
+ * 5 = CDMA w/o EvDo
+ * 4 = CDMA / EvDo auto
+ * 3 = GSM / WCDMA auto
+ * 2 = WCDMA only
+ * 1 = GSM only
+ * 0 = GSM / WCDMA preferred
* @hide
*/
- public static final String CURRENT_ACTIVE_PHONE = "current_active_phone";
+ public static final String PREFERRED_NETWORK_MODE =
+ "preferred_network_mode";
/**
- * The preferred network mode 7 = Global, CDMA default
- * 4 = CDMA only
- * 3 = GSM/UMTS only
+ * The preferred TTY mode 0 = TTy Off, CDMA default
+ * 1 = TTY Full
+ * 2 = TTY HCO
+ * 3 = TTY VCO
* @hide
*/
- public static final String PREFERRED_NETWORK_MODE =
- "preferred_network_mode";
+ public static final String PREFERRED_TTY_MODE =
+ "preferred_tty_mode";
+
/**
* CDMA Cell Broadcast SMS
@@ -2142,7 +2151,7 @@ public final class Settings {
allowedProviders.startsWith(provider + ",") ||
allowedProviders.endsWith("," + provider));
}
- return false;
+ return false;
}
/**
@@ -2166,7 +2175,7 @@ public final class Settings {
putString(cr, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, provider);
}
}
-
+
/**
* Gservices settings, containing the network names for Google's
* various services. This table holds simple name/addr pairs.
@@ -2187,6 +2196,13 @@ public final class Settings {
public static final String CHANGED_ACTION =
"com.google.gservices.intent.action.GSERVICES_CHANGED";
+ /**
+ * Intent action to override Gservices for testing. (Requires WRITE_GSERVICES permission.)
+ */
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String OVERRIDE_ACTION =
+ "com.google.gservices.intent.action.GSERVICES_OVERRIDE";
+
private static volatile NameValueCache mNameValueCache = null;
private static final Object mNameValueCacheLock = new Object();
@@ -2287,7 +2303,7 @@ public final class Settings {
* Event tags from the kernel event log to upload during checkin.
*/
public static final String CHECKIN_EVENTS = "checkin_events";
-
+
/**
* Event tags for list of services to upload during checkin.
*/
@@ -2982,7 +2998,7 @@ public final class Settings {
public static final String BATTERY_DISCHARGE_DURATION_THRESHOLD =
"battery_discharge_duration_threshold";
public static final String BATTERY_DISCHARGE_THRESHOLD = "battery_discharge_threshold";
-
+
/**
* An email address that anr bugreports should be sent to.
*/
@@ -3126,7 +3142,7 @@ public final class Settings {
/**
* Add a new bookmark to the system.
- *
+ *
* @param cr The ContentResolver to query.
* @param intent The desired target of the bookmark.
* @param title Bookmark title that is shown to the user; null if none
@@ -3191,7 +3207,7 @@ public final class Settings {
/**
* Return the title as it should be displayed to the user. This takes
* care of localizing bookmarks that point to activities.
- *
+ *
* @param context A context.
* @param cursor A cursor pointing to the row whose title should be
* returned. The cursor must contain at least the {@link #TITLE}
@@ -3206,24 +3222,24 @@ public final class Settings {
throw new IllegalArgumentException(
"The cursor must contain the TITLE and INTENT columns.");
}
-
+
String title = cursor.getString(titleColumn);
if (!TextUtils.isEmpty(title)) {
return title;
}
-
+
String intentUri = cursor.getString(intentColumn);
if (TextUtils.isEmpty(intentUri)) {
return "";
}
-
+
Intent intent;
try {
intent = Intent.getIntent(intentUri);
} catch (URISyntaxException e) {
return "";
}
-
+
PackageManager packageManager = context.getPackageManager();
ResolveInfo info = packageManager.resolveActivity(intent, 0);
return info != null ? info.loadLabel(packageManager) : "";
@@ -3279,4 +3295,3 @@ public final class Settings {
return "android-" + Long.toHexString(androidId);
}
}
-
diff --git a/core/java/android/server/search/SearchManagerService.java b/core/java/android/server/search/SearchManagerService.java
index 03623d6..952372f 100644
--- a/core/java/android/server/search/SearchManagerService.java
+++ b/core/java/android/server/search/SearchManagerService.java
@@ -37,9 +37,6 @@ public class SearchManagerService extends ISearchManager.Stub
// general debugging support
private static final String TAG = "SearchManagerService";
private static final boolean DEBUG = false;
-
- // configuration choices
- private static final boolean IMMEDIATE_SEARCHABLES_UPDATE = true;
// class maintenance and general shared data
private final Context mContext;
@@ -70,9 +67,7 @@ public class SearchManagerService extends ISearchManager.Stub
// After startup settles down, preload the searchables list,
// which will reduce the delay when the search UI is invoked.
- if (IMMEDIATE_SEARCHABLES_UPDATE) {
- mHandler.post(mRunUpdateSearchable);
- }
+ mHandler.post(mRunUpdateSearchable);
}
/**
@@ -91,9 +86,7 @@ public class SearchManagerService extends ISearchManager.Stub
action.equals(Intent.ACTION_PACKAGE_REMOVED) ||
action.equals(Intent.ACTION_PACKAGE_CHANGED)) {
mSearchablesDirty = true;
- if (IMMEDIATE_SEARCHABLES_UPDATE) {
- mHandler.post(mRunUpdateSearchable);
- }
+ mHandler.post(mRunUpdateSearchable);
return;
}
}
@@ -104,9 +97,7 @@ public class SearchManagerService extends ISearchManager.Stub
*/
private Runnable mRunUpdateSearchable = new Runnable() {
public void run() {
- if (mSearchablesDirty) {
- updateSearchables();
- }
+ updateSearchablesIfDirty();
}
};
@@ -120,6 +111,15 @@ public class SearchManagerService extends ISearchManager.Stub
}
/**
+ * Updates the list of searchables if needed.
+ */
+ private void updateSearchablesIfDirty() {
+ if (mSearchablesDirty) {
+ updateSearchables();
+ }
+ }
+
+ /**
* Returns the SearchableInfo for a given activity
*
* @param launchActivity The activity from which we're launching this search.
@@ -131,11 +131,7 @@ public class SearchManagerService extends ISearchManager.Stub
* or null if no searchable metadata was available.
*/
public SearchableInfo getSearchableInfo(ComponentName launchActivity, boolean globalSearch) {
- // final check. however we should try to avoid this, because
- // it slows down the entry into the UI.
- if (mSearchablesDirty) {
- updateSearchables();
- }
+ updateSearchablesIfDirty();
SearchableInfo si = null;
if (globalSearch) {
si = mSearchables.getDefaultSearchable();
@@ -150,6 +146,7 @@ public class SearchManagerService extends ISearchManager.Stub
* Returns a list of the searchable activities that can be included in global search.
*/
public List<SearchableInfo> getSearchablesInGlobalSearch() {
+ updateSearchablesIfDirty();
return mSearchables.getSearchablesInGlobalSearchList();
}
diff --git a/core/java/android/server/search/Searchables.java b/core/java/android/server/search/Searchables.java
index 9586d56..62631d6 100644
--- a/core/java/android/server/search/Searchables.java
+++ b/core/java/android/server/search/Searchables.java
@@ -24,6 +24,7 @@ import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
+import android.util.Log;
import java.util.ArrayList;
import java.util.HashMap;
@@ -34,6 +35,8 @@ import java.util.List;
*/
public class Searchables {
+ private static final String LOG_TAG = "Searchables";
+
// static strings used for XML lookups, etc.
// TODO how should these be documented for the developer, in a more structured way than
// the current long wordy javadoc in SearchManager.java ?
@@ -184,7 +187,6 @@ public class Searchables {
* TODO: sort the list somehow? UI choice.
*/
public void buildSearchableList() {
-
// These will become the new values at the end of the method
HashMap<ComponentName, SearchableInfo> newSearchablesMap
= new HashMap<ComponentName, SearchableInfo>();
@@ -223,6 +225,11 @@ public class Searchables {
ComponentName globalSearchActivity = globalSearchIntent.resolveActivity(pm);
SearchableInfo newDefaultSearchable = newSearchablesMap.get(globalSearchActivity);
+ if (newDefaultSearchable == null) {
+ Log.w(LOG_TAG, "No searchable info found for new default searchable activity "
+ + globalSearchActivity);
+ }
+
// Store a consistent set of new values
synchronized (this) {
mSearchablesMap = newSearchablesMap;
diff --git a/core/java/android/syncml/pim/PropertyNode.java b/core/java/android/syncml/pim/PropertyNode.java
index cc52499..983ecb8 100644
--- a/core/java/android/syncml/pim/PropertyNode.java
+++ b/core/java/android/syncml/pim/PropertyNode.java
@@ -17,12 +17,16 @@
package android.syncml.pim;
import android.content.ContentValues;
-import android.util.Log;
+import org.apache.commons.codec.binary.Base64;
+
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import java.util.Map.Entry;
+import java.util.regex.Pattern;
public class PropertyNode {
@@ -52,7 +56,9 @@ public class PropertyNode {
public Set<String> propGroupSet;
public PropertyNode() {
+ propName = "";
propValue = "";
+ propValue_vector = new ArrayList<String>();
paramMap = new ContentValues();
paramMap_TYPE = new HashSet<String>();
propGroupSet = new HashSet<String>();
@@ -62,13 +68,21 @@ public class PropertyNode {
String propName, String propValue, List<String> propValue_vector,
byte[] propValue_bytes, ContentValues paramMap, Set<String> paramMap_TYPE,
Set<String> propGroupSet) {
- this.propName = propName;
+ if (propName != null) {
+ this.propName = propName;
+ } else {
+ this.propName = "";
+ }
if (propValue != null) {
this.propValue = propValue;
} else {
this.propValue = "";
}
- this.propValue_vector = propValue_vector;
+ if (propValue_vector != null) {
+ this.propValue_vector = propValue_vector;
+ } else {
+ this.propValue_vector = new ArrayList<String>();
+ }
this.propValue_bytes = propValue_bytes;
if (paramMap != null) {
this.paramMap = paramMap;
@@ -117,17 +131,9 @@ public class PropertyNode {
// decoded by BASE64 or QUOTED-PRINTABLE. When the size of propValue_vector
// is 1, the encoded value is stored in propValue, so we do not have to
// check it.
- if (propValue_vector != null) {
- // Log.d("@@@", "===" + propValue_vector + ", " + node.propValue_vector);
- return (propValue_vector.equals(node.propValue_vector) ||
- (propValue_vector.size() == 1));
- } else if (node.propValue_vector != null) {
- // Log.d("@@@", "===" + propValue_vector + ", " + node.propValue_vector);
- return (node.propValue_vector.equals(propValue_vector) ||
- (node.propValue_vector.size() == 1));
- } else {
- return true;
- }
+ return (propValue_vector.equals(node.propValue_vector) ||
+ propValue_vector.size() == 1 ||
+ node.propValue_vector.size() == 1);
}
}
@@ -154,4 +160,164 @@ public class PropertyNode {
builder.append(propValue);
return builder.toString();
}
+
+ /**
+ * Encode this object into a string which can be decoded.
+ */
+ public String encode() {
+ // PropertyNode#toString() is for reading, not for parsing in the future.
+ // We construct appropriate String here.
+ StringBuilder builder = new StringBuilder();
+ if (propName.length() > 0) {
+ builder.append("propName:[");
+ builder.append(propName);
+ builder.append("],");
+ }
+ int size = propGroupSet.size();
+ if (size > 0) {
+ Set<String> set = propGroupSet;
+ builder.append("propGroup:[");
+ int i = 0;
+ for (String group : set) {
+ // We do not need to double quote groups.
+ // group = 1*(ALPHA / DIGIT / "-")
+ builder.append(group);
+ if (i < size - 1) {
+ builder.append(",");
+ }
+ i++;
+ }
+ builder.append("],");
+ }
+
+ if (paramMap.size() > 0 || paramMap_TYPE.size() > 0) {
+ ContentValues values = paramMap;
+ builder.append("paramMap:[");
+ size = paramMap.size();
+ int i = 0;
+ for (Entry<String, Object> entry : values.valueSet()) {
+ // Assuming param-key does not contain NON-ASCII nor symbols.
+ //
+ // According to vCard 3.0:
+ // param-name = iana-token / x-name
+ builder.append(entry.getKey());
+
+ // param-value may contain any value including NON-ASCIIs.
+ // We use the following replacing rule.
+ // \ -> \\
+ // , -> \,
+ // In String#replaceAll(), "\\\\" means a single backslash.
+ builder.append("=");
+ builder.append(entry.getValue().toString()
+ .replaceAll("\\\\", "\\\\\\\\")
+ .replaceAll(",", "\\\\,"));
+ if (i < size -1) {
+ builder.append(",");
+ }
+ i++;
+ }
+
+ Set<String> set = paramMap_TYPE;
+ size = paramMap_TYPE.size();
+ if (i > 0 && size > 0) {
+ builder.append(",");
+ }
+ i = 0;
+ for (String type : set) {
+ builder.append("TYPE=");
+ builder.append(type
+ .replaceAll("\\\\", "\\\\\\\\")
+ .replaceAll(",", "\\\\,"));
+ if (i < size - 1) {
+ builder.append(",");
+ }
+ i++;
+ }
+ builder.append("],");
+ }
+
+ size = propValue_vector.size();
+ if (size > 0) {
+ builder.append("propValue:[");
+ List<String> list = propValue_vector;
+ for (int i = 0; i < size; i++) {
+ builder.append(list.get(i)
+ .replaceAll("\\\\", "\\\\\\\\")
+ .replaceAll(",", "\\\\,"));
+ if (i < size -1) {
+ builder.append(",");
+ }
+ }
+ builder.append("],");
+ }
+
+ return builder.toString();
+ }
+
+ public static PropertyNode decode(String encodedString) {
+ PropertyNode propertyNode = new PropertyNode();
+ String trimed = encodedString.trim();
+ if (trimed.length() == 0) {
+ return propertyNode;
+ }
+ String[] elems = trimed.split("],");
+
+ for (String elem : elems) {
+ int index = elem.indexOf('[');
+ String name = elem.substring(0, index - 1);
+ Pattern pattern = Pattern.compile("(?<!\\\\),");
+ String[] values = pattern.split(elem.substring(index + 1), -1);
+ if (name.equals("propName")) {
+ propertyNode.propName = values[0];
+ } else if (name.equals("propGroupSet")) {
+ for (String value : values) {
+ propertyNode.propGroupSet.add(value);
+ }
+ } else if (name.equals("paramMap")) {
+ ContentValues paramMap = propertyNode.paramMap;
+ Set<String> paramMap_TYPE = propertyNode.paramMap_TYPE;
+ for (String value : values) {
+ String[] tmp = value.split("=", 2);
+ String mapKey = tmp[0];
+ // \, -> ,
+ // \\ -> \
+ // In String#replaceAll(), "\\\\" means a single backslash.
+ String mapValue =
+ tmp[1].replaceAll("\\\\,", ",").replaceAll("\\\\\\\\", "\\\\");
+ if (mapKey.equalsIgnoreCase("TYPE")) {
+ paramMap_TYPE.add(mapValue);
+ } else {
+ paramMap.put(mapKey, mapValue);
+ }
+ }
+ } else if (name.equals("propValue")) {
+ StringBuilder builder = new StringBuilder();
+ List<String> list = propertyNode.propValue_vector;
+ int length = values.length;
+ for (int i = 0; i < length; i++) {
+ String normValue = values[i]
+ .replaceAll("\\\\,", ",")
+ .replaceAll("\\\\\\\\", "\\\\");
+ list.add(normValue);
+ builder.append(normValue);
+ if (i < length - 1) {
+ builder.append(";");
+ }
+ }
+ propertyNode.propValue = builder.toString();
+ }
+ }
+
+ // At this time, QUOTED-PRINTABLE is already decoded to Java String.
+ // We just need to decode BASE64 String to binary.
+ String encoding = propertyNode.paramMap.getAsString("ENCODING");
+ if (encoding != null &&
+ (encoding.equalsIgnoreCase("BASE64") ||
+ encoding.equalsIgnoreCase("B"))) {
+ propertyNode.propValue_bytes =
+ Base64.decodeBase64(propertyNode.propValue_vector.get(0).getBytes());
+ }
+
+ return propertyNode;
+ }
}
diff --git a/core/java/android/syncml/pim/VBuilderCollection.java b/core/java/android/syncml/pim/VBuilderCollection.java
new file mode 100644
index 0000000..f09c1c4
--- /dev/null
+++ b/core/java/android/syncml/pim/VBuilderCollection.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.syncml.pim;
+
+import java.util.Collection;
+import java.util.List;
+
+public class VBuilderCollection implements VBuilder {
+
+ private final Collection<VBuilder> mVBuilderCollection;
+
+ public VBuilderCollection(Collection<VBuilder> vBuilderCollection) {
+ mVBuilderCollection = vBuilderCollection;
+ }
+
+ public Collection<VBuilder> getVBuilderCollection() {
+ return mVBuilderCollection;
+ }
+
+ public void start() {
+ for (VBuilder builder : mVBuilderCollection) {
+ builder.start();
+ }
+ }
+
+ public void end() {
+ for (VBuilder builder : mVBuilderCollection) {
+ builder.end();
+ }
+ }
+
+ public void startRecord(String type) {
+ for (VBuilder builder : mVBuilderCollection) {
+ builder.startRecord(type);
+ }
+ }
+
+ public void endRecord() {
+ for (VBuilder builder : mVBuilderCollection) {
+ builder.endRecord();
+ }
+ }
+
+ public void startProperty() {
+ for (VBuilder builder : mVBuilderCollection) {
+ builder.startProperty();
+ }
+ }
+
+
+ public void endProperty() {
+ for (VBuilder builder : mVBuilderCollection) {
+ builder.endProperty();
+ }
+ }
+
+ public void propertyGroup(String group) {
+ for (VBuilder builder : mVBuilderCollection) {
+ builder.propertyGroup(group);
+ }
+ }
+
+ public void propertyName(String name) {
+ for (VBuilder builder : mVBuilderCollection) {
+ builder.propertyName(name);
+ }
+ }
+
+ public void propertyParamType(String type) {
+ for (VBuilder builder : mVBuilderCollection) {
+ builder.propertyParamType(type);
+ }
+ }
+
+ public void propertyParamValue(String value) {
+ for (VBuilder builder : mVBuilderCollection) {
+ builder.propertyParamValue(value);
+ }
+ }
+
+ public void propertyValues(List<String> values) {
+ for (VBuilder builder : mVBuilderCollection) {
+ builder.propertyValues(values);
+ }
+ }
+}
diff --git a/core/java/android/syncml/pim/VDataBuilder.java b/core/java/android/syncml/pim/VDataBuilder.java
index 8c67cf5..f6e5b65 100644
--- a/core/java/android/syncml/pim/VDataBuilder.java
+++ b/core/java/android/syncml/pim/VDataBuilder.java
@@ -17,8 +17,10 @@
package android.syncml.pim;
import android.content.ContentValues;
+import android.util.CharsetUtils;
import android.util.Log;
+import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.net.QuotedPrintableCodec;
@@ -26,9 +28,7 @@ import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.List;
-import java.util.Vector;
/**
* Store the parse result to custom datastruct: VNode, PropertyNode
@@ -38,7 +38,13 @@ import java.util.Vector;
*/
public class VDataBuilder implements VBuilder {
static private String LOG_TAG = "VDATABuilder";
-
+
+ /**
+ * If there's no other information available, this class uses this charset for encoding
+ * byte arrays.
+ */
+ static public String DEFAULT_CHARSET = "UTF-8";
+
/** type=VNode */
public List<VNode> vNodeList = new ArrayList<VNode>();
private int mNodeListPos = 0;
@@ -47,34 +53,74 @@ public class VDataBuilder implements VBuilder {
private String mCurrentParamType;
/**
- * Assumes that each String can be encoded into byte array using this encoding.
+ * The charset using which VParser parses the text.
+ */
+ private String mSourceCharset;
+
+ /**
+ * The charset with which byte array is encoded to String.
*/
- private String mCharset;
+ private String mTargetCharset;
private boolean mStrictLineBreakParsing;
public VDataBuilder() {
- mCharset = "ISO-8859-1";
- mStrictLineBreakParsing = false;
+ this(VParser.DEFAULT_CHARSET, DEFAULT_CHARSET, false);
}
- public VDataBuilder(String encoding, boolean strictLineBreakParsing) {
- mCharset = encoding;
- mStrictLineBreakParsing = strictLineBreakParsing;
+ public VDataBuilder(String charset, boolean strictLineBreakParsing) {
+ this(null, charset, strictLineBreakParsing);
}
+ /**
+ * @hide sourceCharset is temporal.
+ */
+ public VDataBuilder(String sourceCharset, String targetCharset,
+ boolean strictLineBreakParsing) {
+ if (sourceCharset != null) {
+ mSourceCharset = sourceCharset;
+ } else {
+ mSourceCharset = VParser.DEFAULT_CHARSET;
+ }
+ if (targetCharset != null) {
+ mTargetCharset = targetCharset;
+ } else {
+ mTargetCharset = DEFAULT_CHARSET;
+ }
+ mStrictLineBreakParsing = strictLineBreakParsing;
+ }
+
public void start() {
}
public void end() {
}
+ // Note: I guess that this code assumes the Record may nest like this:
+ // START:VPOS
+ // ...
+ // START:VPOS2
+ // ...
+ // END:VPOS2
+ // ...
+ // END:VPOS
+ //
+ // However the following code has a bug.
+ // When error occurs after calling startRecord(), the entry which is probably
+ // the cause of the error remains to be in vNodeList, while endRecord() is not called.
+ //
+ // I leave this code as is since I'm not familiar with vcalendar specification.
+ // But I believe we should refactor this code in the future.
+ // Until this, the last entry has to be removed when some error occurs.
public void startRecord(String type) {
+
VNode vnode = new VNode();
vnode.parseStatus = 1;
vnode.VName = type;
+ // I feel this should be done in endRecord(), but it cannot be done because of
+ // the reason above.
vNodeList.add(vnode);
- mNodeListPos = vNodeList.size()-1;
+ mNodeListPos = vNodeList.size() - 1;
mCurrentVNode = vNodeList.get(mNodeListPos);
}
@@ -90,15 +136,14 @@ public class VDataBuilder implements VBuilder {
}
public void startProperty() {
- // System.out.println("+ startProperty. ");
+ mCurrentPropNode = new PropertyNode();
}
public void endProperty() {
- // System.out.println("- endProperty. ");
+ mCurrentVNode.propList.add(mCurrentPropNode);
}
public void propertyName(String name) {
- mCurrentPropNode = new PropertyNode();
mCurrentPropNode.propName = name;
}
@@ -122,139 +167,145 @@ public class VDataBuilder implements VBuilder {
mCurrentParamType = null;
}
- private String encodeString(String originalString, String targetEncoding) {
- Charset charset = Charset.forName(mCharset);
+ private String encodeString(String originalString, String targetCharset) {
+ if (mSourceCharset.equalsIgnoreCase(targetCharset)) {
+ return originalString;
+ }
+ Charset charset = Charset.forName(mSourceCharset);
ByteBuffer byteBuffer = charset.encode(originalString);
// byteBuffer.array() "may" return byte array which is larger than
// byteBuffer.remaining(). Here, we keep on the safe side.
byte[] bytes = new byte[byteBuffer.remaining()];
byteBuffer.get(bytes);
try {
- return new String(bytes, targetEncoding);
+ return new String(bytes, targetCharset);
} catch (UnsupportedEncodingException e) {
- return null;
+ Log.e(LOG_TAG, "Failed to encode: charset=" + targetCharset);
+ return new String(bytes);
}
}
- public void propertyValues(List<String> values) {
- ContentValues paramMap = mCurrentPropNode.paramMap;
-
- String charsetString = paramMap.getAsString("CHARSET");
-
- boolean setupParamValues = false;
- //decode value string to propValue_bytes
- if (paramMap.containsKey("ENCODING")) {
- String encoding = paramMap.getAsString("ENCODING");
- if (encoding.equalsIgnoreCase("BASE64") ||
- encoding.equalsIgnoreCase("B")) {
- if (values.size() > 1) {
- Log.e(LOG_TAG,
- ("BASE64 encoding is used while " +
- "there are multiple values (" + values.size()));
- }
+ private String handleOneValue(String value, String targetCharset, String encoding) {
+ if (encoding != null) {
+ if (encoding.equals("BASE64") || encoding.equals("B")) {
+ // Assume BASE64 is used only when the number of values is 1.
mCurrentPropNode.propValue_bytes =
- Base64.decodeBase64(values.get(0).
- replaceAll(" ","").replaceAll("\t","").
- replaceAll("\r\n","").
- getBytes());
- }
-
- if(encoding.equalsIgnoreCase("QUOTED-PRINTABLE")){
- // if CHARSET is defined, we translate each String into the Charset.
- List<String> tmpValues = new ArrayList<String>();
- Vector<byte[]> byteVector = new Vector<byte[]>();
- int size = 0;
- try{
- for (String value : values) {
- String quotedPrintable = value
- .replaceAll("= ", " ").replaceAll("=\t", "\t");
- String[] lines;
- if (mStrictLineBreakParsing) {
- lines = quotedPrintable.split("\r\n");
- } else {
- lines = quotedPrintable
- .replace("\r\n", "\n").replace("\r", "\n").split("\n");
- }
- StringBuilder builder = new StringBuilder();
- for (String line : lines) {
- if (line.endsWith("=")) {
- line = line.substring(0, line.length() - 1);
- }
- builder.append(line);
- }
- byte[] bytes = QuotedPrintableCodec.decodeQuotedPrintable(
- builder.toString().getBytes());
- if (charsetString != null) {
- try {
- tmpValues.add(new String(bytes, charsetString));
- } catch (UnsupportedEncodingException e) {
- Log.e(LOG_TAG, "Failed to encode: charset=" + charsetString);
- tmpValues.add(new String(bytes));
+ Base64.decodeBase64(value.getBytes());
+ return value;
+ } else if (encoding.equals("QUOTED-PRINTABLE")) {
+ String quotedPrintable = value
+ .replaceAll("= ", " ").replaceAll("=\t", "\t");
+ String[] lines;
+ if (mStrictLineBreakParsing) {
+ lines = quotedPrintable.split("\r\n");
+ } else {
+ StringBuilder builder = new StringBuilder();
+ int length = quotedPrintable.length();
+ ArrayList<String> list = new ArrayList<String>();
+ for (int i = 0; i < length; i++) {
+ char ch = quotedPrintable.charAt(i);
+ if (ch == '\n') {
+ list.add(builder.toString());
+ builder = new StringBuilder();
+ } else if (ch == '\r') {
+ list.add(builder.toString());
+ builder = new StringBuilder();
+ if (i < length - 1) {
+ char nextCh = quotedPrintable.charAt(i + 1);
+ if (nextCh == '\n') {
+ i++;
+ }
}
} else {
- tmpValues.add(new String(bytes));
- }
- byteVector.add(bytes);
- size += bytes.length;
- } // for (String value : values) {
- mCurrentPropNode.propValue_vector = tmpValues;
- mCurrentPropNode.propValue = listToString(tmpValues);
-
- mCurrentPropNode.propValue_bytes = new byte[size];
-
- {
- byte[] tmpBytes = mCurrentPropNode.propValue_bytes;
- int index = 0;
- for (byte[] bytes : byteVector) {
- int length = bytes.length;
- for (int i = 0; i < length; i++, index++) {
- tmpBytes[index] = bytes[i];
- }
+ builder.append(ch);
}
}
- setupParamValues = true;
- } catch(Exception e) {
- Log.e(LOG_TAG, "Failed to decode quoted-printable: " + e);
+ String finalLine = builder.toString();
+ if (finalLine.length() > 0) {
+ list.add(finalLine);
+ }
+ lines = list.toArray(new String[0]);
}
- } // QUOTED-PRINTABLE
- } // ENCODING
-
- if (!setupParamValues) {
- // if CHARSET is defined, we translate each String into the Charset.
- if (charsetString != null) {
- List<String> tmpValues = new ArrayList<String>();
- for (String value : values) {
- String result = encodeString(value, charsetString);
- if (result != null) {
- tmpValues.add(result);
- } else {
- Log.e(LOG_TAG, "Failed to encode: charset=" + charsetString);
- tmpValues.add(value);
+ StringBuilder builder = new StringBuilder();
+ for (String line : lines) {
+ if (line.endsWith("=")) {
+ line = line.substring(0, line.length() - 1);
}
+ builder.append(line);
+ }
+ byte[] bytes;
+ try {
+ bytes = builder.toString().getBytes(mSourceCharset);
+ } catch (UnsupportedEncodingException e1) {
+ Log.e(LOG_TAG, "Failed to encode: charset=" + mSourceCharset);
+ bytes = builder.toString().getBytes();
+ }
+
+ try {
+ bytes = QuotedPrintableCodec.decodeQuotedPrintable(bytes);
+ } catch (DecoderException e) {
+ Log.e(LOG_TAG, "Failed to decode quoted-printable: " + e);
+ return "";
+ }
+
+ try {
+ return new String(bytes, targetCharset);
+ } catch (UnsupportedEncodingException e) {
+ Log.e(LOG_TAG, "Failed to encode: charset=" + targetCharset);
+ return new String(bytes);
}
- values = tmpValues;
}
-
- mCurrentPropNode.propValue_vector = values;
- mCurrentPropNode.propValue = listToString(values);
+ // Unknown encoding. Fall back to default.
}
- mCurrentVNode.propList.add(mCurrentPropNode);
+ return encodeString(value, targetCharset);
}
-
- private String listToString(Collection<String> list){
- StringBuilder typeListB = new StringBuilder();
- for (String type : list) {
- typeListB.append(type).append(";");
+
+ public void propertyValues(List<String> values) {
+ if (values == null || values.size() == 0) {
+ mCurrentPropNode.propValue_bytes = null;
+ mCurrentPropNode.propValue_vector.clear();
+ mCurrentPropNode.propValue_vector.add("");
+ mCurrentPropNode.propValue = "";
+ return;
+ }
+
+ ContentValues paramMap = mCurrentPropNode.paramMap;
+
+ String targetCharset = CharsetUtils.nameForDefaultVendor(paramMap.getAsString("CHARSET"));
+ String encoding = paramMap.getAsString("ENCODING");
+
+ if (targetCharset == null || targetCharset.length() == 0) {
+ targetCharset = mTargetCharset;
+ }
+
+ for (String value : values) {
+ mCurrentPropNode.propValue_vector.add(
+ handleOneValue(value, targetCharset, encoding));
}
- int len = typeListB.length();
- if (len > 0 && typeListB.charAt(len - 1) == ';') {
- return typeListB.substring(0, len - 1);
+
+ mCurrentPropNode.propValue = listToString(mCurrentPropNode.propValue_vector);
+ }
+
+ private String listToString(List<String> list){
+ int size = list.size();
+ if (size > 1) {
+ StringBuilder typeListB = new StringBuilder();
+ for (String type : list) {
+ typeListB.append(type).append(";");
+ }
+ int len = typeListB.length();
+ if (len > 0 && typeListB.charAt(len - 1) == ';') {
+ return typeListB.substring(0, len - 1);
+ }
+ return typeListB.toString();
+ } else if (size == 1) {
+ return list.get(0);
+ } else {
+ return "";
}
- return typeListB.toString();
}
public String getResult(){
return null;
}
}
-
diff --git a/core/java/android/syncml/pim/VParser.java b/core/java/android/syncml/pim/VParser.java
index df93f38..57c5f7a 100644
--- a/core/java/android/syncml/pim/VParser.java
+++ b/core/java/android/syncml/pim/VParser.java
@@ -26,6 +26,9 @@ import java.io.UnsupportedEncodingException;
*
*/
abstract public class VParser {
+ // Assume that "iso-8859-1" is able to map "all" 8bit characters to some unicode and
+ // decode the unicode to the original charset. If not, this setting will cause some bug.
+ public static String DEFAULT_CHARSET = "iso-8859-1";
/**
* The buffer used to store input stream
@@ -96,6 +99,20 @@ abstract public class VParser {
}
/**
+ * Parse the given stream with the default encoding.
+ *
+ * @param is
+ * The source to parse.
+ * @param builder
+ * The v builder which used to construct data.
+ * @return Return true for success, otherwise false.
+ * @throws IOException
+ */
+ public boolean parse(InputStream is, VBuilder builder) throws IOException {
+ return parse(is, DEFAULT_CHARSET, builder);
+ }
+
+ /**
* Copy the content of input stream and filter the "folding"
*/
protected void setInputStream(InputStream is, String encoding)
diff --git a/core/java/android/syncml/pim/vcard/ContactStruct.java b/core/java/android/syncml/pim/vcard/ContactStruct.java
index 8d9b7fa..5a29112 100644
--- a/core/java/android/syncml/pim/vcard/ContactStruct.java
+++ b/core/java/android/syncml/pim/vcard/ContactStruct.java
@@ -16,45 +16,103 @@
package android.syncml.pim.vcard;
-import java.util.List;
+import android.content.AbstractSyncableContentProvider;
+import android.content.ContentProviderOperation;
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.net.Uri;
+import android.provider.Contacts;
+import android.provider.Contacts.ContactMethods;
+import android.provider.Contacts.Extensions;
+import android.provider.Contacts.GroupMembership;
+import android.provider.Contacts.Organizations;
+import android.provider.Contacts.People;
+import android.provider.Contacts.Phones;
+import android.provider.Contacts.Photos;
+import android.syncml.pim.PropertyNode;
+import android.syncml.pim.VNode;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+import android.util.Log;
+
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Map.Entry;
/**
- * The parameter class of VCardCreator.
+ * The parameter class of VCardComposer.
* This class standy by the person-contact in
* Android system, we must use this class instance as parameter to transmit to
- * VCardCreator so that create vCard string.
+ * VCardComposer so that create vCard string.
*/
// TODO: rename the class name, next step
public class ContactStruct {
- public String company;
+ private static final String LOG_TAG = "ContactStruct";
+
+ // Note: phonetic name probably should be "LAST FIRST MIDDLE" for European languages, and
+ // space should be added between each element while it should not be in Japanese.
+ // But unfortunately, we currently do not have the data and are not sure whether we should
+ // support European version of name ordering.
+ //
+ // TODO: Implement the logic described above if we really need European version of
+ // phonetic name handling. Also, adding the appropriate test case of vCard would be
+ // highly appreciated.
+ public static final int NAME_ORDER_TYPE_ENGLISH = 0;
+ public static final int NAME_ORDER_TYPE_JAPANESE = 1;
+
/** MUST exist */
public String name;
+ public String phoneticName;
/** maybe folding */
- public String notes;
+ public List<String> notes = new ArrayList<String>();
/** maybe folding */
public String title;
/** binary bytes of pic. */
public byte[] photoBytes;
- /** mime_type col of images table */
+ /** The type of Photo (e.g. JPEG, BMP, etc.) */
public String photoType;
/** Only for GET. Use addPhoneList() to PUT. */
public List<PhoneData> phoneList;
/** Only for GET. Use addContactmethodList() to PUT. */
public List<ContactMethod> contactmethodList;
+ /** Only for GET. Use addOrgList() to PUT. */
+ public List<OrganizationData> organizationList;
+ /** Only for GET. Use addExtension() to PUT */
+ public Map<String, List<String>> extensionMap;
- public static class PhoneData{
+ // Use organizationList instead when handling ORG.
+ @Deprecated
+ public String company;
+
+ public static class PhoneData {
+ public int type;
/** maybe folding */
public String data;
- public String type;
public String label;
+ public boolean isPrimary;
}
- public static class ContactMethod{
- public String kind;
- public String type;
+ public static class ContactMethod {
+ // Contacts.KIND_EMAIL, Contacts.KIND_POSTAL
+ public int kind;
+ // e.g. Contacts.ContactMethods.TYPE_HOME, Contacts.PhoneColumns.TYPE_HOME
+ // If type == Contacts.PhoneColumns.TYPE_CUSTOM, label is used.
+ public int type;
public String data;
+ // Used only when TYPE is TYPE_CUSTOM.
public String label;
+ public boolean isPrimary;
+ }
+
+ public static class OrganizationData {
+ public int type;
+ public String companyName;
+ public String positionName;
+ public boolean isPrimary;
}
/**
@@ -63,29 +121,837 @@ public class ContactStruct {
* @param type type col of content://contacts/phones
* @param label lable col of content://contacts/phones
*/
- public void addPhone(String data, String type, String label){
- if(phoneList == null)
+ public void addPhone(int type, String data, String label, boolean isPrimary){
+ if (phoneList == null) {
phoneList = new ArrayList<PhoneData>();
- PhoneData st = new PhoneData();
- st.data = data;
- st.type = type;
- st.label = label;
- phoneList.add(st);
+ }
+ PhoneData phoneData = new PhoneData();
+ phoneData.type = type;
+
+ StringBuilder builder = new StringBuilder();
+ String trimed = data.trim();
+ int length = trimed.length();
+ for (int i = 0; i < length; i++) {
+ char ch = trimed.charAt(i);
+ if (('0' <= ch && ch <= '9') || (i == 0 && ch == '+')) {
+ builder.append(ch);
+ }
+ }
+ phoneData.data = PhoneNumberUtils.formatNumber(builder.toString());
+ phoneData.label = label;
+ phoneData.isPrimary = isPrimary;
+ phoneList.add(phoneData);
}
+
/**
* Add a contactmethod info to contactmethodList.
- * @param data contact data
+ * @param kind integer value defined in Contacts.java
+ * (e.g. Contacts.KIND_EMAIL)
* @param type type col of content://contacts/contact_methods
+ * @param data contact data
+ * @param label extra string used only when kind is Contacts.KIND_CUSTOM.
*/
- public void addContactmethod(String kind, String data, String type,
- String label){
- if(contactmethodList == null)
+ public void addContactmethod(int kind, int type, String data,
+ String label, boolean isPrimary){
+ if (contactmethodList == null) {
contactmethodList = new ArrayList<ContactMethod>();
- ContactMethod st = new ContactMethod();
- st.kind = kind;
- st.data = data;
- st.type = type;
- st.label = label;
- contactmethodList.add(st);
+ }
+ ContactMethod contactMethod = new ContactMethod();
+ contactMethod.kind = kind;
+ contactMethod.type = type;
+ contactMethod.data = data;
+ contactMethod.label = label;
+ contactMethod.isPrimary = isPrimary;
+ contactmethodList.add(contactMethod);
+ }
+
+ /**
+ * Add a Organization info to organizationList.
+ */
+ public void addOrganization(int type, String companyName, String positionName,
+ boolean isPrimary) {
+ if (organizationList == null) {
+ organizationList = new ArrayList<OrganizationData>();
+ }
+ OrganizationData organizationData = new OrganizationData();
+ organizationData.type = type;
+ organizationData.companyName = companyName;
+ organizationData.positionName = positionName;
+ organizationData.isPrimary = isPrimary;
+ organizationList.add(organizationData);
+ }
+
+ public void addExtension(PropertyNode propertyNode) {
+ if (propertyNode.propValue.length() == 0) {
+ return;
+ }
+ // Now store the string into extensionMap.
+ List<String> list;
+ String name = propertyNode.propName;
+ if (extensionMap == null) {
+ extensionMap = new HashMap<String, List<String>>();
+ }
+ if (!extensionMap.containsKey(name)){
+ list = new ArrayList<String>();
+ extensionMap.put(name, list);
+ } else {
+ list = extensionMap.get(name);
+ }
+
+ list.add(propertyNode.encode());
+ }
+
+ private static String getNameFromNProperty(List<String> elems, int nameOrderType) {
+ // Family, Given, Middle, Prefix, Suffix. (1 - 5)
+ int size = elems.size();
+ if (size > 1) {
+ StringBuilder builder = new StringBuilder();
+ boolean builderIsEmpty = true;
+ // Prefix
+ if (size > 3 && elems.get(3).length() > 0) {
+ builder.append(elems.get(3));
+ builderIsEmpty = false;
+ }
+ String first, second;
+ if (nameOrderType == NAME_ORDER_TYPE_JAPANESE) {
+ first = elems.get(0);
+ second = elems.get(1);
+ } else {
+ first = elems.get(1);
+ second = elems.get(0);
+ }
+ if (first.length() > 0) {
+ if (!builderIsEmpty) {
+ builder.append(' ');
+ }
+ builder.append(first);
+ builderIsEmpty = false;
+ }
+ // Middle name
+ if (size > 2 && elems.get(2).length() > 0) {
+ if (!builderIsEmpty) {
+ builder.append(' ');
+ }
+ builder.append(elems.get(2));
+ builderIsEmpty = false;
+ }
+ if (second.length() > 0) {
+ if (!builderIsEmpty) {
+ builder.append(' ');
+ }
+ builder.append(second);
+ builderIsEmpty = false;
+ }
+ // Suffix
+ if (size > 4 && elems.get(4).length() > 0) {
+ if (!builderIsEmpty) {
+ builder.append(' ');
+ }
+ builder.append(elems.get(4));
+ builderIsEmpty = false;
+ }
+ return builder.toString();
+ } else if (size == 1) {
+ return elems.get(0);
+ } else {
+ return "";
+ }
+ }
+
+ public static ContactStruct constructContactFromVNode(VNode node,
+ int nameOrderType) {
+ if (!node.VName.equals("VCARD")) {
+ // Impossible in current implementation. Just for safety.
+ Log.e(LOG_TAG, "Non VCARD data is inserted.");
+ return null;
+ }
+
+ // For name, there are three fields in vCard: FN, N, NAME.
+ // We prefer FN, which is a required field in vCard 3.0 , but not in vCard 2.1.
+ // Next, we prefer NAME, which is defined only in vCard 3.0.
+ // Finally, we use N, which is a little difficult to parse.
+ String fullName = null;
+ String nameFromNProperty = null;
+
+ // Some vCard has "X-PHONETIC-FIRST-NAME", "X-PHONETIC-MIDDLE-NAME", and
+ // "X-PHONETIC-LAST-NAME"
+ String xPhoneticFirstName = null;
+ String xPhoneticMiddleName = null;
+ String xPhoneticLastName = null;
+
+ ContactStruct contact = new ContactStruct();
+
+ // Each Column of four properties has ISPRIMARY field
+ // (See android.provider.Contacts)
+ // If false even after the following loop, we choose the first
+ // entry as a "primary" entry.
+ boolean prefIsSetAddress = false;
+ boolean prefIsSetPhone = false;
+ boolean prefIsSetEmail = false;
+ boolean prefIsSetOrganization = false;
+
+ for (PropertyNode propertyNode: node.propList) {
+ String name = propertyNode.propName;
+
+ if (TextUtils.isEmpty(propertyNode.propValue)) {
+ continue;
+ }
+
+ if (name.equals("VERSION")) {
+ // vCard version. Ignore this.
+ } else if (name.equals("FN")) {
+ fullName = propertyNode.propValue;
+ } else if (name.equals("NAME") && fullName == null) {
+ // Only in vCard 3.0. Use this if FN does not exist.
+ // Though, note that vCard 3.0 requires FN.
+ fullName = propertyNode.propValue;
+ } else if (name.equals("N")) {
+ nameFromNProperty = getNameFromNProperty(propertyNode.propValue_vector,
+ nameOrderType);
+ } else if (name.equals("SORT-STRING")) {
+ contact.phoneticName = propertyNode.propValue;
+ } else if (name.equals("SOUND")) {
+ if (propertyNode.paramMap_TYPE.contains("X-IRMC-N") &&
+ contact.phoneticName == null) {
+ // Some Japanese mobile phones use this field for phonetic name,
+ // since vCard 2.1 does not have "SORT-STRING" type.
+ // Also, in some cases, the field has some ';' in it.
+ // We remove them.
+ StringBuilder builder = new StringBuilder();
+ String value = propertyNode.propValue;
+ int length = value.length();
+ for (int i = 0; i < length; i++) {
+ char ch = value.charAt(i);
+ if (ch != ';') {
+ builder.append(ch);
+ }
+ }
+ contact.phoneticName = builder.toString();
+ } else {
+ contact.addExtension(propertyNode);
+ }
+ } else if (name.equals("ADR")) {
+ List<String> values = propertyNode.propValue_vector;
+ boolean valuesAreAllEmpty = true;
+ for (String value : values) {
+ if (value.length() > 0) {
+ valuesAreAllEmpty = false;
+ break;
+ }
+ }
+ if (valuesAreAllEmpty) {
+ continue;
+ }
+
+ int kind = Contacts.KIND_POSTAL;
+ int type = -1;
+ String label = "";
+ boolean isPrimary = false;
+ for (String typeString : propertyNode.paramMap_TYPE) {
+ if (typeString.equals("PREF") && !prefIsSetAddress) {
+ // Only first "PREF" is considered.
+ prefIsSetAddress = true;
+ isPrimary = true;
+ } else if (typeString.equalsIgnoreCase("HOME")) {
+ type = Contacts.ContactMethodsColumns.TYPE_HOME;
+ label = "";
+ } else if (typeString.equalsIgnoreCase("WORK") ||
+ typeString.equalsIgnoreCase("COMPANY")) {
+ // "COMPANY" seems emitted by Windows Mobile, which is not
+ // specifically supported by vCard 2.1. We assume this is same
+ // as "WORK".
+ type = Contacts.ContactMethodsColumns.TYPE_WORK;
+ label = "";
+ } else if (typeString.equalsIgnoreCase("POSTAL")) {
+ kind = Contacts.KIND_POSTAL;
+ } else if (typeString.equalsIgnoreCase("PARCEL") ||
+ typeString.equalsIgnoreCase("DOM") ||
+ typeString.equalsIgnoreCase("INTL")) {
+ // We do not have a kind or type matching these.
+ // TODO: fix this. We may need to split entries into two.
+ // (e.g. entries for KIND_POSTAL and KIND_PERCEL)
+ } else if (typeString.toUpperCase().startsWith("X-") &&
+ type < 0) {
+ type = Contacts.ContactMethodsColumns.TYPE_CUSTOM;
+ label = typeString.substring(2);
+ } else if (type < 0) {
+ // vCard 3.0 allows iana-token. Also some vCard 2.1 exporters
+ // emit non-standard types. We do not handle their values now.
+ type = Contacts.ContactMethodsColumns.TYPE_CUSTOM;
+ label = typeString;
+ }
+ }
+ // We use "HOME" as default
+ if (type < 0) {
+ type = Contacts.ContactMethodsColumns.TYPE_HOME;
+ }
+
+ // adr-value = 0*6(text-value ";") text-value
+ // ; PO Box, Extended Address, Street, Locality, Region, Postal
+ // ; Code, Country Name
+ String address;
+ List<String> list = propertyNode.propValue_vector;
+ int size = list.size();
+ if (size > 1) {
+ StringBuilder builder = new StringBuilder();
+ boolean builderIsEmpty = true;
+ if (Locale.getDefault().getCountry().equals(Locale.JAPAN.getCountry())) {
+ // In Japan, the order is reversed.
+ for (int i = size - 1; i >= 0; i--) {
+ String addressPart = list.get(i);
+ if (addressPart.length() > 0) {
+ if (!builderIsEmpty) {
+ builder.append(' ');
+ }
+ builder.append(addressPart);
+ builderIsEmpty = false;
+ }
+ }
+ } else {
+ for (int i = 0; i < size; i++) {
+ String addressPart = list.get(i);
+ if (addressPart.length() > 0) {
+ if (!builderIsEmpty) {
+ builder.append(' ');
+ }
+ builder.append(addressPart);
+ builderIsEmpty = false;
+ }
+ }
+ }
+ address = builder.toString().trim();
+ } else {
+ address = propertyNode.propValue;
+ }
+ contact.addContactmethod(kind, type, address, label, isPrimary);
+ } else if (name.equals("ORG")) {
+ // vCard specification does not specify other types.
+ int type = Contacts.OrganizationColumns.TYPE_WORK;
+ String companyName = "";
+ String positionName = "";
+ boolean isPrimary = false;
+
+ for (String typeString : propertyNode.paramMap_TYPE) {
+ if (typeString.equals("PREF") && !prefIsSetOrganization) {
+ // vCard specification officially does not have PREF in ORG.
+ // This is just for safety.
+ prefIsSetOrganization = true;
+ isPrimary = true;
+ }
+ // XXX: Should we cope with X- words?
+ }
+
+ List<String> list = propertyNode.propValue_vector;
+ int size = list.size();
+ if (size > 1) {
+ companyName = list.get(0);
+ StringBuilder builder = new StringBuilder();
+ for (int i = 1; i < size; i++) {
+ builder.append(list.get(1));
+ if (i != size - 1) {
+ builder.append(", ");
+ }
+ }
+ positionName = builder.toString();
+ } else if (size == 1) {
+ companyName = propertyNode.propValue;
+ positionName = "";
+ }
+ contact.addOrganization(type, companyName, positionName, isPrimary);
+ } else if (name.equals("TITLE")) {
+ contact.title = propertyNode.propValue;
+ // XXX: What to do this? Isn't ORG enough?
+ contact.addExtension(propertyNode);
+ } else if (name.equals("ROLE")) {
+ // XXX: What to do this? Isn't ORG enough?
+ contact.addExtension(propertyNode);
+ } else if (name.equals("PHOTO")) {
+ // We prefer PHOTO to LOGO.
+ String valueType = propertyNode.paramMap.getAsString("VALUE");
+ if (valueType != null && valueType.equals("URL")) {
+ // TODO: do something.
+ } else {
+ // Assume PHOTO is stored in BASE64. In that case,
+ // data is already stored in propValue_bytes in binary form.
+ // It should be automatically done by VBuilder (VDataBuilder/VCardDatabuilder)
+ contact.photoBytes = propertyNode.propValue_bytes;
+ String type = propertyNode.paramMap.getAsString("TYPE");
+ if (type != null) {
+ contact.photoType = type;
+ }
+ }
+ } else if (name.equals("LOGO")) {
+ // When PHOTO is not available this is not URL,
+ // we use this instead of PHOTO.
+ String valueType = propertyNode.paramMap.getAsString("VALUE");
+ if (valueType != null && valueType.equals("URL")) {
+ // TODO: do something.
+ } else if (contact.photoBytes == null) {
+ contact.photoBytes = propertyNode.propValue_bytes;
+ String type = propertyNode.paramMap.getAsString("TYPE");
+ if (type != null) {
+ contact.photoType = type;
+ }
+ }
+ } else if (name.equals("EMAIL")) {
+ int type = -1;
+ String label = null;
+ boolean isPrimary = false;
+ for (String typeString : propertyNode.paramMap_TYPE) {
+ if (typeString.equals("PREF") && !prefIsSetEmail) {
+ // Only first "PREF" is considered.
+ prefIsSetEmail = true;
+ isPrimary = true;
+ } else if (typeString.equalsIgnoreCase("HOME")) {
+ type = Contacts.ContactMethodsColumns.TYPE_HOME;
+ } else if (typeString.equalsIgnoreCase("WORK")) {
+ type = Contacts.ContactMethodsColumns.TYPE_WORK;
+ } else if (typeString.equalsIgnoreCase("CELL")) {
+ // We do not have Contacts.ContactMethodsColumns.TYPE_MOBILE yet.
+ type = Contacts.ContactMethodsColumns.TYPE_CUSTOM;
+ label = Contacts.ContactMethodsColumns.MOBILE_EMAIL_TYPE_NAME;
+ } else if (typeString.toUpperCase().startsWith("X-") &&
+ type < 0) {
+ type = Contacts.ContactMethodsColumns.TYPE_CUSTOM;
+ label = typeString.substring(2);
+ } else if (type < 0) {
+ // vCard 3.0 allows iana-token.
+ // We may have INTERNET (specified in vCard spec),
+ // SCHOOL, etc.
+ type = Contacts.ContactMethodsColumns.TYPE_CUSTOM;
+ label = typeString;
+ }
+ }
+ // We use "OTHER" as default.
+ if (type < 0) {
+ type = Contacts.ContactMethodsColumns.TYPE_OTHER;
+ }
+ contact.addContactmethod(Contacts.KIND_EMAIL,
+ type, propertyNode.propValue,label, isPrimary);
+ } else if (name.equals("TEL")) {
+ int type = -1;
+ String label = null;
+ boolean isPrimary = false;
+ boolean isFax = false;
+ for (String typeString : propertyNode.paramMap_TYPE) {
+ if (typeString.equals("PREF") && !prefIsSetPhone) {
+ // Only first "PREF" is considered.
+ prefIsSetPhone = true;
+ isPrimary = true;
+ } else if (typeString.equalsIgnoreCase("HOME")) {
+ type = Contacts.PhonesColumns.TYPE_HOME;
+ } else if (typeString.equalsIgnoreCase("WORK")) {
+ type = Contacts.PhonesColumns.TYPE_WORK;
+ } else if (typeString.equalsIgnoreCase("CELL")) {
+ type = Contacts.PhonesColumns.TYPE_MOBILE;
+ } else if (typeString.equalsIgnoreCase("PAGER")) {
+ type = Contacts.PhonesColumns.TYPE_PAGER;
+ } else if (typeString.equalsIgnoreCase("FAX")) {
+ isFax = true;
+ } else if (typeString.equalsIgnoreCase("VOICE") ||
+ typeString.equalsIgnoreCase("MSG")) {
+ // Defined in vCard 3.0. Ignore these because they
+ // conflict with "HOME", "WORK", etc.
+ // XXX: do something?
+ } else if (typeString.toUpperCase().startsWith("X-") &&
+ type < 0) {
+ type = Contacts.PhonesColumns.TYPE_CUSTOM;
+ label = typeString.substring(2);
+ } else if (type < 0){
+ // We may have MODEM, CAR, ISDN, etc...
+ type = Contacts.PhonesColumns.TYPE_CUSTOM;
+ label = typeString;
+ }
+ }
+ // We use "HOME" as default
+ if (type < 0) {
+ type = Contacts.PhonesColumns.TYPE_HOME;
+ }
+ if (isFax) {
+ if (type == Contacts.PhonesColumns.TYPE_HOME) {
+ type = Contacts.PhonesColumns.TYPE_FAX_HOME;
+ } else if (type == Contacts.PhonesColumns.TYPE_WORK) {
+ type = Contacts.PhonesColumns.TYPE_FAX_WORK;
+ }
+ }
+
+ contact.addPhone(type, propertyNode.propValue, label, isPrimary);
+ } else if (name.equals("NOTE")) {
+ contact.notes.add(propertyNode.propValue);
+ } else if (name.equals("BDAY")) {
+ contact.addExtension(propertyNode);
+ } else if (name.equals("URL")) {
+ contact.addExtension(propertyNode);
+ } else if (name.equals("REV")) {
+ // Revision of this VCard entry. I think we can ignore this.
+ contact.addExtension(propertyNode);
+ } else if (name.equals("UID")) {
+ contact.addExtension(propertyNode);
+ } else if (name.equals("KEY")) {
+ // Type is X509 or PGP? I don't know how to handle this...
+ contact.addExtension(propertyNode);
+ } else if (name.equals("MAILER")) {
+ contact.addExtension(propertyNode);
+ } else if (name.equals("TZ")) {
+ contact.addExtension(propertyNode);
+ } else if (name.equals("GEO")) {
+ contact.addExtension(propertyNode);
+ } else if (name.equals("NICKNAME")) {
+ // vCard 3.0 only.
+ contact.addExtension(propertyNode);
+ } else if (name.equals("CLASS")) {
+ // vCard 3.0 only.
+ // e.g. CLASS:CONFIDENTIAL
+ contact.addExtension(propertyNode);
+ } else if (name.equals("PROFILE")) {
+ // VCard 3.0 only. Must be "VCARD". I think we can ignore this.
+ contact.addExtension(propertyNode);
+ } else if (name.equals("CATEGORIES")) {
+ // VCard 3.0 only.
+ // e.g. CATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY
+ contact.addExtension(propertyNode);
+ } else if (name.equals("SOURCE")) {
+ // VCard 3.0 only.
+ contact.addExtension(propertyNode);
+ } else if (name.equals("PRODID")) {
+ // VCard 3.0 only.
+ // To specify the identifier for the product that created
+ // the vCard object.
+ contact.addExtension(propertyNode);
+ } else if (name.equals("X-PHONETIC-FIRST-NAME")) {
+ xPhoneticFirstName = propertyNode.propValue;
+ } else if (name.equals("X-PHONETIC-MIDDLE-NAME")) {
+ xPhoneticMiddleName = propertyNode.propValue;
+ } else if (name.equals("X-PHONETIC-LAST-NAME")) {
+ xPhoneticLastName = propertyNode.propValue;
+ } else {
+ // Unknown X- words and IANA token.
+ contact.addExtension(propertyNode);
+ }
+ }
+
+ if (fullName != null) {
+ contact.name = fullName;
+ } else if(nameFromNProperty != null) {
+ contact.name = nameFromNProperty;
+ } else {
+ contact.name = "";
+ }
+
+ if (contact.phoneticName == null &&
+ (xPhoneticFirstName != null || xPhoneticMiddleName != null ||
+ xPhoneticLastName != null)) {
+ // Note: In Europe, this order should be "LAST FIRST MIDDLE". See the comment around
+ // NAME_ORDER_TYPE_* for more detail.
+ String first;
+ String second;
+ if (nameOrderType == NAME_ORDER_TYPE_JAPANESE) {
+ first = xPhoneticLastName;
+ second = xPhoneticFirstName;
+ } else {
+ first = xPhoneticFirstName;
+ second = xPhoneticLastName;
+ }
+ StringBuilder builder = new StringBuilder();
+ if (first != null) {
+ builder.append(first);
+ }
+ if (xPhoneticMiddleName != null) {
+ builder.append(xPhoneticMiddleName);
+ }
+ if (second != null) {
+ builder.append(second);
+ }
+ contact.phoneticName = builder.toString();
+ }
+
+ // Remove unnecessary white spaces.
+ // It is found that some mobile phone emits phonetic name with just one white space
+ // when a user does not specify one.
+ // This logic is effective toward such kind of weird data.
+ if (contact.phoneticName != null) {
+ contact.phoneticName = contact.phoneticName.trim();
+ }
+
+ // If there is no "PREF", we choose the first entries as primary.
+ if (!prefIsSetPhone &&
+ contact.phoneList != null &&
+ contact.phoneList.size() > 0) {
+ contact.phoneList.get(0).isPrimary = true;
+ }
+
+ if (!prefIsSetAddress && contact.contactmethodList != null) {
+ for (ContactMethod contactMethod : contact.contactmethodList) {
+ if (contactMethod.kind == Contacts.KIND_POSTAL) {
+ contactMethod.isPrimary = true;
+ break;
+ }
+ }
+ }
+ if (!prefIsSetEmail && contact.contactmethodList != null) {
+ for (ContactMethod contactMethod : contact.contactmethodList) {
+ if (contactMethod.kind == Contacts.KIND_EMAIL) {
+ contactMethod.isPrimary = true;
+ break;
+ }
+ }
+ }
+ if (!prefIsSetOrganization &&
+ contact.organizationList != null &&
+ contact.organizationList.size() > 0) {
+ contact.organizationList.get(0).isPrimary = true;
+ }
+
+ return contact;
+ }
+
+ public String displayString() {
+ if (name.length() > 0) {
+ return name;
+ }
+ if (contactmethodList != null && contactmethodList.size() > 0) {
+ for (ContactMethod contactMethod : contactmethodList) {
+ if (contactMethod.kind == Contacts.KIND_EMAIL && contactMethod.isPrimary) {
+ return contactMethod.data;
+ }
+ }
+ }
+ if (phoneList != null && phoneList.size() > 0) {
+ for (PhoneData phoneData : phoneList) {
+ if (phoneData.isPrimary) {
+ return phoneData.data;
+ }
+ }
+ }
+ return "";
+ }
+
+ private void pushIntoContentProviderOrResolver(Object contentSomething,
+ long myContactsGroupId) {
+ ContentResolver resolver = null;
+ AbstractSyncableContentProvider provider = null;
+ if (contentSomething instanceof ContentResolver) {
+ resolver = (ContentResolver)contentSomething;
+ } else if (contentSomething instanceof AbstractSyncableContentProvider) {
+ provider = (AbstractSyncableContentProvider)contentSomething;
+ } else {
+ Log.e(LOG_TAG, "Unsupported object came.");
+ return;
+ }
+
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(People.NAME, name);
+ contentValues.put(People.PHONETIC_NAME, phoneticName);
+
+ if (notes.size() > 1) {
+ StringBuilder builder = new StringBuilder();
+ for (String note : notes) {
+ builder.append(note);
+ builder.append("\n");
+ }
+ contentValues.put(People.NOTES, builder.toString());
+ } else if (notes.size() == 1){
+ contentValues.put(People.NOTES, notes.get(0));
+ }
+
+ Uri personUri;
+ long personId = 0;
+ if (resolver != null) {
+ personUri = Contacts.People.createPersonInMyContactsGroup(
+ resolver, contentValues);
+ if (personUri != null) {
+ personId = ContentUris.parseId(personUri);
+ }
+ } else {
+ personUri = provider.insert(People.CONTENT_URI, contentValues);
+ if (personUri != null) {
+ personId = ContentUris.parseId(personUri);
+ ContentValues values = new ContentValues();
+ values.put(GroupMembership.PERSON_ID, personId);
+ values.put(GroupMembership.GROUP_ID, myContactsGroupId);
+ Uri resultUri = provider.insert(GroupMembership.CONTENT_URI, values);
+ if (resultUri == null) {
+ Log.e(LOG_TAG, "Faild to insert the person to MyContact.");
+ provider.delete(personUri, null, null);
+ personUri = null;
+ }
+ }
+ }
+
+ if (personUri == null) {
+ Log.e(LOG_TAG, "Failed to create the contact.");
+ return;
+ }
+
+ if (photoBytes != null) {
+ if (resolver != null) {
+ People.setPhotoData(resolver, personUri, photoBytes);
+ } else {
+ Uri photoUri = Uri.withAppendedPath(personUri, Contacts.Photos.CONTENT_DIRECTORY);
+ ContentValues values = new ContentValues();
+ values.put(Photos.DATA, photoBytes);
+ provider.update(photoUri, values, null, null);
+ }
+ }
+
+ long primaryPhoneId = -1;
+ if (phoneList != null && phoneList.size() > 0) {
+ for (PhoneData phoneData : phoneList) {
+ ContentValues values = new ContentValues();
+ values.put(Contacts.PhonesColumns.TYPE, phoneData.type);
+ if (phoneData.type == Contacts.PhonesColumns.TYPE_CUSTOM) {
+ values.put(Contacts.PhonesColumns.LABEL, phoneData.label);
+ }
+ // Already formatted.
+ values.put(Contacts.PhonesColumns.NUMBER, phoneData.data);
+
+ // Not sure about Contacts.PhonesColumns.NUMBER_KEY ...
+ values.put(Contacts.PhonesColumns.ISPRIMARY, 1);
+ values.put(Contacts.Phones.PERSON_ID, personId);
+ Uri phoneUri;
+ if (resolver != null) {
+ phoneUri = resolver.insert(Phones.CONTENT_URI, values);
+ } else {
+ phoneUri = provider.insert(Phones.CONTENT_URI, values);
+ }
+ if (phoneData.isPrimary) {
+ primaryPhoneId = Long.parseLong(phoneUri.getLastPathSegment());
+ }
+ }
+ }
+
+ long primaryOrganizationId = -1;
+ if (organizationList != null && organizationList.size() > 0) {
+ for (OrganizationData organizationData : organizationList) {
+ ContentValues values = new ContentValues();
+ // Currently, we do not use TYPE_CUSTOM.
+ values.put(Contacts.OrganizationColumns.TYPE,
+ organizationData.type);
+ values.put(Contacts.OrganizationColumns.COMPANY,
+ organizationData.companyName);
+ values.put(Contacts.OrganizationColumns.TITLE,
+ organizationData.positionName);
+ values.put(Contacts.OrganizationColumns.ISPRIMARY, 1);
+ values.put(Contacts.OrganizationColumns.PERSON_ID, personId);
+
+ Uri organizationUri;
+ if (resolver != null) {
+ organizationUri = resolver.insert(Organizations.CONTENT_URI, values);
+ } else {
+ organizationUri = provider.insert(Organizations.CONTENT_URI, values);
+ }
+ if (organizationData.isPrimary) {
+ primaryOrganizationId = Long.parseLong(organizationUri.getLastPathSegment());
+ }
+ }
+ }
+
+ long primaryEmailId = -1;
+ if (contactmethodList != null && contactmethodList.size() > 0) {
+ for (ContactMethod contactMethod : contactmethodList) {
+ ContentValues values = new ContentValues();
+ values.put(Contacts.ContactMethodsColumns.KIND, contactMethod.kind);
+ values.put(Contacts.ContactMethodsColumns.TYPE, contactMethod.type);
+ if (contactMethod.type == Contacts.ContactMethodsColumns.TYPE_CUSTOM) {
+ values.put(Contacts.ContactMethodsColumns.LABEL, contactMethod.label);
+ }
+ values.put(Contacts.ContactMethodsColumns.DATA, contactMethod.data);
+ values.put(Contacts.ContactMethodsColumns.ISPRIMARY, 1);
+ values.put(Contacts.ContactMethods.PERSON_ID, personId);
+
+ if (contactMethod.kind == Contacts.KIND_EMAIL) {
+ Uri emailUri;
+ if (resolver != null) {
+ emailUri = resolver.insert(ContactMethods.CONTENT_URI, values);
+ } else {
+ emailUri = provider.insert(ContactMethods.CONTENT_URI, values);
+ }
+ if (contactMethod.isPrimary) {
+ primaryEmailId = Long.parseLong(emailUri.getLastPathSegment());
+ }
+ } else { // probably KIND_POSTAL
+ if (resolver != null) {
+ resolver.insert(ContactMethods.CONTENT_URI, values);
+ } else {
+ provider.insert(ContactMethods.CONTENT_URI, values);
+ }
+ }
+ }
+ }
+
+ if (extensionMap != null && extensionMap.size() > 0) {
+ ArrayList<ContentValues> contentValuesArray;
+ if (resolver != null) {
+ contentValuesArray = new ArrayList<ContentValues>();
+ } else {
+ contentValuesArray = null;
+ }
+ for (Entry<String, List<String>> entry : extensionMap.entrySet()) {
+ String key = entry.getKey();
+ List<String> list = entry.getValue();
+ for (String value : list) {
+ ContentValues values = new ContentValues();
+ values.put(Extensions.NAME, key);
+ values.put(Extensions.VALUE, value);
+ values.put(Extensions.PERSON_ID, personId);
+ if (resolver != null) {
+ contentValuesArray.add(values);
+ } else {
+ provider.insert(Extensions.CONTENT_URI, values);
+ }
+ }
+ }
+ if (resolver != null) {
+ resolver.bulkInsert(Extensions.CONTENT_URI,
+ contentValuesArray.toArray(new ContentValues[0]));
+ }
+ }
+
+ if (primaryPhoneId >= 0 || primaryOrganizationId >= 0 || primaryEmailId >= 0) {
+ ContentValues values = new ContentValues();
+ if (primaryPhoneId >= 0) {
+ values.put(People.PRIMARY_PHONE_ID, primaryPhoneId);
+ }
+ if (primaryOrganizationId >= 0) {
+ values.put(People.PRIMARY_ORGANIZATION_ID, primaryOrganizationId);
+ }
+ if (primaryEmailId >= 0) {
+ values.put(People.PRIMARY_EMAIL_ID, primaryEmailId);
+ }
+ if (resolver != null) {
+ resolver.update(personUri, values, null, null);
+ } else {
+ provider.update(personUri, values, null, null);
+ }
+ }
+ }
+
+ /**
+ * Push this object into database in the resolver.
+ */
+ public void pushIntoContentResolver(ContentResolver resolver) {
+ pushIntoContentProviderOrResolver(resolver, 0);
+ }
+
+ /**
+ * Push this object into AbstractSyncableContentProvider object.
+ */
+ public void pushIntoAbstractSyncableContentProvider(
+ AbstractSyncableContentProvider provider, long myContactsGroupId) {
+ boolean successful = false;
+ provider.beginBatch();
+ try {
+ pushIntoContentProviderOrResolver(provider, myContactsGroupId);
+ successful = true;
+ } finally {
+ provider.endBatch(successful);
+ }
+ }
+
+ public boolean isIgnorable() {
+ return TextUtils.isEmpty(name) &&
+ TextUtils.isEmpty(phoneticName) &&
+ (phoneList == null || phoneList.size() == 0) &&
+ (contactmethodList == null || contactmethodList.size() == 0);
}
}
diff --git a/core/java/android/syncml/pim/vcard/VCardComposer.java b/core/java/android/syncml/pim/vcard/VCardComposer.java
index 05e8f40..192736a 100644
--- a/core/java/android/syncml/pim/vcard/VCardComposer.java
+++ b/core/java/android/syncml/pim/vcard/VCardComposer.java
@@ -124,9 +124,9 @@ public class VCardComposer {
mResult.append("ORG:").append(struct.company).append(mNewline);
}
- if (!isNull(struct.notes)) {
+ if (struct.notes.size() > 0 && !isNull(struct.notes.get(0))) {
mResult.append("NOTE:").append(
- foldingString(struct.notes, vcardversion)).append(mNewline);
+ foldingString(struct.notes.get(0), vcardversion)).append(mNewline);
}
if (!isNull(struct.title)) {
@@ -190,7 +190,7 @@ public class VCardComposer {
*/
private void appendPhotoStr(byte[] bytes, String type, int version)
throws VCardException {
- String value, apptype, encodingStr;
+ String value, encodingStr;
try {
value = foldingString(new String(Base64.encodeBase64(bytes, true)),
version);
@@ -198,20 +198,23 @@ public class VCardComposer {
throw new VCardException(e.getMessage());
}
- if (isNull(type)) {
- type = "image/jpeg";
- }
- if (type.indexOf("jpeg") > 0) {
- apptype = "JPEG";
- } else if (type.indexOf("gif") > 0) {
- apptype = "GIF";
- } else if (type.indexOf("bmp") > 0) {
- apptype = "BMP";
+ if (isNull(type) || type.toUpperCase().indexOf("JPEG") >= 0) {
+ type = "JPEG";
+ } else if (type.toUpperCase().indexOf("GIF") >= 0) {
+ type = "GIF";
+ } else if (type.toUpperCase().indexOf("BMP") >= 0) {
+ type = "BMP";
} else {
- apptype = type.substring(type.indexOf("/")).toUpperCase();
+ // Handle the string like "image/tiff".
+ int indexOfSlash = type.indexOf("/");
+ if (indexOfSlash >= 0) {
+ type = type.substring(indexOfSlash + 1).toUpperCase();
+ } else {
+ type = type.toUpperCase();
+ }
}
- mResult.append("LOGO;TYPE=").append(apptype);
+ mResult.append("LOGO;TYPE=").append(type);
if (version == VERSION_VCARD21_INT) {
encodingStr = ";ENCODING=BASE64:";
value = value + mNewline;
@@ -281,7 +284,7 @@ public class VCardComposer {
private String getPhoneTypeStr(PhoneData phone) {
- int phoneType = Integer.parseInt(phone.type);
+ int phoneType = phone.type;
String typeStr, label;
if (phoneTypeMap.containsKey(phoneType)) {
@@ -308,7 +311,7 @@ public class VCardComposer {
String joinMark = version == VERSION_VCARD21_INT ? ";" : ",";
for (ContactStruct.ContactMethod contactMethod : contactMList) {
// same with v2.1 and v3.0
- switch (Integer.parseInt(contactMethod.kind)) {
+ switch (contactMethod.kind) {
case Contacts.KIND_EMAIL:
String mailType = "INTERNET";
if (!isNull(contactMethod.data)) {
diff --git a/core/java/android/syncml/pim/vcard/VCardDataBuilder.java b/core/java/android/syncml/pim/vcard/VCardDataBuilder.java
new file mode 100644
index 0000000..a0513f1
--- /dev/null
+++ b/core/java/android/syncml/pim/vcard/VCardDataBuilder.java
@@ -0,0 +1,442 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.syncml.pim.vcard;
+
+import android.app.ProgressDialog;
+import android.content.AbstractSyncableContentProvider;
+import android.content.ContentProvider;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.IContentProvider;
+import android.os.Handler;
+import android.provider.Contacts;
+import android.syncml.pim.PropertyNode;
+import android.syncml.pim.VBuilder;
+import android.syncml.pim.VNode;
+import android.syncml.pim.VParser;
+import android.util.CharsetUtils;
+import android.util.Log;
+
+import org.apache.commons.codec.DecoderException;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.codec.net.QuotedPrintableCodec;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * VBuilder for VCard. VCard may contain big photo images encoded by BASE64,
+ * If we store all VNode entries in memory like VDataBuilder.java,
+ * OutOfMemoryError may be thrown. Thus, this class push each VCard entry into
+ * ContentResolver immediately.
+ */
+public class VCardDataBuilder implements VBuilder {
+ static private String LOG_TAG = "VCardDataBuilder";
+
+ /**
+ * If there's no other information available, this class uses this charset for encoding
+ * byte arrays.
+ */
+ static public String DEFAULT_CHARSET = "UTF-8";
+
+ private class ProgressShower implements Runnable {
+ private ContactStruct mContact;
+
+ public ProgressShower(ContactStruct contact) {
+ mContact = contact;
+ }
+
+ public void run () {
+ mProgressDialog.setMessage(mProgressMessage + "\n" +
+ mContact.displayString());
+ }
+ }
+
+ /** type=VNode */
+ private VNode mCurrentVNode;
+ private PropertyNode mCurrentPropNode;
+ private String mCurrentParamType;
+
+ /**
+ * The charset using which VParser parses the text.
+ */
+ private String mSourceCharset;
+
+ /**
+ * The charset with which byte array is encoded to String.
+ */
+ private String mTargetCharset;
+ private boolean mStrictLineBreakParsing;
+ private ContentResolver mContentResolver;
+
+ // For letting VCardDataBuilder show the display name of VCard while handling it.
+ private Handler mHandler;
+ private ProgressDialog mProgressDialog;
+ private String mProgressMessage;
+ private Runnable mOnProgressRunnable;
+ private boolean mLastNameComesBeforeFirstName;
+
+ // Just for testing.
+ private long mTimeCreateContactStruct;
+ private long mTimePushIntoContentResolver;
+
+ // Ideally, this should be ContactsProvider but it seems Class loader cannot find it,
+ // even when it is subclass of ContactsProvider...
+ private AbstractSyncableContentProvider mProvider;
+ private long mMyContactsGroupId;
+
+ public VCardDataBuilder(ContentResolver resolver) {
+ mTargetCharset = DEFAULT_CHARSET;
+ mContentResolver = resolver;
+ }
+
+ /**
+ * Constructor which requires minimum requiredvariables.
+ *
+ * @param resolver insert each data into this ContentResolver
+ * @param progressDialog
+ * @param progressMessage
+ * @param handler if this importer works on the different thread than main one,
+ * set appropriate handler object. If not, it is ok to set this null.
+ */
+ public VCardDataBuilder(ContentResolver resolver,
+ ProgressDialog progressDialog,
+ String progressMessage,
+ Handler handler) {
+ this(resolver, progressDialog, progressMessage, handler,
+ null, null, false, false);
+ }
+
+ public VCardDataBuilder(ContentResolver resolver,
+ ProgressDialog progressDialog,
+ String progressMessage,
+ Handler handler,
+ String charset,
+ boolean strictLineBreakParsing,
+ boolean lastNameComesBeforeFirstName) {
+ this(resolver, progressDialog, progressMessage, handler,
+ null, charset, strictLineBreakParsing,
+ lastNameComesBeforeFirstName);
+ }
+
+ /**
+ * @hide
+ */
+ public VCardDataBuilder(ContentResolver resolver,
+ ProgressDialog progressDialog,
+ String progressMessage,
+ Handler handler,
+ String sourceCharset,
+ String targetCharset,
+ boolean strictLineBreakParsing,
+ boolean lastNameComesBeforeFirstName) {
+ if (sourceCharset != null) {
+ mSourceCharset = sourceCharset;
+ } else {
+ mSourceCharset = VParser.DEFAULT_CHARSET;
+ }
+ if (targetCharset != null) {
+ mTargetCharset = targetCharset;
+ } else {
+ mTargetCharset = DEFAULT_CHARSET;
+ }
+ mContentResolver = resolver;
+ mStrictLineBreakParsing = strictLineBreakParsing;
+ mHandler = handler;
+ mProgressDialog = progressDialog;
+ mProgressMessage = progressMessage;
+ mLastNameComesBeforeFirstName = lastNameComesBeforeFirstName;
+
+ tryGetOriginalProvider();
+ }
+
+ private void tryGetOriginalProvider() {
+ final ContentResolver resolver = mContentResolver;
+
+ if ((mMyContactsGroupId = Contacts.People.tryGetMyContactsGroupId(resolver)) == 0) {
+ Log.e(LOG_TAG, "Could not get group id of MyContact");
+ return;
+ }
+
+ IContentProvider iProviderForName = resolver.acquireProvider(Contacts.CONTENT_URI);
+ ContentProvider contentProvider =
+ ContentProvider.coerceToLocalContentProvider(iProviderForName);
+ if (contentProvider == null) {
+ Log.e(LOG_TAG, "Fail to get ContentProvider object.");
+ return;
+ }
+
+ if (!(contentProvider instanceof AbstractSyncableContentProvider)) {
+ Log.e(LOG_TAG,
+ "Acquired ContentProvider object is not AbstractSyncableContentProvider.");
+ return;
+ }
+
+ mProvider = (AbstractSyncableContentProvider)contentProvider;
+ }
+
+ public void setOnProgressRunnable(Runnable runnable) {
+ mOnProgressRunnable = runnable;
+ }
+
+ public void start() {
+ }
+
+ public void end() {
+ }
+
+ /**
+ * Assume that VCard is not nested. In other words, this code does not accept
+ */
+ public void startRecord(String type) {
+ if (mCurrentVNode != null) {
+ // This means startRecord() is called inside startRecord() - endRecord() block.
+ // TODO: should throw some Exception
+ Log.e(LOG_TAG, "Nested VCard code is not supported now.");
+ }
+ mCurrentVNode = new VNode();
+ mCurrentVNode.parseStatus = 1;
+ mCurrentVNode.VName = type;
+ }
+
+ public void endRecord() {
+ mCurrentVNode.parseStatus = 0;
+ long start = System.currentTimeMillis();
+ ContactStruct contact = ContactStruct.constructContactFromVNode(mCurrentVNode,
+ mLastNameComesBeforeFirstName ? ContactStruct.NAME_ORDER_TYPE_JAPANESE :
+ ContactStruct.NAME_ORDER_TYPE_ENGLISH);
+ mTimeCreateContactStruct += System.currentTimeMillis() - start;
+ if (!contact.isIgnorable()) {
+ if (mProgressDialog != null && mProgressMessage != null) {
+ if (mHandler != null) {
+ mHandler.post(new ProgressShower(contact));
+ } else {
+ mProgressDialog.setMessage(mProgressMessage + "\n" +
+ contact.displayString());
+ }
+ }
+ start = System.currentTimeMillis();
+ if (mProvider != null) {
+ contact.pushIntoAbstractSyncableContentProvider(
+ mProvider, mMyContactsGroupId);
+ } else {
+ contact.pushIntoContentResolver(mContentResolver);
+ }
+ mTimePushIntoContentResolver += System.currentTimeMillis() - start;
+ }
+ if (mOnProgressRunnable != null) {
+ mOnProgressRunnable.run();
+ }
+ mCurrentVNode = null;
+ }
+
+ public void startProperty() {
+ mCurrentPropNode = new PropertyNode();
+ }
+
+ public void endProperty() {
+ mCurrentVNode.propList.add(mCurrentPropNode);
+ mCurrentPropNode = null;
+ }
+
+ public void propertyName(String name) {
+ mCurrentPropNode.propName = name;
+ }
+
+ public void propertyGroup(String group) {
+ mCurrentPropNode.propGroupSet.add(group);
+ }
+
+ public void propertyParamType(String type) {
+ mCurrentParamType = type;
+ }
+
+ public void propertyParamValue(String value) {
+ if (mCurrentParamType == null ||
+ mCurrentParamType.equalsIgnoreCase("TYPE")) {
+ mCurrentPropNode.paramMap_TYPE.add(value);
+ } else {
+ mCurrentPropNode.paramMap.put(mCurrentParamType, value);
+ }
+
+ mCurrentParamType = null;
+ }
+
+ private String encodeString(String originalString, String targetCharset) {
+ if (mSourceCharset.equalsIgnoreCase(targetCharset)) {
+ return originalString;
+ }
+ Charset charset = Charset.forName(mSourceCharset);
+ ByteBuffer byteBuffer = charset.encode(originalString);
+ // byteBuffer.array() "may" return byte array which is larger than
+ // byteBuffer.remaining(). Here, we keep on the safe side.
+ byte[] bytes = new byte[byteBuffer.remaining()];
+ byteBuffer.get(bytes);
+ try {
+ return new String(bytes, targetCharset);
+ } catch (UnsupportedEncodingException e) {
+ Log.e(LOG_TAG, "Failed to encode: charset=" + targetCharset);
+ return new String(bytes);
+ }
+ }
+
+ private String handleOneValue(String value, String targetCharset, String encoding) {
+ if (encoding != null) {
+ if (encoding.equals("BASE64") || encoding.equals("B")) {
+ mCurrentPropNode.propValue_bytes =
+ Base64.decodeBase64(value.getBytes());
+ return value;
+ } else if (encoding.equals("QUOTED-PRINTABLE")) {
+ // "= " -> " ", "=\t" -> "\t".
+ // Previous code had done this replacement. Keep on the safe side.
+ StringBuilder builder = new StringBuilder();
+ int length = value.length();
+ for (int i = 0; i < length; i++) {
+ char ch = value.charAt(i);
+ if (ch == '=' && i < length - 1) {
+ char nextCh = value.charAt(i + 1);
+ if (nextCh == ' ' || nextCh == '\t') {
+
+ builder.append(nextCh);
+ i++;
+ continue;
+ }
+ }
+ builder.append(ch);
+ }
+ String quotedPrintable = builder.toString();
+
+ String[] lines;
+ if (mStrictLineBreakParsing) {
+ lines = quotedPrintable.split("\r\n");
+ } else {
+ builder = new StringBuilder();
+ length = quotedPrintable.length();
+ ArrayList<String> list = new ArrayList<String>();
+ for (int i = 0; i < length; i++) {
+ char ch = quotedPrintable.charAt(i);
+ if (ch == '\n') {
+ list.add(builder.toString());
+ builder = new StringBuilder();
+ } else if (ch == '\r') {
+ list.add(builder.toString());
+ builder = new StringBuilder();
+ if (i < length - 1) {
+ char nextCh = quotedPrintable.charAt(i + 1);
+ if (nextCh == '\n') {
+ i++;
+ }
+ }
+ } else {
+ builder.append(ch);
+ }
+ }
+ String finalLine = builder.toString();
+ if (finalLine.length() > 0) {
+ list.add(finalLine);
+ }
+ lines = list.toArray(new String[0]);
+ }
+
+ builder = new StringBuilder();
+ for (String line : lines) {
+ if (line.endsWith("=")) {
+ line = line.substring(0, line.length() - 1);
+ }
+ builder.append(line);
+ }
+ byte[] bytes;
+ try {
+ bytes = builder.toString().getBytes(mSourceCharset);
+ } catch (UnsupportedEncodingException e1) {
+ Log.e(LOG_TAG, "Failed to encode: charset=" + mSourceCharset);
+ bytes = builder.toString().getBytes();
+ }
+
+ try {
+ bytes = QuotedPrintableCodec.decodeQuotedPrintable(bytes);
+ } catch (DecoderException e) {
+ Log.e(LOG_TAG, "Failed to decode quoted-printable: " + e);
+ return "";
+ }
+
+ try {
+ return new String(bytes, targetCharset);
+ } catch (UnsupportedEncodingException e) {
+ Log.e(LOG_TAG, "Failed to encode: charset=" + targetCharset);
+ return new String(bytes);
+ }
+ }
+ // Unknown encoding. Fall back to default.
+ }
+ return encodeString(value, targetCharset);
+ }
+
+ public void propertyValues(List<String> values) {
+ if (values == null || values.size() == 0) {
+ mCurrentPropNode.propValue_bytes = null;
+ mCurrentPropNode.propValue_vector.clear();
+ mCurrentPropNode.propValue_vector.add("");
+ mCurrentPropNode.propValue = "";
+ return;
+ }
+
+ ContentValues paramMap = mCurrentPropNode.paramMap;
+
+ String targetCharset = CharsetUtils.nameForDefaultVendor(paramMap.getAsString("CHARSET"));
+ String encoding = paramMap.getAsString("ENCODING");
+
+ if (targetCharset == null || targetCharset.length() == 0) {
+ targetCharset = mTargetCharset;
+ }
+
+ for (String value : values) {
+ mCurrentPropNode.propValue_vector.add(
+ handleOneValue(value, targetCharset, encoding));
+ }
+
+ mCurrentPropNode.propValue = listToString(mCurrentPropNode.propValue_vector);
+ }
+
+ public void showDebugInfo() {
+ Log.d(LOG_TAG, "time for creating ContactStruct: " + mTimeCreateContactStruct + " ms");
+ Log.d(LOG_TAG, "time for insert ContactStruct to database: " +
+ mTimePushIntoContentResolver + " ms");
+ }
+
+ private String listToString(List<String> list){
+ int size = list.size();
+ if (size > 1) {
+ StringBuilder builder = new StringBuilder();
+ int i = 0;
+ for (String type : list) {
+ builder.append(type);
+ if (i < size - 1) {
+ builder.append(";");
+ }
+ }
+ return builder.toString();
+ } else if (size == 1) {
+ return list.get(0);
+ } else {
+ return "";
+ }
+ }
+}
diff --git a/core/java/android/syncml/pim/vcard/VCardEntryCounter.java b/core/java/android/syncml/pim/vcard/VCardEntryCounter.java
new file mode 100644
index 0000000..03cd1d9
--- /dev/null
+++ b/core/java/android/syncml/pim/vcard/VCardEntryCounter.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.syncml.pim.vcard;
+
+import java.util.List;
+
+import android.syncml.pim.VBuilder;
+
+public class VCardEntryCounter implements VBuilder {
+ private int mCount;
+
+ public int getCount() {
+ return mCount;
+ }
+
+ public void start() {
+ }
+
+ public void end() {
+ }
+
+ public void startRecord(String type) {
+ }
+
+ public void endRecord() {
+ mCount++;
+ }
+
+ public void startProperty() {
+ }
+
+ public void endProperty() {
+ }
+
+ public void propertyGroup(String group) {
+ }
+
+ public void propertyName(String name) {
+ }
+
+ public void propertyParamType(String type) {
+ }
+
+ public void propertyParamValue(String value) {
+ }
+
+ public void propertyValues(List<String> values) {
+ }
+} \ No newline at end of file
diff --git a/core/java/android/syncml/pim/vcard/VCardNestedException.java b/core/java/android/syncml/pim/vcard/VCardNestedException.java
new file mode 100644
index 0000000..def6f3b
--- /dev/null
+++ b/core/java/android/syncml/pim/vcard/VCardNestedException.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.syncml.pim.vcard;
+
+/**
+ * VCardException thrown when VCard is nested without VCardParser's being notified.
+ */
+public class VCardNestedException extends VCardException {
+ public VCardNestedException() {}
+ public VCardNestedException(String message) {
+ super(message);
+ }
+}
diff --git a/core/java/android/syncml/pim/vcard/VCardParser_V21.java b/core/java/android/syncml/pim/vcard/VCardParser_V21.java
index f853c5e..d865668 100644
--- a/core/java/android/syncml/pim/vcard/VCardParser_V21.java
+++ b/core/java/android/syncml/pim/vcard/VCardParser_V21.java
@@ -17,21 +17,26 @@
package android.syncml.pim.vcard;
import android.syncml.pim.VBuilder;
+import android.syncml.pim.VParser;
+import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.Reader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
-import java.util.regex.Pattern;
/**
- * This class is used to parse vcard. Please refer to vCard Specification 2.1
+ * This class is used to parse vcard. Please refer to vCard Specification 2.1.
*/
public class VCardParser_V21 {
-
+ private static final String LOG_TAG = "VCardParser_V21";
+
+ public static final String DEFAULT_CHARSET = VParser.DEFAULT_CHARSET;
+
/** Store the known-type */
private static final HashSet<String> sKnownTypeSet = new HashSet<String>(
Arrays.asList("DOM", "INTL", "POSTAL", "PARCEL", "HOME", "WORK",
@@ -42,19 +47,17 @@ public class VCardParser_V21 {
"CGM", "WMF", "BMP", "MET", "PMB", "DIB", "PICT", "TIFF",
"PDF", "PS", "JPEG", "QTIME", "MPEG", "MPEG2", "AVI",
"WAVE", "AIFF", "PCM", "X509", "PGP"));
-
+
/** Store the known-value */
private static final HashSet<String> sKnownValueSet = new HashSet<String>(
Arrays.asList("INLINE", "URL", "CONTENT-ID", "CID"));
- /** Store the property name available in vCard 2.1 */
- // NICKNAME is not supported in vCard 2.1, but some vCard may contain.
+ /** Store the property names available in vCard 2.1 */
private static final HashSet<String> sAvailablePropertyNameV21 =
new HashSet<String>(Arrays.asList(
- "LOGO", "PHOTO", "LABEL", "FN", "TITLE", "SOUND",
+ "BEGIN", "LOGO", "PHOTO", "LABEL", "FN", "TITLE", "SOUND",
"VERSION", "TEL", "EMAIL", "TZ", "GEO", "NOTE", "URL",
- "BDAY", "ROLE", "REV", "UID", "KEY", "MAILER",
- "NICKNAME"));
+ "BDAY", "ROLE", "REV", "UID", "KEY", "MAILER"));
// Though vCard 2.1 specification does not allow "B" encoding, some data may have it.
// We allow it for safety...
@@ -76,6 +79,30 @@ public class VCardParser_V21 {
// Should not directly read a line from this. Use getLine() instead.
protected BufferedReader mReader;
+ private boolean mCanceled;
+
+ // In some cases, vCard is nested. Currently, we only consider the most interior vCard data.
+ // See v21_foma_1.vcf in test directory for more information.
+ private int mNestCount;
+
+ // In order to reduce warning message as much as possible, we hold the value which made Logger
+ // emit a warning message.
+ protected HashSet<String> mWarningValueMap = new HashSet<String>();
+
+ // Just for debugging
+ private long mTimeTotal;
+ private long mTimeStartRecord;
+ private long mTimeEndRecord;
+ private long mTimeStartProperty;
+ private long mTimeEndProperty;
+ private long mTimeParseItems;
+ private long mTimeParseItem1;
+ private long mTimeParseItem2;
+ private long mTimeParseItem3;
+ private long mTimeHandlePropertyValue1;
+ private long mTimeHandlePropertyValue2;
+ private long mTimeHandlePropertyValue3;
+
/**
* Create a new VCard parser.
*/
@@ -83,12 +110,35 @@ public class VCardParser_V21 {
super();
}
+ public VCardParser_V21(VCardSourceDetector detector) {
+ super();
+ if (detector != null && detector.getType() == VCardSourceDetector.TYPE_FOMA) {
+ mNestCount = 1;
+ }
+ }
+
/**
* Parse the file at the given position
* vcard_file = [wsls] vcard [wsls]
*/
protected void parseVCardFile() throws IOException, VCardException {
- while (parseOneVCard()) {
+ boolean firstReading = true;
+ while (true) {
+ if (mCanceled) {
+ break;
+ }
+ if (!parseOneVCard(firstReading)) {
+ break;
+ }
+ firstReading = false;
+ }
+
+ if (mNestCount > 0) {
+ boolean useCache = true;
+ for (int i = 0; i < mNestCount; i++) {
+ readEndVCard(useCache, true);
+ useCache = false;
+ }
}
}
@@ -100,7 +150,13 @@ public class VCardParser_V21 {
* @return true when the propertyName is a valid property name.
*/
protected boolean isValidPropertyName(String propertyName) {
- return sAvailablePropertyNameV21.contains(propertyName.toUpperCase());
+ if (!(sAvailablePropertyNameV21.contains(propertyName.toUpperCase()) ||
+ propertyName.startsWith("X-")) &&
+ !mWarningValueMap.contains(propertyName)) {
+ mWarningValueMap.add(propertyName);
+ Log.w(LOG_TAG, "Property name unsupported by vCard 2.1: " + propertyName);
+ }
+ return true;
}
/**
@@ -129,7 +185,7 @@ public class VCardParser_V21 {
line = getLine();
if (line == null) {
throw new VCardException("Reached end of buffer.");
- } else if (line.trim().length() > 0) {
+ } else if (line.trim().length() > 0) {
return line;
}
}
@@ -140,12 +196,37 @@ public class VCardParser_V21 {
* items *CRLF
* "END" [ws] ":" [ws] "VCARD"
*/
- private boolean parseOneVCard() throws IOException, VCardException {
- if (!readBeginVCard()) {
+ private boolean parseOneVCard(boolean firstReading) throws IOException, VCardException {
+ boolean allowGarbage = false;
+ if (firstReading) {
+ if (mNestCount > 0) {
+ for (int i = 0; i < mNestCount; i++) {
+ if (!readBeginVCard(allowGarbage)) {
+ return false;
+ }
+ allowGarbage = true;
+ }
+ }
+ }
+
+ if (!readBeginVCard(allowGarbage)) {
return false;
}
+ long start;
+ if (mBuilder != null) {
+ start = System.currentTimeMillis();
+ mBuilder.startRecord("VCARD");
+ mTimeStartRecord += System.currentTimeMillis() - start;
+ }
+ start = System.currentTimeMillis();
parseItems();
- readEndVCard();
+ mTimeParseItems += System.currentTimeMillis() - start;
+ readEndVCard(true, false);
+ if (mBuilder != null) {
+ start = System.currentTimeMillis();
+ mBuilder.endRecord();
+ mTimeEndRecord += System.currentTimeMillis() - start;
+ }
return true;
}
@@ -154,46 +235,102 @@ public class VCardParser_V21 {
* @throws IOException
* @throws VCardException
*/
- protected boolean readBeginVCard() throws IOException, VCardException {
+ protected boolean readBeginVCard(boolean allowGarbage)
+ throws IOException, VCardException {
String line;
- while (true) {
- line = getLine();
- if (line == null) {
- return false;
- } else if (line.trim().length() > 0) {
- break;
+ do {
+ while (true) {
+ line = getLine();
+ if (line == null) {
+ return false;
+ } else if (line.trim().length() > 0) {
+ break;
+ }
}
- }
- String[] strArray = line.split(":", 2);
-
- // Though vCard specification does not allow lower cases,
- // some data may have them, so we allow it.
- if (!(strArray.length == 2 &&
- strArray[0].trim().equalsIgnoreCase("BEGIN") &&
- strArray[1].trim().equalsIgnoreCase("VCARD"))) {
- throw new VCardException("BEGIN:VCARD != \"" + line + "\"");
- }
-
- if (mBuilder != null) {
- mBuilder.startRecord("VCARD");
- }
+ String[] strArray = line.split(":", 2);
+ int length = strArray.length;
- return true;
+ // Though vCard 2.1/3.0 specification does not allow lower cases,
+ // some data may have them, so we allow it (Actually, previous code
+ // had explicitly allowed "BEGIN:vCard" though there's no example).
+ //
+ // TODO: ignore non vCard entry (e.g. vcalendar).
+ // XXX: Not sure, but according to VDataBuilder.java, vcalendar
+ // entry
+ // may be nested. Just seeking "END:SOMETHING" may not be enough.
+ // e.g.
+ // BEGIN:VCARD
+ // ... (Valid. Must parse this)
+ // END:VCARD
+ // BEGIN:VSOMETHING
+ // ... (Must ignore this)
+ // BEGIN:VSOMETHING2
+ // ... (Must ignore this)
+ // END:VSOMETHING2
+ // ... (Must ignore this!)
+ // END:VSOMETHING
+ // BEGIN:VCARD
+ // ... (Valid. Must parse this)
+ // END:VCARD
+ // INVALID_STRING (VCardException should be thrown)
+ if (length == 2 &&
+ strArray[0].trim().equalsIgnoreCase("BEGIN") &&
+ strArray[1].trim().equalsIgnoreCase("VCARD")) {
+ return true;
+ } else if (!allowGarbage) {
+ if (mNestCount > 0) {
+ mPreviousLine = line;
+ return false;
+ } else {
+ throw new VCardException(
+ "Expected String \"BEGIN:VCARD\" did not come "
+ + "(Instead, \"" + line + "\" came)");
+ }
+ }
+ } while(allowGarbage);
+
+ throw new VCardException("Reached where must not be reached.");
}
-
- protected void readEndVCard() throws VCardException {
- // Though vCard specification does not allow lower cases,
- // some data may have them, so we allow it.
- String[] strArray = mPreviousLine.split(":", 2);
- if (!(strArray.length == 2 &&
- strArray[0].trim().equalsIgnoreCase("END") &&
- strArray[1].trim().equalsIgnoreCase("VCARD"))) {
- throw new VCardException("END:VCARD != \"" + mPreviousLine + "\"");
- }
-
- if (mBuilder != null) {
- mBuilder.endRecord();
- }
+
+ /**
+ * The arguments useCache and allowGarbase are usually true and false accordingly when
+ * this function is called outside this function itself.
+ *
+ * @param useCache When true, line is obtained from mPreviousline. Otherwise, getLine()
+ * is used.
+ * @param allowGarbage When true, ignore non "END:VCARD" line.
+ * @throws IOException
+ * @throws VCardException
+ */
+ protected void readEndVCard(boolean useCache, boolean allowGarbage)
+ throws IOException, VCardException {
+ String line;
+ do {
+ if (useCache) {
+ // Though vCard specification does not allow lower cases,
+ // some data may have them, so we allow it.
+ line = mPreviousLine;
+ } else {
+ while (true) {
+ line = getLine();
+ if (line == null) {
+ throw new VCardException("Expected END:VCARD was not found.");
+ } else if (line.trim().length() > 0) {
+ break;
+ }
+ }
+ }
+
+ String[] strArray = line.split(":", 2);
+ if (strArray.length == 2 &&
+ strArray[0].trim().equalsIgnoreCase("END") &&
+ strArray[1].trim().equalsIgnoreCase("VCARD")) {
+ return;
+ } else if (!allowGarbage) {
+ throw new VCardException("END:VCARD != \"" + mPreviousLine + "\"");
+ }
+ useCache = false;
+ } while (allowGarbage);
}
/**
@@ -205,32 +342,33 @@ public class VCardParser_V21 {
boolean ended = false;
if (mBuilder != null) {
+ long start = System.currentTimeMillis();
mBuilder.startProperty();
+ mTimeStartProperty += System.currentTimeMillis() - start;
}
-
- try {
- ended = parseItem();
- } finally {
- if (mBuilder != null) {
- mBuilder.endProperty();
- }
+ ended = parseItem();
+ if (mBuilder != null && !ended) {
+ long start = System.currentTimeMillis();
+ mBuilder.endProperty();
+ mTimeEndProperty += System.currentTimeMillis() - start;
}
while (!ended) {
// follow VCARD ,it wont reach endProperty
if (mBuilder != null) {
+ long start = System.currentTimeMillis();
mBuilder.startProperty();
+ mTimeStartProperty += System.currentTimeMillis() - start;
}
- try {
- ended = parseItem();
- } finally {
- if (mBuilder != null) {
- mBuilder.endProperty();
- }
+ ended = parseItem();
+ if (mBuilder != null && !ended) {
+ long start = System.currentTimeMillis();
+ mBuilder.endProperty();
+ mTimeEndProperty += System.currentTimeMillis() - start;
}
}
}
-
+
/**
* item = [groups "."] name [params] ":" value CRLF
* / [groups "."] "ADR" [params] ":" addressparts CRLF
@@ -241,57 +379,134 @@ public class VCardParser_V21 {
protected boolean parseItem() throws IOException, VCardException {
mEncoding = sDefaultEncoding;
- // params = ";" [ws] paramlist
String line = getNonEmptyLine();
- String[] strArray = line.split(":", 2);
- if (strArray.length < 2) {
- throw new VCardException("Invalid line(\":\" does not exist): " + line);
- }
- String propertyValue = strArray[1];
- String[] groupNameParamsArray = strArray[0].split(";");
- String groupAndName = groupNameParamsArray[0].trim();
- String[] groupNameArray = groupAndName.split("\\.");
- int length = groupNameArray.length;
- String propertyName = groupNameArray[length - 1];
- if (mBuilder != null) {
- mBuilder.propertyName(propertyName);
- for (int i = 0; i < length - 1; i++) {
- mBuilder.propertyGroup(groupNameArray[i]);
- }
- }
- if (propertyName.equalsIgnoreCase("END")) {
- mPreviousLine = line;
+ long start = System.currentTimeMillis();
+
+ String[] propertyNameAndValue = separateLineAndHandleGroup(line);
+ if (propertyNameAndValue == null) {
return true;
}
-
- length = groupNameParamsArray.length;
- for (int i = 1; i < length; i++) {
- handleParams(groupNameParamsArray[i]);
+ if (propertyNameAndValue.length != 2) {
+ throw new VCardException("Invalid line \"" + line + "\"");
}
-
- if (isValidPropertyName(propertyName) ||
- propertyName.startsWith("X-")) {
- if (propertyName.equals("VERSION") &&
- !propertyValue.equals(getVersion())) {
- throw new VCardVersionException("Incompatible version: " +
- propertyValue + " != " + getVersion());
- }
- handlePropertyValue(propertyName, propertyValue);
- return false;
- } else if (propertyName.equals("ADR") ||
+ String propertyName = propertyNameAndValue[0].toUpperCase();
+ String propertyValue = propertyNameAndValue[1];
+
+ mTimeParseItem1 += System.currentTimeMillis() - start;
+
+ if (propertyName.equals("ADR") ||
propertyName.equals("ORG") ||
propertyName.equals("N")) {
+ start = System.currentTimeMillis();
handleMultiplePropertyValue(propertyName, propertyValue);
+ mTimeParseItem3 += System.currentTimeMillis() - start;
return false;
} else if (propertyName.equals("AGENT")) {
handleAgent(propertyValue);
return false;
+ } else if (isValidPropertyName(propertyName)) {
+ if (propertyName.equals("BEGIN")) {
+ if (propertyValue.equals("VCARD")) {
+ throw new VCardNestedException("This vCard has nested vCard data in it.");
+ } else {
+ throw new VCardException("Unknown BEGIN type: " + propertyValue);
+ }
+ } else if (propertyName.equals("VERSION") &&
+ !propertyValue.equals(getVersion())) {
+ throw new VCardVersionException("Incompatible version: " +
+ propertyValue + " != " + getVersion());
+ }
+ start = System.currentTimeMillis();
+ handlePropertyValue(propertyName, propertyValue);
+ mTimeParseItem2 += System.currentTimeMillis() - start;
+ return false;
}
throw new VCardException("Unknown property name: \"" +
propertyName + "\"");
}
+ static private final int STATE_GROUP_OR_PROPNAME = 0;
+ static private final int STATE_PARAMS = 1;
+ // vCard 3.1 specification allows double-quoted param-value, while vCard 2.1 does not.
+ // This is just for safety.
+ static private final int STATE_PARAMS_IN_DQUOTE = 2;
+
+ protected String[] separateLineAndHandleGroup(String line) throws VCardException {
+ int length = line.length();
+ int state = STATE_GROUP_OR_PROPNAME;
+ int nameIndex = 0;
+
+ String[] propertyNameAndValue = new String[2];
+
+ for (int i = 0; i < length; i++) {
+ char ch = line.charAt(i);
+ switch (state) {
+ case STATE_GROUP_OR_PROPNAME:
+ if (ch == ':') {
+ String propertyName = line.substring(nameIndex, i);
+ if (propertyName.equalsIgnoreCase("END")) {
+ mPreviousLine = line;
+ return null;
+ }
+ if (mBuilder != null) {
+ mBuilder.propertyName(propertyName);
+ }
+ propertyNameAndValue[0] = propertyName;
+ if (i < length - 1) {
+ propertyNameAndValue[1] = line.substring(i + 1);
+ } else {
+ propertyNameAndValue[1] = "";
+ }
+ return propertyNameAndValue;
+ } else if (ch == '.') {
+ String groupName = line.substring(nameIndex, i);
+ if (mBuilder != null) {
+ mBuilder.propertyGroup(groupName);
+ }
+ nameIndex = i + 1;
+ } else if (ch == ';') {
+ String propertyName = line.substring(nameIndex, i);
+ if (propertyName.equalsIgnoreCase("END")) {
+ mPreviousLine = line;
+ return null;
+ }
+ if (mBuilder != null) {
+ mBuilder.propertyName(propertyName);
+ }
+ propertyNameAndValue[0] = propertyName;
+ nameIndex = i + 1;
+ state = STATE_PARAMS;
+ }
+ break;
+ case STATE_PARAMS:
+ if (ch == '"') {
+ state = STATE_PARAMS_IN_DQUOTE;
+ } else if (ch == ';') {
+ handleParams(line.substring(nameIndex, i));
+ nameIndex = i + 1;
+ } else if (ch == ':') {
+ handleParams(line.substring(nameIndex, i));
+ if (i < length - 1) {
+ propertyNameAndValue[1] = line.substring(i + 1);
+ } else {
+ propertyNameAndValue[1] = "";
+ }
+ return propertyNameAndValue;
+ }
+ break;
+ case STATE_PARAMS_IN_DQUOTE:
+ if (ch == '"') {
+ state = STATE_PARAMS;
+ }
+ break;
+ }
+ }
+
+ throw new VCardException("Invalid line: \"" + line + "\"");
+ }
+
+
/**
* params = ";" [ws] paramlist
* paramlist = paramlist [ws] ";" [ws] param
@@ -330,18 +545,19 @@ public class VCardParser_V21 {
}
/**
- * typeval = knowntype / "X-" word
+ * ptypeval = knowntype / "X-" word
*/
- protected void handleType(String ptypeval) throws VCardException {
- if (sKnownTypeSet.contains(ptypeval.toUpperCase()) ||
- ptypeval.startsWith("X-")) {
- if (mBuilder != null) {
- mBuilder.propertyParamType("TYPE");
- mBuilder.propertyParamValue(ptypeval.toUpperCase());
- }
- } else {
- throw new VCardException("Unknown type: \"" + ptypeval + "\"");
- }
+ protected void handleType(String ptypeval) {
+ String upperTypeValue = ptypeval;
+ if (!(sKnownTypeSet.contains(upperTypeValue) || upperTypeValue.startsWith("X-")) &&
+ !mWarningValueMap.contains(ptypeval)) {
+ mWarningValueMap.add(ptypeval);
+ Log.w(LOG_TAG, "Type unsupported by vCard 2.1: " + ptypeval);
+ }
+ if (mBuilder != null) {
+ mBuilder.propertyParamType("TYPE");
+ mBuilder.propertyParamValue(upperTypeValue);
+ }
}
/**
@@ -427,31 +643,48 @@ public class VCardParser_V21 {
protected void handlePropertyValue(
String propertyName, String propertyValue) throws
IOException, VCardException {
- if (mEncoding == null || mEncoding.equalsIgnoreCase("7BIT")
- || mEncoding.equalsIgnoreCase("8BIT")
- || mEncoding.toUpperCase().startsWith("X-")) {
- if (mBuilder != null) {
- ArrayList<String> v = new ArrayList<String>();
- v.add(maybeUnescapeText(propertyValue));
- mBuilder.propertyValues(v);
- }
- } else if (mEncoding.equalsIgnoreCase("QUOTED-PRINTABLE")) {
+ if (mEncoding.equalsIgnoreCase("QUOTED-PRINTABLE")) {
+ long start = System.currentTimeMillis();
String result = getQuotedPrintable(propertyValue);
if (mBuilder != null) {
ArrayList<String> v = new ArrayList<String>();
v.add(result);
mBuilder.propertyValues(v);
}
+ mTimeHandlePropertyValue2 += System.currentTimeMillis() - start;
} else if (mEncoding.equalsIgnoreCase("BASE64") ||
mEncoding.equalsIgnoreCase("B")) {
- String result = getBase64(propertyValue);
+ long start = System.currentTimeMillis();
+ // It is very rare, but some BASE64 data may be so big that
+ // OutOfMemoryError occurs. To ignore such cases, use try-catch.
+ try {
+ String result = getBase64(propertyValue);
+ if (mBuilder != null) {
+ ArrayList<String> v = new ArrayList<String>();
+ v.add(result);
+ mBuilder.propertyValues(v);
+ }
+ } catch (OutOfMemoryError error) {
+ Log.e(LOG_TAG, "OutOfMemoryError happened during parsing BASE64 data!");
+ if (mBuilder != null) {
+ mBuilder.propertyValues(null);
+ }
+ }
+ mTimeHandlePropertyValue3 += System.currentTimeMillis() - start;
+ } else {
+ if (!(mEncoding == null || mEncoding.equalsIgnoreCase("7BIT")
+ || mEncoding.equalsIgnoreCase("8BIT")
+ || mEncoding.toUpperCase().startsWith("X-"))) {
+ Log.w(LOG_TAG, "The encoding unsupported by vCard spec: \"" + mEncoding + "\".");
+ }
+
+ long start = System.currentTimeMillis();
if (mBuilder != null) {
ArrayList<String> v = new ArrayList<String>();
- v.add(result);
+ v.add(maybeUnescapeText(propertyValue));
mBuilder.propertyValues(v);
- }
- } else {
- throw new VCardException("Unknown encoding: \"" + mEncoding + "\"");
+ }
+ mTimeHandlePropertyValue1 += System.currentTimeMillis() - start;
}
}
@@ -546,57 +779,51 @@ public class VCardParser_V21 {
if (mEncoding.equalsIgnoreCase("QUOTED-PRINTABLE")) {
propertyValue = getQuotedPrintable(propertyValue);
}
-
- if (propertyValue.endsWith("\\")) {
+
+ if (mBuilder != null) {
+ // TODO: limit should be set in accordance with propertyName?
StringBuilder builder = new StringBuilder();
- // builder.append(propertyValue);
- builder.append(propertyValue.substring(0, propertyValue.length() - 1));
- try {
- String line;
- while (true) {
- line = getNonEmptyLine();
- // builder.append("\r\n");
- // builder.append(line);
- if (!line.endsWith("\\")) {
- builder.append(line);
- break;
+ ArrayList<String> list = new ArrayList<String>();
+ int length = propertyValue.length();
+ for (int i = 0; i < length; i++) {
+ char ch = propertyValue.charAt(i);
+ if (ch == '\\' && i < length - 1) {
+ char nextCh = propertyValue.charAt(i + 1);
+ String unescapedString = maybeUnescape(nextCh);
+ if (unescapedString != null) {
+ builder.append(unescapedString);
+ i++;
} else {
- builder.append(line.substring(0, line.length() - 1));
+ builder.append(ch);
}
+ } else if (ch == ';') {
+ list.add(builder.toString());
+ builder = new StringBuilder();
+ } else {
+ builder.append(ch);
}
- } catch (IOException e) {
- throw new VCardException(
- "IOException is throw during reading propertyValue" + e);
}
- // Now, propertyValue may contain "\r\n"
- propertyValue = builder.toString();
- }
-
- if (mBuilder != null) {
- // In String#replaceAll() and Pattern class, "\\\\" means single slash.
-
- final String IMPOSSIBLE_STRING = "\0";
- // First replace two backslashes with impossible strings.
- propertyValue = propertyValue.replaceAll("\\\\\\\\", IMPOSSIBLE_STRING);
-
- // Now, split propertyValue with ; whose previous char is not back slash.
- Pattern pattern = Pattern.compile("(?<!\\\\);");
- // TODO: limit should be set in accordance with propertyName?
- String[] strArray = pattern.split(propertyValue, -1);
- ArrayList<String> arrayList = new ArrayList<String>();
- for (String str : strArray) {
- // Replace impossible strings with original two backslashes
- arrayList.add(
- unescapeText(str.replaceAll(IMPOSSIBLE_STRING, "\\\\\\\\")));
- }
- mBuilder.propertyValues(arrayList);
+ list.add(builder.toString());
+ mBuilder.propertyValues(list);
}
}
/**
* vCard 2.1 specifies AGENT allows one vcard entry. It is not encoded at all.
+ *
+ * item = ...
+ * / [groups "."] "AGENT"
+ * [params] ":" vcard CRLF
+ * vcard = "BEGIN" [ws] ":" [ws] "VCARD" [ws] 1*CRLF
+ * items *CRLF "END" [ws] ":" [ws] "VCARD"
+ *
*/
- protected void handleAgent(String propertyValue) throws IOException, VCardException {
+ protected void handleAgent(String propertyValue) throws VCardException {
+ throw new VCardException("AGENT Property is not supported.");
+ /* This is insufficient support. Also, AGENT Property is very rare.
+ Ignore it for now.
+ TODO: fix this.
+
String[] strArray = propertyValue.split(":", 2);
if (!(strArray.length == 2 ||
strArray[0].trim().equalsIgnoreCase("BEGIN") &&
@@ -605,6 +832,7 @@ public class VCardParser_V21 {
}
parseItems();
readEndVCard();
+ */
}
/**
@@ -615,17 +843,18 @@ public class VCardParser_V21 {
}
/**
- * Convert escaped text into unescaped text.
+ * Returns unescaped String if the character should be unescaped. Return null otherwise.
+ * e.g. In vCard 2.1, "\;" should be unescaped into ";" while "\x" should not be.
*/
- protected String unescapeText(String text) {
+ protected String maybeUnescape(char ch) {
// Original vCard 2.1 specification does not allow transformation
// "\:" -> ":", "\," -> ",", and "\\" -> "\", but previous implementation of
// this class allowed them, so keep it as is.
- // In String#replaceAll(), "\\\\" means single slash.
- return text.replaceAll("\\\\;", ";")
- .replaceAll("\\\\:", ":")
- .replaceAll("\\\\,", ",")
- .replaceAll("\\\\\\\\", "\\\\");
+ if (ch == '\\' || ch == ';' || ch == ':' || ch == ',') {
+ return String.valueOf(ch);
+ } else {
+ return null;
+ }
}
/**
@@ -656,12 +885,15 @@ public class VCardParser_V21 {
*/
public boolean parse(InputStream is, String charset, VBuilder builder)
throws IOException, VCardException {
+ // TODO: make this count error entries instead of just throwing VCardException.
+
// TODO: If we really need to allow only CRLF as line break,
// we will have to develop our own BufferedReader().
- mReader = new BufferedReader(new InputStreamReader(is, charset));
+ mReader = new CustomBufferedReader(new InputStreamReader(is, charset));
mBuilder = builder;
+ long start = System.currentTimeMillis();
if (mBuilder != null) {
mBuilder.start();
}
@@ -669,9 +901,50 @@ public class VCardParser_V21 {
if (mBuilder != null) {
mBuilder.end();
}
+ mTimeTotal += System.currentTimeMillis() - start;
+
return true;
}
+ public boolean parse(InputStream is, VBuilder builder) throws IOException, VCardException {
+ return parse(is, DEFAULT_CHARSET, builder);
+ }
+
+ /**
+ * Cancel parsing.
+ * Actual cancel is done after the end of the current one vcard entry parsing.
+ */
+ public void cancel() {
+ mCanceled = true;
+ }
+
+ /**
+ * It is very, very rare case, but there is a case where
+ * canceled may be already true outside this object.
+ * @hide
+ */
+ public void parse(InputStream is, String charset, VBuilder builder, boolean canceled)
+ throws IOException, VCardException {
+ mCanceled = canceled;
+ parse(is, charset, builder);
+ }
+
+ public void showDebugInfo() {
+ Log.d(LOG_TAG, "total parsing time: " + mTimeTotal + " ms");
+ if (mReader instanceof CustomBufferedReader) {
+ Log.d(LOG_TAG, "total readLine time: " +
+ ((CustomBufferedReader)mReader).getTotalmillisecond() + " ms");
+ }
+ Log.d(LOG_TAG, "mTimeStartRecord: " + mTimeStartRecord + " ms");
+ Log.d(LOG_TAG, "mTimeEndRecord: " + mTimeEndRecord + " ms");
+ Log.d(LOG_TAG, "mTimeParseItem1: " + mTimeParseItem1 + " ms");
+ Log.d(LOG_TAG, "mTimeParseItem2: " + mTimeParseItem2 + " ms");
+ Log.d(LOG_TAG, "mTimeParseItem3: " + mTimeParseItem3 + " ms");
+ Log.d(LOG_TAG, "mTimeHandlePropertyValue1: " + mTimeHandlePropertyValue1 + " ms");
+ Log.d(LOG_TAG, "mTimeHandlePropertyValue2: " + mTimeHandlePropertyValue2 + " ms");
+ Log.d(LOG_TAG, "mTimeHandlePropertyValue3: " + mTimeHandlePropertyValue3 + " ms");
+ }
+
private boolean isLetter(char ch) {
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
return true;
@@ -679,3 +952,24 @@ public class VCardParser_V21 {
return false;
}
}
+
+class CustomBufferedReader extends BufferedReader {
+ private long mTime;
+
+ public CustomBufferedReader(Reader in) {
+ super(in);
+ }
+
+ @Override
+ public String readLine() throws IOException {
+ long start = System.currentTimeMillis();
+ String ret = super.readLine();
+ long end = System.currentTimeMillis();
+ mTime += end - start;
+ return ret;
+ }
+
+ public long getTotalmillisecond() {
+ return mTime;
+ }
+}
diff --git a/core/java/android/syncml/pim/vcard/VCardParser_V30.java b/core/java/android/syncml/pim/vcard/VCardParser_V30.java
index 901bd49..e67525e 100644
--- a/core/java/android/syncml/pim/vcard/VCardParser_V30.java
+++ b/core/java/android/syncml/pim/vcard/VCardParser_V30.java
@@ -16,8 +16,9 @@
package android.syncml.pim.vcard;
+import android.util.Log;
+
import java.io.IOException;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
@@ -26,9 +27,11 @@ import java.util.HashSet;
* Please refer to vCard Specification 3.0 (http://tools.ietf.org/html/rfc2426)
*/
public class VCardParser_V30 extends VCardParser_V21 {
+ private static final String LOG_TAG = "VCardParser_V30";
+
private static final HashSet<String> acceptablePropsWithParam = new HashSet<String>(
Arrays.asList(
- "LOGO", "PHOTO", "LABEL", "FN", "TITLE", "SOUND",
+ "BEGIN", "LOGO", "PHOTO", "LABEL", "FN", "TITLE", "SOUND",
"VERSION", "TEL", "EMAIL", "TZ", "GEO", "NOTE", "URL",
"BDAY", "ROLE", "REV", "UID", "KEY", "MAILER", // 2.1
"NAME", "PROFILE", "SOURCE", "NICKNAME", "CLASS",
@@ -51,8 +54,14 @@ public class VCardParser_V30 extends VCardParser_V21 {
@Override
protected boolean isValidPropertyName(String propertyName) {
- return acceptablePropsWithParam.contains(propertyName) ||
- acceptablePropsWithoutParam.contains(propertyName);
+ if (!(acceptablePropsWithParam.contains(propertyName) ||
+ acceptablePropsWithoutParam.contains(propertyName) ||
+ propertyName.startsWith("X-")) &&
+ !mWarningValueMap.contains(propertyName)) {
+ mWarningValueMap.add(propertyName);
+ Log.w(LOG_TAG, "Property name unsupported by vCard 3.0: " + propertyName);
+ }
+ return true;
}
@Override
@@ -100,7 +109,21 @@ public class VCardParser_V30 extends VCardParser_V21 {
}
} else if (line.charAt(0) == ' ' || line.charAt(0) == '\t') {
if (builder != null) {
- // TODO: Check whether MIME requires only one whitespace.
+ // See Section 5.8.1 of RFC 2425 (MIME-DIR document).
+ // Following is the excerpts from it.
+ //
+ // DESCRIPTION:This is a long description that exists on a long line.
+ //
+ // Can be represented as:
+ //
+ // DESCRIPTION:This is a long description
+ // that exists on a long line.
+ //
+ // It could also be represented as:
+ //
+ // DESCRIPTION:This is a long descrip
+ // tion that exists o
+ // n a long line.
builder.append(line.substring(1));
} else if (mPreviousLine != null) {
builder = new StringBuilder();
@@ -113,10 +136,13 @@ public class VCardParser_V30 extends VCardParser_V21 {
} else {
if (mPreviousLine == null) {
mPreviousLine = line;
+ if (builder != null) {
+ return builder.toString();
+ }
} else {
String ret = mPreviousLine;
mPreviousLine = line;
- return ret;
+ return ret;
}
}
}
@@ -130,15 +156,16 @@ public class VCardParser_V30 extends VCardParser_V21 {
* [group "."] "END" ":" "VCARD" 1*CRLF
*/
@Override
- protected boolean readBeginVCard() throws IOException, VCardException {
+ protected boolean readBeginVCard(boolean allowGarbage) throws IOException, VCardException {
// TODO: vCard 3.0 supports group.
- return super.readBeginVCard();
+ return super.readBeginVCard(allowGarbage);
}
@Override
- protected void readEndVCard() throws VCardException {
+ protected void readEndVCard(boolean useCache, boolean allowGarbage)
+ throws IOException, VCardException {
// TODO: vCard 3.0 supports group.
- super.readEndVCard();
+ super.readEndVCard(useCache, allowGarbage);
}
/**
@@ -214,23 +241,6 @@ public class VCardParser_V30 extends VCardParser_V21 {
throw new VCardException("AGENT in vCard 3.0 is not supported yet.");
}
- // vCard 3.0 supports "B" as BASE64 encoding.
- @Override
- protected void handlePropertyValue(
- String propertyName, String propertyValue) throws
- IOException, VCardException {
- if (mEncoding != null && mEncoding.equalsIgnoreCase("B")) {
- String result = getBase64(propertyValue);
- if (mBuilder != null) {
- ArrayList<String> v = new ArrayList<String>();
- v.add(result);
- mBuilder.propertyValues(v);
- }
- }
-
- super.handlePropertyValue(propertyName, propertyValue);
- }
-
/**
* vCard 3.0 does not require two CRLF at the last of BASE64 data.
* It only requires that data should be MIME-encoded.
@@ -259,27 +269,38 @@ public class VCardParser_V30 extends VCardParser_V21 {
}
/**
- * Return unescapeText(text).
- * In vCard 3.0, 8bit text is always encoded.
- */
- @Override
- protected String maybeUnescapeText(String text) {
- return unescapeText(text);
- }
-
- /**
* ESCAPED-CHAR = "\\" / "\;" / "\," / "\n" / "\N")
* ; \\ encodes \, \n or \N encodes newline
* ; \; encodes ;, \, encodes ,
- */
+ *
+ * Note: Apple escape ':' into '\:' while does not escape '\'
+ */
@Override
- protected String unescapeText(String text) {
- // In String#replaceAll(), "\\\\" means single slash.
- return text.replaceAll("\\\\;", ";")
- .replaceAll("\\\\:", ":")
- .replaceAll("\\\\,", ",")
- .replaceAll("\\\\n", "\r\n")
- .replaceAll("\\\\N", "\r\n")
- .replaceAll("\\\\\\\\", "\\\\");
+ protected String maybeUnescapeText(String text) {
+ StringBuilder builder = new StringBuilder();
+ int length = text.length();
+ for (int i = 0; i < length; i++) {
+ char ch = text.charAt(i);
+ if (ch == '\\' && i < length - 1) {
+ char next_ch = text.charAt(++i);
+ if (next_ch == 'n' || next_ch == 'N') {
+ builder.append("\r\n");
+ } else {
+ builder.append(next_ch);
+ }
+ } else {
+ builder.append(ch);
+ }
+ }
+ return builder.toString();
+ }
+
+ @Override
+ protected String maybeUnescape(char ch) {
+ if (ch == 'n' || ch == 'N') {
+ return "\r\n";
+ } else {
+ return String.valueOf(ch);
+ }
}
}
diff --git a/core/java/android/syncml/pim/vcard/VCardSourceDetector.java b/core/java/android/syncml/pim/vcard/VCardSourceDetector.java
new file mode 100644
index 0000000..8c48391
--- /dev/null
+++ b/core/java/android/syncml/pim/vcard/VCardSourceDetector.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.syncml.pim.vcard;
+
+import android.syncml.pim.VBuilder;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Class which tries to detects the source of the vCard from its properties.
+ * Currently this implementation is very premature.
+ * @hide
+ */
+public class VCardSourceDetector implements VBuilder {
+ // Should only be used in package.
+ static final int TYPE_UNKNOWN = 0;
+ static final int TYPE_APPLE = 1;
+ static final int TYPE_JAPANESE_MOBILE_PHONE = 2; // Used in Japanese mobile phones.
+ static final int TYPE_FOMA = 3; // Used in some Japanese FOMA mobile phones.
+ static final int TYPE_WINDOWS_MOBILE_JP = 4;
+ // TODO: Excel, etc.
+
+ private static Set<String> APPLE_SIGNS = new HashSet<String>(Arrays.asList(
+ "X-PHONETIC-FIRST-NAME", "X-PHONETIC-MIDDLE-NAME", "X-PHONETIC-LAST-NAME",
+ "X-ABADR", "X-ABUID"));
+
+ private static Set<String> JAPANESE_MOBILE_PHONE_SIGNS = new HashSet<String>(Arrays.asList(
+ "X-GNO", "X-GN", "X-REDUCTION"));
+
+ private static Set<String> WINDOWS_MOBILE_PHONE_SIGNS = new HashSet<String>(Arrays.asList(
+ "X-MICROSOFT-ASST_TEL", "X-MICROSOFT-ASSISTANT", "X-MICROSOFT-OFFICELOC"));
+
+ // Note: these signes appears before the signs of the other type (e.g. "X-GN").
+ // In other words, Japanese FOMA mobile phones are detected as FOMA, not JAPANESE_MOBILE_PHONES.
+ private static Set<String> FOMA_SIGNS = new HashSet<String>(Arrays.asList(
+ "X-SD-VERN", "X-SD-FORMAT_VER", "X-SD-CATEGORIES", "X-SD-CLASS", "X-SD-DCREATED",
+ "X-SD-DESCRIPTION"));
+ private static String TYPE_FOMA_CHARSET_SIGN = "X-SD-CHAR_CODE";
+
+ private int mType = TYPE_UNKNOWN;
+ // Some mobile phones (like FOMA) tells us the charset of the data.
+ private boolean mNeedParseSpecifiedCharset;
+ private String mSpecifiedCharset;
+
+ public void start() {
+ }
+
+ public void end() {
+ }
+
+ public void startRecord(String type) {
+ }
+
+ public void startProperty() {
+ mNeedParseSpecifiedCharset = false;
+ }
+
+ public void endProperty() {
+ }
+
+ public void endRecord() {
+ }
+
+ public void propertyGroup(String group) {
+ }
+
+ public void propertyName(String name) {
+ if (name.equalsIgnoreCase(TYPE_FOMA_CHARSET_SIGN)) {
+ mType = TYPE_FOMA;
+ mNeedParseSpecifiedCharset = true;
+ return;
+ }
+ if (mType != TYPE_UNKNOWN) {
+ return;
+ }
+ if (WINDOWS_MOBILE_PHONE_SIGNS.contains(name)) {
+ mType = TYPE_WINDOWS_MOBILE_JP;
+ } else if (FOMA_SIGNS.contains(name)) {
+ mType = TYPE_FOMA;
+ } else if (JAPANESE_MOBILE_PHONE_SIGNS.contains(name)) {
+ mType = TYPE_JAPANESE_MOBILE_PHONE;
+ } else if (APPLE_SIGNS.contains(name)) {
+ mType = TYPE_APPLE;
+ }
+ }
+
+ public void propertyParamType(String type) {
+ }
+
+ public void propertyParamValue(String value) {
+ }
+
+ public void propertyValues(List<String> values) {
+ if (mNeedParseSpecifiedCharset && values.size() > 0) {
+ mSpecifiedCharset = values.get(0);
+ }
+ }
+
+ int getType() {
+ return mType;
+ }
+
+ /**
+ * Return charset String guessed from the source's properties.
+ * This method must be called after parsing target file(s).
+ * @return Charset String. Null is returned if guessing the source fails.
+ */
+ public String getEstimatedCharset() {
+ if (mSpecifiedCharset != null) {
+ return mSpecifiedCharset;
+ }
+ switch (mType) {
+ case TYPE_WINDOWS_MOBILE_JP:
+ case TYPE_FOMA:
+ case TYPE_JAPANESE_MOBILE_PHONE:
+ return "SHIFT_JIS";
+ case TYPE_APPLE:
+ return "UTF-8";
+ default:
+ return null;
+ }
+ }
+}
diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java
index 0dc96c3..3156d8b 100644
--- a/core/java/android/text/format/DateFormat.java
+++ b/core/java/android/text/format/DateFormat.java
@@ -242,64 +242,48 @@ public class DateFormat {
/**
* Returns a {@link java.text.DateFormat} object that can format the time according
- * to the current user preference.
+ * to the current locale.
* @param context the application context
* @return the {@link java.text.DateFormat} object that properly formats the time.
*/
public static final java.text.DateFormat getTimeFormat(Context context) {
- boolean b24 = is24HourFormat(context);
- int res;
-
- if (b24) {
- res = R.string.twenty_four_hour_time_format;
- } else {
- res = R.string.twelve_hour_time_format;
- }
-
- return new java.text.SimpleDateFormat(context.getString(res));
+ return java.text.DateFormat.getTimeInstance(java.text.DateFormat.SHORT);
}
/**
- * Returns a {@link java.text.DateFormat} object that can format the date according
- * to the current user preference.
+ * Returns a {@link java.text.DateFormat} object that can format the date
+ * in short form (such as 12/31/1999) according
+ * to the current locale.
* @param context the application context
* @return the {@link java.text.DateFormat} object that properly formats the date.
*/
public static final java.text.DateFormat getDateFormat(Context context) {
- String value = getDateFormatString(context);
+ /*
+ * We use a resource string here instead of just DateFormat.SHORT
+ * so that we get a four-digit year instead a two-digit year.
+ */
+ String value = context.getString(R.string.numeric_date_format);
return new java.text.SimpleDateFormat(value);
}
/**
* Returns a {@link java.text.DateFormat} object that can format the date
- * in long form (such as December 31, 1999) based on user preference.
+ * in long form (such as December 31, 1999) for the current locale.
* @param context the application context
* @return the {@link java.text.DateFormat} object that formats the date in long form.
*/
public static final java.text.DateFormat getLongDateFormat(Context context) {
- String value = getDateFormatString(context);
- if (value.indexOf('M') < value.indexOf('d')) {
- value = context.getString(R.string.full_date_month_first);
- } else {
- value = context.getString(R.string.full_date_day_first);
- }
- return new java.text.SimpleDateFormat(value);
+ return java.text.DateFormat.getDateInstance(java.text.DateFormat.LONG);
}
/**
* Returns a {@link java.text.DateFormat} object that can format the date
- * in medium form (such as Dec. 31, 1999) based on user preference.
+ * in medium form (such as Dec. 31, 1999) for the current locale.
* @param context the application context
* @return the {@link java.text.DateFormat} object that formats the date in long form.
*/
public static final java.text.DateFormat getMediumDateFormat(Context context) {
- String value = getDateFormatString(context);
- if (value.indexOf('M') < value.indexOf('d')) {
- value = context.getString(R.string.medium_date_month_first);
- } else {
- value = context.getString(R.string.medium_date_day_first);
- }
- return new java.text.SimpleDateFormat(value);
+ return java.text.DateFormat.getDateInstance(java.text.DateFormat.MEDIUM);
}
/**
@@ -338,6 +322,12 @@ public class DateFormat {
}
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) {
diff --git a/core/java/android/text/format/DateUtils.java b/core/java/android/text/format/DateUtils.java
index 8a7cdd9..9073d82 100644
--- a/core/java/android/text/format/DateUtils.java
+++ b/core/java/android/text/format/DateUtils.java
@@ -62,15 +62,6 @@ public class DateUtils
com.android.internal.R.string.day_of_week_short_friday,
com.android.internal.R.string.day_of_week_short_saturday,
};
- private static final int[] sDaysShorter = new int[] {
- com.android.internal.R.string.day_of_week_shorter_sunday,
- com.android.internal.R.string.day_of_week_shorter_monday,
- com.android.internal.R.string.day_of_week_shorter_tuesday,
- com.android.internal.R.string.day_of_week_shorter_wednesday,
- com.android.internal.R.string.day_of_week_shorter_thursday,
- com.android.internal.R.string.day_of_week_shorter_friday,
- com.android.internal.R.string.day_of_week_shorter_saturday,
- };
private static final int[] sDaysShortest = new int[] {
com.android.internal.R.string.day_of_week_shortest_sunday,
com.android.internal.R.string.day_of_week_shortest_monday,
@@ -80,6 +71,20 @@ public class DateUtils
com.android.internal.R.string.day_of_week_shortest_friday,
com.android.internal.R.string.day_of_week_shortest_saturday,
};
+ private static final int[] sMonthsStandaloneLong = new int [] {
+ com.android.internal.R.string.month_long_standalone_january,
+ com.android.internal.R.string.month_long_standalone_february,
+ com.android.internal.R.string.month_long_standalone_march,
+ com.android.internal.R.string.month_long_standalone_april,
+ com.android.internal.R.string.month_long_standalone_may,
+ com.android.internal.R.string.month_long_standalone_june,
+ com.android.internal.R.string.month_long_standalone_july,
+ com.android.internal.R.string.month_long_standalone_august,
+ com.android.internal.R.string.month_long_standalone_september,
+ com.android.internal.R.string.month_long_standalone_october,
+ com.android.internal.R.string.month_long_standalone_november,
+ com.android.internal.R.string.month_long_standalone_december,
+ };
private static final int[] sMonthsLong = new int [] {
com.android.internal.R.string.month_long_january,
com.android.internal.R.string.month_long_february,
@@ -127,7 +132,7 @@ public class DateUtils
com.android.internal.R.string.pm,
};
private static Configuration sLastConfig;
- private static String sStatusTimeFormat;
+ private static java.text.DateFormat sStatusTimeFormat;
private static String sElapsedFormatMMSS;
private static String sElapsedFormatHMMSS;
@@ -255,18 +260,15 @@ public class DateUtils
* For use with the 'abbrev' parameter of {@link #getDayOfWeekString} and {@link #getMonthString}.
* @more
* <p>e.g. "Su" or "Jan"
- * <p>In some languages, the results returned for LENGTH_SHORT may be the same as
- * return for {@link #LENGTH_MEDIUM}.
+ * <p>In most languages, the results returned for LENGTH_SHORT will be the same as
+ * the results returned for {@link #LENGTH_MEDIUM}.
*/
public static final int LENGTH_SHORT = 30;
/**
* Request an even shorter abbreviated version of the name.
- * For use with the 'abbrev' parameter of {@link #getDayOfWeekString} and {@link #getMonthString}.
- * @more
- * <p>e.g. "M", "Tu", "Th" or "J"
- * <p>In some languages, the results returned for LENGTH_SHORTEST may be the same as
- * return for {@link #LENGTH_SHORTER}.
+ * Do not use this. Currently this will always return the same result
+ * as {@link #LENGTH_SHORT}.
*/
public static final int LENGTH_SHORTER = 40;
@@ -275,8 +277,8 @@ public class DateUtils
* For use with the 'abbrev' parameter of {@link #getDayOfWeekString} and {@link #getMonthString}.
* @more
* <p>e.g. "S", "T", "T" or "J"
- * <p>In some languages, the results returned for LENGTH_SHORTEST may be the same as
- * return for {@link #LENGTH_SHORTER}.
+ * <p>In some languages, the results returned for LENGTH_SHORTEST will be the same as
+ * the results returned for {@link #LENGTH_SHORT}.
*/
public static final int LENGTH_SHORTEST = 50;
@@ -284,9 +286,12 @@ public class DateUtils
* Return a string for the day of the week.
* @param dayOfWeek One of {@link Calendar#SUNDAY Calendar.SUNDAY},
* {@link Calendar#MONDAY Calendar.MONDAY}, etc.
- * @param abbrev One of {@link #LENGTH_LONG}, {@link #LENGTH_SHORT}, {@link #LENGTH_SHORTER}
- * or {@link #LENGTH_SHORTEST}. For forward compatibility, anything else
- * will return the same as {#LENGTH_MEDIUM}.
+ * @param abbrev One of {@link #LENGTH_LONG}, {@link #LENGTH_SHORT},
+ * {@link #LENGTH_MEDIUM}, or {@link #LENGTH_SHORTEST}.
+ * Note that in most languages, {@link #LENGTH_SHORT}
+ * will return the same as {@link #LENGTH_MEDIUM}.
+ * Undefined lengths will return {@link #LENGTH_MEDIUM}
+ * but may return something different in the future.
* @throws IndexOutOfBoundsException if the dayOfWeek is out of bounds.
*/
public static String getDayOfWeekString(int dayOfWeek, int abbrev) {
@@ -295,7 +300,7 @@ public class DateUtils
case LENGTH_LONG: list = sDaysLong; break;
case LENGTH_MEDIUM: list = sDaysMedium; break;
case LENGTH_SHORT: list = sDaysShort; break;
- case LENGTH_SHORTER: list = sDaysShorter; break;
+ case LENGTH_SHORTER: list = sDaysShort; break;
case LENGTH_SHORTEST: list = sDaysShortest; break;
default: list = sDaysMedium; break;
}
@@ -316,13 +321,14 @@ public class DateUtils
}
/**
- * Return a localized string for the day of the week.
+ * Return a localized string for the month of the year.
* @param month One of {@link Calendar#JANUARY Calendar.JANUARY},
* {@link Calendar#FEBRUARY Calendar.FEBRUARY}, etc.
- * @param abbrev One of {@link #LENGTH_LONG}, {@link #LENGTH_SHORT}, {@link #LENGTH_SHORTER}
- * or {@link #LENGTH_SHORTEST}. For forward compatibility, anything else
- * will return the same as {#LENGTH_MEDIUM}.
- * @return Localized day of the week.
+ * @param abbrev One of {@link #LENGTH_LONG}, {@link #LENGTH_MEDIUM},
+ * or {@link #LENGTH_SHORTEST}.
+ * Undefined lengths will return {@link #LENGTH_MEDIUM}
+ * but may return something different in the future.
+ * @return Localized month of the year.
*/
public static String getMonthString(int month, int abbrev) {
// Note that here we use sMonthsMedium for MEDIUM, SHORT and SHORTER.
@@ -344,6 +350,40 @@ public class DateUtils
}
/**
+ * Return a localized string for the month of the year, for
+ * contexts where the month is not formatted together with
+ * a day of the month.
+ *
+ * @param month One of {@link Calendar#JANUARY Calendar.JANUARY},
+ * {@link Calendar#FEBRUARY Calendar.FEBRUARY}, etc.
+ * @param abbrev One of {@link #LENGTH_LONG}, {@link #LENGTH_MEDIUM},
+ * or {@link #LENGTH_SHORTEST}.
+ * Undefined lengths will return {@link #LENGTH_MEDIUM}
+ * but may return something different in the future.
+ * @return Localized month of the year.
+ * @hide Pending API council approval
+ */
+ public static String getStandaloneMonthString(int month, int abbrev) {
+ // Note that here we use sMonthsMedium for MEDIUM, SHORT and SHORTER.
+ // This is a shortcut to not spam the translators with too many variations
+ // of the same string. If we find that in a language the distinction
+ // is necessary, we can can add more without changing this API.
+ int[] list;
+ switch (abbrev) {
+ case LENGTH_LONG: list = sMonthsStandaloneLong;
+ break;
+ case LENGTH_MEDIUM: list = sMonthsMedium; break;
+ case LENGTH_SHORT: list = sMonthsMedium; break;
+ case LENGTH_SHORTER: list = sMonthsMedium; break;
+ case LENGTH_SHORTEST: list = sMonthsShortest; break;
+ default: list = sMonthsMedium; break;
+ }
+
+ Resources r = Resources.getSystem();
+ return r.getString(list[month - Calendar.JANUARY]);
+ }
+
+ /**
* Returns a string describing the elapsed time since startTime.
* @param startTime some time in the past.
* @return a String object containing the elapsed time.
@@ -572,7 +612,7 @@ public class DateUtils
Configuration cfg = r.getConfiguration();
if (sLastConfig == null || !sLastConfig.equals(cfg)) {
sLastConfig = cfg;
- sStatusTimeFormat = r.getString(com.android.internal.R.string.status_bar_time_format);
+ sStatusTimeFormat = java.text.DateFormat.getTimeInstance(java.text.DateFormat.SHORT);
sElapsedFormatMMSS = r.getString(com.android.internal.R.string.elapsed_time_short_format_mm_ss);
sElapsedFormatHMMSS = r.getString(com.android.internal.R.string.elapsed_time_short_format_h_mm_ss);
}
@@ -586,7 +626,7 @@ public class DateUtils
*/
public static final CharSequence timeString(long millis) {
initFormatStrings();
- return DateFormat.format(sStatusTimeFormat, millis);
+ return sStatusTimeFormat.format(millis);
}
/**
diff --git a/core/java/android/text/format/Time.java b/core/java/android/text/format/Time.java
index 8f12355..8eae111 100644
--- a/core/java/android/text/format/Time.java
+++ b/core/java/android/text/format/Time.java
@@ -135,6 +135,7 @@ public class Time {
private static Locale sLocale;
private static String[] sShortMonths;
private static String[] sLongMonths;
+ private static String[] sLongStandaloneMonths;
private static String[] sShortWeekdays;
private static String[] sLongWeekdays;
private static String sTimeOnlyFormat;
@@ -321,6 +322,20 @@ public class Time {
r.getString(com.android.internal.R.string.month_long_november),
r.getString(com.android.internal.R.string.month_long_december),
};
+ sLongStandaloneMonths = new String[] {
+ r.getString(com.android.internal.R.string.month_long_standalone_january),
+ r.getString(com.android.internal.R.string.month_long_standalone_february),
+ r.getString(com.android.internal.R.string.month_long_standalone_march),
+ r.getString(com.android.internal.R.string.month_long_standalone_april),
+ r.getString(com.android.internal.R.string.month_long_standalone_may),
+ r.getString(com.android.internal.R.string.month_long_standalone_june),
+ r.getString(com.android.internal.R.string.month_long_standalone_july),
+ r.getString(com.android.internal.R.string.month_long_standalone_august),
+ r.getString(com.android.internal.R.string.month_long_standalone_september),
+ r.getString(com.android.internal.R.string.month_long_standalone_october),
+ r.getString(com.android.internal.R.string.month_long_standalone_november),
+ r.getString(com.android.internal.R.string.month_long_standalone_december),
+ };
sShortWeekdays = new String[] {
r.getString(com.android.internal.R.string.day_of_week_medium_sunday),
r.getString(com.android.internal.R.string.day_of_week_medium_monday),
diff --git a/core/java/android/util/CharsetUtils.java b/core/java/android/util/CharsetUtils.java
index 7553029..9d91aca 100644
--- a/core/java/android/util/CharsetUtils.java
+++ b/core/java/android/util/CharsetUtils.java
@@ -142,20 +142,25 @@ public final class CharsetUtils {
/**
* Returns whether the given character set name indicates the Shift-JIS
- * encoding.
+ * encoding. Returns false if the name is null.
*
* @param charsetName the character set name
* @return {@code true} if the name corresponds to Shift-JIS or
* {@code false} if not
*/
private static boolean isShiftJis(String charsetName) {
- if (charsetName.length() != 9) {
- // Bail quickly if the length doesn't match.
+ // Bail quickly if the length doesn't match.
+ if (charsetName == null) {
+ return false;
+ }
+ int length = charsetName.length();
+ if (length != 4 && length != 9) {
return false;
}
return charsetName.equalsIgnoreCase("shift_jis")
- || charsetName.equalsIgnoreCase("shift-jis");
+ || charsetName.equalsIgnoreCase("shift-jis")
+ || charsetName.equalsIgnoreCase("sjis");
}
/**
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index 86261c4..f1bf0f4 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -19,7 +19,6 @@ package android.view;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
-import android.util.Config;
/**
* Object used to report movement (mouse, pen, finger, trackball) events. This
@@ -87,6 +86,7 @@ public final class MotionEvent implements Parcelable {
private long mDownTime;
private long mEventTime;
+ private long mEventTimeNano;
private int mAction;
private float mX;
private float mY;
@@ -123,6 +123,62 @@ public final class MotionEvent implements Parcelable {
return ev;
}
}
+
+ /**
+ * Create a new MotionEvent, filling in all of the basic values that
+ * define the motion.
+ *
+ * @param downTime The time (in ms) when the user originally pressed down to start
+ * a stream of position events. This must be obtained from {@link SystemClock#uptimeMillis()}.
+ * @param eventTime The the time (in ms) when this specific event was generated. This
+ * must be obtained from {@link SystemClock#uptimeMillis()}.
+ * @param eventTimeNano The the time (in ns) when this specific event was generated. This
+ * must be obtained from {@link System#nanoTime()}.
+ * @param action The kind of action being performed -- one of either
+ * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
+ * {@link #ACTION_CANCEL}.
+ * @param x The X coordinate of this event.
+ * @param y The Y coordinate of this event.
+ * @param pressure The current pressure of this event. The pressure generally
+ * ranges from 0 (no pressure at all) to 1 (normal pressure), however
+ * values higher than 1 may be generated depending on the calibration of
+ * the input device.
+ * @param size A scaled value of the approximate size of the area being pressed when
+ * touched with the finger. The actual value in pixels corresponding to the finger
+ * touch is normalized with a device specific range of values
+ * and scaled to a value between 0 and 1.
+ * @param metaState The state of any meta / modifier keys that were in effect when
+ * the event was generated.
+ * @param xPrecision The precision of the X coordinate being reported.
+ * @param yPrecision The precision of the Y coordinate being reported.
+ * @param deviceId The id for the device that this event came from. An id of
+ * zero indicates that the event didn't come from a physical device; other
+ * numbers are arbitrary and you shouldn't depend on the values.
+ * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
+ * MotionEvent.
+ *
+ * @hide
+ */
+ static public MotionEvent obtainNano(long downTime, long eventTime, long eventTimeNano,
+ int action, float x, float y, float pressure, float size, int metaState,
+ float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
+ MotionEvent ev = obtain();
+ ev.mDeviceId = deviceId;
+ ev.mEdgeFlags = edgeFlags;
+ ev.mDownTime = downTime;
+ ev.mEventTime = eventTime;
+ ev.mEventTimeNano = eventTimeNano;
+ ev.mAction = action;
+ ev.mX = ev.mRawX = x;
+ ev.mY = ev.mRawY = y;
+ ev.mPressure = pressure;
+ ev.mSize = size;
+ ev.mMetaState = metaState;
+ ev.mXPrecision = xPrecision;
+ ev.mYPrecision = yPrecision;
+
+ return ev;
+ }
/**
* Create a new MotionEvent, filling in all of the basic values that
@@ -163,6 +219,7 @@ public final class MotionEvent implements Parcelable {
ev.mEdgeFlags = edgeFlags;
ev.mDownTime = downTime;
ev.mEventTime = eventTime;
+ ev.mEventTimeNano = eventTime * 1000000;
ev.mAction = action;
ev.mX = ev.mRawX = x;
ev.mY = ev.mRawY = y;
@@ -199,6 +256,7 @@ public final class MotionEvent implements Parcelable {
ev.mEdgeFlags = 0;
ev.mDownTime = downTime;
ev.mEventTime = eventTime;
+ ev.mEventTimeNano = eventTime * 1000000;
ev.mAction = action;
ev.mX = ev.mRawX = x;
ev.mY = ev.mRawY = y;
@@ -246,6 +304,7 @@ public final class MotionEvent implements Parcelable {
ev.mEdgeFlags = o.mEdgeFlags;
ev.mDownTime = o.mDownTime;
ev.mEventTime = o.mEventTime;
+ ev.mEventTimeNano = o.mEventTimeNano;
ev.mAction = o.mAction;
ev.mX = o.mX;
ev.mRawX = o.mRawX;
@@ -317,6 +376,16 @@ public final class MotionEvent implements Parcelable {
}
/**
+ * Returns the time (in ns) when this specific event was generated.
+ * The value is in nanosecond precision but it may not have nanosecond accuracy.
+ *
+ * @hide
+ */
+ public final long getEventTimeNano() {
+ return mEventTimeNano;
+ }
+
+ /**
* Returns the X coordinate of this event. Whole numbers are pixels; the
* value may have a fraction for input devices that are sub-pixel precise.
*/
@@ -644,6 +713,7 @@ public final class MotionEvent implements Parcelable {
public void writeToParcel(Parcel out, int flags) {
out.writeLong(mDownTime);
out.writeLong(mEventTime);
+ out.writeLong(mEventTimeNano);
out.writeInt(mAction);
out.writeFloat(mX);
out.writeFloat(mY);
@@ -675,6 +745,7 @@ public final class MotionEvent implements Parcelable {
private void readFromParcel(Parcel in) {
mDownTime = in.readLong();
mEventTime = in.readLong();
+ mEventTimeNano = in.readLong();
mAction = in.readInt();
mX = in.readFloat();
mY = in.readFloat();
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 49e4e4c..e70c94c 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -101,6 +101,8 @@ public class SurfaceView extends View {
static final int KEEP_SCREEN_ON_MSG = 1;
static final int GET_NEW_SURFACE_MSG = 2;
+ int mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
+
boolean mIsCreating = false;
final Handler mHandler = new Handler() {
@@ -286,6 +288,15 @@ public class SurfaceView extends View {
super.dispatchDraw(canvas);
}
+ /**
+ * Hack to allow special layering of windows. The type is one of the
+ * types in WindowManager.LayoutParams. This is a hack so:
+ * @hide
+ */
+ public void setWindowType(int type) {
+ mWindowType = type;
+ }
+
private void updateWindow(boolean force) {
if (!mHaveFrame) {
return;
@@ -343,7 +354,7 @@ public class SurfaceView extends View {
if (mWindow == null) {
mWindow = new MyWindow(this);
- mLayout.type = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
+ mLayout.type = mWindowType;
mLayout.gravity = Gravity.LEFT|Gravity.TOP;
mSession.add(mWindow, mLayout,
mVisible ? VISIBLE : GONE, mContentInsets);
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 1564fd0..1f72eea 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -1443,6 +1443,27 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
static final int DIRTY_MASK = 0x00600000;
/**
+ * Indicates whether the background is opaque.
+ *
+ * @hide
+ */
+ static final int OPAQUE_BACKGROUND = 0x00800000;
+
+ /**
+ * Indicates whether the scrollbars are opaque.
+ *
+ * @hide
+ */
+ static final int OPAQUE_SCROLLBARS = 0x01000000;
+
+ /**
+ * Indicates whether the view is opaque.
+ *
+ * @hide
+ */
+ static final int OPAQUE_MASK = 0x01800000;
+
+ /**
* The parent this view is attached to.
* {@hide}
*
@@ -1721,7 +1742,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
public View(Context context) {
mContext = context;
mResources = context != null ? context.getResources() : null;
- mViewFlags = SOUND_EFFECTS_ENABLED|HAPTIC_FEEDBACK_ENABLED;
+ mViewFlags = SOUND_EFFECTS_ENABLED | HAPTIC_FEEDBACK_ENABLED;
++sInstanceCount;
}
@@ -2013,7 +2034,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
if (!setScrollContainer && (viewFlagValues&SCROLLBARS_VERTICAL) != 0) {
setScrollContainer(true);
}
-
+
+ computeOpaqueFlags();
+
a.recycle();
}
@@ -4700,7 +4723,35 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
*/
@ViewDebug.ExportedProperty
public boolean isOpaque() {
- return mBGDrawable != null && mBGDrawable.getOpacity() == PixelFormat.OPAQUE;
+ return (mPrivateFlags & OPAQUE_MASK) == OPAQUE_MASK;
+ }
+
+ private void computeOpaqueFlags() {
+ // Opaque if:
+ // - Has a background
+ // - Background is opaque
+ // - Doesn't have scrollbars or scrollbars are inside overlay
+
+ if (mBGDrawable != null && mBGDrawable.getOpacity() == PixelFormat.OPAQUE) {
+ mPrivateFlags |= OPAQUE_BACKGROUND;
+ } else {
+ mPrivateFlags &= ~OPAQUE_BACKGROUND;
+ }
+
+ final int flags = mViewFlags;
+ if (((flags & SCROLLBARS_VERTICAL) == 0 && (flags & SCROLLBARS_HORIZONTAL) == 0) ||
+ (flags & SCROLLBARS_STYLE_MASK) == SCROLLBARS_INSIDE_OVERLAY) {
+ mPrivateFlags |= OPAQUE_SCROLLBARS;
+ } else {
+ mPrivateFlags &= ~OPAQUE_SCROLLBARS;
+ }
+ }
+
+ /**
+ * @hide
+ */
+ protected boolean hasOpaqueScrollbars() {
+ return (mPrivateFlags & OPAQUE_SCROLLBARS) == OPAQUE_SCROLLBARS;
}
/**
@@ -5027,6 +5078,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
public void setHorizontalScrollBarEnabled(boolean horizontalScrollBarEnabled) {
if (isHorizontalScrollBarEnabled() != horizontalScrollBarEnabled) {
mViewFlags ^= SCROLLBARS_HORIZONTAL;
+ computeOpaqueFlags();
recomputePadding();
}
}
@@ -5056,6 +5108,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
public void setVerticalScrollBarEnabled(boolean verticalScrollBarEnabled) {
if (isVerticalScrollBarEnabled() != verticalScrollBarEnabled) {
mViewFlags ^= SCROLLBARS_VERTICAL;
+ computeOpaqueFlags();
recomputePadding();
}
}
@@ -5084,6 +5137,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
public void setScrollBarStyle(int style) {
if (style != (mViewFlags & SCROLLBARS_STYLE_MASK)) {
mViewFlags = (mViewFlags & ~SCROLLBARS_STYLE_MASK) | (style & SCROLLBARS_STYLE_MASK);
+ computeOpaqueFlags();
recomputePadding();
}
}
@@ -6848,6 +6902,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
requestLayout = true;
}
+ computeOpaqueFlags();
+
if (requestLayout) {
requestLayout();
}
diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java
index 7cd65e2..d999119 100644
--- a/core/java/android/view/ViewRoot.java
+++ b/core/java/android/view/ViewRoot.java
@@ -77,6 +77,9 @@ public final class ViewRoot extends Handler implements ViewParent,
private static final boolean DEBUG_IMF = false || LOCAL_LOGV;
private static final boolean WATCH_POINTER = false;
+ private static final boolean MEASURE_LATENCY = false;
+ private static LatencyTimer lt;
+
/**
* Maximum time we allow the user to roll the trackball enough to generate
* a key event, before resetting the counters.
@@ -192,6 +195,10 @@ public final class ViewRoot extends Handler implements ViewParent,
public ViewRoot(Context context) {
super();
+ if (MEASURE_LATENCY && lt == null) {
+ lt = new LatencyTimer(100, 1000);
+ }
+
++sInstanceCount;
// Initialize the statics when this class is first instantiated. This is
@@ -1579,7 +1586,17 @@ public final class ViewRoot extends Handler implements ViewParent,
boolean didFinish;
if (event == null) {
try {
+ long timeBeforeGettingEvents;
+ if (MEASURE_LATENCY) {
+ timeBeforeGettingEvents = System.nanoTime();
+ }
+
event = sWindowSession.getPendingPointerMove(mWindow);
+
+ if (MEASURE_LATENCY && event != null) {
+ lt.sample("9 Client got events ", System.nanoTime() - event.getEventTimeNano());
+ lt.sample("8 Client getting events ", timeBeforeGettingEvents - event.getEventTimeNano());
+ }
} catch (RemoteException e) {
}
didFinish = true;
@@ -1603,7 +1620,13 @@ public final class ViewRoot extends Handler implements ViewParent,
captureMotionLog("captureDispatchPointer", event);
}
event.offsetLocation(0, mCurScrollY);
+ if (MEASURE_LATENCY) {
+ lt.sample("A Dispatching TouchEvents", System.nanoTime() - event.getEventTimeNano());
+ }
handled = mView.dispatchTouchEvent(event);
+ if (MEASURE_LATENCY) {
+ lt.sample("B Dispatched TouchEvents ", System.nanoTime() - event.getEventTimeNano());
+ }
if (!handled && isDown) {
int edgeSlop = mViewConfiguration.getScaledEdgeSlop();
@@ -2685,7 +2708,11 @@ public final class ViewRoot extends Handler implements ViewParent,
public void dispatchPointer(MotionEvent event, long eventTime) {
final ViewRoot viewRoot = mViewRoot.get();
- if (viewRoot != null) {
+ if (viewRoot != null) {
+ if (MEASURE_LATENCY) {
+ // Note: eventTime is in milliseconds
+ ViewRoot.lt.sample("* ViewRoot b4 dispatchPtr", System.nanoTime() - eventTime * 1000000);
+ }
viewRoot.dispatchPointer(event, eventTime);
} else {
new EventCompletion(mMainLooper, this, null, true, event);
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index b0e738c..d7457a0 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -376,8 +376,14 @@ public abstract class Window {
String title;
if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA) {
title="Media";
+ } else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY) {
+ title="MediaOvr";
} else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) {
title="Panel";
+ } else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL) {
+ title="SubPanel";
+ } else if (wp.type == WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG) {
+ title="AtchDlg";
} else {
title=Integer.toString(wp.type);
}
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index c69c281..ec2069c 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -210,6 +210,15 @@ public interface WindowManager extends ViewManager {
public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW+3;
/**
+ * Window type: window for showing overlays on top of media windows.
+ * These windows are displayed between TYPE_APPLICATION_MEDIA and the
+ * application window. They should be translucent to be useful. This
+ * is a big ugly hack so:
+ * @hide
+ */
+ public static final int TYPE_APPLICATION_MEDIA_OVERLAY = FIRST_SUB_WINDOW+4;
+
+ /**
* End of types of sub-windows.
*/
public static final int LAST_SUB_WINDOW = 1999;
@@ -466,6 +475,15 @@ public interface WindowManager extends ViewManager {
*/
public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000;
+ /** Window flag: special flag to let windows be shown when the screen
+ * is locked. This will let application windows take precedence over
+ * key guard or any other lock screens. Can be used with
+ * {@link #FLAG_KEEP_SCREEN_ON} to turn screen on and display windows
+ * directly before showing the key guard window
+ *
+ * {@hide} */
+ public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000;
+
/** Window flag: a special option intended for system dialogs. When
* this flag is set, the window will demand focus unconditionally when
* it is created.
diff --git a/core/java/android/webkit/gears/AndroidRadioDataProvider.java b/core/java/android/webkit/gears/AndroidRadioDataProvider.java
index 2d431a8..1384042 100644
--- a/core/java/android/webkit/gears/AndroidRadioDataProvider.java
+++ b/core/java/android/webkit/gears/AndroidRadioDataProvider.java
@@ -28,6 +28,7 @@ package android.webkit.gears;
import android.content.Context;
import android.telephony.CellLocation;
import android.telephony.ServiceState;
+import android.telephony.SignalStrength;
import android.telephony.gsm.GsmCellLocation;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
@@ -54,6 +55,7 @@ public final class AndroidRadioDataProvider extends PhoneStateListener {
public static final class RadioData {
public int cellId = -1;
public int locationAreaCode = -1;
+ // TODO: use new SignalStrength instead of asu
public int signalStrength = -1;
public int mobileCountryCode = -1;
public int mobileNetworkCode = -1;
@@ -179,6 +181,7 @@ public final class AndroidRadioDataProvider extends PhoneStateListener {
private CellLocation cellLocation = null;
/** The last known signal strength */
+ // TODO: use new SignalStrength instead of asu
private int signalStrength = -1;
/** The last known serviceState */
@@ -207,7 +210,7 @@ public final class AndroidRadioDataProvider extends PhoneStateListener {
// Register for cell id, signal strength and service state changed
// notifications.
telephonyManager.listen(this, PhoneStateListener.LISTEN_CELL_LOCATION
- | PhoneStateListener.LISTEN_SIGNAL_STRENGTH
+ | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
| PhoneStateListener.LISTEN_SERVICE_STATE);
}
@@ -226,8 +229,9 @@ public final class AndroidRadioDataProvider extends PhoneStateListener {
}
@Override
- public void onSignalStrengthChanged(int asu) {
- signalStrength = asu;
+ public void onSignalStrengthsChanged(SignalStrength ss) {
+ int gsmSignalStrength = ss.getGsmSignalStrength();
+ signalStrength = (gsmSignalStrength == 99 ? -1 : gsmSignalStrength);
notifyListeners();
}
diff --git a/core/java/android/widget/ExpandableListView.java b/core/java/android/widget/ExpandableListView.java
index 0fc8f49..5360621 100644
--- a/core/java/android/widget/ExpandableListView.java
+++ b/core/java/android/widget/ExpandableListView.java
@@ -1083,6 +1083,11 @@ public class ExpandableListView extends ListView {
@Override
public void onRestoreInstanceState(Parcelable state) {
+ if (!(state instanceof SavedState)) {
+ super.onRestoreInstanceState(state);
+ return;
+ }
+
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
diff --git a/core/java/android/widget/ImageButton.java b/core/java/android/widget/ImageButton.java
index 4c1cbf6..d417e40 100644
--- a/core/java/android/widget/ImageButton.java
+++ b/core/java/android/widget/ImageButton.java
@@ -27,9 +27,35 @@ import java.util.Map;
/**
* <p>
- * An image button displays an image that can be pressed, or clicked, by the
- * user.
- * </p>
+ * Displays a button with an image (instead of text) that can be pressed
+ * or clicked by the user. By default, an ImageButton looks like a regular
+ * {@link android.widget.Button}, with the standard button background
+ * that changes color during different button states. The image on the surface
+ * of the button is defined either by the {@code android:src} attribute in the
+ * {@code &lt;ImageButton&gt;} XML element or by the
+ * {@link #setImageResource(int)} method.</p>
+ *
+ * <p>To remove the standard button background image, define your own
+ * background image or set the background color to be transparent.</p>
+ * <p>To indicate the different button states (focused, selected, etc.), you can
+ * define a different image for each state. E.g., a blue image by default, an
+ * orange one for when focused, and a yellow one for when pressed. An easy way to
+ * do this is with an XML drawable "selector." For example:</p>
+ * <pre>
+ * &lt;?xml version="1.0" encoding="utf-8"?&gt;
+ * &lt;selector xmlns:android="http://schemas.android.com/apk/res/android"&gt;
+ * &lt;item android:drawable="@drawable/button_normal" /&gt; &lt;!-- default --&gt;
+ * &lt;item android:state_pressed="true"
+ * android:drawable="@drawable/button_pressed" /&gt; &lt;!-- pressed --&gt;
+ * &lt;item android:state_focused="true"
+ * android:drawable="@drawable/button_focused" /&gt; &lt;!-- focused --&gt;
+ * &lt;/selector&gt;</pre>
+ *
+ * <p>Save the XML file in your project {@code res/drawable/} folder and then
+ * reference it as a drawable for the source of your ImageButton (in the
+ * {@code android:src} attribute). Android will automatically change the image
+ * based on the state of the button and the corresponding images
+ * defined in the XML.</p>
*
* <p><strong>XML attributes</strong></p>
* <p>
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index c21c7fa..6686f75 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -21,6 +21,7 @@ import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.PixelFormat;
+import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ColorDrawable;
import android.os.Parcel;
@@ -133,6 +134,7 @@ public class ListView extends AbsListView {
// used for temporary calculations.
private final Rect mTempRect = new Rect();
+ private Paint mDividerPaint;
// the single allocated result per list view; kinda cheesey but avoids
// allocating these thingies too often.
@@ -2813,12 +2815,20 @@ public class ListView extends AbsListView {
*/
@Override
public boolean isOpaque() {
- return (mCachingStarted && mIsCacheColorOpaque && mDividerIsOpaque) || super.isOpaque();
+ return (mCachingStarted && mIsCacheColorOpaque && mDividerIsOpaque &&
+ hasOpaqueScrollbars()) || super.isOpaque();
}
@Override
public void setCacheColorHint(int color) {
- mIsCacheColorOpaque = (color >>> 24) == 0xFF;
+ final boolean opaque = (color >>> 24) == 0xFF;
+ mIsCacheColorOpaque = opaque;
+ if (opaque) {
+ if (mDividerPaint == null) {
+ mDividerPaint = new Paint();
+ }
+ mDividerPaint.setColor(color);
+ }
super.setCacheColorHint(color);
}
@@ -2841,6 +2851,8 @@ public class ListView extends AbsListView {
final int first = mFirstPosition;
final boolean areAllItemsSelectable = mAreAllItemsSelectable;
final ListAdapter adapter = mAdapter;
+ final boolean isOpaque = isOpaque();
+ final Paint paint = mDividerPaint;
if (!mStackFromBottom) {
int bottom;
@@ -2852,12 +2864,18 @@ public class ListView extends AbsListView {
View child = getChildAt(i);
bottom = child.getBottom();
// Don't draw dividers next to items that are not enabled
- if (bottom < listBottom && (areAllItemsSelectable ||
- (adapter.isEnabled(first + i) && (i == count - 1 ||
- adapter.isEnabled(first + i + 1))))) {
- bounds.top = bottom;
- bounds.bottom = bottom + dividerHeight;
- drawDivider(canvas, bounds, i);
+ if (bottom < listBottom) {
+ if ((areAllItemsSelectable ||
+ (adapter.isEnabled(first + i) && (i == count - 1 ||
+ adapter.isEnabled(first + i + 1))))) {
+ bounds.top = bottom;
+ bounds.bottom = bottom + dividerHeight;
+ drawDivider(canvas, bounds, i);
+ } else if (isOpaque) {
+ bounds.top = bottom;
+ bounds.bottom = bottom + dividerHeight;
+ canvas.drawRect(bounds, paint);
+ }
}
}
}
@@ -2871,16 +2889,22 @@ public class ListView extends AbsListView {
View child = getChildAt(i);
top = child.getTop();
// Don't draw dividers next to items that are not enabled
- if (top > listTop && (areAllItemsSelectable ||
- (adapter.isEnabled(first + i) && (i == count - 1 ||
- adapter.isEnabled(first + i + 1))))) {
- bounds.top = top - dividerHeight;
- bounds.bottom = top;
- // Give the method the child ABOVE the divider, so we
- // subtract one from our child
- // position. Give -1 when there is no child above the
- // divider.
- drawDivider(canvas, bounds, i - 1);
+ if (top > listTop) {
+ if ((areAllItemsSelectable ||
+ (adapter.isEnabled(first + i) && (i == count - 1 ||
+ adapter.isEnabled(first + i + 1))))) {
+ bounds.top = top - dividerHeight;
+ bounds.bottom = top;
+ // Give the method the child ABOVE the divider, so we
+ // subtract one from our child
+ // position. Give -1 when there is no child above the
+ // divider.
+ drawDivider(canvas, bounds, i - 1);
+ } else if (isOpaque) {
+ bounds.top = top - dividerHeight;
+ bounds.bottom = top;
+ canvas.drawRect(bounds, paint);
+ }
}
}
}
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 219afec..40a72a4 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -1329,9 +1329,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
} else {
// We need to retain the last set padding, so just clear
// out all of the fields in the existing structure.
+ if (dr.mDrawableLeft != null) dr.mDrawableLeft.setCallback(null);
dr.mDrawableLeft = null;
+ if (dr.mDrawableTop != null) dr.mDrawableTop.setCallback(null);
dr.mDrawableTop = null;
+ if (dr.mDrawableRight != null) dr.mDrawableRight.setCallback(null);
dr.mDrawableRight = null;
+ if (dr.mDrawableBottom != null) dr.mDrawableBottom.setCallback(null);
dr.mDrawableBottom = null;
dr.mDrawableSizeLeft = dr.mDrawableHeightLeft = 0;
dr.mDrawableSizeRight = dr.mDrawableHeightRight = 0;
@@ -1344,19 +1348,32 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
mDrawables = dr = new Drawables();
}
+ if (dr.mDrawableLeft != left && dr.mDrawableLeft != null) {
+ dr.mDrawableLeft.setCallback(null);
+ }
dr.mDrawableLeft = left;
+ if (dr.mDrawableTop != left && dr.mDrawableTop != null) {
+ dr.mDrawableTop.setCallback(null);
+ }
dr.mDrawableTop = top;
+ if (dr.mDrawableRight != left && dr.mDrawableRight != null) {
+ dr.mDrawableRight.setCallback(null);
+ }
dr.mDrawableRight = right;
+ if (dr.mDrawableBottom != left && dr.mDrawableBottom != null) {
+ dr.mDrawableBottom.setCallback(null);
+ }
dr.mDrawableBottom = bottom;
final Rect compoundRect = dr.mCompoundRect;
- int[] state = null;
+ int[] state;
state = getDrawableState();
if (left != null) {
left.setState(state);
left.copyBounds(compoundRect);
+ left.setCallback(this);
dr.mDrawableSizeLeft = compoundRect.width();
dr.mDrawableHeightLeft = compoundRect.height();
} else {
@@ -1366,6 +1383,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
if (right != null) {
right.setState(state);
right.copyBounds(compoundRect);
+ right.setCallback(this);
dr.mDrawableSizeRight = compoundRect.width();
dr.mDrawableHeightRight = compoundRect.height();
} else {
@@ -1375,6 +1393,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
if (top != null) {
top.setState(state);
top.copyBounds(compoundRect);
+ top.setCallback(this);
dr.mDrawableSizeTop = compoundRect.height();
dr.mDrawableWidthTop = compoundRect.width();
} else {
@@ -1384,6 +1403,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
if (bottom != null) {
bottom.setState(state);
bottom.copyBounds(compoundRect);
+ bottom.setCallback(this);
dr.mDrawableSizeBottom = compoundRect.height();
dr.mDrawableWidthBottom = compoundRect.width();
} else {
@@ -3681,6 +3701,54 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
@Override
+ public void invalidateDrawable(Drawable drawable) {
+ if (verifyDrawable(drawable)) {
+ final Rect dirty = drawable.getBounds();
+ int scrollX = mScrollX;
+ int scrollY = mScrollY;
+
+ // IMPORTANT: The coordinates below are based on the coordinates computed
+ // for each compound drawable in onDraw(). Make sure to update each section
+ // accordingly.
+ final TextView.Drawables drawables = mDrawables;
+ if (drawables != null) {
+ if (drawable == drawables.mDrawableLeft) {
+ final int compoundPaddingTop = getCompoundPaddingTop();
+ final int compoundPaddingBottom = getCompoundPaddingBottom();
+ final int vspace = mBottom - mTop - compoundPaddingBottom - compoundPaddingTop;
+
+ scrollX += mPaddingLeft;
+ scrollY += compoundPaddingTop + (vspace - drawables.mDrawableHeightLeft) / 2;
+ } else if (drawable == drawables.mDrawableRight) {
+ final int compoundPaddingTop = getCompoundPaddingTop();
+ final int compoundPaddingBottom = getCompoundPaddingBottom();
+ final int vspace = mBottom - mTop - compoundPaddingBottom - compoundPaddingTop;
+
+ scrollX += (mRight - mLeft - mPaddingRight - drawables.mDrawableSizeRight);
+ scrollY += compoundPaddingTop + (vspace - drawables.mDrawableHeightRight) / 2;
+ } else if (drawable == drawables.mDrawableTop) {
+ final int compoundPaddingLeft = getCompoundPaddingLeft();
+ final int compoundPaddingRight = getCompoundPaddingRight();
+ final int hspace = mRight - mLeft - compoundPaddingRight - compoundPaddingLeft;
+
+ scrollX += compoundPaddingLeft + (hspace - drawables.mDrawableWidthTop) / 2;
+ scrollY += mPaddingTop;
+ } else if (drawable == drawables.mDrawableBottom) {
+ final int compoundPaddingLeft = getCompoundPaddingLeft();
+ final int compoundPaddingRight = getCompoundPaddingRight();
+ final int hspace = mRight - mLeft - compoundPaddingRight - compoundPaddingLeft;
+
+ scrollX += compoundPaddingLeft + (hspace - drawables.mDrawableWidthBottom) / 2;
+ scrollY += (mBottom - mTop - mPaddingBottom - drawables.mDrawableSizeBottom);
+ }
+ }
+
+ invalidate(dirty.left + scrollX, dirty.top + scrollY,
+ dirty.right + scrollX, dirty.bottom + scrollY);
+ }
+ }
+
+ @Override
protected void onDraw(Canvas canvas) {
restartMarqueeIfNeeded();
@@ -3708,6 +3776,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
int vspace = bottom - top - compoundPaddingBottom - compoundPaddingTop;
int hspace = right - left - compoundPaddingRight - compoundPaddingLeft;
+ // IMPORTANT: The coordinates computed are also used in invalidateDrawable()
+ // Make sure to update invalidateDrawable() when changing this code.
if (dr.mDrawableLeft != null) {
canvas.save();
canvas.translate(scrollX + mPaddingLeft,
@@ -3717,6 +3787,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
canvas.restore();
}
+ // IMPORTANT: The coordinates computed are also used in invalidateDrawable()
+ // Make sure to update invalidateDrawable() when changing this code.
if (dr.mDrawableRight != null) {
canvas.save();
canvas.translate(scrollX + right - left - mPaddingRight - dr.mDrawableSizeRight,
@@ -3725,6 +3797,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
canvas.restore();
}
+ // IMPORTANT: The coordinates computed are also used in invalidateDrawable()
+ // Make sure to update invalidateDrawable() when changing this code.
if (dr.mDrawableTop != null) {
canvas.save();
canvas.translate(scrollX + compoundPaddingLeft + (hspace - dr.mDrawableWidthTop) / 2,
@@ -3733,6 +3807,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
canvas.restore();
}
+ // IMPORTANT: The coordinates computed are also used in invalidateDrawable()
+ // Make sure to update invalidateDrawable() when changing this code.
if (dr.mDrawableBottom != null) {
canvas.save();
canvas.translate(scrollX + compoundPaddingLeft +
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index e1ff2a5..ce32754 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -18,6 +18,8 @@ package com.android.internal.app;
import com.android.internal.os.BatteryStatsImpl;
+import android.telephony.SignalStrength;
+
interface IBatteryStats {
byte[] getStatistics();
void noteStartWakelock(int uid, String name, int type);
@@ -33,7 +35,7 @@ interface IBatteryStats {
void noteUserActivity(int uid, int event);
void notePhoneOn();
void notePhoneOff();
- void notePhoneSignalStrength(int asu);
+ void notePhoneSignalStrength(in SignalStrength signalStrength);
void notePhoneDataConnectionState(int dataType, boolean hasData);
void noteWifiOn(int uid);
void noteWifiOff(int uid);
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index e8356a2..bf9bc4e 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -23,6 +23,7 @@ import android.os.ParcelFormatException;
import android.os.Parcelable;
import android.os.Process;
import android.os.SystemClock;
+import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.util.PrintWriterPrinter;
@@ -54,7 +55,7 @@ public final class BatteryStatsImpl extends BatteryStats {
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 34;
+ private static final int VERSION = 35;
private final File mFile;
private final File mBackupFile;
@@ -982,14 +983,25 @@ public final class BatteryStatsImpl extends BatteryStats {
}
}
- public void notePhoneSignalStrengthLocked(int asu) {
+ public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) {
// Bin the strength.
int bin;
- if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
- else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT;
- else if (asu >= 8) bin = SIGNAL_STRENGTH_GOOD;
- else if (asu >= 4) bin = SIGNAL_STRENGTH_MODERATE;
- else bin = SIGNAL_STRENGTH_POOR;
+
+ if (!signalStrength.isGsm()) {
+ int dBm = signalStrength.getCdmaDbm();
+ if (dBm >= -75) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+ else if (dBm >= -85) bin = SIGNAL_STRENGTH_GREAT;
+ else if (dBm >= -95) bin = SIGNAL_STRENGTH_GOOD;
+ else if (dBm >= -100) bin = SIGNAL_STRENGTH_MODERATE;
+ else bin = SIGNAL_STRENGTH_POOR;
+ } else {
+ int asu = signalStrength.getGsmSignalStrength();
+ if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+ else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT;
+ else if (asu >= 8) bin = SIGNAL_STRENGTH_GOOD;
+ else if (asu >= 4) bin = SIGNAL_STRENGTH_MODERATE;
+ else bin = SIGNAL_STRENGTH_POOR;
+ }
if (mPhoneSignalStrengthBin != bin) {
if (mPhoneSignalStrengthBin >= 0) {
mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this);
diff --git a/core/java/com/google/android/net/GoogleHttpClient.java b/core/java/com/google/android/net/GoogleHttpClient.java
index 871c925..922f5be 100644
--- a/core/java/com/google/android/net/GoogleHttpClient.java
+++ b/core/java/com/google/android/net/GoogleHttpClient.java
@@ -37,6 +37,10 @@ import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.conn.scheme.LayeredSocketFactory;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
+import org.apache.http.conn.scheme.SocketFactory;
import org.apache.http.impl.client.EntityEnclosingRequestWrapper;
import org.apache.http.impl.client.RequestWrapper;
import org.apache.http.params.HttpParams;
@@ -44,6 +48,8 @@ import org.apache.http.protocol.HttpContext;
import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
import java.io.IOException;
+import java.net.InetAddress;
+import java.net.Socket;
import java.net.URI;
import java.net.URISyntaxException;
@@ -66,25 +72,22 @@ public class GoogleHttpClient implements HttpClient {
private final AndroidHttpClient mClient;
private final ContentResolver mResolver;
- private final String mUserAgent;
+ private final String mAppName, mUserAgent;
+ private final ThreadLocal<Boolean> mConnectionAllocated = new ThreadLocal<Boolean>();
/**
- * Create an HTTP client. Normally one client is shared throughout an app.
- * @param resolver to use for accessing URL rewriting rules.
- * @param userAgent to report in your HTTP requests.
- * @deprecated Use {@link #GoogleHttpClient(android.content.ContentResolver, String, boolean)}
+ * Create an HTTP client without SSL session persistence.
+ * @deprecated Use {@link #GoogleHttpClient(android.content.Context, String, boolean)}
*/
public GoogleHttpClient(ContentResolver resolver, String userAgent) {
mClient = AndroidHttpClient.newInstance(userAgent);
mResolver = resolver;
- mUserAgent = userAgent;
+ mUserAgent = mAppName = userAgent;
}
/**
- * GoogleHttpClient(Context, String, boolean) - without SSL session
- * persistence.
- *
- * @deprecated use Context instead of ContentResolver.
+ * Create an HTTP client without SSL session persistence.
+ * @deprecated Use {@link #GoogleHttpClient(android.content.Context, String, boolean)}
*/
public GoogleHttpClient(ContentResolver resolver, String appAndVersion,
boolean gzipCapable) {
@@ -111,21 +114,72 @@ public class GoogleHttpClient implements HttpClient {
* headers. Needed because Google servers require gzip in the User-Agent
* in order to return gzip'd content.
*/
- public GoogleHttpClient(Context context, String appAndVersion,
- boolean gzipCapable) {
- this(context.getContentResolver(), SSLClientSessionCacheFactory.getCache(context),
+ public GoogleHttpClient(Context context, String appAndVersion, boolean gzipCapable) {
+ this(context.getContentResolver(),
+ SSLClientSessionCacheFactory.getCache(context),
appAndVersion, gzipCapable);
}
- private GoogleHttpClient(ContentResolver resolver, SSLClientSessionCache cache,
+ private GoogleHttpClient(ContentResolver resolver,
+ SSLClientSessionCache cache,
String appAndVersion, boolean gzipCapable) {
String userAgent = appAndVersion + " (" + Build.DEVICE + " " + Build.ID + ")";
if (gzipCapable) {
userAgent = userAgent + "; gzip";
}
+
mClient = AndroidHttpClient.newInstance(userAgent, cache);
mResolver = resolver;
+ mAppName = appAndVersion;
mUserAgent = userAgent;
+
+ // Wrap all the socket factories with the appropriate wrapper. (Apache
+ // HTTP, curse its black and stupid heart, inspects the SocketFactory to
+ // see if it's a LayeredSocketFactory, so we need two wrapper classes.)
+ SchemeRegistry registry = getConnectionManager().getSchemeRegistry();
+ for (String name : registry.getSchemeNames()) {
+ Scheme scheme = registry.unregister(name);
+ SocketFactory sf = scheme.getSocketFactory();
+ if (sf instanceof LayeredSocketFactory) {
+ sf = new WrappedLayeredSocketFactory((LayeredSocketFactory) sf);
+ } else {
+ sf = new WrappedSocketFactory(sf);
+ }
+ registry.register(new Scheme(name, sf, scheme.getDefaultPort()));
+ }
+ }
+
+ /**
+ * Delegating wrapper for SocketFactory records when sockets are connected.
+ * We use this to know whether a connection was created vs reused, to
+ * gather per-app statistics about connection reuse rates.
+ * (Note, we record only *connection*, not *creation* of sockets --
+ * what we care about is the network overhead of an actual TCP connect.)
+ */
+ private class WrappedSocketFactory implements SocketFactory {
+ private SocketFactory mDelegate;
+ private WrappedSocketFactory(SocketFactory delegate) { mDelegate = delegate; }
+ public final Socket createSocket() throws IOException { return mDelegate.createSocket(); }
+ public final boolean isSecure(Socket s) { return mDelegate.isSecure(s); }
+
+ public final Socket connectSocket(
+ Socket s, String h, int p,
+ InetAddress la, int lp, HttpParams params) throws IOException {
+ mConnectionAllocated.set(Boolean.TRUE);
+ return mDelegate.connectSocket(s, h, p, la, lp, params);
+ }
+ }
+
+ /** Like WrappedSocketFactory, but for the LayeredSocketFactory subclass. */
+ private class WrappedLayeredSocketFactory
+ extends WrappedSocketFactory implements LayeredSocketFactory {
+ private LayeredSocketFactory mDelegate;
+ private WrappedLayeredSocketFactory(LayeredSocketFactory sf) { super(sf); mDelegate = sf; }
+
+ public final Socket createSocket(Socket s, String host, int port, boolean autoClose)
+ throws IOException {
+ return mDelegate.createSocket(s, host, port, autoClose);
+ }
}
/**
@@ -140,24 +194,21 @@ public class GoogleHttpClient implements HttpClient {
public HttpResponse executeWithoutRewriting(
HttpUriRequest request, HttpContext context)
throws IOException {
- String code = "Error";
+ int code = -1;
long start = SystemClock.elapsedRealtime();
try {
HttpResponse response;
- // TODO: if we're logging network stats, and if the apache library is configured
- // to follow redirects, count each redirect as an additional round trip.
+ mConnectionAllocated.set(null);
- // see if we're logging network stats.
- boolean logNetworkStats = NetworkStatsEntity.shouldLogNetworkStats();
+ if (NetworkStatsEntity.shouldLogNetworkStats()) {
+ // TODO: if we're logging network stats, and if the apache library is configured
+ // to follow redirects, count each redirect as an additional round trip.
- if (logNetworkStats) {
int uid = android.os.Process.myUid();
long startTx = NetStat.getUidTxBytes(uid);
long startRx = NetStat.getUidRxBytes(uid);
response = mClient.execute(request, context);
- code = Integer.toString(response.getStatusLine().getStatusCode());
-
HttpEntity origEntity = response == null ? null : response.getEntity();
if (origEntity != null) {
// yeah, we compute the same thing below. we do need to compute this here
@@ -165,30 +216,39 @@ public class GoogleHttpClient implements HttpClient {
long now = SystemClock.elapsedRealtime();
long elapsed = now - start;
NetworkStatsEntity entity = new NetworkStatsEntity(origEntity,
- mUserAgent, uid, startTx, startRx,
+ mAppName, uid, startTx, startRx,
elapsed /* response latency */, now /* processing start time */);
response.setEntity(entity);
}
} else {
response = mClient.execute(request, context);
- code = Integer.toString(response.getStatusLine().getStatusCode());
}
+ code = response.getStatusLine().getStatusCode();
return response;
- } catch (IOException e) {
- code = "IOException";
- throw e;
} finally {
// Record some statistics to the checkin service about the outcome.
// Note that this is only describing execute(), not body download.
+ // We assume the database writes are much faster than network I/O,
+ // and not worth running in a background thread or anything.
try {
long elapsed = SystemClock.elapsedRealtime() - start;
ContentValues values = new ContentValues();
- values.put(Checkin.Stats.TAG,
- Checkin.Stats.Tag.HTTP_STATUS + ":" +
- mUserAgent + ":" + code);
values.put(Checkin.Stats.COUNT, 1);
values.put(Checkin.Stats.SUM, elapsed / 1000.0);
+
+ values.put(Checkin.Stats.TAG, Checkin.Stats.Tag.HTTP_REQUEST + ":" + mAppName);
+ mResolver.insert(Checkin.Stats.CONTENT_URI, values);
+
+ // No sockets and no exceptions means we successfully reused a connection
+ if (mConnectionAllocated.get() == null && code >= 0) {
+ values.put(Checkin.Stats.TAG, Checkin.Stats.Tag.HTTP_REUSED + ":" + mAppName);
+ mResolver.insert(Checkin.Stats.CONTENT_URI, values);
+ }
+
+ String status = code < 0 ? "IOException" : Integer.toString(code);
+ values.put(Checkin.Stats.TAG,
+ Checkin.Stats.Tag.HTTP_STATUS + ":" + mAppName + ":" + status);
mResolver.insert(Checkin.Stats.CONTENT_URI, values);
} catch (Exception e) {
Log.e(TAG, "Error recording stats", e);
diff --git a/core/jni/ActivityManager.cpp b/core/jni/ActivityManager.cpp
index 9017827..8950dfb 100644
--- a/core/jni/ActivityManager.cpp
+++ b/core/jni/ActivityManager.cpp
@@ -16,9 +16,9 @@
#include <unistd.h>
#include <android_runtime/ActivityManager.h>
-#include <utils/IBinder.h>
-#include <utils/IServiceManager.h>
-#include <utils/Parcel.h>
+#include <binder/IBinder.h>
+#include <binder/IServiceManager.h>
+#include <binder/Parcel.h>
#include <utils/String8.h>
namespace android {
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index 702ea87..c07748e 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -104,7 +104,6 @@ LOCAL_SRC_FILES:= \
android_util_FileObserver.cpp \
android/opengl/poly_clip.cpp.arm \
android/opengl/util.cpp.arm \
- android_bluetooth_Database.cpp \
android_bluetooth_HeadsetBase.cpp \
android_bluetooth_common.cpp \
android_bluetooth_BluetoothAudioGateway.cpp \
@@ -118,6 +117,7 @@ LOCAL_SRC_FILES:= \
android_location_GpsLocationProvider.cpp \
com_android_internal_os_ZygoteInit.cpp \
com_android_internal_graphics_NativeUtils.cpp \
+ android_backup_BackupDataOutput.cpp \
android_backup_FileBackupHelper.cpp
LOCAL_C_INCLUDES += \
@@ -147,6 +147,7 @@ LOCAL_SHARED_LIBRARIES := \
libnativehelper \
libcutils \
libutils \
+ libbinder \
libnetutils \
libui \
libskiagl \
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index d1e87f3..144bf5d 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -19,11 +19,11 @@
//#define LOG_NDEBUG 0
#include <android_runtime/AndroidRuntime.h>
-#include <utils/IBinder.h>
-#include <utils/IServiceManager.h>
+#include <binder/IBinder.h>
+#include <binder/IServiceManager.h>
#include <utils/Log.h>
#include <utils/misc.h>
-#include <utils/Parcel.h>
+#include <binder/Parcel.h>
#include <utils/string_array.h>
#include <utils/threads.h>
#include <cutils/properties.h>
@@ -142,7 +142,6 @@ extern int register_android_security_Md5MessageDigest(JNIEnv *env);
extern int register_android_text_AndroidCharacter(JNIEnv *env);
extern int register_android_text_KeyCharacterMap(JNIEnv *env);
extern int register_android_opengl_classes(JNIEnv *env);
-extern int register_android_bluetooth_Database(JNIEnv* env);
extern int register_android_bluetooth_HeadsetBase(JNIEnv* env);
extern int register_android_bluetooth_BluetoothAudioGateway(JNIEnv* env);
extern int register_android_bluetooth_RfcommSocket(JNIEnv *env);
@@ -154,6 +153,7 @@ extern int register_android_ddm_DdmHandleNativeHeap(JNIEnv *env);
extern int register_com_android_internal_os_ZygoteInit(JNIEnv* env);
extern int register_android_util_Base64(JNIEnv* env);
extern int register_android_location_GpsLocationProvider(JNIEnv* env);
+extern int register_android_backup_BackupDataOutput(JNIEnv *env);
extern int register_android_backup_FileBackupHelper(JNIEnv *env);
static AndroidRuntime* gCurRuntime = NULL;
@@ -1157,7 +1157,6 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_media_ToneGenerator),
REG_JNI(register_android_opengl_classes),
- REG_JNI(register_android_bluetooth_Database),
REG_JNI(register_android_bluetooth_HeadsetBase),
REG_JNI(register_android_bluetooth_BluetoothAudioGateway),
REG_JNI(register_android_bluetooth_RfcommSocket),
@@ -1169,6 +1168,7 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_ddm_DdmHandleNativeHeap),
REG_JNI(register_android_util_Base64),
REG_JNI(register_android_location_GpsLocationProvider),
+ REG_JNI(register_android_backup_BackupDataOutput),
REG_JNI(register_android_backup_FileBackupHelper),
};
diff --git a/core/jni/CursorWindow.cpp b/core/jni/CursorWindow.cpp
index fb891c9..7864189 100644
--- a/core/jni/CursorWindow.cpp
+++ b/core/jni/CursorWindow.cpp
@@ -18,7 +18,7 @@
#define LOG_TAG "CursorWindow"
#include <utils/Log.h>
-#include <utils/MemoryDealer.h>
+#include <binder/MemoryDealer.h>
#include <assert.h>
#include <string.h>
diff --git a/core/jni/CursorWindow.h b/core/jni/CursorWindow.h
index 0fb074f..e98b009 100644
--- a/core/jni/CursorWindow.h
+++ b/core/jni/CursorWindow.h
@@ -21,7 +21,7 @@
#include <stddef.h>
#include <stdint.h>
-#include <utils/MemoryDealer.h>
+#include <binder/MemoryDealer.h>
#include <utils/RefBase.h>
#include <jni.h>
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 65f44d5..29d8d3c 100644
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -5,7 +5,7 @@
#include "SkDither.h"
#include "SkUnPreMultiply.h"
-#include "Parcel.h"
+#include <binder/Parcel.h>
#include "android_util_Binder.h"
#include "android_nio_utils.h"
#include "CreateJavaOutputStreamAdaptor.h"
diff --git a/core/jni/android/graphics/Region.cpp b/core/jni/android/graphics/Region.cpp
index 1dc0314..723cd37 100644
--- a/core/jni/android/graphics/Region.cpp
+++ b/core/jni/android/graphics/Region.cpp
@@ -134,7 +134,7 @@ static void Region_scale(JNIEnv* env, jobject region, jfloat scale, jobject dst)
////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#include "Parcel.h"
+#include <binder/Parcel.h>
#include "android_util_Binder.h"
static SkRegion* Region_createFromParcel(JNIEnv* env, jobject clazz, jobject parcel)
diff --git a/core/jni/android_backup_BackupDataOutput.cpp b/core/jni/android_backup_BackupDataOutput.cpp
new file mode 100644
index 0000000..8fce2a2
--- /dev/null
+++ b/core/jni/android_backup_BackupDataOutput.cpp
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "FileBackupHelper_native"
+#include <utils/Log.h>
+
+#include "JNIHelp.h"
+#include <android_runtime/AndroidRuntime.h>
+
+#include <utils/backup_helpers.h>
+
+namespace android
+{
+
+static jfieldID s_descriptorField = 0;
+
+static int
+ctor_native(JNIEnv* env, jobject This, jobject fileDescriptor)
+{
+ int err;
+
+ int fd = env->GetIntField(fileDescriptor, s_descriptorField);
+ if (fd == -1) {
+ return NULL;
+ }
+
+ return (int)new BackupDataWriter(fd);
+}
+
+static void
+dtor_native(JNIEnv* env, jobject This, int fd)
+{
+ delete (BackupDataWriter*)fd;
+}
+
+static const JNINativeMethod g_methods[] = {
+ { "ctor", "(Ljava/io/FileDescriptor;)I", (void*)ctor_native },
+ { "dtor", "(I)V", (void*)dtor_native },
+};
+
+int register_android_backup_BackupDataOutput(JNIEnv* env)
+{
+ LOGD("register_android_backup_BackupDataOutput");
+
+ jclass clazz;
+
+ clazz = env->FindClass("java/io/FileDescriptor");
+ LOG_FATAL_IF(clazz == NULL, "Unable to find class java.io.FileDescriptor");
+ s_descriptorField = env->GetFieldID(clazz, "descriptor", "I");
+ LOG_FATAL_IF(s_descriptorField == NULL,
+ "Unable to find descriptor field in java.io.FileDescriptor");
+
+ return AndroidRuntime::registerNativeMethods(env, "android/backup/BackupDataOutput",
+ g_methods, NELEM(g_methods));
+}
+
+}
diff --git a/core/jni/android_backup_FileBackupHelper.cpp b/core/jni/android_backup_FileBackupHelper.cpp
index c6de3a5..a05d812 100644
--- a/core/jni/android_backup_FileBackupHelper.cpp
+++ b/core/jni/android_backup_FileBackupHelper.cpp
@@ -28,7 +28,7 @@ namespace android
static jfieldID s_descriptorField = 0;
static int
-performBackup_native(JNIEnv* env, jobject clazz, jstring basePath, jobject oldState, jobject data,
+performBackup_native(JNIEnv* env, jobject clazz, jstring basePath, jobject oldState, int data,
jobject newState, jobjectArray files)
{
int err;
@@ -37,7 +37,7 @@ performBackup_native(JNIEnv* env, jobject clazz, jstring basePath, jobject oldSt
LOGD("oldState=%p newState=%p data=%p\n", oldState, newState, data);
int oldStateFD = oldState != NULL ? env->GetIntField(oldState, s_descriptorField) : -1;
int newStateFD = env->GetIntField(newState, s_descriptorField);
- int dataFD = env->GetIntField(data, s_descriptorField);
+ BackupDataWriter* dataStream = (BackupDataWriter*)data;
char const* basePathUTF = env->GetStringUTFChars(basePath, NULL);
LOGD("basePathUTF=\"%s\"\n", basePathUTF);
@@ -47,7 +47,7 @@ performBackup_native(JNIEnv* env, jobject clazz, jstring basePath, jobject oldSt
filesUTF[i] = env->GetStringUTFChars((jstring)env->GetObjectArrayElement(files, i), NULL);
}
- err = back_up_files(oldStateFD, dataFD, newStateFD, basePathUTF, filesUTF, fileCount);
+ err = back_up_files(oldStateFD, dataStream, newStateFD, basePathUTF, filesUTF, fileCount);
for (int i=0; i<fileCount; i++) {
env->ReleaseStringUTFChars((jstring)env->GetObjectArrayElement(files, i), filesUTF[i]);
@@ -60,8 +60,7 @@ performBackup_native(JNIEnv* env, jobject clazz, jstring basePath, jobject oldSt
static const JNINativeMethod g_methods[] = {
{ "performBackup_native",
- "(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;"
- "Ljava/io/FileDescriptor;[Ljava/lang/String;)I",
+ "(Ljava/lang/String;Ljava/io/FileDescriptor;ILjava/io/FileDescriptor;[Ljava/lang/String;)I",
(void*)performBackup_native },
};
diff --git a/core/jni/android_bluetooth_Database.cpp b/core/jni/android_bluetooth_Database.cpp
deleted file mode 100644
index 136c9a3..0000000
--- a/core/jni/android_bluetooth_Database.cpp
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define DBUS_CLASS_NAME BLUEZ_DBUS_BASE_IFC ".Database"
-#define LOG_TAG "bluetooth_Database.cpp"
-
-#include "android_bluetooth_common.h"
-#include "android_runtime/AndroidRuntime.h"
-#include "JNIHelp.h"
-#include "jni.h"
-#include "utils/Log.h"
-
-#ifdef HAVE_BLUETOOTH
-#include <dbus/dbus.h>
-#endif
-
-namespace android {
-
-#ifdef HAVE_BLUETOOTH
-static DBusConnection* conn = NULL; // Singleton thread-safe connection
-#endif
-
-static void classInitNative(JNIEnv* env, jclass clazz) {
- LOGV(__FUNCTION__);
-#ifdef HAVE_BLUETOOTH
- conn = NULL;
-#endif
-}
-
-static void initializeNativeDataNative(JNIEnv* env, jobject object) {
- LOGV(__FUNCTION__);
-
-#ifdef HAVE_BLUETOOTH
- if (conn == NULL) {
- DBusError err;
- dbus_error_init(&err);
- dbus_threads_init_default();
- conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
- if (dbus_error_is_set(&err)) {
- LOGE("Could not get onto the system bus!");
- dbus_error_free(&err);
- }
- }
-#endif
-}
-
-static void cleanupNativeDataNative(JNIEnv* env, jobject object) {
- LOGV(__FUNCTION__);
-}
-
-static jint addServiceRecordNative(JNIEnv *env, jobject object,
- jbyteArray record) {
- LOGV(__FUNCTION__);
-#ifdef HAVE_BLUETOOTH
- if (conn != NULL) {
- jbyte* c_record = env->GetByteArrayElements(record, NULL);
- DBusMessage *reply = dbus_func_args(env,
- conn,
- BLUEZ_DBUS_BASE_PATH,
- DBUS_CLASS_NAME,
- "AddServiceRecord",
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
- &c_record,
- env->GetArrayLength(record),
- DBUS_TYPE_INVALID);
- env->ReleaseByteArrayElements(record, c_record, JNI_ABORT);
- return reply ? dbus_returns_uint32(env, reply) : -1;
- }
-#endif
- return -1;
-}
-
-static jint addServiceRecordFromXmlNative(JNIEnv *env, jobject object,
- jstring record) {
- LOGV(__FUNCTION__);
-#ifdef HAVE_BLUETOOTH
- if (conn != NULL) {
- const char *c_record = env->GetStringUTFChars(record, NULL);
- DBusMessage *reply = dbus_func_args(env,
- conn,
- BLUEZ_DBUS_BASE_PATH,
- DBUS_CLASS_NAME,
- "AddServiceRecordFromXML",
- DBUS_TYPE_STRING, &c_record,
- DBUS_TYPE_INVALID);
- env->ReleaseStringUTFChars(record, c_record);
- return reply ? dbus_returns_uint32(env, reply) : -1;
- }
-#endif
- return -1;
-}
-
-static void updateServiceRecordNative(JNIEnv *env, jobject object,
- jint handle,
- jbyteArray record) {
- LOGV(__FUNCTION__);
-#ifdef HAVE_BLUETOOTH
- if (conn != NULL) {
- jbyte* c_record = env->GetByteArrayElements(record, NULL);
- DBusMessage *reply = dbus_func_args(env,
- conn,
- BLUEZ_DBUS_BASE_PATH,
- DBUS_CLASS_NAME,
- "UpdateServiceRecord",
- DBUS_TYPE_UINT32, &handle,
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
- &c_record,
- env->GetArrayLength(record),
- DBUS_TYPE_INVALID);
- env->ReleaseByteArrayElements(record, c_record, JNI_ABORT);
- }
-#endif
-}
-
-static void updateServiceRecordFromXmlNative(JNIEnv *env, jobject object,
- jint handle,
- jstring record) {
- LOGV(__FUNCTION__);
-#ifdef HAVE_BLUETOOTH
- if (conn != NULL) {
- const char *c_record = env->GetStringUTFChars(record, NULL);
- DBusMessage *reply = dbus_func_args(env,
- conn,
- BLUEZ_DBUS_BASE_PATH,
- DBUS_CLASS_NAME,
- "UpdateServiceRecordFromXML",
- DBUS_TYPE_UINT32, &handle,
- DBUS_TYPE_STRING, &c_record,
- DBUS_TYPE_INVALID);
- env->ReleaseStringUTFChars(record, c_record);
- }
-#endif
-}
-
-/* private static native void removeServiceRecordNative(int handle); */
-static void removeServiceRecordNative(JNIEnv *env, jobject object,
- jint handle) {
- LOGV(__FUNCTION__);
-#ifdef HAVE_BLUETOOTH
- if (conn != NULL) {
- DBusMessage *reply = dbus_func_args(env,
- conn,
- BLUEZ_DBUS_BASE_PATH,
- DBUS_CLASS_NAME,
- "RemoveServiceRecord",
- DBUS_TYPE_UINT32, &handle,
- DBUS_TYPE_INVALID);
- }
-#endif
-}
-
-
-static JNINativeMethod sMethods[] = {
- /* name, signature, funcPtr */
- {"classInitNative", "()V", (void*)classInitNative},
- {"initializeNativeDataNative", "()V", (void *)initializeNativeDataNative},
- {"cleanupNativeDataNative", "()V", (void *)cleanupNativeDataNative},
- {"addServiceRecordNative", "([B)I", (void*)addServiceRecordNative},
- {"addServiceRecordFromXmlNative", "(Ljava/lang/String;)I", (void*)addServiceRecordFromXmlNative},
- {"updateServiceRecordNative", "(I[B)V", (void*)updateServiceRecordNative},
- {"updateServiceRecordFromXmlNative", "(ILjava/lang/String;)V", (void*)updateServiceRecordFromXmlNative},
- {"removeServiceRecordNative", "(I)V", (void*)removeServiceRecordNative},
-};
-
-int register_android_bluetooth_Database(JNIEnv *env) {
- return AndroidRuntime::registerNativeMethods(env,
- "android/bluetooth/Database", sMethods, NELEM(sMethods));
-}
-
-} /* namespace android */
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp
index c107993..31086b8 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -25,7 +25,7 @@
#include <ui/Surface.h>
#include <ui/Camera.h>
-#include <utils/IMemory.h>
+#include <binder/IMemory.h>
using namespace android;
diff --git a/core/jni/android_location_GpsLocationProvider.cpp b/core/jni/android_location_GpsLocationProvider.cpp
index 004b0e3..0858741 100644
--- a/core/jni/android_location_GpsLocationProvider.cpp
+++ b/core/jni/android_location_GpsLocationProvider.cpp
@@ -176,7 +176,7 @@ static jboolean android_location_GpsLocationProvider_start(JNIEnv* env, jobject
{
int result = sGpsInterface->set_position_mode(positionMode, (singleFix ? 0 : fixFrequency));
if (result) {
- return result;
+ return false;
}
return (sGpsInterface->start() == 0);
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index 42ada54..0cce3a6 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -30,8 +30,8 @@
#include "media/AudioSystem.h"
#include "media/AudioTrack.h"
-#include <utils/MemoryHeapBase.h>
-#include <utils/MemoryBase.h>
+#include <binder/MemoryHeapBase.h>
+#include <binder/MemoryBase.h>
// ----------------------------------------------------------------------------
diff --git a/core/jni/android_opengl_GLES10.cpp b/core/jni/android_opengl_GLES10.cpp
index 482d8eb..2685d75 100644
--- a/core/jni/android_opengl_GLES10.cpp
+++ b/core/jni/android_opengl_GLES10.cpp
@@ -133,6 +133,19 @@ releasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit)
commit ? 0 : JNI_ABORT);
}
+static void *
+getDirectBufferPointer(JNIEnv *_env, jobject buffer) {
+ char* buf = (char*) _env->GetDirectBufferAddress(buffer);
+ if (buf) {
+ jint position = _env->GetIntField(buffer, positionID);
+ jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
+ buf += position << elementSizeShift;
+ } else {
+ _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
+ }
+ return (void*) buf;
+}
+
static int
getNumCompressedTextureFormats() {
int numCompressedTextureFormats = 0;
@@ -305,9 +318,8 @@ android_glColorPointerBounds__IIILjava_nio_Buffer_2I
GLvoid *pointer = (GLvoid *) 0;
if (pointer_buf) {
- pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf);
if ( ! pointer ) {
- _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
return;
}
}
@@ -2779,9 +2791,8 @@ android_glNormalPointerBounds__IILjava_nio_Buffer_2I
GLvoid *pointer = (GLvoid *) 0;
if (pointer_buf) {
- pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf);
if ( ! pointer ) {
- _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
return;
}
}
@@ -3034,9 +3045,8 @@ android_glTexCoordPointerBounds__IIILjava_nio_Buffer_2I
GLvoid *pointer = (GLvoid *) 0;
if (pointer_buf) {
- pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf);
if ( ! pointer ) {
- _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
return;
}
}
@@ -3392,9 +3402,8 @@ android_glVertexPointerBounds__IIILjava_nio_Buffer_2I
GLvoid *pointer = (GLvoid *) 0;
if (pointer_buf) {
- pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf);
if ( ! pointer ) {
- _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
return;
}
}
diff --git a/core/jni/android_text_format_Time.cpp b/core/jni/android_text_format_Time.cpp
index 923e1aa..7c208e9 100644
--- a/core/jni/android_text_format_Time.cpp
+++ b/core/jni/android_text_format_Time.cpp
@@ -44,6 +44,7 @@ static jfieldID g_timezoneField = 0;
static jfieldID g_shortMonthsField = 0;
static jfieldID g_longMonthsField = 0;
+static jfieldID g_longStandaloneMonthsField = 0;
static jfieldID g_shortWeekdaysField = 0;
static jfieldID g_longWeekdaysField = 0;
static jfieldID g_timeOnlyFormatField = 0;
@@ -193,6 +194,7 @@ static jstring android_text_format_Time_format(JNIEnv* env, jobject This,
static jobject js_locale_previous = NULL;
static struct strftime_locale locale;
static jstring js_mon[12], js_month[12], js_wday[7], js_weekday[7];
+ static jstring js_standalone_month[12];
static jstring js_X_fmt, js_x_fmt, js_c_fmt, js_am, js_pm, js_date_fmt;
Time t;
@@ -206,8 +208,10 @@ static jstring android_text_format_Time_format(JNIEnv* env, jobject This,
for (int i = 0; i < 12; i++) {
env->ReleaseStringUTFChars(js_mon[i], locale.mon[i]);
env->ReleaseStringUTFChars(js_month[i], locale.month[i]);
+ env->ReleaseStringUTFChars(js_standalone_month[i], locale.standalone_month[i]);
env->DeleteGlobalRef(js_mon[i]);
env->DeleteGlobalRef(js_month[i]);
+ env->DeleteGlobalRef(js_standalone_month[i]);
}
for (int i = 0; i < 7; i++) {
@@ -245,6 +249,12 @@ static jstring android_text_format_Time_format(JNIEnv* env, jobject This,
locale.month[i] = env->GetStringUTFChars(js_month[i], NULL);
}
+ ja = (jobjectArray) env->GetStaticObjectField(timeClass, g_longStandaloneMonthsField);
+ for (int i = 0; i < 12; i++) {
+ js_standalone_month[i] = (jstring) env->NewGlobalRef(env->GetObjectArrayElement(ja, i));
+ locale.standalone_month[i] = env->GetStringUTFChars(js_standalone_month[i], NULL);
+ }
+
ja = (jobjectArray) env->GetStaticObjectField(timeClass, g_shortWeekdaysField);
for (int i = 0; i < 7; i++) {
js_wday[i] = (jstring) env->NewGlobalRef(env->GetObjectArrayElement(ja, i));
@@ -639,6 +649,7 @@ int register_android_text_format_Time(JNIEnv* env)
g_shortMonthsField = env->GetStaticFieldID(timeClass, "sShortMonths", "[Ljava/lang/String;");
g_longMonthsField = env->GetStaticFieldID(timeClass, "sLongMonths", "[Ljava/lang/String;");
+ g_longStandaloneMonthsField = env->GetStaticFieldID(timeClass, "sLongStandaloneMonths", "[Ljava/lang/String;");
g_shortWeekdaysField = env->GetStaticFieldID(timeClass, "sShortWeekdays", "[Ljava/lang/String;");
g_longWeekdaysField = env->GetStaticFieldID(timeClass, "sLongWeekdays", "[Ljava/lang/String;");
g_timeOnlyFormatField = env->GetStaticFieldID(timeClass, "sTimeOnlyFormat", "Ljava/lang/String;");
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index 7325432..f0885fd 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -25,12 +25,12 @@
#include <stdio.h>
#include <utils/Atomic.h>
-#include <utils/IInterface.h>
-#include <utils/IPCThreadState.h>
+#include <binder/IInterface.h>
+#include <binder/IPCThreadState.h>
#include <utils/Log.h>
-#include <utils/Parcel.h>
-#include <utils/ProcessState.h>
-#include <utils/IServiceManager.h>
+#include <binder/Parcel.h>
+#include <binder/ProcessState.h>
+#include <binder/IServiceManager.h>
#include <android_runtime/AndroidRuntime.h>
diff --git a/core/jni/android_util_Binder.h b/core/jni/android_util_Binder.h
index 16d993d..495e76a 100644
--- a/core/jni/android_util_Binder.h
+++ b/core/jni/android_util_Binder.h
@@ -15,7 +15,7 @@
** limitations under the License.
*/
-#include <utils/IBinder.h>
+#include <binder/IBinder.h>
#include "jni.h"
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index d760feb..e8bffa4 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -18,9 +18,9 @@
#define LOG_TAG "Process"
#include <utils/Log.h>
-#include <utils/IPCThreadState.h>
-#include <utils/ProcessState.h>
-#include <utils/IServiceManager.h>
+#include <binder/IPCThreadState.h>
+#include <binder/ProcessState.h>
+#include <binder/IServiceManager.h>
#include <utils/String8.h>
#include <utils/Vector.h>
@@ -236,6 +236,36 @@ void android_os_Process_setThreadGroup(JNIEnv* env, jobject clazz, int pid, jint
signalExceptionForGroupError(env, clazz, errno);
}
+void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jint grp)
+{
+ DIR *d;
+ FILE *fp;
+ char proc_path[255];
+ struct dirent *de;
+
+ if (grp > ANDROID_TGROUP_MAX || grp < 0) {
+ signalExceptionForGroupError(env, clazz, EINVAL);
+ return;
+ }
+
+ sprintf(proc_path, "/proc/%d/task", pid);
+ if (!(d = opendir(proc_path))) {
+ signalExceptionForGroupError(env, clazz, errno);
+ return;
+ }
+
+ while ((de = readdir(d))) {
+ if (de->d_name[0] == '.')
+ continue;
+ if (add_pid_to_cgroup(atoi(de->d_name), grp)) {
+ signalExceptionForGroupError(env, clazz, errno);
+ closedir(d);
+ return;
+ }
+ }
+ closedir(d);
+}
+
void android_os_Process_setThreadPriority(JNIEnv* env, jobject clazz,
jint pid, jint pri)
{
@@ -820,6 +850,7 @@ static const JNINativeMethod methods[] = {
{"setThreadPriority", "(I)V", (void*)android_os_Process_setCallingThreadPriority},
{"getThreadPriority", "(I)I", (void*)android_os_Process_getThreadPriority},
{"setThreadGroup", "(II)V", (void*)android_os_Process_setThreadGroup},
+ {"setProcessGroup", "(II)V", (void*)android_os_Process_setProcessGroup},
{"setOomAdj", "(II)Z", (void*)android_os_Process_setOomAdj},
{"setArgV0", "(Ljava/lang/String;)V", (void*)android_os_Process_setArgV0},
{"setUid", "(I)I", (void*)android_os_Process_setUid},
diff --git a/core/jni/com_google_android_gles_jni_GLImpl.cpp b/core/jni/com_google_android_gles_jni_GLImpl.cpp
index 11822e0..15e3a81 100644
--- a/core/jni/com_google_android_gles_jni_GLImpl.cpp
+++ b/core/jni/com_google_android_gles_jni_GLImpl.cpp
@@ -133,6 +133,19 @@ releasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit)
commit ? 0 : JNI_ABORT);
}
+static void *
+getDirectBufferPointer(JNIEnv *_env, jobject buffer) {
+ char* buf = (char*) _env->GetDirectBufferAddress(buffer);
+ if (buf) {
+ jint position = _env->GetIntField(buffer, positionID);
+ jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
+ buf += position << elementSizeShift;
+ } else {
+ _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
+ }
+ return (void*) buf;
+}
+
static int
getNumCompressedTextureFormats() {
int numCompressedTextureFormats = 0;
@@ -305,9 +318,8 @@ android_glColorPointerBounds__IIILjava_nio_Buffer_2I
GLvoid *pointer = (GLvoid *) 0;
if (pointer_buf) {
- pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf);
if ( ! pointer ) {
- _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
return;
}
}
@@ -2779,9 +2791,8 @@ android_glNormalPointerBounds__IILjava_nio_Buffer_2I
GLvoid *pointer = (GLvoid *) 0;
if (pointer_buf) {
- pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf);
if ( ! pointer ) {
- _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
return;
}
}
@@ -3034,9 +3045,8 @@ android_glTexCoordPointerBounds__IIILjava_nio_Buffer_2I
GLvoid *pointer = (GLvoid *) 0;
if (pointer_buf) {
- pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf);
if ( ! pointer ) {
- _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
return;
}
}
@@ -3392,9 +3402,8 @@ android_glVertexPointerBounds__IIILjava_nio_Buffer_2I
GLvoid *pointer = (GLvoid *) 0;
if (pointer_buf) {
- pointer = (GLvoid *) _env->GetDirectBufferAddress(pointer_buf);
+ pointer = (GLvoid *) getDirectBufferPointer(_env, pointer_buf);
if ( ! pointer ) {
- _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
return;
}
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 05fbe64..b97e07b 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -220,12 +220,6 @@
android:label="@string/permlab_installLocationProvider"
android:description="@string/permdesc_installLocationProvider" />
- <!-- Allows an application to install a location collector into the Location Manager -->
- <permission android:name="android.permission.INSTALL_LOCATION_COLLECTOR"
- android:protectionLevel="signatureOrSystem"
- android:label="@string/permlab_installLocationCollector"
- android:description="@string/permdesc_installLocationCollector" />
-
<!-- ======================================= -->
<!-- Permissions for accessing networks -->
<!-- ======================================= -->
@@ -389,11 +383,11 @@
android:description="@string/permgroupdesc_storage" />
<!-- Allows an application to write to the SD card -->
- <permission android:name="android.permission.SDCARD_WRITE"
+ <permission android:name="android.permission.WRITE_SDCARD"
android:permissionGroup="android.permission-group.STORAGE"
android:label="@string/permlab_sdcardWrite"
android:description="@string/permdesc_sdcardWrite"
- android:protectionLevel="normal" />
+ android:protectionLevel="dangerous" />
<!-- ============================================ -->
<!-- Permissions for low-level system interaction -->
@@ -803,14 +797,22 @@
android:description="@string/permdesc_runSetActivityWatcher"
android:protectionLevel="signature" />
- <!-- Allows an application to watch and control how activities are
- started globally in the system. Only for is in debugging
- (usually the monkey command). -->
+ <!-- Allows an application to call the activity manager shutdown() API
+ to put the higher-level system there into a shutdown state. -->
<permission android:name="android.permission.SHUTDOWN"
android:label="@string/permlab_shutdown"
android:description="@string/permdesc_shutdown"
android:protectionLevel="signature" />
+ <!-- Allows an application to tell the activity manager to temporarily
+ stop application switches, putting it into a special mode that
+ prevents applications from immediately switching away from some
+ critical UI such as the home screen. -->
+ <permission android:name="android.permission.STOP_APP_SWITCHES"
+ android:label="@string/permlab_stopAppSwitches"
+ android:description="@string/permdesc_stopAppSwitches"
+ android:protectionLevel="signature" />
+
<!-- Allows an application to retrieve the current state of keys and
switches. This is only for use by the system.-->
<permission android:name="android.permission.READ_INPUT_STATE"
@@ -973,7 +975,7 @@
android:permissionGroup="android.permission-group.PERSONAL_INFO"
android:label="@string/permlab_bindGadget"
android:description="@string/permdesc_bindGadget"
- android:protectionLevel="signature" />
+ android:protectionLevel="signatureOrSystem" />
<!-- Allows applications to change the background data setting
@hide pending API council -->
diff --git a/core/res/res/drawable/search_spinner.xml b/core/res/res/drawable/search_spinner.xml
new file mode 100644
index 0000000..34c163d
--- /dev/null
+++ b/core/res/res/drawable/search_spinner.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<animation-list
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:oneshot="false">
+ <item android:drawable="@drawable/search_spinner_anim1" android:duration="150" />
+ <item android:drawable="@drawable/search_spinner_anim2" android:duration="150" />
+ <item android:drawable="@drawable/search_spinner_anim3" android:duration="150" />
+ <item android:drawable="@drawable/search_spinner_anim4" android:duration="150" />
+ <item android:drawable="@drawable/search_spinner_anim5" android:duration="150" />
+ <item android:drawable="@drawable/search_spinner_anim6" android:duration="150" />
+ <item android:drawable="@drawable/search_spinner_anim7" android:duration="150" />
+ <item android:drawable="@drawable/search_spinner_anim8" android:duration="150" />
+ <item android:drawable="@drawable/search_spinner_anim9" android:duration="150" />
+ <item android:drawable="@drawable/search_spinner_anim10" android:duration="150" />
+ <item android:drawable="@drawable/search_spinner_anim11" android:duration="150" />
+ <item android:drawable="@drawable/search_spinner_anim12" android:duration="150" />
+</animation-list>
+
diff --git a/core/res/res/drawable/search_spinner_anim1.png b/core/res/res/drawable/search_spinner_anim1.png
new file mode 100755
index 0000000..e55b60d
--- /dev/null
+++ b/core/res/res/drawable/search_spinner_anim1.png
Binary files differ
diff --git a/core/res/res/drawable/search_spinner_anim10.png b/core/res/res/drawable/search_spinner_anim10.png
new file mode 100755
index 0000000..9611d97
--- /dev/null
+++ b/core/res/res/drawable/search_spinner_anim10.png
Binary files differ
diff --git a/core/res/res/drawable/search_spinner_anim11.png b/core/res/res/drawable/search_spinner_anim11.png
new file mode 100755
index 0000000..4261704
--- /dev/null
+++ b/core/res/res/drawable/search_spinner_anim11.png
Binary files differ
diff --git a/core/res/res/drawable/search_spinner_anim12.png b/core/res/res/drawable/search_spinner_anim12.png
new file mode 100755
index 0000000..0602314
--- /dev/null
+++ b/core/res/res/drawable/search_spinner_anim12.png
Binary files differ
diff --git a/core/res/res/drawable/search_spinner_anim2.png b/core/res/res/drawable/search_spinner_anim2.png
new file mode 100755
index 0000000..05d58e0
--- /dev/null
+++ b/core/res/res/drawable/search_spinner_anim2.png
Binary files differ
diff --git a/core/res/res/drawable/search_spinner_anim3.png b/core/res/res/drawable/search_spinner_anim3.png
new file mode 100755
index 0000000..69fa9c1
--- /dev/null
+++ b/core/res/res/drawable/search_spinner_anim3.png
Binary files differ
diff --git a/core/res/res/drawable/search_spinner_anim4.png b/core/res/res/drawable/search_spinner_anim4.png
new file mode 100755
index 0000000..9201bac
--- /dev/null
+++ b/core/res/res/drawable/search_spinner_anim4.png
Binary files differ
diff --git a/core/res/res/drawable/search_spinner_anim5.png b/core/res/res/drawable/search_spinner_anim5.png
new file mode 100755
index 0000000..f0c7101
--- /dev/null
+++ b/core/res/res/drawable/search_spinner_anim5.png
Binary files differ
diff --git a/core/res/res/drawable/search_spinner_anim6.png b/core/res/res/drawable/search_spinner_anim6.png
new file mode 100755
index 0000000..99d1d4e
--- /dev/null
+++ b/core/res/res/drawable/search_spinner_anim6.png
Binary files differ
diff --git a/core/res/res/drawable/search_spinner_anim7.png b/core/res/res/drawable/search_spinner_anim7.png
new file mode 100755
index 0000000..8ca3358
--- /dev/null
+++ b/core/res/res/drawable/search_spinner_anim7.png
Binary files differ
diff --git a/core/res/res/drawable/search_spinner_anim8.png b/core/res/res/drawable/search_spinner_anim8.png
new file mode 100755
index 0000000..408d723
--- /dev/null
+++ b/core/res/res/drawable/search_spinner_anim8.png
Binary files differ
diff --git a/core/res/res/drawable/search_spinner_anim9.png b/core/res/res/drawable/search_spinner_anim9.png
new file mode 100755
index 0000000..42a2c65
--- /dev/null
+++ b/core/res/res/drawable/search_spinner_anim9.png
Binary files differ
diff --git a/core/res/res/drawable/stat_ecb_mode.png b/core/res/res/drawable/stat_ecb_mode.png
new file mode 100644
index 0000000..a948770
--- /dev/null
+++ b/core/res/res/drawable/stat_ecb_mode.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_data_dormant_1xrtt.png b/core/res/res/drawable/stat_sys_data_dormant_1xrtt.png
new file mode 100755
index 0000000..11c2eae
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_data_dormant_1xrtt.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_data_dormant_evdo.png b/core/res/res/drawable/stat_sys_data_dormant_evdo.png
new file mode 100755
index 0000000..811fcb5
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_data_dormant_evdo.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_roaming_cdma_0.png b/core/res/res/drawable/stat_sys_roaming_cdma_0.png
new file mode 100755
index 0000000..c61cce7
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_roaming_cdma_0.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_roaming_cdma_flash.xml b/core/res/res/drawable/stat_sys_roaming_cdma_flash.xml
new file mode 100644
index 0000000..07dc446
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_roaming_cdma_flash.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/common/res/drawable/stat_sys_battery.xml
+**
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<animation-list
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:oneshot="false">
+ <item android:drawable="@drawable/stat_sys_roaming_cdma_flash_anim0" android:duration="800" />
+ <item android:drawable="@drawable/stat_sys_roaming_cdma_flash_anim1" android:duration="1200" />
+</animation-list>
diff --git a/core/res/res/drawable/stat_sys_roaming_cdma_flash_anim0.png b/core/res/res/drawable/stat_sys_roaming_cdma_flash_anim0.png
new file mode 100755
index 0000000..d62502d
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_roaming_cdma_flash_anim0.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_roaming_cdma_flash_anim1.png b/core/res/res/drawable/stat_sys_roaming_cdma_flash_anim1.png
new file mode 100755
index 0000000..c61cce7
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_roaming_cdma_flash_anim1.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_signal_cdma_0.png b/core/res/res/drawable/stat_sys_signal_cdma_0.png
new file mode 100755
index 0000000..0ef7d53
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_signal_cdma_0.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_signal_cdma_1.png b/core/res/res/drawable/stat_sys_signal_cdma_1.png
new file mode 100755
index 0000000..f4839d4
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_signal_cdma_1.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_signal_cdma_2.png b/core/res/res/drawable/stat_sys_signal_cdma_2.png
new file mode 100755
index 0000000..e25a99c
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_signal_cdma_2.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_signal_cdma_3.png b/core/res/res/drawable/stat_sys_signal_cdma_3.png
new file mode 100755
index 0000000..d828d99
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_signal_cdma_3.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_signal_cdma_4.png b/core/res/res/drawable/stat_sys_signal_cdma_4.png
new file mode 100755
index 0000000..53a31ea
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_signal_cdma_4.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_signal_evdo_0.png b/core/res/res/drawable/stat_sys_signal_evdo_0.png
new file mode 100755
index 0000000..1b8aec7
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_signal_evdo_0.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_signal_evdo_1.png b/core/res/res/drawable/stat_sys_signal_evdo_1.png
new file mode 100755
index 0000000..7ce01fd
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_signal_evdo_1.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_signal_evdo_2.png b/core/res/res/drawable/stat_sys_signal_evdo_2.png
new file mode 100755
index 0000000..890cd59
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_signal_evdo_2.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_signal_evdo_3.png b/core/res/res/drawable/stat_sys_signal_evdo_3.png
new file mode 100755
index 0000000..712c640
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_signal_evdo_3.png
Binary files differ
diff --git a/core/res/res/drawable/stat_sys_signal_evdo_4.png b/core/res/res/drawable/stat_sys_signal_evdo_4.png
new file mode 100755
index 0000000..f0537dd
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_signal_evdo_4.png
Binary files differ
diff --git a/core/res/res/layout/google_web_content_helper_layout.xml b/core/res/res/layout/google_web_content_helper_layout.xml
index 40f84bf..546c458 100644
--- a/core/res/res/layout/google_web_content_helper_layout.xml
+++ b/core/res/res/layout/google_web_content_helper_layout.xml
@@ -18,10 +18,28 @@
android:foregroundGravity="center"
android:measureAllChildren="false">
- <!-- Include the indeterminate progress dialog's layout. -->
- <include
- android:id="@+id/progressContainer"
- layout="@android:layout/progress_dialog" />
+ <LinearLayout android:id="@+id/progressContainer"
+ android:orientation="horizontal"
+ android:layout_gravity="center"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:baselineAligned="false"
+ android:paddingLeft="8dip"
+ android:paddingTop="10dip"
+ android:paddingRight="8dip"
+ android:paddingBottom="10dip">
+
+ <ProgressBar android:id="@android:id/progress"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:max="10000"
+ android:layout_marginRight="12dip" />
+
+ <TextView android:id="@+id/message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical" />
+ </LinearLayout>
<WebView
android:id="@+id/web"
diff --git a/core/res/res/layout/search_bar.xml b/core/res/res/layout/search_bar.xml
index b512490..7b7f8a6 100644
--- a/core/res/res/layout/search_bar.xml
+++ b/core/res/res/layout/search_bar.xml
@@ -71,6 +71,7 @@
android:layout_weight="1.0"
android:paddingLeft="8dip"
android:paddingRight="6dip"
+ android:drawablePadding="2dip"
android:singleLine="true"
android:inputType="text|textAutoComplete"
android:dropDownWidth="fill_parent"
diff --git a/core/res/res/raw/latin_lowercase b/core/res/res/raw/latin_lowercase
new file mode 100644
index 0000000..5c38b91
--- /dev/null
+++ b/core/res/res/raw/latin_lowercase
Binary files differ
diff --git a/core/res/res/values-ar-rEG/donottranslate-cldr.xml b/core/res/res/values-ar-rEG/donottranslate-cldr.xml
new file mode 100644
index 0000000..1bbbdca
--- /dev/null
+++ b/core/res/res/values-ar-rEG/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">يناير</string>
+ <string name="month_long_standalone_february">فبراير</string>
+ <string name="month_long_standalone_march">مارس</string>
+ <string name="month_long_standalone_april">أبريل</string>
+ <string name="month_long_standalone_may">مايو</string>
+ <string name="month_long_standalone_june">يونيو</string>
+ <string name="month_long_standalone_july">يوليو</string>
+ <string name="month_long_standalone_august">أغسطس</string>
+ <string name="month_long_standalone_september">سبتمبر</string>
+ <string name="month_long_standalone_october">أكتوبر</string>
+ <string name="month_long_standalone_november">نوفمبر</string>
+ <string name="month_long_standalone_december">ديسمبر</string>
+
+ <string name="month_long_january">يناير</string>
+ <string name="month_long_february">فبراير</string>
+ <string name="month_long_march">مارس</string>
+ <string name="month_long_april">أبريل</string>
+ <string name="month_long_may">مايو</string>
+ <string name="month_long_june">يونيو</string>
+ <string name="month_long_july">يوليو</string>
+ <string name="month_long_august">أغسطس</string>
+ <string name="month_long_september">سبتمبر</string>
+ <string name="month_long_october">أكتوبر</string>
+ <string name="month_long_november">نوفمبر</string>
+ <string name="month_long_december">ديسمبر</string>
+
+ <string name="month_medium_january">يناير</string>
+ <string name="month_medium_february">فبراير</string>
+ <string name="month_medium_march">مارس</string>
+ <string name="month_medium_april">أبريل</string>
+ <string name="month_medium_may">مايو</string>
+ <string name="month_medium_june">يونيو</string>
+ <string name="month_medium_july">يوليو</string>
+ <string name="month_medium_august">أغسطس</string>
+ <string name="month_medium_september">سبتمبر</string>
+ <string name="month_medium_october">أكتوبر</string>
+ <string name="month_medium_november">نوفمبر</string>
+ <string name="month_medium_december">ديسمبر</string>
+
+ <string name="month_shortest_january">ي</string>
+ <string name="month_shortest_february">ف</string>
+ <string name="month_shortest_march">م</string>
+ <string name="month_shortest_april">أ</string>
+ <string name="month_shortest_may">و</string>
+ <string name="month_shortest_june">ن</string>
+ <string name="month_shortest_july">ل</string>
+ <string name="month_shortest_august">غ</string>
+ <string name="month_shortest_september">س</string>
+ <string name="month_shortest_october">ك</string>
+ <string name="month_shortest_november">ب</string>
+ <string name="month_shortest_december">د</string>
+
+ <string name="day_of_week_long_sunday">الأحد</string>
+ <string name="day_of_week_long_monday">الإثنين</string>
+ <string name="day_of_week_long_tuesday">الثلاثاء</string>
+ <string name="day_of_week_long_wednesday">الأربعاء</string>
+ <string name="day_of_week_long_thursday">الخميس</string>
+ <string name="day_of_week_long_friday">الجمعة</string>
+ <string name="day_of_week_long_saturday">السبت</string>
+
+ <string name="day_of_week_medium_sunday">أحد</string>
+ <string name="day_of_week_medium_monday">إثنين</string>
+ <string name="day_of_week_medium_tuesday">ثلاثاء</string>
+ <string name="day_of_week_medium_wednesday">أربعاء</string>
+ <string name="day_of_week_medium_thursday">خميس</string>
+ <string name="day_of_week_medium_friday">جمعة</string>
+ <string name="day_of_week_medium_saturday">سبت</string>
+
+ <string name="day_of_week_short_sunday">أحد</string>
+ <string name="day_of_week_short_monday">إثنين</string>
+ <string name="day_of_week_short_tuesday">ثلاثاء</string>
+ <string name="day_of_week_short_wednesday">أربعاء</string>
+ <string name="day_of_week_short_thursday">خميس</string>
+ <string name="day_of_week_short_friday">جمعة</string>
+ <string name="day_of_week_short_saturday">سبت</string>
+
+ <string name="day_of_week_shortest_sunday">ح</string>
+ <string name="day_of_week_shortest_monday">ن</string>
+ <string name="day_of_week_shortest_tuesday">ث</string>
+ <string name="day_of_week_shortest_wednesday">ر</string>
+ <string name="day_of_week_shortest_thursday">خ</string>
+ <string name="day_of_week_shortest_friday">ج</string>
+ <string name="day_of_week_shortest_saturday">س</string>
+
+ <string name="am">ص</string>
+ <string name="pm">م</string>
+ <string name="yesterday">أمس</string>
+ <string name="today">اليوم</string>
+ <string name="tomorrow">غدًا</string>
+
+ <string name="hour_minute_ampm">%-l:%M %p</string>
+ <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
+ <string name="numeric_date">%-e‏/%-m‏/%Y</string>
+ <string name="numeric_date_format">d‏/M‏/yyyy</string>
+ <string name="month_day_year">%-e %B، %Y</string>
+ <string name="time_of_day">%-l:%M:%S %p</string>
+ <string name="date_and_time">%-l:%M:%S %p %d‏/%m‏/%Y</string>
+ <string name="abbrev_month_day_year">%d‏/%m‏/%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-bg-rBG/donottranslate-cldr.xml b/core/res/res/values-bg-rBG/donottranslate-cldr.xml
new file mode 100644
index 0000000..608b3a7
--- /dev/null
+++ b/core/res/res/values-bg-rBG/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">януари</string>
+ <string name="month_long_standalone_february">февруари</string>
+ <string name="month_long_standalone_march">март</string>
+ <string name="month_long_standalone_april">април</string>
+ <string name="month_long_standalone_may">май</string>
+ <string name="month_long_standalone_june">юни</string>
+ <string name="month_long_standalone_july">юли</string>
+ <string name="month_long_standalone_august">август</string>
+ <string name="month_long_standalone_september">септември</string>
+ <string name="month_long_standalone_october">октомври</string>
+ <string name="month_long_standalone_november">ноември</string>
+ <string name="month_long_standalone_december">декември</string>
+
+ <string name="month_long_january">януари</string>
+ <string name="month_long_february">февруари</string>
+ <string name="month_long_march">март</string>
+ <string name="month_long_april">април</string>
+ <string name="month_long_may">май</string>
+ <string name="month_long_june">юни</string>
+ <string name="month_long_july">юли</string>
+ <string name="month_long_august">август</string>
+ <string name="month_long_september">септември</string>
+ <string name="month_long_october">октомври</string>
+ <string name="month_long_november">ноември</string>
+ <string name="month_long_december">декември</string>
+
+ <string name="month_medium_january">ян.</string>
+ <string name="month_medium_february">февр.</string>
+ <string name="month_medium_march">март</string>
+ <string name="month_medium_april">апр.</string>
+ <string name="month_medium_may">май</string>
+ <string name="month_medium_june">юни</string>
+ <string name="month_medium_july">юли</string>
+ <string name="month_medium_august">авг.</string>
+ <string name="month_medium_september">септ.</string>
+ <string name="month_medium_october">окт.</string>
+ <string name="month_medium_november">ноем.</string>
+ <string name="month_medium_december">дек.</string>
+
+ <string name="month_shortest_january">я</string>
+ <string name="month_shortest_february">ф</string>
+ <string name="month_shortest_march">м</string>
+ <string name="month_shortest_april">а</string>
+ <string name="month_shortest_may">м</string>
+ <string name="month_shortest_june">ю</string>
+ <string name="month_shortest_july">ю</string>
+ <string name="month_shortest_august">а</string>
+ <string name="month_shortest_september">с</string>
+ <string name="month_shortest_october">о</string>
+ <string name="month_shortest_november">н</string>
+ <string name="month_shortest_december">д</string>
+
+ <string name="day_of_week_long_sunday">неделя</string>
+ <string name="day_of_week_long_monday">понеделник</string>
+ <string name="day_of_week_long_tuesday">вторник</string>
+ <string name="day_of_week_long_wednesday">сряда</string>
+ <string name="day_of_week_long_thursday">четвъртък</string>
+ <string name="day_of_week_long_friday">петък</string>
+ <string name="day_of_week_long_saturday">събота</string>
+
+ <string name="day_of_week_medium_sunday">нд</string>
+ <string name="day_of_week_medium_monday">пн</string>
+ <string name="day_of_week_medium_tuesday">вт</string>
+ <string name="day_of_week_medium_wednesday">ср</string>
+ <string name="day_of_week_medium_thursday">чт</string>
+ <string name="day_of_week_medium_friday">пт</string>
+ <string name="day_of_week_medium_saturday">сб</string>
+
+ <string name="day_of_week_short_sunday">нд</string>
+ <string name="day_of_week_short_monday">пн</string>
+ <string name="day_of_week_short_tuesday">вт</string>
+ <string name="day_of_week_short_wednesday">ср</string>
+ <string name="day_of_week_short_thursday">чт</string>
+ <string name="day_of_week_short_friday">пт</string>
+ <string name="day_of_week_short_saturday">сб</string>
+
+ <string name="day_of_week_shortest_sunday">н</string>
+ <string name="day_of_week_shortest_monday">п</string>
+ <string name="day_of_week_shortest_tuesday">в</string>
+ <string name="day_of_week_shortest_wednesday">с</string>
+ <string name="day_of_week_shortest_thursday">ч</string>
+ <string name="day_of_week_shortest_friday">п</string>
+ <string name="day_of_week_shortest_saturday">с</string>
+
+ <string name="am">пр. об.</string>
+ <string name="pm">сл. об.</string>
+ <string name="yesterday">Вчера</string>
+ <string name="today">Днес</string>
+ <string name="tomorrow">Утре</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%d %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %d.%m.%Y</string>
+ <string name="abbrev_month_day_year">%d.%m.%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y %B</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y %b</string>
+</resources>
diff --git a/core/res/res/values-ca-rES/donottranslate-cldr.xml b/core/res/res/values-ca-rES/donottranslate-cldr.xml
new file mode 100644
index 0000000..6ed2a88
--- /dev/null
+++ b/core/res/res/values-ca-rES/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">gener</string>
+ <string name="month_long_standalone_february">febrer</string>
+ <string name="month_long_standalone_march">març</string>
+ <string name="month_long_standalone_april">abril</string>
+ <string name="month_long_standalone_may">maig</string>
+ <string name="month_long_standalone_june">juny</string>
+ <string name="month_long_standalone_july">juliol</string>
+ <string name="month_long_standalone_august">agost</string>
+ <string name="month_long_standalone_september">setembre</string>
+ <string name="month_long_standalone_october">octubre</string>
+ <string name="month_long_standalone_november">novembre</string>
+ <string name="month_long_standalone_december">desembre</string>
+
+ <string name="month_long_january">gener</string>
+ <string name="month_long_february">febrer</string>
+ <string name="month_long_march">març</string>
+ <string name="month_long_april">abril</string>
+ <string name="month_long_may">maig</string>
+ <string name="month_long_june">juny</string>
+ <string name="month_long_july">juliol</string>
+ <string name="month_long_august">agost</string>
+ <string name="month_long_september">setembre</string>
+ <string name="month_long_october">octubre</string>
+ <string name="month_long_november">novembre</string>
+ <string name="month_long_december">desembre</string>
+
+ <string name="month_medium_january">gen.</string>
+ <string name="month_medium_february">febr.</string>
+ <string name="month_medium_march">març</string>
+ <string name="month_medium_april">abr.</string>
+ <string name="month_medium_may">maig</string>
+ <string name="month_medium_june">juny</string>
+ <string name="month_medium_july">jul.</string>
+ <string name="month_medium_august">ag.</string>
+ <string name="month_medium_september">set.</string>
+ <string name="month_medium_october">oct.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">des.</string>
+
+ <string name="month_shortest_january">g</string>
+ <string name="month_shortest_february">f</string>
+ <string name="month_shortest_march">m</string>
+ <string name="month_shortest_april">a</string>
+ <string name="month_shortest_may">m</string>
+ <string name="month_shortest_june">j</string>
+ <string name="month_shortest_july">j</string>
+ <string name="month_shortest_august">a</string>
+ <string name="month_shortest_september">s</string>
+ <string name="month_shortest_october">o</string>
+ <string name="month_shortest_november">n</string>
+ <string name="month_shortest_december">d</string>
+
+ <string name="day_of_week_long_sunday">diumenge</string>
+ <string name="day_of_week_long_monday">dilluns</string>
+ <string name="day_of_week_long_tuesday">dimarts</string>
+ <string name="day_of_week_long_wednesday">dimecres</string>
+ <string name="day_of_week_long_thursday">dijous</string>
+ <string name="day_of_week_long_friday">divendres</string>
+ <string name="day_of_week_long_saturday">dissabte</string>
+
+ <string name="day_of_week_medium_sunday">dg.</string>
+ <string name="day_of_week_medium_monday">dl.</string>
+ <string name="day_of_week_medium_tuesday">dt.</string>
+ <string name="day_of_week_medium_wednesday">dc.</string>
+ <string name="day_of_week_medium_thursday">dj.</string>
+ <string name="day_of_week_medium_friday">dv.</string>
+ <string name="day_of_week_medium_saturday">ds.</string>
+
+ <string name="day_of_week_short_sunday">dg.</string>
+ <string name="day_of_week_short_monday">dl.</string>
+ <string name="day_of_week_short_tuesday">dt.</string>
+ <string name="day_of_week_short_wednesday">dc.</string>
+ <string name="day_of_week_short_thursday">dj.</string>
+ <string name="day_of_week_short_friday">dv.</string>
+ <string name="day_of_week_short_saturday">ds.</string>
+
+ <string name="day_of_week_shortest_sunday">g</string>
+ <string name="day_of_week_shortest_monday">l</string>
+ <string name="day_of_week_shortest_tuesday">t</string>
+ <string name="day_of_week_shortest_wednesday">c</string>
+ <string name="day_of_week_shortest_thursday">j</string>
+ <string name="day_of_week_shortest_friday">v</string>
+ <string name="day_of_week_shortest_saturday">s</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">ahir</string>
+ <string name="today">avui</string>
+ <string name="tomorrow">demà</string>
+
+ <string name="hour_minute_ampm">%-k:%M</string>
+ <string name="hour_minute_cap_ampm">%-k:%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%-e de %B de %Y</string>
+ <string name="time_of_day">%-k:%M:%S</string>
+ <string name="date_and_time">%-k:%M:%S %d/%m/%Y</string>
+ <string name="abbrev_month_day_year">%d/%m/%Y</string>
+ <string name="month_day">%-e de %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%-B del %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-cs-rCZ/donottranslate-cldr.xml b/core/res/res/values-cs-rCZ/donottranslate-cldr.xml
new file mode 100644
index 0000000..f477d56
--- /dev/null
+++ b/core/res/res/values-cs-rCZ/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">leden</string>
+ <string name="month_long_standalone_february">únor</string>
+ <string name="month_long_standalone_march">březen</string>
+ <string name="month_long_standalone_april">duben</string>
+ <string name="month_long_standalone_may">květen</string>
+ <string name="month_long_standalone_june">červen</string>
+ <string name="month_long_standalone_july">červenec</string>
+ <string name="month_long_standalone_august">srpen</string>
+ <string name="month_long_standalone_september">září</string>
+ <string name="month_long_standalone_october">říjen</string>
+ <string name="month_long_standalone_november">listopad</string>
+ <string name="month_long_standalone_december">prosinec</string>
+
+ <string name="month_long_january">ledna</string>
+ <string name="month_long_february">února</string>
+ <string name="month_long_march">března</string>
+ <string name="month_long_april">dubna</string>
+ <string name="month_long_may">května</string>
+ <string name="month_long_june">června</string>
+ <string name="month_long_july">července</string>
+ <string name="month_long_august">srpna</string>
+ <string name="month_long_september">září</string>
+ <string name="month_long_october">října</string>
+ <string name="month_long_november">listopadu</string>
+ <string name="month_long_december">prosince</string>
+
+ <string name="month_medium_january">1</string>
+ <string name="month_medium_february">2</string>
+ <string name="month_medium_march">3</string>
+ <string name="month_medium_april">4</string>
+ <string name="month_medium_may">5</string>
+ <string name="month_medium_june">6</string>
+ <string name="month_medium_july">7</string>
+ <string name="month_medium_august">8</string>
+ <string name="month_medium_september">9</string>
+ <string name="month_medium_october">10</string>
+ <string name="month_medium_november">11</string>
+ <string name="month_medium_december">12</string>
+
+ <string name="month_shortest_january">l</string>
+ <string name="month_shortest_february">ú</string>
+ <string name="month_shortest_march">b</string>
+ <string name="month_shortest_april">d</string>
+ <string name="month_shortest_may">k</string>
+ <string name="month_shortest_june">č</string>
+ <string name="month_shortest_july">č</string>
+ <string name="month_shortest_august">s</string>
+ <string name="month_shortest_september">z</string>
+ <string name="month_shortest_october">ř</string>
+ <string name="month_shortest_november">l</string>
+ <string name="month_shortest_december">p</string>
+
+ <string name="day_of_week_long_sunday">neděle</string>
+ <string name="day_of_week_long_monday">pondělí</string>
+ <string name="day_of_week_long_tuesday">úterý</string>
+ <string name="day_of_week_long_wednesday">středa</string>
+ <string name="day_of_week_long_thursday">čtvrtek</string>
+ <string name="day_of_week_long_friday">pátek</string>
+ <string name="day_of_week_long_saturday">sobota</string>
+
+ <string name="day_of_week_medium_sunday">ne</string>
+ <string name="day_of_week_medium_monday">po</string>
+ <string name="day_of_week_medium_tuesday">út</string>
+ <string name="day_of_week_medium_wednesday">st</string>
+ <string name="day_of_week_medium_thursday">čt</string>
+ <string name="day_of_week_medium_friday">pá</string>
+ <string name="day_of_week_medium_saturday">so</string>
+
+ <string name="day_of_week_short_sunday">ne</string>
+ <string name="day_of_week_short_monday">po</string>
+ <string name="day_of_week_short_tuesday">út</string>
+ <string name="day_of_week_short_wednesday">st</string>
+ <string name="day_of_week_short_thursday">čt</string>
+ <string name="day_of_week_short_friday">pá</string>
+ <string name="day_of_week_short_saturday">so</string>
+
+ <string name="day_of_week_shortest_sunday">N</string>
+ <string name="day_of_week_shortest_monday">P</string>
+ <string name="day_of_week_shortest_tuesday">Ú</string>
+ <string name="day_of_week_shortest_wednesday">S</string>
+ <string name="day_of_week_shortest_thursday">Č</string>
+ <string name="day_of_week_shortest_friday">P</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">dop.</string>
+ <string name="pm">odp.</string>
+ <string name="yesterday">Včera</string>
+ <string name="today">Dnes</string>
+ <string name="tomorrow">Zítra</string>
+
+ <string name="hour_minute_ampm">%-k:%M</string>
+ <string name="hour_minute_cap_ampm">%-k:%M</string>
+ <string name="numeric_date">%-e.%-m.%Y</string>
+ <string name="numeric_date_format">d.M.yyyy</string>
+ <string name="month_day_year">%-e. %B %Y</string>
+ <string name="time_of_day">%-k:%M:%S</string>
+ <string name="date_and_time">%-k:%M:%S %-e.%-m.%Y</string>
+ <string name="abbrev_month_day_year">%-e.%-m.%Y</string>
+ <string name="month_day">%-e. %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y %B</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y %b</string>
+</resources>
diff --git a/core/res/res/values-cs/donottranslate-cldr.xml b/core/res/res/values-cs/donottranslate-cldr.xml
new file mode 100644
index 0000000..f477d56
--- /dev/null
+++ b/core/res/res/values-cs/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">leden</string>
+ <string name="month_long_standalone_february">únor</string>
+ <string name="month_long_standalone_march">březen</string>
+ <string name="month_long_standalone_april">duben</string>
+ <string name="month_long_standalone_may">květen</string>
+ <string name="month_long_standalone_june">červen</string>
+ <string name="month_long_standalone_july">červenec</string>
+ <string name="month_long_standalone_august">srpen</string>
+ <string name="month_long_standalone_september">září</string>
+ <string name="month_long_standalone_october">říjen</string>
+ <string name="month_long_standalone_november">listopad</string>
+ <string name="month_long_standalone_december">prosinec</string>
+
+ <string name="month_long_january">ledna</string>
+ <string name="month_long_february">února</string>
+ <string name="month_long_march">března</string>
+ <string name="month_long_april">dubna</string>
+ <string name="month_long_may">května</string>
+ <string name="month_long_june">června</string>
+ <string name="month_long_july">července</string>
+ <string name="month_long_august">srpna</string>
+ <string name="month_long_september">září</string>
+ <string name="month_long_october">října</string>
+ <string name="month_long_november">listopadu</string>
+ <string name="month_long_december">prosince</string>
+
+ <string name="month_medium_january">1</string>
+ <string name="month_medium_february">2</string>
+ <string name="month_medium_march">3</string>
+ <string name="month_medium_april">4</string>
+ <string name="month_medium_may">5</string>
+ <string name="month_medium_june">6</string>
+ <string name="month_medium_july">7</string>
+ <string name="month_medium_august">8</string>
+ <string name="month_medium_september">9</string>
+ <string name="month_medium_october">10</string>
+ <string name="month_medium_november">11</string>
+ <string name="month_medium_december">12</string>
+
+ <string name="month_shortest_january">l</string>
+ <string name="month_shortest_february">ú</string>
+ <string name="month_shortest_march">b</string>
+ <string name="month_shortest_april">d</string>
+ <string name="month_shortest_may">k</string>
+ <string name="month_shortest_june">č</string>
+ <string name="month_shortest_july">č</string>
+ <string name="month_shortest_august">s</string>
+ <string name="month_shortest_september">z</string>
+ <string name="month_shortest_october">ř</string>
+ <string name="month_shortest_november">l</string>
+ <string name="month_shortest_december">p</string>
+
+ <string name="day_of_week_long_sunday">neděle</string>
+ <string name="day_of_week_long_monday">pondělí</string>
+ <string name="day_of_week_long_tuesday">úterý</string>
+ <string name="day_of_week_long_wednesday">středa</string>
+ <string name="day_of_week_long_thursday">čtvrtek</string>
+ <string name="day_of_week_long_friday">pátek</string>
+ <string name="day_of_week_long_saturday">sobota</string>
+
+ <string name="day_of_week_medium_sunday">ne</string>
+ <string name="day_of_week_medium_monday">po</string>
+ <string name="day_of_week_medium_tuesday">út</string>
+ <string name="day_of_week_medium_wednesday">st</string>
+ <string name="day_of_week_medium_thursday">čt</string>
+ <string name="day_of_week_medium_friday">pá</string>
+ <string name="day_of_week_medium_saturday">so</string>
+
+ <string name="day_of_week_short_sunday">ne</string>
+ <string name="day_of_week_short_monday">po</string>
+ <string name="day_of_week_short_tuesday">út</string>
+ <string name="day_of_week_short_wednesday">st</string>
+ <string name="day_of_week_short_thursday">čt</string>
+ <string name="day_of_week_short_friday">pá</string>
+ <string name="day_of_week_short_saturday">so</string>
+
+ <string name="day_of_week_shortest_sunday">N</string>
+ <string name="day_of_week_shortest_monday">P</string>
+ <string name="day_of_week_shortest_tuesday">Ú</string>
+ <string name="day_of_week_shortest_wednesday">S</string>
+ <string name="day_of_week_shortest_thursday">Č</string>
+ <string name="day_of_week_shortest_friday">P</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">dop.</string>
+ <string name="pm">odp.</string>
+ <string name="yesterday">Včera</string>
+ <string name="today">Dnes</string>
+ <string name="tomorrow">Zítra</string>
+
+ <string name="hour_minute_ampm">%-k:%M</string>
+ <string name="hour_minute_cap_ampm">%-k:%M</string>
+ <string name="numeric_date">%-e.%-m.%Y</string>
+ <string name="numeric_date_format">d.M.yyyy</string>
+ <string name="month_day_year">%-e. %B %Y</string>
+ <string name="time_of_day">%-k:%M:%S</string>
+ <string name="date_and_time">%-k:%M:%S %-e.%-m.%Y</string>
+ <string name="abbrev_month_day_year">%-e.%-m.%Y</string>
+ <string name="month_day">%-e. %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y %B</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y %b</string>
+</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 35a3f9a..c3860d4 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -418,9 +418,6 @@
<string name="lockscreen_glogin_password_hint">"Heslo"</string>
<string name="lockscreen_glogin_submit_button">"Přihlásit se"</string>
<string name="lockscreen_glogin_invalid_input">"Neplatné uživatelské jméno nebo heslo."</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button">"Vymazat oznámení"</string>
@@ -452,9 +449,6 @@
<string name="menu_enter_shortcut_label">"enter"</string>
<string name="menu_delete_shortcut_label">"smazat"</string>
<string name="search_go">"Hledat"</string>
- <string name="today">"Dnes"</string>
- <string name="yesterday">"Včera"</string>
- <string name="tomorrow">"Zítra"</string>
<string name="oneMonthDurationPast">"před 1 měsícem"</string>
<string name="beforeOneMonthDurationPast">"Déle než před 1 měsícem"</string>
<plurals name="num_seconds_ago">
@@ -536,13 +530,6 @@
<string name="weeks">"týd."</string>
<string name="year">"rokem"</string>
<string name="years">"lety"</string>
- <string name="sunday">"neděle"</string>
- <string name="monday">"pondělí"</string>
- <string name="tuesday">"úterý"</string>
- <string name="wednesday">"středa"</string>
- <string name="thursday">"čtvrtek"</string>
- <string name="friday">"pátek"</string>
- <string name="saturday">"sobota"</string>
<string name="every_weekday">"Každý pracovní den (Po – Pá)"</string>
<string name="daily">"Denně"</string>
<string name="weekly">"Každý týden v <xliff:g id="DAY">%s</xliff:g>"</string>
@@ -552,9 +539,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"Omlouváme se, ale toto video nelze přenášet datovým proudem do tohoto zařízení."</string>
<string name="VideoView_error_text_unknown">"Toto video bohužel nelze přehrát."</string>
<string name="VideoView_error_button">"OK"</string>
- <string name="am">"dop."</string>
- <string name="pm">"odp."</string>
- <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -566,23 +550,12 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"poledne"</string>
<string name="Noon">"Poledne"</string>
<string name="midnight">"půlnoc"</string>
<string name="Midnight">"Půlnoc"</string>
- <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string>
@@ -607,82 +580,8 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"neděle"</string>
- <string name="day_of_week_long_monday">"pondělí"</string>
- <string name="day_of_week_long_tuesday">"úterý"</string>
- <string name="day_of_week_long_wednesday">"středa"</string>
- <string name="day_of_week_long_thursday">"čtvrtek"</string>
- <string name="day_of_week_long_friday">"pátek"</string>
- <string name="day_of_week_long_saturday">"sobota"</string>
- <string name="day_of_week_medium_sunday">"Ne"</string>
- <string name="day_of_week_medium_monday">"Po"</string>
- <string name="day_of_week_medium_tuesday">"Út"</string>
- <string name="day_of_week_medium_wednesday">"St"</string>
- <string name="day_of_week_medium_thursday">"Čt"</string>
- <string name="day_of_week_medium_friday">"Pá"</string>
- <string name="day_of_week_medium_saturday">"So"</string>
- <string name="day_of_week_short_sunday">"Ne"</string>
- <string name="day_of_week_short_monday">"Po"</string>
- <string name="day_of_week_short_tuesday">"Út"</string>
- <string name="day_of_week_short_wednesday">"St"</string>
- <string name="day_of_week_short_thursday">"Čt"</string>
- <string name="day_of_week_short_friday">"Pá"</string>
- <string name="day_of_week_short_saturday">"So"</string>
- <string name="day_of_week_shorter_sunday">"Ne"</string>
- <string name="day_of_week_shorter_monday">"Po"</string>
- <string name="day_of_week_shorter_tuesday">"Út"</string>
- <string name="day_of_week_shorter_wednesday">"St"</string>
- <string name="day_of_week_shorter_thursday">"Čt"</string>
- <string name="day_of_week_shorter_friday">"Pá"</string>
- <string name="day_of_week_shorter_saturday">"So"</string>
- <string name="day_of_week_shortest_sunday">"Ne"</string>
- <string name="day_of_week_shortest_monday">"Po"</string>
- <string name="day_of_week_shortest_tuesday">"Čt"</string>
- <string name="day_of_week_shortest_wednesday">"St"</string>
- <string name="day_of_week_shortest_thursday">"Čt"</string>
- <string name="day_of_week_shortest_friday">"Pá"</string>
- <string name="day_of_week_shortest_saturday">"So"</string>
- <string name="month_long_january">"leden"</string>
- <string name="month_long_february">"únor"</string>
- <string name="month_long_march">"březen"</string>
- <string name="month_long_april">"duben"</string>
- <string name="month_long_may">"květen"</string>
- <string name="month_long_june">"červen"</string>
- <string name="month_long_july">"červenec"</string>
- <string name="month_long_august">"srpen"</string>
- <string name="month_long_september">"září"</string>
- <string name="month_long_october">"říjen"</string>
- <string name="month_long_november">"listopad"</string>
- <string name="month_long_december">"prosinec"</string>
- <string name="month_medium_january">"leden"</string>
- <string name="month_medium_february">"únor"</string>
- <string name="month_medium_march">"březen"</string>
- <string name="month_medium_april">"duben"</string>
- <string name="month_medium_may">"květen"</string>
- <string name="month_medium_june">"červen"</string>
- <string name="month_medium_july">"červenec"</string>
- <string name="month_medium_august">"srpen"</string>
- <string name="month_medium_september">"září"</string>
- <string name="month_medium_october">"říjen"</string>
- <string name="month_medium_november">"listopad"</string>
- <string name="month_medium_december">"prosinec"</string>
- <string name="month_shortest_january">"1."</string>
- <string name="month_shortest_february">"2."</string>
- <string name="month_shortest_march">"Po"</string>
- <string name="month_shortest_april">"4."</string>
- <string name="month_shortest_may">"5."</string>
- <string name="month_shortest_june">"6."</string>
- <string name="month_shortest_july">"7."</string>
- <string name="month_shortest_august">"8."</string>
- <string name="month_shortest_september">"9."</string>
- <string name="month_shortest_october">"10."</string>
- <string name="month_shortest_november">"11."</string>
- <string name="month_shortest_december">"12."</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"Vybrat vše"</string>
diff --git a/core/res/res/values-da-rDK/donottranslate-cldr.xml b/core/res/res/values-da-rDK/donottranslate-cldr.xml
new file mode 100644
index 0000000..38097bd
--- /dev/null
+++ b/core/res/res/values-da-rDK/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">januar</string>
+ <string name="month_long_standalone_february">februar</string>
+ <string name="month_long_standalone_march">marts</string>
+ <string name="month_long_standalone_april">april</string>
+ <string name="month_long_standalone_may">maj</string>
+ <string name="month_long_standalone_june">juni</string>
+ <string name="month_long_standalone_july">juli</string>
+ <string name="month_long_standalone_august">august</string>
+ <string name="month_long_standalone_september">september</string>
+ <string name="month_long_standalone_october">oktober</string>
+ <string name="month_long_standalone_november">november</string>
+ <string name="month_long_standalone_december">december</string>
+
+ <string name="month_long_january">januar</string>
+ <string name="month_long_february">februar</string>
+ <string name="month_long_march">marts</string>
+ <string name="month_long_april">april</string>
+ <string name="month_long_may">maj</string>
+ <string name="month_long_june">juni</string>
+ <string name="month_long_july">juli</string>
+ <string name="month_long_august">august</string>
+ <string name="month_long_september">september</string>
+ <string name="month_long_october">oktober</string>
+ <string name="month_long_november">november</string>
+ <string name="month_long_december">december</string>
+
+ <string name="month_medium_january">jan.</string>
+ <string name="month_medium_february">feb.</string>
+ <string name="month_medium_march">mar.</string>
+ <string name="month_medium_april">apr.</string>
+ <string name="month_medium_may">maj</string>
+ <string name="month_medium_june">jun.</string>
+ <string name="month_medium_july">jul.</string>
+ <string name="month_medium_august">aug.</string>
+ <string name="month_medium_september">sep.</string>
+ <string name="month_medium_october">okt.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">dec.</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">søndag</string>
+ <string name="day_of_week_long_monday">mandag</string>
+ <string name="day_of_week_long_tuesday">tirsdag</string>
+ <string name="day_of_week_long_wednesday">onsdag</string>
+ <string name="day_of_week_long_thursday">torsdag</string>
+ <string name="day_of_week_long_friday">fredag</string>
+ <string name="day_of_week_long_saturday">lørdag</string>
+
+ <string name="day_of_week_medium_sunday">søn</string>
+ <string name="day_of_week_medium_monday">man</string>
+ <string name="day_of_week_medium_tuesday">tir</string>
+ <string name="day_of_week_medium_wednesday">ons</string>
+ <string name="day_of_week_medium_thursday">tor</string>
+ <string name="day_of_week_medium_friday">fre</string>
+ <string name="day_of_week_medium_saturday">lør</string>
+
+ <string name="day_of_week_short_sunday">søn</string>
+ <string name="day_of_week_short_monday">man</string>
+ <string name="day_of_week_short_tuesday">tir</string>
+ <string name="day_of_week_short_wednesday">ons</string>
+ <string name="day_of_week_short_thursday">tor</string>
+ <string name="day_of_week_short_friday">fre</string>
+ <string name="day_of_week_short_saturday">lør</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">O</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">L</string>
+
+ <string name="am">f.m.</string>
+ <string name="pm">e.m.</string>
+ <string name="yesterday">i går</string>
+ <string name="today">i dag</string>
+ <string name="tomorrow">i morgen</string>
+
+ <string name="hour_minute_ampm">%H.%M</string>
+ <string name="hour_minute_cap_ampm">%H.%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%-e. %b %Y</string>
+ <string name="time_of_day">%H.%M.%S</string>
+ <string name="date_and_time">%H.%M.%S %d/%m/%Y</string>
+ <string name="abbrev_month_day_year">%d/%m/%Y</string>
+ <string name="month_day">%-e. %B</string>
+ <string name="month">%b</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e. %b</string>
+ <string name="abbrev_month">%b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-de-rAT/donottranslate-cldr.xml b/core/res/res/values-de-rAT/donottranslate-cldr.xml
new file mode 100644
index 0000000..ad35fee
--- /dev/null
+++ b/core/res/res/values-de-rAT/donottranslate-cldr.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Jänner</string>
+
+ <string name="month_long_january">Jänner</string>
+
+ <string name="month_medium_january">Jän</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sonntag</string>
+ <string name="day_of_week_long_monday">Montag</string>
+ <string name="day_of_week_long_tuesday">Dienstag</string>
+ <string name="day_of_week_long_wednesday">Mittwoch</string>
+ <string name="day_of_week_long_thursday">Donnerstag</string>
+ <string name="day_of_week_long_friday">Freitag</string>
+ <string name="day_of_week_long_saturday">Samstag</string>
+
+ <string name="day_of_week_medium_sunday">So.</string>
+ <string name="day_of_week_medium_monday">Mo.</string>
+ <string name="day_of_week_medium_tuesday">Di.</string>
+ <string name="day_of_week_medium_wednesday">Mi.</string>
+ <string name="day_of_week_medium_thursday">Do.</string>
+ <string name="day_of_week_medium_friday">Fr.</string>
+ <string name="day_of_week_medium_saturday">Sa.</string>
+
+ <string name="day_of_week_short_sunday">So.</string>
+ <string name="day_of_week_short_monday">Mo.</string>
+ <string name="day_of_week_short_tuesday">Di.</string>
+ <string name="day_of_week_short_wednesday">Mi.</string>
+ <string name="day_of_week_short_thursday">Do.</string>
+ <string name="day_of_week_short_friday">Fr.</string>
+ <string name="day_of_week_short_saturday">Sa.</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">D</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">D</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">vorm.</string>
+ <string name="pm">nachm.</string>
+ <string name="yesterday">Gestern</string>
+ <string name="today">Heute</string>
+ <string name="tomorrow">Morgen</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%d. %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %d.%m.%Y</string>
+ <string name="abbrev_month_day_year">%d.%m.%Y</string>
+ <string name="month_day">%-e. %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e. %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-de-rCH/donottranslate-cldr.xml b/core/res/res/values-de-rCH/donottranslate-cldr.xml
new file mode 100644
index 0000000..c8e0de8
--- /dev/null
+++ b/core/res/res/values-de-rCH/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Januar</string>
+ <string name="month_long_standalone_february">Februar</string>
+ <string name="month_long_standalone_march">März</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">Mai</string>
+ <string name="month_long_standalone_june">Juni</string>
+ <string name="month_long_standalone_july">Juli</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">Oktober</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">Dezember</string>
+
+ <string name="month_long_january">Januar</string>
+ <string name="month_long_february">Februar</string>
+ <string name="month_long_march">März</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">Mai</string>
+ <string name="month_long_june">Juni</string>
+ <string name="month_long_july">Juli</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">Oktober</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">Dezember</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mär</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">Mai</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Okt</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dez</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sonntag</string>
+ <string name="day_of_week_long_monday">Montag</string>
+ <string name="day_of_week_long_tuesday">Dienstag</string>
+ <string name="day_of_week_long_wednesday">Mittwoch</string>
+ <string name="day_of_week_long_thursday">Donnerstag</string>
+ <string name="day_of_week_long_friday">Freitag</string>
+ <string name="day_of_week_long_saturday">Samstag</string>
+
+ <string name="day_of_week_medium_sunday">So.</string>
+ <string name="day_of_week_medium_monday">Mo.</string>
+ <string name="day_of_week_medium_tuesday">Di.</string>
+ <string name="day_of_week_medium_wednesday">Mi.</string>
+ <string name="day_of_week_medium_thursday">Do.</string>
+ <string name="day_of_week_medium_friday">Fr.</string>
+ <string name="day_of_week_medium_saturday">Sa.</string>
+
+ <string name="day_of_week_short_sunday">So.</string>
+ <string name="day_of_week_short_monday">Mo.</string>
+ <string name="day_of_week_short_tuesday">Di.</string>
+ <string name="day_of_week_short_wednesday">Mi.</string>
+ <string name="day_of_week_short_thursday">Do.</string>
+ <string name="day_of_week_short_friday">Fr.</string>
+ <string name="day_of_week_short_saturday">Sa.</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">D</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">D</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">vorm.</string>
+ <string name="pm">nachm.</string>
+ <string name="yesterday">Gestern</string>
+ <string name="today">Heute</string>
+ <string name="tomorrow">Morgen</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%-e. %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %d.%m.%Y</string>
+ <string name="abbrev_month_day_year">%d.%m.%Y</string>
+ <string name="month_day">%-e. %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e. %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-de-rDE/donottranslate-cldr.xml b/core/res/res/values-de-rDE/donottranslate-cldr.xml
new file mode 100644
index 0000000..c8e0de8
--- /dev/null
+++ b/core/res/res/values-de-rDE/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Januar</string>
+ <string name="month_long_standalone_february">Februar</string>
+ <string name="month_long_standalone_march">März</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">Mai</string>
+ <string name="month_long_standalone_june">Juni</string>
+ <string name="month_long_standalone_july">Juli</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">Oktober</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">Dezember</string>
+
+ <string name="month_long_january">Januar</string>
+ <string name="month_long_february">Februar</string>
+ <string name="month_long_march">März</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">Mai</string>
+ <string name="month_long_june">Juni</string>
+ <string name="month_long_july">Juli</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">Oktober</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">Dezember</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mär</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">Mai</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Okt</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dez</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sonntag</string>
+ <string name="day_of_week_long_monday">Montag</string>
+ <string name="day_of_week_long_tuesday">Dienstag</string>
+ <string name="day_of_week_long_wednesday">Mittwoch</string>
+ <string name="day_of_week_long_thursday">Donnerstag</string>
+ <string name="day_of_week_long_friday">Freitag</string>
+ <string name="day_of_week_long_saturday">Samstag</string>
+
+ <string name="day_of_week_medium_sunday">So.</string>
+ <string name="day_of_week_medium_monday">Mo.</string>
+ <string name="day_of_week_medium_tuesday">Di.</string>
+ <string name="day_of_week_medium_wednesday">Mi.</string>
+ <string name="day_of_week_medium_thursday">Do.</string>
+ <string name="day_of_week_medium_friday">Fr.</string>
+ <string name="day_of_week_medium_saturday">Sa.</string>
+
+ <string name="day_of_week_short_sunday">So.</string>
+ <string name="day_of_week_short_monday">Mo.</string>
+ <string name="day_of_week_short_tuesday">Di.</string>
+ <string name="day_of_week_short_wednesday">Mi.</string>
+ <string name="day_of_week_short_thursday">Do.</string>
+ <string name="day_of_week_short_friday">Fr.</string>
+ <string name="day_of_week_short_saturday">Sa.</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">D</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">D</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">vorm.</string>
+ <string name="pm">nachm.</string>
+ <string name="yesterday">Gestern</string>
+ <string name="today">Heute</string>
+ <string name="tomorrow">Morgen</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%-e. %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %d.%m.%Y</string>
+ <string name="abbrev_month_day_year">%d.%m.%Y</string>
+ <string name="month_day">%-e. %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e. %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-de-rLI/donottranslate-cldr.xml b/core/res/res/values-de-rLI/donottranslate-cldr.xml
new file mode 100644
index 0000000..c8e0de8
--- /dev/null
+++ b/core/res/res/values-de-rLI/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Januar</string>
+ <string name="month_long_standalone_february">Februar</string>
+ <string name="month_long_standalone_march">März</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">Mai</string>
+ <string name="month_long_standalone_june">Juni</string>
+ <string name="month_long_standalone_july">Juli</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">Oktober</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">Dezember</string>
+
+ <string name="month_long_january">Januar</string>
+ <string name="month_long_february">Februar</string>
+ <string name="month_long_march">März</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">Mai</string>
+ <string name="month_long_june">Juni</string>
+ <string name="month_long_july">Juli</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">Oktober</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">Dezember</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mär</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">Mai</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Okt</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dez</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sonntag</string>
+ <string name="day_of_week_long_monday">Montag</string>
+ <string name="day_of_week_long_tuesday">Dienstag</string>
+ <string name="day_of_week_long_wednesday">Mittwoch</string>
+ <string name="day_of_week_long_thursday">Donnerstag</string>
+ <string name="day_of_week_long_friday">Freitag</string>
+ <string name="day_of_week_long_saturday">Samstag</string>
+
+ <string name="day_of_week_medium_sunday">So.</string>
+ <string name="day_of_week_medium_monday">Mo.</string>
+ <string name="day_of_week_medium_tuesday">Di.</string>
+ <string name="day_of_week_medium_wednesday">Mi.</string>
+ <string name="day_of_week_medium_thursday">Do.</string>
+ <string name="day_of_week_medium_friday">Fr.</string>
+ <string name="day_of_week_medium_saturday">Sa.</string>
+
+ <string name="day_of_week_short_sunday">So.</string>
+ <string name="day_of_week_short_monday">Mo.</string>
+ <string name="day_of_week_short_tuesday">Di.</string>
+ <string name="day_of_week_short_wednesday">Mi.</string>
+ <string name="day_of_week_short_thursday">Do.</string>
+ <string name="day_of_week_short_friday">Fr.</string>
+ <string name="day_of_week_short_saturday">Sa.</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">D</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">D</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">vorm.</string>
+ <string name="pm">nachm.</string>
+ <string name="yesterday">Gestern</string>
+ <string name="today">Heute</string>
+ <string name="tomorrow">Morgen</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%-e. %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %d.%m.%Y</string>
+ <string name="abbrev_month_day_year">%d.%m.%Y</string>
+ <string name="month_day">%-e. %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e. %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-de/donottranslate-cldr.xml b/core/res/res/values-de/donottranslate-cldr.xml
new file mode 100644
index 0000000..c8e0de8
--- /dev/null
+++ b/core/res/res/values-de/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Januar</string>
+ <string name="month_long_standalone_february">Februar</string>
+ <string name="month_long_standalone_march">März</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">Mai</string>
+ <string name="month_long_standalone_june">Juni</string>
+ <string name="month_long_standalone_july">Juli</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">Oktober</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">Dezember</string>
+
+ <string name="month_long_january">Januar</string>
+ <string name="month_long_february">Februar</string>
+ <string name="month_long_march">März</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">Mai</string>
+ <string name="month_long_june">Juni</string>
+ <string name="month_long_july">Juli</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">Oktober</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">Dezember</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mär</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">Mai</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Okt</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dez</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sonntag</string>
+ <string name="day_of_week_long_monday">Montag</string>
+ <string name="day_of_week_long_tuesday">Dienstag</string>
+ <string name="day_of_week_long_wednesday">Mittwoch</string>
+ <string name="day_of_week_long_thursday">Donnerstag</string>
+ <string name="day_of_week_long_friday">Freitag</string>
+ <string name="day_of_week_long_saturday">Samstag</string>
+
+ <string name="day_of_week_medium_sunday">So.</string>
+ <string name="day_of_week_medium_monday">Mo.</string>
+ <string name="day_of_week_medium_tuesday">Di.</string>
+ <string name="day_of_week_medium_wednesday">Mi.</string>
+ <string name="day_of_week_medium_thursday">Do.</string>
+ <string name="day_of_week_medium_friday">Fr.</string>
+ <string name="day_of_week_medium_saturday">Sa.</string>
+
+ <string name="day_of_week_short_sunday">So.</string>
+ <string name="day_of_week_short_monday">Mo.</string>
+ <string name="day_of_week_short_tuesday">Di.</string>
+ <string name="day_of_week_short_wednesday">Mi.</string>
+ <string name="day_of_week_short_thursday">Do.</string>
+ <string name="day_of_week_short_friday">Fr.</string>
+ <string name="day_of_week_short_saturday">Sa.</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">D</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">D</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">vorm.</string>
+ <string name="pm">nachm.</string>
+ <string name="yesterday">Gestern</string>
+ <string name="today">Heute</string>
+ <string name="tomorrow">Morgen</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%-e. %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %d.%m.%Y</string>
+ <string name="abbrev_month_day_year">%d.%m.%Y</string>
+ <string name="month_day">%-e. %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e. %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 674c64b..d121801 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -418,9 +418,6 @@
<string name="lockscreen_glogin_password_hint">"Passwort"</string>
<string name="lockscreen_glogin_submit_button">"Anmelden"</string>
<string name="lockscreen_glogin_invalid_input">"Ungültiger Nutzername oder ungültiges Passwort."</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button">"Benachrichtigungen löschen"</string>
@@ -452,9 +449,6 @@
<string name="menu_enter_shortcut_label">"Enter"</string>
<string name="menu_delete_shortcut_label">"löschen"</string>
<string name="search_go">"Suche"</string>
- <string name="today">"Heute"</string>
- <string name="yesterday">"Gestern"</string>
- <string name="tomorrow">"Morgen"</string>
<string name="oneMonthDurationPast">"Vor 1 Monat"</string>
<string name="beforeOneMonthDurationPast">"Vor mehr als 1 Monat"</string>
<plurals name="num_seconds_ago">
@@ -536,13 +530,6 @@
<string name="weeks">"Wochen"</string>
<string name="year">"Jahr"</string>
<string name="years">"Jahre"</string>
- <string name="sunday">"Sonntag"</string>
- <string name="monday">"Montag"</string>
- <string name="tuesday">"Dienstag"</string>
- <string name="wednesday">"Mittwoch"</string>
- <string name="thursday">"Donnerstag"</string>
- <string name="friday">"Freitag"</string>
- <string name="saturday">"Samstag"</string>
<string name="every_weekday">"Jeden Wochentag (Mo-Fr)"</string>
<string name="daily">"Täglich"</string>
<string name="weekly">"Jede Woche am <xliff:g id="DAY">%s</xliff:g>"</string>
@@ -552,9 +539,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"Leider ist dieses Video nicht für Streaming auf diesem Gerät gültig."</string>
<string name="VideoView_error_text_unknown">"Dieses Video kann leider nicht abgespielt werden."</string>
<string name="VideoView_error_button">"OK"</string>
- <string name="am">"AM"</string>
- <string name="pm">".."</string>
- <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -566,23 +550,12 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"Mittag"</string>
<string name="Noon">"Mittag"</string>
<string name="midnight">"Mitternacht"</string>
<string name="Midnight">"Mitternacht"</string>
- <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string>
@@ -607,82 +580,8 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"Sonntag"</string>
- <string name="day_of_week_long_monday">"Montag"</string>
- <string name="day_of_week_long_tuesday">"Dienstag"</string>
- <string name="day_of_week_long_wednesday">"Mittwoch"</string>
- <string name="day_of_week_long_thursday">"Donnerstag"</string>
- <string name="day_of_week_long_friday">"Freitag"</string>
- <string name="day_of_week_long_saturday">"Samstag"</string>
- <string name="day_of_week_medium_sunday">"So"</string>
- <string name="day_of_week_medium_monday">"Mo"</string>
- <string name="day_of_week_medium_tuesday">"Di"</string>
- <string name="day_of_week_medium_wednesday">"Mi"</string>
- <string name="day_of_week_medium_thursday">"Do"</string>
- <string name="day_of_week_medium_friday">"Fr"</string>
- <string name="day_of_week_medium_saturday">"Sa"</string>
- <string name="day_of_week_short_sunday">"So"</string>
- <string name="day_of_week_short_monday">"Mo"</string>
- <string name="day_of_week_short_tuesday">"Di"</string>
- <string name="day_of_week_short_wednesday">"Mi"</string>
- <string name="day_of_week_short_thursday">"Do"</string>
- <string name="day_of_week_short_friday">"Fr"</string>
- <string name="day_of_week_short_saturday">"Sa"</string>
- <string name="day_of_week_shorter_sunday">"So"</string>
- <string name="day_of_week_shorter_monday">"März"</string>
- <string name="day_of_week_shorter_tuesday">"Di"</string>
- <string name="day_of_week_shorter_wednesday">"Mi"</string>
- <string name="day_of_week_shorter_thursday">"Do"</string>
- <string name="day_of_week_shorter_friday">"Fr"</string>
- <string name="day_of_week_shorter_saturday">"Sa"</string>
- <string name="day_of_week_shortest_sunday">"Sep"</string>
- <string name="day_of_week_shortest_monday">"Mo"</string>
- <string name="day_of_week_shortest_tuesday">"Do"</string>
- <string name="day_of_week_shortest_wednesday">"Mi"</string>
- <string name="day_of_week_shortest_thursday">"Do"</string>
- <string name="day_of_week_shortest_friday">"Fr"</string>
- <string name="day_of_week_shortest_saturday">"Sa"</string>
- <string name="month_long_january">"Januar"</string>
- <string name="month_long_february">"Februar"</string>
- <string name="month_long_march">"März"</string>
- <string name="month_long_april">"April"</string>
- <string name="month_long_may">"Mai"</string>
- <string name="month_long_june">"Juni"</string>
- <string name="month_long_july">"Juli"</string>
- <string name="month_long_august">"August"</string>
- <string name="month_long_september">"September"</string>
- <string name="month_long_october">"Oktober"</string>
- <string name="month_long_november">"November"</string>
- <string name="month_long_december">"Dezember"</string>
- <string name="month_medium_january">"Jan."</string>
- <string name="month_medium_february">"Feb."</string>
- <string name="month_medium_march">"März"</string>
- <string name="month_medium_april">"Apr."</string>
- <string name="month_medium_may">"Mai"</string>
- <string name="month_medium_june">"Juni"</string>
- <string name="month_medium_july">"Juli"</string>
- <string name="month_medium_august">"Aug"</string>
- <string name="month_medium_september">"Sep."</string>
- <string name="month_medium_october">"Okt."</string>
- <string name="month_medium_november">"Nov."</string>
- <string name="month_medium_december">"Dez."</string>
- <string name="month_shortest_january">"Juli"</string>
- <string name="month_shortest_february">"Fr"</string>
- <string name="month_shortest_march">"März"</string>
- <string name="month_shortest_april">"Apr"</string>
- <string name="month_shortest_may">"Mo"</string>
- <string name="month_shortest_june">"Juni"</string>
- <string name="month_shortest_july">"Juli"</string>
- <string name="month_shortest_august">"Aug."</string>
- <string name="month_shortest_september">"Sep"</string>
- <string name="month_shortest_october">"Okt."</string>
- <string name="month_shortest_november">"No"</string>
- <string name="month_shortest_december">"Dez."</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"Alles auswählen"</string>
diff --git a/core/res/res/values-el-rGR/donottranslate-cldr.xml b/core/res/res/values-el-rGR/donottranslate-cldr.xml
new file mode 100644
index 0000000..9d2a0aa
--- /dev/null
+++ b/core/res/res/values-el-rGR/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Ιανουάριος</string>
+ <string name="month_long_standalone_february">Φεβρουάριος</string>
+ <string name="month_long_standalone_march">Μάρτιος</string>
+ <string name="month_long_standalone_april">Απρίλιος</string>
+ <string name="month_long_standalone_may">Μάιος</string>
+ <string name="month_long_standalone_june">Ιούνιος</string>
+ <string name="month_long_standalone_july">Ιούλιος</string>
+ <string name="month_long_standalone_august">Αύγουστος</string>
+ <string name="month_long_standalone_september">Σεπτέμβριος</string>
+ <string name="month_long_standalone_october">Οκτώβριος</string>
+ <string name="month_long_standalone_november">Νοέμβριος</string>
+ <string name="month_long_standalone_december">Δεκέμβριος</string>
+
+ <string name="month_long_january">Ιανουαρίου</string>
+ <string name="month_long_february">Φεβρουαρίου</string>
+ <string name="month_long_march">Μαρτίου</string>
+ <string name="month_long_april">Απριλίου</string>
+ <string name="month_long_may">Μαΐου</string>
+ <string name="month_long_june">Ιουνίου</string>
+ <string name="month_long_july">Ιουλίου</string>
+ <string name="month_long_august">Αυγούστου</string>
+ <string name="month_long_september">Σεπτεμβρίου</string>
+ <string name="month_long_october">Οκτωβρίου</string>
+ <string name="month_long_november">Νοεμβρίου</string>
+ <string name="month_long_december">Δεκεμβρίου</string>
+
+ <string name="month_medium_january">Ιαν</string>
+ <string name="month_medium_february">Φεβ</string>
+ <string name="month_medium_march">Μαρ</string>
+ <string name="month_medium_april">Απρ</string>
+ <string name="month_medium_may">Μαϊ</string>
+ <string name="month_medium_june">Ιουν</string>
+ <string name="month_medium_july">Ιουλ</string>
+ <string name="month_medium_august">Αυγ</string>
+ <string name="month_medium_september">Σεπ</string>
+ <string name="month_medium_october">Οκτ</string>
+ <string name="month_medium_november">Νοε</string>
+ <string name="month_medium_december">Δεκ</string>
+
+ <string name="month_shortest_january">Ι</string>
+ <string name="month_shortest_february">Φ</string>
+ <string name="month_shortest_march">Μ</string>
+ <string name="month_shortest_april">Α</string>
+ <string name="month_shortest_may">Μ</string>
+ <string name="month_shortest_june">Ι</string>
+ <string name="month_shortest_july">Ι</string>
+ <string name="month_shortest_august">Α</string>
+ <string name="month_shortest_september">Σ</string>
+ <string name="month_shortest_october">Ο</string>
+ <string name="month_shortest_november">Ν</string>
+ <string name="month_shortest_december">Δ</string>
+
+ <string name="day_of_week_long_sunday">Κυριακή</string>
+ <string name="day_of_week_long_monday">Δευτέρα</string>
+ <string name="day_of_week_long_tuesday">Τρίτη</string>
+ <string name="day_of_week_long_wednesday">Τετάρτη</string>
+ <string name="day_of_week_long_thursday">Πέμπτη</string>
+ <string name="day_of_week_long_friday">Παρασκευή</string>
+ <string name="day_of_week_long_saturday">Σάββατο</string>
+
+ <string name="day_of_week_medium_sunday">Κυρ</string>
+ <string name="day_of_week_medium_monday">Δευ</string>
+ <string name="day_of_week_medium_tuesday">Τρι</string>
+ <string name="day_of_week_medium_wednesday">Τετ</string>
+ <string name="day_of_week_medium_thursday">Πεμ</string>
+ <string name="day_of_week_medium_friday">Παρ</string>
+ <string name="day_of_week_medium_saturday">Σαβ</string>
+
+ <string name="day_of_week_short_sunday">Κυρ</string>
+ <string name="day_of_week_short_monday">Δευ</string>
+ <string name="day_of_week_short_tuesday">Τρι</string>
+ <string name="day_of_week_short_wednesday">Τετ</string>
+ <string name="day_of_week_short_thursday">Πεμ</string>
+ <string name="day_of_week_short_friday">Παρ</string>
+ <string name="day_of_week_short_saturday">Σαβ</string>
+
+ <string name="day_of_week_shortest_sunday">Κ</string>
+ <string name="day_of_week_shortest_monday">Δ</string>
+ <string name="day_of_week_shortest_tuesday">Τ</string>
+ <string name="day_of_week_shortest_wednesday">Τ</string>
+ <string name="day_of_week_shortest_thursday">Π</string>
+ <string name="day_of_week_shortest_friday">Π</string>
+ <string name="day_of_week_shortest_saturday">Σ</string>
+
+ <string name="am">π.μ.</string>
+ <string name="pm">μ.μ.</string>
+ <string name="yesterday">Χτες</string>
+ <string name="today">Σήμερα</string>
+ <string name="tomorrow">Αύριο</string>
+
+ <string name="hour_minute_ampm">%-l:%M %p</string>
+ <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%d %B %Y</string>
+ <string name="time_of_day">%-l:%M:%S %p</string>
+ <string name="date_and_time">%-l:%M:%S %p %d %b %Y</string>
+ <string name="abbrev_month_day_year">%d %b %Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%-B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-en-rAU/donottranslate-cldr.xml b/core/res/res/values-en-rAU/donottranslate-cldr.xml
new file mode 100644
index 0000000..7ed029c
--- /dev/null
+++ b/core/res/res/values-en-rAU/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">January</string>
+ <string name="month_long_standalone_february">February</string>
+ <string name="month_long_standalone_march">March</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">May</string>
+ <string name="month_long_standalone_june">June</string>
+ <string name="month_long_standalone_july">July</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">October</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">December</string>
+
+ <string name="month_long_january">January</string>
+ <string name="month_long_february">February</string>
+ <string name="month_long_march">March</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">May</string>
+ <string name="month_long_june">June</string>
+ <string name="month_long_july">July</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">October</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">December</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mar</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">May</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Oct</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dec</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sunday</string>
+ <string name="day_of_week_long_monday">Monday</string>
+ <string name="day_of_week_long_tuesday">Tuesday</string>
+ <string name="day_of_week_long_wednesday">Wednesday</string>
+ <string name="day_of_week_long_thursday">Thursday</string>
+ <string name="day_of_week_long_friday">Friday</string>
+ <string name="day_of_week_long_saturday">Saturday</string>
+
+ <string name="day_of_week_medium_sunday">Sun</string>
+ <string name="day_of_week_medium_monday">Mon</string>
+ <string name="day_of_week_medium_tuesday">Tue</string>
+ <string name="day_of_week_medium_wednesday">Wed</string>
+ <string name="day_of_week_medium_thursday">Thu</string>
+ <string name="day_of_week_medium_friday">Fri</string>
+ <string name="day_of_week_medium_saturday">Sat</string>
+
+ <string name="day_of_week_short_sunday">Su</string>
+ <string name="day_of_week_short_monday">Mo</string>
+ <string name="day_of_week_short_tuesday">Tu</string>
+ <string name="day_of_week_short_wednesday">We</string>
+ <string name="day_of_week_short_thursday">Th</string>
+ <string name="day_of_week_short_friday">Fr</string>
+ <string name="day_of_week_short_saturday">Sa</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">W</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">Yesterday</string>
+ <string name="today">Today</string>
+ <string name="tomorrow">Tomorrow</string>
+
+ <string name="hour_minute_ampm">%-l:%M %p</string>
+ <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
+ <string name="numeric_date">%-e/%m/%Y</string>
+ <string name="numeric_date_format">d/MM/yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%-l:%M:%S %p</string>
+ <string name="date_and_time">%-l:%M:%S %p %d/%m/%Y</string>
+ <string name="abbrev_month_day_year">%d/%m/%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 9da879b..d482222 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -710,7 +710,6 @@
<!-- no translation found for lockscreen_glogin_invalid_input (4881057177478491580) -->
<skip />
<!-- no translation found for status_bar_time_format (2168573805413119180) -->
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
<!-- no translation found for hour_minute_ampm (1850330605794978742) -->
<skip />
<!-- no translation found for hour_minute_cap_ampm (1122840227537374196) -->
@@ -864,7 +863,6 @@
<!-- from values-de/strings.xml and removal of all the german craziyness-->
<skip />
<!-- no translation found for numeric_date (5120078478872821100) -->
- <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
<!-- no translation found for wday1_date1_time1_wday2_date2_time2 (7066878981949584861) -->
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<!-- no translation found for wday1_date1_wday2_date2 (8671068747172261907) -->
@@ -888,11 +886,9 @@
<!-- no translation found for full_date_month_first (6011143962222283357) -->
<skip />
<!-- no translation found for full_date_day_first (8621594762705478189) -->
- <string name="full_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
<!-- no translation found for medium_date_month_first (48990963718825728) -->
<skip />
<!-- no translation found for medium_date_day_first (2898992016440387123) -->
- <string name="medium_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
<!-- no translation found for twelve_hour_time_format (6015557937879492156) -->
<skip />
<!-- no translation found for twenty_four_hour_time_format (5176807998669709535) -->
@@ -906,15 +902,12 @@
<!-- no translation found for Midnight (1260172107848123187) -->
<skip />
<!-- no translation found for month_day (3356633704511426364) -->
- <string name="month_day">"<xliff:g id="day" example="9">%-d</xliff:g> <xliff:g id="month" example="October">%B</xliff:g>"</string>
<!-- no translation found for month (3017405760734206414) -->
<skip />
<!-- no translation found for month_day_year (2435948225709176752) -->
- <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
<!-- no translation found for month_year (6228414124777343135) -->
<skip />
<!-- no translation found for time_of_day (8375993139317154157) -->
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
<!-- no translation found for date_and_time (9197690194373107109) -->
<skip />
<!-- no translation found for same_year_md1_md2 (9199324363135981317) -->
@@ -922,7 +915,6 @@
<!-- no translation found for same_year_wday1_md1_wday2_md2 (6006392413355305178) -->
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<!-- no translation found for date_and_time (353898423108629694) -->
- <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
<!-- no translation found for same_year_mdy1_mdy2 (1576657593937827090) -->
<string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string>
<!-- no translation found for same_year_wday1_mdy1_wday2_mdy2 (9135935796468891580) -->
@@ -968,11 +960,9 @@
<!-- no translation found for same_month_wday1_mdy1_time1_wday2_mdy2_time2 (1332950588774239228) -->
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<!-- no translation found for abbrev_month_day_year (5767271534015320250) -->
- <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
<!-- no translation found for abbrev_month_year (8058929633673942490) -->
<skip />
<!-- no translation found for abbrev_month_day (458867920693482757) -->
- <string name="abbrev_month_day">"<xliff:g id="day" example="31">%-d</xliff:g> <xliff:g id="month" example="Oct">%b</xliff:g>"</string>
<!-- no translation found for abbrev_month (1674509986330181349) -->
<skip />
<!-- no translation found for day_of_week_long_sunday (9057662850446501884) -->
diff --git a/core/res/res/values-en-rCA/donottranslate-cldr.xml b/core/res/res/values-en-rCA/donottranslate-cldr.xml
new file mode 100644
index 0000000..2fb3ef6
--- /dev/null
+++ b/core/res/res/values-en-rCA/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">January</string>
+ <string name="month_long_standalone_february">February</string>
+ <string name="month_long_standalone_march">March</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">May</string>
+ <string name="month_long_standalone_june">June</string>
+ <string name="month_long_standalone_july">July</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">October</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">December</string>
+
+ <string name="month_long_january">January</string>
+ <string name="month_long_february">February</string>
+ <string name="month_long_march">March</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">May</string>
+ <string name="month_long_june">June</string>
+ <string name="month_long_july">July</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">October</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">December</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mar</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">May</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Oct</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dec</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sunday</string>
+ <string name="day_of_week_long_monday">Monday</string>
+ <string name="day_of_week_long_tuesday">Tuesday</string>
+ <string name="day_of_week_long_wednesday">Wednesday</string>
+ <string name="day_of_week_long_thursday">Thursday</string>
+ <string name="day_of_week_long_friday">Friday</string>
+ <string name="day_of_week_long_saturday">Saturday</string>
+
+ <string name="day_of_week_medium_sunday">Sun</string>
+ <string name="day_of_week_medium_monday">Mon</string>
+ <string name="day_of_week_medium_tuesday">Tue</string>
+ <string name="day_of_week_medium_wednesday">Wed</string>
+ <string name="day_of_week_medium_thursday">Thu</string>
+ <string name="day_of_week_medium_friday">Fri</string>
+ <string name="day_of_week_medium_saturday">Sat</string>
+
+ <string name="day_of_week_short_sunday">Su</string>
+ <string name="day_of_week_short_monday">Mo</string>
+ <string name="day_of_week_short_tuesday">Tu</string>
+ <string name="day_of_week_short_wednesday">We</string>
+ <string name="day_of_week_short_thursday">Th</string>
+ <string name="day_of_week_short_friday">Fr</string>
+ <string name="day_of_week_short_saturday">Sa</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">W</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">Yesterday</string>
+ <string name="today">Today</string>
+ <string name="tomorrow">Tomorrow</string>
+
+ <string name="hour_minute_ampm">%-l:%M %p</string>
+ <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
+ <string name="numeric_date">%Y-%m-%d</string>
+ <string name="numeric_date_format">yyyy-MM-dd</string>
+ <string name="month_day_year">%B %-e, %Y</string>
+ <string name="time_of_day">%-l:%M:%S %p</string>
+ <string name="date_and_time">%-l:%M:%S %p %Y-%m-%d</string>
+ <string name="abbrev_month_day_year">%Y-%m-%d</string>
+ <string name="month_day">%B %-e</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-en-rGB/donottranslate-cldr.xml b/core/res/res/values-en-rGB/donottranslate-cldr.xml
new file mode 100644
index 0000000..0c544af
--- /dev/null
+++ b/core/res/res/values-en-rGB/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">January</string>
+ <string name="month_long_standalone_february">February</string>
+ <string name="month_long_standalone_march">March</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">May</string>
+ <string name="month_long_standalone_june">June</string>
+ <string name="month_long_standalone_july">July</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">October</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">December</string>
+
+ <string name="month_long_january">January</string>
+ <string name="month_long_february">February</string>
+ <string name="month_long_march">March</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">May</string>
+ <string name="month_long_june">June</string>
+ <string name="month_long_july">July</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">October</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">December</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mar</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">May</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Oct</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dec</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sunday</string>
+ <string name="day_of_week_long_monday">Monday</string>
+ <string name="day_of_week_long_tuesday">Tuesday</string>
+ <string name="day_of_week_long_wednesday">Wednesday</string>
+ <string name="day_of_week_long_thursday">Thursday</string>
+ <string name="day_of_week_long_friday">Friday</string>
+ <string name="day_of_week_long_saturday">Saturday</string>
+
+ <string name="day_of_week_medium_sunday">Sun</string>
+ <string name="day_of_week_medium_monday">Mon</string>
+ <string name="day_of_week_medium_tuesday">Tue</string>
+ <string name="day_of_week_medium_wednesday">Wed</string>
+ <string name="day_of_week_medium_thursday">Thu</string>
+ <string name="day_of_week_medium_friday">Fri</string>
+ <string name="day_of_week_medium_saturday">Sat</string>
+
+ <string name="day_of_week_short_sunday">Su</string>
+ <string name="day_of_week_short_monday">Mo</string>
+ <string name="day_of_week_short_tuesday">Tu</string>
+ <string name="day_of_week_short_wednesday">We</string>
+ <string name="day_of_week_short_thursday">Th</string>
+ <string name="day_of_week_short_friday">Fr</string>
+ <string name="day_of_week_short_saturday">Sa</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">W</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">Yesterday</string>
+ <string name="today">Today</string>
+ <string name="tomorrow">Tomorrow</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e %b %Y</string>
+ <string name="abbrev_month_day_year">%-e %b %Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-en-rIE/donottranslate-cldr.xml b/core/res/res/values-en-rIE/donottranslate-cldr.xml
new file mode 100644
index 0000000..0c544af
--- /dev/null
+++ b/core/res/res/values-en-rIE/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">January</string>
+ <string name="month_long_standalone_february">February</string>
+ <string name="month_long_standalone_march">March</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">May</string>
+ <string name="month_long_standalone_june">June</string>
+ <string name="month_long_standalone_july">July</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">October</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">December</string>
+
+ <string name="month_long_january">January</string>
+ <string name="month_long_february">February</string>
+ <string name="month_long_march">March</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">May</string>
+ <string name="month_long_june">June</string>
+ <string name="month_long_july">July</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">October</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">December</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mar</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">May</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Oct</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dec</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sunday</string>
+ <string name="day_of_week_long_monday">Monday</string>
+ <string name="day_of_week_long_tuesday">Tuesday</string>
+ <string name="day_of_week_long_wednesday">Wednesday</string>
+ <string name="day_of_week_long_thursday">Thursday</string>
+ <string name="day_of_week_long_friday">Friday</string>
+ <string name="day_of_week_long_saturday">Saturday</string>
+
+ <string name="day_of_week_medium_sunday">Sun</string>
+ <string name="day_of_week_medium_monday">Mon</string>
+ <string name="day_of_week_medium_tuesday">Tue</string>
+ <string name="day_of_week_medium_wednesday">Wed</string>
+ <string name="day_of_week_medium_thursday">Thu</string>
+ <string name="day_of_week_medium_friday">Fri</string>
+ <string name="day_of_week_medium_saturday">Sat</string>
+
+ <string name="day_of_week_short_sunday">Su</string>
+ <string name="day_of_week_short_monday">Mo</string>
+ <string name="day_of_week_short_tuesday">Tu</string>
+ <string name="day_of_week_short_wednesday">We</string>
+ <string name="day_of_week_short_thursday">Th</string>
+ <string name="day_of_week_short_friday">Fr</string>
+ <string name="day_of_week_short_saturday">Sa</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">W</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">Yesterday</string>
+ <string name="today">Today</string>
+ <string name="tomorrow">Tomorrow</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e %b %Y</string>
+ <string name="abbrev_month_day_year">%-e %b %Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-en-rIN/donottranslate-cldr.xml b/core/res/res/values-en-rIN/donottranslate-cldr.xml
new file mode 100644
index 0000000..823c3c1
--- /dev/null
+++ b/core/res/res/values-en-rIN/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">January</string>
+ <string name="month_long_standalone_february">February</string>
+ <string name="month_long_standalone_march">March</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">May</string>
+ <string name="month_long_standalone_june">June</string>
+ <string name="month_long_standalone_july">July</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">October</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">December</string>
+
+ <string name="month_long_january">January</string>
+ <string name="month_long_february">February</string>
+ <string name="month_long_march">March</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">May</string>
+ <string name="month_long_june">June</string>
+ <string name="month_long_july">July</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">October</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">December</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mar</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">May</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Oct</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dec</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sunday</string>
+ <string name="day_of_week_long_monday">Monday</string>
+ <string name="day_of_week_long_tuesday">Tuesday</string>
+ <string name="day_of_week_long_wednesday">Wednesday</string>
+ <string name="day_of_week_long_thursday">Thursday</string>
+ <string name="day_of_week_long_friday">Friday</string>
+ <string name="day_of_week_long_saturday">Saturday</string>
+
+ <string name="day_of_week_medium_sunday">Sun</string>
+ <string name="day_of_week_medium_monday">Mon</string>
+ <string name="day_of_week_medium_tuesday">Tue</string>
+ <string name="day_of_week_medium_wednesday">Wed</string>
+ <string name="day_of_week_medium_thursday">Thu</string>
+ <string name="day_of_week_medium_friday">Fri</string>
+ <string name="day_of_week_medium_saturday">Sat</string>
+
+ <string name="day_of_week_short_sunday">Su</string>
+ <string name="day_of_week_short_monday">Mo</string>
+ <string name="day_of_week_short_tuesday">Tu</string>
+ <string name="day_of_week_short_wednesday">We</string>
+ <string name="day_of_week_short_thursday">Th</string>
+ <string name="day_of_week_short_friday">Fr</string>
+ <string name="day_of_week_short_saturday">Sa</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">W</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">Yesterday</string>
+ <string name="today">Today</string>
+ <string name="tomorrow">Tomorrow</string>
+
+ <string name="hour_minute_ampm">%-l:%M %p</string>
+ <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%-l:%M:%S %p</string>
+ <string name="date_and_time">%-l:%M:%S %p %d-%b-%Y</string>
+ <string name="abbrev_month_day_year">%d-%b-%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-en-rNZ/donottranslate-cldr.xml b/core/res/res/values-en-rNZ/donottranslate-cldr.xml
new file mode 100644
index 0000000..bcd976c
--- /dev/null
+++ b/core/res/res/values-en-rNZ/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">January</string>
+ <string name="month_long_standalone_february">February</string>
+ <string name="month_long_standalone_march">March</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">May</string>
+ <string name="month_long_standalone_june">June</string>
+ <string name="month_long_standalone_july">July</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">October</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">December</string>
+
+ <string name="month_long_january">January</string>
+ <string name="month_long_february">February</string>
+ <string name="month_long_march">March</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">May</string>
+ <string name="month_long_june">June</string>
+ <string name="month_long_july">July</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">October</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">December</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mar</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">May</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Oct</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dec</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sunday</string>
+ <string name="day_of_week_long_monday">Monday</string>
+ <string name="day_of_week_long_tuesday">Tuesday</string>
+ <string name="day_of_week_long_wednesday">Wednesday</string>
+ <string name="day_of_week_long_thursday">Thursday</string>
+ <string name="day_of_week_long_friday">Friday</string>
+ <string name="day_of_week_long_saturday">Saturday</string>
+
+ <string name="day_of_week_medium_sunday">Sun</string>
+ <string name="day_of_week_medium_monday">Mon</string>
+ <string name="day_of_week_medium_tuesday">Tue</string>
+ <string name="day_of_week_medium_wednesday">Wed</string>
+ <string name="day_of_week_medium_thursday">Thu</string>
+ <string name="day_of_week_medium_friday">Fri</string>
+ <string name="day_of_week_medium_saturday">Sat</string>
+
+ <string name="day_of_week_short_sunday">Su</string>
+ <string name="day_of_week_short_monday">Mo</string>
+ <string name="day_of_week_short_tuesday">Tu</string>
+ <string name="day_of_week_short_wednesday">We</string>
+ <string name="day_of_week_short_thursday">Th</string>
+ <string name="day_of_week_short_friday">Fr</string>
+ <string name="day_of_week_short_saturday">Sa</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">W</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">Yesterday</string>
+ <string name="today">Today</string>
+ <string name="tomorrow">Tomorrow</string>
+
+ <string name="hour_minute_ampm">%-l:%M %p</string>
+ <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
+ <string name="numeric_date">%-e/%m/%Y</string>
+ <string name="numeric_date_format">d/MM/yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%-l:%M:%S %p</string>
+ <string name="date_and_time">%-l:%M:%S %p %-e/%m/%Y</string>
+ <string name="abbrev_month_day_year">%-e/%m/%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-en-rSG/donottranslate-cldr.xml b/core/res/res/values-en-rSG/donottranslate-cldr.xml
new file mode 100644
index 0000000..f305948
--- /dev/null
+++ b/core/res/res/values-en-rSG/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">January</string>
+ <string name="month_long_standalone_february">February</string>
+ <string name="month_long_standalone_march">March</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">May</string>
+ <string name="month_long_standalone_june">June</string>
+ <string name="month_long_standalone_july">July</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">October</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">December</string>
+
+ <string name="month_long_january">January</string>
+ <string name="month_long_february">February</string>
+ <string name="month_long_march">March</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">May</string>
+ <string name="month_long_june">June</string>
+ <string name="month_long_july">July</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">October</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">December</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mar</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">May</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Oct</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dec</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sunday</string>
+ <string name="day_of_week_long_monday">Monday</string>
+ <string name="day_of_week_long_tuesday">Tuesday</string>
+ <string name="day_of_week_long_wednesday">Wednesday</string>
+ <string name="day_of_week_long_thursday">Thursday</string>
+ <string name="day_of_week_long_friday">Friday</string>
+ <string name="day_of_week_long_saturday">Saturday</string>
+
+ <string name="day_of_week_medium_sunday">Sun</string>
+ <string name="day_of_week_medium_monday">Mon</string>
+ <string name="day_of_week_medium_tuesday">Tue</string>
+ <string name="day_of_week_medium_wednesday">Wed</string>
+ <string name="day_of_week_medium_thursday">Thu</string>
+ <string name="day_of_week_medium_friday">Fri</string>
+ <string name="day_of_week_medium_saturday">Sat</string>
+
+ <string name="day_of_week_short_sunday">Su</string>
+ <string name="day_of_week_short_monday">Mo</string>
+ <string name="day_of_week_short_tuesday">Tu</string>
+ <string name="day_of_week_short_wednesday">We</string>
+ <string name="day_of_week_short_thursday">Th</string>
+ <string name="day_of_week_short_friday">Fr</string>
+ <string name="day_of_week_short_saturday">Sa</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">W</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">Yesterday</string>
+ <string name="today">Today</string>
+ <string name="tomorrow">Tomorrow</string>
+
+ <string name="hour_minute_ampm">%-l:%M %p</string>
+ <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
+ <string name="numeric_date">%-m/%-e/%Y</string>
+ <string name="numeric_date_format">M/d/yyyy</string>
+ <string name="month_day_year">%B %-e, %Y</string>
+ <string name="time_of_day">%-l:%M:%S %p</string>
+ <string name="date_and_time">%-l:%M:%S %p %b %-e, %Y</string>
+ <string name="abbrev_month_day_year">%b %-e, %Y</string>
+ <string name="month_day">%B %-e</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-en-rSG/strings.xml b/core/res/res/values-en-rSG/strings.xml
index 6850a5d..1c6eda2 100644
--- a/core/res/res/values-en-rSG/strings.xml
+++ b/core/res/res/values-en-rSG/strings.xml
@@ -710,7 +710,6 @@
<!-- no translation found for lockscreen_glogin_invalid_input (4881057177478491580) -->
<skip />
<!-- no translation found for status_bar_time_format (2168573805413119180) -->
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
<!-- no translation found for hour_minute_ampm (1850330605794978742) -->
<skip />
<!-- no translation found for hour_minute_cap_ampm (1122840227537374196) -->
@@ -867,7 +866,6 @@
<!-- no translation found for wday1_date1_wday2_date2 (8671068747172261907) -->
<string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
<!-- no translation found for numeric_date (5537215108967329745) -->
- <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
<!-- no translation found for date1_time1_date2_time2 (3645498975775629615) -->
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<!-- no translation found for date1_date2 (377057563556488062) -->
@@ -885,11 +883,9 @@
<!-- no translation found for full_date_month_first (6011143962222283357) -->
<skip />
<!-- no translation found for full_date_day_first (8621594762705478189) -->
- <string name="full_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
<!-- no translation found for medium_date_month_first (48990963718825728) -->
<skip />
<!-- no translation found for medium_date_day_first (2898992016440387123) -->
- <string name="medium_date_day_first">"<xliff:g id="DAY">dd</xliff:g> <xliff:g id="MONTH">MMM</xliff:g> <xliff:g id="YEAR">yyyy</xliff:g>"</string>
<!-- no translation found for twelve_hour_time_format (6015557937879492156) -->
<skip />
<!-- no translation found for twenty_four_hour_time_format (5176807998669709535) -->
@@ -903,17 +899,13 @@
<!-- no translation found for Midnight (1260172107848123187) -->
<skip />
<!-- no translation found for month_day (3356633704511426364) -->
- <string name="month_day">"<xliff:g id="day" example="9">%-d</xliff:g> <xliff:g id="month" example="October">%B</xliff:g>"</string>
<!-- no translation found for month (3017405760734206414) -->
<skip />
<!-- no translation found for month_day_year (2435948225709176752) -->
- <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
<!-- no translation found for month_year (6228414124777343135) -->
<skip />
<!-- no translation found for time_of_day (8375993139317154157) -->
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
<!-- no translation found for date_and_time (9197690194373107109) -->
- <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
<!-- no translation found for same_year_md1_md2 (9199324363135981317) -->
<string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<!-- no translation found for same_year_wday1_md1_wday2_md2 (6006392413355305178) -->
@@ -963,11 +955,9 @@
<!-- no translation found for same_month_wday1_mdy1_time1_wday2_mdy2_time2 (1332950588774239228) -->
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<!-- no translation found for abbrev_month_day_year (5767271534015320250) -->
- <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
<!-- no translation found for abbrev_month_year (8058929633673942490) -->
<skip />
<!-- no translation found for abbrev_month_day (458867920693482757) -->
- <string name="abbrev_month_day">"<xliff:g id="day" example="31">%-d</xliff:g> <xliff:g id="month" example="Oct">%b</xliff:g>"</string>
<!-- no translation found for abbrev_month (1674509986330181349) -->
<skip />
<!-- no translation found for day_of_week_long_sunday (9057662850446501884) -->
diff --git a/core/res/res/values-en-rUS/donottranslate-cldr.xml b/core/res/res/values-en-rUS/donottranslate-cldr.xml
new file mode 100644
index 0000000..f305948
--- /dev/null
+++ b/core/res/res/values-en-rUS/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">January</string>
+ <string name="month_long_standalone_february">February</string>
+ <string name="month_long_standalone_march">March</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">May</string>
+ <string name="month_long_standalone_june">June</string>
+ <string name="month_long_standalone_july">July</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">October</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">December</string>
+
+ <string name="month_long_january">January</string>
+ <string name="month_long_february">February</string>
+ <string name="month_long_march">March</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">May</string>
+ <string name="month_long_june">June</string>
+ <string name="month_long_july">July</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">October</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">December</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mar</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">May</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Oct</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dec</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sunday</string>
+ <string name="day_of_week_long_monday">Monday</string>
+ <string name="day_of_week_long_tuesday">Tuesday</string>
+ <string name="day_of_week_long_wednesday">Wednesday</string>
+ <string name="day_of_week_long_thursday">Thursday</string>
+ <string name="day_of_week_long_friday">Friday</string>
+ <string name="day_of_week_long_saturday">Saturday</string>
+
+ <string name="day_of_week_medium_sunday">Sun</string>
+ <string name="day_of_week_medium_monday">Mon</string>
+ <string name="day_of_week_medium_tuesday">Tue</string>
+ <string name="day_of_week_medium_wednesday">Wed</string>
+ <string name="day_of_week_medium_thursday">Thu</string>
+ <string name="day_of_week_medium_friday">Fri</string>
+ <string name="day_of_week_medium_saturday">Sat</string>
+
+ <string name="day_of_week_short_sunday">Su</string>
+ <string name="day_of_week_short_monday">Mo</string>
+ <string name="day_of_week_short_tuesday">Tu</string>
+ <string name="day_of_week_short_wednesday">We</string>
+ <string name="day_of_week_short_thursday">Th</string>
+ <string name="day_of_week_short_friday">Fr</string>
+ <string name="day_of_week_short_saturday">Sa</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">W</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">Yesterday</string>
+ <string name="today">Today</string>
+ <string name="tomorrow">Tomorrow</string>
+
+ <string name="hour_minute_ampm">%-l:%M %p</string>
+ <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
+ <string name="numeric_date">%-m/%-e/%Y</string>
+ <string name="numeric_date_format">M/d/yyyy</string>
+ <string name="month_day_year">%B %-e, %Y</string>
+ <string name="time_of_day">%-l:%M:%S %p</string>
+ <string name="date_and_time">%-l:%M:%S %p %b %-e, %Y</string>
+ <string name="abbrev_month_day_year">%b %-e, %Y</string>
+ <string name="month_day">%B %-e</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-en-rZA/donottranslate-cldr.xml b/core/res/res/values-en-rZA/donottranslate-cldr.xml
new file mode 100644
index 0000000..633c761
--- /dev/null
+++ b/core/res/res/values-en-rZA/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">January</string>
+ <string name="month_long_standalone_february">February</string>
+ <string name="month_long_standalone_march">March</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">May</string>
+ <string name="month_long_standalone_june">June</string>
+ <string name="month_long_standalone_july">July</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">October</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">December</string>
+
+ <string name="month_long_january">January</string>
+ <string name="month_long_february">February</string>
+ <string name="month_long_march">March</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">May</string>
+ <string name="month_long_june">June</string>
+ <string name="month_long_july">July</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">October</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">December</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mar</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">May</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Oct</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dec</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sunday</string>
+ <string name="day_of_week_long_monday">Monday</string>
+ <string name="day_of_week_long_tuesday">Tuesday</string>
+ <string name="day_of_week_long_wednesday">Wednesday</string>
+ <string name="day_of_week_long_thursday">Thursday</string>
+ <string name="day_of_week_long_friday">Friday</string>
+ <string name="day_of_week_long_saturday">Saturday</string>
+
+ <string name="day_of_week_medium_sunday">Sun</string>
+ <string name="day_of_week_medium_monday">Mon</string>
+ <string name="day_of_week_medium_tuesday">Tue</string>
+ <string name="day_of_week_medium_wednesday">Wed</string>
+ <string name="day_of_week_medium_thursday">Thu</string>
+ <string name="day_of_week_medium_friday">Fri</string>
+ <string name="day_of_week_medium_saturday">Sat</string>
+
+ <string name="day_of_week_short_sunday">Su</string>
+ <string name="day_of_week_short_monday">Mo</string>
+ <string name="day_of_week_short_tuesday">Tu</string>
+ <string name="day_of_week_short_wednesday">We</string>
+ <string name="day_of_week_short_thursday">Th</string>
+ <string name="day_of_week_short_friday">Fr</string>
+ <string name="day_of_week_short_saturday">Sa</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">W</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">Yesterday</string>
+ <string name="today">Today</string>
+ <string name="tomorrow">Tomorrow</string>
+
+ <string name="hour_minute_ampm">%-l:%M %p</string>
+ <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
+ <string name="numeric_date">%Y/%m/%d</string>
+ <string name="numeric_date_format">yyyy/MM/dd</string>
+ <string name="month_day_year">%d %B %Y</string>
+ <string name="time_of_day">%-l:%M:%S %p</string>
+ <string name="date_and_time">%-l:%M:%S %p %d %b %Y</string>
+ <string name="abbrev_month_day_year">%d %b %Y</string>
+ <string name="month_day">%B %-e</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-es-rES/donottranslate-cldr.xml b/core/res/res/values-es-rES/donottranslate-cldr.xml
new file mode 100644
index 0000000..967a639
--- /dev/null
+++ b/core/res/res/values-es-rES/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">enero</string>
+ <string name="month_long_standalone_february">febrero</string>
+ <string name="month_long_standalone_march">marzo</string>
+ <string name="month_long_standalone_april">abril</string>
+ <string name="month_long_standalone_may">mayo</string>
+ <string name="month_long_standalone_june">junio</string>
+ <string name="month_long_standalone_july">julio</string>
+ <string name="month_long_standalone_august">agosto</string>
+ <string name="month_long_standalone_september">septiembre</string>
+ <string name="month_long_standalone_october">octubre</string>
+ <string name="month_long_standalone_november">noviembre</string>
+ <string name="month_long_standalone_december">diciembre</string>
+
+ <string name="month_long_january">enero</string>
+ <string name="month_long_february">febrero</string>
+ <string name="month_long_march">marzo</string>
+ <string name="month_long_april">abril</string>
+ <string name="month_long_may">mayo</string>
+ <string name="month_long_june">junio</string>
+ <string name="month_long_july">julio</string>
+ <string name="month_long_august">agosto</string>
+ <string name="month_long_september">septiembre</string>
+ <string name="month_long_october">octubre</string>
+ <string name="month_long_november">noviembre</string>
+ <string name="month_long_december">diciembre</string>
+
+ <string name="month_medium_january">ene</string>
+ <string name="month_medium_february">feb</string>
+ <string name="month_medium_march">mar</string>
+ <string name="month_medium_april">abr</string>
+ <string name="month_medium_may">may</string>
+ <string name="month_medium_june">jun</string>
+ <string name="month_medium_july">jul</string>
+ <string name="month_medium_august">ago</string>
+ <string name="month_medium_september">sep</string>
+ <string name="month_medium_october">oct</string>
+ <string name="month_medium_november">nov</string>
+ <string name="month_medium_december">dic</string>
+
+ <string name="month_shortest_january">E</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">domingo</string>
+ <string name="day_of_week_long_monday">lunes</string>
+ <string name="day_of_week_long_tuesday">martes</string>
+ <string name="day_of_week_long_wednesday">miércoles</string>
+ <string name="day_of_week_long_thursday">jueves</string>
+ <string name="day_of_week_long_friday">viernes</string>
+ <string name="day_of_week_long_saturday">sábado</string>
+
+ <string name="day_of_week_medium_sunday">dom</string>
+ <string name="day_of_week_medium_monday">lun</string>
+ <string name="day_of_week_medium_tuesday">mar</string>
+ <string name="day_of_week_medium_wednesday">mié</string>
+ <string name="day_of_week_medium_thursday">jue</string>
+ <string name="day_of_week_medium_friday">vie</string>
+ <string name="day_of_week_medium_saturday">sáb</string>
+
+ <string name="day_of_week_short_sunday">dom</string>
+ <string name="day_of_week_short_monday">lun</string>
+ <string name="day_of_week_short_tuesday">mar</string>
+ <string name="day_of_week_short_wednesday">mié</string>
+ <string name="day_of_week_short_thursday">jue</string>
+ <string name="day_of_week_short_friday">vie</string>
+ <string name="day_of_week_short_saturday">sáb</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">L</string>
+ <string name="day_of_week_shortest_tuesday">M</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">J</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">ayer</string>
+ <string name="today">hoy</string>
+ <string name="tomorrow">mañana</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%-e de %B de %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %d/%m/%Y</string>
+ <string name="abbrev_month_day_year">%d/%m/%Y</string>
+ <string name="month_day">%-e de %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B de %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-es-rUS/donottranslate-cldr.xml b/core/res/res/values-es-rUS/donottranslate-cldr.xml
new file mode 100644
index 0000000..8668fda
--- /dev/null
+++ b/core/res/res/values-es-rUS/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">enero</string>
+ <string name="month_long_standalone_february">febrero</string>
+ <string name="month_long_standalone_march">marzo</string>
+ <string name="month_long_standalone_april">abril</string>
+ <string name="month_long_standalone_may">mayo</string>
+ <string name="month_long_standalone_june">junio</string>
+ <string name="month_long_standalone_july">julio</string>
+ <string name="month_long_standalone_august">agosto</string>
+ <string name="month_long_standalone_september">septiembre</string>
+ <string name="month_long_standalone_october">octubre</string>
+ <string name="month_long_standalone_november">noviembre</string>
+ <string name="month_long_standalone_december">diciembre</string>
+
+ <string name="month_long_january">enero</string>
+ <string name="month_long_february">febrero</string>
+ <string name="month_long_march">marzo</string>
+ <string name="month_long_april">abril</string>
+ <string name="month_long_may">mayo</string>
+ <string name="month_long_june">junio</string>
+ <string name="month_long_july">julio</string>
+ <string name="month_long_august">agosto</string>
+ <string name="month_long_september">septiembre</string>
+ <string name="month_long_october">octubre</string>
+ <string name="month_long_november">noviembre</string>
+ <string name="month_long_december">diciembre</string>
+
+ <string name="month_medium_january">ene</string>
+ <string name="month_medium_february">feb</string>
+ <string name="month_medium_march">mar</string>
+ <string name="month_medium_april">abr</string>
+ <string name="month_medium_may">may</string>
+ <string name="month_medium_june">jun</string>
+ <string name="month_medium_july">jul</string>
+ <string name="month_medium_august">ago</string>
+ <string name="month_medium_september">sep</string>
+ <string name="month_medium_october">oct</string>
+ <string name="month_medium_november">nov</string>
+ <string name="month_medium_december">dic</string>
+
+ <string name="month_shortest_january">E</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">domingo</string>
+ <string name="day_of_week_long_monday">lunes</string>
+ <string name="day_of_week_long_tuesday">martes</string>
+ <string name="day_of_week_long_wednesday">miércoles</string>
+ <string name="day_of_week_long_thursday">jueves</string>
+ <string name="day_of_week_long_friday">viernes</string>
+ <string name="day_of_week_long_saturday">sábado</string>
+
+ <string name="day_of_week_medium_sunday">dom</string>
+ <string name="day_of_week_medium_monday">lun</string>
+ <string name="day_of_week_medium_tuesday">mar</string>
+ <string name="day_of_week_medium_wednesday">mié</string>
+ <string name="day_of_week_medium_thursday">jue</string>
+ <string name="day_of_week_medium_friday">vie</string>
+ <string name="day_of_week_medium_saturday">sáb</string>
+
+ <string name="day_of_week_short_sunday">dom</string>
+ <string name="day_of_week_short_monday">lun</string>
+ <string name="day_of_week_short_tuesday">mar</string>
+ <string name="day_of_week_short_wednesday">mié</string>
+ <string name="day_of_week_short_thursday">jue</string>
+ <string name="day_of_week_short_friday">vie</string>
+ <string name="day_of_week_short_saturday">sáb</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">L</string>
+ <string name="day_of_week_shortest_tuesday">M</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">J</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">ayer</string>
+ <string name="today">hoy</string>
+ <string name="tomorrow">mañana</string>
+
+ <string name="hour_minute_ampm">%-l:%M %p</string>
+ <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
+ <string name="numeric_date">%-m/%-e/%Y</string>
+ <string name="numeric_date_format">M/d/yyyy</string>
+ <string name="month_day_year">%-e de %B de %Y</string>
+ <string name="time_of_day">%-l:%M:%S %p</string>
+ <string name="date_and_time">%-l:%M:%S %p %b %-e, %Y</string>
+ <string name="abbrev_month_day_year">%b %-e, %Y</string>
+ <string name="month_day">%-e de %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B de %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 7b60a39..6032321 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -436,9 +436,6 @@
<string name="lockscreen_glogin_password_hint">"Contraseña"</string>
<string name="lockscreen_glogin_submit_button">"Inicia sesión"</string>
<string name="lockscreen_glogin_invalid_input">"Nombre de usuario o contraseña incorrecta."</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button">"Borrar notificaciones"</string>
@@ -470,9 +467,6 @@
<string name="menu_enter_shortcut_label">"ingresar"</string>
<string name="menu_delete_shortcut_label">"borrar"</string>
<string name="search_go">"Buscar"</string>
- <string name="today">"Hoy"</string>
- <string name="yesterday">"Ayer"</string>
- <string name="tomorrow">"Mañana"</string>
<string name="oneMonthDurationPast">"hace 1 mes"</string>
<string name="beforeOneMonthDurationPast">"Anterior a 1 mes atrás"</string>
<plurals name="num_seconds_ago">
@@ -554,13 +548,6 @@
<string name="weeks">"semanas"</string>
<string name="year">"año"</string>
<string name="years">"años"</string>
- <string name="sunday">"Domingo"</string>
- <string name="monday">"Lunes"</string>
- <string name="tuesday">"Martes"</string>
- <string name="wednesday">"Miércoles"</string>
- <string name="thursday">"Jueves"</string>
- <string name="friday">"Viernes"</string>
- <string name="saturday">"Sábado"</string>
<string name="every_weekday">"Los días de semana (lunes a viernes)"</string>
<string name="daily">"Diariamente"</string>
<string name="weekly">"Semanalmente el día <xliff:g id="DAY">%s</xliff:g>"</string>
@@ -570,9 +557,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"Lo sentimos, este video no es válido para las transmisiones a este dispositivo."</string>
<string name="VideoView_error_text_unknown">"Lo sentimos, no se puede reproducir este video."</string>
<string name="VideoView_error_button">"Aceptar"</string>
- <string name="am">"AM"</string>
- <string name="pm">"PM"</string>
- <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -584,23 +568,12 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"mediodía"</string>
<string name="Noon">"Mediodía"</string>
<string name="midnight">"medianoche"</string>
<string name="Midnight">"Medianoche"</string>
- <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string>
@@ -625,82 +598,8 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"Domingo"</string>
- <string name="day_of_week_long_monday">"Lunes"</string>
- <string name="day_of_week_long_tuesday">"Martes"</string>
- <string name="day_of_week_long_wednesday">"Miércoles"</string>
- <string name="day_of_week_long_thursday">"Jueves"</string>
- <string name="day_of_week_long_friday">"Viernes"</string>
- <string name="day_of_week_long_saturday">"Sábado"</string>
- <string name="day_of_week_medium_sunday">"Dom."</string>
- <string name="day_of_week_medium_monday">"Lun."</string>
- <string name="day_of_week_medium_tuesday">"Mar."</string>
- <string name="day_of_week_medium_wednesday">"Mié."</string>
- <string name="day_of_week_medium_thursday">"Jue."</string>
- <string name="day_of_week_medium_friday">"Vie."</string>
- <string name="day_of_week_medium_saturday">"Sáb."</string>
- <string name="day_of_week_short_sunday">"Dom."</string>
- <string name="day_of_week_short_monday">"Lun."</string>
- <string name="day_of_week_short_tuesday">"Mar."</string>
- <string name="day_of_week_short_wednesday">"Nosotros"</string>
- <string name="day_of_week_short_thursday">"Jue."</string>
- <string name="day_of_week_short_friday">"V"</string>
- <string name="day_of_week_short_saturday">"Sáb."</string>
- <string name="day_of_week_shorter_sunday">"Dom."</string>
- <string name="day_of_week_shorter_monday">"L"</string>
- <string name="day_of_week_shorter_tuesday">"Mar."</string>
- <string name="day_of_week_shorter_wednesday">"M"</string>
- <string name="day_of_week_shorter_thursday">"Jue."</string>
- <string name="day_of_week_shorter_friday">"V"</string>
- <string name="day_of_week_shorter_saturday">"Sáb."</string>
- <string name="day_of_week_shortest_sunday">"D"</string>
- <string name="day_of_week_shortest_monday">"L"</string>
- <string name="day_of_week_shortest_tuesday">"Mar."</string>
- <string name="day_of_week_shortest_wednesday">"M"</string>
- <string name="day_of_week_shortest_thursday">"Jue."</string>
- <string name="day_of_week_shortest_friday">"V"</string>
- <string name="day_of_week_shortest_saturday">"D"</string>
- <string name="month_long_january">"Enero"</string>
- <string name="month_long_february">"Febrero"</string>
- <string name="month_long_march">"Marzo"</string>
- <string name="month_long_april">"Abril"</string>
- <string name="month_long_may">"Mayo"</string>
- <string name="month_long_june">"Junio"</string>
- <string name="month_long_july">"Julio"</string>
- <string name="month_long_august">"Agosto"</string>
- <string name="month_long_september">"Septiembre"</string>
- <string name="month_long_october">"Octubre"</string>
- <string name="month_long_november">"Noviembre"</string>
- <string name="month_long_december">"Diciembre"</string>
- <string name="month_medium_january">"Ene."</string>
- <string name="month_medium_february">"Feb."</string>
- <string name="month_medium_march">"Mar."</string>
- <string name="month_medium_april">"Abr."</string>
- <string name="month_medium_may">"Mayo"</string>
- <string name="month_medium_june">"Jun."</string>
- <string name="month_medium_july">"Jul."</string>
- <string name="month_medium_august">"Ago."</string>
- <string name="month_medium_september">"Sep."</string>
- <string name="month_medium_october">"Oct."</string>
- <string name="month_medium_november">"Nov."</string>
- <string name="month_medium_december">"Dic."</string>
- <string name="month_shortest_january">"E"</string>
- <string name="month_shortest_february">"V"</string>
- <string name="month_shortest_march">"M"</string>
- <string name="month_shortest_april">"A"</string>
- <string name="month_shortest_may">"M"</string>
- <string name="month_shortest_june">"E"</string>
- <string name="month_shortest_july">"J"</string>
- <string name="month_shortest_august">"Ago."</string>
- <string name="month_shortest_september">"D"</string>
- <string name="month_shortest_october">"O"</string>
- <string name="month_shortest_november">"N"</string>
- <string name="month_shortest_december">"Dic."</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"Seleccionar todos"</string>
diff --git a/core/res/res/values-es/donottranslate-cldr.xml b/core/res/res/values-es/donottranslate-cldr.xml
new file mode 100644
index 0000000..967a639
--- /dev/null
+++ b/core/res/res/values-es/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">enero</string>
+ <string name="month_long_standalone_february">febrero</string>
+ <string name="month_long_standalone_march">marzo</string>
+ <string name="month_long_standalone_april">abril</string>
+ <string name="month_long_standalone_may">mayo</string>
+ <string name="month_long_standalone_june">junio</string>
+ <string name="month_long_standalone_july">julio</string>
+ <string name="month_long_standalone_august">agosto</string>
+ <string name="month_long_standalone_september">septiembre</string>
+ <string name="month_long_standalone_october">octubre</string>
+ <string name="month_long_standalone_november">noviembre</string>
+ <string name="month_long_standalone_december">diciembre</string>
+
+ <string name="month_long_january">enero</string>
+ <string name="month_long_february">febrero</string>
+ <string name="month_long_march">marzo</string>
+ <string name="month_long_april">abril</string>
+ <string name="month_long_may">mayo</string>
+ <string name="month_long_june">junio</string>
+ <string name="month_long_july">julio</string>
+ <string name="month_long_august">agosto</string>
+ <string name="month_long_september">septiembre</string>
+ <string name="month_long_october">octubre</string>
+ <string name="month_long_november">noviembre</string>
+ <string name="month_long_december">diciembre</string>
+
+ <string name="month_medium_january">ene</string>
+ <string name="month_medium_february">feb</string>
+ <string name="month_medium_march">mar</string>
+ <string name="month_medium_april">abr</string>
+ <string name="month_medium_may">may</string>
+ <string name="month_medium_june">jun</string>
+ <string name="month_medium_july">jul</string>
+ <string name="month_medium_august">ago</string>
+ <string name="month_medium_september">sep</string>
+ <string name="month_medium_october">oct</string>
+ <string name="month_medium_november">nov</string>
+ <string name="month_medium_december">dic</string>
+
+ <string name="month_shortest_january">E</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">domingo</string>
+ <string name="day_of_week_long_monday">lunes</string>
+ <string name="day_of_week_long_tuesday">martes</string>
+ <string name="day_of_week_long_wednesday">miércoles</string>
+ <string name="day_of_week_long_thursday">jueves</string>
+ <string name="day_of_week_long_friday">viernes</string>
+ <string name="day_of_week_long_saturday">sábado</string>
+
+ <string name="day_of_week_medium_sunday">dom</string>
+ <string name="day_of_week_medium_monday">lun</string>
+ <string name="day_of_week_medium_tuesday">mar</string>
+ <string name="day_of_week_medium_wednesday">mié</string>
+ <string name="day_of_week_medium_thursday">jue</string>
+ <string name="day_of_week_medium_friday">vie</string>
+ <string name="day_of_week_medium_saturday">sáb</string>
+
+ <string name="day_of_week_short_sunday">dom</string>
+ <string name="day_of_week_short_monday">lun</string>
+ <string name="day_of_week_short_tuesday">mar</string>
+ <string name="day_of_week_short_wednesday">mié</string>
+ <string name="day_of_week_short_thursday">jue</string>
+ <string name="day_of_week_short_friday">vie</string>
+ <string name="day_of_week_short_saturday">sáb</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">L</string>
+ <string name="day_of_week_shortest_tuesday">M</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">J</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">ayer</string>
+ <string name="today">hoy</string>
+ <string name="tomorrow">mañana</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%-e de %B de %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %d/%m/%Y</string>
+ <string name="abbrev_month_day_year">%d/%m/%Y</string>
+ <string name="month_day">%-e de %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B de %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index a9f267a..c55e0ed 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -418,9 +418,6 @@
<string name="lockscreen_glogin_password_hint">"Contraseña"</string>
<string name="lockscreen_glogin_submit_button">"Acceder"</string>
<string name="lockscreen_glogin_invalid_input">"Nombre de usuario o contraseña no válido"</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button">"Cerrar notificaciones"</string>
@@ -452,9 +449,6 @@
<string name="menu_enter_shortcut_label">"intro"</string>
<string name="menu_delete_shortcut_label">"suprimir"</string>
<string name="search_go">"Buscar"</string>
- <string name="today">"Hoy"</string>
- <string name="yesterday">"Ayer"</string>
- <string name="tomorrow">"Mañana"</string>
<string name="oneMonthDurationPast">"Hace un mes"</string>
<string name="beforeOneMonthDurationPast">"Hace más de un mes"</string>
<plurals name="num_seconds_ago">
@@ -536,13 +530,6 @@
<string name="weeks">"semanas"</string>
<string name="year">"año"</string>
<string name="years">"años"</string>
- <string name="sunday">"Domingo"</string>
- <string name="monday">"Lunes"</string>
- <string name="tuesday">"Martes"</string>
- <string name="wednesday">"Miércoles"</string>
- <string name="thursday">"Jueves"</string>
- <string name="friday">"Viernes"</string>
- <string name="saturday">"Sábado"</string>
<string name="every_weekday">"Todos los días laborables (Lun-Vie)"</string>
<string name="daily">"Diariamente"</string>
<string name="weekly">"Semanalmente, el <xliff:g id="DAY">%s</xliff:g>"</string>
@@ -552,9 +539,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"Este vídeo no se puede transmitir al dispositivo."</string>
<string name="VideoView_error_text_unknown">"Este vídeo no se puede reproducir."</string>
<string name="VideoView_error_button">"Aceptar"</string>
- <string name="am">"a.m."</string>
- <string name="pm">"p.m."</string>
- <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -566,23 +550,12 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' de '<xliff:g id="MONTH">MMMM</xliff:g>' de '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' de '<xliff:g id="MONTH">MMMM</xliff:g>' de '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' de '<xliff:g id="MONTH">MMM</xliff:g>' de '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"mediodía"</string>
<string name="Noon">"Mediodía"</string>
<string name="midnight">"medianoche"</string>
<string name="Midnight">"Medianoche"</string>
- <string name="month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string>
@@ -607,82 +580,8 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> de <xliff:g id="MONTH">%b</xliff:g> de <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"Domingo"</string>
- <string name="day_of_week_long_monday">"Lunes"</string>
- <string name="day_of_week_long_tuesday">"Martes"</string>
- <string name="day_of_week_long_wednesday">"Miércoles"</string>
- <string name="day_of_week_long_thursday">"Jueves"</string>
- <string name="day_of_week_long_friday">"Viernes"</string>
- <string name="day_of_week_long_saturday">"Sábado"</string>
- <string name="day_of_week_medium_sunday">"Dom"</string>
- <string name="day_of_week_medium_monday">"Lun"</string>
- <string name="day_of_week_medium_tuesday">"Mar"</string>
- <string name="day_of_week_medium_wednesday">"Mié"</string>
- <string name="day_of_week_medium_thursday">"Jue"</string>
- <string name="day_of_week_medium_friday">"Vie"</string>
- <string name="day_of_week_medium_saturday">"Sáb"</string>
- <string name="day_of_week_short_sunday">"Do"</string>
- <string name="day_of_week_short_monday">"Lu"</string>
- <string name="day_of_week_short_tuesday">"Ma"</string>
- <string name="day_of_week_short_wednesday">"Mi"</string>
- <string name="day_of_week_short_thursday">"Ju"</string>
- <string name="day_of_week_short_friday">"Vi"</string>
- <string name="day_of_week_short_saturday">"Sá"</string>
- <string name="day_of_week_shorter_sunday">"Do"</string>
- <string name="day_of_week_shorter_monday">"L"</string>
- <string name="day_of_week_shorter_tuesday">"Ma"</string>
- <string name="day_of_week_shorter_wednesday">"Mi"</string>
- <string name="day_of_week_shorter_thursday">"Ju"</string>
- <string name="day_of_week_shorter_friday">"V"</string>
- <string name="day_of_week_shorter_saturday">"S"</string>
- <string name="day_of_week_shortest_sunday">"D"</string>
- <string name="day_of_week_shortest_monday">"Mz"</string>
- <string name="day_of_week_shortest_tuesday">"M"</string>
- <string name="day_of_week_shortest_wednesday">"Mi"</string>
- <string name="day_of_week_shortest_thursday">"M"</string>
- <string name="day_of_week_shortest_friday">"V"</string>
- <string name="day_of_week_shortest_saturday">"D"</string>
- <string name="month_long_january">"Enero"</string>
- <string name="month_long_february">"Febrero"</string>
- <string name="month_long_march">"Marzo"</string>
- <string name="month_long_april">"Abril"</string>
- <string name="month_long_may">"Mayo"</string>
- <string name="month_long_june">"Junio"</string>
- <string name="month_long_july">"Julio"</string>
- <string name="month_long_august">"Agosto"</string>
- <string name="month_long_september">"Septiembre"</string>
- <string name="month_long_october">"Octubre"</string>
- <string name="month_long_november">"Noviembre"</string>
- <string name="month_long_december">"Diciembre"</string>
- <string name="month_medium_january">"Ene"</string>
- <string name="month_medium_february">"Feb"</string>
- <string name="month_medium_march">"Mar"</string>
- <string name="month_medium_april">"Abr"</string>
- <string name="month_medium_may">"May"</string>
- <string name="month_medium_june">"Jun"</string>
- <string name="month_medium_july">"Jul"</string>
- <string name="month_medium_august">"Ago"</string>
- <string name="month_medium_september">"Sep"</string>
- <string name="month_medium_october">"Oct"</string>
- <string name="month_medium_november">"Nov"</string>
- <string name="month_medium_december">"Dic"</string>
- <string name="month_shortest_january">"E"</string>
- <string name="month_shortest_february">"V"</string>
- <string name="month_shortest_march">"Mz"</string>
- <string name="month_shortest_april">"A"</string>
- <string name="month_shortest_may">"My"</string>
- <string name="month_shortest_june">"J"</string>
- <string name="month_shortest_july">"E"</string>
- <string name="month_shortest_august">"Ag"</string>
- <string name="month_shortest_september">"S"</string>
- <string name="month_shortest_october">"O"</string>
- <string name="month_shortest_november">"N"</string>
- <string name="month_shortest_december">"D"</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"Seleccionar todo"</string>
diff --git a/core/res/res/values-fi-rFI/donottranslate-cldr.xml b/core/res/res/values-fi-rFI/donottranslate-cldr.xml
new file mode 100644
index 0000000..ae28635
--- /dev/null
+++ b/core/res/res/values-fi-rFI/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">tammikuu</string>
+ <string name="month_long_standalone_february">helmikuu</string>
+ <string name="month_long_standalone_march">maaliskuu</string>
+ <string name="month_long_standalone_april">huhtikuu</string>
+ <string name="month_long_standalone_may">toukokuu</string>
+ <string name="month_long_standalone_june">kesäkuu</string>
+ <string name="month_long_standalone_july">heinäkuu</string>
+ <string name="month_long_standalone_august">elokuu</string>
+ <string name="month_long_standalone_september">syyskuu</string>
+ <string name="month_long_standalone_october">lokakuu</string>
+ <string name="month_long_standalone_november">marraskuu</string>
+ <string name="month_long_standalone_december">joulukuu</string>
+
+ <string name="month_long_january">tammikuuta</string>
+ <string name="month_long_february">helmikuuta</string>
+ <string name="month_long_march">maaliskuuta</string>
+ <string name="month_long_april">huhtikuuta</string>
+ <string name="month_long_may">toukokuuta</string>
+ <string name="month_long_june">kesäkuuta</string>
+ <string name="month_long_july">heinäkuuta</string>
+ <string name="month_long_august">elokuuta</string>
+ <string name="month_long_september">syyskuuta</string>
+ <string name="month_long_october">lokakuuta</string>
+ <string name="month_long_november">marraskuuta</string>
+ <string name="month_long_december">joulukuuta</string>
+
+ <string name="month_medium_january">tammikuuta</string>
+ <string name="month_medium_february">helmikuuta</string>
+ <string name="month_medium_march">maaliskuuta</string>
+ <string name="month_medium_april">huhtikuuta</string>
+ <string name="month_medium_may">toukokuuta</string>
+ <string name="month_medium_june">kesäkuuta</string>
+ <string name="month_medium_july">heinäkuuta</string>
+ <string name="month_medium_august">elokuuta</string>
+ <string name="month_medium_september">syyskuuta</string>
+ <string name="month_medium_october">lokakuuta</string>
+ <string name="month_medium_november">marraskuuta</string>
+ <string name="month_medium_december">joulukuuta</string>
+
+ <string name="month_shortest_january">T</string>
+ <string name="month_shortest_february">H</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">H</string>
+ <string name="month_shortest_may">T</string>
+ <string name="month_shortest_june">K</string>
+ <string name="month_shortest_july">H</string>
+ <string name="month_shortest_august">E</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">L</string>
+ <string name="month_shortest_november">M</string>
+ <string name="month_shortest_december">J</string>
+
+ <string name="day_of_week_long_sunday">sunnuntaina</string>
+ <string name="day_of_week_long_monday">maanantaina</string>
+ <string name="day_of_week_long_tuesday">tiistaina</string>
+ <string name="day_of_week_long_wednesday">keskiviikkona</string>
+ <string name="day_of_week_long_thursday">torstaina</string>
+ <string name="day_of_week_long_friday">perjantaina</string>
+ <string name="day_of_week_long_saturday">lauantaina</string>
+
+ <string name="day_of_week_medium_sunday">su</string>
+ <string name="day_of_week_medium_monday">ma</string>
+ <string name="day_of_week_medium_tuesday">ti</string>
+ <string name="day_of_week_medium_wednesday">ke</string>
+ <string name="day_of_week_medium_thursday">to</string>
+ <string name="day_of_week_medium_friday">pe</string>
+ <string name="day_of_week_medium_saturday">la</string>
+
+ <string name="day_of_week_short_sunday">su</string>
+ <string name="day_of_week_short_monday">ma</string>
+ <string name="day_of_week_short_tuesday">ti</string>
+ <string name="day_of_week_short_wednesday">ke</string>
+ <string name="day_of_week_short_thursday">to</string>
+ <string name="day_of_week_short_friday">pe</string>
+ <string name="day_of_week_short_saturday">la</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">K</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">P</string>
+ <string name="day_of_week_shortest_saturday">L</string>
+
+ <string name="am">ap.</string>
+ <string name="pm">ip.</string>
+ <string name="yesterday">eilen</string>
+ <string name="today">tänään</string>
+ <string name="tomorrow">huomenna</string>
+
+ <string name="hour_minute_ampm">%-k.%M</string>
+ <string name="hour_minute_cap_ampm">%-k.%M</string>
+ <string name="numeric_date">%-e.%-m.%Y</string>
+ <string name="numeric_date_format">d.M.yyyy</string>
+ <string name="month_day_year">%-e. %B %Y</string>
+ <string name="time_of_day">%-k.%M.%S</string>
+ <string name="date_and_time">%-k.%M.%S %-e.%-m.%Y</string>
+ <string name="abbrev_month_day_year">%-e.%-m.%Y</string>
+ <string name="month_day">%-e. %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%-B %Y</string>
+ <string name="abbrev_month_day">%-e. %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%-b %Y</string>
+</resources>
diff --git a/core/res/res/values-fr-rBE/donottranslate-cldr.xml b/core/res/res/values-fr-rBE/donottranslate-cldr.xml
new file mode 100644
index 0000000..b540336
--- /dev/null
+++ b/core/res/res/values-fr-rBE/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">janvier</string>
+ <string name="month_long_standalone_february">février</string>
+ <string name="month_long_standalone_march">mars</string>
+ <string name="month_long_standalone_april">avril</string>
+ <string name="month_long_standalone_may">mai</string>
+ <string name="month_long_standalone_june">juin</string>
+ <string name="month_long_standalone_july">juillet</string>
+ <string name="month_long_standalone_august">août</string>
+ <string name="month_long_standalone_september">septembre</string>
+ <string name="month_long_standalone_october">octobre</string>
+ <string name="month_long_standalone_november">novembre</string>
+ <string name="month_long_standalone_december">décembre</string>
+
+ <string name="month_long_january">janvier</string>
+ <string name="month_long_february">février</string>
+ <string name="month_long_march">mars</string>
+ <string name="month_long_april">avril</string>
+ <string name="month_long_may">mai</string>
+ <string name="month_long_june">juin</string>
+ <string name="month_long_july">juillet</string>
+ <string name="month_long_august">août</string>
+ <string name="month_long_september">septembre</string>
+ <string name="month_long_october">octobre</string>
+ <string name="month_long_november">novembre</string>
+ <string name="month_long_december">décembre</string>
+
+ <string name="month_medium_january">janv.</string>
+ <string name="month_medium_february">févr.</string>
+ <string name="month_medium_march">mars</string>
+ <string name="month_medium_april">avr.</string>
+ <string name="month_medium_may">mai</string>
+ <string name="month_medium_june">juin</string>
+ <string name="month_medium_july">juil.</string>
+ <string name="month_medium_august">août</string>
+ <string name="month_medium_september">sept.</string>
+ <string name="month_medium_october">oct.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">déc.</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">dimanche</string>
+ <string name="day_of_week_long_monday">lundi</string>
+ <string name="day_of_week_long_tuesday">mardi</string>
+ <string name="day_of_week_long_wednesday">mercredi</string>
+ <string name="day_of_week_long_thursday">jeudi</string>
+ <string name="day_of_week_long_friday">vendredi</string>
+ <string name="day_of_week_long_saturday">samedi</string>
+
+ <string name="day_of_week_medium_sunday">dim.</string>
+ <string name="day_of_week_medium_monday">lun.</string>
+ <string name="day_of_week_medium_tuesday">mar.</string>
+ <string name="day_of_week_medium_wednesday">mer.</string>
+ <string name="day_of_week_medium_thursday">jeu.</string>
+ <string name="day_of_week_medium_friday">ven.</string>
+ <string name="day_of_week_medium_saturday">sam.</string>
+
+ <string name="day_of_week_short_sunday">dim.</string>
+ <string name="day_of_week_short_monday">lun.</string>
+ <string name="day_of_week_short_tuesday">mar.</string>
+ <string name="day_of_week_short_wednesday">mer.</string>
+ <string name="day_of_week_short_thursday">jeu.</string>
+ <string name="day_of_week_short_friday">ven.</string>
+ <string name="day_of_week_short_saturday">sam.</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">L</string>
+ <string name="day_of_week_shortest_tuesday">M</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">J</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">matin</string>
+ <string name="pm">soir</string>
+ <string name="yesterday">hier</string>
+ <string name="today">aujourd’hui</string>
+ <string name="tomorrow">demain</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%-e/%m/%Y</string>
+ <string name="numeric_date_format">d/MM/yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e %b %Y</string>
+ <string name="abbrev_month_day_year">%-e %b %Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-fr-rCA/donottranslate-cldr.xml b/core/res/res/values-fr-rCA/donottranslate-cldr.xml
new file mode 100644
index 0000000..5fa5d54
--- /dev/null
+++ b/core/res/res/values-fr-rCA/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">janvier</string>
+ <string name="month_long_standalone_february">février</string>
+ <string name="month_long_standalone_march">mars</string>
+ <string name="month_long_standalone_april">avril</string>
+ <string name="month_long_standalone_may">mai</string>
+ <string name="month_long_standalone_june">juin</string>
+ <string name="month_long_standalone_july">juillet</string>
+ <string name="month_long_standalone_august">août</string>
+ <string name="month_long_standalone_september">septembre</string>
+ <string name="month_long_standalone_october">octobre</string>
+ <string name="month_long_standalone_november">novembre</string>
+ <string name="month_long_standalone_december">décembre</string>
+
+ <string name="month_long_january">janvier</string>
+ <string name="month_long_february">février</string>
+ <string name="month_long_march">mars</string>
+ <string name="month_long_april">avril</string>
+ <string name="month_long_may">mai</string>
+ <string name="month_long_june">juin</string>
+ <string name="month_long_july">juillet</string>
+ <string name="month_long_august">août</string>
+ <string name="month_long_september">septembre</string>
+ <string name="month_long_october">octobre</string>
+ <string name="month_long_november">novembre</string>
+ <string name="month_long_december">décembre</string>
+
+ <string name="month_medium_january">janv.</string>
+ <string name="month_medium_february">févr.</string>
+ <string name="month_medium_march">mars</string>
+ <string name="month_medium_april">avr.</string>
+ <string name="month_medium_may">mai</string>
+ <string name="month_medium_june">juin</string>
+ <string name="month_medium_july">juil.</string>
+ <string name="month_medium_august">août</string>
+ <string name="month_medium_september">sept.</string>
+ <string name="month_medium_october">oct.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">déc.</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">dimanche</string>
+ <string name="day_of_week_long_monday">lundi</string>
+ <string name="day_of_week_long_tuesday">mardi</string>
+ <string name="day_of_week_long_wednesday">mercredi</string>
+ <string name="day_of_week_long_thursday">jeudi</string>
+ <string name="day_of_week_long_friday">vendredi</string>
+ <string name="day_of_week_long_saturday">samedi</string>
+
+ <string name="day_of_week_medium_sunday">dim.</string>
+ <string name="day_of_week_medium_monday">lun.</string>
+ <string name="day_of_week_medium_tuesday">mar.</string>
+ <string name="day_of_week_medium_wednesday">mer.</string>
+ <string name="day_of_week_medium_thursday">jeu.</string>
+ <string name="day_of_week_medium_friday">ven.</string>
+ <string name="day_of_week_medium_saturday">sam.</string>
+
+ <string name="day_of_week_short_sunday">dim.</string>
+ <string name="day_of_week_short_monday">lun.</string>
+ <string name="day_of_week_short_tuesday">mar.</string>
+ <string name="day_of_week_short_wednesday">mer.</string>
+ <string name="day_of_week_short_thursday">jeu.</string>
+ <string name="day_of_week_short_friday">ven.</string>
+ <string name="day_of_week_short_saturday">sam.</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">L</string>
+ <string name="day_of_week_shortest_tuesday">M</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">J</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">matin</string>
+ <string name="pm">soir</string>
+ <string name="yesterday">hier</string>
+ <string name="today">aujourd’hui</string>
+ <string name="tomorrow">demain</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%Y-%m-%d</string>
+ <string name="numeric_date_format">yyyy-MM-dd</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %Y-%m-%d</string>
+ <string name="abbrev_month_day_year">%Y-%m-%d</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-fr-rCH/donottranslate-cldr.xml b/core/res/res/values-fr-rCH/donottranslate-cldr.xml
new file mode 100644
index 0000000..589c801
--- /dev/null
+++ b/core/res/res/values-fr-rCH/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">janvier</string>
+ <string name="month_long_standalone_february">février</string>
+ <string name="month_long_standalone_march">mars</string>
+ <string name="month_long_standalone_april">avril</string>
+ <string name="month_long_standalone_may">mai</string>
+ <string name="month_long_standalone_june">juin</string>
+ <string name="month_long_standalone_july">juillet</string>
+ <string name="month_long_standalone_august">août</string>
+ <string name="month_long_standalone_september">septembre</string>
+ <string name="month_long_standalone_october">octobre</string>
+ <string name="month_long_standalone_november">novembre</string>
+ <string name="month_long_standalone_december">décembre</string>
+
+ <string name="month_long_january">janvier</string>
+ <string name="month_long_february">février</string>
+ <string name="month_long_march">mars</string>
+ <string name="month_long_april">avril</string>
+ <string name="month_long_may">mai</string>
+ <string name="month_long_june">juin</string>
+ <string name="month_long_july">juillet</string>
+ <string name="month_long_august">août</string>
+ <string name="month_long_september">septembre</string>
+ <string name="month_long_october">octobre</string>
+ <string name="month_long_november">novembre</string>
+ <string name="month_long_december">décembre</string>
+
+ <string name="month_medium_january">janv.</string>
+ <string name="month_medium_february">févr.</string>
+ <string name="month_medium_march">mars</string>
+ <string name="month_medium_april">avr.</string>
+ <string name="month_medium_may">mai</string>
+ <string name="month_medium_june">juin</string>
+ <string name="month_medium_july">juil.</string>
+ <string name="month_medium_august">août</string>
+ <string name="month_medium_september">sept.</string>
+ <string name="month_medium_october">oct.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">déc.</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">dimanche</string>
+ <string name="day_of_week_long_monday">lundi</string>
+ <string name="day_of_week_long_tuesday">mardi</string>
+ <string name="day_of_week_long_wednesday">mercredi</string>
+ <string name="day_of_week_long_thursday">jeudi</string>
+ <string name="day_of_week_long_friday">vendredi</string>
+ <string name="day_of_week_long_saturday">samedi</string>
+
+ <string name="day_of_week_medium_sunday">dim.</string>
+ <string name="day_of_week_medium_monday">lun.</string>
+ <string name="day_of_week_medium_tuesday">mar.</string>
+ <string name="day_of_week_medium_wednesday">mer.</string>
+ <string name="day_of_week_medium_thursday">jeu.</string>
+ <string name="day_of_week_medium_friday">ven.</string>
+ <string name="day_of_week_medium_saturday">sam.</string>
+
+ <string name="day_of_week_short_sunday">dim.</string>
+ <string name="day_of_week_short_monday">lun.</string>
+ <string name="day_of_week_short_tuesday">mar.</string>
+ <string name="day_of_week_short_wednesday">mer.</string>
+ <string name="day_of_week_short_thursday">jeu.</string>
+ <string name="day_of_week_short_friday">ven.</string>
+ <string name="day_of_week_short_saturday">sam.</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">L</string>
+ <string name="day_of_week_shortest_tuesday">M</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">J</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">matin</string>
+ <string name="pm">soir</string>
+ <string name="yesterday">hier</string>
+ <string name="today">aujourd’hui</string>
+ <string name="tomorrow">demain</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e %b %Y</string>
+ <string name="abbrev_month_day_year">%-e %b %Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-fr-rFR/donottranslate-cldr.xml b/core/res/res/values-fr-rFR/donottranslate-cldr.xml
new file mode 100644
index 0000000..1213ed8
--- /dev/null
+++ b/core/res/res/values-fr-rFR/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">janvier</string>
+ <string name="month_long_standalone_february">février</string>
+ <string name="month_long_standalone_march">mars</string>
+ <string name="month_long_standalone_april">avril</string>
+ <string name="month_long_standalone_may">mai</string>
+ <string name="month_long_standalone_june">juin</string>
+ <string name="month_long_standalone_july">juillet</string>
+ <string name="month_long_standalone_august">août</string>
+ <string name="month_long_standalone_september">septembre</string>
+ <string name="month_long_standalone_october">octobre</string>
+ <string name="month_long_standalone_november">novembre</string>
+ <string name="month_long_standalone_december">décembre</string>
+
+ <string name="month_long_january">janvier</string>
+ <string name="month_long_february">février</string>
+ <string name="month_long_march">mars</string>
+ <string name="month_long_april">avril</string>
+ <string name="month_long_may">mai</string>
+ <string name="month_long_june">juin</string>
+ <string name="month_long_july">juillet</string>
+ <string name="month_long_august">août</string>
+ <string name="month_long_september">septembre</string>
+ <string name="month_long_october">octobre</string>
+ <string name="month_long_november">novembre</string>
+ <string name="month_long_december">décembre</string>
+
+ <string name="month_medium_january">janv.</string>
+ <string name="month_medium_february">févr.</string>
+ <string name="month_medium_march">mars</string>
+ <string name="month_medium_april">avr.</string>
+ <string name="month_medium_may">mai</string>
+ <string name="month_medium_june">juin</string>
+ <string name="month_medium_july">juil.</string>
+ <string name="month_medium_august">août</string>
+ <string name="month_medium_september">sept.</string>
+ <string name="month_medium_october">oct.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">déc.</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">dimanche</string>
+ <string name="day_of_week_long_monday">lundi</string>
+ <string name="day_of_week_long_tuesday">mardi</string>
+ <string name="day_of_week_long_wednesday">mercredi</string>
+ <string name="day_of_week_long_thursday">jeudi</string>
+ <string name="day_of_week_long_friday">vendredi</string>
+ <string name="day_of_week_long_saturday">samedi</string>
+
+ <string name="day_of_week_medium_sunday">dim.</string>
+ <string name="day_of_week_medium_monday">lun.</string>
+ <string name="day_of_week_medium_tuesday">mar.</string>
+ <string name="day_of_week_medium_wednesday">mer.</string>
+ <string name="day_of_week_medium_thursday">jeu.</string>
+ <string name="day_of_week_medium_friday">ven.</string>
+ <string name="day_of_week_medium_saturday">sam.</string>
+
+ <string name="day_of_week_short_sunday">dim.</string>
+ <string name="day_of_week_short_monday">lun.</string>
+ <string name="day_of_week_short_tuesday">mar.</string>
+ <string name="day_of_week_short_wednesday">mer.</string>
+ <string name="day_of_week_short_thursday">jeu.</string>
+ <string name="day_of_week_short_friday">ven.</string>
+ <string name="day_of_week_short_saturday">sam.</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">L</string>
+ <string name="day_of_week_shortest_tuesday">M</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">J</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">matin</string>
+ <string name="pm">soir</string>
+ <string name="yesterday">hier</string>
+ <string name="today">aujourd’hui</string>
+ <string name="tomorrow">demain</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e %b %Y</string>
+ <string name="abbrev_month_day_year">%-e %b %Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-fr/donottranslate-cldr.xml b/core/res/res/values-fr/donottranslate-cldr.xml
new file mode 100644
index 0000000..1213ed8
--- /dev/null
+++ b/core/res/res/values-fr/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">janvier</string>
+ <string name="month_long_standalone_february">février</string>
+ <string name="month_long_standalone_march">mars</string>
+ <string name="month_long_standalone_april">avril</string>
+ <string name="month_long_standalone_may">mai</string>
+ <string name="month_long_standalone_june">juin</string>
+ <string name="month_long_standalone_july">juillet</string>
+ <string name="month_long_standalone_august">août</string>
+ <string name="month_long_standalone_september">septembre</string>
+ <string name="month_long_standalone_october">octobre</string>
+ <string name="month_long_standalone_november">novembre</string>
+ <string name="month_long_standalone_december">décembre</string>
+
+ <string name="month_long_january">janvier</string>
+ <string name="month_long_february">février</string>
+ <string name="month_long_march">mars</string>
+ <string name="month_long_april">avril</string>
+ <string name="month_long_may">mai</string>
+ <string name="month_long_june">juin</string>
+ <string name="month_long_july">juillet</string>
+ <string name="month_long_august">août</string>
+ <string name="month_long_september">septembre</string>
+ <string name="month_long_october">octobre</string>
+ <string name="month_long_november">novembre</string>
+ <string name="month_long_december">décembre</string>
+
+ <string name="month_medium_january">janv.</string>
+ <string name="month_medium_february">févr.</string>
+ <string name="month_medium_march">mars</string>
+ <string name="month_medium_april">avr.</string>
+ <string name="month_medium_may">mai</string>
+ <string name="month_medium_june">juin</string>
+ <string name="month_medium_july">juil.</string>
+ <string name="month_medium_august">août</string>
+ <string name="month_medium_september">sept.</string>
+ <string name="month_medium_october">oct.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">déc.</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">dimanche</string>
+ <string name="day_of_week_long_monday">lundi</string>
+ <string name="day_of_week_long_tuesday">mardi</string>
+ <string name="day_of_week_long_wednesday">mercredi</string>
+ <string name="day_of_week_long_thursday">jeudi</string>
+ <string name="day_of_week_long_friday">vendredi</string>
+ <string name="day_of_week_long_saturday">samedi</string>
+
+ <string name="day_of_week_medium_sunday">dim.</string>
+ <string name="day_of_week_medium_monday">lun.</string>
+ <string name="day_of_week_medium_tuesday">mar.</string>
+ <string name="day_of_week_medium_wednesday">mer.</string>
+ <string name="day_of_week_medium_thursday">jeu.</string>
+ <string name="day_of_week_medium_friday">ven.</string>
+ <string name="day_of_week_medium_saturday">sam.</string>
+
+ <string name="day_of_week_short_sunday">dim.</string>
+ <string name="day_of_week_short_monday">lun.</string>
+ <string name="day_of_week_short_tuesday">mar.</string>
+ <string name="day_of_week_short_wednesday">mer.</string>
+ <string name="day_of_week_short_thursday">jeu.</string>
+ <string name="day_of_week_short_friday">ven.</string>
+ <string name="day_of_week_short_saturday">sam.</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">L</string>
+ <string name="day_of_week_shortest_tuesday">M</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">J</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">matin</string>
+ <string name="pm">soir</string>
+ <string name="yesterday">hier</string>
+ <string name="today">aujourd’hui</string>
+ <string name="tomorrow">demain</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e %b %Y</string>
+ <string name="abbrev_month_day_year">%-e %b %Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index c664d1a..736caf7 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -418,9 +418,6 @@
<string name="lockscreen_glogin_password_hint">"Mot de passe"</string>
<string name="lockscreen_glogin_submit_button">"Se connecter"</string>
<string name="lockscreen_glogin_invalid_input">"Nom d\'utilisateur ou mot de passe incorrect."</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button">"Effacer les notifications"</string>
@@ -452,9 +449,6 @@
<string name="menu_enter_shortcut_label">"entrée"</string>
<string name="menu_delete_shortcut_label">"supprimer"</string>
<string name="search_go">"Rechercher"</string>
- <string name="today">"Aujourd\'hui"</string>
- <string name="yesterday">"Hier"</string>
- <string name="tomorrow">"Demain"</string>
<string name="oneMonthDurationPast">"Il y a 1 mois"</string>
<string name="beforeOneMonthDurationPast">"Il y a plus d\'un mois"</string>
<plurals name="num_seconds_ago">
@@ -536,13 +530,6 @@
<string name="weeks">"semaines"</string>
<string name="year">"année"</string>
<string name="years">"années"</string>
- <string name="sunday">"dimanche"</string>
- <string name="monday">"lundi"</string>
- <string name="tuesday">"mardi"</string>
- <string name="wednesday">"mercredi"</string>
- <string name="thursday">"jeudi"</string>
- <string name="friday">"vendredi"</string>
- <string name="saturday">"samedi"</string>
<string name="every_weekday">"Tous les jours ouvrés (lun.- ven.)"</string>
<string name="daily">"Tous les jours"</string>
<string name="weekly">"Toutes les semaines le <xliff:g id="DAY">%s</xliff:g>"</string>
@@ -552,9 +539,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"Désolé, cette vidéo ne peut être lue sur cet appareil."</string>
<string name="VideoView_error_text_unknown">"Désolé, impossible de lire cette vidéo."</string>
<string name="VideoView_error_button">"OK"</string>
- <string name="am">"AM"</string>
- <string name="pm">"PM"</string>
- <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g> <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -566,23 +550,12 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"midi"</string>
<string name="Noon">"Midi"</string>
<string name="midnight">"minuit"</string>
<string name="Midnight">"Minuit"</string>
- <string name="month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string>
@@ -607,82 +580,8 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"dimanche"</string>
- <string name="day_of_week_long_monday">"lundi"</string>
- <string name="day_of_week_long_tuesday">"mardi"</string>
- <string name="day_of_week_long_wednesday">"mercredi"</string>
- <string name="day_of_week_long_thursday">"jeudi"</string>
- <string name="day_of_week_long_friday">"vendredi"</string>
- <string name="day_of_week_long_saturday">"samedi"</string>
- <string name="day_of_week_medium_sunday">"dim."</string>
- <string name="day_of_week_medium_monday">"Lun"</string>
- <string name="day_of_week_medium_tuesday">"Mar"</string>
- <string name="day_of_week_medium_wednesday">"Mer"</string>
- <string name="day_of_week_medium_thursday">"Jeu"</string>
- <string name="day_of_week_medium_friday">"Ven"</string>
- <string name="day_of_week_medium_saturday">"Sam"</string>
- <string name="day_of_week_short_sunday">"Dim"</string>
- <string name="day_of_week_short_monday">"Lun"</string>
- <string name="day_of_week_short_tuesday">"Mar"</string>
- <string name="day_of_week_short_wednesday">"Mer"</string>
- <string name="day_of_week_short_thursday">"Jeu"</string>
- <string name="day_of_week_short_friday">"Ven"</string>
- <string name="day_of_week_short_saturday">"Sam"</string>
- <string name="day_of_week_shorter_sunday">"Dim"</string>
- <string name="day_of_week_shorter_monday">"Lun"</string>
- <string name="day_of_week_shorter_tuesday">"Mar"</string>
- <string name="day_of_week_shorter_wednesday">"Mer"</string>
- <string name="day_of_week_shorter_thursday">"Jeu"</string>
- <string name="day_of_week_shorter_friday">"Ven"</string>
- <string name="day_of_week_shorter_saturday">"sam."</string>
- <string name="day_of_week_shortest_sunday">"Dim"</string>
- <string name="day_of_week_shortest_monday">"Lun"</string>
- <string name="day_of_week_shortest_tuesday">"Mar"</string>
- <string name="day_of_week_shortest_wednesday">"Mer"</string>
- <string name="day_of_week_shortest_thursday">"Jeu"</string>
- <string name="day_of_week_shortest_friday">"Ven"</string>
- <string name="day_of_week_shortest_saturday">"Sam"</string>
- <string name="month_long_january">"janvier"</string>
- <string name="month_long_february">"février"</string>
- <string name="month_long_march">"mars"</string>
- <string name="month_long_april">"avril"</string>
- <string name="month_long_may">"mai"</string>
- <string name="month_long_june">"juin"</string>
- <string name="month_long_july">"juillet"</string>
- <string name="month_long_august">"août"</string>
- <string name="month_long_september">"septembre"</string>
- <string name="month_long_october">"octobre"</string>
- <string name="month_long_november">"novembre"</string>
- <string name="month_long_december">"décembre"</string>
- <string name="month_medium_january">"janv."</string>
- <string name="month_medium_february">"févr."</string>
- <string name="month_medium_march">"mars"</string>
- <string name="month_medium_april">"avr."</string>
- <string name="month_medium_may">"mai"</string>
- <string name="month_medium_june">"juin"</string>
- <string name="month_medium_july">"juil."</string>
- <string name="month_medium_august">"août"</string>
- <string name="month_medium_september">"sept."</string>
- <string name="month_medium_october">"oct."</string>
- <string name="month_medium_november">"nov."</string>
- <string name="month_medium_december">"déc."</string>
- <string name="month_shortest_january">"jan."</string>
- <string name="month_shortest_february">"Ven"</string>
- <string name="month_shortest_march">"mars"</string>
- <string name="month_shortest_april">"avr."</string>
- <string name="month_shortest_may">"mai"</string>
- <string name="month_shortest_june">"juin"</string>
- <string name="month_shortest_july">"juil."</string>
- <string name="month_shortest_august">"août"</string>
- <string name="month_shortest_september">"sept."</string>
- <string name="month_shortest_october">"oct."</string>
- <string name="month_shortest_november">"nov."</string>
- <string name="month_shortest_december">"déc."</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"Tout sélectionner"</string>
diff --git a/core/res/res/values-he-rIL/donottranslate-cldr.xml b/core/res/res/values-he-rIL/donottranslate-cldr.xml
new file mode 100644
index 0000000..1b1aafa
--- /dev/null
+++ b/core/res/res/values-he-rIL/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">ינואר</string>
+ <string name="month_long_standalone_february">פברואר</string>
+ <string name="month_long_standalone_march">מרס</string>
+ <string name="month_long_standalone_april">אפריל</string>
+ <string name="month_long_standalone_may">מאי</string>
+ <string name="month_long_standalone_june">יוני</string>
+ <string name="month_long_standalone_july">יולי</string>
+ <string name="month_long_standalone_august">אוגוסט</string>
+ <string name="month_long_standalone_september">ספטמבר</string>
+ <string name="month_long_standalone_october">אוקטובר</string>
+ <string name="month_long_standalone_november">נובמבר</string>
+ <string name="month_long_standalone_december">דצמבר</string>
+
+ <string name="month_long_january">ינואר</string>
+ <string name="month_long_february">פברואר</string>
+ <string name="month_long_march">מרס</string>
+ <string name="month_long_april">אפריל</string>
+ <string name="month_long_may">מאי</string>
+ <string name="month_long_june">יוני</string>
+ <string name="month_long_july">יולי</string>
+ <string name="month_long_august">אוגוסט</string>
+ <string name="month_long_september">ספטמבר</string>
+ <string name="month_long_october">אוקטובר</string>
+ <string name="month_long_november">נובמבר</string>
+ <string name="month_long_december">דצמבר</string>
+
+ <string name="month_medium_january">ינו</string>
+ <string name="month_medium_february">פבר</string>
+ <string name="month_medium_march">מרס</string>
+ <string name="month_medium_april">אפר</string>
+ <string name="month_medium_may">מאי</string>
+ <string name="month_medium_june">יונ</string>
+ <string name="month_medium_july">יול</string>
+ <string name="month_medium_august">אוג</string>
+ <string name="month_medium_september">ספט</string>
+ <string name="month_medium_october">אוק</string>
+ <string name="month_medium_november">נוב</string>
+ <string name="month_medium_december">דצמ</string>
+
+ <string name="month_shortest_january">1</string>
+ <string name="month_shortest_february">2</string>
+ <string name="month_shortest_march">3</string>
+ <string name="month_shortest_april">4</string>
+ <string name="month_shortest_may">5</string>
+ <string name="month_shortest_june">6</string>
+ <string name="month_shortest_july">7</string>
+ <string name="month_shortest_august">8</string>
+ <string name="month_shortest_september">9</string>
+ <string name="month_shortest_october">10</string>
+ <string name="month_shortest_november">11</string>
+ <string name="month_shortest_december">12</string>
+
+ <string name="day_of_week_long_sunday">יום ראשון</string>
+ <string name="day_of_week_long_monday">יום שני</string>
+ <string name="day_of_week_long_tuesday">יום שלישי</string>
+ <string name="day_of_week_long_wednesday">יום רביעי</string>
+ <string name="day_of_week_long_thursday">יום חמישי</string>
+ <string name="day_of_week_long_friday">יום שישי</string>
+ <string name="day_of_week_long_saturday">יום שבת</string>
+
+ <string name="day_of_week_medium_sunday">יום א'</string>
+ <string name="day_of_week_medium_monday">יום ב'</string>
+ <string name="day_of_week_medium_tuesday">יום ג'</string>
+ <string name="day_of_week_medium_wednesday">יום ד'</string>
+ <string name="day_of_week_medium_thursday">יום ה'</string>
+ <string name="day_of_week_medium_friday">יום ו'</string>
+ <string name="day_of_week_medium_saturday">שבת</string>
+
+ <string name="day_of_week_short_sunday">יום א'</string>
+ <string name="day_of_week_short_monday">יום ב'</string>
+ <string name="day_of_week_short_tuesday">יום ג'</string>
+ <string name="day_of_week_short_wednesday">יום ד'</string>
+ <string name="day_of_week_short_thursday">יום ה'</string>
+ <string name="day_of_week_short_friday">יום ו'</string>
+ <string name="day_of_week_short_saturday">שבת</string>
+
+ <string name="day_of_week_shortest_sunday">א</string>
+ <string name="day_of_week_shortest_monday">ב</string>
+ <string name="day_of_week_shortest_tuesday">ג</string>
+ <string name="day_of_week_shortest_wednesday">ד</string>
+ <string name="day_of_week_shortest_thursday">ה</string>
+ <string name="day_of_week_shortest_friday">ו</string>
+ <string name="day_of_week_shortest_saturday">ש</string>
+
+ <string name="am">לפנה"צ</string>
+ <string name="pm">אחה"צ</string>
+ <string name="yesterday">אתמול</string>
+ <string name="today">היום</string>
+ <string name="tomorrow">מחר</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%-e ב%B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e.%-m.%Y</string>
+ <string name="abbrev_month_day_year">%-e.%-m.%Y</string>
+ <string name="month_day">%-e ב%B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y %b</string>
+</resources>
diff --git a/core/res/res/values-hi-rIN/donottranslate-cldr.xml b/core/res/res/values-hi-rIN/donottranslate-cldr.xml
new file mode 100644
index 0000000..8c6a34f7
--- /dev/null
+++ b/core/res/res/values-hi-rIN/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">जनवरी</string>
+ <string name="month_long_standalone_february">फरवरी</string>
+ <string name="month_long_standalone_march">मार्च</string>
+ <string name="month_long_standalone_april">अप्रैल</string>
+ <string name="month_long_standalone_may">मई</string>
+ <string name="month_long_standalone_june">जून</string>
+ <string name="month_long_standalone_july">जुलाई</string>
+ <string name="month_long_standalone_august">अगस्त</string>
+ <string name="month_long_standalone_september">सितम्बर</string>
+ <string name="month_long_standalone_october">अक्तूबर</string>
+ <string name="month_long_standalone_november">नवम्बर</string>
+ <string name="month_long_standalone_december">दिसम्बर</string>
+
+ <string name="month_long_january">जनवरी</string>
+ <string name="month_long_february">फरवरी</string>
+ <string name="month_long_march">मार्च</string>
+ <string name="month_long_april">अप्रैल</string>
+ <string name="month_long_may">मई</string>
+ <string name="month_long_june">जून</string>
+ <string name="month_long_july">जुलाई</string>
+ <string name="month_long_august">अगस्त</string>
+ <string name="month_long_september">सितम्बर</string>
+ <string name="month_long_october">अक्तूबर</string>
+ <string name="month_long_november">नवम्बर</string>
+ <string name="month_long_december">दिसम्बर</string>
+
+ <string name="month_medium_january">जनवरी</string>
+ <string name="month_medium_february">फरवरी</string>
+ <string name="month_medium_march">मार्च</string>
+ <string name="month_medium_april">अप्रैल</string>
+ <string name="month_medium_may">मई</string>
+ <string name="month_medium_june">जून</string>
+ <string name="month_medium_july">जुलाई</string>
+ <string name="month_medium_august">अगस्त</string>
+ <string name="month_medium_september">सितम्बर</string>
+ <string name="month_medium_october">अक्तूबर</string>
+ <string name="month_medium_november">नवम्बर</string>
+ <string name="month_medium_december">दिसम्बर</string>
+
+ <string name="month_shortest_january">ज</string>
+ <string name="month_shortest_february">फ़</string>
+ <string name="month_shortest_march">मा</string>
+ <string name="month_shortest_april">अ</string>
+ <string name="month_shortest_may">म</string>
+ <string name="month_shortest_june">जू</string>
+ <string name="month_shortest_july">जु</string>
+ <string name="month_shortest_august">अ</string>
+ <string name="month_shortest_september">सि</string>
+ <string name="month_shortest_october">अ</string>
+ <string name="month_shortest_november">न</string>
+ <string name="month_shortest_december">दि</string>
+
+ <string name="day_of_week_long_sunday">रविवार</string>
+ <string name="day_of_week_long_monday">सोमवार</string>
+ <string name="day_of_week_long_tuesday">मंगलवार</string>
+ <string name="day_of_week_long_wednesday">बुधवार</string>
+ <string name="day_of_week_long_thursday">गुरुवार</string>
+ <string name="day_of_week_long_friday">शुक्रवार</string>
+ <string name="day_of_week_long_saturday">शनिवार</string>
+
+ <string name="day_of_week_medium_sunday">रवि</string>
+ <string name="day_of_week_medium_monday">सोम</string>
+ <string name="day_of_week_medium_tuesday">मंगल</string>
+ <string name="day_of_week_medium_wednesday">बुध</string>
+ <string name="day_of_week_medium_thursday">गुरु</string>
+ <string name="day_of_week_medium_friday">शुक्र</string>
+ <string name="day_of_week_medium_saturday">शनि</string>
+
+ <string name="day_of_week_short_sunday">रवि</string>
+ <string name="day_of_week_short_monday">सोम</string>
+ <string name="day_of_week_short_tuesday">मंगल</string>
+ <string name="day_of_week_short_wednesday">बुध</string>
+ <string name="day_of_week_short_thursday">गुरु</string>
+ <string name="day_of_week_short_friday">शुक्र</string>
+ <string name="day_of_week_short_saturday">शनि</string>
+
+ <string name="day_of_week_shortest_sunday">र</string>
+ <string name="day_of_week_shortest_monday">सो</string>
+ <string name="day_of_week_shortest_tuesday">मं</string>
+ <string name="day_of_week_shortest_wednesday">बु</string>
+ <string name="day_of_week_shortest_thursday">गु</string>
+ <string name="day_of_week_shortest_friday">शु</string>
+ <string name="day_of_week_shortest_saturday">श</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">Yesterday</string>
+ <string name="today">Today</string>
+ <string name="tomorrow">Tomorrow</string>
+
+ <string name="hour_minute_ampm">%-l:%M %p</string>
+ <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
+ <string name="numeric_date">%-e-%-m-%Y</string>
+ <string name="numeric_date_format">d-M-yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%-l:%M:%S %p</string>
+ <string name="date_and_time">%-l:%M:%S %p %d-%m-%Y</string>
+ <string name="abbrev_month_day_year">%d-%m-%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y %B</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-hu-rHU/donottranslate-cldr.xml b/core/res/res/values-hu-rHU/donottranslate-cldr.xml
new file mode 100644
index 0000000..6085c6f
--- /dev/null
+++ b/core/res/res/values-hu-rHU/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">január</string>
+ <string name="month_long_standalone_february">február</string>
+ <string name="month_long_standalone_march">március</string>
+ <string name="month_long_standalone_april">április</string>
+ <string name="month_long_standalone_may">május</string>
+ <string name="month_long_standalone_june">június</string>
+ <string name="month_long_standalone_july">július</string>
+ <string name="month_long_standalone_august">augusztus</string>
+ <string name="month_long_standalone_september">szeptember</string>
+ <string name="month_long_standalone_october">október</string>
+ <string name="month_long_standalone_november">november</string>
+ <string name="month_long_standalone_december">december</string>
+
+ <string name="month_long_january">január</string>
+ <string name="month_long_february">február</string>
+ <string name="month_long_march">március</string>
+ <string name="month_long_april">április</string>
+ <string name="month_long_may">május</string>
+ <string name="month_long_june">június</string>
+ <string name="month_long_july">július</string>
+ <string name="month_long_august">augusztus</string>
+ <string name="month_long_september">szeptember</string>
+ <string name="month_long_october">október</string>
+ <string name="month_long_november">november</string>
+ <string name="month_long_december">december</string>
+
+ <string name="month_medium_january">jan.</string>
+ <string name="month_medium_february">febr.</string>
+ <string name="month_medium_march">márc.</string>
+ <string name="month_medium_april">ápr.</string>
+ <string name="month_medium_may">máj.</string>
+ <string name="month_medium_june">jún.</string>
+ <string name="month_medium_july">júl.</string>
+ <string name="month_medium_august">aug.</string>
+ <string name="month_medium_september">szept.</string>
+ <string name="month_medium_october">okt.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">dec.</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">Á</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">vasárnap</string>
+ <string name="day_of_week_long_monday">hétfő</string>
+ <string name="day_of_week_long_tuesday">kedd</string>
+ <string name="day_of_week_long_wednesday">szerda</string>
+ <string name="day_of_week_long_thursday">csütörtök</string>
+ <string name="day_of_week_long_friday">péntek</string>
+ <string name="day_of_week_long_saturday">szombat</string>
+
+ <string name="day_of_week_medium_sunday">V</string>
+ <string name="day_of_week_medium_monday">H</string>
+ <string name="day_of_week_medium_tuesday">K</string>
+ <string name="day_of_week_medium_wednesday">Sze</string>
+ <string name="day_of_week_medium_thursday">Cs</string>
+ <string name="day_of_week_medium_friday">P</string>
+ <string name="day_of_week_medium_saturday">Szo</string>
+
+ <string name="day_of_week_short_sunday">V</string>
+ <string name="day_of_week_short_monday">H</string>
+ <string name="day_of_week_short_tuesday">K</string>
+ <string name="day_of_week_short_wednesday">Sze</string>
+ <string name="day_of_week_short_thursday">Cs</string>
+ <string name="day_of_week_short_friday">P</string>
+ <string name="day_of_week_short_saturday">Szo</string>
+
+ <string name="day_of_week_shortest_sunday">V</string>
+ <string name="day_of_week_shortest_monday">H</string>
+ <string name="day_of_week_shortest_tuesday">K</string>
+ <string name="day_of_week_shortest_wednesday">S</string>
+ <string name="day_of_week_shortest_thursday">C</string>
+ <string name="day_of_week_shortest_friday">P</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">de.</string>
+ <string name="pm">du.</string>
+ <string name="yesterday">tegnap</string>
+ <string name="today">ma</string>
+ <string name="tomorrow">holnap</string>
+
+ <string name="hour_minute_ampm">%-k:%M</string>
+ <string name="hour_minute_cap_ampm">%-k:%M</string>
+ <string name="numeric_date">%Y.%m.%d.</string>
+ <string name="numeric_date_format">yyyy.MM.dd.</string>
+ <string name="month_day_year">%Y. %B %-e.</string>
+ <string name="time_of_day">%-k:%M:%S</string>
+ <string name="date_and_time">%-k:%M:%S %Y.%m.%d.</string>
+ <string name="abbrev_month_day_year">%Y.%m.%d.</string>
+ <string name="month_day">%B %-e.</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y %B</string>
+ <string name="abbrev_month_day">%b %-e.</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y %b</string>
+</resources>
diff --git a/core/res/res/values-id-rID/donottranslate-cldr.xml b/core/res/res/values-id-rID/donottranslate-cldr.xml
new file mode 100644
index 0000000..0a15fed
--- /dev/null
+++ b/core/res/res/values-id-rID/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Januari</string>
+ <string name="month_long_standalone_february">Februari</string>
+ <string name="month_long_standalone_march">Maret</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">Mei</string>
+ <string name="month_long_standalone_june">Juni</string>
+ <string name="month_long_standalone_july">Juli</string>
+ <string name="month_long_standalone_august">Agustus</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">Oktober</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">Desember</string>
+
+ <string name="month_long_january">Januari</string>
+ <string name="month_long_february">Februari</string>
+ <string name="month_long_march">Maret</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">Mei</string>
+ <string name="month_long_june">Juni</string>
+ <string name="month_long_july">Juli</string>
+ <string name="month_long_august">Agustus</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">Oktober</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">Desember</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mar</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">Mei</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Agu</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Okt</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Des</string>
+
+ <string name="month_shortest_january">1</string>
+ <string name="month_shortest_february">2</string>
+ <string name="month_shortest_march">3</string>
+ <string name="month_shortest_april">4</string>
+ <string name="month_shortest_may">5</string>
+ <string name="month_shortest_june">6</string>
+ <string name="month_shortest_july">7</string>
+ <string name="month_shortest_august">8</string>
+ <string name="month_shortest_september">9</string>
+ <string name="month_shortest_october">10</string>
+ <string name="month_shortest_november">11</string>
+ <string name="month_shortest_december">12</string>
+
+ <string name="day_of_week_long_sunday">Minggu</string>
+ <string name="day_of_week_long_monday">Senin</string>
+ <string name="day_of_week_long_tuesday">Selasa</string>
+ <string name="day_of_week_long_wednesday">Rabu</string>
+ <string name="day_of_week_long_thursday">Kamis</string>
+ <string name="day_of_week_long_friday">Jumat</string>
+ <string name="day_of_week_long_saturday">Sabtu</string>
+
+ <string name="day_of_week_medium_sunday">Min</string>
+ <string name="day_of_week_medium_monday">Sen</string>
+ <string name="day_of_week_medium_tuesday">Sel</string>
+ <string name="day_of_week_medium_wednesday">Rab</string>
+ <string name="day_of_week_medium_thursday">Kam</string>
+ <string name="day_of_week_medium_friday">Jum</string>
+ <string name="day_of_week_medium_saturday">Sab</string>
+
+ <string name="day_of_week_short_sunday">Min</string>
+ <string name="day_of_week_short_monday">Sen</string>
+ <string name="day_of_week_short_tuesday">Sel</string>
+ <string name="day_of_week_short_wednesday">Rab</string>
+ <string name="day_of_week_short_thursday">Kam</string>
+ <string name="day_of_week_short_friday">Jum</string>
+ <string name="day_of_week_short_saturday">Sab</string>
+
+ <string name="day_of_week_shortest_sunday">1</string>
+ <string name="day_of_week_shortest_monday">2</string>
+ <string name="day_of_week_shortest_tuesday">3</string>
+ <string name="day_of_week_shortest_wednesday">4</string>
+ <string name="day_of_week_shortest_thursday">5</string>
+ <string name="day_of_week_shortest_friday">6</string>
+ <string name="day_of_week_shortest_saturday">7</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">Yesterday</string>
+ <string name="today">Today</string>
+ <string name="tomorrow">Tomorrow</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e %b %Y</string>
+ <string name="abbrev_month_day_year">%-e %b %Y</string>
+ <string name="month_day">%B %-e</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y %B</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y %b</string>
+</resources>
diff --git a/core/res/res/values-it-rCH/donottranslate-cldr.xml b/core/res/res/values-it-rCH/donottranslate-cldr.xml
new file mode 100644
index 0000000..4129d6c
--- /dev/null
+++ b/core/res/res/values-it-rCH/donottranslate-cldr.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Gennaio</string>
+ <string name="month_long_standalone_february">Febbraio</string>
+ <string name="month_long_standalone_march">Marzo</string>
+ <string name="month_long_standalone_april">Aprile</string>
+ <string name="month_long_standalone_may">Maggio</string>
+ <string name="month_long_standalone_june">Giugno</string>
+ <string name="month_long_standalone_july">Luglio</string>
+
+ <string name="month_long_january">gennaio</string>
+ <string name="month_long_february">febbraio</string>
+ <string name="month_long_march">marzo</string>
+ <string name="month_long_april">aprile</string>
+ <string name="month_long_may">maggio</string>
+ <string name="month_long_june">giugno</string>
+ <string name="month_long_july">Luglio</string>
+ <string name="month_long_august">agosto</string>
+ <string name="month_long_september">settembre</string>
+ <string name="month_long_october">ottobre</string>
+ <string name="month_long_november">novembre</string>
+ <string name="month_long_december">dicembre</string>
+
+ <string name="month_medium_january">gen</string>
+ <string name="month_medium_february">feb</string>
+ <string name="month_medium_march">mar</string>
+ <string name="month_medium_april">apr</string>
+ <string name="month_medium_may">mag</string>
+ <string name="month_medium_june">giu</string>
+ <string name="month_medium_july">lug</string>
+ <string name="month_medium_august">ago</string>
+ <string name="month_medium_september">set</string>
+ <string name="month_medium_october">ott</string>
+ <string name="month_medium_november">nov</string>
+ <string name="month_medium_december">dic</string>
+
+ <string name="month_shortest_january">G</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">G</string>
+ <string name="month_shortest_july">L</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">domenica</string>
+ <string name="day_of_week_long_monday">lunedì</string>
+ <string name="day_of_week_long_tuesday">martedì</string>
+ <string name="day_of_week_long_wednesday">mercoledì</string>
+ <string name="day_of_week_long_thursday">giovedì</string>
+ <string name="day_of_week_long_friday">venerdì</string>
+ <string name="day_of_week_long_saturday">sabato</string>
+
+ <string name="day_of_week_medium_sunday">dom</string>
+ <string name="day_of_week_medium_monday">lun</string>
+ <string name="day_of_week_medium_tuesday">mar</string>
+ <string name="day_of_week_medium_wednesday">mer</string>
+ <string name="day_of_week_medium_thursday">gio</string>
+ <string name="day_of_week_medium_friday">ven</string>
+ <string name="day_of_week_medium_saturday">sab</string>
+
+ <string name="day_of_week_short_sunday">dom</string>
+ <string name="day_of_week_short_monday">lun</string>
+ <string name="day_of_week_short_tuesday">mar</string>
+ <string name="day_of_week_short_wednesday">mer</string>
+ <string name="day_of_week_short_thursday">gio</string>
+ <string name="day_of_week_short_friday">ven</string>
+ <string name="day_of_week_short_saturday">sab</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">L</string>
+ <string name="day_of_week_shortest_tuesday">M</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">G</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">m.</string>
+ <string name="pm">p.</string>
+ <string name="yesterday">ieri</string>
+ <string name="today">oggi</string>
+ <string name="tomorrow">domani</string>
+
+ <string name="hour_minute_ampm">%H.%M</string>
+ <string name="hour_minute_cap_ampm">%H.%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H.%M.%S</string>
+ <string name="date_and_time">%H.%M.%S %-e-%b-%Y</string>
+ <string name="abbrev_month_day_year">%-e-%b-%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-it-rIT/donottranslate-cldr.xml b/core/res/res/values-it-rIT/donottranslate-cldr.xml
new file mode 100644
index 0000000..e3dd747
--- /dev/null
+++ b/core/res/res/values-it-rIT/donottranslate-cldr.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Gennaio</string>
+ <string name="month_long_standalone_february">Febbraio</string>
+ <string name="month_long_standalone_march">Marzo</string>
+ <string name="month_long_standalone_april">Aprile</string>
+ <string name="month_long_standalone_may">Maggio</string>
+ <string name="month_long_standalone_june">Giugno</string>
+ <string name="month_long_standalone_july">Luglio</string>
+
+ <string name="month_long_january">gennaio</string>
+ <string name="month_long_february">febbraio</string>
+ <string name="month_long_march">marzo</string>
+ <string name="month_long_april">aprile</string>
+ <string name="month_long_may">maggio</string>
+ <string name="month_long_june">giugno</string>
+ <string name="month_long_july">Luglio</string>
+ <string name="month_long_august">agosto</string>
+ <string name="month_long_september">settembre</string>
+ <string name="month_long_october">ottobre</string>
+ <string name="month_long_november">novembre</string>
+ <string name="month_long_december">dicembre</string>
+
+ <string name="month_medium_january">gen</string>
+ <string name="month_medium_february">feb</string>
+ <string name="month_medium_march">mar</string>
+ <string name="month_medium_april">apr</string>
+ <string name="month_medium_may">mag</string>
+ <string name="month_medium_june">giu</string>
+ <string name="month_medium_july">lug</string>
+ <string name="month_medium_august">ago</string>
+ <string name="month_medium_september">set</string>
+ <string name="month_medium_october">ott</string>
+ <string name="month_medium_november">nov</string>
+ <string name="month_medium_december">dic</string>
+
+ <string name="month_shortest_january">G</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">G</string>
+ <string name="month_shortest_july">L</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">domenica</string>
+ <string name="day_of_week_long_monday">lunedì</string>
+ <string name="day_of_week_long_tuesday">martedì</string>
+ <string name="day_of_week_long_wednesday">mercoledì</string>
+ <string name="day_of_week_long_thursday">giovedì</string>
+ <string name="day_of_week_long_friday">venerdì</string>
+ <string name="day_of_week_long_saturday">sabato</string>
+
+ <string name="day_of_week_medium_sunday">dom</string>
+ <string name="day_of_week_medium_monday">lun</string>
+ <string name="day_of_week_medium_tuesday">mar</string>
+ <string name="day_of_week_medium_wednesday">mer</string>
+ <string name="day_of_week_medium_thursday">gio</string>
+ <string name="day_of_week_medium_friday">ven</string>
+ <string name="day_of_week_medium_saturday">sab</string>
+
+ <string name="day_of_week_short_sunday">dom</string>
+ <string name="day_of_week_short_monday">lun</string>
+ <string name="day_of_week_short_tuesday">mar</string>
+ <string name="day_of_week_short_wednesday">mer</string>
+ <string name="day_of_week_short_thursday">gio</string>
+ <string name="day_of_week_short_friday">ven</string>
+ <string name="day_of_week_short_saturday">sab</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">L</string>
+ <string name="day_of_week_shortest_tuesday">M</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">G</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">m.</string>
+ <string name="pm">p.</string>
+ <string name="yesterday">ieri</string>
+ <string name="today">oggi</string>
+ <string name="tomorrow">domani</string>
+
+ <string name="hour_minute_ampm">%H.%M</string>
+ <string name="hour_minute_cap_ampm">%H.%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%d %B %Y</string>
+ <string name="time_of_day">%H.%M.%S</string>
+ <string name="date_and_time">%H.%M.%S %d/%b/%Y</string>
+ <string name="abbrev_month_day_year">%d/%b/%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-it/donottranslate-cldr.xml b/core/res/res/values-it/donottranslate-cldr.xml
new file mode 100644
index 0000000..e3dd747
--- /dev/null
+++ b/core/res/res/values-it/donottranslate-cldr.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Gennaio</string>
+ <string name="month_long_standalone_february">Febbraio</string>
+ <string name="month_long_standalone_march">Marzo</string>
+ <string name="month_long_standalone_april">Aprile</string>
+ <string name="month_long_standalone_may">Maggio</string>
+ <string name="month_long_standalone_june">Giugno</string>
+ <string name="month_long_standalone_july">Luglio</string>
+
+ <string name="month_long_january">gennaio</string>
+ <string name="month_long_february">febbraio</string>
+ <string name="month_long_march">marzo</string>
+ <string name="month_long_april">aprile</string>
+ <string name="month_long_may">maggio</string>
+ <string name="month_long_june">giugno</string>
+ <string name="month_long_july">Luglio</string>
+ <string name="month_long_august">agosto</string>
+ <string name="month_long_september">settembre</string>
+ <string name="month_long_october">ottobre</string>
+ <string name="month_long_november">novembre</string>
+ <string name="month_long_december">dicembre</string>
+
+ <string name="month_medium_january">gen</string>
+ <string name="month_medium_february">feb</string>
+ <string name="month_medium_march">mar</string>
+ <string name="month_medium_april">apr</string>
+ <string name="month_medium_may">mag</string>
+ <string name="month_medium_june">giu</string>
+ <string name="month_medium_july">lug</string>
+ <string name="month_medium_august">ago</string>
+ <string name="month_medium_september">set</string>
+ <string name="month_medium_october">ott</string>
+ <string name="month_medium_november">nov</string>
+ <string name="month_medium_december">dic</string>
+
+ <string name="month_shortest_january">G</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">G</string>
+ <string name="month_shortest_july">L</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">domenica</string>
+ <string name="day_of_week_long_monday">lunedì</string>
+ <string name="day_of_week_long_tuesday">martedì</string>
+ <string name="day_of_week_long_wednesday">mercoledì</string>
+ <string name="day_of_week_long_thursday">giovedì</string>
+ <string name="day_of_week_long_friday">venerdì</string>
+ <string name="day_of_week_long_saturday">sabato</string>
+
+ <string name="day_of_week_medium_sunday">dom</string>
+ <string name="day_of_week_medium_monday">lun</string>
+ <string name="day_of_week_medium_tuesday">mar</string>
+ <string name="day_of_week_medium_wednesday">mer</string>
+ <string name="day_of_week_medium_thursday">gio</string>
+ <string name="day_of_week_medium_friday">ven</string>
+ <string name="day_of_week_medium_saturday">sab</string>
+
+ <string name="day_of_week_short_sunday">dom</string>
+ <string name="day_of_week_short_monday">lun</string>
+ <string name="day_of_week_short_tuesday">mar</string>
+ <string name="day_of_week_short_wednesday">mer</string>
+ <string name="day_of_week_short_thursday">gio</string>
+ <string name="day_of_week_short_friday">ven</string>
+ <string name="day_of_week_short_saturday">sab</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">L</string>
+ <string name="day_of_week_shortest_tuesday">M</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">G</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">m.</string>
+ <string name="pm">p.</string>
+ <string name="yesterday">ieri</string>
+ <string name="today">oggi</string>
+ <string name="tomorrow">domani</string>
+
+ <string name="hour_minute_ampm">%H.%M</string>
+ <string name="hour_minute_cap_ampm">%H.%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%d %B %Y</string>
+ <string name="time_of_day">%H.%M.%S</string>
+ <string name="date_and_time">%H.%M.%S %d/%b/%Y</string>
+ <string name="abbrev_month_day_year">%d/%b/%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index f80a4f4..cb040f2 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -418,9 +418,6 @@
<string name="lockscreen_glogin_password_hint">"Password"</string>
<string name="lockscreen_glogin_submit_button">"Accedi"</string>
<string name="lockscreen_glogin_invalid_input">"Password o nome utente non valido."</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button">"Cancella notifiche"</string>
@@ -452,9 +449,6 @@
<string name="menu_enter_shortcut_label">"Invio"</string>
<string name="menu_delete_shortcut_label">"Canc"</string>
<string name="search_go">"Cerca"</string>
- <string name="today">"Oggi"</string>
- <string name="yesterday">"Ieri"</string>
- <string name="tomorrow">"Domani"</string>
<string name="oneMonthDurationPast">"1 mese fa"</string>
<string name="beforeOneMonthDurationPast">"Oltre 1 mese fa"</string>
<plurals name="num_seconds_ago">
@@ -536,13 +530,6 @@
<string name="weeks">"settimane"</string>
<string name="year">"anno"</string>
<string name="years">"anni"</string>
- <string name="sunday">"Domenica"</string>
- <string name="monday">"Lunedì"</string>
- <string name="tuesday">"Martedì"</string>
- <string name="wednesday">"Mercoledì"</string>
- <string name="thursday">"Giovedì"</string>
- <string name="friday">"Venerdì"</string>
- <string name="saturday">"Sabato"</string>
<string name="every_weekday">"Ogni giorno feriale (lun-ven)"</string>
<string name="daily">"Quotidianamente"</string>
<string name="weekly">"Ogni settimana il <xliff:g id="DAY">%s</xliff:g>"</string>
@@ -552,9 +539,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"Spiacenti, questo video non è valido per lo streaming su questo dispositivo."</string>
<string name="VideoView_error_text_unknown">"Spiacenti. Impossibile riprodurre il video."</string>
<string name="VideoView_error_button">"OK"</string>
- <string name="am">"AM"</string>
- <string name="pm">"PM"</string>
- <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -566,23 +550,12 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"mezzogiorno"</string>
<string name="Noon">"Mezzogiorno"</string>
<string name="midnight">"mezzanotte"</string>
<string name="Midnight">"Mezzanotte"</string>
- <string name="month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string>
@@ -607,82 +580,8 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g>"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"Domenica"</string>
- <string name="day_of_week_long_monday">"Lunedì"</string>
- <string name="day_of_week_long_tuesday">"Martedì"</string>
- <string name="day_of_week_long_wednesday">"Mercoledì"</string>
- <string name="day_of_week_long_thursday">"Giovedì"</string>
- <string name="day_of_week_long_friday">"Venerdì"</string>
- <string name="day_of_week_long_saturday">"Sabato"</string>
- <string name="day_of_week_medium_sunday">"Dom"</string>
- <string name="day_of_week_medium_monday">"Lun"</string>
- <string name="day_of_week_medium_tuesday">"Mar"</string>
- <string name="day_of_week_medium_wednesday">"Mer"</string>
- <string name="day_of_week_medium_thursday">"Gio"</string>
- <string name="day_of_week_medium_friday">"Ven"</string>
- <string name="day_of_week_medium_saturday">"Sab"</string>
- <string name="day_of_week_short_sunday">"Do"</string>
- <string name="day_of_week_short_monday">"Lu"</string>
- <string name="day_of_week_short_tuesday">"Ma"</string>
- <string name="day_of_week_short_wednesday">"Me"</string>
- <string name="day_of_week_short_thursday">"Gi"</string>
- <string name="day_of_week_short_friday">"Ve"</string>
- <string name="day_of_week_short_saturday">"Sa"</string>
- <string name="day_of_week_shorter_sunday">"Do"</string>
- <string name="day_of_week_shorter_monday">"Lu"</string>
- <string name="day_of_week_shorter_tuesday">"Ma"</string>
- <string name="day_of_week_shorter_wednesday">"Me"</string>
- <string name="day_of_week_shorter_thursday">"Gi"</string>
- <string name="day_of_week_shorter_friday">"V"</string>
- <string name="day_of_week_shorter_saturday">"Sa"</string>
- <string name="day_of_week_shortest_sunday">"D"</string>
- <string name="day_of_week_shortest_monday">"Lun"</string>
- <string name="day_of_week_shortest_tuesday">"M"</string>
- <string name="day_of_week_shortest_wednesday">"Me"</string>
- <string name="day_of_week_shortest_thursday">"G"</string>
- <string name="day_of_week_shortest_friday">"V"</string>
- <string name="day_of_week_shortest_saturday">"Sa"</string>
- <string name="month_long_january">"Gennaio"</string>
- <string name="month_long_february">"Febbraio"</string>
- <string name="month_long_march">"Marzo"</string>
- <string name="month_long_april">"Aprile"</string>
- <string name="month_long_may">"Maggio"</string>
- <string name="month_long_june">"Giugno"</string>
- <string name="month_long_july">"Luglio"</string>
- <string name="month_long_august">"Agosto"</string>
- <string name="month_long_september">"Settembre"</string>
- <string name="month_long_october">"Ottobre"</string>
- <string name="month_long_november">"Novembre"</string>
- <string name="month_long_december">"Dicembre"</string>
- <string name="month_medium_january">"Gen"</string>
- <string name="month_medium_february">"Feb"</string>
- <string name="month_medium_march">"Mar"</string>
- <string name="month_medium_april">"Apr"</string>
- <string name="month_medium_may">"Mag"</string>
- <string name="month_medium_june">"Giu"</string>
- <string name="month_medium_july">"Lug"</string>
- <string name="month_medium_august">"Ago"</string>
- <string name="month_medium_september">"Set"</string>
- <string name="month_medium_october">"Ott"</string>
- <string name="month_medium_november">"Nov"</string>
- <string name="month_medium_december">"Dic"</string>
- <string name="month_shortest_january">"G"</string>
- <string name="month_shortest_february">"F"</string>
- <string name="month_shortest_march">"M"</string>
- <string name="month_shortest_april">"Ap"</string>
- <string name="month_shortest_may">"Mag"</string>
- <string name="month_shortest_june">"Gi"</string>
- <string name="month_shortest_july">"Lug"</string>
- <string name="month_shortest_august">"Ago"</string>
- <string name="month_shortest_september">"Set"</string>
- <string name="month_shortest_october">"O"</string>
- <string name="month_shortest_november">"N"</string>
- <string name="month_shortest_december">"Di"</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"Seleziona tutto"</string>
diff --git a/core/res/res/values-ja-rJP/donottranslate-cldr.xml b/core/res/res/values-ja-rJP/donottranslate-cldr.xml
new file mode 100644
index 0000000..b8e94fc
--- /dev/null
+++ b/core/res/res/values-ja-rJP/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">1月</string>
+ <string name="month_long_standalone_february">2月</string>
+ <string name="month_long_standalone_march">3月</string>
+ <string name="month_long_standalone_april">4月</string>
+ <string name="month_long_standalone_may">5月</string>
+ <string name="month_long_standalone_june">6月</string>
+ <string name="month_long_standalone_july">7月</string>
+ <string name="month_long_standalone_august">8月</string>
+ <string name="month_long_standalone_september">9月</string>
+ <string name="month_long_standalone_october">10月</string>
+ <string name="month_long_standalone_november">11月</string>
+ <string name="month_long_standalone_december">12月</string>
+
+ <string name="month_long_january">1月</string>
+ <string name="month_long_february">2月</string>
+ <string name="month_long_march">3月</string>
+ <string name="month_long_april">4月</string>
+ <string name="month_long_may">5月</string>
+ <string name="month_long_june">6月</string>
+ <string name="month_long_july">7月</string>
+ <string name="month_long_august">8月</string>
+ <string name="month_long_september">9月</string>
+ <string name="month_long_october">10月</string>
+ <string name="month_long_november">11月</string>
+ <string name="month_long_december">12月</string>
+
+ <string name="month_medium_january">1月</string>
+ <string name="month_medium_february">2月</string>
+ <string name="month_medium_march">3月</string>
+ <string name="month_medium_april">4月</string>
+ <string name="month_medium_may">5月</string>
+ <string name="month_medium_june">6月</string>
+ <string name="month_medium_july">7月</string>
+ <string name="month_medium_august">8月</string>
+ <string name="month_medium_september">9月</string>
+ <string name="month_medium_october">10月</string>
+ <string name="month_medium_november">11月</string>
+ <string name="month_medium_december">12月</string>
+
+ <string name="month_shortest_january">1</string>
+ <string name="month_shortest_february">2</string>
+ <string name="month_shortest_march">3</string>
+ <string name="month_shortest_april">4</string>
+ <string name="month_shortest_may">5</string>
+ <string name="month_shortest_june">6</string>
+ <string name="month_shortest_july">7</string>
+ <string name="month_shortest_august">8</string>
+ <string name="month_shortest_september">9</string>
+ <string name="month_shortest_october">10</string>
+ <string name="month_shortest_november">11</string>
+ <string name="month_shortest_december">12</string>
+
+ <string name="day_of_week_long_sunday">日曜日</string>
+ <string name="day_of_week_long_monday">月曜日</string>
+ <string name="day_of_week_long_tuesday">火曜日</string>
+ <string name="day_of_week_long_wednesday">水曜日</string>
+ <string name="day_of_week_long_thursday">木曜日</string>
+ <string name="day_of_week_long_friday">金曜日</string>
+ <string name="day_of_week_long_saturday">土曜日</string>
+
+ <string name="day_of_week_medium_sunday">日</string>
+ <string name="day_of_week_medium_monday">月</string>
+ <string name="day_of_week_medium_tuesday">火</string>
+ <string name="day_of_week_medium_wednesday">水</string>
+ <string name="day_of_week_medium_thursday">木</string>
+ <string name="day_of_week_medium_friday">金</string>
+ <string name="day_of_week_medium_saturday">土</string>
+
+ <string name="day_of_week_short_sunday">日</string>
+ <string name="day_of_week_short_monday">月</string>
+ <string name="day_of_week_short_tuesday">火</string>
+ <string name="day_of_week_short_wednesday">水</string>
+ <string name="day_of_week_short_thursday">木</string>
+ <string name="day_of_week_short_friday">金</string>
+ <string name="day_of_week_short_saturday">土</string>
+
+ <string name="day_of_week_shortest_sunday">日</string>
+ <string name="day_of_week_shortest_monday">月</string>
+ <string name="day_of_week_shortest_tuesday">火</string>
+ <string name="day_of_week_shortest_wednesday">水</string>
+ <string name="day_of_week_shortest_thursday">木</string>
+ <string name="day_of_week_shortest_friday">金</string>
+ <string name="day_of_week_shortest_saturday">土</string>
+
+ <string name="am">午前</string>
+ <string name="pm">午後</string>
+ <string name="yesterday">昨日</string>
+ <string name="today">今日</string>
+ <string name="tomorrow">明日</string>
+
+ <string name="hour_minute_ampm">%-k:%M</string>
+ <string name="hour_minute_cap_ampm">%-k:%M</string>
+ <string name="numeric_date">%Y/%m/%d</string>
+ <string name="numeric_date_format">yyyy/MM/dd</string>
+ <string name="month_day_year">%Y年%-m月%-e日</string>
+ <string name="time_of_day">%-k:%M:%S</string>
+ <string name="date_and_time">%-k:%M:%S %Y/%m/%d</string>
+ <string name="abbrev_month_day_year">%Y/%m/%d</string>
+ <string name="month_day">%-m月%-e日</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y年%-m月</string>
+ <string name="abbrev_month_day">%-m月%-e日</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y年%-m月</string>
+</resources>
diff --git a/core/res/res/values-ja/donottranslate-cldr.xml b/core/res/res/values-ja/donottranslate-cldr.xml
new file mode 100644
index 0000000..b8e94fc
--- /dev/null
+++ b/core/res/res/values-ja/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">1月</string>
+ <string name="month_long_standalone_february">2月</string>
+ <string name="month_long_standalone_march">3月</string>
+ <string name="month_long_standalone_april">4月</string>
+ <string name="month_long_standalone_may">5月</string>
+ <string name="month_long_standalone_june">6月</string>
+ <string name="month_long_standalone_july">7月</string>
+ <string name="month_long_standalone_august">8月</string>
+ <string name="month_long_standalone_september">9月</string>
+ <string name="month_long_standalone_october">10月</string>
+ <string name="month_long_standalone_november">11月</string>
+ <string name="month_long_standalone_december">12月</string>
+
+ <string name="month_long_january">1月</string>
+ <string name="month_long_february">2月</string>
+ <string name="month_long_march">3月</string>
+ <string name="month_long_april">4月</string>
+ <string name="month_long_may">5月</string>
+ <string name="month_long_june">6月</string>
+ <string name="month_long_july">7月</string>
+ <string name="month_long_august">8月</string>
+ <string name="month_long_september">9月</string>
+ <string name="month_long_october">10月</string>
+ <string name="month_long_november">11月</string>
+ <string name="month_long_december">12月</string>
+
+ <string name="month_medium_january">1月</string>
+ <string name="month_medium_february">2月</string>
+ <string name="month_medium_march">3月</string>
+ <string name="month_medium_april">4月</string>
+ <string name="month_medium_may">5月</string>
+ <string name="month_medium_june">6月</string>
+ <string name="month_medium_july">7月</string>
+ <string name="month_medium_august">8月</string>
+ <string name="month_medium_september">9月</string>
+ <string name="month_medium_october">10月</string>
+ <string name="month_medium_november">11月</string>
+ <string name="month_medium_december">12月</string>
+
+ <string name="month_shortest_january">1</string>
+ <string name="month_shortest_february">2</string>
+ <string name="month_shortest_march">3</string>
+ <string name="month_shortest_april">4</string>
+ <string name="month_shortest_may">5</string>
+ <string name="month_shortest_june">6</string>
+ <string name="month_shortest_july">7</string>
+ <string name="month_shortest_august">8</string>
+ <string name="month_shortest_september">9</string>
+ <string name="month_shortest_october">10</string>
+ <string name="month_shortest_november">11</string>
+ <string name="month_shortest_december">12</string>
+
+ <string name="day_of_week_long_sunday">日曜日</string>
+ <string name="day_of_week_long_monday">月曜日</string>
+ <string name="day_of_week_long_tuesday">火曜日</string>
+ <string name="day_of_week_long_wednesday">水曜日</string>
+ <string name="day_of_week_long_thursday">木曜日</string>
+ <string name="day_of_week_long_friday">金曜日</string>
+ <string name="day_of_week_long_saturday">土曜日</string>
+
+ <string name="day_of_week_medium_sunday">日</string>
+ <string name="day_of_week_medium_monday">月</string>
+ <string name="day_of_week_medium_tuesday">火</string>
+ <string name="day_of_week_medium_wednesday">水</string>
+ <string name="day_of_week_medium_thursday">木</string>
+ <string name="day_of_week_medium_friday">金</string>
+ <string name="day_of_week_medium_saturday">土</string>
+
+ <string name="day_of_week_short_sunday">日</string>
+ <string name="day_of_week_short_monday">月</string>
+ <string name="day_of_week_short_tuesday">火</string>
+ <string name="day_of_week_short_wednesday">水</string>
+ <string name="day_of_week_short_thursday">木</string>
+ <string name="day_of_week_short_friday">金</string>
+ <string name="day_of_week_short_saturday">土</string>
+
+ <string name="day_of_week_shortest_sunday">日</string>
+ <string name="day_of_week_shortest_monday">月</string>
+ <string name="day_of_week_shortest_tuesday">火</string>
+ <string name="day_of_week_shortest_wednesday">水</string>
+ <string name="day_of_week_shortest_thursday">木</string>
+ <string name="day_of_week_shortest_friday">金</string>
+ <string name="day_of_week_shortest_saturday">土</string>
+
+ <string name="am">午前</string>
+ <string name="pm">午後</string>
+ <string name="yesterday">昨日</string>
+ <string name="today">今日</string>
+ <string name="tomorrow">明日</string>
+
+ <string name="hour_minute_ampm">%-k:%M</string>
+ <string name="hour_minute_cap_ampm">%-k:%M</string>
+ <string name="numeric_date">%Y/%m/%d</string>
+ <string name="numeric_date_format">yyyy/MM/dd</string>
+ <string name="month_day_year">%Y年%-m月%-e日</string>
+ <string name="time_of_day">%-k:%M:%S</string>
+ <string name="date_and_time">%-k:%M:%S %Y/%m/%d</string>
+ <string name="abbrev_month_day_year">%Y/%m/%d</string>
+ <string name="month_day">%-m月%-e日</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y年%-m月</string>
+ <string name="abbrev_month_day">%-m月%-e日</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y年%-m月</string>
+</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 8da040e..877ecbd 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -418,9 +418,6 @@
<string name="lockscreen_glogin_password_hint">"パスワード"</string>
<string name="lockscreen_glogin_submit_button">"ログイン"</string>
<string name="lockscreen_glogin_invalid_input">"ユーザー名またはパスワードが正しくありません。"</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button">"通知を消去"</string>
@@ -452,9 +449,6 @@
<string name="menu_enter_shortcut_label">"Enter"</string>
<string name="menu_delete_shortcut_label">"Del"</string>
<string name="search_go">"検索"</string>
- <string name="today">"今日"</string>
- <string name="yesterday">"昨日"</string>
- <string name="tomorrow">"明日"</string>
<string name="oneMonthDurationPast">"1か月前"</string>
<string name="beforeOneMonthDurationPast">"1か月前"</string>
<plurals name="num_seconds_ago">
@@ -536,13 +530,6 @@
<string name="weeks">"週間"</string>
<string name="year">"年"</string>
<string name="years">"年"</string>
- <string name="sunday">"日曜日"</string>
- <string name="monday">"月曜日"</string>
- <string name="tuesday">"火曜日"</string>
- <string name="wednesday">"水曜日"</string>
- <string name="thursday">"木曜日"</string>
- <string name="friday">"金曜日"</string>
- <string name="saturday">"土曜日"</string>
<string name="every_weekday">"平日(月~金)"</string>
<string name="daily">"毎日"</string>
<string name="weekly">"毎週<xliff:g id="DAY">%s</xliff:g>"</string>
@@ -552,9 +539,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"この動画はご使用の端末でストリーミングできません。"</string>
<string name="VideoView_error_text_unknown">"この動画は再生できません。"</string>
<string name="VideoView_error_button">"OK"</string>
- <string name="am">"AM"</string>
- <string name="pm">"PM"</string>
- <string name="numeric_date">"<xliff:g id="YEAR">%Y</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g><xliff:g id="TIME1">%3$s</xliff:g>~<xliff:g id="DATE2">%5$s</xliff:g><xliff:g id="WEEKDAY2">%4$s</xliff:g><xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="DATE1">%2$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g>~<xliff:g id="DATE2">%5$s</xliff:g><xliff:g id="WEEKDAY2">%4$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g> <xliff:g id="TIME1">%3$s</xliff:g>~<xliff:g id="DATE2">%5$s</xliff:g> <xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -566,23 +550,12 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="WEEKDAY">%2$s</xliff:g>、<xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g><xliff:g id="DAY">d</xliff:g>'日 '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>'年'<xliff:g id="MONTH">MMMM</xliff:g>'月'<xliff:g id="DAY">d</xliff:g>'日'"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>'/'<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>'年'"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'/'<xliff:g id="MONTH">MMM</xliff:g>'/'<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"正午"</string>
<string name="Noon">"正午"</string>
<string name="midnight">"午前0時"</string>
<string name="Midnight">"午前0時"</string>
- <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g><xliff:g id="DAY">%-d</xliff:g>日"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="YEAR">%Y</xliff:g>年<xliff:g id="MONTH">%B</xliff:g><xliff:g id="DAY">%-d</xliff:g>日"</string>
- <string name="month_year">"<xliff:g id="YEAR">%Y</xliff:g>年<xliff:g id="MONTH">%B</xliff:g>"</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="YEAR">%Y</xliff:g>/<xliff:g id="MONTH">%B</xliff:g>/<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>~<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g>~<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g><xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g>~<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string>
@@ -607,82 +580,8 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g><xliff:g id="TIME1">%5$s</xliff:g>~<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g><xliff:g id="WEEKDAY2">%6$s</xliff:g><xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1">%3$s</xliff:g><xliff:g id="TIME1">%5$s</xliff:g>~<xliff:g id="YEAR2">%9$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2">%8$s</xliff:g><xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g>/<xliff:g id="MONTH1">%2$s</xliff:g>/<xliff:g id="DAY1_0">%3$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g><xliff:g id="TIME1">%5$s</xliff:g>~<xliff:g id="YEAR2">%9$s</xliff:g>/<xliff:g id="MONTH2">%7$s</xliff:g>/<xliff:g id="DAY2_1">%8$s</xliff:g><xliff:g id="WEEKDAY2">%6$s</xliff:g><xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="YEAR">%Y</xliff:g>/<xliff:g id="MONTH">%b</xliff:g>/<xliff:g id="DAY">%-d</xliff:g>"</string>
- <string name="abbrev_month_year">"<xliff:g id="YEAR">%Y</xliff:g>年<xliff:g id="MONTH">%b</xliff:g>月"</string>
- <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g>/<xliff:g id="DAY">%-d</xliff:g>"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"日曜日"</string>
- <string name="day_of_week_long_monday">"月曜日"</string>
- <string name="day_of_week_long_tuesday">"火曜日"</string>
- <string name="day_of_week_long_wednesday">"水曜日"</string>
- <string name="day_of_week_long_thursday">"木曜日"</string>
- <string name="day_of_week_long_friday">"金曜日"</string>
- <string name="day_of_week_long_saturday">"土曜日"</string>
- <string name="day_of_week_medium_sunday">"(日)"</string>
- <string name="day_of_week_medium_monday">"(月)"</string>
- <string name="day_of_week_medium_tuesday">"(火)"</string>
- <string name="day_of_week_medium_wednesday">"(水)"</string>
- <string name="day_of_week_medium_thursday">"(木)"</string>
- <string name="day_of_week_medium_friday">"(金)"</string>
- <string name="day_of_week_medium_saturday">"(土)"</string>
- <string name="day_of_week_short_sunday">"日"</string>
- <string name="day_of_week_short_monday">"月"</string>
- <string name="day_of_week_short_tuesday">"火"</string>
- <string name="day_of_week_short_wednesday">"水"</string>
- <string name="day_of_week_short_thursday">"木"</string>
- <string name="day_of_week_short_friday">"金"</string>
- <string name="day_of_week_short_saturday">"土"</string>
- <string name="day_of_week_shorter_sunday">"日"</string>
- <string name="day_of_week_shorter_monday">"月"</string>
- <string name="day_of_week_shorter_tuesday">"火"</string>
- <string name="day_of_week_shorter_wednesday">"水"</string>
- <string name="day_of_week_shorter_thursday">"木"</string>
- <string name="day_of_week_shorter_friday">"金"</string>
- <string name="day_of_week_shorter_saturday">"土"</string>
- <string name="day_of_week_shortest_sunday">"日"</string>
- <string name="day_of_week_shortest_monday">"月"</string>
- <string name="day_of_week_shortest_tuesday">"火"</string>
- <string name="day_of_week_shortest_wednesday">"水"</string>
- <string name="day_of_week_shortest_thursday">"火"</string>
- <string name="day_of_week_shortest_friday">"金"</string>
- <string name="day_of_week_shortest_saturday">"土"</string>
- <string name="month_long_january">"1月"</string>
- <string name="month_long_february">"2月"</string>
- <string name="month_long_march">"3月"</string>
- <string name="month_long_april">"4月"</string>
- <string name="month_long_may">"5月"</string>
- <string name="month_long_june">"6月"</string>
- <string name="month_long_july">"7月"</string>
- <string name="month_long_august">"8月"</string>
- <string name="month_long_september">"9月"</string>
- <string name="month_long_october">"10月"</string>
- <string name="month_long_november">"11月"</string>
- <string name="month_long_december">"12月"</string>
- <string name="month_medium_january">"1"</string>
- <string name="month_medium_february">"2"</string>
- <string name="month_medium_march">"3"</string>
- <string name="month_medium_april">"4"</string>
- <string name="month_medium_may">"5"</string>
- <string name="month_medium_june">"6"</string>
- <string name="month_medium_july">"7"</string>
- <string name="month_medium_august">"8"</string>
- <string name="month_medium_september">"9"</string>
- <string name="month_medium_october">"10"</string>
- <string name="month_medium_november">"11"</string>
- <string name="month_medium_december">"12"</string>
- <string name="month_shortest_january">"1"</string>
- <string name="month_shortest_february">"2"</string>
- <string name="month_shortest_march">"3"</string>
- <string name="month_shortest_april">"4"</string>
- <string name="month_shortest_may">"5"</string>
- <string name="month_shortest_june">"6"</string>
- <string name="month_shortest_july">"7"</string>
- <string name="month_shortest_august">"8"</string>
- <string name="month_shortest_september">"9"</string>
- <string name="month_shortest_october">"10"</string>
- <string name="month_shortest_november">"11"</string>
- <string name="month_shortest_december">"12"</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"すべて選択"</string>
diff --git a/core/res/res/values-ko-rKR/donottranslate-cldr.xml b/core/res/res/values-ko-rKR/donottranslate-cldr.xml
new file mode 100644
index 0000000..17d9432
--- /dev/null
+++ b/core/res/res/values-ko-rKR/donottranslate-cldr.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">1월</string>
+ <string name="month_long_standalone_february">2월</string>
+ <string name="month_long_standalone_march">3월</string>
+ <string name="month_long_standalone_april">4월</string>
+ <string name="month_long_standalone_may">5월</string>
+ <string name="month_long_standalone_june">6월</string>
+ <string name="month_long_standalone_july">7월</string>
+ <string name="month_long_standalone_august">8월</string>
+ <string name="month_long_standalone_september">9월</string>
+ <string name="month_long_standalone_october">10월</string>
+ <string name="month_long_standalone_november">11월</string>
+ <string name="month_long_standalone_december">12월</string>
+
+ <string name="month_long_january">1월</string>
+ <string name="month_long_february">2월</string>
+ <string name="month_long_march">3월</string>
+ <string name="month_long_april">4월</string>
+ <string name="month_long_may">5월</string>
+ <string name="month_long_june">6월</string>
+ <string name="month_long_july">7월</string>
+ <string name="month_long_august">8월</string>
+ <string name="month_long_september">9월</string>
+ <string name="month_long_october">10월</string>
+ <string name="month_long_november">11월</string>
+ <string name="month_long_december">12월</string>
+
+
+ <string name="month_shortest_january">1월</string>
+ <string name="month_shortest_february">2월</string>
+ <string name="month_shortest_march">3월</string>
+ <string name="month_shortest_april">4월</string>
+ <string name="month_shortest_may">5월</string>
+ <string name="month_shortest_june">6월</string>
+ <string name="month_shortest_july">7월</string>
+ <string name="month_shortest_august">8월</string>
+ <string name="month_shortest_september">9월</string>
+ <string name="month_shortest_october">10월</string>
+ <string name="month_shortest_november">11월</string>
+ <string name="month_shortest_december">12월</string>
+
+ <string name="day_of_week_long_sunday">일요일</string>
+ <string name="day_of_week_long_monday">월요일</string>
+ <string name="day_of_week_long_tuesday">화요일</string>
+ <string name="day_of_week_long_wednesday">수요일</string>
+ <string name="day_of_week_long_thursday">목요일</string>
+ <string name="day_of_week_long_friday">금요일</string>
+ <string name="day_of_week_long_saturday">토요일</string>
+
+ <string name="day_of_week_medium_sunday">일</string>
+ <string name="day_of_week_medium_monday">월</string>
+ <string name="day_of_week_medium_tuesday">화</string>
+ <string name="day_of_week_medium_wednesday">수</string>
+ <string name="day_of_week_medium_thursday">목</string>
+ <string name="day_of_week_medium_friday">금</string>
+ <string name="day_of_week_medium_saturday">토</string>
+
+ <string name="day_of_week_short_sunday">일</string>
+ <string name="day_of_week_short_monday">월</string>
+ <string name="day_of_week_short_tuesday">화</string>
+ <string name="day_of_week_short_wednesday">수</string>
+ <string name="day_of_week_short_thursday">목</string>
+ <string name="day_of_week_short_friday">금</string>
+ <string name="day_of_week_short_saturday">토</string>
+
+ <string name="day_of_week_shortest_sunday">일</string>
+ <string name="day_of_week_shortest_monday">월</string>
+ <string name="day_of_week_shortest_tuesday">화</string>
+ <string name="day_of_week_shortest_wednesday">수</string>
+ <string name="day_of_week_shortest_thursday">목</string>
+ <string name="day_of_week_shortest_friday">금</string>
+ <string name="day_of_week_shortest_saturday">토</string>
+
+ <string name="am">오전</string>
+ <string name="pm">오후</string>
+ <string name="yesterday">어제</string>
+ <string name="today">오늘</string>
+ <string name="tomorrow">내일</string>
+
+ <string name="hour_minute_ampm">%p %-l:%M</string>
+ <string name="hour_minute_cap_ampm">%^p %-l:%M</string>
+ <string name="numeric_date">%Y. %-m. %-e.</string>
+ <string name="numeric_date_format">yyyy. M. d.</string>
+ <string name="month_day_year">%Y년 %-m월 %-e일</string>
+ <string name="time_of_day">%p %-l:%M:%S</string>
+ <string name="date_and_time">%p %-l:%M:%S %Y. %-m. %-e.</string>
+ <string name="abbrev_month_day_year">%Y. %-m. %-e.</string>
+ <string name="month_day">%B %-e일</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y년 %B</string>
+ <string name="abbrev_month_day">%b %-e일</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y년 %b</string>
+</resources>
diff --git a/core/res/res/values-ko/donottranslate-cldr.xml b/core/res/res/values-ko/donottranslate-cldr.xml
new file mode 100644
index 0000000..17d9432
--- /dev/null
+++ b/core/res/res/values-ko/donottranslate-cldr.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">1월</string>
+ <string name="month_long_standalone_february">2월</string>
+ <string name="month_long_standalone_march">3월</string>
+ <string name="month_long_standalone_april">4월</string>
+ <string name="month_long_standalone_may">5월</string>
+ <string name="month_long_standalone_june">6월</string>
+ <string name="month_long_standalone_july">7월</string>
+ <string name="month_long_standalone_august">8월</string>
+ <string name="month_long_standalone_september">9월</string>
+ <string name="month_long_standalone_october">10월</string>
+ <string name="month_long_standalone_november">11월</string>
+ <string name="month_long_standalone_december">12월</string>
+
+ <string name="month_long_january">1월</string>
+ <string name="month_long_february">2월</string>
+ <string name="month_long_march">3월</string>
+ <string name="month_long_april">4월</string>
+ <string name="month_long_may">5월</string>
+ <string name="month_long_june">6월</string>
+ <string name="month_long_july">7월</string>
+ <string name="month_long_august">8월</string>
+ <string name="month_long_september">9월</string>
+ <string name="month_long_october">10월</string>
+ <string name="month_long_november">11월</string>
+ <string name="month_long_december">12월</string>
+
+
+ <string name="month_shortest_january">1월</string>
+ <string name="month_shortest_february">2월</string>
+ <string name="month_shortest_march">3월</string>
+ <string name="month_shortest_april">4월</string>
+ <string name="month_shortest_may">5월</string>
+ <string name="month_shortest_june">6월</string>
+ <string name="month_shortest_july">7월</string>
+ <string name="month_shortest_august">8월</string>
+ <string name="month_shortest_september">9월</string>
+ <string name="month_shortest_october">10월</string>
+ <string name="month_shortest_november">11월</string>
+ <string name="month_shortest_december">12월</string>
+
+ <string name="day_of_week_long_sunday">일요일</string>
+ <string name="day_of_week_long_monday">월요일</string>
+ <string name="day_of_week_long_tuesday">화요일</string>
+ <string name="day_of_week_long_wednesday">수요일</string>
+ <string name="day_of_week_long_thursday">목요일</string>
+ <string name="day_of_week_long_friday">금요일</string>
+ <string name="day_of_week_long_saturday">토요일</string>
+
+ <string name="day_of_week_medium_sunday">일</string>
+ <string name="day_of_week_medium_monday">월</string>
+ <string name="day_of_week_medium_tuesday">화</string>
+ <string name="day_of_week_medium_wednesday">수</string>
+ <string name="day_of_week_medium_thursday">목</string>
+ <string name="day_of_week_medium_friday">금</string>
+ <string name="day_of_week_medium_saturday">토</string>
+
+ <string name="day_of_week_short_sunday">일</string>
+ <string name="day_of_week_short_monday">월</string>
+ <string name="day_of_week_short_tuesday">화</string>
+ <string name="day_of_week_short_wednesday">수</string>
+ <string name="day_of_week_short_thursday">목</string>
+ <string name="day_of_week_short_friday">금</string>
+ <string name="day_of_week_short_saturday">토</string>
+
+ <string name="day_of_week_shortest_sunday">일</string>
+ <string name="day_of_week_shortest_monday">월</string>
+ <string name="day_of_week_shortest_tuesday">화</string>
+ <string name="day_of_week_shortest_wednesday">수</string>
+ <string name="day_of_week_shortest_thursday">목</string>
+ <string name="day_of_week_shortest_friday">금</string>
+ <string name="day_of_week_shortest_saturday">토</string>
+
+ <string name="am">오전</string>
+ <string name="pm">오후</string>
+ <string name="yesterday">어제</string>
+ <string name="today">오늘</string>
+ <string name="tomorrow">내일</string>
+
+ <string name="hour_minute_ampm">%p %-l:%M</string>
+ <string name="hour_minute_cap_ampm">%^p %-l:%M</string>
+ <string name="numeric_date">%Y. %-m. %-e.</string>
+ <string name="numeric_date_format">yyyy. M. d.</string>
+ <string name="month_day_year">%Y년 %-m월 %-e일</string>
+ <string name="time_of_day">%p %-l:%M:%S</string>
+ <string name="date_and_time">%p %-l:%M:%S %Y. %-m. %-e.</string>
+ <string name="abbrev_month_day_year">%Y. %-m. %-e.</string>
+ <string name="month_day">%B %-e일</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y년 %B</string>
+ <string name="abbrev_month_day">%b %-e일</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y년 %b</string>
+</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 96b897a..06b85e8 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -418,9 +418,6 @@
<string name="lockscreen_glogin_password_hint">"비밀번호"</string>
<string name="lockscreen_glogin_submit_button">"로그인"</string>
<string name="lockscreen_glogin_invalid_input">"사용자 이름 또는 비밀번호가 잘못되었습니다."</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button">"알림 지우기"</string>
@@ -452,9 +449,6 @@
<string name="menu_enter_shortcut_label">"입력"</string>
<string name="menu_delete_shortcut_label">"삭제"</string>
<string name="search_go">"검색"</string>
- <string name="today">"오늘"</string>
- <string name="yesterday">"어제"</string>
- <string name="tomorrow">"내일"</string>
<string name="oneMonthDurationPast">"한 달 전"</string>
<string name="beforeOneMonthDurationPast">"한 달 전"</string>
<plurals name="num_seconds_ago">
@@ -536,13 +530,6 @@
<string name="weeks">"주"</string>
<string name="year">"년"</string>
<string name="years">"년"</string>
- <string name="sunday">"일요일"</string>
- <string name="monday">"월요일"</string>
- <string name="tuesday">"화요일"</string>
- <string name="wednesday">"수요일"</string>
- <string name="thursday">"목요일"</string>
- <string name="friday">"금요일"</string>
- <string name="saturday">"토요일"</string>
<string name="every_weekday">"주중 매일(월-금)"</string>
<string name="daily">"매일"</string>
<string name="weekly">"매주 <xliff:g id="DAY">%s</xliff:g>"</string>
@@ -552,9 +539,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"죄송합니다. 이 기기로의 스트리밍에 적합하지 않은 동영상입니다."</string>
<string name="VideoView_error_text_unknown">"죄송합니다. 동영상을 재생할 수 없습니다."</string>
<string name="VideoView_error_button">"확인"</string>
- <string name="am">"AM"</string>
- <string name="pm">"PM"</string>
- <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="WEEKDAY2">%4$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -566,23 +550,12 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="WEEKDAY">%2$s</xliff:g>, <xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>', '<xliff:g id="DAY">d</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>', '<xliff:g id="DAY">d</xliff:g>"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"정오"</string>
<string name="Noon">"정오"</string>
<string name="midnight">"자정"</string>
<string name="Midnight">"자정"</string>
- <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="YEAR">%Y</xliff:g>, <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string>
- <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="YEAR">%Y</xliff:g>, <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="YEAR">%9$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string>
@@ -607,82 +580,8 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="YEAR">%Y</xliff:g> <xliff:g id="MONTH">%b</xliff:g>, <xliff:g id="DAY">%-d</xliff:g>"</string>
- <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"일요일"</string>
- <string name="day_of_week_long_monday">"월요일"</string>
- <string name="day_of_week_long_tuesday">"화요일"</string>
- <string name="day_of_week_long_wednesday">"수요일"</string>
- <string name="day_of_week_long_thursday">"목요일"</string>
- <string name="day_of_week_long_friday">"금요일"</string>
- <string name="day_of_week_long_saturday">"토요일"</string>
- <string name="day_of_week_medium_sunday">"일요일"</string>
- <string name="day_of_week_medium_monday">"월"</string>
- <string name="day_of_week_medium_tuesday">"화"</string>
- <string name="day_of_week_medium_wednesday">"수"</string>
- <string name="day_of_week_medium_thursday">"목"</string>
- <string name="day_of_week_medium_friday">"금"</string>
- <string name="day_of_week_medium_saturday">"토"</string>
- <string name="day_of_week_short_sunday">"일"</string>
- <string name="day_of_week_short_monday">"월"</string>
- <string name="day_of_week_short_tuesday">"화"</string>
- <string name="day_of_week_short_wednesday">"수"</string>
- <string name="day_of_week_short_thursday">"목"</string>
- <string name="day_of_week_short_friday">"금"</string>
- <string name="day_of_week_short_saturday">"토"</string>
- <string name="day_of_week_shorter_sunday">"일"</string>
- <string name="day_of_week_shorter_monday">"월"</string>
- <string name="day_of_week_shorter_tuesday">"화"</string>
- <string name="day_of_week_shorter_wednesday">"수"</string>
- <string name="day_of_week_shorter_thursday">"목"</string>
- <string name="day_of_week_shorter_friday">"금"</string>
- <string name="day_of_week_shorter_saturday">"토"</string>
- <string name="day_of_week_shortest_sunday">"일"</string>
- <string name="day_of_week_shortest_monday">"3월"</string>
- <string name="day_of_week_shortest_tuesday">"목"</string>
- <string name="day_of_week_shortest_wednesday">"수"</string>
- <string name="day_of_week_shortest_thursday">"목"</string>
- <string name="day_of_week_shortest_friday">"금"</string>
- <string name="day_of_week_shortest_saturday">"토"</string>
- <string name="month_long_january">"1월"</string>
- <string name="month_long_february">"2월"</string>
- <string name="month_long_march">"3월"</string>
- <string name="month_long_april">"4월"</string>
- <string name="month_long_may">"5월"</string>
- <string name="month_long_june">"6월"</string>
- <string name="month_long_july">"7월"</string>
- <string name="month_long_august">"8월"</string>
- <string name="month_long_september">"9월"</string>
- <string name="month_long_october">"10월"</string>
- <string name="month_long_november">"11월"</string>
- <string name="month_long_december">"12월"</string>
- <string name="month_medium_january">"1월"</string>
- <string name="month_medium_february">"2월"</string>
- <string name="month_medium_march">"3월"</string>
- <string name="month_medium_april">"4월"</string>
- <string name="month_medium_may">"5월"</string>
- <string name="month_medium_june">"6월"</string>
- <string name="month_medium_july">"7월"</string>
- <string name="month_medium_august">"8월"</string>
- <string name="month_medium_september">"9월"</string>
- <string name="month_medium_october">"10월"</string>
- <string name="month_medium_november">"11월"</string>
- <string name="month_medium_december">"12월"</string>
- <string name="month_shortest_january">"1월"</string>
- <string name="month_shortest_february">"금"</string>
- <string name="month_shortest_march">"3월"</string>
- <string name="month_shortest_april">"4월"</string>
- <string name="month_shortest_may">"5월"</string>
- <string name="month_shortest_june">"6월"</string>
- <string name="month_shortest_july">"7월"</string>
- <string name="month_shortest_august">"8월"</string>
- <string name="month_shortest_september">"9월"</string>
- <string name="month_shortest_october">"10월"</string>
- <string name="month_shortest_november">"11월"</string>
- <string name="month_shortest_december">"12월"</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"모두 선택"</string>
diff --git a/core/res/res/values-lt-rLT/donottranslate-cldr.xml b/core/res/res/values-lt-rLT/donottranslate-cldr.xml
new file mode 100644
index 0000000..629937b
--- /dev/null
+++ b/core/res/res/values-lt-rLT/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Sausis</string>
+ <string name="month_long_standalone_february">Vasaris</string>
+ <string name="month_long_standalone_march">Kovas</string>
+ <string name="month_long_standalone_april">Balandis</string>
+ <string name="month_long_standalone_may">Gegužė</string>
+ <string name="month_long_standalone_june">Birželis</string>
+ <string name="month_long_standalone_july">Liepa</string>
+ <string name="month_long_standalone_august">Rugpjūtis</string>
+ <string name="month_long_standalone_september">Rugsėjis</string>
+ <string name="month_long_standalone_october">Spalis</string>
+ <string name="month_long_standalone_november">Lapkritis</string>
+ <string name="month_long_standalone_december">Gruodis</string>
+
+ <string name="month_long_january">sausio</string>
+ <string name="month_long_february">vasario</string>
+ <string name="month_long_march">kovo</string>
+ <string name="month_long_april">balandžio</string>
+ <string name="month_long_may">gegužės</string>
+ <string name="month_long_june">birželio</string>
+ <string name="month_long_july">liepos</string>
+ <string name="month_long_august">rugpjūčio</string>
+ <string name="month_long_september">rugsėjo</string>
+ <string name="month_long_october">spalio</string>
+ <string name="month_long_november">lapkričio</string>
+ <string name="month_long_december">gruodžio</string>
+
+ <string name="month_medium_january">Sau</string>
+ <string name="month_medium_february">Vas</string>
+ <string name="month_medium_march">Kov</string>
+ <string name="month_medium_april">Bal</string>
+ <string name="month_medium_may">Geg</string>
+ <string name="month_medium_june">Bir</string>
+ <string name="month_medium_july">Lie</string>
+ <string name="month_medium_august">Rgp</string>
+ <string name="month_medium_september">Rgs</string>
+ <string name="month_medium_october">Spl</string>
+ <string name="month_medium_november">Lap</string>
+ <string name="month_medium_december">Grd</string>
+
+ <string name="month_shortest_january">S</string>
+ <string name="month_shortest_february">V</string>
+ <string name="month_shortest_march">K</string>
+ <string name="month_shortest_april">B</string>
+ <string name="month_shortest_may">G</string>
+ <string name="month_shortest_june">B</string>
+ <string name="month_shortest_july">L</string>
+ <string name="month_shortest_august">R</string>
+ <string name="month_shortest_september">R</string>
+ <string name="month_shortest_october">S</string>
+ <string name="month_shortest_november">L</string>
+ <string name="month_shortest_december">G</string>
+
+ <string name="day_of_week_long_sunday">sekmadienis</string>
+ <string name="day_of_week_long_monday">pirmadienis</string>
+ <string name="day_of_week_long_tuesday">antradienis</string>
+ <string name="day_of_week_long_wednesday">trečiadienis</string>
+ <string name="day_of_week_long_thursday">ketvirtadienis</string>
+ <string name="day_of_week_long_friday">penktadienis</string>
+ <string name="day_of_week_long_saturday">šeštadienis</string>
+
+ <string name="day_of_week_medium_sunday">Sk</string>
+ <string name="day_of_week_medium_monday">Pr</string>
+ <string name="day_of_week_medium_tuesday">An</string>
+ <string name="day_of_week_medium_wednesday">Tr</string>
+ <string name="day_of_week_medium_thursday">Kt</string>
+ <string name="day_of_week_medium_friday">Pn</string>
+ <string name="day_of_week_medium_saturday">Št</string>
+
+ <string name="day_of_week_short_sunday">Sk</string>
+ <string name="day_of_week_short_monday">Pr</string>
+ <string name="day_of_week_short_tuesday">An</string>
+ <string name="day_of_week_short_wednesday">Tr</string>
+ <string name="day_of_week_short_thursday">Kt</string>
+ <string name="day_of_week_short_friday">Pn</string>
+ <string name="day_of_week_short_saturday">Št</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">P</string>
+ <string name="day_of_week_shortest_tuesday">A</string>
+ <string name="day_of_week_shortest_wednesday">T</string>
+ <string name="day_of_week_shortest_thursday">K</string>
+ <string name="day_of_week_shortest_friday">P</string>
+ <string name="day_of_week_shortest_saturday">Š</string>
+
+ <string name="am">priešpiet</string>
+ <string name="pm">popiet</string>
+ <string name="yesterday">vakar</string>
+ <string name="today">šiandien</string>
+ <string name="tomorrow">rytoj</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%Y-%m-%d</string>
+ <string name="numeric_date_format">yyyy-MM-dd</string>
+ <string name="month_day_year">%Y m. %B %-e d.</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %Y.%m.%d</string>
+ <string name="abbrev_month_day_year">%Y.%m.%d</string>
+ <string name="month_day">%B %-e</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y %B</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y %b</string>
+</resources>
diff --git a/core/res/res/values-lv-rLV/donottranslate-cldr.xml b/core/res/res/values-lv-rLV/donottranslate-cldr.xml
new file mode 100644
index 0000000..d47a18f
--- /dev/null
+++ b/core/res/res/values-lv-rLV/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">janvāris</string>
+ <string name="month_long_standalone_february">februāris</string>
+ <string name="month_long_standalone_march">marts</string>
+ <string name="month_long_standalone_april">aprīlis</string>
+ <string name="month_long_standalone_may">maijs</string>
+ <string name="month_long_standalone_june">jūnijs</string>
+ <string name="month_long_standalone_july">jūlijs</string>
+ <string name="month_long_standalone_august">augusts</string>
+ <string name="month_long_standalone_september">septembris</string>
+ <string name="month_long_standalone_october">oktobris</string>
+ <string name="month_long_standalone_november">novembris</string>
+ <string name="month_long_standalone_december">decembris</string>
+
+ <string name="month_long_january">janvāris</string>
+ <string name="month_long_february">februāris</string>
+ <string name="month_long_march">marts</string>
+ <string name="month_long_april">aprīlis</string>
+ <string name="month_long_may">maijs</string>
+ <string name="month_long_june">jūnijs</string>
+ <string name="month_long_july">jūlijs</string>
+ <string name="month_long_august">augusts</string>
+ <string name="month_long_september">septembris</string>
+ <string name="month_long_october">oktobris</string>
+ <string name="month_long_november">novembris</string>
+ <string name="month_long_december">decembris</string>
+
+ <string name="month_medium_january">janv.</string>
+ <string name="month_medium_february">febr.</string>
+ <string name="month_medium_march">marts</string>
+ <string name="month_medium_april">apr.</string>
+ <string name="month_medium_may">maijs</string>
+ <string name="month_medium_june">jūn.</string>
+ <string name="month_medium_july">jūl.</string>
+ <string name="month_medium_august">aug.</string>
+ <string name="month_medium_september">sept.</string>
+ <string name="month_medium_october">okt.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">dec.</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">svētdiena</string>
+ <string name="day_of_week_long_monday">pirmdiena</string>
+ <string name="day_of_week_long_tuesday">otrdiena</string>
+ <string name="day_of_week_long_wednesday">trešdiena</string>
+ <string name="day_of_week_long_thursday">ceturtdiena</string>
+ <string name="day_of_week_long_friday">piektdiena</string>
+ <string name="day_of_week_long_saturday">sestdiena</string>
+
+ <string name="day_of_week_medium_sunday">Sv</string>
+ <string name="day_of_week_medium_monday">Pr</string>
+ <string name="day_of_week_medium_tuesday">Ot</string>
+ <string name="day_of_week_medium_wednesday">Tr</string>
+ <string name="day_of_week_medium_thursday">Ce</string>
+ <string name="day_of_week_medium_friday">Pk</string>
+ <string name="day_of_week_medium_saturday">Se</string>
+
+ <string name="day_of_week_short_sunday">Sv</string>
+ <string name="day_of_week_short_monday">Pr</string>
+ <string name="day_of_week_short_tuesday">Ot</string>
+ <string name="day_of_week_short_wednesday">Tr</string>
+ <string name="day_of_week_short_thursday">Ce</string>
+ <string name="day_of_week_short_friday">Pk</string>
+ <string name="day_of_week_short_saturday">Se</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">P</string>
+ <string name="day_of_week_shortest_tuesday">O</string>
+ <string name="day_of_week_shortest_wednesday">T</string>
+ <string name="day_of_week_shortest_thursday">C</string>
+ <string name="day_of_week_shortest_friday">P</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">vakar</string>
+ <string name="today">šodien</string>
+ <string name="tomorrow">rīt</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%Y. gada %-e. %B</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %Y. gada %-e. %b</string>
+ <string name="abbrev_month_day_year">%Y. gada %-e. %b</string>
+ <string name="month_day">%-e. %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y. g. %B</string>
+ <string name="abbrev_month_day">%-e. %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y. g. %b</string>
+</resources>
diff --git a/core/res/res/values-nb/donottranslate-cldr.xml b/core/res/res/values-nb/donottranslate-cldr.xml
new file mode 100644
index 0000000..f89e819
--- /dev/null
+++ b/core/res/res/values-nb/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">januar</string>
+ <string name="month_long_standalone_february">februar</string>
+ <string name="month_long_standalone_march">mars</string>
+ <string name="month_long_standalone_april">april</string>
+ <string name="month_long_standalone_may">mai</string>
+ <string name="month_long_standalone_june">juni</string>
+ <string name="month_long_standalone_july">juli</string>
+ <string name="month_long_standalone_august">august</string>
+ <string name="month_long_standalone_september">september</string>
+ <string name="month_long_standalone_october">oktober</string>
+ <string name="month_long_standalone_november">november</string>
+ <string name="month_long_standalone_december">desember</string>
+
+ <string name="month_long_january">januar</string>
+ <string name="month_long_february">februar</string>
+ <string name="month_long_march">mars</string>
+ <string name="month_long_april">april</string>
+ <string name="month_long_may">mai</string>
+ <string name="month_long_june">juni</string>
+ <string name="month_long_july">juli</string>
+ <string name="month_long_august">august</string>
+ <string name="month_long_september">september</string>
+ <string name="month_long_october">oktober</string>
+ <string name="month_long_november">november</string>
+ <string name="month_long_december">desember</string>
+
+ <string name="month_medium_january">jan.</string>
+ <string name="month_medium_february">feb.</string>
+ <string name="month_medium_march">mars</string>
+ <string name="month_medium_april">apr.</string>
+ <string name="month_medium_may">mai</string>
+ <string name="month_medium_june">juni</string>
+ <string name="month_medium_july">juli</string>
+ <string name="month_medium_august">aug.</string>
+ <string name="month_medium_september">sep.</string>
+ <string name="month_medium_october">okt.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">des.</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">søndag</string>
+ <string name="day_of_week_long_monday">mandag</string>
+ <string name="day_of_week_long_tuesday">tirsdag</string>
+ <string name="day_of_week_long_wednesday">onsdag</string>
+ <string name="day_of_week_long_thursday">torsdag</string>
+ <string name="day_of_week_long_friday">fredag</string>
+ <string name="day_of_week_long_saturday">lørdag</string>
+
+ <string name="day_of_week_medium_sunday">søn.</string>
+ <string name="day_of_week_medium_monday">man.</string>
+ <string name="day_of_week_medium_tuesday">tir.</string>
+ <string name="day_of_week_medium_wednesday">ons.</string>
+ <string name="day_of_week_medium_thursday">tor.</string>
+ <string name="day_of_week_medium_friday">fre.</string>
+ <string name="day_of_week_medium_saturday">lør.</string>
+
+ <string name="day_of_week_short_sunday">søn.</string>
+ <string name="day_of_week_short_monday">man.</string>
+ <string name="day_of_week_short_tuesday">tir.</string>
+ <string name="day_of_week_short_wednesday">ons.</string>
+ <string name="day_of_week_short_thursday">tor.</string>
+ <string name="day_of_week_short_friday">fre.</string>
+ <string name="day_of_week_short_saturday">lør.</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">O</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">L</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">i går</string>
+ <string name="today">i dag</string>
+ <string name="tomorrow">i morgen</string>
+
+ <string name="hour_minute_ampm">%H.%M</string>
+ <string name="hour_minute_cap_ampm">%H.%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%-e. %B %Y</string>
+ <string name="time_of_day">%H.%M.%S</string>
+ <string name="date_and_time">%H.%M.%S %-e. %b %Y</string>
+ <string name="abbrev_month_day_year">%-e. %b %Y</string>
+ <string name="month_day">%-e. %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e. %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 7bed159..a28b12c 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -424,9 +424,6 @@
<string name="lockscreen_glogin_password_hint">"Password"</string>
<string name="lockscreen_glogin_submit_button">"Sign in"</string>
<string name="lockscreen_glogin_invalid_input">"Invalid username or password."</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button">"Fjern varslinger"</string>
@@ -458,9 +455,6 @@
<string name="menu_enter_shortcut_label">"enter"</string>
<string name="menu_delete_shortcut_label">"slett"</string>
<string name="search_go">"Søk"</string>
- <string name="today">"I dag"</string>
- <string name="yesterday">"I går"</string>
- <string name="tomorrow">"I morgen"</string>
<string name="oneMonthDurationPast">"For en måned siden"</string>
<string name="beforeOneMonthDurationPast">"For over en måned siden"</string>
<plurals name="num_seconds_ago">
@@ -542,13 +536,6 @@
<string name="weeks">"uker"</string>
<string name="year">"år"</string>
<string name="years">"år"</string>
- <string name="sunday">"søndag"</string>
- <string name="monday">"mandag"</string>
- <string name="tuesday">"tirsdag"</string>
- <string name="wednesday">"onsdag"</string>
- <string name="thursday">"torsdag"</string>
- <string name="friday">"fredag"</string>
- <string name="saturday">"lørdag"</string>
<string name="every_weekday">"Hverdager (man–fre)"</string>
<string name="daily">"Hver dag"</string>
<string name="weekly">"Hver <xliff:g id="DAY">%s</xliff:g>"</string>
@@ -558,9 +545,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"Beklager, denne videoen er ikke gyldig for streaming til denne enheten."</string>
<string name="VideoView_error_text_unknown">"Beklager, kan ikke spille denne videoen."</string>
<string name="VideoView_error_button">"OK"</string>
- <string name="am">"AM"</string>
- <string name="pm">"PM"</string>
- <string name="numeric_date">"<xliff:g id="YEAR">%Y</xliff:g>-<xliff:g id="MONTH">%m</xliff:g>-<xliff:g id="DAY">%d</xliff:g>"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DATE1">%2$s</xliff:g> <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g> <xliff:g id="DATE2">%5$s</xliff:g> <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g> <xliff:g id="DATE2">%5$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g> <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g> <xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -572,12 +556,6 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>'., '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>'. '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"middag"</string>
<string name="Noon">"Middag"</string>
<string name="midnight">"midnatt"</string>
@@ -586,10 +564,6 @@
<skip />
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string>
@@ -614,83 +588,10 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>. <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>. <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g>. <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
<!-- no translation found for abbrev_month_day (3156047263406783231) -->
<skip />
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"søndag"</string>
- <string name="day_of_week_long_monday">"mandag"</string>
- <string name="day_of_week_long_tuesday">"tirsdag"</string>
- <string name="day_of_week_long_wednesday">"onsdag"</string>
- <string name="day_of_week_long_thursday">"torsdag"</string>
- <string name="day_of_week_long_friday">"fredag"</string>
- <string name="day_of_week_long_saturday">"lørdag"</string>
- <string name="day_of_week_medium_sunday">"søn"</string>
- <string name="day_of_week_medium_monday">"man"</string>
- <string name="day_of_week_medium_tuesday">"tir"</string>
- <string name="day_of_week_medium_wednesday">"ons"</string>
- <string name="day_of_week_medium_thursday">"tor"</string>
- <string name="day_of_week_medium_friday">"fre"</string>
- <string name="day_of_week_medium_saturday">"lør"</string>
- <string name="day_of_week_short_sunday">"sø"</string>
- <string name="day_of_week_short_monday">"ma"</string>
- <string name="day_of_week_short_tuesday">"ti"</string>
- <string name="day_of_week_short_wednesday">"on"</string>
- <string name="day_of_week_short_thursday">"to"</string>
- <string name="day_of_week_short_friday">"fr"</string>
- <string name="day_of_week_short_saturday">"lø"</string>
- <string name="day_of_week_shorter_sunday">"S"</string>
- <string name="day_of_week_shorter_monday">"M"</string>
- <string name="day_of_week_shorter_tuesday">"Ti"</string>
- <string name="day_of_week_shorter_wednesday">"O"</string>
- <string name="day_of_week_shorter_thursday">"To"</string>
- <string name="day_of_week_shorter_friday">"F"</string>
- <string name="day_of_week_shorter_saturday">"L"</string>
- <string name="day_of_week_shortest_sunday">"S"</string>
- <string name="day_of_week_shortest_monday">"M"</string>
- <string name="day_of_week_shortest_tuesday">"T"</string>
- <string name="day_of_week_shortest_wednesday">"O"</string>
- <string name="day_of_week_shortest_thursday">"T"</string>
- <string name="day_of_week_shortest_friday">"F"</string>
- <string name="day_of_week_shortest_saturday">"L"</string>
- <string name="month_long_january">"januar"</string>
- <string name="month_long_february">"februar"</string>
- <string name="month_long_march">"mars"</string>
- <string name="month_long_april">"april"</string>
- <string name="month_long_may">"mai"</string>
- <string name="month_long_june">"juni"</string>
- <string name="month_long_july">"juli"</string>
- <string name="month_long_august">"august"</string>
- <string name="month_long_september">"september"</string>
- <string name="month_long_october">"oktober"</string>
- <string name="month_long_november">"november"</string>
- <string name="month_long_december">"desember"</string>
- <string name="month_medium_january">"jan"</string>
- <string name="month_medium_february">"feb"</string>
- <string name="month_medium_march">"mar"</string>
- <string name="month_medium_april">"apr"</string>
- <string name="month_medium_may">"mai"</string>
- <string name="month_medium_june">"jun"</string>
- <string name="month_medium_july">"jul"</string>
- <string name="month_medium_august">"aug"</string>
- <string name="month_medium_september">"sep"</string>
- <string name="month_medium_october">"okt"</string>
- <string name="month_medium_november">"nov"</string>
- <string name="month_medium_december">"des"</string>
- <string name="month_shortest_january">"J"</string>
- <string name="month_shortest_february">"F"</string>
- <string name="month_shortest_march">"M"</string>
- <string name="month_shortest_april">"A"</string>
- <string name="month_shortest_may">"M"</string>
- <string name="month_shortest_june">"J"</string>
- <string name="month_shortest_july">"J"</string>
- <string name="month_shortest_august">"A"</string>
- <string name="month_shortest_september">"S"</string>
- <string name="month_shortest_october">"O"</string>
- <string name="month_shortest_november">"N"</string>
- <string name="month_shortest_december">"D"</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"Merk alt"</string>
diff --git a/core/res/res/values-nl-rBE/donottranslate-cldr.xml b/core/res/res/values-nl-rBE/donottranslate-cldr.xml
new file mode 100644
index 0000000..c3050c6
--- /dev/null
+++ b/core/res/res/values-nl-rBE/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">januari</string>
+ <string name="month_long_standalone_february">februari</string>
+ <string name="month_long_standalone_march">maart</string>
+ <string name="month_long_standalone_april">april</string>
+ <string name="month_long_standalone_may">mei</string>
+ <string name="month_long_standalone_june">juni</string>
+ <string name="month_long_standalone_july">juli</string>
+ <string name="month_long_standalone_august">augustus</string>
+ <string name="month_long_standalone_september">september</string>
+ <string name="month_long_standalone_october">oktober</string>
+ <string name="month_long_standalone_november">november</string>
+ <string name="month_long_standalone_december">december</string>
+
+ <string name="month_long_january">januari</string>
+ <string name="month_long_february">februari</string>
+ <string name="month_long_march">maart</string>
+ <string name="month_long_april">april</string>
+ <string name="month_long_may">mei</string>
+ <string name="month_long_june">juni</string>
+ <string name="month_long_july">juli</string>
+ <string name="month_long_august">augustus</string>
+ <string name="month_long_september">september</string>
+ <string name="month_long_october">oktober</string>
+ <string name="month_long_november">november</string>
+ <string name="month_long_december">december</string>
+
+ <string name="month_medium_january">jan.</string>
+ <string name="month_medium_february">feb.</string>
+ <string name="month_medium_march">mrt.</string>
+ <string name="month_medium_april">apr.</string>
+ <string name="month_medium_may">mei</string>
+ <string name="month_medium_june">jun.</string>
+ <string name="month_medium_july">jul.</string>
+ <string name="month_medium_august">aug.</string>
+ <string name="month_medium_september">sep.</string>
+ <string name="month_medium_october">okt.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">dec.</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">zondag</string>
+ <string name="day_of_week_long_monday">maandag</string>
+ <string name="day_of_week_long_tuesday">dinsdag</string>
+ <string name="day_of_week_long_wednesday">woensdag</string>
+ <string name="day_of_week_long_thursday">donderdag</string>
+ <string name="day_of_week_long_friday">vrijdag</string>
+ <string name="day_of_week_long_saturday">zaterdag</string>
+
+ <string name="day_of_week_medium_sunday">zo</string>
+ <string name="day_of_week_medium_monday">ma</string>
+ <string name="day_of_week_medium_tuesday">di</string>
+ <string name="day_of_week_medium_wednesday">wo</string>
+ <string name="day_of_week_medium_thursday">do</string>
+ <string name="day_of_week_medium_friday">vr</string>
+ <string name="day_of_week_medium_saturday">za</string>
+
+ <string name="day_of_week_short_sunday">zo</string>
+ <string name="day_of_week_short_monday">ma</string>
+ <string name="day_of_week_short_tuesday">di</string>
+ <string name="day_of_week_short_wednesday">wo</string>
+ <string name="day_of_week_short_thursday">do</string>
+ <string name="day_of_week_short_friday">vr</string>
+ <string name="day_of_week_short_saturday">za</string>
+
+ <string name="day_of_week_shortest_sunday">Z</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">D</string>
+ <string name="day_of_week_shortest_wednesday">W</string>
+ <string name="day_of_week_shortest_thursday">D</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">Z</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">Gisteren</string>
+ <string name="today">Vandaag</string>
+ <string name="tomorrow">Morgen</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%-e/%m/%Y</string>
+ <string name="numeric_date_format">d/MM/yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e-%b-%Y</string>
+ <string name="abbrev_month_day_year">%-e-%b-%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e-%b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-nl-rNL/donottranslate-cldr.xml b/core/res/res/values-nl-rNL/donottranslate-cldr.xml
new file mode 100644
index 0000000..b9e0407
--- /dev/null
+++ b/core/res/res/values-nl-rNL/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">januari</string>
+ <string name="month_long_standalone_february">februari</string>
+ <string name="month_long_standalone_march">maart</string>
+ <string name="month_long_standalone_april">april</string>
+ <string name="month_long_standalone_may">mei</string>
+ <string name="month_long_standalone_june">juni</string>
+ <string name="month_long_standalone_july">juli</string>
+ <string name="month_long_standalone_august">augustus</string>
+ <string name="month_long_standalone_september">september</string>
+ <string name="month_long_standalone_october">oktober</string>
+ <string name="month_long_standalone_november">november</string>
+ <string name="month_long_standalone_december">december</string>
+
+ <string name="month_long_january">januari</string>
+ <string name="month_long_february">februari</string>
+ <string name="month_long_march">maart</string>
+ <string name="month_long_april">april</string>
+ <string name="month_long_may">mei</string>
+ <string name="month_long_june">juni</string>
+ <string name="month_long_july">juli</string>
+ <string name="month_long_august">augustus</string>
+ <string name="month_long_september">september</string>
+ <string name="month_long_october">oktober</string>
+ <string name="month_long_november">november</string>
+ <string name="month_long_december">december</string>
+
+ <string name="month_medium_january">jan.</string>
+ <string name="month_medium_february">feb.</string>
+ <string name="month_medium_march">mrt.</string>
+ <string name="month_medium_april">apr.</string>
+ <string name="month_medium_may">mei</string>
+ <string name="month_medium_june">jun.</string>
+ <string name="month_medium_july">jul.</string>
+ <string name="month_medium_august">aug.</string>
+ <string name="month_medium_september">sep.</string>
+ <string name="month_medium_october">okt.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">dec.</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">zondag</string>
+ <string name="day_of_week_long_monday">maandag</string>
+ <string name="day_of_week_long_tuesday">dinsdag</string>
+ <string name="day_of_week_long_wednesday">woensdag</string>
+ <string name="day_of_week_long_thursday">donderdag</string>
+ <string name="day_of_week_long_friday">vrijdag</string>
+ <string name="day_of_week_long_saturday">zaterdag</string>
+
+ <string name="day_of_week_medium_sunday">zo</string>
+ <string name="day_of_week_medium_monday">ma</string>
+ <string name="day_of_week_medium_tuesday">di</string>
+ <string name="day_of_week_medium_wednesday">wo</string>
+ <string name="day_of_week_medium_thursday">do</string>
+ <string name="day_of_week_medium_friday">vr</string>
+ <string name="day_of_week_medium_saturday">za</string>
+
+ <string name="day_of_week_short_sunday">zo</string>
+ <string name="day_of_week_short_monday">ma</string>
+ <string name="day_of_week_short_tuesday">di</string>
+ <string name="day_of_week_short_wednesday">wo</string>
+ <string name="day_of_week_short_thursday">do</string>
+ <string name="day_of_week_short_friday">vr</string>
+ <string name="day_of_week_short_saturday">za</string>
+
+ <string name="day_of_week_shortest_sunday">Z</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">D</string>
+ <string name="day_of_week_shortest_wednesday">W</string>
+ <string name="day_of_week_shortest_thursday">D</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">Z</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">Gisteren</string>
+ <string name="today">Vandaag</string>
+ <string name="tomorrow">Morgen</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d-%m-%Y</string>
+ <string name="numeric_date_format">dd-MM-yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e %b %Y</string>
+ <string name="abbrev_month_day_year">%-e %b %Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e-%b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-nl/donottranslate-cldr.xml b/core/res/res/values-nl/donottranslate-cldr.xml
new file mode 100644
index 0000000..b9e0407
--- /dev/null
+++ b/core/res/res/values-nl/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">januari</string>
+ <string name="month_long_standalone_february">februari</string>
+ <string name="month_long_standalone_march">maart</string>
+ <string name="month_long_standalone_april">april</string>
+ <string name="month_long_standalone_may">mei</string>
+ <string name="month_long_standalone_june">juni</string>
+ <string name="month_long_standalone_july">juli</string>
+ <string name="month_long_standalone_august">augustus</string>
+ <string name="month_long_standalone_september">september</string>
+ <string name="month_long_standalone_october">oktober</string>
+ <string name="month_long_standalone_november">november</string>
+ <string name="month_long_standalone_december">december</string>
+
+ <string name="month_long_january">januari</string>
+ <string name="month_long_february">februari</string>
+ <string name="month_long_march">maart</string>
+ <string name="month_long_april">april</string>
+ <string name="month_long_may">mei</string>
+ <string name="month_long_june">juni</string>
+ <string name="month_long_july">juli</string>
+ <string name="month_long_august">augustus</string>
+ <string name="month_long_september">september</string>
+ <string name="month_long_october">oktober</string>
+ <string name="month_long_november">november</string>
+ <string name="month_long_december">december</string>
+
+ <string name="month_medium_january">jan.</string>
+ <string name="month_medium_february">feb.</string>
+ <string name="month_medium_march">mrt.</string>
+ <string name="month_medium_april">apr.</string>
+ <string name="month_medium_may">mei</string>
+ <string name="month_medium_june">jun.</string>
+ <string name="month_medium_july">jul.</string>
+ <string name="month_medium_august">aug.</string>
+ <string name="month_medium_september">sep.</string>
+ <string name="month_medium_october">okt.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">dec.</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">zondag</string>
+ <string name="day_of_week_long_monday">maandag</string>
+ <string name="day_of_week_long_tuesday">dinsdag</string>
+ <string name="day_of_week_long_wednesday">woensdag</string>
+ <string name="day_of_week_long_thursday">donderdag</string>
+ <string name="day_of_week_long_friday">vrijdag</string>
+ <string name="day_of_week_long_saturday">zaterdag</string>
+
+ <string name="day_of_week_medium_sunday">zo</string>
+ <string name="day_of_week_medium_monday">ma</string>
+ <string name="day_of_week_medium_tuesday">di</string>
+ <string name="day_of_week_medium_wednesday">wo</string>
+ <string name="day_of_week_medium_thursday">do</string>
+ <string name="day_of_week_medium_friday">vr</string>
+ <string name="day_of_week_medium_saturday">za</string>
+
+ <string name="day_of_week_short_sunday">zo</string>
+ <string name="day_of_week_short_monday">ma</string>
+ <string name="day_of_week_short_tuesday">di</string>
+ <string name="day_of_week_short_wednesday">wo</string>
+ <string name="day_of_week_short_thursday">do</string>
+ <string name="day_of_week_short_friday">vr</string>
+ <string name="day_of_week_short_saturday">za</string>
+
+ <string name="day_of_week_shortest_sunday">Z</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">D</string>
+ <string name="day_of_week_shortest_wednesday">W</string>
+ <string name="day_of_week_shortest_thursday">D</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">Z</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">Gisteren</string>
+ <string name="today">Vandaag</string>
+ <string name="tomorrow">Morgen</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d-%m-%Y</string>
+ <string name="numeric_date_format">dd-MM-yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e %b %Y</string>
+ <string name="abbrev_month_day_year">%-e %b %Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e-%b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 3a9e32c..4437f29 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -418,9 +418,6 @@
<string name="lockscreen_glogin_password_hint">"Wachtwoord"</string>
<string name="lockscreen_glogin_submit_button">"Aanmelden"</string>
<string name="lockscreen_glogin_invalid_input">"Gebruikersnaam of wachtwoord ongeldig."</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button">"Meldingen wissen"</string>
@@ -452,9 +449,6 @@
<string name="menu_enter_shortcut_label">"invoeren"</string>
<string name="menu_delete_shortcut_label">"verwijderen"</string>
<string name="search_go">"Zoeken"</string>
- <string name="today">"Vandaag"</string>
- <string name="yesterday">"Gisteren"</string>
- <string name="tomorrow">"Morgen"</string>
<string name="oneMonthDurationPast">"1 maand geleden"</string>
<string name="beforeOneMonthDurationPast">"Meer dan 1 maand geleden"</string>
<plurals name="num_seconds_ago">
@@ -536,13 +530,6 @@
<string name="weeks">"weken"</string>
<string name="year">"jaar"</string>
<string name="years">"jaren"</string>
- <string name="sunday">"Zondag"</string>
- <string name="monday">"Maandag"</string>
- <string name="tuesday">"Dinsdag"</string>
- <string name="wednesday">"Woensdag"</string>
- <string name="thursday">"Donderdag"</string>
- <string name="friday">"Vrijdag"</string>
- <string name="saturday">"Zaterdag"</string>
<string name="every_weekday">"Elke weekdag (ma-vr)"</string>
<string name="daily">"Dagelijks"</string>
<string name="weekly">"Wekelijks op <xliff:g id="DAY">%s</xliff:g>"</string>
@@ -552,9 +539,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"Deze video kan helaas niet worden gestreamd naar dit apparaat."</string>
<string name="VideoView_error_text_unknown">"Deze video kan niet worden afgespeeld."</string>
<string name="VideoView_error_button">"OK"</string>
- <string name="am">"am"</string>
- <string name="pm">"pm"</string>
- <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>-<xliff:g id="MONTH">%m</xliff:g>-<xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g> <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g> <xliff:g id="DATE2">%5$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -566,23 +550,12 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"twaalf uur \'s middags"</string>
<string name="Noon">"Twaalf uur \'s middags"</string>
<string name="midnight">"middernacht"</string>
<string name="Midnight">"Middernacht"</string>
- <string name="month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string>
@@ -607,82 +580,8 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g>"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"Zondag"</string>
- <string name="day_of_week_long_monday">"Maandag"</string>
- <string name="day_of_week_long_tuesday">"Dinsdag"</string>
- <string name="day_of_week_long_wednesday">"Woensdag"</string>
- <string name="day_of_week_long_thursday">"Donderdag"</string>
- <string name="day_of_week_long_friday">"Vrijdag"</string>
- <string name="day_of_week_long_saturday">"Zaterdag"</string>
- <string name="day_of_week_medium_sunday">"Zo"</string>
- <string name="day_of_week_medium_monday">"Ma"</string>
- <string name="day_of_week_medium_tuesday">"Di"</string>
- <string name="day_of_week_medium_wednesday">"Wo"</string>
- <string name="day_of_week_medium_thursday">"Do"</string>
- <string name="day_of_week_medium_friday">"Vr"</string>
- <string name="day_of_week_medium_saturday">"Za"</string>
- <string name="day_of_week_short_sunday">"Zo"</string>
- <string name="day_of_week_short_monday">"Ma"</string>
- <string name="day_of_week_short_tuesday">"Di"</string>
- <string name="day_of_week_short_wednesday">"Wo"</string>
- <string name="day_of_week_short_thursday">"Do"</string>
- <string name="day_of_week_short_friday">"Vr"</string>
- <string name="day_of_week_short_saturday">"Za"</string>
- <string name="day_of_week_shorter_sunday">"Zo"</string>
- <string name="day_of_week_shorter_monday">"M"</string>
- <string name="day_of_week_shorter_tuesday">"Di"</string>
- <string name="day_of_week_shorter_wednesday">"W"</string>
- <string name="day_of_week_shorter_thursday">"Do"</string>
- <string name="day_of_week_shorter_friday">"V"</string>
- <string name="day_of_week_shorter_saturday">"Za"</string>
- <string name="day_of_week_shortest_sunday">"Z"</string>
- <string name="day_of_week_shortest_monday">"M"</string>
- <string name="day_of_week_shortest_tuesday">"D"</string>
- <string name="day_of_week_shortest_wednesday">"W"</string>
- <string name="day_of_week_shortest_thursday">"D"</string>
- <string name="day_of_week_shortest_friday">"V"</string>
- <string name="day_of_week_shortest_saturday">"Z"</string>
- <string name="month_long_january">"Januari"</string>
- <string name="month_long_february">"Februari"</string>
- <string name="month_long_march">"Maart"</string>
- <string name="month_long_april">"April"</string>
- <string name="month_long_may">"Mei"</string>
- <string name="month_long_june">"Juni"</string>
- <string name="month_long_july">"Juli"</string>
- <string name="month_long_august">"Augustus"</string>
- <string name="month_long_september">"September"</string>
- <string name="month_long_october">"Oktober"</string>
- <string name="month_long_november">"November"</string>
- <string name="month_long_december">"December"</string>
- <string name="month_medium_january">"Jan"</string>
- <string name="month_medium_february">"Feb"</string>
- <string name="month_medium_march">"Mrt"</string>
- <string name="month_medium_april">"Apr"</string>
- <string name="month_medium_may">"Mei"</string>
- <string name="month_medium_june">"Jun"</string>
- <string name="month_medium_july">"Jul"</string>
- <string name="month_medium_august">"Aug"</string>
- <string name="month_medium_september">"Sep"</string>
- <string name="month_medium_october">"Okt"</string>
- <string name="month_medium_november">"Nov"</string>
- <string name="month_medium_december">"Dec"</string>
- <string name="month_shortest_january">"J"</string>
- <string name="month_shortest_february">"V"</string>
- <string name="month_shortest_march">"M"</string>
- <string name="month_shortest_april">"A"</string>
- <string name="month_shortest_may">"M"</string>
- <string name="month_shortest_june">"J"</string>
- <string name="month_shortest_july">"J"</string>
- <string name="month_shortest_august">"A"</string>
- <string name="month_shortest_september">"S"</string>
- <string name="month_shortest_october">"O"</string>
- <string name="month_shortest_november">"N"</string>
- <string name="month_shortest_december">"D"</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"Alles selecteren"</string>
diff --git a/core/res/res/values-pl-rPL/donottranslate-cldr.xml b/core/res/res/values-pl-rPL/donottranslate-cldr.xml
new file mode 100644
index 0000000..0ae8b48
--- /dev/null
+++ b/core/res/res/values-pl-rPL/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">styczeń</string>
+ <string name="month_long_standalone_february">luty</string>
+ <string name="month_long_standalone_march">marzec</string>
+ <string name="month_long_standalone_april">kwiecień</string>
+ <string name="month_long_standalone_may">maj</string>
+ <string name="month_long_standalone_june">czerwiec</string>
+ <string name="month_long_standalone_july">lipiec</string>
+ <string name="month_long_standalone_august">sierpień</string>
+ <string name="month_long_standalone_september">wrzesień</string>
+ <string name="month_long_standalone_october">październik</string>
+ <string name="month_long_standalone_november">listopad</string>
+ <string name="month_long_standalone_december">grudzień</string>
+
+ <string name="month_long_january">stycznia</string>
+ <string name="month_long_february">lutego</string>
+ <string name="month_long_march">marca</string>
+ <string name="month_long_april">kwietnia</string>
+ <string name="month_long_may">maja</string>
+ <string name="month_long_june">czerwca</string>
+ <string name="month_long_july">lipca</string>
+ <string name="month_long_august">sierpnia</string>
+ <string name="month_long_september">września</string>
+ <string name="month_long_october">października</string>
+ <string name="month_long_november">listopada</string>
+ <string name="month_long_december">grudnia</string>
+
+ <string name="month_medium_january">sty</string>
+ <string name="month_medium_february">lut</string>
+ <string name="month_medium_march">mar</string>
+ <string name="month_medium_april">kwi</string>
+ <string name="month_medium_may">maj</string>
+ <string name="month_medium_june">cze</string>
+ <string name="month_medium_july">lip</string>
+ <string name="month_medium_august">sie</string>
+ <string name="month_medium_september">wrz</string>
+ <string name="month_medium_october">paź</string>
+ <string name="month_medium_november">lis</string>
+ <string name="month_medium_december">gru</string>
+
+ <string name="month_shortest_january">s</string>
+ <string name="month_shortest_february">l</string>
+ <string name="month_shortest_march">m</string>
+ <string name="month_shortest_april">k</string>
+ <string name="month_shortest_may">m</string>
+ <string name="month_shortest_june">c</string>
+ <string name="month_shortest_july">l</string>
+ <string name="month_shortest_august">s</string>
+ <string name="month_shortest_september">w</string>
+ <string name="month_shortest_october">p</string>
+ <string name="month_shortest_november">l</string>
+ <string name="month_shortest_december">g</string>
+
+ <string name="day_of_week_long_sunday">niedziela</string>
+ <string name="day_of_week_long_monday">poniedziałek</string>
+ <string name="day_of_week_long_tuesday">wtorek</string>
+ <string name="day_of_week_long_wednesday">środa</string>
+ <string name="day_of_week_long_thursday">czwartek</string>
+ <string name="day_of_week_long_friday">piątek</string>
+ <string name="day_of_week_long_saturday">sobota</string>
+
+ <string name="day_of_week_medium_sunday">niedz.</string>
+ <string name="day_of_week_medium_monday">pon.</string>
+ <string name="day_of_week_medium_tuesday">wt.</string>
+ <string name="day_of_week_medium_wednesday">śr.</string>
+ <string name="day_of_week_medium_thursday">czw.</string>
+ <string name="day_of_week_medium_friday">pt.</string>
+ <string name="day_of_week_medium_saturday">sob.</string>
+
+ <string name="day_of_week_short_sunday">niedz.</string>
+ <string name="day_of_week_short_monday">pon.</string>
+ <string name="day_of_week_short_tuesday">wt.</string>
+ <string name="day_of_week_short_wednesday">śr.</string>
+ <string name="day_of_week_short_thursday">czw.</string>
+ <string name="day_of_week_short_friday">pt.</string>
+ <string name="day_of_week_short_saturday">sob.</string>
+
+ <string name="day_of_week_shortest_sunday">N</string>
+ <string name="day_of_week_shortest_monday">P</string>
+ <string name="day_of_week_shortest_tuesday">W</string>
+ <string name="day_of_week_shortest_wednesday">Ś</string>
+ <string name="day_of_week_shortest_thursday">C</string>
+ <string name="day_of_week_shortest_friday">P</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">Wczoraj</string>
+ <string name="today">Dzisiaj</string>
+ <string name="tomorrow">Jutro</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d-%m-%Y</string>
+ <string name="numeric_date_format">dd-MM-yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %d-%m-%Y</string>
+ <string name="abbrev_month_day_year">%d-%m-%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%-B %Y</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y %b</string>
+</resources>
diff --git a/core/res/res/values-pl/donottranslate-cldr.xml b/core/res/res/values-pl/donottranslate-cldr.xml
new file mode 100644
index 0000000..0ae8b48
--- /dev/null
+++ b/core/res/res/values-pl/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">styczeń</string>
+ <string name="month_long_standalone_february">luty</string>
+ <string name="month_long_standalone_march">marzec</string>
+ <string name="month_long_standalone_april">kwiecień</string>
+ <string name="month_long_standalone_may">maj</string>
+ <string name="month_long_standalone_june">czerwiec</string>
+ <string name="month_long_standalone_july">lipiec</string>
+ <string name="month_long_standalone_august">sierpień</string>
+ <string name="month_long_standalone_september">wrzesień</string>
+ <string name="month_long_standalone_october">październik</string>
+ <string name="month_long_standalone_november">listopad</string>
+ <string name="month_long_standalone_december">grudzień</string>
+
+ <string name="month_long_january">stycznia</string>
+ <string name="month_long_february">lutego</string>
+ <string name="month_long_march">marca</string>
+ <string name="month_long_april">kwietnia</string>
+ <string name="month_long_may">maja</string>
+ <string name="month_long_june">czerwca</string>
+ <string name="month_long_july">lipca</string>
+ <string name="month_long_august">sierpnia</string>
+ <string name="month_long_september">września</string>
+ <string name="month_long_october">października</string>
+ <string name="month_long_november">listopada</string>
+ <string name="month_long_december">grudnia</string>
+
+ <string name="month_medium_january">sty</string>
+ <string name="month_medium_february">lut</string>
+ <string name="month_medium_march">mar</string>
+ <string name="month_medium_april">kwi</string>
+ <string name="month_medium_may">maj</string>
+ <string name="month_medium_june">cze</string>
+ <string name="month_medium_july">lip</string>
+ <string name="month_medium_august">sie</string>
+ <string name="month_medium_september">wrz</string>
+ <string name="month_medium_october">paź</string>
+ <string name="month_medium_november">lis</string>
+ <string name="month_medium_december">gru</string>
+
+ <string name="month_shortest_january">s</string>
+ <string name="month_shortest_february">l</string>
+ <string name="month_shortest_march">m</string>
+ <string name="month_shortest_april">k</string>
+ <string name="month_shortest_may">m</string>
+ <string name="month_shortest_june">c</string>
+ <string name="month_shortest_july">l</string>
+ <string name="month_shortest_august">s</string>
+ <string name="month_shortest_september">w</string>
+ <string name="month_shortest_october">p</string>
+ <string name="month_shortest_november">l</string>
+ <string name="month_shortest_december">g</string>
+
+ <string name="day_of_week_long_sunday">niedziela</string>
+ <string name="day_of_week_long_monday">poniedziałek</string>
+ <string name="day_of_week_long_tuesday">wtorek</string>
+ <string name="day_of_week_long_wednesday">środa</string>
+ <string name="day_of_week_long_thursday">czwartek</string>
+ <string name="day_of_week_long_friday">piątek</string>
+ <string name="day_of_week_long_saturday">sobota</string>
+
+ <string name="day_of_week_medium_sunday">niedz.</string>
+ <string name="day_of_week_medium_monday">pon.</string>
+ <string name="day_of_week_medium_tuesday">wt.</string>
+ <string name="day_of_week_medium_wednesday">śr.</string>
+ <string name="day_of_week_medium_thursday">czw.</string>
+ <string name="day_of_week_medium_friday">pt.</string>
+ <string name="day_of_week_medium_saturday">sob.</string>
+
+ <string name="day_of_week_short_sunday">niedz.</string>
+ <string name="day_of_week_short_monday">pon.</string>
+ <string name="day_of_week_short_tuesday">wt.</string>
+ <string name="day_of_week_short_wednesday">śr.</string>
+ <string name="day_of_week_short_thursday">czw.</string>
+ <string name="day_of_week_short_friday">pt.</string>
+ <string name="day_of_week_short_saturday">sob.</string>
+
+ <string name="day_of_week_shortest_sunday">N</string>
+ <string name="day_of_week_shortest_monday">P</string>
+ <string name="day_of_week_shortest_tuesday">W</string>
+ <string name="day_of_week_shortest_wednesday">Ś</string>
+ <string name="day_of_week_shortest_thursday">C</string>
+ <string name="day_of_week_shortest_friday">P</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">Wczoraj</string>
+ <string name="today">Dzisiaj</string>
+ <string name="tomorrow">Jutro</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d-%m-%Y</string>
+ <string name="numeric_date_format">dd-MM-yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %d-%m-%Y</string>
+ <string name="abbrev_month_day_year">%d-%m-%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%-B %Y</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y %b</string>
+</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 50d245b..2cd4841 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -418,9 +418,6 @@
<string name="lockscreen_glogin_password_hint">"Hasło"</string>
<string name="lockscreen_glogin_submit_button">"Zaloguj"</string>
<string name="lockscreen_glogin_invalid_input">"Błędna nazwa użytkownika lub hasło."</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button">"Wyczyść powiadomienia"</string>
@@ -452,9 +449,6 @@
<string name="menu_enter_shortcut_label">"enter"</string>
<string name="menu_delete_shortcut_label">"usuń"</string>
<string name="search_go">"Szukaj"</string>
- <string name="today">"Dzisiaj"</string>
- <string name="yesterday">"Wczoraj"</string>
- <string name="tomorrow">"Jutro"</string>
<string name="oneMonthDurationPast">"1 miesiąc temu"</string>
<string name="beforeOneMonthDurationPast">"Ponad 1 miesiąc temu"</string>
<plurals name="num_seconds_ago">
@@ -536,13 +530,6 @@
<string name="weeks">"tygodni"</string>
<string name="year">"rok"</string>
<string name="years">"lat"</string>
- <string name="sunday">"niedziela"</string>
- <string name="monday">"poniedziałek"</string>
- <string name="tuesday">"wtorek"</string>
- <string name="wednesday">"środa"</string>
- <string name="thursday">"czwartek"</string>
- <string name="friday">"piątek"</string>
- <string name="saturday">"sobota"</string>
<string name="every_weekday">"W każdy dzień roboczy (pon–pt)"</string>
<string name="daily">"Codziennie"</string>
<string name="weekly">"Co tydzień w <xliff:g id="DAY">%s</xliff:g>"</string>
@@ -552,9 +539,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"Przepraszamy, ten film wideo nie nadaje się do przesyłania strumieniowego do tego urządzenia."</string>
<string name="VideoView_error_text_unknown">"Niestety, nie można odtworzyć tego filmu wideo."</string>
<string name="VideoView_error_button">"OK"</string>
- <string name="am">"rano"</string>
- <string name="pm">"po południu"</string>
- <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -566,23 +550,12 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>', '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"południe"</string>
<string name="Noon">"Południe"</string>
<string name="midnight">"północ"</string>
<string name="Midnight">"Północ"</string>
- <string name="month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="month_year">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g>, <xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR">%9$s</xliff:g>"</string>
@@ -607,82 +580,8 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g>, <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g>, <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g>"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"niedziela"</string>
- <string name="day_of_week_long_monday">"poniedziałek"</string>
- <string name="day_of_week_long_tuesday">"wtorek"</string>
- <string name="day_of_week_long_wednesday">"środa"</string>
- <string name="day_of_week_long_thursday">"czwartek"</string>
- <string name="day_of_week_long_friday">"piątek"</string>
- <string name="day_of_week_long_saturday">"sobota"</string>
- <string name="day_of_week_medium_sunday">"Nie"</string>
- <string name="day_of_week_medium_monday">"Pon"</string>
- <string name="day_of_week_medium_tuesday">"Wt"</string>
- <string name="day_of_week_medium_wednesday">"Śro"</string>
- <string name="day_of_week_medium_thursday">"Czw"</string>
- <string name="day_of_week_medium_friday">"Pią"</string>
- <string name="day_of_week_medium_saturday">"Sob"</string>
- <string name="day_of_week_short_sunday">"Nd"</string>
- <string name="day_of_week_short_monday">"Pn"</string>
- <string name="day_of_week_short_tuesday">"Wt"</string>
- <string name="day_of_week_short_wednesday">"Śr"</string>
- <string name="day_of_week_short_thursday">"Czw"</string>
- <string name="day_of_week_short_friday">"Pt"</string>
- <string name="day_of_week_short_saturday">"So"</string>
- <string name="day_of_week_shorter_sunday">"Nd"</string>
- <string name="day_of_week_shorter_monday">"Pon"</string>
- <string name="day_of_week_shorter_tuesday">"Wt"</string>
- <string name="day_of_week_shorter_wednesday">"Śr"</string>
- <string name="day_of_week_shorter_thursday">"Czw"</string>
- <string name="day_of_week_shorter_friday">"Pt"</string>
- <string name="day_of_week_shorter_saturday">"So"</string>
- <string name="day_of_week_shortest_sunday">"Nd"</string>
- <string name="day_of_week_shortest_monday">"Pon"</string>
- <string name="day_of_week_shortest_tuesday">"Czw"</string>
- <string name="day_of_week_shortest_wednesday">"Śr"</string>
- <string name="day_of_week_shortest_thursday">"Czw"</string>
- <string name="day_of_week_shortest_friday">"Pt"</string>
- <string name="day_of_week_shortest_saturday">"Sob"</string>
- <string name="month_long_january">"Styczeń"</string>
- <string name="month_long_february">"Luty"</string>
- <string name="month_long_march">"Marzec"</string>
- <string name="month_long_april">"Kwiecień"</string>
- <string name="month_long_may">"Maj"</string>
- <string name="month_long_june">"Czerwiec"</string>
- <string name="month_long_july">"Lipiec"</string>
- <string name="month_long_august">"Sierpień"</string>
- <string name="month_long_september">"Wrzesień"</string>
- <string name="month_long_october">"Październik"</string>
- <string name="month_long_november">"Listopad"</string>
- <string name="month_long_december">"Grudzień"</string>
- <string name="month_medium_january">"Sty"</string>
- <string name="month_medium_february">"Lut"</string>
- <string name="month_medium_march">"Mar"</string>
- <string name="month_medium_april">"Kwi"</string>
- <string name="month_medium_may">"Maj"</string>
- <string name="month_medium_june">"Cze"</string>
- <string name="month_medium_july">"Lip"</string>
- <string name="month_medium_august">"Sie"</string>
- <string name="month_medium_september">"Wrz"</string>
- <string name="month_medium_october">"Paź"</string>
- <string name="month_medium_november">"Lis"</string>
- <string name="month_medium_december">"Gru"</string>
- <string name="month_shortest_january">"Sty"</string>
- <string name="month_shortest_february">"Lut"</string>
- <string name="month_shortest_march">"Pon"</string>
- <string name="month_shortest_april">"Kwi"</string>
- <string name="month_shortest_may">"Maj"</string>
- <string name="month_shortest_june">"Cze"</string>
- <string name="month_shortest_july">"Lip"</string>
- <string name="month_shortest_august">"Sie"</string>
- <string name="month_shortest_september">"Wrz"</string>
- <string name="month_shortest_october">"Paź"</string>
- <string name="month_shortest_november">"Lis"</string>
- <string name="month_shortest_december">"Gru"</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"Zaznacz wszystko"</string>
diff --git a/core/res/res/values-pt-rBR/donottranslate-cldr.xml b/core/res/res/values-pt-rBR/donottranslate-cldr.xml
new file mode 100644
index 0000000..cf0c29e
--- /dev/null
+++ b/core/res/res/values-pt-rBR/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">janeiro</string>
+ <string name="month_long_standalone_february">fevereiro</string>
+ <string name="month_long_standalone_march">março</string>
+ <string name="month_long_standalone_april">abril</string>
+ <string name="month_long_standalone_may">maio</string>
+ <string name="month_long_standalone_june">junho</string>
+ <string name="month_long_standalone_july">julho</string>
+ <string name="month_long_standalone_august">agosto</string>
+ <string name="month_long_standalone_september">setembro</string>
+ <string name="month_long_standalone_october">outubro</string>
+ <string name="month_long_standalone_november">novembro</string>
+ <string name="month_long_standalone_december">dezembro</string>
+
+ <string name="month_long_january">janeiro</string>
+ <string name="month_long_february">fevereiro</string>
+ <string name="month_long_march">março</string>
+ <string name="month_long_april">abril</string>
+ <string name="month_long_may">maio</string>
+ <string name="month_long_june">junho</string>
+ <string name="month_long_july">julho</string>
+ <string name="month_long_august">agosto</string>
+ <string name="month_long_september">setembro</string>
+ <string name="month_long_october">outubro</string>
+ <string name="month_long_november">novembro</string>
+ <string name="month_long_december">dezembro</string>
+
+ <string name="month_medium_january">jan</string>
+ <string name="month_medium_february">fev</string>
+ <string name="month_medium_march">mar</string>
+ <string name="month_medium_april">abr</string>
+ <string name="month_medium_may">mai</string>
+ <string name="month_medium_june">jun</string>
+ <string name="month_medium_july">jul</string>
+ <string name="month_medium_august">ago</string>
+ <string name="month_medium_september">set</string>
+ <string name="month_medium_october">out</string>
+ <string name="month_medium_november">nov</string>
+ <string name="month_medium_december">dez</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">domingo</string>
+ <string name="day_of_week_long_monday">segunda-feira</string>
+ <string name="day_of_week_long_tuesday">terça-feira</string>
+ <string name="day_of_week_long_wednesday">quarta-feira</string>
+ <string name="day_of_week_long_thursday">quinta-feira</string>
+ <string name="day_of_week_long_friday">sexta-feira</string>
+ <string name="day_of_week_long_saturday">sábado</string>
+
+ <string name="day_of_week_medium_sunday">dom</string>
+ <string name="day_of_week_medium_monday">seg</string>
+ <string name="day_of_week_medium_tuesday">ter</string>
+ <string name="day_of_week_medium_wednesday">qua</string>
+ <string name="day_of_week_medium_thursday">qui</string>
+ <string name="day_of_week_medium_friday">sex</string>
+ <string name="day_of_week_medium_saturday">sáb</string>
+
+ <string name="day_of_week_short_sunday">dom</string>
+ <string name="day_of_week_short_monday">seg</string>
+ <string name="day_of_week_short_tuesday">ter</string>
+ <string name="day_of_week_short_wednesday">qua</string>
+ <string name="day_of_week_short_thursday">qui</string>
+ <string name="day_of_week_short_friday">sex</string>
+ <string name="day_of_week_short_saturday">sáb</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">S</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">Q</string>
+ <string name="day_of_week_shortest_thursday">Q</string>
+ <string name="day_of_week_shortest_friday">S</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">Ontem</string>
+ <string name="today">Hoje</string>
+ <string name="tomorrow">Amanhã</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%-e de %B de %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %d/%m/%Y</string>
+ <string name="abbrev_month_day_year">%d/%m/%Y</string>
+ <string name="month_day">%-e de %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B de %Y</string>
+ <string name="abbrev_month_day">%-e de %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b de %Y</string>
+</resources>
diff --git a/core/res/res/values-pt-rPT/donottranslate-cldr.xml b/core/res/res/values-pt-rPT/donottranslate-cldr.xml
new file mode 100644
index 0000000..d42dc8f
--- /dev/null
+++ b/core/res/res/values-pt-rPT/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Janeiro</string>
+ <string name="month_long_standalone_february">Fevereiro</string>
+ <string name="month_long_standalone_march">Março</string>
+ <string name="month_long_standalone_april">Abril</string>
+ <string name="month_long_standalone_may">Maio</string>
+ <string name="month_long_standalone_june">Junho</string>
+ <string name="month_long_standalone_july">Julho</string>
+ <string name="month_long_standalone_august">Agosto</string>
+ <string name="month_long_standalone_september">Setembro</string>
+ <string name="month_long_standalone_october">Outubro</string>
+ <string name="month_long_standalone_november">Novembro</string>
+ <string name="month_long_standalone_december">Dezembro</string>
+
+ <string name="month_long_january">Janeiro</string>
+ <string name="month_long_february">Fevereiro</string>
+ <string name="month_long_march">Março</string>
+ <string name="month_long_april">Abril</string>
+ <string name="month_long_may">Maio</string>
+ <string name="month_long_june">Junho</string>
+ <string name="month_long_july">Julho</string>
+ <string name="month_long_august">Agosto</string>
+ <string name="month_long_september">Setembro</string>
+ <string name="month_long_october">Outubro</string>
+ <string name="month_long_november">Novembro</string>
+ <string name="month_long_december">Dezembro</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Fev</string>
+ <string name="month_medium_march">Mar</string>
+ <string name="month_medium_april">Abr</string>
+ <string name="month_medium_may">Mai</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Ago</string>
+ <string name="month_medium_september">Set</string>
+ <string name="month_medium_october">Out</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dez</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">domingo</string>
+ <string name="day_of_week_long_monday">segunda-feira</string>
+ <string name="day_of_week_long_tuesday">terça-feira</string>
+ <string name="day_of_week_long_wednesday">quarta-feira</string>
+ <string name="day_of_week_long_thursday">quinta-feira</string>
+ <string name="day_of_week_long_friday">sexta-feira</string>
+ <string name="day_of_week_long_saturday">sábado</string>
+
+ <string name="day_of_week_medium_sunday">dom</string>
+ <string name="day_of_week_medium_monday">seg</string>
+ <string name="day_of_week_medium_tuesday">ter</string>
+ <string name="day_of_week_medium_wednesday">qua</string>
+ <string name="day_of_week_medium_thursday">qui</string>
+ <string name="day_of_week_medium_friday">sex</string>
+ <string name="day_of_week_medium_saturday">sáb</string>
+
+ <string name="day_of_week_short_sunday">dom</string>
+ <string name="day_of_week_short_monday">seg</string>
+ <string name="day_of_week_short_tuesday">ter</string>
+ <string name="day_of_week_short_wednesday">qua</string>
+ <string name="day_of_week_short_thursday">qui</string>
+ <string name="day_of_week_short_friday">sex</string>
+ <string name="day_of_week_short_saturday">sáb</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">S</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">Q</string>
+ <string name="day_of_week_shortest_thursday">Q</string>
+ <string name="day_of_week_shortest_friday">S</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">Antes do meio-dia</string>
+ <string name="pm">Depois do meio-dia</string>
+ <string name="yesterday">Ontem</string>
+ <string name="today">Hoje</string>
+ <string name="tomorrow">Amanhã</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">%-e de %B de %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e de %b de %Y</string>
+ <string name="abbrev_month_day_year">%-e de %b de %Y</string>
+ <string name="month_day">%-e de %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B de %Y</string>
+ <string name="abbrev_month_day">%-e de %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b de %Y</string>
+</resources>
diff --git a/core/res/res/values-ro-rRO/donottranslate-cldr.xml b/core/res/res/values-ro-rRO/donottranslate-cldr.xml
new file mode 100644
index 0000000..1ed2c81
--- /dev/null
+++ b/core/res/res/values-ro-rRO/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">ianuarie</string>
+ <string name="month_long_standalone_february">februarie</string>
+ <string name="month_long_standalone_march">martie</string>
+ <string name="month_long_standalone_april">aprilie</string>
+ <string name="month_long_standalone_may">mai</string>
+ <string name="month_long_standalone_june">iunie</string>
+ <string name="month_long_standalone_july">iulie</string>
+ <string name="month_long_standalone_august">august</string>
+ <string name="month_long_standalone_september">septembrie</string>
+ <string name="month_long_standalone_october">octombrie</string>
+ <string name="month_long_standalone_november">noiembrie</string>
+ <string name="month_long_standalone_december">decembrie</string>
+
+ <string name="month_long_january">ianuarie</string>
+ <string name="month_long_february">februarie</string>
+ <string name="month_long_march">martie</string>
+ <string name="month_long_april">aprilie</string>
+ <string name="month_long_may">mai</string>
+ <string name="month_long_june">iunie</string>
+ <string name="month_long_july">iulie</string>
+ <string name="month_long_august">august</string>
+ <string name="month_long_september">septembrie</string>
+ <string name="month_long_october">octombrie</string>
+ <string name="month_long_november">noiembrie</string>
+ <string name="month_long_december">decembrie</string>
+
+ <string name="month_medium_january">ian.</string>
+ <string name="month_medium_february">feb.</string>
+ <string name="month_medium_march">mar.</string>
+ <string name="month_medium_april">apr.</string>
+ <string name="month_medium_may">mai</string>
+ <string name="month_medium_june">iun.</string>
+ <string name="month_medium_july">iul.</string>
+ <string name="month_medium_august">aug.</string>
+ <string name="month_medium_september">sept.</string>
+ <string name="month_medium_october">oct.</string>
+ <string name="month_medium_november">nov.</string>
+ <string name="month_medium_december">dec.</string>
+
+ <string name="month_shortest_january">I</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">I</string>
+ <string name="month_shortest_july">I</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">duminică</string>
+ <string name="day_of_week_long_monday">luni</string>
+ <string name="day_of_week_long_tuesday">marți</string>
+ <string name="day_of_week_long_wednesday">miercuri</string>
+ <string name="day_of_week_long_thursday">joi</string>
+ <string name="day_of_week_long_friday">vineri</string>
+ <string name="day_of_week_long_saturday">sâmbătă</string>
+
+ <string name="day_of_week_medium_sunday">Du</string>
+ <string name="day_of_week_medium_monday">Lu</string>
+ <string name="day_of_week_medium_tuesday">Ma</string>
+ <string name="day_of_week_medium_wednesday">Mi</string>
+ <string name="day_of_week_medium_thursday">Jo</string>
+ <string name="day_of_week_medium_friday">Vi</string>
+ <string name="day_of_week_medium_saturday">Sâ</string>
+
+ <string name="day_of_week_short_sunday">Du</string>
+ <string name="day_of_week_short_monday">Lu</string>
+ <string name="day_of_week_short_tuesday">Ma</string>
+ <string name="day_of_week_short_wednesday">Mi</string>
+ <string name="day_of_week_short_thursday">Jo</string>
+ <string name="day_of_week_short_friday">Vi</string>
+ <string name="day_of_week_short_saturday">Sâ</string>
+
+ <string name="day_of_week_shortest_sunday">D</string>
+ <string name="day_of_week_shortest_monday">L</string>
+ <string name="day_of_week_shortest_tuesday">M</string>
+ <string name="day_of_week_shortest_wednesday">M</string>
+ <string name="day_of_week_shortest_thursday">J</string>
+ <string name="day_of_week_shortest_friday">V</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">ieri</string>
+ <string name="today">azi</string>
+ <string name="tomorrow">mâine</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S, %d.%m.%Y</string>
+ <string name="abbrev_month_day_year">%d.%m.%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-ru-rRU/donottranslate-cldr.xml b/core/res/res/values-ru-rRU/donottranslate-cldr.xml
new file mode 100644
index 0000000..8faeb44
--- /dev/null
+++ b/core/res/res/values-ru-rRU/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Январь</string>
+ <string name="month_long_standalone_february">Февраль</string>
+ <string name="month_long_standalone_march">Март</string>
+ <string name="month_long_standalone_april">Апрель</string>
+ <string name="month_long_standalone_may">Май</string>
+ <string name="month_long_standalone_june">Июнь</string>
+ <string name="month_long_standalone_july">Июль</string>
+ <string name="month_long_standalone_august">Август</string>
+ <string name="month_long_standalone_september">Сентябрь</string>
+ <string name="month_long_standalone_october">Октябрь</string>
+ <string name="month_long_standalone_november">Ноябрь</string>
+ <string name="month_long_standalone_december">Декабрь</string>
+
+ <string name="month_long_january">января</string>
+ <string name="month_long_february">февраля</string>
+ <string name="month_long_march">марта</string>
+ <string name="month_long_april">апреля</string>
+ <string name="month_long_may">мая</string>
+ <string name="month_long_june">июня</string>
+ <string name="month_long_july">июля</string>
+ <string name="month_long_august">августа</string>
+ <string name="month_long_september">сентября</string>
+ <string name="month_long_october">октября</string>
+ <string name="month_long_november">ноября</string>
+ <string name="month_long_december">декабря</string>
+
+ <string name="month_medium_january">янв.</string>
+ <string name="month_medium_february">февр.</string>
+ <string name="month_medium_march">марта</string>
+ <string name="month_medium_april">апр.</string>
+ <string name="month_medium_may">мая</string>
+ <string name="month_medium_june">июня</string>
+ <string name="month_medium_july">июля</string>
+ <string name="month_medium_august">авг.</string>
+ <string name="month_medium_september">сент.</string>
+ <string name="month_medium_october">окт.</string>
+ <string name="month_medium_november">нояб.</string>
+ <string name="month_medium_december">дек.</string>
+
+ <string name="month_shortest_january">Я</string>
+ <string name="month_shortest_february">Ф</string>
+ <string name="month_shortest_march">М</string>
+ <string name="month_shortest_april">А</string>
+ <string name="month_shortest_may">М</string>
+ <string name="month_shortest_june">И</string>
+ <string name="month_shortest_july">И</string>
+ <string name="month_shortest_august">А</string>
+ <string name="month_shortest_september">С</string>
+ <string name="month_shortest_october">О</string>
+ <string name="month_shortest_november">Н</string>
+ <string name="month_shortest_december">Д</string>
+
+ <string name="day_of_week_long_sunday">воскресенье</string>
+ <string name="day_of_week_long_monday">понедельник</string>
+ <string name="day_of_week_long_tuesday">вторник</string>
+ <string name="day_of_week_long_wednesday">среда</string>
+ <string name="day_of_week_long_thursday">четверг</string>
+ <string name="day_of_week_long_friday">пятница</string>
+ <string name="day_of_week_long_saturday">суббота</string>
+
+ <string name="day_of_week_medium_sunday">Вс</string>
+ <string name="day_of_week_medium_monday">Пн</string>
+ <string name="day_of_week_medium_tuesday">Вт</string>
+ <string name="day_of_week_medium_wednesday">Ср</string>
+ <string name="day_of_week_medium_thursday">Чт</string>
+ <string name="day_of_week_medium_friday">Пт</string>
+ <string name="day_of_week_medium_saturday">Сб</string>
+
+ <string name="day_of_week_short_sunday">Вс</string>
+ <string name="day_of_week_short_monday">Пн</string>
+ <string name="day_of_week_short_tuesday">Вт</string>
+ <string name="day_of_week_short_wednesday">Ср</string>
+ <string name="day_of_week_short_thursday">Чт</string>
+ <string name="day_of_week_short_friday">Пт</string>
+ <string name="day_of_week_short_saturday">Сб</string>
+
+ <string name="day_of_week_shortest_sunday">В</string>
+ <string name="day_of_week_shortest_monday">П</string>
+ <string name="day_of_week_shortest_tuesday">В</string>
+ <string name="day_of_week_shortest_wednesday">С</string>
+ <string name="day_of_week_shortest_thursday">Ч</string>
+ <string name="day_of_week_shortest_friday">П</string>
+ <string name="day_of_week_shortest_saturday">С</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">Вчера</string>
+ <string name="today">Сегодня</string>
+ <string name="tomorrow">Завтра</string>
+
+ <string name="hour_minute_ampm">%-k:%M</string>
+ <string name="hour_minute_cap_ampm">%-k:%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%-e %B %Y г.</string>
+ <string name="time_of_day">%-k:%M:%S</string>
+ <string name="date_and_time">%-k:%M:%S %d.%m.%Y</string>
+ <string name="abbrev_month_day_year">%d.%m.%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-ru/donottranslate-cldr.xml b/core/res/res/values-ru/donottranslate-cldr.xml
new file mode 100644
index 0000000..8faeb44
--- /dev/null
+++ b/core/res/res/values-ru/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Январь</string>
+ <string name="month_long_standalone_february">Февраль</string>
+ <string name="month_long_standalone_march">Март</string>
+ <string name="month_long_standalone_april">Апрель</string>
+ <string name="month_long_standalone_may">Май</string>
+ <string name="month_long_standalone_june">Июнь</string>
+ <string name="month_long_standalone_july">Июль</string>
+ <string name="month_long_standalone_august">Август</string>
+ <string name="month_long_standalone_september">Сентябрь</string>
+ <string name="month_long_standalone_october">Октябрь</string>
+ <string name="month_long_standalone_november">Ноябрь</string>
+ <string name="month_long_standalone_december">Декабрь</string>
+
+ <string name="month_long_january">января</string>
+ <string name="month_long_february">февраля</string>
+ <string name="month_long_march">марта</string>
+ <string name="month_long_april">апреля</string>
+ <string name="month_long_may">мая</string>
+ <string name="month_long_june">июня</string>
+ <string name="month_long_july">июля</string>
+ <string name="month_long_august">августа</string>
+ <string name="month_long_september">сентября</string>
+ <string name="month_long_october">октября</string>
+ <string name="month_long_november">ноября</string>
+ <string name="month_long_december">декабря</string>
+
+ <string name="month_medium_january">янв.</string>
+ <string name="month_medium_february">февр.</string>
+ <string name="month_medium_march">марта</string>
+ <string name="month_medium_april">апр.</string>
+ <string name="month_medium_may">мая</string>
+ <string name="month_medium_june">июня</string>
+ <string name="month_medium_july">июля</string>
+ <string name="month_medium_august">авг.</string>
+ <string name="month_medium_september">сент.</string>
+ <string name="month_medium_october">окт.</string>
+ <string name="month_medium_november">нояб.</string>
+ <string name="month_medium_december">дек.</string>
+
+ <string name="month_shortest_january">Я</string>
+ <string name="month_shortest_february">Ф</string>
+ <string name="month_shortest_march">М</string>
+ <string name="month_shortest_april">А</string>
+ <string name="month_shortest_may">М</string>
+ <string name="month_shortest_june">И</string>
+ <string name="month_shortest_july">И</string>
+ <string name="month_shortest_august">А</string>
+ <string name="month_shortest_september">С</string>
+ <string name="month_shortest_october">О</string>
+ <string name="month_shortest_november">Н</string>
+ <string name="month_shortest_december">Д</string>
+
+ <string name="day_of_week_long_sunday">воскресенье</string>
+ <string name="day_of_week_long_monday">понедельник</string>
+ <string name="day_of_week_long_tuesday">вторник</string>
+ <string name="day_of_week_long_wednesday">среда</string>
+ <string name="day_of_week_long_thursday">четверг</string>
+ <string name="day_of_week_long_friday">пятница</string>
+ <string name="day_of_week_long_saturday">суббота</string>
+
+ <string name="day_of_week_medium_sunday">Вс</string>
+ <string name="day_of_week_medium_monday">Пн</string>
+ <string name="day_of_week_medium_tuesday">Вт</string>
+ <string name="day_of_week_medium_wednesday">Ср</string>
+ <string name="day_of_week_medium_thursday">Чт</string>
+ <string name="day_of_week_medium_friday">Пт</string>
+ <string name="day_of_week_medium_saturday">Сб</string>
+
+ <string name="day_of_week_short_sunday">Вс</string>
+ <string name="day_of_week_short_monday">Пн</string>
+ <string name="day_of_week_short_tuesday">Вт</string>
+ <string name="day_of_week_short_wednesday">Ср</string>
+ <string name="day_of_week_short_thursday">Чт</string>
+ <string name="day_of_week_short_friday">Пт</string>
+ <string name="day_of_week_short_saturday">Сб</string>
+
+ <string name="day_of_week_shortest_sunday">В</string>
+ <string name="day_of_week_shortest_monday">П</string>
+ <string name="day_of_week_shortest_tuesday">В</string>
+ <string name="day_of_week_shortest_wednesday">С</string>
+ <string name="day_of_week_shortest_thursday">Ч</string>
+ <string name="day_of_week_shortest_friday">П</string>
+ <string name="day_of_week_shortest_saturday">С</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">Вчера</string>
+ <string name="today">Сегодня</string>
+ <string name="tomorrow">Завтра</string>
+
+ <string name="hour_minute_ampm">%-k:%M</string>
+ <string name="hour_minute_cap_ampm">%-k:%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%-e %B %Y г.</string>
+ <string name="time_of_day">%-k:%M:%S</string>
+ <string name="date_and_time">%-k:%M:%S %d.%m.%Y</string>
+ <string name="abbrev_month_day_year">%d.%m.%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index fac6cb7..2a15c43 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -418,9 +418,6 @@
<string name="lockscreen_glogin_password_hint">"Пароль"</string>
<string name="lockscreen_glogin_submit_button">"Войти"</string>
<string name="lockscreen_glogin_invalid_input">"Недействительное имя пользователя или пароль."</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button">"Очистить уведомления"</string>
@@ -452,9 +449,6 @@
<string name="menu_enter_shortcut_label">"ввод"</string>
<string name="menu_delete_shortcut_label">"удалить"</string>
<string name="search_go">"Поиск"</string>
- <string name="today">"Сегодня"</string>
- <string name="yesterday">"Вчера"</string>
- <string name="tomorrow">"Завтра"</string>
<string name="oneMonthDurationPast">"1 месяц назад"</string>
<string name="beforeOneMonthDurationPast">"Больше 1 месяца назад"</string>
<plurals name="num_seconds_ago">
@@ -536,13 +530,6 @@
<string name="weeks">"недели"</string>
<string name="year">"год"</string>
<string name="years">"годы"</string>
- <string name="sunday">"воскресенье"</string>
- <string name="monday">"понедельник"</string>
- <string name="tuesday">"вторник"</string>
- <string name="wednesday">"среда"</string>
- <string name="thursday">"четверг"</string>
- <string name="friday">"пятница"</string>
- <string name="saturday">"суббота"</string>
<string name="every_weekday">"По рабочим дням (пн-пт)"</string>
<string name="daily">"Ежедневно"</string>
<string name="weekly">"Еженедельно в: <xliff:g id="DAY">%s</xliff:g>"</string>
@@ -552,9 +539,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"К сожалению, это видео не подходит для потокового воспроизведения на данном устройстве."</string>
<string name="VideoView_error_text_unknown">"К сожалению, это видео нельзя воспроизвести."</string>
<string name="VideoView_error_button">"ОК"</string>
- <string name="am">"AM"</string>
- <string name="pm">"PM"</string>
- <string name="numeric_date">"<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DATE1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%4$s</xliff:g>, <xliff:g id="DATE2">%5$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>, <xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>, <xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -566,23 +550,12 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="TIME_RANGE">%1$s</xliff:g>, <xliff:g id="WEEKDAY">%2$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="DAY">d</xliff:g>' '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"полдень"</string>
<string name="Noon">"Полдень"</string>
<string name="midnight">"полночь"</string>
<string name="Midnight">"Полночь"</string>
- <string name="month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g>"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="month_year">"<xliff:g id="YEAR">%Y</xliff:g> <xliff:g id="MONTH">%B</xliff:g> г."</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g> <xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR">%9$s</xliff:g>"</string>
@@ -607,82 +580,8 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="DAY1">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="DAY2">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="WEEKDAY1">%1$s</xliff:g>, <xliff:g id="DAY1_0">%3$s</xliff:g> <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="YEAR1">%4$s</xliff:g>, <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="WEEKDAY2">%6$s</xliff:g>, <xliff:g id="DAY2_1">%8$s</xliff:g> <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="YEAR2">%9$s</xliff:g>, <xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g>"</string>
- <string name="abbrev_month_year">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="YEAR">%Y</xliff:g> г."</string>
- <string name="abbrev_month_day">"<xliff:g id="DAY">%-d</xliff:g> <xliff:g id="MONTH">%b</xliff:g>"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"воскресенье"</string>
- <string name="day_of_week_long_monday">"понедельник"</string>
- <string name="day_of_week_long_tuesday">"вторник"</string>
- <string name="day_of_week_long_wednesday">"среда"</string>
- <string name="day_of_week_long_thursday">"четверг"</string>
- <string name="day_of_week_long_friday">"пятница"</string>
- <string name="day_of_week_long_saturday">"суббота"</string>
- <string name="day_of_week_medium_sunday">"вс"</string>
- <string name="day_of_week_medium_monday">"пн"</string>
- <string name="day_of_week_medium_tuesday">"вт"</string>
- <string name="day_of_week_medium_wednesday">"ср"</string>
- <string name="day_of_week_medium_thursday">"чт"</string>
- <string name="day_of_week_medium_friday">"пт"</string>
- <string name="day_of_week_medium_saturday">"сб"</string>
- <string name="day_of_week_short_sunday">"вс"</string>
- <string name="day_of_week_short_monday">"пн"</string>
- <string name="day_of_week_short_tuesday">"вт"</string>
- <string name="day_of_week_short_wednesday">"ср"</string>
- <string name="day_of_week_short_thursday">"чт"</string>
- <string name="day_of_week_short_friday">"пт"</string>
- <string name="day_of_week_short_saturday">"сб"</string>
- <string name="day_of_week_shorter_sunday">"вс"</string>
- <string name="day_of_week_shorter_monday">"пн"</string>
- <string name="day_of_week_shorter_tuesday">"вт"</string>
- <string name="day_of_week_shorter_wednesday">"с"</string>
- <string name="day_of_week_shorter_thursday">"чт"</string>
- <string name="day_of_week_shorter_friday">"пт"</string>
- <string name="day_of_week_shorter_saturday">"сб"</string>
- <string name="day_of_week_shortest_sunday">"в"</string>
- <string name="day_of_week_shortest_monday">"п"</string>
- <string name="day_of_week_shortest_tuesday">"в"</string>
- <string name="day_of_week_shortest_wednesday">"с"</string>
- <string name="day_of_week_shortest_thursday">"ч"</string>
- <string name="day_of_week_shortest_friday">"п"</string>
- <string name="day_of_week_shortest_saturday">"с"</string>
- <string name="month_long_january">"январь"</string>
- <string name="month_long_february">"февраль"</string>
- <string name="month_long_march">"март"</string>
- <string name="month_long_april">"апрель"</string>
- <string name="month_long_may">"май"</string>
- <string name="month_long_june">"июнь"</string>
- <string name="month_long_july">"июль"</string>
- <string name="month_long_august">"август"</string>
- <string name="month_long_september">"сентябрь"</string>
- <string name="month_long_october">"октябрь"</string>
- <string name="month_long_november">"ноябрь"</string>
- <string name="month_long_december">"декабрь"</string>
- <string name="month_medium_january">"янв"</string>
- <string name="month_medium_february">"фев"</string>
- <string name="month_medium_march">"мар"</string>
- <string name="month_medium_april">"апр"</string>
- <string name="month_medium_may">"май"</string>
- <string name="month_medium_june">"июн"</string>
- <string name="month_medium_july">"июл"</string>
- <string name="month_medium_august">"авг"</string>
- <string name="month_medium_september">"сен"</string>
- <string name="month_medium_october">"окт"</string>
- <string name="month_medium_november">"ноя"</string>
- <string name="month_medium_december">"дек"</string>
- <string name="month_shortest_january">"Я"</string>
- <string name="month_shortest_february">"ф"</string>
- <string name="month_shortest_march">"м"</string>
- <string name="month_shortest_april">"а"</string>
- <string name="month_shortest_may">"м"</string>
- <string name="month_shortest_june">"и"</string>
- <string name="month_shortest_july">"и"</string>
- <string name="month_shortest_august">"а"</string>
- <string name="month_shortest_september">"с"</string>
- <string name="month_shortest_october">"о"</string>
- <string name="month_shortest_november">"н"</string>
- <string name="month_shortest_december">"д"</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"Выбрать все"</string>
diff --git a/core/res/res/values-sk-rSK/donottranslate-cldr.xml b/core/res/res/values-sk-rSK/donottranslate-cldr.xml
new file mode 100644
index 0000000..05bc5d3
--- /dev/null
+++ b/core/res/res/values-sk-rSK/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">január</string>
+ <string name="month_long_standalone_february">február</string>
+ <string name="month_long_standalone_march">marec</string>
+ <string name="month_long_standalone_april">apríl</string>
+ <string name="month_long_standalone_may">máj</string>
+ <string name="month_long_standalone_june">jún</string>
+ <string name="month_long_standalone_july">júl</string>
+ <string name="month_long_standalone_august">august</string>
+ <string name="month_long_standalone_september">september</string>
+ <string name="month_long_standalone_october">október</string>
+ <string name="month_long_standalone_november">november</string>
+ <string name="month_long_standalone_december">december</string>
+
+ <string name="month_long_january">januára</string>
+ <string name="month_long_february">februára</string>
+ <string name="month_long_march">marca</string>
+ <string name="month_long_april">apríla</string>
+ <string name="month_long_may">mája</string>
+ <string name="month_long_june">júna</string>
+ <string name="month_long_july">júla</string>
+ <string name="month_long_august">augusta</string>
+ <string name="month_long_september">septembra</string>
+ <string name="month_long_october">októbra</string>
+ <string name="month_long_november">novembra</string>
+ <string name="month_long_december">decembra</string>
+
+ <string name="month_medium_january">jan</string>
+ <string name="month_medium_february">feb</string>
+ <string name="month_medium_march">mar</string>
+ <string name="month_medium_april">apr</string>
+ <string name="month_medium_may">máj</string>
+ <string name="month_medium_june">jún</string>
+ <string name="month_medium_july">júl</string>
+ <string name="month_medium_august">aug</string>
+ <string name="month_medium_september">sep</string>
+ <string name="month_medium_october">okt</string>
+ <string name="month_medium_november">nov</string>
+ <string name="month_medium_december">dec</string>
+
+ <string name="month_shortest_january">j</string>
+ <string name="month_shortest_february">f</string>
+ <string name="month_shortest_march">m</string>
+ <string name="month_shortest_april">a</string>
+ <string name="month_shortest_may">m</string>
+ <string name="month_shortest_june">j</string>
+ <string name="month_shortest_july">j</string>
+ <string name="month_shortest_august">a</string>
+ <string name="month_shortest_september">s</string>
+ <string name="month_shortest_october">o</string>
+ <string name="month_shortest_november">n</string>
+ <string name="month_shortest_december">d</string>
+
+ <string name="day_of_week_long_sunday">nedeľa</string>
+ <string name="day_of_week_long_monday">pondelok</string>
+ <string name="day_of_week_long_tuesday">utorok</string>
+ <string name="day_of_week_long_wednesday">streda</string>
+ <string name="day_of_week_long_thursday">štvrtok</string>
+ <string name="day_of_week_long_friday">piatok</string>
+ <string name="day_of_week_long_saturday">sobota</string>
+
+ <string name="day_of_week_medium_sunday">ne</string>
+ <string name="day_of_week_medium_monday">po</string>
+ <string name="day_of_week_medium_tuesday">ut</string>
+ <string name="day_of_week_medium_wednesday">st</string>
+ <string name="day_of_week_medium_thursday">št</string>
+ <string name="day_of_week_medium_friday">pi</string>
+ <string name="day_of_week_medium_saturday">so</string>
+
+ <string name="day_of_week_short_sunday">ne</string>
+ <string name="day_of_week_short_monday">po</string>
+ <string name="day_of_week_short_tuesday">ut</string>
+ <string name="day_of_week_short_wednesday">st</string>
+ <string name="day_of_week_short_thursday">št</string>
+ <string name="day_of_week_short_friday">pi</string>
+ <string name="day_of_week_short_saturday">so</string>
+
+ <string name="day_of_week_shortest_sunday">N</string>
+ <string name="day_of_week_shortest_monday">P</string>
+ <string name="day_of_week_shortest_tuesday">U</string>
+ <string name="day_of_week_shortest_wednesday">S</string>
+ <string name="day_of_week_shortest_thursday">Š</string>
+ <string name="day_of_week_shortest_friday">P</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">dopoludnia</string>
+ <string name="pm">popoludní</string>
+ <string name="yesterday">Včera</string>
+ <string name="today">Dnes</string>
+ <string name="tomorrow">Zajtra</string>
+
+ <string name="hour_minute_ampm">%-k:%M</string>
+ <string name="hour_minute_cap_ampm">%-k:%M</string>
+ <string name="numeric_date">%-e.%-m.%Y</string>
+ <string name="numeric_date_format">d.M.yyyy</string>
+ <string name="month_day_year">%-e. %B %Y</string>
+ <string name="time_of_day">%-k:%M:%S</string>
+ <string name="date_and_time">%-k:%M:%S %-e.%-m.%Y</string>
+ <string name="abbrev_month_day_year">%-e.%-m.%Y</string>
+ <string name="month_day">%-e. %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e. %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-sl-rSI/donottranslate-cldr.xml b/core/res/res/values-sl-rSI/donottranslate-cldr.xml
new file mode 100644
index 0000000..e24b070
--- /dev/null
+++ b/core/res/res/values-sl-rSI/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">januar</string>
+ <string name="month_long_standalone_february">februar</string>
+ <string name="month_long_standalone_march">marec</string>
+ <string name="month_long_standalone_april">april</string>
+ <string name="month_long_standalone_may">maj</string>
+ <string name="month_long_standalone_june">junij</string>
+ <string name="month_long_standalone_july">julij</string>
+ <string name="month_long_standalone_august">avgust</string>
+ <string name="month_long_standalone_september">september</string>
+ <string name="month_long_standalone_october">oktober</string>
+ <string name="month_long_standalone_november">november</string>
+ <string name="month_long_standalone_december">december</string>
+
+ <string name="month_long_january">januar</string>
+ <string name="month_long_february">februar</string>
+ <string name="month_long_march">marec</string>
+ <string name="month_long_april">april</string>
+ <string name="month_long_may">maj</string>
+ <string name="month_long_june">junij</string>
+ <string name="month_long_july">julij</string>
+ <string name="month_long_august">avgust</string>
+ <string name="month_long_september">september</string>
+ <string name="month_long_october">oktober</string>
+ <string name="month_long_november">november</string>
+ <string name="month_long_december">december</string>
+
+ <string name="month_medium_january">jan</string>
+ <string name="month_medium_february">feb</string>
+ <string name="month_medium_march">mar</string>
+ <string name="month_medium_april">apr</string>
+ <string name="month_medium_may">maj</string>
+ <string name="month_medium_june">jun</string>
+ <string name="month_medium_july">jul</string>
+ <string name="month_medium_august">avg</string>
+ <string name="month_medium_september">sep</string>
+ <string name="month_medium_october">okt</string>
+ <string name="month_medium_november">nov</string>
+ <string name="month_medium_december">dec</string>
+
+ <string name="month_shortest_january">j</string>
+ <string name="month_shortest_february">f</string>
+ <string name="month_shortest_march">m</string>
+ <string name="month_shortest_april">a</string>
+ <string name="month_shortest_may">m</string>
+ <string name="month_shortest_june">j</string>
+ <string name="month_shortest_july">j</string>
+ <string name="month_shortest_august">a</string>
+ <string name="month_shortest_september">s</string>
+ <string name="month_shortest_october">o</string>
+ <string name="month_shortest_november">n</string>
+ <string name="month_shortest_december">d</string>
+
+ <string name="day_of_week_long_sunday">nedelja</string>
+ <string name="day_of_week_long_monday">ponedeljek</string>
+ <string name="day_of_week_long_tuesday">torek</string>
+ <string name="day_of_week_long_wednesday">sreda</string>
+ <string name="day_of_week_long_thursday">četrtek</string>
+ <string name="day_of_week_long_friday">petek</string>
+ <string name="day_of_week_long_saturday">sobota</string>
+
+ <string name="day_of_week_medium_sunday">ned</string>
+ <string name="day_of_week_medium_monday">pon</string>
+ <string name="day_of_week_medium_tuesday">tor</string>
+ <string name="day_of_week_medium_wednesday">sre</string>
+ <string name="day_of_week_medium_thursday">čet</string>
+ <string name="day_of_week_medium_friday">pet</string>
+ <string name="day_of_week_medium_saturday">sob</string>
+
+ <string name="day_of_week_short_sunday">ned</string>
+ <string name="day_of_week_short_monday">pon</string>
+ <string name="day_of_week_short_tuesday">tor</string>
+ <string name="day_of_week_short_wednesday">sre</string>
+ <string name="day_of_week_short_thursday">čet</string>
+ <string name="day_of_week_short_friday">pet</string>
+ <string name="day_of_week_short_saturday">sob</string>
+
+ <string name="day_of_week_shortest_sunday">n</string>
+ <string name="day_of_week_shortest_monday">p</string>
+ <string name="day_of_week_shortest_tuesday">t</string>
+ <string name="day_of_week_shortest_wednesday">s</string>
+ <string name="day_of_week_shortest_thursday">č</string>
+ <string name="day_of_week_shortest_friday">p</string>
+ <string name="day_of_week_shortest_saturday">s</string>
+
+ <string name="am">dop.</string>
+ <string name="pm">pop.</string>
+ <string name="yesterday">Včeraj</string>
+ <string name="today">Danes</string>
+ <string name="tomorrow">Jutri</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%-e. %m. %Y</string>
+ <string name="numeric_date_format">d. MM. yyyy</string>
+ <string name="month_day_year">%d. %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e. %b. %Y</string>
+ <string name="abbrev_month_day_year">%-e. %b. %Y</string>
+ <string name="month_day">%-e. %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y %B</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y %b</string>
+</resources>
diff --git a/core/res/res/values-sr-rRS/donottranslate-cldr.xml b/core/res/res/values-sr-rRS/donottranslate-cldr.xml
new file mode 100644
index 0000000..7f98ae2
--- /dev/null
+++ b/core/res/res/values-sr-rRS/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">јануар</string>
+ <string name="month_long_standalone_february">фебруар</string>
+ <string name="month_long_standalone_march">март</string>
+ <string name="month_long_standalone_april">април</string>
+ <string name="month_long_standalone_may">мај</string>
+ <string name="month_long_standalone_june">јун</string>
+ <string name="month_long_standalone_july">јул</string>
+ <string name="month_long_standalone_august">август</string>
+ <string name="month_long_standalone_september">септембар</string>
+ <string name="month_long_standalone_october">октобар</string>
+ <string name="month_long_standalone_november">новембар</string>
+ <string name="month_long_standalone_december">децембар</string>
+
+ <string name="month_long_january">јануар</string>
+ <string name="month_long_february">фебруар</string>
+ <string name="month_long_march">март</string>
+ <string name="month_long_april">април</string>
+ <string name="month_long_may">мај</string>
+ <string name="month_long_june">јун</string>
+ <string name="month_long_july">јул</string>
+ <string name="month_long_august">август</string>
+ <string name="month_long_september">септембар</string>
+ <string name="month_long_october">октобар</string>
+ <string name="month_long_november">новембар</string>
+ <string name="month_long_december">децембар</string>
+
+ <string name="month_medium_january">јан</string>
+ <string name="month_medium_february">феб</string>
+ <string name="month_medium_march">мар</string>
+ <string name="month_medium_april">апр</string>
+ <string name="month_medium_may">мај</string>
+ <string name="month_medium_june">јун</string>
+ <string name="month_medium_july">јул</string>
+ <string name="month_medium_august">авг</string>
+ <string name="month_medium_september">сеп</string>
+ <string name="month_medium_october">окт</string>
+ <string name="month_medium_november">нов</string>
+ <string name="month_medium_december">дец</string>
+
+ <string name="month_shortest_january">ј</string>
+ <string name="month_shortest_february">ф</string>
+ <string name="month_shortest_march">м</string>
+ <string name="month_shortest_april">а</string>
+ <string name="month_shortest_may">м</string>
+ <string name="month_shortest_june">ј</string>
+ <string name="month_shortest_july">ј</string>
+ <string name="month_shortest_august">а</string>
+ <string name="month_shortest_september">с</string>
+ <string name="month_shortest_october">о</string>
+ <string name="month_shortest_november">н</string>
+ <string name="month_shortest_december">д</string>
+
+ <string name="day_of_week_long_sunday">недеља</string>
+ <string name="day_of_week_long_monday">понедељак</string>
+ <string name="day_of_week_long_tuesday">уторак</string>
+ <string name="day_of_week_long_wednesday">среда</string>
+ <string name="day_of_week_long_thursday">четвртак</string>
+ <string name="day_of_week_long_friday">петак</string>
+ <string name="day_of_week_long_saturday">субота</string>
+
+ <string name="day_of_week_medium_sunday">нед</string>
+ <string name="day_of_week_medium_monday">пон</string>
+ <string name="day_of_week_medium_tuesday">уто</string>
+ <string name="day_of_week_medium_wednesday">сре</string>
+ <string name="day_of_week_medium_thursday">чет</string>
+ <string name="day_of_week_medium_friday">пет</string>
+ <string name="day_of_week_medium_saturday">суб</string>
+
+ <string name="day_of_week_short_sunday">нед</string>
+ <string name="day_of_week_short_monday">пон</string>
+ <string name="day_of_week_short_tuesday">уто</string>
+ <string name="day_of_week_short_wednesday">сре</string>
+ <string name="day_of_week_short_thursday">чет</string>
+ <string name="day_of_week_short_friday">пет</string>
+ <string name="day_of_week_short_saturday">суб</string>
+
+ <string name="day_of_week_shortest_sunday">н</string>
+ <string name="day_of_week_shortest_monday">п</string>
+ <string name="day_of_week_shortest_tuesday">у</string>
+ <string name="day_of_week_shortest_wednesday">с</string>
+ <string name="day_of_week_shortest_thursday">ч</string>
+ <string name="day_of_week_shortest_friday">п</string>
+ <string name="day_of_week_shortest_saturday">с</string>
+
+ <string name="am">пре подне</string>
+ <string name="pm">поподне</string>
+ <string name="yesterday">јуче</string>
+ <string name="today">данас</string>
+ <string name="tomorrow">сутра</string>
+
+ <string name="hour_minute_ampm">%H.%M</string>
+ <string name="hour_minute_cap_ampm">%H.%M</string>
+ <string name="numeric_date">%-e.%-m.%Y.</string>
+ <string name="numeric_date_format">d.M.yyyy.</string>
+ <string name="month_day_year">%d. %B %Y.</string>
+ <string name="time_of_day">%H.%M.%S</string>
+ <string name="date_and_time">%H.%M.%S %d.%m.%Y.</string>
+ <string name="abbrev_month_day_year">%d.%m.%Y.</string>
+ <string name="month_day">%B %-e.</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y %B</string>
+ <string name="abbrev_month_day">%b %-e.</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b. %Y</string>
+</resources>
diff --git a/core/res/res/values-sv-rSE/donottranslate-cldr.xml b/core/res/res/values-sv-rSE/donottranslate-cldr.xml
new file mode 100644
index 0000000..4570245
--- /dev/null
+++ b/core/res/res/values-sv-rSE/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">januari</string>
+ <string name="month_long_standalone_february">februari</string>
+ <string name="month_long_standalone_march">mars</string>
+ <string name="month_long_standalone_april">april</string>
+ <string name="month_long_standalone_may">maj</string>
+ <string name="month_long_standalone_june">juni</string>
+ <string name="month_long_standalone_july">juli</string>
+ <string name="month_long_standalone_august">augusti</string>
+ <string name="month_long_standalone_september">september</string>
+ <string name="month_long_standalone_october">oktober</string>
+ <string name="month_long_standalone_november">november</string>
+ <string name="month_long_standalone_december">december</string>
+
+ <string name="month_long_january">januari</string>
+ <string name="month_long_february">februari</string>
+ <string name="month_long_march">mars</string>
+ <string name="month_long_april">april</string>
+ <string name="month_long_may">maj</string>
+ <string name="month_long_june">juni</string>
+ <string name="month_long_july">juli</string>
+ <string name="month_long_august">augusti</string>
+ <string name="month_long_september">september</string>
+ <string name="month_long_october">oktober</string>
+ <string name="month_long_november">november</string>
+ <string name="month_long_december">december</string>
+
+ <string name="month_medium_january">jan</string>
+ <string name="month_medium_february">feb</string>
+ <string name="month_medium_march">mar</string>
+ <string name="month_medium_april">apr</string>
+ <string name="month_medium_may">maj</string>
+ <string name="month_medium_june">jun</string>
+ <string name="month_medium_july">jul</string>
+ <string name="month_medium_august">aug</string>
+ <string name="month_medium_september">sep</string>
+ <string name="month_medium_october">okt</string>
+ <string name="month_medium_november">nov</string>
+ <string name="month_medium_december">dec</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">söndag</string>
+ <string name="day_of_week_long_monday">måndag</string>
+ <string name="day_of_week_long_tuesday">tisdag</string>
+ <string name="day_of_week_long_wednesday">onsdag</string>
+ <string name="day_of_week_long_thursday">torsdag</string>
+ <string name="day_of_week_long_friday">fredag</string>
+ <string name="day_of_week_long_saturday">lördag</string>
+
+ <string name="day_of_week_medium_sunday">sön</string>
+ <string name="day_of_week_medium_monday">mån</string>
+ <string name="day_of_week_medium_tuesday">tis</string>
+ <string name="day_of_week_medium_wednesday">ons</string>
+ <string name="day_of_week_medium_thursday">tors</string>
+ <string name="day_of_week_medium_friday">fre</string>
+ <string name="day_of_week_medium_saturday">lör</string>
+
+ <string name="day_of_week_short_sunday">sön</string>
+ <string name="day_of_week_short_monday">mån</string>
+ <string name="day_of_week_short_tuesday">tis</string>
+ <string name="day_of_week_short_wednesday">ons</string>
+ <string name="day_of_week_short_thursday">tors</string>
+ <string name="day_of_week_short_friday">fre</string>
+ <string name="day_of_week_short_saturday">lör</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">O</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">L</string>
+
+ <string name="am">f.m.</string>
+ <string name="pm">e.m.</string>
+ <string name="yesterday">igår</string>
+ <string name="today">idag</string>
+ <string name="tomorrow">imorgon</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%Y-%m-%d</string>
+ <string name="numeric_date_format">yyyy-MM-dd</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e %b %Y</string>
+ <string name="abbrev_month_day_year">%-e %b %Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y %B</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y %b</string>
+</resources>
diff --git a/core/res/res/values-th-rTH/donottranslate-cldr.xml b/core/res/res/values-th-rTH/donottranslate-cldr.xml
new file mode 100644
index 0000000..cc680f6
--- /dev/null
+++ b/core/res/res/values-th-rTH/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">มกราคม</string>
+ <string name="month_long_standalone_february">กุมภาพันธ์</string>
+ <string name="month_long_standalone_march">มีนาคม</string>
+ <string name="month_long_standalone_april">เมษายน</string>
+ <string name="month_long_standalone_may">พฤษภาคม</string>
+ <string name="month_long_standalone_june">มิถุนายน</string>
+ <string name="month_long_standalone_july">กรกฎาคม</string>
+ <string name="month_long_standalone_august">สิงหาคม</string>
+ <string name="month_long_standalone_september">กันยายน</string>
+ <string name="month_long_standalone_october">ตุลาคม</string>
+ <string name="month_long_standalone_november">พฤศจิกายน</string>
+ <string name="month_long_standalone_december">ธันวาคม</string>
+
+ <string name="month_long_january">มกราคม</string>
+ <string name="month_long_february">กุมภาพันธ์</string>
+ <string name="month_long_march">มีนาคม</string>
+ <string name="month_long_april">เมษายน</string>
+ <string name="month_long_may">พฤษภาคม</string>
+ <string name="month_long_june">มิถุนายน</string>
+ <string name="month_long_july">กรกฎาคม</string>
+ <string name="month_long_august">สิงหาคม</string>
+ <string name="month_long_september">กันยายน</string>
+ <string name="month_long_october">ตุลาคม</string>
+ <string name="month_long_november">พฤศจิกายน</string>
+ <string name="month_long_december">ธันวาคม</string>
+
+ <string name="month_medium_january">ม.ค.</string>
+ <string name="month_medium_february">ก.พ.</string>
+ <string name="month_medium_march">มี.ค.</string>
+ <string name="month_medium_april">เม.ย.</string>
+ <string name="month_medium_may">พ.ค.</string>
+ <string name="month_medium_june">มิ.ย.</string>
+ <string name="month_medium_july">ก.ค.</string>
+ <string name="month_medium_august">ส.ค.</string>
+ <string name="month_medium_september">ก.ย.</string>
+ <string name="month_medium_october">ต.ค.</string>
+ <string name="month_medium_november">พ.ย.</string>
+ <string name="month_medium_december">ธ.ค.</string>
+
+ <string name="month_shortest_january">ม.ค.</string>
+ <string name="month_shortest_february">ก.พ.</string>
+ <string name="month_shortest_march">มี.ค.</string>
+ <string name="month_shortest_april">เม.ย.</string>
+ <string name="month_shortest_may">พ.ค.</string>
+ <string name="month_shortest_june">มิ.ย.</string>
+ <string name="month_shortest_july">ก.ค.</string>
+ <string name="month_shortest_august">ส.ค.</string>
+ <string name="month_shortest_september">ก.ย.</string>
+ <string name="month_shortest_october">ต.ค.</string>
+ <string name="month_shortest_november">พ.ย.</string>
+ <string name="month_shortest_december">ธ.ค.</string>
+
+ <string name="day_of_week_long_sunday">วันอาทิตย์</string>
+ <string name="day_of_week_long_monday">วันจันทร์</string>
+ <string name="day_of_week_long_tuesday">วันอังคาร</string>
+ <string name="day_of_week_long_wednesday">วันพุธ</string>
+ <string name="day_of_week_long_thursday">วันพฤหัสบดี</string>
+ <string name="day_of_week_long_friday">วันศุกร์</string>
+ <string name="day_of_week_long_saturday">วันเสาร์</string>
+
+ <string name="day_of_week_medium_sunday">อา.</string>
+ <string name="day_of_week_medium_monday">จ.</string>
+ <string name="day_of_week_medium_tuesday">อ.</string>
+ <string name="day_of_week_medium_wednesday">พ.</string>
+ <string name="day_of_week_medium_thursday">พฤ.</string>
+ <string name="day_of_week_medium_friday">ศ.</string>
+ <string name="day_of_week_medium_saturday">ส.</string>
+
+ <string name="day_of_week_short_sunday">อา.</string>
+ <string name="day_of_week_short_monday">จ.</string>
+ <string name="day_of_week_short_tuesday">อ.</string>
+ <string name="day_of_week_short_wednesday">พ.</string>
+ <string name="day_of_week_short_thursday">พฤ.</string>
+ <string name="day_of_week_short_friday">ศ.</string>
+ <string name="day_of_week_short_saturday">ส.</string>
+
+ <string name="day_of_week_shortest_sunday">อ</string>
+ <string name="day_of_week_shortest_monday">จ</string>
+ <string name="day_of_week_shortest_tuesday">อ</string>
+ <string name="day_of_week_shortest_wednesday">พ</string>
+ <string name="day_of_week_shortest_thursday">พ</string>
+ <string name="day_of_week_shortest_friday">ศ</string>
+ <string name="day_of_week_shortest_saturday">ส</string>
+
+ <string name="am">ก่อนเที่ยง</string>
+ <string name="pm">หลังเที่ยง</string>
+ <string name="yesterday">เมื่อวาน</string>
+ <string name="today">วันนี้</string>
+ <string name="tomorrow">พรุ่งนี้</string>
+
+ <string name="hour_minute_ampm">%-k:%M</string>
+ <string name="hour_minute_cap_ampm">%-k:%M</string>
+ <string name="numeric_date">%-e/%-m/%Y</string>
+ <string name="numeric_date_format">d/M/yyyy</string>
+ <string name="month_day_year">%-e %B %Y</string>
+ <string name="time_of_day">%-k:%M:%S</string>
+ <string name="date_and_time">%-k:%M:%S, %-e %b %Y</string>
+ <string name="abbrev_month_day_year">%-e %b %Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-tr-rTR/donottranslate-cldr.xml b/core/res/res/values-tr-rTR/donottranslate-cldr.xml
new file mode 100644
index 0000000..acc0121
--- /dev/null
+++ b/core/res/res/values-tr-rTR/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Ocak</string>
+ <string name="month_long_standalone_february">Şubat</string>
+ <string name="month_long_standalone_march">Mart</string>
+ <string name="month_long_standalone_april">Nisan</string>
+ <string name="month_long_standalone_may">Mayıs</string>
+ <string name="month_long_standalone_june">Haziran</string>
+ <string name="month_long_standalone_july">Temmuz</string>
+ <string name="month_long_standalone_august">Ağustos</string>
+ <string name="month_long_standalone_september">Eylül</string>
+ <string name="month_long_standalone_october">Ekim</string>
+ <string name="month_long_standalone_november">Kasım</string>
+ <string name="month_long_standalone_december">Aralık</string>
+
+ <string name="month_long_january">Ocak</string>
+ <string name="month_long_february">Şubat</string>
+ <string name="month_long_march">Mart</string>
+ <string name="month_long_april">Nisan</string>
+ <string name="month_long_may">Mayıs</string>
+ <string name="month_long_june">Haziran</string>
+ <string name="month_long_july">Temmuz</string>
+ <string name="month_long_august">Ağustos</string>
+ <string name="month_long_september">Eylül</string>
+ <string name="month_long_october">Ekim</string>
+ <string name="month_long_november">Kasım</string>
+ <string name="month_long_december">Aralık</string>
+
+ <string name="month_medium_january">Oca</string>
+ <string name="month_medium_february">Şub</string>
+ <string name="month_medium_march">Mar</string>
+ <string name="month_medium_april">Nis</string>
+ <string name="month_medium_may">May</string>
+ <string name="month_medium_june">Haz</string>
+ <string name="month_medium_july">Tem</string>
+ <string name="month_medium_august">Ağu</string>
+ <string name="month_medium_september">Eyl</string>
+ <string name="month_medium_october">Eki</string>
+ <string name="month_medium_november">Kas</string>
+ <string name="month_medium_december">Ara</string>
+
+ <string name="month_shortest_january">O</string>
+ <string name="month_shortest_february">Ş</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">N</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">H</string>
+ <string name="month_shortest_july">T</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">E</string>
+ <string name="month_shortest_october">E</string>
+ <string name="month_shortest_november">K</string>
+ <string name="month_shortest_december">A</string>
+
+ <string name="day_of_week_long_sunday">Pazar</string>
+ <string name="day_of_week_long_monday">Pazartesi</string>
+ <string name="day_of_week_long_tuesday">Salı</string>
+ <string name="day_of_week_long_wednesday">Çarşamba</string>
+ <string name="day_of_week_long_thursday">Perşembe</string>
+ <string name="day_of_week_long_friday">Cuma</string>
+ <string name="day_of_week_long_saturday">Cumartesi</string>
+
+ <string name="day_of_week_medium_sunday">Paz</string>
+ <string name="day_of_week_medium_monday">Pzt</string>
+ <string name="day_of_week_medium_tuesday">Sal</string>
+ <string name="day_of_week_medium_wednesday">Çar</string>
+ <string name="day_of_week_medium_thursday">Per</string>
+ <string name="day_of_week_medium_friday">Cum</string>
+ <string name="day_of_week_medium_saturday">Cmt</string>
+
+ <string name="day_of_week_short_sunday">Paz</string>
+ <string name="day_of_week_short_monday">Pzt</string>
+ <string name="day_of_week_short_tuesday">Sal</string>
+ <string name="day_of_week_short_wednesday">Çar</string>
+ <string name="day_of_week_short_thursday">Per</string>
+ <string name="day_of_week_short_friday">Cum</string>
+ <string name="day_of_week_short_saturday">Cmt</string>
+
+ <string name="day_of_week_shortest_sunday">P</string>
+ <string name="day_of_week_shortest_monday">P</string>
+ <string name="day_of_week_shortest_tuesday">S</string>
+ <string name="day_of_week_shortest_wednesday">Ç</string>
+ <string name="day_of_week_shortest_thursday">P</string>
+ <string name="day_of_week_shortest_friday">C</string>
+ <string name="day_of_week_shortest_saturday">C</string>
+
+ <string name="am">AM</string>
+ <string name="pm">PM</string>
+ <string name="yesterday">Dün</string>
+ <string name="today">Bugün</string>
+ <string name="tomorrow">Yarın</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d %m %Y</string>
+ <string name="numeric_date_format">dd MM yyyy</string>
+ <string name="month_day_year">%d %B %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %d %b %Y</string>
+ <string name="abbrev_month_day_year">%d %b %Y</string>
+ <string name="month_day">%d %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%d %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-uk-rUA/donottranslate-cldr.xml b/core/res/res/values-uk-rUA/donottranslate-cldr.xml
new file mode 100644
index 0000000..888df36
--- /dev/null
+++ b/core/res/res/values-uk-rUA/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">Січень</string>
+ <string name="month_long_standalone_february">Лютий</string>
+ <string name="month_long_standalone_march">Березень</string>
+ <string name="month_long_standalone_april">Квітень</string>
+ <string name="month_long_standalone_may">Травень</string>
+ <string name="month_long_standalone_june">Червень</string>
+ <string name="month_long_standalone_july">Липень</string>
+ <string name="month_long_standalone_august">Серпень</string>
+ <string name="month_long_standalone_september">Вересень</string>
+ <string name="month_long_standalone_october">Жовтень</string>
+ <string name="month_long_standalone_november">Листопад</string>
+ <string name="month_long_standalone_december">Грудень</string>
+
+ <string name="month_long_january">січня</string>
+ <string name="month_long_february">лютого</string>
+ <string name="month_long_march">березня</string>
+ <string name="month_long_april">квітня</string>
+ <string name="month_long_may">травня</string>
+ <string name="month_long_june">червня</string>
+ <string name="month_long_july">липня</string>
+ <string name="month_long_august">серпня</string>
+ <string name="month_long_september">вересня</string>
+ <string name="month_long_october">жовтня</string>
+ <string name="month_long_november">листопада</string>
+ <string name="month_long_december">грудня</string>
+
+ <string name="month_medium_january">січ.</string>
+ <string name="month_medium_february">лют.</string>
+ <string name="month_medium_march">бер.</string>
+ <string name="month_medium_april">квіт.</string>
+ <string name="month_medium_may">трав.</string>
+ <string name="month_medium_june">черв.</string>
+ <string name="month_medium_july">лип.</string>
+ <string name="month_medium_august">серп.</string>
+ <string name="month_medium_september">вер.</string>
+ <string name="month_medium_october">жовт.</string>
+ <string name="month_medium_november">лист.</string>
+ <string name="month_medium_december">груд.</string>
+
+ <string name="month_shortest_january">С</string>
+ <string name="month_shortest_february">Л</string>
+ <string name="month_shortest_march">Б</string>
+ <string name="month_shortest_april">К</string>
+ <string name="month_shortest_may">Т</string>
+ <string name="month_shortest_june">Ч</string>
+ <string name="month_shortest_july">Л</string>
+ <string name="month_shortest_august">С</string>
+ <string name="month_shortest_september">В</string>
+ <string name="month_shortest_october">Ж</string>
+ <string name="month_shortest_november">Л</string>
+ <string name="month_shortest_december">Г</string>
+
+ <string name="day_of_week_long_sunday">Неділя</string>
+ <string name="day_of_week_long_monday">Понеділок</string>
+ <string name="day_of_week_long_tuesday">Вівторок</string>
+ <string name="day_of_week_long_wednesday">Середа</string>
+ <string name="day_of_week_long_thursday">Четвер</string>
+ <string name="day_of_week_long_friday">Пʼятниця</string>
+ <string name="day_of_week_long_saturday">Субота</string>
+
+ <string name="day_of_week_medium_sunday">Нд</string>
+ <string name="day_of_week_medium_monday">Пн</string>
+ <string name="day_of_week_medium_tuesday">Вт</string>
+ <string name="day_of_week_medium_wednesday">Ср</string>
+ <string name="day_of_week_medium_thursday">Чт</string>
+ <string name="day_of_week_medium_friday">Пт</string>
+ <string name="day_of_week_medium_saturday">Сб</string>
+
+ <string name="day_of_week_short_sunday">Нд</string>
+ <string name="day_of_week_short_monday">Пн</string>
+ <string name="day_of_week_short_tuesday">Вт</string>
+ <string name="day_of_week_short_wednesday">Ср</string>
+ <string name="day_of_week_short_thursday">Чт</string>
+ <string name="day_of_week_short_friday">Пт</string>
+ <string name="day_of_week_short_saturday">Сб</string>
+
+ <string name="day_of_week_shortest_sunday">Н</string>
+ <string name="day_of_week_shortest_monday">П</string>
+ <string name="day_of_week_shortest_tuesday">В</string>
+ <string name="day_of_week_shortest_wednesday">С</string>
+ <string name="day_of_week_shortest_thursday">Ч</string>
+ <string name="day_of_week_shortest_friday">П</string>
+ <string name="day_of_week_shortest_saturday">С</string>
+
+ <string name="am">дп</string>
+ <string name="pm">пп</string>
+ <string name="yesterday">Вчора</string>
+ <string name="today">Сьогодні</string>
+ <string name="tomorrow">Завтра</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d.%m.%Y</string>
+ <string name="numeric_date_format">dd.MM.yyyy</string>
+ <string name="month_day_year">%-e %B %Y р.</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%H:%M:%S %-e %b %Y</string>
+ <string name="abbrev_month_day_year">%-e %b %Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%-B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%-b %Y</string>
+</resources>
diff --git a/core/res/res/values-vi-rVN/donottranslate-cldr.xml b/core/res/res/values-vi-rVN/donottranslate-cldr.xml
new file mode 100644
index 0000000..2a28b32
--- /dev/null
+++ b/core/res/res/values-vi-rVN/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">tháng một</string>
+ <string name="month_long_standalone_february">tháng hai</string>
+ <string name="month_long_standalone_march">tháng ba</string>
+ <string name="month_long_standalone_april">tháng tư</string>
+ <string name="month_long_standalone_may">tháng năm</string>
+ <string name="month_long_standalone_june">tháng sáu</string>
+ <string name="month_long_standalone_july">tháng bảy</string>
+ <string name="month_long_standalone_august">tháng tám</string>
+ <string name="month_long_standalone_september">tháng chín</string>
+ <string name="month_long_standalone_october">tháng mười</string>
+ <string name="month_long_standalone_november">tháng mười một</string>
+ <string name="month_long_standalone_december">tháng mười hai</string>
+
+ <string name="month_long_january">tháng một</string>
+ <string name="month_long_february">tháng hai</string>
+ <string name="month_long_march">tháng ba</string>
+ <string name="month_long_april">tháng tư</string>
+ <string name="month_long_may">tháng năm</string>
+ <string name="month_long_june">tháng sáu</string>
+ <string name="month_long_july">tháng bảy</string>
+ <string name="month_long_august">tháng tám</string>
+ <string name="month_long_september">tháng chín</string>
+ <string name="month_long_october">tháng mười</string>
+ <string name="month_long_november">tháng mười một</string>
+ <string name="month_long_december">tháng mười hai</string>
+
+ <string name="month_medium_january">thg 1</string>
+ <string name="month_medium_february">thg 2</string>
+ <string name="month_medium_march">thg 3</string>
+ <string name="month_medium_april">thg 4</string>
+ <string name="month_medium_may">thg 5</string>
+ <string name="month_medium_june">thg 6</string>
+ <string name="month_medium_july">thg 7</string>
+ <string name="month_medium_august">thg 8</string>
+ <string name="month_medium_september">thg 9</string>
+ <string name="month_medium_october">thg 10</string>
+ <string name="month_medium_november">thg 11</string>
+ <string name="month_medium_december">thg 12</string>
+
+ <string name="month_shortest_january">1</string>
+ <string name="month_shortest_february">2</string>
+ <string name="month_shortest_march">3</string>
+ <string name="month_shortest_april">4</string>
+ <string name="month_shortest_may">5</string>
+ <string name="month_shortest_june">6</string>
+ <string name="month_shortest_july">7</string>
+ <string name="month_shortest_august">8</string>
+ <string name="month_shortest_september">9</string>
+ <string name="month_shortest_october">10</string>
+ <string name="month_shortest_november">11</string>
+ <string name="month_shortest_december">12</string>
+
+ <string name="day_of_week_long_sunday">Chủ nhật</string>
+ <string name="day_of_week_long_monday">Thứ hai</string>
+ <string name="day_of_week_long_tuesday">Thứ ba</string>
+ <string name="day_of_week_long_wednesday">Thứ tư</string>
+ <string name="day_of_week_long_thursday">Thứ năm</string>
+ <string name="day_of_week_long_friday">Thứ sáu</string>
+ <string name="day_of_week_long_saturday">Thứ bảy</string>
+
+ <string name="day_of_week_medium_sunday">CN</string>
+ <string name="day_of_week_medium_monday">Th 2</string>
+ <string name="day_of_week_medium_tuesday">Th 3</string>
+ <string name="day_of_week_medium_wednesday">Th 4</string>
+ <string name="day_of_week_medium_thursday">Th 5</string>
+ <string name="day_of_week_medium_friday">Th 6</string>
+ <string name="day_of_week_medium_saturday">Th 7</string>
+
+ <string name="day_of_week_short_sunday">CN</string>
+ <string name="day_of_week_short_monday">Th 2</string>
+ <string name="day_of_week_short_tuesday">Th 3</string>
+ <string name="day_of_week_short_wednesday">Th 4</string>
+ <string name="day_of_week_short_thursday">Th 5</string>
+ <string name="day_of_week_short_friday">Th 6</string>
+ <string name="day_of_week_short_saturday">Th 7</string>
+
+ <string name="day_of_week_shortest_sunday">1</string>
+ <string name="day_of_week_shortest_monday">2</string>
+ <string name="day_of_week_shortest_tuesday">3</string>
+ <string name="day_of_week_shortest_wednesday">4</string>
+ <string name="day_of_week_shortest_thursday">5</string>
+ <string name="day_of_week_shortest_friday">6</string>
+ <string name="day_of_week_shortest_saturday">7</string>
+
+ <string name="am">SA</string>
+ <string name="pm">CH</string>
+ <string name="yesterday">Yesterday</string>
+ <string name="today">Today</string>
+ <string name="tomorrow">Tomorrow</string>
+
+ <string name="hour_minute_ampm">%H:%M</string>
+ <string name="hour_minute_cap_ampm">%H:%M</string>
+ <string name="numeric_date">%d/%m/%Y</string>
+ <string name="numeric_date_format">dd/MM/yyyy</string>
+ <string name="month_day_year">Ngày %d tháng %-m năm %Y</string>
+ <string name="time_of_day">%H:%M:%S</string>
+ <string name="date_and_time">%d-%m-%Y %H:%M:%S</string>
+ <string name="abbrev_month_day_year">%d-%m-%Y</string>
+ <string name="month_day">%-e %B</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%-e %b</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values-zh-rCN/donottranslate-cldr.xml b/core/res/res/values-zh-rCN/donottranslate-cldr.xml
new file mode 100644
index 0000000..18e37a9
--- /dev/null
+++ b/core/res/res/values-zh-rCN/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">一月</string>
+ <string name="month_long_standalone_february">二月</string>
+ <string name="month_long_standalone_march">三月</string>
+ <string name="month_long_standalone_april">四月</string>
+ <string name="month_long_standalone_may">五月</string>
+ <string name="month_long_standalone_june">六月</string>
+ <string name="month_long_standalone_july">七月</string>
+ <string name="month_long_standalone_august">八月</string>
+ <string name="month_long_standalone_september">九月</string>
+ <string name="month_long_standalone_october">十月</string>
+ <string name="month_long_standalone_november">十一月</string>
+ <string name="month_long_standalone_december">十二月</string>
+
+ <string name="month_long_january">1月</string>
+ <string name="month_long_february">2月</string>
+ <string name="month_long_march">3月</string>
+ <string name="month_long_april">4月</string>
+ <string name="month_long_may">5月</string>
+ <string name="month_long_june">6月</string>
+ <string name="month_long_july">7月</string>
+ <string name="month_long_august">8月</string>
+ <string name="month_long_september">9月</string>
+ <string name="month_long_october">10月</string>
+ <string name="month_long_november">11月</string>
+ <string name="month_long_december">12月</string>
+
+ <string name="month_medium_january">1月</string>
+ <string name="month_medium_february">2月</string>
+ <string name="month_medium_march">3月</string>
+ <string name="month_medium_april">4月</string>
+ <string name="month_medium_may">5月</string>
+ <string name="month_medium_june">6月</string>
+ <string name="month_medium_july">7月</string>
+ <string name="month_medium_august">8月</string>
+ <string name="month_medium_september">9月</string>
+ <string name="month_medium_october">10月</string>
+ <string name="month_medium_november">11月</string>
+ <string name="month_medium_december">12月</string>
+
+ <string name="month_shortest_january">1月</string>
+ <string name="month_shortest_february">2月</string>
+ <string name="month_shortest_march">3月</string>
+ <string name="month_shortest_april">4月</string>
+ <string name="month_shortest_may">5月</string>
+ <string name="month_shortest_june">6月</string>
+ <string name="month_shortest_july">7月</string>
+ <string name="month_shortest_august">8月</string>
+ <string name="month_shortest_september">9月</string>
+ <string name="month_shortest_october">10月</string>
+ <string name="month_shortest_november">11月</string>
+ <string name="month_shortest_december">12月</string>
+
+ <string name="day_of_week_long_sunday">星期日</string>
+ <string name="day_of_week_long_monday">星期一</string>
+ <string name="day_of_week_long_tuesday">星期二</string>
+ <string name="day_of_week_long_wednesday">星期三</string>
+ <string name="day_of_week_long_thursday">星期四</string>
+ <string name="day_of_week_long_friday">星期五</string>
+ <string name="day_of_week_long_saturday">星期六</string>
+
+ <string name="day_of_week_medium_sunday">周日</string>
+ <string name="day_of_week_medium_monday">周一</string>
+ <string name="day_of_week_medium_tuesday">周二</string>
+ <string name="day_of_week_medium_wednesday">周三</string>
+ <string name="day_of_week_medium_thursday">周四</string>
+ <string name="day_of_week_medium_friday">周五</string>
+ <string name="day_of_week_medium_saturday">周六</string>
+
+ <string name="day_of_week_short_sunday">周日</string>
+ <string name="day_of_week_short_monday">周一</string>
+ <string name="day_of_week_short_tuesday">周二</string>
+ <string name="day_of_week_short_wednesday">周三</string>
+ <string name="day_of_week_short_thursday">周四</string>
+ <string name="day_of_week_short_friday">周五</string>
+ <string name="day_of_week_short_saturday">周六</string>
+
+ <string name="day_of_week_shortest_sunday">日</string>
+ <string name="day_of_week_shortest_monday">一</string>
+ <string name="day_of_week_shortest_tuesday">二</string>
+ <string name="day_of_week_shortest_wednesday">三</string>
+ <string name="day_of_week_shortest_thursday">四</string>
+ <string name="day_of_week_shortest_friday">五</string>
+ <string name="day_of_week_shortest_saturday">六</string>
+
+ <string name="am">上午</string>
+ <string name="pm">下午</string>
+ <string name="yesterday">昨天</string>
+ <string name="today">今天</string>
+ <string name="tomorrow">明天</string>
+
+ <string name="hour_minute_ampm">%p%-l:%M</string>
+ <string name="hour_minute_cap_ampm">%^p%-l:%M</string>
+ <string name="numeric_date">%Y-%-m-%-e</string>
+ <string name="numeric_date_format">yyyy-M-d</string>
+ <string name="month_day_year">%Y年%-m月%-e日</string>
+ <string name="time_of_day">%p%I:%M:%S</string>
+ <string name="date_and_time">%p%I:%M:%S %Y-%-m-%-e</string>
+ <string name="abbrev_month_day_year">%Y-%-m-%-e</string>
+ <string name="month_day">%B%-e日</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y年%B</string>
+ <string name="abbrev_month_day">%b%-e日</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y年%b</string>
+</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 54b0b97..ee7b3cd 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -424,9 +424,6 @@
<string name="lockscreen_glogin_password_hint">"密码"</string>
<string name="lockscreen_glogin_submit_button">"登录"</string>
<string name="lockscreen_glogin_invalid_input">"用户名或密码无效。"</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="AMPM">%P</xliff:g><xliff:g id="HOUR">%-l</xliff:g>点"</string>
<string name="hour_cap_ampm">"<xliff:g id="AMPM">%p</xliff:g><xliff:g id="HOUR">%-l</xliff:g>点"</string>
<string name="status_bar_clear_all_button">"清除通知"</string>
@@ -458,9 +455,6 @@
<string name="menu_enter_shortcut_label">"Enter 键"</string>
<string name="menu_delete_shortcut_label">"删除"</string>
<string name="search_go">"搜索"</string>
- <string name="today">"今天"</string>
- <string name="yesterday">"昨天"</string>
- <string name="tomorrow">"明天"</string>
<string name="oneMonthDurationPast">"1 个月前"</string>
<string name="beforeOneMonthDurationPast">"1 个月前"</string>
<plurals name="num_seconds_ago">
@@ -542,13 +536,6 @@
<string name="weeks">"周"</string>
<string name="year">"年"</string>
<string name="years">"年"</string>
- <string name="sunday">"周日"</string>
- <string name="monday">"周一"</string>
- <string name="tuesday">"周二"</string>
- <string name="wednesday">"周三"</string>
- <string name="thursday">"周四"</string>
- <string name="friday">"周五"</string>
- <string name="saturday">"周六"</string>
<string name="every_weekday">"每个工作日(周一到周五)"</string>
<string name="daily">"每天"</string>
<string name="weekly">"每周的<xliff:g id="DAY">%s</xliff:g>"</string>
@@ -558,9 +545,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"抱歉,该视频不适合在此设备上播放。"</string>
<string name="VideoView_error_text_unknown">"很抱歉,此视频不能播放。"</string>
<string name="VideoView_error_button">"确定"</string>
- <string name="am">"上午"</string>
- <string name="pm">"下午"</string>
- <string name="numeric_date">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%m</xliff:g> 月 <xliff:g id="DAY">%d</xliff:g> 日"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="TIME1">%3$s</xliff:g> 至 <xliff:g id="DATE2">%5$s</xliff:g><xliff:g id="WEEKDAY2">%4$s</xliff:g> <xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="DATE1">%2$s</xliff:g><xliff:g id="WEEKDAY1">%1$s</xliff:g>至 <xliff:g id="DATE2">%5$s</xliff:g><xliff:g id="WEEKDAY2">%4$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g> <xliff:g id="TIME1">%3$s</xliff:g> 至 <xliff:g id="DATE2">%5$s</xliff:g> <xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -572,23 +556,12 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g><xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g><xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="WEEKDAY">%2$s</xliff:g> <xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="MONTH">MMMM</xliff:g>' 月 '<xliff:g id="DAY">d</xliff:g>' 日'"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="MONTH">MMMM</xliff:g>' 月 '<xliff:g id="DAY">d</xliff:g>' 日'"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="MONTH">MMM</xliff:g>' 月 '<xliff:g id="DAY">d</xliff:g>' 日'"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="DAY">d</xliff:g>' 月 '<xliff:g id="MONTH">MMM</xliff:g>' 日'"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"中午"</string>
<string name="Noon">"中午"</string>
<string name="midnight">"午夜"</string>
<string name="Midnight">"午夜"</string>
- <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g> 月 <xliff:g id="DAY">%-d</xliff:g> 日"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%B</xliff:g> 月 <xliff:g id="DAY">%-d</xliff:g> 日"</string>
- <string name="month_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%B</xliff:g> 月"</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%B</xliff:g> 月 <xliff:g id="DAY">%-d</xliff:g> 日 <xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2">%8$s</xliff:g> 日"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g>至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="YEAR">%9$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2">%8$s</xliff:g> 日"</string>
@@ -613,82 +586,8 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1">%3$s</xliff:g> 日 <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2">%8$s</xliff:g> 日 <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> 月 <xliff:g id="DAY1_0">%3$s</xliff:g> 日<xliff:g id="WEEKDAY1">%1$s</xliff:g> <xliff:g id="TIME1">%5$s</xliff:g> 至 <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> 月 <xliff:g id="DAY2_1">%8$s</xliff:g> 日<xliff:g id="WEEKDAY2">%6$s</xliff:g> <xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%b</xliff:g> 月 <xliff:g id="DAY">%-d</xliff:g> 日"</string>
- <string name="abbrev_month_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%b</xliff:g> 月"</string>
- <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> 月 <xliff:g id="DAY">%-d</xliff:g> 日"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"周日"</string>
- <string name="day_of_week_long_monday">"周一"</string>
- <string name="day_of_week_long_tuesday">"周二"</string>
- <string name="day_of_week_long_wednesday">"周三"</string>
- <string name="day_of_week_long_thursday">"周四"</string>
- <string name="day_of_week_long_friday">"周五"</string>
- <string name="day_of_week_long_saturday">"周六"</string>
- <string name="day_of_week_medium_sunday">"周日"</string>
- <string name="day_of_week_medium_monday">"周一"</string>
- <string name="day_of_week_medium_tuesday">"周二"</string>
- <string name="day_of_week_medium_wednesday">"周三"</string>
- <string name="day_of_week_medium_thursday">"周四"</string>
- <string name="day_of_week_medium_friday">"周五"</string>
- <string name="day_of_week_medium_saturday">"周六"</string>
- <string name="day_of_week_short_sunday">"周日"</string>
- <string name="day_of_week_short_monday">"周一"</string>
- <string name="day_of_week_short_tuesday">"周二"</string>
- <string name="day_of_week_short_wednesday">"周三"</string>
- <string name="day_of_week_short_thursday">"周四"</string>
- <string name="day_of_week_short_friday">"周五"</string>
- <string name="day_of_week_short_saturday">"周六"</string>
- <string name="day_of_week_shorter_sunday">"周日"</string>
- <string name="day_of_week_shorter_monday">"周一"</string>
- <string name="day_of_week_shorter_tuesday">"周二"</string>
- <string name="day_of_week_shorter_wednesday">"周三"</string>
- <string name="day_of_week_shorter_thursday">"周四"</string>
- <string name="day_of_week_shorter_friday">"周五"</string>
- <string name="day_of_week_shorter_saturday">"周六"</string>
- <string name="day_of_week_shortest_sunday">"周日"</string>
- <string name="day_of_week_shortest_monday">"周一"</string>
- <string name="day_of_week_shortest_tuesday">"周二"</string>
- <string name="day_of_week_shortest_wednesday">"周三"</string>
- <string name="day_of_week_shortest_thursday">"周四"</string>
- <string name="day_of_week_shortest_friday">"周五"</string>
- <string name="day_of_week_shortest_saturday">"周六"</string>
- <string name="month_long_january">"1 月"</string>
- <string name="month_long_february">"2 月"</string>
- <string name="month_long_march">"3 月"</string>
- <string name="month_long_april">"4 月"</string>
- <string name="month_long_may">"5 月"</string>
- <string name="month_long_june">"6 月"</string>
- <string name="month_long_july">"7 月"</string>
- <string name="month_long_august">"8 月"</string>
- <string name="month_long_september">"9 月"</string>
- <string name="month_long_october">"10 月"</string>
- <string name="month_long_november">"11 月"</string>
- <string name="month_long_december">"12 月"</string>
- <string name="month_medium_january">"1 月"</string>
- <string name="month_medium_february">"2 月"</string>
- <string name="month_medium_march">"3 月"</string>
- <string name="month_medium_april">"4 月"</string>
- <string name="month_medium_may">"5 月"</string>
- <string name="month_medium_june">"6 月"</string>
- <string name="month_medium_july">"7 月"</string>
- <string name="month_medium_august">"8 月"</string>
- <string name="month_medium_september">"9 月"</string>
- <string name="month_medium_october">"10 月"</string>
- <string name="month_medium_november">"11 月"</string>
- <string name="month_medium_december">"12 月"</string>
- <string name="month_shortest_january">"1 月"</string>
- <string name="month_shortest_february">"2 月"</string>
- <string name="month_shortest_march">"3 月"</string>
- <string name="month_shortest_april">"4 月"</string>
- <string name="month_shortest_may">"5 月"</string>
- <string name="month_shortest_june">"6 月"</string>
- <string name="month_shortest_july">"7 月"</string>
- <string name="month_shortest_august">"8 月"</string>
- <string name="month_shortest_september">"9 月"</string>
- <string name="month_shortest_october">"10 月"</string>
- <string name="month_shortest_november">"11 月"</string>
- <string name="month_shortest_december">"12 月"</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"全选"</string>
diff --git a/core/res/res/values-zh-rTW/donottranslate-cldr.xml b/core/res/res/values-zh-rTW/donottranslate-cldr.xml
new file mode 100644
index 0000000..18e37a9
--- /dev/null
+++ b/core/res/res/values-zh-rTW/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">一月</string>
+ <string name="month_long_standalone_february">二月</string>
+ <string name="month_long_standalone_march">三月</string>
+ <string name="month_long_standalone_april">四月</string>
+ <string name="month_long_standalone_may">五月</string>
+ <string name="month_long_standalone_june">六月</string>
+ <string name="month_long_standalone_july">七月</string>
+ <string name="month_long_standalone_august">八月</string>
+ <string name="month_long_standalone_september">九月</string>
+ <string name="month_long_standalone_october">十月</string>
+ <string name="month_long_standalone_november">十一月</string>
+ <string name="month_long_standalone_december">十二月</string>
+
+ <string name="month_long_january">1月</string>
+ <string name="month_long_february">2月</string>
+ <string name="month_long_march">3月</string>
+ <string name="month_long_april">4月</string>
+ <string name="month_long_may">5月</string>
+ <string name="month_long_june">6月</string>
+ <string name="month_long_july">7月</string>
+ <string name="month_long_august">8月</string>
+ <string name="month_long_september">9月</string>
+ <string name="month_long_october">10月</string>
+ <string name="month_long_november">11月</string>
+ <string name="month_long_december">12月</string>
+
+ <string name="month_medium_january">1月</string>
+ <string name="month_medium_february">2月</string>
+ <string name="month_medium_march">3月</string>
+ <string name="month_medium_april">4月</string>
+ <string name="month_medium_may">5月</string>
+ <string name="month_medium_june">6月</string>
+ <string name="month_medium_july">7月</string>
+ <string name="month_medium_august">8月</string>
+ <string name="month_medium_september">9月</string>
+ <string name="month_medium_october">10月</string>
+ <string name="month_medium_november">11月</string>
+ <string name="month_medium_december">12月</string>
+
+ <string name="month_shortest_january">1月</string>
+ <string name="month_shortest_february">2月</string>
+ <string name="month_shortest_march">3月</string>
+ <string name="month_shortest_april">4月</string>
+ <string name="month_shortest_may">5月</string>
+ <string name="month_shortest_june">6月</string>
+ <string name="month_shortest_july">7月</string>
+ <string name="month_shortest_august">8月</string>
+ <string name="month_shortest_september">9月</string>
+ <string name="month_shortest_october">10月</string>
+ <string name="month_shortest_november">11月</string>
+ <string name="month_shortest_december">12月</string>
+
+ <string name="day_of_week_long_sunday">星期日</string>
+ <string name="day_of_week_long_monday">星期一</string>
+ <string name="day_of_week_long_tuesday">星期二</string>
+ <string name="day_of_week_long_wednesday">星期三</string>
+ <string name="day_of_week_long_thursday">星期四</string>
+ <string name="day_of_week_long_friday">星期五</string>
+ <string name="day_of_week_long_saturday">星期六</string>
+
+ <string name="day_of_week_medium_sunday">周日</string>
+ <string name="day_of_week_medium_monday">周一</string>
+ <string name="day_of_week_medium_tuesday">周二</string>
+ <string name="day_of_week_medium_wednesday">周三</string>
+ <string name="day_of_week_medium_thursday">周四</string>
+ <string name="day_of_week_medium_friday">周五</string>
+ <string name="day_of_week_medium_saturday">周六</string>
+
+ <string name="day_of_week_short_sunday">周日</string>
+ <string name="day_of_week_short_monday">周一</string>
+ <string name="day_of_week_short_tuesday">周二</string>
+ <string name="day_of_week_short_wednesday">周三</string>
+ <string name="day_of_week_short_thursday">周四</string>
+ <string name="day_of_week_short_friday">周五</string>
+ <string name="day_of_week_short_saturday">周六</string>
+
+ <string name="day_of_week_shortest_sunday">日</string>
+ <string name="day_of_week_shortest_monday">一</string>
+ <string name="day_of_week_shortest_tuesday">二</string>
+ <string name="day_of_week_shortest_wednesday">三</string>
+ <string name="day_of_week_shortest_thursday">四</string>
+ <string name="day_of_week_shortest_friday">五</string>
+ <string name="day_of_week_shortest_saturday">六</string>
+
+ <string name="am">上午</string>
+ <string name="pm">下午</string>
+ <string name="yesterday">昨天</string>
+ <string name="today">今天</string>
+ <string name="tomorrow">明天</string>
+
+ <string name="hour_minute_ampm">%p%-l:%M</string>
+ <string name="hour_minute_cap_ampm">%^p%-l:%M</string>
+ <string name="numeric_date">%Y-%-m-%-e</string>
+ <string name="numeric_date_format">yyyy-M-d</string>
+ <string name="month_day_year">%Y年%-m月%-e日</string>
+ <string name="time_of_day">%p%I:%M:%S</string>
+ <string name="date_and_time">%p%I:%M:%S %Y-%-m-%-e</string>
+ <string name="abbrev_month_day_year">%Y-%-m-%-e</string>
+ <string name="month_day">%B%-e日</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%Y年%B</string>
+ <string name="abbrev_month_day">%b%-e日</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%Y年%b</string>
+</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 514e304..a742228 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -418,9 +418,6 @@
<string name="lockscreen_glogin_password_hint">"密碼"</string>
<string name="lockscreen_glogin_submit_button">"登入"</string>
<string name="lockscreen_glogin_invalid_input">"使用者名稱或密碼錯誤。"</string>
- <string name="status_bar_time_format">"<xliff:g id="HOUR">h</xliff:g>:<xliff:g id="MINUTE">mm</xliff:g> <xliff:g id="AMPM">AA</xliff:g>"</string>
- <string name="hour_minute_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
- <string name="hour_minute_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="status_bar_clear_all_button">"清除通知"</string>
@@ -452,9 +449,6 @@
<string name="menu_enter_shortcut_label">"輸入"</string>
<string name="menu_delete_shortcut_label">"刪除"</string>
<string name="search_go">"搜尋"</string>
- <string name="today">"今天"</string>
- <string name="yesterday">"昨天"</string>
- <string name="tomorrow">"明天"</string>
<string name="oneMonthDurationPast">"1 個月以前"</string>
<string name="beforeOneMonthDurationPast">"1 個月前"</string>
<plurals name="num_seconds_ago">
@@ -536,13 +530,6 @@
<string name="weeks">"週"</string>
<string name="year">"年"</string>
<string name="years">"年"</string>
- <string name="sunday">"星期日"</string>
- <string name="monday">"星期一"</string>
- <string name="tuesday">"星期二"</string>
- <string name="wednesday">"星期三"</string>
- <string name="thursday">"星期四"</string>
- <string name="friday">"星期五"</string>
- <string name="saturday">"星期六"</string>
<string name="every_weekday">"每天 (週一至週五)"</string>
<string name="daily">"每天"</string>
<string name="weekly">"每週<xliff:g id="DAY">%s</xliff:g>"</string>
@@ -552,9 +539,6 @@
<string name="VideoView_error_text_invalid_progressive_playback">"很抱歉,影片格式無效,裝置無法進行串流處理。"</string>
<string name="VideoView_error_text_unknown">"很抱歉,此影片無法播放。"</string>
<string name="VideoView_error_button">"確定"</string>
- <string name="am">"上午"</string>
- <string name="pm">"下午"</string>
- <string name="numeric_date">"<xliff:g id="MONTH">%m</xliff:g>/<xliff:g id="DAY">%d</xliff:g>/<xliff:g id="YEAR">%Y</xliff:g>"</string>
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>,<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>,<xliff:g id="WEEKDAY2">%4$s</xliff:g>,<xliff:g id="TIME2">%6$s</xliff:g>"</string>
<string name="wday1_date1_wday2_date2">"<xliff:g id="DATE1">%2$s</xliff:g>,<xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>,<xliff:g id="WEEKDAY2">%4$s</xliff:g>"</string>
<string name="date1_time1_date2_time2">"<xliff:g id="DATE1">%2$s</xliff:g>,<xliff:g id="TIME1">%3$s</xliff:g> – <xliff:g id="DATE2">%5$s</xliff:g>,<xliff:g id="TIME2">%6$s</xliff:g>"</string>
@@ -566,23 +550,12 @@
<string name="date_time">"<xliff:g id="DATE">%1$s</xliff:g>,<xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>,<xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="time_wday">"<xliff:g id="WEEKDAY">%2$s</xliff:g>,<xliff:g id="TIME_RANGE">%1$s</xliff:g>"</string>
- <string name="full_date_month_first" format="date">"<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>','<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="full_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="MONTH">MMMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>' 日'"</string>
- <string name="medium_date_month_first" format="date">"<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>','<xliff:g id="YEAR">yyyy</xliff:g>"</string>
- <string name="medium_date_day_first" format="date">"<xliff:g id="YEAR">yyyy</xliff:g>' 年 '<xliff:g id="MONTH">MMM</xliff:g>' '<xliff:g id="DAY">d</xliff:g>' 日'"</string>
- <string name="twelve_hour_time_format" format="date">"<xliff:g id="HOUR">h</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>' '<xliff:g id="AMPM">a</xliff:g>"</string>
- <string name="twenty_four_hour_time_format" format="date">"<xliff:g id="HOUR">HH</xliff:g>':'<xliff:g id="MINUTE">mm</xliff:g>"</string>
<string name="noon">"中午"</string>
<string name="Noon">"中午"</string>
<string name="midnight">"午夜"</string>
<string name="Midnight">"午夜"</string>
- <string name="month_day">"<xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日"</string>
<!-- no translation found for month (7026169712234774086) -->
<skip />
- <string name="month_day_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日"</string>
- <string name="month_year">"<xliff:g id="YEAR">%Y</xliff:g> 年<xliff:g id="MONTH">%B</xliff:g>"</string>
- <string name="time_of_day">"<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
- <string name="date_and_time">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%B</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日,<xliff:g id="HOUR">%H</xliff:g>:<xliff:g id="MINUTE">%M</xliff:g>:<xliff:g id="SECOND">%S</xliff:g>"</string>
<string name="same_year_md1_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g>"</string>
<string name="same_year_wday1_md1_wday2_md2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> 日,<xliff:g id="WEEKDAY1">%1$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> 日,<xliff:g id="WEEKDAY2">%6$s</xliff:g>"</string>
<string name="same_year_mdy1_mdy2">"<xliff:g id="YEAR">%9$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> 日 – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g> 日"</string>
@@ -607,82 +580,8 @@
<string name="same_month_wday1_md1_time1_wday2_md2_time2">"<xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> 日,<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> 日,<xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_mdy1_time1_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1">%3$s</xliff:g> 日 <xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2">%8$s</xliff:g> 日 <xliff:g id="TIME2">%10$s</xliff:g>"</string>
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="YEAR1">%4$s</xliff:g> 年 <xliff:g id="MONTH1">%2$s</xliff:g> <xliff:g id="DAY1_0">%3$s</xliff:g> 日,<xliff:g id="WEEKDAY1">%1$s</xliff:g>,<xliff:g id="TIME1">%5$s</xliff:g> – <xliff:g id="YEAR2">%9$s</xliff:g> 年 <xliff:g id="MONTH2">%7$s</xliff:g> <xliff:g id="DAY2_1">%8$s</xliff:g> 日,<xliff:g id="WEEKDAY2">%6$s</xliff:g>,<xliff:g id="TIME2">%10$s</xliff:g>"</string>
- <string name="abbrev_month_day_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日"</string>
- <string name="abbrev_month_year">"<xliff:g id="YEAR">%Y</xliff:g> 年 <xliff:g id="MONTH">%b</xliff:g>"</string>
- <string name="abbrev_month_day">"<xliff:g id="MONTH">%b</xliff:g> <xliff:g id="DAY">%-d</xliff:g> 日"</string>
<!-- no translation found for abbrev_month (3131032032850777433) -->
<skip />
- <string name="day_of_week_long_sunday">"星期日"</string>
- <string name="day_of_week_long_monday">"星期一"</string>
- <string name="day_of_week_long_tuesday">"星期二"</string>
- <string name="day_of_week_long_wednesday">"星期三"</string>
- <string name="day_of_week_long_thursday">"星期四"</string>
- <string name="day_of_week_long_friday">"星期五"</string>
- <string name="day_of_week_long_saturday">"星期六"</string>
- <string name="day_of_week_medium_sunday">"週日"</string>
- <string name="day_of_week_medium_monday">"週一"</string>
- <string name="day_of_week_medium_tuesday">"週二"</string>
- <string name="day_of_week_medium_wednesday">"週三"</string>
- <string name="day_of_week_medium_thursday">"週四"</string>
- <string name="day_of_week_medium_friday">"五"</string>
- <string name="day_of_week_medium_saturday">"週六"</string>
- <string name="day_of_week_short_sunday">"日"</string>
- <string name="day_of_week_short_monday">"一"</string>
- <string name="day_of_week_short_tuesday">"二"</string>
- <string name="day_of_week_short_wednesday">"三"</string>
- <string name="day_of_week_short_thursday">"週四"</string>
- <string name="day_of_week_short_friday">"五"</string>
- <string name="day_of_week_short_saturday">"六"</string>
- <string name="day_of_week_shorter_sunday">"日"</string>
- <string name="day_of_week_shorter_monday">"一"</string>
- <string name="day_of_week_shorter_tuesday">"二"</string>
- <string name="day_of_week_shorter_wednesday">"三"</string>
- <string name="day_of_week_shorter_thursday">"四"</string>
- <string name="day_of_week_shorter_friday">"五"</string>
- <string name="day_of_week_shorter_saturday">"六"</string>
- <string name="day_of_week_shortest_sunday">"日"</string>
- <string name="day_of_week_shortest_monday">"一"</string>
- <string name="day_of_week_shortest_tuesday">"二"</string>
- <string name="day_of_week_shortest_wednesday">"三"</string>
- <string name="day_of_week_shortest_thursday">"四"</string>
- <string name="day_of_week_shortest_friday">"五"</string>
- <string name="day_of_week_shortest_saturday">"六"</string>
- <string name="month_long_january">"1 月"</string>
- <string name="month_long_february">"2 月"</string>
- <string name="month_long_march">"3 月"</string>
- <string name="month_long_april">"4 月"</string>
- <string name="month_long_may">"5 月"</string>
- <string name="month_long_june">"6 月"</string>
- <string name="month_long_july">"7 月"</string>
- <string name="month_long_august">"8 月"</string>
- <string name="month_long_september">"9 月"</string>
- <string name="month_long_october">"10 月"</string>
- <string name="month_long_november">"11 月"</string>
- <string name="month_long_december">"12 月"</string>
- <string name="month_medium_january">"1 月"</string>
- <string name="month_medium_february">"2 月"</string>
- <string name="month_medium_march">"3 月"</string>
- <string name="month_medium_april">"4 月"</string>
- <string name="month_medium_may">"5 月"</string>
- <string name="month_medium_june">"6 月"</string>
- <string name="month_medium_july">"7 月"</string>
- <string name="month_medium_august">"8 月"</string>
- <string name="month_medium_september">"9 月"</string>
- <string name="month_medium_october">"10 月"</string>
- <string name="month_medium_november">"11 月"</string>
- <string name="month_medium_december">"12 月"</string>
- <string name="month_shortest_january">"1"</string>
- <string name="month_shortest_february">"2"</string>
- <string name="month_shortest_march">"3"</string>
- <string name="month_shortest_april">"4"</string>
- <string name="month_shortest_may">"5"</string>
- <string name="month_shortest_june">"6"</string>
- <string name="month_shortest_july">"7"</string>
- <string name="month_shortest_august">"8"</string>
- <string name="month_shortest_september">"9"</string>
- <string name="month_shortest_october">"10"</string>
- <string name="month_shortest_november">"11"</string>
- <string name="month_shortest_december">"12"</string>
<string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll">"全部選取"</string>
diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml
index 7db73f0..eb94812 100644
--- a/core/res/res/values/arrays.xml
+++ b/core/res/res/values/arrays.xml
@@ -110,7 +110,10 @@
<item><xliff:g id="id">alarm_clock</xliff:g></item>
<item><xliff:g id="id">battery</xliff:g></item>
<item><xliff:g id="id">phone_signal</xliff:g></item>
+ <item><xliff:g id="id">phone_evdo_signal</xliff:g></item>
<item><xliff:g id="id">data_connection</xliff:g></item>
+ <item><xliff:g id="id">cdma_eri</xliff:g></item>
+ <item><xliff:g id="id">tty</xliff:g></item>
<item><xliff:g id="id">volume</xliff:g></item>
<item><xliff:g id="id">mute</xliff:g></item>
<item><xliff:g id="id">speakerphone</xliff:g></item>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 40a8af2..60c70cf 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -79,6 +79,9 @@
<attr name="textColorPrimaryInverseNoDisable" format="reference|color" />
<!-- Dim inverse text color. This does not differentiate the disabled state. -->
<attr name="textColorSecondaryInverseNoDisable" format="reference|color" />
+
+ <!-- Text color for urls in search suggestions, used by things like global search and the browser. @hide -->
+ <attr name="textColorSearchUrl" format="reference|color" />
<!-- Text color, typeface, size, and style for "large" text. Defaults to primary text color. -->
<attr name="textAppearanceLarge" format="reference" />
@@ -99,6 +102,7 @@
<!-- Text color, typeface, size, and style for system search result subtitle. Defaults to primary inverse text color. @hide -->
<attr name="textAppearanceSearchResultSubtitle" format="reference" />
+
<!-- Text color, typeface, size, and style for the text inside of a button. -->
<attr name="textAppearanceButton" format="reference" />
@@ -152,8 +156,8 @@
<!-- The preferred list item height -->
<attr name="listPreferredItemHeight" format="dimension" />
<!-- The drawable for the list divider -->
- <!-- The list item height for search results. @hide -->
- <attr name="searchResultListItemHeight" format="dimension" />
+ <!-- The list item height for search results. @hide -->
+ <attr name="searchResultListItemHeight" format="dimension" />
<attr name="listDivider" format="reference" />
<!-- TextView style for list separators. -->
<attr name="listSeparatorTextViewStyle" format="reference" />
@@ -663,9 +667,9 @@
<attr name="x" format="dimension" />
<!-- A coordinate in the Y dimension. -->
<attr name="y" format="dimension" />
-
- <!-- Specifies how to place an object, both
- its x and y axis, within a larger containing object. -->
+
+ <!-- Specifies how to place the content of an object, both
+ on the x and y axis, within the object itself. -->
<attr name="gravity">
<!-- Push object to the top of its container, not changing its size. -->
<flag name="top" value="0x30" />
@@ -721,8 +725,7 @@
<attr name="entries" format="reference" />
<!-- Standard gravity constant that a child can supply to its parent.
- Defines how to place an object, both
- its x and y axis, within a larger containing object. -->
+ Defines how to place the view, both its x and y axis, within its parent view group. -->
<attr name="layout_gravity">
<!-- Push object to the top of its container, not changing its size. -->
<flag name="top" value="0x30" />
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index 8150067..96369f4 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -73,5 +73,8 @@
<color name="perms_normal_grp_color">#eeeeee</color>
<color name="perms_normal_perm_color">#c0c0c0</color>
+ <!-- For search-related UIs -->
+ <color name="search_url_text">#7fa87f</color>
+
</resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 83ac8e2..f655b27 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -34,4 +34,8 @@
<!-- The duration (in milliseconds) of a long animation. -->
<integer name="config_longAnimTime">300</integer>
+
+ <!-- Flag indicating whether Last Name comes before First Name.
+ This becomes true in Japan, for example.-->
+ <bool name="config_lastname_comes_before_firstname">false</bool>
</resources>
diff --git a/core/res/res/values/donottranslate-cldr.xml b/core/res/res/values/donottranslate-cldr.xml
new file mode 100644
index 0000000..f305948
--- /dev/null
+++ b/core/res/res/values/donottranslate-cldr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="month_long_standalone_january">January</string>
+ <string name="month_long_standalone_february">February</string>
+ <string name="month_long_standalone_march">March</string>
+ <string name="month_long_standalone_april">April</string>
+ <string name="month_long_standalone_may">May</string>
+ <string name="month_long_standalone_june">June</string>
+ <string name="month_long_standalone_july">July</string>
+ <string name="month_long_standalone_august">August</string>
+ <string name="month_long_standalone_september">September</string>
+ <string name="month_long_standalone_october">October</string>
+ <string name="month_long_standalone_november">November</string>
+ <string name="month_long_standalone_december">December</string>
+
+ <string name="month_long_january">January</string>
+ <string name="month_long_february">February</string>
+ <string name="month_long_march">March</string>
+ <string name="month_long_april">April</string>
+ <string name="month_long_may">May</string>
+ <string name="month_long_june">June</string>
+ <string name="month_long_july">July</string>
+ <string name="month_long_august">August</string>
+ <string name="month_long_september">September</string>
+ <string name="month_long_october">October</string>
+ <string name="month_long_november">November</string>
+ <string name="month_long_december">December</string>
+
+ <string name="month_medium_january">Jan</string>
+ <string name="month_medium_february">Feb</string>
+ <string name="month_medium_march">Mar</string>
+ <string name="month_medium_april">Apr</string>
+ <string name="month_medium_may">May</string>
+ <string name="month_medium_june">Jun</string>
+ <string name="month_medium_july">Jul</string>
+ <string name="month_medium_august">Aug</string>
+ <string name="month_medium_september">Sep</string>
+ <string name="month_medium_october">Oct</string>
+ <string name="month_medium_november">Nov</string>
+ <string name="month_medium_december">Dec</string>
+
+ <string name="month_shortest_january">J</string>
+ <string name="month_shortest_february">F</string>
+ <string name="month_shortest_march">M</string>
+ <string name="month_shortest_april">A</string>
+ <string name="month_shortest_may">M</string>
+ <string name="month_shortest_june">J</string>
+ <string name="month_shortest_july">J</string>
+ <string name="month_shortest_august">A</string>
+ <string name="month_shortest_september">S</string>
+ <string name="month_shortest_october">O</string>
+ <string name="month_shortest_november">N</string>
+ <string name="month_shortest_december">D</string>
+
+ <string name="day_of_week_long_sunday">Sunday</string>
+ <string name="day_of_week_long_monday">Monday</string>
+ <string name="day_of_week_long_tuesday">Tuesday</string>
+ <string name="day_of_week_long_wednesday">Wednesday</string>
+ <string name="day_of_week_long_thursday">Thursday</string>
+ <string name="day_of_week_long_friday">Friday</string>
+ <string name="day_of_week_long_saturday">Saturday</string>
+
+ <string name="day_of_week_medium_sunday">Sun</string>
+ <string name="day_of_week_medium_monday">Mon</string>
+ <string name="day_of_week_medium_tuesday">Tue</string>
+ <string name="day_of_week_medium_wednesday">Wed</string>
+ <string name="day_of_week_medium_thursday">Thu</string>
+ <string name="day_of_week_medium_friday">Fri</string>
+ <string name="day_of_week_medium_saturday">Sat</string>
+
+ <string name="day_of_week_short_sunday">Su</string>
+ <string name="day_of_week_short_monday">Mo</string>
+ <string name="day_of_week_short_tuesday">Tu</string>
+ <string name="day_of_week_short_wednesday">We</string>
+ <string name="day_of_week_short_thursday">Th</string>
+ <string name="day_of_week_short_friday">Fr</string>
+ <string name="day_of_week_short_saturday">Sa</string>
+
+ <string name="day_of_week_shortest_sunday">S</string>
+ <string name="day_of_week_shortest_monday">M</string>
+ <string name="day_of_week_shortest_tuesday">T</string>
+ <string name="day_of_week_shortest_wednesday">W</string>
+ <string name="day_of_week_shortest_thursday">T</string>
+ <string name="day_of_week_shortest_friday">F</string>
+ <string name="day_of_week_shortest_saturday">S</string>
+
+ <string name="am">a.m.</string>
+ <string name="pm">p.m.</string>
+ <string name="yesterday">Yesterday</string>
+ <string name="today">Today</string>
+ <string name="tomorrow">Tomorrow</string>
+
+ <string name="hour_minute_ampm">%-l:%M %p</string>
+ <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
+ <string name="numeric_date">%-m/%-e/%Y</string>
+ <string name="numeric_date_format">M/d/yyyy</string>
+ <string name="month_day_year">%B %-e, %Y</string>
+ <string name="time_of_day">%-l:%M:%S %p</string>
+ <string name="date_and_time">%-l:%M:%S %p %b %-e, %Y</string>
+ <string name="abbrev_month_day_year">%b %-e, %Y</string>
+ <string name="month_day">%B %-e</string>
+ <string name="month">%-B</string>
+ <string name="month_year">%B %Y</string>
+ <string name="abbrev_month_day">%b %-e</string>
+ <string name="abbrev_month">%-b</string>
+ <string name="abbrev_month_year">%b %Y</string>
+</resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index ae45d64..199eac1 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1091,30 +1091,56 @@
=============================================================== -->
<eat-comment />
- <public type="attr" name="tension" id="0x0101026a" />
- <public type="attr" name="extraTension" id="0x0101026b" />
- <public type="attr" name="density" id="0x0101026c" />
- <public type="attr" name="searchSuggestThreshold" id="0x0101026d" />
- <public type="attr" name="includeInGlobalSearch" id="0x0101026e" />
- <public type="attr" name="onClick" id="0x0101026f" />
- <public type="attr" name="targetSdkVersion" id="0x01010270" />
- <public type="attr" name="maxSdkVersion" id="0x01010271" />
- <public type="attr" name="testOnly" id="0x01010272" />
- <public type="attr" name="contentDescription" id="0x01010273" />
+ <public type="attr" name="tension" id="0x0101026a" />
+ <public type="attr" name="extraTension" />
+ <public type="attr" name="density" />
+ <public type="attr" name="searchSuggestThreshold" />
+ <public type="attr" name="includeInGlobalSearch" />
+ <public type="attr" name="onClick" />
+ <public type="attr" name="targetSdkVersion" />
+ <public type="attr" name="maxSdkVersion" />
+ <public type="attr" name="testOnly" />
+ <public type="attr" name="contentDescription" />
+
+ <public-padding type="attr" name="donut_resource_pad" end="0x0101029f" />
- <public type="anim" name="anticipate_interpolator" id="0x010a0007" />
- <public type="anim" name="overshoot_interpolator" id="0x010a0008" />
- <public type="anim" name="anticipate_overshoot_interpolator" id="0x010a0009" />
- <public type="anim" name="bounce_interpolator" id="0x010a000a" />
+ <public-padding type="id" name="donut_resource_pad" end="0x01020040" />
+
+ <public-padding type="style" name="donut_resource_pad" end="0x01030070" />
+
+ <public-padding type="string" name="donut_resource_pad" end="0x01040030" />
- <public type="drawable" name="stat_sys_vp_phone_call" id="0x0108022d" />
- <public type="drawable" name="stat_sys_vp_phone_call_on_hold" id="0x0108022e" />
+ <public-padding type="dimen" name="donut_resource_pad" end="0x01050010" />
+ <public-padding type="color" name="donut_resource_pad" end="0x01060030" />
+
+ <public-padding type="array" name="donut_resource_pad" end="0x01070010" />
+
+ <public-padding type="anim" name="donut_resource_pad" end="0x010a0020" />
+
+ <public-padding type="integer" name="donut_resource_pad" end="0x010e0010" />
+
+ <public type="anim" name="anticipate_interpolator" />
+ <public type="anim" name="overshoot_interpolator" />
+ <public type="anim" name="anticipate_overshoot_interpolator" />
+ <public type="anim" name="bounce_interpolator" />
+ <public type="anim" name="linear_interpolator" />
+
+ <public-padding type="drawable" name="donut_resource_pad" end="0x010800d0" />
+
+ <public-padding type="layout" name="donut_resource_pad" end="0x01090020" />
+
+
<!-- ===============================================================
- Resources added in version 5 of the platform.
+ Resources added in Eclair.
=============================================================== -->
<eat-comment />
- <public type="attr" name="accountType" id="0x01010274" />
- <public type="attr" name="contentAuthority" id="0x01010275" />
+ <public type="attr" name="accountType" />
+ <public type="attr" name="contentAuthority" />
+
+ <public type="drawable" name="stat_sys_vp_phone_call" />
+ <public type="drawable" name="stat_sys_vp_phone_call_on_hold" />
+
+
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index a8145de..5bd8308 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -480,6 +480,12 @@
state. Does not perform a complete shutdown.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_stopAppSwitches">prevent app switches</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_stopAppSwitches">Prevents the user from switching to
+ another application.</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_runSetActivityWatcher">monitor and control all application launching</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_runSetActivityWatcher">Allows an application to
@@ -770,13 +776,7 @@
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_installLocationProvider">Create mock location sources for testing.
Malicious applications can use this to override the location and/or status returned by real
- location sources such as GPS or Network providers.</string>
-
- <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permlab_installLocationCollector">permission to install a location collector</string>
- <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permdesc_installLocationCollector">Create mock location sources for testing.
- Malicious applications can use this to monitor and report your location to an external source.</string>
+ location sources such as GPS or Network providers or monitor and report your location to an external source.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_accessFineLocation">fine (GPS) location</string>
@@ -1076,7 +1076,7 @@
user dictionary.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permlab_sdcardWrite">write to SD card</string>
+ <string name="permlab_sdcardWrite">modify/delete SD card contents</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_sdcardWrite">Allows an application to write to the SD card.</string>
@@ -1251,15 +1251,6 @@
<!-- Displayed to the user when unlocking the phone with a username and password fails. -->
<string name="lockscreen_glogin_invalid_input">Invalid username or password.</string>
- <!-- A format string for 12-hour time of day (example: "12:30 PM"). -->
- <string name="status_bar_time_format">"<xliff:g id="hour" example="12">h</xliff:g>:<xliff:g id="minute" example="30">mm</xliff:g> <xliff:g id="ampm" example="AM">AA</xliff:g>"</string>
-
- <!-- A format string for 12-hour time of day, with lower-case "am" or "pm" (example: "12:30pm"). -->
- <string name="hour_minute_ampm">"<xliff:g id="hour" example="12">%-l</xliff:g>:<xliff:g id="minute" example="30">%M</xliff:g><xliff:g id="ampm" example="am">%P</xliff:g>"</string>
-
- <!-- A format string for 12-hour time of day, with capital "AM" or "PM" (example: "12:30PM"). -->
- <string name="hour_minute_cap_ampm">"<xliff:g id="hour" example="12">%-l</xliff:g>:<xliff:g id="minute" example="30">%M</xliff:g><xliff:g id="ampm" example="AM">%p</xliff:g>"</string>
-
<!-- A format string for 12-hour time of day, just the hour, not the minute, with lower-case "am" or "pm" (example: "3pm"). -->
<string name="hour_ampm">"<xliff:g id="hour" example="3">%-l</xliff:g><xliff:g id="ampm" example="pm">%P</xliff:g>"</string>
@@ -1360,12 +1351,6 @@
It is also used by the home screen's search "widget". It should be short -->
<string name="search_go">Search</string>
- <!-- String used to display the date. This is shown instead of a date if the date is today's date. -->
- <string name="today">Today</string>
- <!-- String used to display the date. This is shown instead of a date if the date is yesterday's date. -->
- <string name="yesterday">Yesterday</string>
- <!-- String used to display the date. This is shown instead of a date if the date is tomorrow's date. -->
- <string name="tomorrow">Tomorrow</string>
<!-- String used to display the date. This is the string to say something happened 1 month ago. -->
<string name="oneMonthDurationPast">1 month ago</string>
<!-- String used to display the date. This is the string to say something happened more than 1 month ago. -->
@@ -1499,21 +1484,6 @@
<!-- Appened to express the value is this unit of time. -->
<string name="years">years</string>
- <!-- Used in the list of which days of the week a calendar event recurrs on -->
- <string name="sunday">Sunday</string>
- <!-- Used in the list of which days of the week a calendar event recurrs on -->
- <string name="monday">Monday</string>
- <!-- Used in the list of which days of the week a calendar event recurrs on -->
- <string name="tuesday">Tuesday</string>
- <!-- Used in the list of which days of the week a calendar event recurrs on -->
- <string name="wednesday">Wednesday</string>
- <!-- Used in the list of which days of the week a calendar event recurrs on -->
- <string name="thursday">Thursday</string>
- <!-- Used in the list of which days of the week a calendar event recurrs on -->
- <string name="friday">Friday</string>
- <!-- Used in the list of which days of the week a calendar event recurrs on -->
- <string name="saturday">Saturday</string>
-
<!-- Calendar spinner item, to select that an event recurs every weekday. -->
<string name="every_weekday">"Every weekday (Mon\u2013Fri)"</string>
<!-- Calendar spinner item, to select that an event recurs every day. -->
@@ -1536,17 +1506,7 @@
<string name="VideoView_error_button">OK</string>
- <!-- AM - as in morning - as in 10:30 AM -->
- <string name="am">"AM"</string>
-
- <!-- PM - as in afternoon - as in 10:30 PM -->
- <string name="pm">"PM"</string>
-
-
- <!-- Numeric form of the day. Example: "12/31/2007" -->
- <string name="numeric_date">"<xliff:g id="month" example="12">%m</xliff:g>/<xliff:g id="day" example="31">%d</xliff:g>/<xliff:g id="year" example="2008">%Y</xliff:g>"</string>
-
- <!-- Format indicating a range of time, from a time on one day to a time on another day.
+ <!-- Format indicating a range of time, from a time on one day to a time on another day.
Example: "Mon, Dec 31, 2007, 8am - Tue, Jan 1, 2008, 5pm" -->
<string name="wday1_date1_time1_wday2_date2_time2">"<xliff:g id="weekday1" example="Monday">%1$s</xliff:g>, <xliff:g id="date1" example="December 31, 2007">%2$s</xliff:g>, <xliff:g id="time1" example="8am">%3$s</xliff:g> \u2013 <xliff:g id="weekday2" example="Tuesday">%4$s</xliff:g>, <xliff:g id="date2" example="January 1, 2008">%5$s</xliff:g>, <xliff:g id="time2" example="5pm">%6$s</xliff:g>"</string>
@@ -1590,42 +1550,6 @@
Example: "8:00 - 11:00 am, Mon" -->
<string name="time_wday">"<xliff:g id="time_range" example="8:00 - 11:00 am">%1$s</xliff:g>, <xliff:g id="weekday" example="Mon">%2$s</xliff:g>"</string>
- <!-- Date format string used in contexts where the user has said they
- want the month first, as used in the USA, with the month fully
- spelled out. You can remove the comma or add a period,
- or make other punctuation changes appropriate for your locale. -->
- <string name="full_date_month_first" format="date"><xliff:g id="month" example="December">MMMM</xliff:g> <xliff:g id="day" example="31">d</xliff:g>, <xliff:g id="year" example="1972">yyyy</xliff:g></string>
-
- <!-- Date format string used in contexts where the user has said they
- want the day of the month first, as used in Europe, with the month
- fully spelled out. You can remove the comma or add a period,
- or make other punctuation changes appropriate for your locale. -->
- <string name="full_date_day_first" format="date"><xliff:g id="day" example="31">d</xliff:g> <xliff:g id="month" example="December">MMMM</xliff:g>, <xliff:g id="year" example="1972">yyyy</xliff:g></string>
-
- <!-- Date format string used in contexts where the user has said they
- want the month first, as used in the USA, with the month
- abbreviated. You can remove the comma or add a period,
- or make other punctuation changes appropriate for your locale. -->
- <string name="medium_date_month_first" format="date"><xliff:g id="month" example="Dec.">MMM</xliff:g> <xliff:g id="day" example="31">d</xliff:g>, <xliff:g id="year" example="1972">yyyy</xliff:g></string>
-
- <!-- Date format string used in contexts where the user has said they
- want the day of the month first, as used in Europe, with the month
- abbreviated. You can remove the comma or add a period,
- or make other punctuation changes appropriate for your locale. -->
- <string name="medium_date_day_first" format="date"><xliff:g id="day" example="31">d</xliff:g> <xliff:g id="month" example="December">MMM</xliff:g>, <xliff:g id="year" example="1972">yyyy</xliff:g></string>
-
- <!-- Time format string used in the status bar when the user has said they
- want a 12-hour clock with AM and PM.
- You can remove the colon
- or make other punctuation changes appropriate for your locale. -->
- <string name="twelve_hour_time_format" format="date"><xliff:g id="hour" example="11">h</xliff:g>:<xliff:g id="minute" example="59">mm</xliff:g> <xliff:g id="ampm" example="AM">a</xliff:g></string>
-
- <!-- Time format string used in the status bar when the user has said they
- want a 24-hour clock.
- You can remove the colon
- or make other punctuation changes appropriate for your locale. -->
- <string name="twenty_four_hour_time_format" format="date"><xliff:g id="hour" example="23">HH</xliff:g>:<xliff:g id="minute" example="59">mm</xliff:g></string>
-
<!-- Quoted name for 12pm, lowercase -->
<string name="noon">"noon"</string>
<!-- Quoted name for 12pm, uppercase first letter -->
@@ -1635,29 +1559,6 @@
<!-- Quoted name for 12am, uppercase first letter -->
<string name="Midnight">"Midnight"</string>
- <!-- Date format for month and day of month.
- Example: "October 9". -->
- <string name="month_day">"<xliff:g id="month" example="October">%B</xliff:g> <xliff:g id="day" example="9">%-d</xliff:g>"</string>
-
- <!-- Date format for month alone.
- Example: "October" -->
- <string name="month">"<xliff:g id="month" example="October">%B</xliff:g>"</string>
-
- <!-- Date format for month, day, and year.
- Example: "October 9, 2007" -->
- <string name="month_day_year">"<xliff:g id="month" example="October">%B</xliff:g> <xliff:g id="day" example="9">%-d</xliff:g>, <xliff:g id="year" example="2007">%Y</xliff:g>"</string>
-
- <!-- Date format for month and year.
- Example: "October 2007" -->
- <string name="month_year">"<xliff:g id="month" example="October">%B</xliff:g> <xliff:g id="year" example="2007">%Y</xliff:g>"</string>
-
- <!-- A format string for 24-hour time of day (example "23:59"). -->
- <string name="time_of_day">"<xliff:g id="hour" example="23">%H</xliff:g>:<xliff:g id="minute" example="59">%M</xliff:g>:<xliff:g id="second" example="59">%S</xliff:g>"</string>
-
- <!-- Format string for date and 24-hour time of day.
- Example: 23:59:15 Jan 31 2008 -->
- <string name="date_and_time">"<xliff:g id="hour" example="23">%H</xliff:g>:<xliff:g id="minute" example="59">%M</xliff:g>:<xliff:g id="second" example="59">%S</xliff:g> <xliff:g id="month" example="Jan">%B</xliff:g> <xliff:g id="day" example="31">%-d</xliff:g>, <xliff:g id="year" example="2008">%Y</xliff:g>"</string>
-
<!-- Format indicating a range of dates in the same year.
Example: "Oct 31 - Nov 3" -->
<string name="same_year_md1_md2">"<xliff:g id="month1" example="Oct">%2$s</xliff:g> <xliff:g id="day1" example="31">%3$s</xliff:g> \u2013 <xliff:g id="month2" example="Nov">%7$s</xliff:g> <xliff:g id="day2" example="3">%8$s</xliff:g>"</string>
@@ -1756,312 +1657,7 @@
Example: "Tue, Oct 9, 2007, 8:00am - Wed, Oct 10, 2007, 5:00pm" -->
<string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">"<xliff:g id="weekday1" example="Wed">%1$s</xliff:g>, <xliff:g id="month1" example="Oct">%2$s</xliff:g> <xliff:g id="day1" example="31">%3$s</xliff:g>, <xliff:g id="year1" example="2007">%4$s</xliff:g>, <xliff:g id="time1" example="8:00am">%5$s</xliff:g> \u2013 <xliff:g id="weekday2" example="Sat">%6$s</xliff:g>, <xliff:g id="month2" example="Nov">%7$s</xliff:g> <xliff:g id="day2" example="3">%8$s</xliff:g>, <xliff:g id="year2" example="2007">%9$s</xliff:g>, <xliff:g id="time2" example="5:00pm">%10$s</xliff:g>"</string>
- <!-- Format string for abbreviated month, day, and year.
- Example: "Oct 9, 2007" -->
- <string name="abbrev_month_day_year">"<xliff:g id="month" example="Oct">%b</xliff:g> <xliff:g id="day" example="9">%-d</xliff:g>, <xliff:g id="year" example="2007">%Y</xliff:g>"</string>
-
- <!-- Format string for abbreviated month and year.
- Example: "Oct 2007" -->
- <string name="abbrev_month_year">"<xliff:g id="month" example="Oct">%b</xliff:g> <xliff:g id="year" example="2007">%Y</xliff:g>"</string>
-
- <!-- Format string for abbreviated month and day.
- Example: "Oct 9" -->
- <string name="abbrev_month_day">"<xliff:g id="month" example="Oct">%b</xliff:g> <xliff:g id="day" example="31">%-d</xliff:g>"</string>
-
- <!-- Format string for abbreviated month alone.
- Example: "Oct" -->
- <string name="abbrev_month">"<xliff:g id="month" example="Oct">%b</xliff:g>"</string>
-
- <!-- The full spelled out version of the day of the week. -->
- <string name="day_of_week_long_sunday">Sunday</string>
-
- <!-- The full spelled out version of the day of the week. -->
- <string name="day_of_week_long_monday">Monday</string>
-
- <!-- The full spelled out version of the day of the week. -->
- <string name="day_of_week_long_tuesday">Tuesday</string>
-
- <!-- The full spelled out version of the day of the week. -->
- <string name="day_of_week_long_wednesday">Wednesday</string>
-
- <!-- The full spelled out version of the day of the week. -->
- <string name="day_of_week_long_thursday">Thursday</string>
-
- <!-- The full spelled out version of the day of the week. -->
- <string name="day_of_week_long_friday">Friday</string>
-
- <!-- The full spelled out version of the day of the week. -->
- <string name="day_of_week_long_saturday">Saturday</string>
-
-
- <!-- An abbreviated day of the week. Three characters typically in western languages.
- In US English: "Sun" stands for Sunday -->
- <string name="day_of_week_medium_sunday">Sun</string>
-
- <!-- An abbreviated day of the week. Three characters typically in western languages.
- In US English: "Mon" stands for Monday -->
- <string name="day_of_week_medium_monday">Mon</string>
-
- <!-- An abbreviated day of the week. Three characters typically in western languages.
- In US English: "Tue" stands for Tuesday -->
- <string name="day_of_week_medium_tuesday">Tue</string>
-
- <!-- An abbreviated day of the week. Three characters typically in western languages.
- In US English: "Wed" stands for Wednesday -->
- <string name="day_of_week_medium_wednesday">Wed</string>
-
- <!-- An abbreviated day of the week. Three characters typically in western languages.
- In US English: "Thu" stands for Thursday -->
- <string name="day_of_week_medium_thursday">Thu</string>
-
- <!-- An abbreviated day of the week. Three characters typically in western languages.
- In US English: "Fri" stands for Friday -->
- <string name="day_of_week_medium_friday">Fri</string>
-
- <!-- An abbreviated day of the week. Three characters typically in western languages.
- In US English: "Sat" stands for Saturday -->
- <string name="day_of_week_medium_saturday">Sat</string>
-
-
- <!-- An abbreviated day of the week. Two characters typically in western languages.
- In US English: "Su" stands for Sunday -->
- <string name="day_of_week_short_sunday">Su</string>
-
- <!-- An abbreviated day of the week. Two characters typically in western languages.
- In US English: "Mo" stands for Monday -->
- <string name="day_of_week_short_monday">Mo</string>
-
- <!-- An abbreviated day of the week. Two characters typically in western languages.
- In US English: "Tu" stands for Tuesday -->
- <string name="day_of_week_short_tuesday">Tu</string>
-
- <!-- An abbreviated day of the week. Two characters typically in western languages.
- In US English: "We" stands for Wednesday -->
- <string name="day_of_week_short_wednesday">We</string>
-
- <!-- An abbreviated day of the week. Two characters typically in western languages.
- In US English: "Th" stands for Thursday -->
- <string name="day_of_week_short_thursday">Th</string>
-
- <!-- An abbreviated day of the week. Two characters typically in western languages.
- In US English: "Fr" stands for Friday -->
- <string name="day_of_week_short_friday">Fr</string>
-
- <!-- An abbreviated day of the week. Two characters typically in western languages.
- In US English: "Sa" stands for Saturday -->
- <string name="day_of_week_short_saturday">Sa</string>
-
-
- <!-- An abbreviated day of the week. One character if that is unique. Two if necessary.
- In US English: "Su" stands for Sunday -->
- <string name="day_of_week_shorter_sunday">Su</string>
-
- <!-- An abbreviated day of the week. One character if that is unique. Two if necessary.
- In US English: "M" stands for Monday -->
- <string name="day_of_week_shorter_monday">M</string>
-
- <!-- An abbreviated day of the week. One character if that is unique. Two if necessary.
- In US English: "Tu" stands for Tuesday -->
- <string name="day_of_week_shorter_tuesday">Tu</string>
-
- <!-- An abbreviated day of the week. One character if that is unique. Two if necessary.
- In US English: "W" stands for Wednesday -->
- <string name="day_of_week_shorter_wednesday">W</string>
-
- <!-- An abbreviated day of the week. One character if that is unique. Two if necessary.
- In US English: "Th" stands for Thursday -->
- <string name="day_of_week_shorter_thursday">Th</string>
-
- <!-- An abbreviated day of the week. One character if that is unique. Two if necessary.
- In US English: "F" stands for Friday -->
- <string name="day_of_week_shorter_friday">F</string>
-
- <!-- An abbreviated day of the week. One character if that is unique. Two if necessary.
- In US English: "Sa" stands for Saturday -->
- <string name="day_of_week_shorter_saturday">Sa</string>
-
-
- <!-- An abbreviated day of the week. One character long if it makes sense. Does not have
- to be unique.
- In US English: "S" stands for Sunday -->
- <string name="day_of_week_shortest_sunday">S</string>
-
- <!-- An abbreviated day of the week. One character long if it makes sense. Does not have
- to be unique.
- In US English: "M" stands for Monday -->
- <string name="day_of_week_shortest_monday">M</string>
-
- <!-- An abbreviated day of the week. One character long if it makes sense. Does not have
- to be unique.
- In US English: "T" stands for Tuesday -->
- <string name="day_of_week_shortest_tuesday">T</string>
-
- <!-- An abbreviated day of the week. One character long if it makes sense. Does not have
- to be unique.
- In US English: "W" stands for Wednesday -->
- <string name="day_of_week_shortest_wednesday">W</string>
-
- <!-- An abbreviated day of the week. One character long if it makes sense. Does not have
- to be unique.
- In US English: "T" stands for Thursday -->
- <string name="day_of_week_shortest_thursday">T</string>
-
- <!-- An abbreviated day of the week. One character long if it makes sense. Does not have
- to be unique.
- In US English: "F" stands for Friday -->
- <string name="day_of_week_shortest_friday">F</string>
-
- <!-- An abbreviated day of the week. One character long if it makes sense. Does not have
- to be unique.
- In US English: "S" stands for Saturday -->
- <string name="day_of_week_shortest_saturday">S</string>
-
-
- <!-- The full spelled out version of the month. -->
- <string name="month_long_january">January</string>
-
- <!-- The full spelled out version of the month. -->
- <string name="month_long_february">February</string>
-
- <!-- The full spelled out version of the month. -->
- <string name="month_long_march">March</string>
-
- <!-- The full spelled out version of the month. -->
- <string name="month_long_april">April</string>
-
- <!-- The full spelled out version of the month. -->
- <string name="month_long_may">May</string>
-
- <!-- The full spelled out version of the month. -->
- <string name="month_long_june">June</string>
-
- <!-- The full spelled out version of the month. -->
- <string name="month_long_july">July</string>
-
- <!-- The full spelled out version of the month. -->
- <string name="month_long_august">August</string>
-
- <!-- The full spelled out version of the month. -->
- <string name="month_long_september">September</string>
-
- <!-- The full spelled out version of the month. -->
- <string name="month_long_october">October</string>
-
- <!-- The full spelled out version of the month. -->
- <string name="month_long_november">November</string>
-
- <!-- The full spelled out version of the month. -->
- <string name="month_long_december">December</string>
-
-
- <!-- An abbreviated month name.
- In US English: "Jan" stands for January. -->
- <string name="month_medium_january">Jan</string>
-
- <!-- An abbreviated month name.
- In US English: "Feb" stands for February. -->
- <string name="month_medium_february">Feb</string>
-
- <!-- An abbreviated month name.
- In US English: "Mar" stands for March. -->
- <string name="month_medium_march">Mar</string>
-
- <!-- An abbreviated month name.
- In US English: "Apr" stands for April. -->
- <string name="month_medium_april">Apr</string>
-
- <!-- An abbreviated month name.
- In US English: "May" stands for May. -->
- <string name="month_medium_may">May</string>
-
- <!-- An abbreviated month name.
- In US English: "Jun" stands for June. -->
- <string name="month_medium_june">Jun</string>
-
- <!-- An abbreviated month name.
- In US English: "Jul" stands for July. -->
- <string name="month_medium_july">Jul</string>
-
- <!-- An abbreviated month name.
- In US English: "Aug" stands for August. -->
- <string name="month_medium_august">Aug</string>
-
- <!-- An abbreviated month name.
- In US English: "Sep" stands for September. -->
- <string name="month_medium_september">Sep</string>
-
- <!-- An abbreviated month name.
- In US English: "Oct" stands for October. -->
- <string name="month_medium_october">Oct</string>
-
- <!-- An abbreviated month name.
- In US English: "Nov" stands for November. -->
- <string name="month_medium_november">Nov</string>
-
- <!-- An abbreviated month name.
- In US English: "Dec" stands for December. -->
- <string name="month_medium_december">Dec</string>
-
-
- <!-- An abbreviated month name. One character long if it makes sense. Does not have
- to be unique.
- In US English: "J" stands for January -->
- <string name="month_shortest_january">J</string>
-
- <!-- An abbreviated month name. One character long if it makes sense. Does not have
- to be unique.
- In US English: "F" stands for February. -->
- <string name="month_shortest_february">F</string>
-
- <!-- An abbreviated month name. One character long if it makes sense. Does not have
- to be unique.
- In US English: "M" stands for March. -->
- <string name="month_shortest_march">M</string>
-
- <!-- An abbreviated month name. One character long if it makes sense. Does not have
- to be unique.
- In US English: "A" stands for April. -->
- <string name="month_shortest_april">A</string>
-
- <!-- An abbreviated month name. One character long if it makes sense. Does not have
- to be unique.
- In US English: "M" stands for May. -->
- <string name="month_shortest_may">M</string>
-
- <!-- An abbreviated month name. One character long if it makes sense. Does not have
- to be unique.
- In US English: "J" stands for June. -->
- <string name="month_shortest_june">J</string>
-
- <!-- An abbreviated month name. One character long if it makes sense. Does not have
- to be unique.
- In US English: "J" stands for July. -->
- <string name="month_shortest_july">J</string>
-
- <!-- An abbreviated month name. One character long if it makes sense. Does not have
- to be unique.
- In US English: "A" stands for August. -->
- <string name="month_shortest_august">A</string>
-
- <!-- An abbreviated month name. One character long if it makes sense. Does not have
- to be unique.
- In US English: "S" stands for September. -->
- <string name="month_shortest_september">S</string>
-
- <!-- An abbreviated month name. One character long if it makes sense. Does not have
- to be unique.
- In US English: "O" stands for October. -->
- <string name="month_shortest_october">O</string>
- <!-- An abbreviated month name. One character long if it makes sense. Does not have
- to be unique.
- In US English: "N" stands for November. -->
- <string name="month_shortest_november">N</string>
-
- <!-- An abbreviated month name. One character long if it makes sense. Does not have
- to be unique.
- In US English: "D" stands for December. -->
- <string name="month_shortest_december">D</string>
<!-- Format string for durations like "01:23" (1 minute, 23 seconds) -->
<string name="elapsed_time_short_format_mm_ss"><xliff:g id="minutes" example="1">%1$02d</xliff:g>:<xliff:g id="seconds" example="23">%2$02d</xliff:g></string>
@@ -2159,6 +1755,8 @@
<string name="anr_process">Process <xliff:g id="process">%1$s</xliff:g> is not responding.</string>
<!-- Button allowing the user to close an application that is not responding. This will kill the application. -->
<string name="force_close">Force close</string>
+ <!-- Button allowing the user to send a bug report for application which has encountered an error. -->
+ <string name="report">Report</string>
<!-- Button allowing the user to choose to wait for an application that is not responding to become responsive again. -->
<string name="wait">Wait</string>
<!-- Button allowing a developer to connect a debugger to an application that is not responding. -->
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 9567523..b168fb8 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -50,6 +50,7 @@
<item name="textColorSecondaryInverseNoDisable">@android:color/secondary_text_light_nodisable</item>
<item name="textColorHint">@android:color/hint_foreground_dark</item>
<item name="textColorHintInverse">@android:color/hint_foreground_light</item>
+ <item name="textColorSearchUrl">@android:color/search_url_text</item>
<item name="textAppearanceLarge">@android:style/TextAppearance.Large</item>
<item name="textAppearanceMedium">@android:style/TextAppearance.Medium</item>
diff --git a/core/res/res/xml/eri.xml b/core/res/res/xml/eri.xml
new file mode 100644
index 0000000..cd66f14
--- /dev/null
+++ b/core/res/res/xml/eri.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<!-- Note that IconMode can be only 0, ON or 1, FLASHING
+ The icon is turned OFF if then IconIndex = 1 -->
+
+<EriFile VersionNumber="1357"
+ NumberOfEriEntries="12"
+ EriFileType="1">
+
+ <CallPromptId Id="0"
+ CallPromptText="CallPromptId0"/>
+
+ <CallPromptId Id="1"
+ CallPromptText="CallPromptId1"/>
+
+ <CallPromptId Id="2"
+ CallPromptText="CallPromptId2"/>
+
+ <EriInfo RoamingIndicator="64"
+ IconIndex="1"
+ IconMode="0"
+ EriText="T-CDMA 64"
+ CallPromptId="0"
+ AlertId="0"/>
+
+ <EriInfo RoamingIndicator="65"
+ IconIndex="65"
+ IconMode="0"
+ EriText="T-CDMA 65"
+ CallPromptId="0"
+ AlertId="0"/>
+
+ <EriInfo RoamingIndicator="66"
+ IconIndex="1"
+ IconMode="0"
+ EriText="T-CDMA Ext 66"
+ CallPromptId="0"
+ AlertId="0"/>
+
+ <EriInfo RoamingIndicator="67"
+ IconIndex="67"
+ IconMode="0"
+ EriText="T-CDMA Ext 67"
+ CallPromptId="0"
+ AlertId="0"/>
+
+ <EriInfo RoamingIndicator="68"
+ IconIndex="68"
+ IconMode="0"
+ EriText="T-CDMA Roam 68"
+ CallPromptId="0"
+ AlertId="0"/>
+
+ <EriInfo RoamingIndicator="69"
+ IconIndex="69"
+ IconMode="1"
+ EriText="T-CDMA Ext 69"
+ CallPromptId="0"
+ AlertId="0"/>
+
+ <EriInfo RoamingIndicator="70"
+ IconIndex="70"
+ IconMode="1"
+ EriText="T-CDMA Roam 70"
+ CallPromptId="0"
+ AlertId="0"/>
+
+ <EriInfo RoamingIndicator="71"
+ IconIndex="1"
+ IconMode="0"
+ EriText="T-CDMA Ext 71"
+ CallPromptId="0"
+ AlertId="0"/>
+
+ <EriInfo RoamingIndicator="72"
+ IconIndex="72"
+ IconMode="0"
+ EriText="T-CDMA Ext 72"
+ CallPromptId="0"
+ AlertId="0"/>
+
+ <EriInfo RoamingIndicator="73"
+ IconIndex="73"
+ IconMode="0"
+ EriText="T-CDMA Roam 73"
+ CallPromptId="0"
+ AlertId="0"/>
+
+ <EriInfo RoamingIndicator="74"
+ IconIndex="74"
+ IconMode="1"
+ EriText="T-CDMA Ext 74"
+ CallPromptId="0"
+ AlertId="0"/>
+
+ <EriInfo RoamingIndicator="75"
+ IconIndex="75"
+ IconMode="1"
+ EriText="T-CDMA Roam 75"
+ CallPromptId="0"
+ AlertId="0"/>
+
+</EriFile>