diff options
279 files changed, 11121 insertions, 8094 deletions
@@ -349,7 +349,7 @@ web_docs_sample_code_flags := \ # most current Android platform version included in the SDK package. framework_docs_SDK_VERSION := 1.5 # release version for SDK (ie "Release x") -framework_docs_SDK_REL_ID := 2 +framework_docs_SDK_REL_ID := 3 framework_docs_SDK_CURRENT_DIR := $(framework_docs_SDK_VERSION)_r$(framework_docs_SDK_REL_ID) framework_docs_LOCAL_DROIDDOC_OPTIONS += \ @@ -416,7 +416,8 @@ LOCAL_DROIDDOC_OPTIONS:= \ $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \ $(web_docs_sample_code_flags) \ -toroot / \ - -hdf android.whichdoc online + -hdf android.whichdoc online \ + -hdf template.showLanguageMenu true LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk LOCAL_DROIDDOC_CUSTOM_ASSET_DIR:=assets-sdk diff --git a/api/current.xml b/api/current.xml index 0e04f50..b17cbe7 100644 --- a/api/current.xml +++ b/api/current.xml @@ -698,7 +698,7 @@ type="java.lang.String" transient="false" volatile="false" - value=""android.permission.READ_HISTORY_BOOKMARKS"" + value=""com.android.browser.permission.READ_HISTORY_BOOKMARKS"" static="true" final="true" deprecated="not deprecated" @@ -991,17 +991,6 @@ visibility="public" > </field> -<field name="SHUTDOWN" - type="java.lang.String" - transient="false" - volatile="false" - value=""android.permission.SHUTDOWN"" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> <field name="SIGNAL_PERSISTENT_PROCESSES" type="java.lang.String" transient="false" @@ -1024,17 +1013,6 @@ visibility="public" > </field> -<field name="STOP_APP_SWITCHES" - type="java.lang.String" - transient="false" - volatile="false" - value=""android.permission.STOP_APP_SWITCHES"" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> <field name="SUBSCRIBED_FEEDS_READ" type="java.lang.String" transient="false" @@ -1160,7 +1138,7 @@ type="java.lang.String" transient="false" volatile="false" - value=""android.permission.WRITE_HISTORY_BOOKMARKS"" + value=""com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"" static="true" final="true" deprecated="not deprecated" @@ -2231,6 +2209,17 @@ visibility="public" > </field> +<field name="anyDensity" + type="int" + transient="false" + volatile="false" + value="16843372" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="apiKey" type="int" transient="false" @@ -3078,17 +3067,6 @@ visibility="public" > </field> -<field name="density" - type="int" - transient="false" - volatile="false" - value="16843372" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> <field name="dependency" type="int" transient="false" @@ -28402,17 +28380,6 @@ visibility="public" > </field> -<field name="BACKUP_SERVICE" - type="java.lang.String" - transient="false" - volatile="false" - value=""backup"" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> <field name="BIND_AUTO_CREATE" type="int" transient="false" @@ -29258,19 +29225,6 @@ <parameter name="mode" type="int"> </parameter> </method> -<method name="getSharedPrefsFile" - return="java.io.File" - abstract="false" - native="false" - synchronized="false" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -<parameter name="name" type="java.lang.String"> -</parameter> -</method> <method name="getSystemService" return="java.lang.Object" abstract="false" @@ -29885,70 +29839,6 @@ </parameter> </method> </interface> -<interface name="IIntentReceiver" - abstract="true" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -<implements name="android.os.IInterface"> -</implements> -<method name="performReceive" - return="void" - abstract="true" - native="false" - synchronized="false" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -<parameter name="intent" type="android.content.Intent"> -</parameter> -<parameter name="resultCode" type="int"> -</parameter> -<parameter name="data" type="java.lang.String"> -</parameter> -<parameter name="extras" type="android.os.Bundle"> -</parameter> -<parameter name="ordered" type="boolean"> -</parameter> -<exception name="RemoteException" type="android.os.RemoteException"> -</exception> -</method> -</interface> -<interface name="IIntentSender" - abstract="true" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -<implements name="android.os.IInterface"> -</implements> -<method name="send" - return="int" - abstract="true" - native="false" - synchronized="false" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -<parameter name="code" type="int"> -</parameter> -<parameter name="intent" type="android.content.Intent"> -</parameter> -<parameter name="resolvedType" type="java.lang.String"> -</parameter> -<parameter name="finishedReceiver" type="android.content.IIntentReceiver"> -</parameter> -<exception name="RemoteException" type="android.os.RemoteException"> -</exception> -</method> -</interface> <class name="Intent" extends="java.lang.Object" abstract="false" @@ -32283,39 +32173,6 @@ visibility="public" > </field> -<field name="ACTION_TTS_CHECK_TTS_DATA" - type="java.lang.String" - transient="false" - volatile="false" - value=""android.intent.action.CHECK_TTS_DATA"" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> -<field name="ACTION_TTS_INSTALL_TTS_DATA" - type="java.lang.String" - transient="false" - volatile="false" - value=""android.intent.action.INSTALL_TTS_DATA"" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> -<field name="ACTION_TTS_QUEUE_PROCESSING_COMPLETED" - type="java.lang.String" - transient="false" - volatile="false" - value=""android.intent.action.TTS_QUEUE_PROCESSING_COMPLETED"" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> <field name="ACTION_UID_REMOVED" type="java.lang.String" transient="false" @@ -34120,26 +33977,6 @@ > <implements name="android.os.Parcelable"> </implements> -<constructor name="IntentSender" - type="android.content.IntentSender" - static="false" - final="false" - deprecated="not deprecated" - visibility="protected" -> -<parameter name="target" type="android.content.IIntentSender"> -</parameter> -</constructor> -<constructor name="IntentSender" - type="android.content.IntentSender" - static="false" - final="false" - deprecated="not deprecated" - visibility="protected" -> -<parameter name="target" type="android.os.IBinder"> -</parameter> -</constructor> <method name="describeContents" return="int" abstract="false" @@ -35540,6 +35377,17 @@ visibility="public" > </field> +<field name="FLAG_SUPPORTS_SCREEN_DENSITIES" + type="int" + transient="false" + volatile="false" + value="8192" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="FLAG_SUPPORTS_SMALL_SCREENS" type="int" transient="false" @@ -35695,17 +35543,6 @@ visibility="public" > </field> -<field name="supportsDensities" - type="int[]" - transient="false" - volatile="false" - value="null" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -</field> <field name="targetSdkVersion" type="int" transient="false" @@ -37604,17 +37441,6 @@ visibility="public" > </field> -<field name="GET_SUPPORTS_DENSITIES" - type="int" - transient="false" - volatile="false" - value="32768" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> <field name="GET_UNINSTALLED_PACKAGES" type="int" transient="false" @@ -47407,17 +47233,6 @@ <parameter name="entryName" type="java.lang.String"> </parameter> </method> -<method name="getLearner" - return="android.gesture.Learner" - abstract="false" - native="false" - synchronized="false" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -</method> <method name="getOrientationStyle" return="int" abstract="false" @@ -48686,15 +48501,6 @@ > </field> </class> -<class name="Learner" - extends="java.lang.Object" - abstract="true" - static="false" - final="false" - deprecated="not deprecated" - visibility="" -> -</class> <class name="OrientedBoundingBox" extends="java.lang.Object" abstract="false" @@ -49118,8 +48924,8 @@ visibility="public" > </method> -<method name="getDensityScale" - return="float" +<method name="getDensity" + return="int" abstract="false" native="false" synchronized="false" @@ -49228,6 +49034,19 @@ <parameter name="metrics" type="android.util.DisplayMetrics"> </parameter> </method> +<method name="getScaledHeight" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="targetDensity" type="int"> +</parameter> +</method> <method name="getScaledWidth" return="int" abstract="false" @@ -49254,19 +49073,21 @@ <parameter name="metrics" type="android.util.DisplayMetrics"> </parameter> </method> -<method name="getWidth" +<method name="getScaledWidth" return="int" abstract="false" native="false" synchronized="false" static="false" - final="true" + final="false" deprecated="not deprecated" visibility="public" > +<parameter name="targetDensity" type="int"> +</parameter> </method> -<method name="hasAlpha" - return="boolean" +<method name="getWidth" + return="int" abstract="false" native="false" synchronized="false" @@ -49276,13 +49097,13 @@ visibility="public" > </method> -<method name="isAutoScalingEnabled" +<method name="hasAlpha" return="boolean" abstract="false" native="false" synchronized="false" static="false" - final="false" + final="true" deprecated="not deprecated" visibility="public" > @@ -49331,7 +49152,7 @@ visibility="public" > </method> -<method name="setAutoScalingEnabled" +<method name="setDensity" return="void" abstract="false" native="false" @@ -49341,20 +49162,7 @@ deprecated="not deprecated" visibility="public" > -<parameter name="autoScalingEnabled" type="boolean"> -</parameter> -</method> -<method name="setDensityScale" - return="void" - abstract="false" - native="false" - synchronized="false" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -<parameter name="densityScale" type="float"> +<parameter name="density" type="int"> </parameter> </method> <method name="setPixel" @@ -49424,11 +49232,11 @@ visibility="public" > </field> -<field name="DENSITY_SCALE_UNKNOWN" - type="float" +<field name="DENSITY_NONE" + type="int" transient="false" volatile="false" - value="-1.0f" + value="0" static="true" final="true" deprecated="not deprecated" @@ -49644,7 +49452,7 @@ <parameter name="id" type="int"> </parameter> </method> -<method name="decodeStream" +<method name="decodeResourceStream" return="android.graphics.Bitmap" abstract="false" native="false" @@ -49803,6 +49611,26 @@ visibility="public" > </field> +<field name="inScreenDensity" + type="int" + transient="false" + volatile="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="inTargetDensity" + type="int" + transient="false" + volatile="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="inTempStorage" type="byte[]" transient="false" @@ -51057,8 +50885,8 @@ visibility="public" > </method> -<method name="getDensityScale" - return="float" +<method name="getDensity" + return="int" abstract="false" native="false" synchronized="false" @@ -51414,7 +51242,7 @@ <parameter name="bitmap" type="android.graphics.Bitmap"> </parameter> </method> -<method name="setDensityScale" +<method name="setDensity" return="void" abstract="false" native="false" @@ -51424,7 +51252,7 @@ deprecated="not deprecated" visibility="public" > -<parameter name="densityScale" type="float"> +<parameter name="density" type="int"> </parameter> </method> <method name="setDrawFilter" @@ -53736,6 +53564,17 @@ <parameter name="paint" type="android.graphics.Paint"> </parameter> </method> +<method name="getDensity" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="getHeight" return="int" abstract="false" @@ -59139,9 +58978,29 @@ type="android.graphics.drawable.BitmapDrawable" static="false" final="false" + deprecated="deprecated" + visibility="public" +> +</constructor> +<constructor name="BitmapDrawable" + type="android.graphics.drawable.BitmapDrawable" + static="false" + final="false" deprecated="not deprecated" visibility="public" > +<parameter name="res" type="android.content.res.Resources"> +</parameter> +</constructor> +<constructor name="BitmapDrawable" + type="android.graphics.drawable.BitmapDrawable" + static="false" + final="false" + deprecated="deprecated" + visibility="public" +> +<parameter name="bitmap" type="android.graphics.Bitmap"> +</parameter> </constructor> <constructor name="BitmapDrawable" type="android.graphics.drawable.BitmapDrawable" @@ -59150,6 +59009,8 @@ deprecated="not deprecated" visibility="public" > +<parameter name="res" type="android.content.res.Resources"> +</parameter> <parameter name="bitmap" type="android.graphics.Bitmap"> </parameter> </constructor> @@ -59315,6 +59176,45 @@ <parameter name="gravity" type="int"> </parameter> </method> +<method name="setTargetDensity" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="canvas" type="android.graphics.Canvas"> +</parameter> +</method> +<method name="setTargetDensity" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="metrics" type="android.util.DisplayMetrics"> +</parameter> +</method> +<method name="setTargetDensity" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="density" type="int"> +</parameter> +</method> <method name="setTileModeX" return="void" abstract="false" @@ -59651,6 +59551,25 @@ <parameter name="pathName" type="java.lang.String"> </parameter> </method> +<method name="createFromResourceStream" + return="android.graphics.drawable.Drawable" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="res" type="android.content.res.Resources"> +</parameter> +<parameter name="value" type="android.util.TypedValue"> +</parameter> +<parameter name="is" type="java.io.InputStream"> +</parameter> +<parameter name="srcName" type="java.lang.String"> +</parameter> +</method> <method name="createFromStream" return="android.graphics.drawable.Drawable" abstract="false" @@ -61348,9 +61267,27 @@ type="android.graphics.drawable.NinePatchDrawable" static="false" final="false" + deprecated="deprecated" + visibility="public" +> +<parameter name="bitmap" type="android.graphics.Bitmap"> +</parameter> +<parameter name="chunk" type="byte[]"> +</parameter> +<parameter name="padding" type="android.graphics.Rect"> +</parameter> +<parameter name="srcName" type="java.lang.String"> +</parameter> +</constructor> +<constructor name="NinePatchDrawable" + type="android.graphics.drawable.NinePatchDrawable" + static="false" + final="false" deprecated="not deprecated" visibility="public" > +<parameter name="res" type="android.content.res.Resources"> +</parameter> <parameter name="bitmap" type="android.graphics.Bitmap"> </parameter> <parameter name="chunk" type="byte[]"> @@ -61364,9 +61301,21 @@ type="android.graphics.drawable.NinePatchDrawable" static="false" final="false" + deprecated="deprecated" + visibility="public" +> +<parameter name="patch" type="android.graphics.NinePatch"> +</parameter> +</constructor> +<constructor name="NinePatchDrawable" + type="android.graphics.drawable.NinePatchDrawable" + static="false" + final="false" deprecated="not deprecated" visibility="public" > +<parameter name="res" type="android.content.res.Resources"> +</parameter> <parameter name="patch" type="android.graphics.NinePatch"> </parameter> </constructor> @@ -61431,6 +61380,45 @@ <parameter name="cf" type="android.graphics.ColorFilter"> </parameter> </method> +<method name="setTargetDensity" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="canvas" type="android.graphics.Canvas"> +</parameter> +</method> +<method name="setTargetDensity" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="metrics" type="android.util.DisplayMetrics"> +</parameter> +</method> +<method name="setTargetDensity" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="density" type="int"> +</parameter> +</method> </class> <class name="PaintDrawable" extends="android.graphics.drawable.ShapeDrawable" @@ -79968,6 +79956,19 @@ visibility="public" > </method> +<method name="setReferenceCounted" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="refCounted" type="boolean"> +</parameter> +</method> </class> <class name="WifiManager.WifiLock" extends="java.lang.Object" @@ -111700,7 +111701,18 @@ <parameter name="filename" type="java.lang.String"> </parameter> </method> -<field name="TTS_ERROR" +<field name="ACTION_TTS_QUEUE_PROCESSING_COMPLETED" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.speech.tts.TTS_QUEUE_PROCESSING_COMPLETED"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="ERROR" type="int" transient="false" volatile="false" @@ -111711,7 +111723,7 @@ visibility="public" > </field> -<field name="TTS_LANG_AVAILABLE" +<field name="LANG_AVAILABLE" type="int" transient="false" volatile="false" @@ -111722,7 +111734,7 @@ visibility="public" > </field> -<field name="TTS_LANG_COUNTRY_AVAILABLE" +<field name="LANG_COUNTRY_AVAILABLE" type="int" transient="false" volatile="false" @@ -111733,7 +111745,7 @@ visibility="public" > </field> -<field name="TTS_LANG_COUNTRY_VAR_AVAILABLE" +<field name="LANG_COUNTRY_VAR_AVAILABLE" type="int" transient="false" volatile="false" @@ -111744,7 +111756,7 @@ visibility="public" > </field> -<field name="TTS_LANG_MISSING_DATA" +<field name="LANG_MISSING_DATA" type="int" transient="false" volatile="false" @@ -111755,7 +111767,7 @@ visibility="public" > </field> -<field name="TTS_LANG_NOT_SUPPORTED" +<field name="LANG_NOT_SUPPORTED" type="int" transient="false" volatile="false" @@ -111766,7 +111778,7 @@ visibility="public" > </field> -<field name="TTS_QUEUE_ADD" +<field name="QUEUE_ADD" type="int" transient="false" volatile="false" @@ -111777,7 +111789,7 @@ visibility="public" > </field> -<field name="TTS_QUEUE_FLUSH" +<field name="QUEUE_FLUSH" type="int" transient="false" volatile="false" @@ -111788,7 +111800,7 @@ visibility="public" > </field> -<field name="TTS_SUCCESS" +<field name="SUCCESS" type="int" transient="false" volatile="false" @@ -111816,6 +111828,28 @@ visibility="public" > </constructor> +<field name="ACTION_CHECK_TTS_DATA" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.speech.tts.engine.CHECK_TTS_DATA"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="ACTION_INSTALL_TTS_DATA" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.speech.tts.engine.INSTALL_TTS_DATA"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="CHECK_VOICE_DATA_BAD_DATA" type="int" transient="false" @@ -111871,7 +111905,7 @@ visibility="public" > </field> -<field name="TTS_DEFAULT_STREAM" +<field name="DEFAULT_STREAM" type="int" transient="false" volatile="false" @@ -111882,55 +111916,55 @@ visibility="public" > </field> -<field name="TTS_KEY_PARAM_STREAM" +<field name="EXTRA_VOICE_DATA_FILES" type="java.lang.String" transient="false" volatile="false" - value=""streamType"" + value=""dataFiles"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> -<field name="TTS_KEY_PARAM_UTTERANCE_ID" +<field name="EXTRA_VOICE_DATA_FILES_INFO" type="java.lang.String" transient="false" volatile="false" - value=""utteranceId"" + value=""dataFilesInfo"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> -<field name="VOICE_DATA_FILES" +<field name="EXTRA_VOICE_DATA_ROOT_DIRECTORY" type="java.lang.String" transient="false" volatile="false" - value=""dataFiles"" + value=""dataRoot"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> -<field name="VOICE_DATA_FILES_INFO" +<field name="KEY_PARAM_STREAM" type="java.lang.String" transient="false" volatile="false" - value=""dataFilesInfo"" + value=""streamType"" static="true" final="true" deprecated="not deprecated" visibility="public" > </field> -<field name="VOICE_DATA_ROOT_DIRECTORY" +<field name="KEY_PARAM_UTTERANCE_ID" type="java.lang.String" transient="false" volatile="false" - value=""dataRoot"" + value=""utteranceId"" static="true" final="true" deprecated="not deprecated" @@ -113235,6 +113269,746 @@ > </field> </class> +<class name="SmsManager" + extends="java.lang.Object" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="divideMessage" + return="java.util.ArrayList<java.lang.String>" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="text" type="java.lang.String"> +</parameter> +</method> +<method name="getDefault" + return="android.telephony.SmsManager" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="sendDataMessage" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="destinationAddress" type="java.lang.String"> +</parameter> +<parameter name="scAddress" type="java.lang.String"> +</parameter> +<parameter name="destinationPort" type="short"> +</parameter> +<parameter name="data" type="byte[]"> +</parameter> +<parameter name="sentIntent" type="android.app.PendingIntent"> +</parameter> +<parameter name="deliveryIntent" type="android.app.PendingIntent"> +</parameter> +</method> +<method name="sendMultipartTextMessage" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="destinationAddress" type="java.lang.String"> +</parameter> +<parameter name="scAddress" type="java.lang.String"> +</parameter> +<parameter name="parts" type="java.util.ArrayList<java.lang.String>"> +</parameter> +<parameter name="sentIntents" type="java.util.ArrayList<android.app.PendingIntent>"> +</parameter> +<parameter name="deliveryIntents" type="java.util.ArrayList<android.app.PendingIntent>"> +</parameter> +</method> +<method name="sendTextMessage" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="destinationAddress" type="java.lang.String"> +</parameter> +<parameter name="scAddress" type="java.lang.String"> +</parameter> +<parameter name="text" type="java.lang.String"> +</parameter> +<parameter name="sentIntent" type="android.app.PendingIntent"> +</parameter> +<parameter name="deliveryIntent" type="android.app.PendingIntent"> +</parameter> +</method> +<field name="RESULT_ERROR_GENERIC_FAILURE" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="RESULT_ERROR_NO_SERVICE" + type="int" + transient="false" + volatile="false" + value="4" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="RESULT_ERROR_NULL_PDU" + type="int" + transient="false" + volatile="false" + value="3" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="RESULT_ERROR_RADIO_OFF" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="STATUS_ON_ICC_FREE" + type="int" + transient="false" + volatile="false" + value="0" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="STATUS_ON_ICC_READ" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="STATUS_ON_ICC_SENT" + type="int" + transient="false" + volatile="false" + value="5" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="STATUS_ON_ICC_UNREAD" + type="int" + transient="false" + volatile="false" + value="3" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="STATUS_ON_ICC_UNSENT" + type="int" + transient="false" + volatile="false" + value="7" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<class name="SmsMessage" + extends="java.lang.Object" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<method name="calculateLength" + return="int[]" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="msgBody" type="java.lang.CharSequence"> +</parameter> +<parameter name="use7bitOnly" type="boolean"> +</parameter> +</method> +<method name="calculateLength" + return="int[]" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="messageBody" type="java.lang.String"> +</parameter> +<parameter name="use7bitOnly" type="boolean"> +</parameter> +</method> +<method name="createFromPdu" + return="android.telephony.SmsMessage" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="pdu" type="byte[]"> +</parameter> +</method> +<method name="getDisplayMessageBody" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getDisplayOriginatingAddress" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getEmailBody" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getEmailFrom" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getIndexOnIcc" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getIndexOnSim" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="deprecated" + visibility="public" +> +</method> +<method name="getMessageBody" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getMessageClass" + return="android.telephony.SmsMessage.MessageClass" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getOriginatingAddress" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getPdu" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getProtocolIdentifier" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getPseudoSubject" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getServiceCenterAddress" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getStatus" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getStatusOnIcc" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getStatusOnSim" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="deprecated" + visibility="public" +> +</method> +<method name="getSubmitPdu" + return="android.telephony.SmsMessage.SubmitPdu" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="scAddress" type="java.lang.String"> +</parameter> +<parameter name="destinationAddress" type="java.lang.String"> +</parameter> +<parameter name="message" type="java.lang.String"> +</parameter> +<parameter name="statusReportRequested" type="boolean"> +</parameter> +</method> +<method name="getSubmitPdu" + return="android.telephony.SmsMessage.SubmitPdu" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="scAddress" type="java.lang.String"> +</parameter> +<parameter name="destinationAddress" type="java.lang.String"> +</parameter> +<parameter name="destinationPort" type="short"> +</parameter> +<parameter name="data" type="byte[]"> +</parameter> +<parameter name="statusReportRequested" type="boolean"> +</parameter> +</method> +<method name="getTPLayerLengthForPDU" + return="int" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="pdu" type="java.lang.String"> +</parameter> +</method> +<method name="getTimestampMillis" + return="long" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getUserData" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isCphsMwiMessage" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isEmail" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isMWIClearMessage" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isMWISetMessage" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isMwiDontStore" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isReplace" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isReplyPathPresent" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isStatusReportMessage" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<field name="ENCODING_16BIT" + type="int" + transient="false" + volatile="false" + value="3" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="ENCODING_7BIT" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="ENCODING_8BIT" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="ENCODING_UNKNOWN" + type="int" + transient="false" + volatile="false" + value="0" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="MAX_USER_DATA_BYTES" + type="int" + transient="false" + volatile="false" + value="140" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="MAX_USER_DATA_BYTES_WITH_HEADER" + type="int" + transient="false" + volatile="false" + value="134" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="MAX_USER_DATA_SEPTETS" + type="int" + transient="false" + volatile="false" + value="160" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="MAX_USER_DATA_SEPTETS_WITH_HEADER" + type="int" + transient="false" + volatile="false" + value="153" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<class name="SmsMessage.MessageClass" + extends="java.lang.Enum" + abstract="false" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="valueOf" + return="android.telephony.SmsMessage.MessageClass" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="name" type="java.lang.String"> +</parameter> +</method> +<method name="values" + return="android.telephony.SmsMessage.MessageClass[]" + abstract="false" + native="false" + synchronized="false" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</method> +</class> +<class name="SmsMessage.SubmitPdu" + extends="java.lang.Object" + abstract="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<field name="encodedMessage" + type="byte[]" + transient="false" + volatile="false" + value="null" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="encodedScAddress" + type="byte[]" + transient="false" + volatile="false" + value="null" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> <class name="TelephonyManager" extends="java.lang.Object" abstract="false" @@ -118426,19 +119200,6 @@ <parameter name="mode" type="int"> </parameter> </method> -<method name="getSharedPrefsFile" - return="java.io.File" - abstract="false" - native="false" - synchronized="false" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -<parameter name="name" type="java.lang.String"> -</parameter> -</method> <method name="getSystemService" return="java.lang.Object" abstract="false" @@ -130421,9 +131182,33 @@ type="android.text.style.ImageSpan" static="false" final="false" + deprecated="deprecated" + visibility="public" +> +<parameter name="b" type="android.graphics.Bitmap"> +</parameter> +</constructor> +<constructor name="ImageSpan" + type="android.text.style.ImageSpan" + static="false" + final="false" + deprecated="deprecated" + visibility="public" +> +<parameter name="b" type="android.graphics.Bitmap"> +</parameter> +<parameter name="verticalAlignment" type="int"> +</parameter> +</constructor> +<constructor name="ImageSpan" + type="android.text.style.ImageSpan" + static="false" + final="false" deprecated="not deprecated" visibility="public" > +<parameter name="context" type="android.content.Context"> +</parameter> <parameter name="b" type="android.graphics.Bitmap"> </parameter> </constructor> @@ -130434,6 +131219,8 @@ deprecated="not deprecated" visibility="public" > +<parameter name="context" type="android.content.Context"> +</parameter> <parameter name="b" type="android.graphics.Bitmap"> </parameter> <parameter name="verticalAlignment" type="int"> @@ -133375,6 +134162,16 @@ visibility="public" > </field> +<field name="densityDpi" + type="int" + transient="false" + volatile="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="heightPixels" type="int" transient="false" @@ -141778,7 +142575,7 @@ value="2" static="true" final="true" - deprecated="not deprecated" + deprecated="deprecated" visibility="public" > </field> @@ -141804,6 +142601,17 @@ visibility="public" > </field> +<field name="SURFACE_FROZEN" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="SURFACE_HIDDEN" type="int" transient="false" diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index 3b9db8d..2fb3f79 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -203,7 +203,6 @@ bool BootAnimation::android() { mNativeWindowSurface->setSwapRectangle(updateRect.left, updateRect.top, updateRect.width(), updateRect.height()); - glEnable(GL_SCISSOR_TEST); glScissor(updateRect.left, mHeight - updateRect.bottom, updateRect.width(), updateRect.height()); @@ -219,6 +218,10 @@ bool BootAnimation::android() { GLint offset = (1 - (t - floorf(t))) * mAndroid[1].w; GLint x = xc - offset; + glDisable(GL_SCISSOR_TEST); + glClear(GL_COLOR_BUFFER_BIT); + + glEnable(GL_SCISSOR_TEST); glDisable(GL_BLEND); glBindTexture(GL_TEXTURE_2D, mAndroid[1].name); glDrawTexiOES(x, yc, 0, mAndroid[1].w, mAndroid[1].h); diff --git a/cmds/bootanimation/bootanimation_main.cpp b/cmds/bootanimation/bootanimation_main.cpp index 675ea81..a8359c4 100644 --- a/cmds/bootanimation/bootanimation_main.cpp +++ b/cmds/bootanimation/bootanimation_main.cpp @@ -16,6 +16,8 @@ #define LOG_TAG "BootAnimation" +#include <cutils/properties.h> + #include <utils/IPCThreadState.h> #include <utils/ProcessState.h> #include <utils/IServiceManager.h> @@ -41,12 +43,20 @@ int main(int argc, char** argv) setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY); #endif - sp<ProcessState> proc(ProcessState::self()); - ProcessState::self()->startThreadPool(); + char value[PROPERTY_VALUE_MAX]; + property_get("debug.sf.nobootanimation", value, "0"); + int noBootAnimation = atoi(value); + LOGI_IF(noBootAnimation, "boot animation disabled"); + if (!noBootAnimation) { + + sp<ProcessState> proc(ProcessState::self()); + ProcessState::self()->startThreadPool(); + + // create the boot animation object + sp<BootAnimation> boot = new BootAnimation(); - // create the boot animation object - sp<BootAnimation> boot = new BootAnimation(); + IPCThreadState::self()->joinThreadPool(); - IPCThreadState::self()->joinThreadPool(); + } return 0; } diff --git a/cmds/keystore/keymgmt.c b/cmds/keystore/keymgmt.c index 66edd56..9a1f845 100644 --- a/cmds/keystore/keymgmt.c +++ b/cmds/keystore/keymgmt.c @@ -79,14 +79,26 @@ static int encrypt_n_save(AES_KEY *enc_key, DATA_BLOB *blob, { int size, fd, ret = -1; unsigned char enc_blob[MAX_BLOB_LEN]; - char tmpfile[KEYFILE_LEN]; + + if ((keyfile == NULL) || (strlen(keyfile) >= (KEYFILE_LEN - 4))) { + LOGE("keyfile name is too long or null"); + return -1; + } strcpy(tmpfile, keyfile); strcat(tmpfile, ".tmp"); // prepare the blob + if (IV_LEN > USER_KEY_LEN) { + LOGE("iv length is too long."); + return -1; + } memcpy(blob->iv, iv, IV_LEN); blob->blob_size = get_blob_size(blob); + if (blob->blob_size > MAX_BLOB_LEN) { + LOGE("blob data size is too large."); + return -1; + } memcpy(enc_blob, blob->blob, blob->blob_size); AES_cbc_encrypt((unsigned char *)enc_blob, (unsigned char *)blob->blob, blob->blob_size, enc_key, iv, AES_ENCRYPT); @@ -133,8 +145,13 @@ static int store_master_key(char *upasswd, unsigned char *master_key) DATA_BLOB blob; // prepare the blob + if (strlen(MASTER_KEY_TAG) >= USER_KEY_LEN) return -1; strlcpy(blob.keyname, MASTER_KEY_TAG, USER_KEY_LEN); blob.value_size = USER_KEY_LEN; + if (USER_KEY_LEN > MAX_KEY_VALUE_LENGTH) { + LOGE("master_key length is too long."); + return -1; + } memcpy((void*)blob.value, (const void*)master_key, USER_KEY_LEN); // generate the encryption key @@ -150,6 +167,10 @@ static int get_master_key(char *upasswd, unsigned char *master_key) get_decrypt_key(upasswd, &key); ret = load_n_decrypt(MASTER_KEY_TAG, MASTER_KEY, &key, &blob); + if (blob.value_size > USER_KEY_LEN) { + LOGE("the blob's value size is too large"); + return -1; + } if (!ret) memcpy(master_key, blob.value, blob.value_size); return ret; } @@ -207,6 +228,11 @@ int remove_key(const char *namespace, const char *keyname) char keyfile[KEYFILE_LEN]; if (state != UNLOCKED) return -state; + if ((strlen(namespace) >= MAX_KEY_NAME_LENGTH) || + (strlen(keyname) >= MAX_KEY_NAME_LENGTH)) { + LOGE("keyname is too long."); + return -1; + } sprintf(keyfile, KEYFILE_NAME, namespace, keyname); return unlink(keyfile); } @@ -222,10 +248,18 @@ int put_key(const char *namespace, const char *keyname, LOGE("Can not store key with current state %d\n", state); return -state; } + if ((strlen(namespace) >= MAX_KEY_NAME_LENGTH) || + (strlen(keyname) >= MAX_KEY_NAME_LENGTH)) { + LOGE("keyname is too long."); + return -1; + } sprintf(keyfile, KEYFILE_NAME, namespace, keyname); - // flatten the args strcpy(blob.keyname, keyname); blob.value_size = size; + if (size > MAX_KEY_VALUE_LENGTH) { + LOGE("the data size is too large."); + return -1; + } memcpy(blob.value, data, size); return encrypt_n_save(&encryptKey, &blob, keyfile); } @@ -242,10 +276,16 @@ int get_key(const char *namespace, const char *keyname, LOGE("Can not retrieve key value with current state %d\n", state); return -state; } + if ((strlen(namespace) >= MAX_KEY_NAME_LENGTH) || + (strlen(keyname) >= MAX_KEY_NAME_LENGTH)) { + LOGE("keyname is too long."); + return -1; + } sprintf(keyfile, KEYFILE_NAME, namespace, keyname); ret = load_n_decrypt(keyname, keyfile, &decryptKey, &blob); if (!ret) { if ((blob.value_size > MAX_KEY_VALUE_LENGTH)) { + LOGE("blob value size is too large."); ret = -1; } else { *size = blob.value_size; @@ -269,6 +309,13 @@ int list_keys(const char *namespace, char reply[BUFFER_MAX]) LOGE("cannot open keystore dir or namespace is null\n"); return -1; } + + if (strlen(namespace) >= MAX_KEY_NAME_LENGTH) { + LOGE("namespace is too long."); + return -1; + } + + reply[0] = 0; while ((de = readdir(d))) { char *prefix, *name, *keyfile = de->d_name; char *context = NULL; @@ -337,6 +384,7 @@ KEYSTORE_STATE get_state() int reset_keystore() { + int ret = 0; DIR *d; struct dirent *de; @@ -344,18 +392,24 @@ int reset_keystore() LOGE("cannot open keystore dir\n"); return -1; } - while ((de = readdir(d))) unlink(de->d_name); + while ((de = readdir(d))) { + if (unlink(de->d_name) != 0) ret = -1; + } closedir(d); state = UNINITIALIZED; - LOGI("keystore is reset."); - return 0; + if (ret == 0) { + LOGI("keystore is reset."); + } else { + LOGI("keystore can not be cleaned up entirely."); + } + return ret; } int init_keystore(const char *dir) { int fd; - if (!dir) mkdir(dir, 0770); + if (dir) mkdir(dir, 0770); if (!dir || chdir(dir)) { LOGE("Can not open/create the keystore directory %s\n", dir ? dir : "(null)"); diff --git a/cmds/keystore/tests/Android.mk b/cmds/keystore/tests/Android.mk new file mode 100644 index 0000000..33541cc --- /dev/null +++ b/cmds/keystore/tests/Android.mk @@ -0,0 +1,28 @@ +# 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 the KEYSTORE_TESTS environment variable to build the test programs +ifdef KEYSTORE_TESTS +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) +LOCAL_SRC_FILES:= netkeystore_test.c ../keymgmt.c +LOCAL_SHARED_LIBRARIES := libcutils libssl +LOCAL_MODULE:= netkeystore_test +LOCAL_MODULE_TAGS := optional +LOCAL_C_INCLUDES := external/openssl/include \ + frameworks/base/cmds/keystore +EXTRA_CFLAGS := -g -O0 -DGTEST_OS_LINUX -DGTEST_HAS_STD_STRING +include $(BUILD_EXECUTABLE) + +endif #KEYSTORE_TESTS diff --git a/cmds/keystore/tests/netkeystore_test.c b/cmds/keystore/tests/netkeystore_test.c new file mode 100644 index 0000000..e7e686b --- /dev/null +++ b/cmds/keystore/tests/netkeystore_test.c @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include "common.h" +#include "keymgmt.h" + +typedef int FUNC_PTR(); +typedef struct { + const char *name; + FUNC_PTR *func; +} TESTFUNC; + +#define FUNC_NAME(x) { #x, test_##x } +#define FUNC_BODY(x) int test_##x() + +#define TEST_PASSWD "12345678" +#define TEST_NPASSWD "11111111" +#define TEST_DIR "/data/local/tmp/keystore" +#define READONLY_DIR "/proc/keystore" +#define TEST_NAMESPACE "test" +#define TEST_KEYNAME "key" +#define TEST_KEYNAME2 "key2" +#define TEST_KEYVALUE "ANDROID" + +void setup() +{ + if (init_keystore(TEST_DIR) != 0) { + fprintf(stderr, "Can not create the test directory %s\n", TEST_DIR); + exit(-1); + } +} + +void teardown() +{ + reset_keystore(); + rmdir(TEST_DIR); +} + +FUNC_BODY(init_keystore) +{ + if (init_keystore(READONLY_DIR) == 0) return -1; + + return EXIT_SUCCESS; +} + +FUNC_BODY(reset_keystore) +{ + chdir("/procx"); + if (reset_keystore() == 0) return -1; + chdir(TEST_DIR); + return EXIT_SUCCESS; +} + +FUNC_BODY(get_state) +{ + if (get_state() != UNINITIALIZED) return -1; + passwd(TEST_PASSWD); + if (get_state() != UNLOCKED) return -1; + lock(); + if (get_state() != LOCKED) return -1; + reset_keystore(); + if (get_state() != UNINITIALIZED) return -1; + return EXIT_SUCCESS; +} + +FUNC_BODY(passwd) +{ + char buf[512]; + + if (passwd(" 23432dsfsdf") == 0) return -1; + if (passwd("dsfsdf") == 0) return -1; + passwd(TEST_PASSWD); + lock(); + if (unlock("55555555") == 0) return -1; + if (unlock(TEST_PASSWD) != 0) return -1; + + // change the password + sprintf(buf, "%s %s", "klfdjdsklfjg", "abcdefghi"); + if (passwd(buf) == 0) return -1; + + sprintf(buf, "%s %s", TEST_PASSWD, TEST_NPASSWD); + if (passwd(buf) != 0) return -1; + lock(); + + if (unlock(TEST_PASSWD) == 0) return -1; + if (unlock(TEST_NPASSWD) != 0) return -1; + + return EXIT_SUCCESS; +} + +FUNC_BODY(lock) +{ + if (lock() == 0) return -1; + passwd(TEST_PASSWD); + if (lock() != 0) return -1; + if (lock() != 0) return -1; + return EXIT_SUCCESS; +} + +FUNC_BODY(unlock) +{ + int i = MAX_RETRY_COUNT; + passwd(TEST_PASSWD); + lock(); + while (i > 1) { + if (unlock(TEST_NPASSWD) != --i) return -1; + } + if (unlock(TEST_NPASSWD) != -1) return -1; + return EXIT_SUCCESS; +} + +FUNC_BODY(put_key) +{ + int i = 0; + char keyname[512]; + + if (put_key(TEST_NAMESPACE, TEST_KEYNAME, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)) == 0) return -1; + passwd(TEST_PASSWD); + if (put_key(TEST_NAMESPACE, TEST_KEYNAME, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)) != 0) return -1; + + for(i = 0; i < 500; i++) keyname[i] = 'K'; + keyname[i] = 0; + if (put_key(TEST_NAMESPACE, keyname, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)) == 0) return -1; + if (put_key(TEST_NAMESPACE, TEST_KEYNAME, (unsigned char *)TEST_KEYVALUE, + MAX_KEY_VALUE_LENGTH + 1) == 0) return -1; + return EXIT_SUCCESS; +} + +FUNC_BODY(get_key) +{ + int size; + unsigned char data[MAX_KEY_VALUE_LENGTH]; + + if (get_key(TEST_NAMESPACE, TEST_KEYNAME, data, &size) == 0) return -1; + + passwd(TEST_PASSWD); + put_key(TEST_NAMESPACE, TEST_KEYNAME, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)); + if (get_key(TEST_NAMESPACE, TEST_KEYNAME, data, &size) != 0) return -1; + if (memcmp(data, TEST_KEYVALUE, size) != 0) return -1; + + return EXIT_SUCCESS; +} + +FUNC_BODY(remove_key) +{ + if (remove_key(TEST_NAMESPACE, TEST_KEYNAME) == 0) return -1; + + passwd(TEST_PASSWD); + if (remove_key(TEST_NAMESPACE, TEST_KEYNAME) == 0) return -1; + + put_key(TEST_NAMESPACE, TEST_KEYNAME, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)); + if (remove_key(TEST_NAMESPACE, TEST_KEYNAME) != 0) return -1; + + return EXIT_SUCCESS; +} + +FUNC_BODY(list_keys) +{ + int i; + char buf[128]; + char reply[BUFFER_MAX]; + + for(i = 0; i < 100; i++) buf[i] = 'K'; + buf[i] = 0; + + if (list_keys(TEST_NAMESPACE, reply) == 0) return -1; + + passwd(TEST_PASSWD); + if (list_keys(buf, reply) == 0) return -1; + + if (list_keys(TEST_NAMESPACE, reply) != 0) return -1; + if (strcmp(reply, "") != 0) return -1; + + put_key(TEST_NAMESPACE, TEST_KEYNAME, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)); + if (list_keys(TEST_NAMESPACE, reply) != 0) return -1; + if (strcmp(reply, TEST_KEYNAME) != 0) return -1; + + put_key(TEST_NAMESPACE, TEST_KEYNAME2, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)); + + if (list_keys(TEST_NAMESPACE, reply) != 0) return -1; + sprintf(buf, "%s %s", TEST_KEYNAME2, TEST_KEYNAME); + if (strcmp(reply, buf) != 0) return -1; + + return EXIT_SUCCESS; +} + +TESTFUNC all_tests[] = { + FUNC_NAME(init_keystore), + FUNC_NAME(reset_keystore), + FUNC_NAME(get_state), + FUNC_NAME(passwd), + FUNC_NAME(lock), + FUNC_NAME(unlock), + FUNC_NAME(put_key), + FUNC_NAME(get_key), + FUNC_NAME(remove_key), + FUNC_NAME(list_keys), +}; + +int main(int argc, char **argv) { + int i, ret; + for (i = 0 ; i < (int)(sizeof(all_tests)/sizeof(TESTFUNC)) ; ++i) { + setup(); + if ((ret = all_tests[i].func()) != EXIT_SUCCESS) { + fprintf(stderr, "ERROR in function %s\n", all_tests[i].name); + return ret; + } else { + fprintf(stderr, "function %s PASSED!\n", all_tests[i].name); + } + teardown(); + } + return EXIT_SUCCESS; +} diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index a3456c7..79bd6e7 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -163,6 +163,10 @@ public abstract class AccessibilityService extends Service { } } + /** + * Implement to return the implementation of the internal accessibility + * service interface. Subclasses should not override. + */ @Override public final IBinder onBind(Intent intent) { return new IEventListenerWrapper(this); diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index ba6cc32..447512a 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -1085,6 +1085,23 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM reply.writeInt(result); return true; } + + case KILL_APPLICATION_WITH_UID_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + String pkg = data.readString(); + int uid = data.readInt(); + killApplicationWithUid(pkg, uid); + reply.writeNoException(); + return true; + } + + case CLOSE_SYSTEM_DIALOGS_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + String reason = data.readString(); + closeSystemDialogs(reason); + reply.writeNoException(); + return true; + } } return super.onTransact(code, data, reply, flags); @@ -2368,6 +2385,29 @@ class ActivityManagerProxy implements IActivityManager data.recycle(); return result; } + + public void killApplicationWithUid(String pkg, int uid) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeString(pkg); + data.writeInt(uid); + mRemote.transact(KILL_APPLICATION_WITH_UID_TRANSACTION, data, reply, 0); + reply.readException(); + data.recycle(); + reply.recycle(); + } + + public void closeSystemDialogs(String reason) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeString(reason); + mRemote.transact(CLOSE_SYSTEM_DIALOGS_TRANSACTION, data, reply, 0); + reply.readException(); + data.recycle(); + reply.recycle(); + } private IBinder mRemote; } diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 76b47f1..32a2891 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -177,11 +177,17 @@ public final class ActivityThread { synchronized (mPackages) { // Resources is app scale dependent. ResourcesKey key = new ResourcesKey(resDir, compInfo.applicationScale); - //Log.w(TAG, "getTopLevelResources: " + resDir); + if (false) { + Log.w(TAG, "getTopLevelResources: " + resDir + " / " + + compInfo.applicationScale); + } WeakReference<Resources> wr = mActiveResources.get(key); Resources r = wr != null ? wr.get() : null; if (r != null && r.getAssets().isUpToDate()) { - //Log.w(TAG, "Returning cached resources " + r + " " + resDir); + if (false) { + Log.w(TAG, "Returning cached resources " + r + " " + resDir + + ": appScale=" + r.getCompatibilityInfo().applicationScale); + } return r; } @@ -198,7 +204,11 @@ public final class ActivityThread { //Log.i(TAG, "Resource: key=" + key + ", display metrics=" + metrics); DisplayMetrics metrics = getDisplayMetricsLocked(false); r = new Resources(assets, metrics, getConfiguration(), compInfo); - //Log.i(TAG, "Created app resources " + r + ": " + r.getConfiguration()); + if (false) { + Log.i(TAG, "Created app resources " + resDir + " " + r + ": " + + r.getConfiguration() + " appScale=" + + r.getCompatibilityInfo().applicationScale); + } // XXX need to remove entries when weak references go away mActiveResources.put(key, new WeakReference<Resources>(r)); return r; @@ -3624,7 +3634,7 @@ public final class ActivityThread { Locale.setDefault(config.locale); } - Resources.updateSystemConfiguration(config, null); + Resources.updateSystemConfiguration(config, dm); ApplicationContext.ApplicationPackageManager.configurationChanged(); //Log.i(TAG, "Configuration changed in " + currentPackageName()); @@ -3743,6 +3753,14 @@ public final class ActivityThread { data.info = getPackageInfoNoCheck(data.appInfo); + /** + * Switch this process to density compatibility mode if needed. + */ + if ((data.appInfo.flags&ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) + == 0) { + Bitmap.setDefaultDensity(DisplayMetrics.DENSITY_DEFAULT); + } + if (data.debugMode != IApplicationThread.DEBUG_OFF) { // XXX should have option to change the port. Debug.changeDebugPort(8100); diff --git a/core/java/android/app/ApplicationContext.java b/core/java/android/app/ApplicationContext.java index afb2fe9..92929ea 100644 --- a/core/java/android/app/ApplicationContext.java +++ b/core/java/android/app/ApplicationContext.java @@ -541,7 +541,10 @@ class ApplicationContext extends Context { if (fd != null) { Bitmap bm = BitmapFactory.decodeFileDescriptor(fd.getFileDescriptor()); if (bm != null) { - return new BitmapDrawable(bm); + // For now clear the density until we figure out how + // to deal with it for wallpapers. + bm.setDensity(0); + return new BitmapDrawable(getResources(), bm); } } } catch (RemoteException e) { @@ -1949,6 +1952,15 @@ class ApplicationContext extends Context { try { Resources r = getResourcesForApplication(appInfo); dr = r.getDrawable(resid); + if (false) { + RuntimeException e = new RuntimeException("here"); + e.fillInStackTrace(); + Log.w(TAG, "Getting drawable 0x" + Integer.toHexString(resid) + + " from package " + packageName + + ": app scale=" + r.getCompatibilityInfo().applicationScale + + ", caller scale=" + mContext.getResources().getCompatibilityInfo().applicationScale, + e); + } if (DEBUG_ICONS) Log.v(TAG, "Getting drawable 0x" + Integer.toHexString(resid) + " from " + r + ": " + dr); @@ -2036,10 +2048,9 @@ class ApplicationContext extends Context { if (app.packageName.equals("system")) { return mContext.mMainThread.getSystemContext().getResources(); } - ActivityThread.PackageInfo pi = mContext.mMainThread.getPackageInfoNoCheck(app); Resources r = mContext.mMainThread.getTopLevelResources( app.uid == Process.myUid() ? app.sourceDir - : app.publicSourceDir, pi); + : app.publicSourceDir, mContext.mPackageInfo); if (r != null) { return r; } diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 95b376c..f6ef549 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -266,7 +266,11 @@ public interface IActivityManager extends IInterface { Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, boolean onlyIfNeeded) throws RemoteException; - + + public void killApplicationWithUid(String pkg, int uid) throws RemoteException; + + public void closeSystemDialogs(String reason) throws RemoteException; + /* * Private non-Binder interfaces */ @@ -421,4 +425,6 @@ public interface IActivityManager extends IInterface { int REGISTER_ACTIVITY_WATCHER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+92; int UNREGISTER_ACTIVITY_WATCHER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+93; int START_ACTIVITY_IN_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+94; + int KILL_APPLICATION_WITH_UID_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+95; + int CLOSE_SYSTEM_DIALOGS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+96; } diff --git a/core/java/android/app/IActivityWatcher.aidl b/core/java/android/app/IActivityWatcher.aidl index 5d36e3f..6737545 100644 --- a/core/java/android/app/IActivityWatcher.aidl +++ b/core/java/android/app/IActivityWatcher.aidl @@ -23,4 +23,5 @@ package android.app; */ oneway interface IActivityWatcher { void activityResuming(int activityId); + void closingSystemDialogs(String reason); } diff --git a/core/java/android/app/LauncherActivity.java b/core/java/android/app/LauncherActivity.java index accdda9..d788c43 100644 --- a/core/java/android/app/LauncherActivity.java +++ b/core/java/android/app/LauncherActivity.java @@ -297,7 +297,7 @@ public abstract class LauncherActivity extends ListActivity { icon.setBounds(x, y, x + width, y + height); icon.draw(canvas); icon.setBounds(mOldBounds); - icon = new BitmapDrawable(thumb); + icon = new BitmapDrawable(getResources(), thumb); } else if (iconWidth < width && iconHeight < height) { final Bitmap.Config c = Bitmap.Config.ARGB_8888; final Bitmap thumb = Bitmap.createBitmap(mIconWidth, mIconHeight, c); @@ -309,7 +309,7 @@ public abstract class LauncherActivity extends ListActivity { icon.setBounds(x, y, x + iconWidth, y + iconHeight); icon.draw(canvas); icon.setBounds(mOldBounds); - icon = new BitmapDrawable(thumb); + icon = new BitmapDrawable(getResources(), thumb); } } diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java index f9c38f9..f7479bc 100644 --- a/core/java/android/app/PendingIntent.java +++ b/core/java/android/app/PendingIntent.java @@ -273,11 +273,6 @@ public final class PendingIntent implements Parcelable { return null; } - private class IntentSenderWrapper extends IntentSender { - protected IntentSenderWrapper(IIntentSender target) { - super(target); - } - } /** * Retrieve a IntentSender object that wraps the existing sender of the PendingIntent * @@ -285,7 +280,7 @@ public final class PendingIntent implements Parcelable { * */ public IntentSender getIntentSender() { - return new IntentSenderWrapper(mTarget); + return new IntentSender(mTarget); } /** diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java index 27c6376..18e4a52 100644 --- a/core/java/android/app/SearchDialog.java +++ b/core/java/android/app/SearchDialog.java @@ -34,7 +34,10 @@ import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; +import android.os.IBinder; +import android.os.RemoteException; import android.os.SystemClock; +import android.provider.Browser; import android.server.search.SearchableInfo; import android.speech.RecognizerIntent; import android.text.Editable; @@ -42,11 +45,13 @@ import android.text.InputType; import android.text.TextUtils; import android.text.TextWatcher; import android.text.util.Regex; +import android.util.AndroidRuntimeException; import android.util.AttributeSet; import android.util.Log; import android.view.ContextThemeWrapper; import android.view.Gravity; import android.view.KeyEvent; +import android.view.Menu; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; @@ -240,7 +245,12 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS } return success; } - + + private boolean isInRealAppSearch() { + return !mGlobalSearchMode + && (mPreviousComponents == null || mPreviousComponents.isEmpty()); + } + /** * Called in response to a press of the hard search button in * {@link #onKeyDown(int, KeyEvent)}, this method toggles between in-app @@ -260,6 +270,16 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS if (!mGlobalSearchMode) { mStoredComponentName = mLaunchComponent; mStoredAppSearchData = mAppSearchData; + + // If this is the browser, we have a special case to not show the icon to the left + // of the text field, for extra space for url entry (this should be reconciled in + // Eclair). So special case a second tap of the search button to remove any + // already-entered text so that we can be sure to show the "Quick Search Box" hint + // text to still make it clear to the user that we've jumped out to global search. + // + // TODO: When the browser icon issue is reconciled in Eclair, remove this special case. + if (isBrowserSearch()) currentSearchText = ""; + return doShow(currentSearchText, false, null, mAppSearchData, true); } else { if (mStoredComponentName != null) { @@ -531,12 +551,14 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS // we dismiss the entire dialog instead mSearchAutoComplete.setDropDownDismissedOnCompletion(false); - if (mGlobalSearchMode) { + if (!isInRealAppSearch()) { mSearchAutoComplete.setDropDownAlwaysVisible(true); // fill space until results come in } else { mSearchAutoComplete.setDropDownAlwaysVisible(false); } + mSearchAutoComplete.setForceIgnoreOutsideTouch(true); + // 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) { @@ -565,7 +587,11 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS } private void updateSearchAppIcon() { - if (mGlobalSearchMode) { + // In Donut, we special-case the case of the browser to hide the app icon as if it were + // global search, for extra space for url entry. + // + // TODO: Remove this special case once the issue has been reconciled in Eclair. + if (mGlobalSearchMode || isBrowserSearch()) { mAppIcon.setImageResource(0); mAppIcon.setVisibility(View.GONE); mSearchPlate.setPadding(SEARCH_PLATE_LEFT_PADDING_GLOBAL, @@ -658,6 +684,49 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS } /** + * Hack to determine whether this is the browser, so we can remove the browser icon + * to the left of the search field, as a special requirement for Donut. + * + * TODO: For Eclair, reconcile this with the rest of the global search UI. + */ + private boolean isBrowserSearch() { + return mLaunchComponent.flattenToShortString().startsWith("com.android.browser/"); + } + + /* + * Menu. + */ + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Show search settings menu item if anyone handles the intent for it + Intent settingsIntent = new Intent(SearchManager.INTENT_ACTION_SEARCH_SETTINGS); + settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + PackageManager pm = getContext().getPackageManager(); + ActivityInfo activityInfo = settingsIntent.resolveActivityInfo(pm, 0); + if (activityInfo != null) { + settingsIntent.setClassName(activityInfo.applicationInfo.packageName, + activityInfo.name); + CharSequence label = activityInfo.loadLabel(getContext().getPackageManager()); + menu.add(Menu.NONE, Menu.NONE, Menu.NONE, label) + .setIcon(android.R.drawable.ic_menu_preferences) + .setAlphabeticShortcut('P') + .setIntent(settingsIntent); + return true; + } + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onMenuOpened(int featureId, Menu menu) { + // The menu shows up above the IME, regardless of whether it is in front + // of the drop-down or not. This looks weird when there is no IME, so + // we make sure it is visible. + mSearchAutoComplete.ensureImeVisible(); + return super.onMenuOpened(featureId, menu); + } + + /** * Listeners of various types */ @@ -794,7 +863,6 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS if (!event.isSystem() && (keyCode != KeyEvent.KEYCODE_DPAD_UP) && - (keyCode != KeyEvent.KEYCODE_DPAD_DOWN) && (keyCode != KeyEvent.KEYCODE_DPAD_LEFT) && (keyCode != KeyEvent.KEYCODE_DPAD_RIGHT) && (keyCode != KeyEvent.KEYCODE_DPAD_CENTER)) { @@ -835,6 +903,12 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS getContext().startActivity(mVoiceWebSearchIntent); } else if (mSearchable.getVoiceSearchLaunchRecognizer()) { Intent appSearchIntent = createVoiceAppSearchIntent(mVoiceAppSearchIntent); + + // Stop the existing search before starting voice search, or else we'll end + // up showing the search dialog again once we return to the app. + ((SearchManager) getContext().getSystemService(Context.SEARCH_SERVICE)). + stopSearch(); + getContext().startActivity(appSearchIntent); } } catch (ActivityNotFoundException e) { @@ -1093,7 +1167,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS */ protected void launchQuerySearch(int actionKey, String actionMsg) { String query = mSearchAutoComplete.getText().toString(); - Intent intent = createIntent(Intent.ACTION_SEARCH, null, null, query, null, + String action = mGlobalSearchMode ? Intent.ACTION_WEB_SEARCH : Intent.ACTION_SEARCH; + Intent intent = createIntent(action, null, null, query, null, actionKey, actionMsg); launchIntent(intent); } @@ -1169,11 +1244,11 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS // ensure the icons will work for global search cv.put(SearchManager.SUGGEST_COLUMN_ICON_1, wrapIconForPackage( - source, + mSearchable.getSuggestPackage(), getColumnString(c, SearchManager.SUGGEST_COLUMN_ICON_1))); cv.put(SearchManager.SUGGEST_COLUMN_ICON_2, wrapIconForPackage( - source, + mSearchable.getSuggestPackage(), getColumnString(c, SearchManager.SUGGEST_COLUMN_ICON_2))); // the rest can be passed through directly @@ -1212,11 +1287,11 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS * Wraps an icon for a particular package. If the icon is a resource id, it is converted into * an android.resource:// URI. * - * @param source The source of the icon + * @param packageName The source of the icon * @param icon The icon retrieved from a suggestion column * @return An icon string appropriate for the package. */ - private String wrapIconForPackage(ComponentName source, String icon) { + private String wrapIconForPackage(String packageName, String icon) { if (icon == null || icon.length() == 0 || "0".equals(icon)) { // SearchManager specifies that null or zero can be returned to indicate // no icon. We also allow empty string. @@ -1224,7 +1299,6 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS } else if (!Character.isDigit(icon.charAt(0))){ return icon; } else { - String packageName = source.getPackageName(); return new Uri.Builder() .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) .authority(packageName) @@ -1245,16 +1319,133 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS return; } Log.d(LOG_TAG, "launching " + intent); - getContext().startActivity(intent); + try { + // in global search mode, we send the activity straight to the original suggestion + // source. this is because GlobalSearch may not have permission to launch the + // intent, and to avoid the extra step of going through GlobalSearch. + if (mGlobalSearchMode) { + launchGlobalSearchIntent(intent); + } else { + // If the intent was created from a suggestion, it will always have an explicit + // component here. + Log.i(LOG_TAG, "Starting (as ourselves) " + intent.toURI()); + getContext().startActivity(intent); + // If the search switches to a different activity, + // SearchDialogWrapper#performActivityResuming + // will handle hiding the dialog when the next activity starts, but for + // real in-app search, we still need to dismiss the dialog. + if (isInRealAppSearch()) { + dismiss(); + } + } + } catch (RuntimeException ex) { + Log.e(LOG_TAG, "Failed launch activity: " + intent, ex); + } + } - // in global search mode, SearchDialogWrapper#performActivityResuming will handle hiding - // the dialog when the next activity starts, but for in-app search, we still need to - // dismiss the dialog. - if (!mGlobalSearchMode) { - dismiss(); + private void launchGlobalSearchIntent(Intent intent) { + final String packageName; + // GlobalSearch puts the original source of the suggestion in the + // 'component name' column. If set, we send the intent to that activity. + // We trust GlobalSearch to always set this to the suggestion source. + String intentComponent = intent.getStringExtra(SearchManager.COMPONENT_NAME_KEY); + if (intentComponent != null) { + ComponentName componentName = ComponentName.unflattenFromString(intentComponent); + intent.setComponent(componentName); + intent.removeExtra(SearchManager.COMPONENT_NAME_KEY); + // Launch the intent as the suggestion source. + // This prevents sources from using the search dialog to launch + // intents that they don't have permission for themselves. + packageName = componentName.getPackageName(); + } else { + // If there is no component in the suggestion, it must be a built-in suggestion + // from GlobalSearch (e.g. "Search the web for") or the intent + // launched when pressing the search/go button in the search dialog. + // Launch the intent with the permissions of GlobalSearch. + packageName = mSearchable.getSearchActivity().getPackageName(); } + + // Launch all global search suggestions as new tasks, since they don't relate + // to the current task. + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + setBrowserApplicationId(intent); + + startActivityInPackage(intent, packageName); } - + + /** + * If the intent is to open an HTTP or HTTPS URL, we set + * {@link Browser#EXTRA_APPLICATION_ID} so that any existing browser window that + * has been opened by us for the same URL will be reused. + */ + private void setBrowserApplicationId(Intent intent) { + Uri data = intent.getData(); + if (Intent.ACTION_VIEW.equals(intent.getAction()) && data != null) { + String scheme = data.getScheme(); + if (scheme != null && scheme.startsWith("http")) { + intent.putExtra(Browser.EXTRA_APPLICATION_ID, data.toString()); + } + } + } + + /** + * Starts an activity as if it had been started by the given package. + * + * @param intent The description of the activity to start. + * @param packageName + * @throws ActivityNotFoundException If the intent could not be resolved to + * and existing activity. + * @throws SecurityException If the package does not have permission to start + * start the activity. + * @throws AndroidRuntimeException If some other error occurs. + */ + private void startActivityInPackage(Intent intent, String packageName) { + try { + int uid = ActivityThread.getPackageManager().getPackageUid(packageName); + if (uid < 0) { + throw new AndroidRuntimeException("Package UID not found " + packageName); + } + String resolvedType = intent.resolveTypeIfNeeded(getContext().getContentResolver()); + IBinder resultTo = null; + String resultWho = null; + int requestCode = -1; + boolean onlyIfNeeded = false; + Log.i(LOG_TAG, "Starting (uid " + uid + ", " + packageName + ") " + intent.toURI()); + int result = ActivityManagerNative.getDefault().startActivityInPackage( + uid, intent, resolvedType, resultTo, resultWho, requestCode, onlyIfNeeded); + checkStartActivityResult(result, intent); + } catch (RemoteException ex) { + throw new AndroidRuntimeException(ex); + } + } + + // Stolen from Instrumentation.checkStartActivityResult() + private static void checkStartActivityResult(int res, Intent intent) { + if (res >= IActivityManager.START_SUCCESS) { + return; + } + switch (res) { + case IActivityManager.START_INTENT_NOT_RESOLVED: + case IActivityManager.START_CLASS_NOT_FOUND: + if (intent.getComponent() != null) + throw new ActivityNotFoundException( + "Unable to find explicit activity class " + + intent.getComponent().toShortString() + + "; have you declared this activity in your AndroidManifest.xml?"); + throw new ActivityNotFoundException( + "No Activity found to handle " + intent); + case IActivityManager.START_PERMISSION_DENIED: + throw new SecurityException("Not allowed to start activity " + + intent); + case IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT: + throw new AndroidRuntimeException( + "FORWARD_RESULT_FLAG used while also requesting a result"); + default: + throw new AndroidRuntimeException("Unknown error code " + + res + " when starting " + intent); + } + } + /** * Handles the special intent actions declared in {@link SearchManager}. * @@ -1284,13 +1475,13 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS return; } if (DBG) Log.d(LOG_TAG, "Switching to " + componentName); - - ComponentName previous = mLaunchComponent; + + pushPreviousComponent(mLaunchComponent); if (!show(componentName, mAppSearchData, false)) { Log.w(LOG_TAG, "Failed to switch to source " + componentName); + popPreviousComponent(); return; } - pushPreviousComponent(previous); String query = intent.getStringExtra(SearchManager.QUERY); setUserQuery(query); @@ -1460,8 +1651,10 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS intent.putExtra(SearchManager.ACTION_KEY, actionKey); intent.putExtra(SearchManager.ACTION_MSG, actionMsg); } - // attempt to enforce security requirement (no 3rd-party intents) - intent.setComponent(mSearchable.getSearchActivity()); + // Only allow 3rd-party intents from GlobalSearch + if (!mGlobalSearchMode) { + intent.setComponent(mSearchable.getSearchActivity()); + } return intent; } @@ -1582,6 +1775,12 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS if (mSearchDialog.backToPreviousComponent()) { return true; } + // If the drop-down obscures the keyboard, the user wouldn't see anything + // happening when pressing back, so we dismiss the entire dialog instead. + if (isInputMethodNotNeeded()) { + mSearchDialog.cancel(); + return true; + } return false; // will dismiss soft keyboard if necessary } return false; diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java index 0631ad5..fd559d6 100644 --- a/core/java/android/app/SearchManager.java +++ b/core/java/android/app/SearchManager.java @@ -1215,18 +1215,13 @@ public class SearchManager = "DialogCursorProtocol.POST_REFRESH.displayNotify"; /** - * Just before closing the cursor. - */ - public final static int PRE_CLOSE = 1; - public final static String PRE_CLOSE_SEND_MAX_DISPLAY_POS - = "DialogCursorProtocol.PRE_CLOSE.sendDisplayPosition"; - - /** * When a position has been clicked. */ public final static int CLICK = 2; public final static String CLICK_SEND_POSITION = "DialogCursorProtocol.CLICK.sendPosition"; + public final static String CLICK_SEND_MAX_DISPLAY_POS + = "DialogCursorProtocol.CLICK.sendDisplayPosition"; public final static String CLICK_RECEIVE_SELECTED_POS = "DialogCursorProtocol.CLICK.receiveSelectedPosition"; diff --git a/core/java/android/app/SuggestionsAdapter.java b/core/java/android/app/SuggestionsAdapter.java index 593b7b7..4a00e48 100644 --- a/core/java/android/app/SuggestionsAdapter.java +++ b/core/java/android/app/SuggestionsAdapter.java @@ -27,6 +27,7 @@ import android.content.res.Resources; import android.database.Cursor; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.graphics.drawable.DrawableContainer; import android.graphics.drawable.StateListDrawable; import android.net.Uri; import android.os.Bundle; @@ -135,6 +136,8 @@ class SuggestionsAdapter extends ResourceCursorAdapter { private int mPreviousLength = 0; public long getPostingDelay(CharSequence constraint) { + if (constraint == null) return 0; + long delay = constraint.length() < mPreviousLength ? DELETE_KEY_POST_DELAY : 0; mPreviousLength = constraint.length(); return delay; @@ -191,37 +194,21 @@ class SuggestionsAdapter extends ResourceCursorAdapter { public void changeCursor(Cursor c) { if (DBG) Log.d(LOG_TAG, "changeCursor(" + c + ")"); - if (mCursor != null) { - callCursorPreClose(mCursor); - } - - super.changeCursor(c); - if (c != null) { - mFormatCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_FORMAT); - mText1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1); - mText2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2); - mIconName1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1); - mIconName2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_2); - mBackgroundColorCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_BACKGROUND_COLOR); + try { + super.changeCursor(c); + if (c != null) { + mFormatCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_FORMAT); + mText1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1); + mText2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2); + mIconName1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1); + mIconName2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_2); + mBackgroundColorCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_BACKGROUND_COLOR); + } + } catch (Exception e) { + Log.e(LOG_TAG, "error changing cursor and caching columns", e); } } - /** - * Handle sending and receiving information associated with - * {@link DialogCursorProtocol#PRE_CLOSE}. - * - * @param cursor The cursor to call. - */ - private void callCursorPreClose(Cursor cursor) { - if (!mGlobalSearchMode) return; - final Bundle request = new Bundle(); - request.putInt(DialogCursorProtocol.METHOD, DialogCursorProtocol.PRE_CLOSE); - request.putInt(DialogCursorProtocol.PRE_CLOSE_SEND_MAX_DISPLAY_POS, mMaxDisplayed); - final Bundle response = cursor.respond(request); - - mMaxDisplayed = -1; - } - @Override public void notifyDataSetChanged() { if (DBG) Log.d(LOG_TAG, "notifyDataSetChanged"); @@ -267,7 +254,9 @@ class SuggestionsAdapter extends ResourceCursorAdapter { final Bundle request = new Bundle(1); request.putInt(DialogCursorProtocol.METHOD, DialogCursorProtocol.CLICK); request.putInt(DialogCursorProtocol.CLICK_SEND_POSITION, position); + request.putInt(DialogCursorProtocol.CLICK_SEND_MAX_DISPLAY_POS, mMaxDisplayed); final Bundle response = cursor.respond(request); + mMaxDisplayed = -1; mListItemToSelect = response.getInt( DialogCursorProtocol.CLICK_RECEIVE_SELECTED_POS, SuggestionsAdapter.NONE); } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 9e37ae4..25b5de3 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -1283,7 +1283,8 @@ public abstract class Context { * Use with {@link #getSystemService} to retrieve an * {@blink android.backup.IBackupManager IBackupManager} for communicating * with the backup mechanism. - * + * @hide + * * @see #getSystemService */ public static final String BACKUP_SERVICE = "backup"; diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index 45a082a..15612ce 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -135,6 +135,7 @@ public class ContextWrapper extends Context { return mBase.getPackageCodePath(); } + /** @hide */ @Override public File getSharedPrefsFile(String name) { return mBase.getSharedPrefsFile(name); diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index a5f298c..c62d66b 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -1683,53 +1683,7 @@ public class Intent implements Parcelable { @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_REBOOT = "android.intent.action.REBOOT"; - /** - * Broadcast Action: Triggers the platform Text-To-Speech engine to - * start the activity that installs the resource files on the device - * that are required for TTS to be operational. Since the installation - * of the data can be interrupted or declined by the user, the application - * shouldn't expect successful installation upon return from that intent, - * and if need be, should check installation status with - * {@link #ACTION_TTS_CHECK_TTS_DATA}. - */ - @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) - public static final String ACTION_TTS_INSTALL_TTS_DATA = - "android.intent.action.INSTALL_TTS_DATA"; - - /** - * Broadcast Action: Starts the activity from the platform Text-To-Speech - * engine to verify the proper installation and availability of the - * resource files on the system. Upon completion, the activity will - * return one of the following codes: - * {@link android.speech.tts.TextToSpeech.Engine#CHECK_VOICE_DATA_PASS}, - * {@link android.speech.tts.TextToSpeech.Engine#CHECK_VOICE_DATA_FAIL}, - * {@link android.speech.tts.TextToSpeech.Engine#CHECK_VOICE_DATA_BAD_DATA}, - * {@link android.speech.tts.TextToSpeech.Engine#CHECK_VOICE_DATA_MISSING_DATA}, or - * {@link android.speech.tts.TextToSpeech.Engine#CHECK_VOICE_DATA_MISSING_VOLUME}. - * <p> Moreover, the data received in the activity result will contain the following - * fields: - * <ul> - * <li>{@link android.speech.tts.TextToSpeech.Engine#VOICE_DATA_ROOT_DIRECTORY} which - * indicates the path to the location of the resource files</li>, - * <li>{@link android.speech.tts.TextToSpeech.Engine#VOICE_DATA_FILES} which contains - * the list of all the resource files</li>, - * <li>and {@link android.speech.tts.TextToSpeech.Engine#VOICE_DATA_FILES_INFO} which - * contains, for each resource file, the description of the language covered by - * the file in the xxx-YYY format, where xxx is the 3-letter ISO language code, - * and YYY is the 3-letter ISO country code.</li> - * </ul> - */ - @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) - public static final String ACTION_TTS_CHECK_TTS_DATA = - "android.intent.action.CHECK_TTS_DATA"; - /** - * Broadcast Action: The TextToSpeech synthesizer has completed processing - * all of the text in the speech queue. - */ - @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) - public static final String ACTION_TTS_QUEUE_PROCESSING_COMPLETED = - "android.intent.action.TTS_QUEUE_PROCESSING_COMPLETED"; // --------------------------------------------------------------------- // --------------------------------------------------------------------- @@ -2390,7 +2344,7 @@ public class Intent implements Parcelable { /** * Create an intent from a URI. This URI may encode the action, * category, and other intent fields, if it was returned by - * {@link #toUri}.. If the Intent was not generate by toUri(), its data + * {@link #toUri}. If the Intent was not generate by toUri(), its data * will be the entire URI and its action will be ACTION_VIEW. * * <p>The URI given here must not be relative -- that is, it must include diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java index 4da49d9..0e4d984 100644 --- a/core/java/android/content/IntentSender.java +++ b/core/java/android/content/IntentSender.java @@ -52,6 +52,9 @@ import android.util.AndroidException; * categories, and components, and same flags), it will receive a IntentSender * representing the same token if that is still valid. * + * <p>Instances of this class can not be made directly, but rather must be + * created from an existing {@link android.app.PendingIntent} with + * {@link android.app.PendingIntent#getIntentSender() PendingIntent.getIntentSender()}. */ public class IntentSender implements Parcelable { private final IIntentSender mTarget; @@ -245,11 +248,13 @@ public class IntentSender implements Parcelable { return b != null ? new IntentSender(b) : null; } - protected IntentSender(IIntentSender target) { + /** @hide */ + public IntentSender(IIntentSender target) { mTarget = target; } - protected IntentSender(IBinder target) { + /** @hide */ + public IntentSender(IBinder target) { mTarget = IIntentSender.Stub.asInterface(target); } } diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 4a3137f..0a42a6f 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -131,8 +131,9 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public static final int FLAG_UPDATED_SYSTEM_APP = 1<<7; /** - * Value for {@link #flags}: this is set of the application has set - * its android:targetSdkVersion to something >= the current SDK version. + * Value for {@link #flags}: this is set of the application has specified + * {@link android.R.styleable#AndroidManifestApplication_testOnly + * android:testOnly} to be true. */ public static final int FLAG_TEST_ONLY = 1<<8; @@ -169,21 +170,22 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public static final int FLAG_RESIZEABLE_FOR_SCREENS = 1<<12; /** + * Value for {@link #flags}: true when the application knows how to + * accomodate different screen densities. Corresponds to + * {@link android.R.styleable#AndroidManifestSupportsScreens_anyDensity + * android:anyDensity}. + */ + public static final int FLAG_SUPPORTS_SCREEN_DENSITIES = 1<<13; + + /** * Value for {@link #flags}: this is false if the application has set * its android:allowBackup to false, true otherwise. * * {@hide} */ - public static final int FLAG_ALLOW_BACKUP = 1<<13; + public static final int FLAG_ALLOW_BACKUP = 1<<14; /** - * Indicates that the application supports any densities; - * {@hide} - */ - public static final int ANY_DENSITY = -1; - static final int[] ANY_DENSITIES_ARRAY = { ANY_DENSITY }; - - /** * Flags associated with the application. Any combination of * {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE}, * {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and @@ -228,13 +230,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public int uid; /** - * The list of densities in DPI that application supprots. This - * field is only set if the {@link PackageManager#GET_SUPPORTS_DENSITIES} flag was - * used when retrieving the structure. - */ - 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} @@ -267,7 +262,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { pw.println(prefix + "enabled=" + enabled); pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName); pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes)); - pw.println(prefix + "supportsDensities=" + supportsDensities); super.dumpBack(pw, prefix); } @@ -314,7 +308,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { enabled = orig.enabled; manageSpaceActivityName = orig.manageSpaceActivityName; descriptionRes = orig.descriptionRes; - supportsDensities = orig.supportsDensities; } @@ -346,7 +339,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { dest.writeString(manageSpaceActivityName); dest.writeString(backupAgentName); dest.writeInt(descriptionRes); - dest.writeIntArray(supportsDensities); } public static final Parcelable.Creator<ApplicationInfo> CREATOR @@ -377,7 +369,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { manageSpaceActivityName = source.readString(); backupAgentName = source.readString(); descriptionRes = source.readInt(); - supportsDensities = source.createIntArray(); } /** @@ -408,7 +399,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { */ public void disableCompatibilityMode() { flags |= (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS | - FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS); - supportsDensities = ANY_DENSITIES_ARRAY; + FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS | + FLAG_SUPPORTS_SCREEN_DENSITIES); } } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 941ca9e..67bd1ac 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -165,12 +165,6 @@ public abstract class PackageManager { public static final int GET_CONFIGURATIONS = 0x00004000; /** - * {@link ApplicationInfo} flag: return the - * {@link ApplicationInfo#supportsDensities} that the package supports. - */ - public static final int GET_SUPPORTS_DENSITIES = 0x00008000; - - /** * Resolution and querying flag: if set, only filters that support the * {@link android.content.Intent#CATEGORY_DEFAULT} will be considered for * matching. This is a synonym for including the CATEGORY_DEFAULT in your diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 93ba959..33f4b52 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -675,6 +675,7 @@ public class PackageParser { int supportsNormalScreens = 1; int supportsLargeScreens = 1; int resizeable = 1; + int anyDensity = 1; int outerDepth = parser.getDepth(); while ((type=parser.next()) != parser.END_DOCUMENT @@ -854,21 +855,6 @@ public class PackageParser { XmlUtils.skipCurrentTag(parser); - } else if (tagName.equals("supports-density")) { - sa = res.obtainAttributes(attrs, - com.android.internal.R.styleable.AndroidManifestSupportsDensity); - - int density = sa.getInteger( - com.android.internal.R.styleable.AndroidManifestSupportsDensity_density, -1); - - sa.recycle(); - - if (density != -1 && !pkg.supportsDensityList.contains(density)) { - pkg.supportsDensityList.add(density); - } - - XmlUtils.skipCurrentTag(parser); - } else if (tagName.equals("supports-screens")) { sa = res.obtainAttributes(attrs, com.android.internal.R.styleable.AndroidManifestSupportsScreens); @@ -887,6 +873,9 @@ public class PackageParser { resizeable = sa.getInteger( com.android.internal.R.styleable.AndroidManifestSupportsScreens_resizeable, supportsLargeScreens); + anyDensity = sa.getInteger( + com.android.internal.R.styleable.AndroidManifestSupportsScreens_anyDensity, + anyDensity); sa.recycle(); @@ -962,7 +951,7 @@ public class PackageParser { if (supportsSmallScreens < 0 || (supportsSmallScreens > 0 && pkg.applicationInfo.targetSdkVersion - >= android.os.Build.VERSION_CODES.CUR_DEVELOPMENT)) { + >= android.os.Build.VERSION_CODES.DONUT)) { pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS; } if (supportsNormalScreens != 0) { @@ -970,32 +959,19 @@ public class PackageParser { } if (supportsLargeScreens < 0 || (supportsLargeScreens > 0 && pkg.applicationInfo.targetSdkVersion - >= android.os.Build.VERSION_CODES.CUR_DEVELOPMENT)) { + >= android.os.Build.VERSION_CODES.DONUT)) { pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS; } if (resizeable < 0 || (resizeable > 0 && pkg.applicationInfo.targetSdkVersion - >= android.os.Build.VERSION_CODES.CUR_DEVELOPMENT)) { + >= android.os.Build.VERSION_CODES.DONUT)) { pkg.applicationInfo.flags |= ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS; } - int densities[] = null; - int size = pkg.supportsDensityList.size(); - if (size > 0) { - densities = pkg.supportsDensities = new int[size]; - List<Integer> densityList = pkg.supportsDensityList; - for (int i = 0; i < size; i++) { - densities[i] = densityList.get(i); - } - } - /** - * TODO: enable this before code freeze. b/1967935 - * * - if ((densities == null || densities.length == 0) - && (pkg.applicationInfo.targetSdkVersion - >= android.os.Build.VERSION_CODES.CUR_DEVELOPMENT)) { - pkg.supportsDensities = ApplicationInfo.ANY_DENSITIES_ARRAY; + if (anyDensity < 0 || (anyDensity > 0 + && pkg.applicationInfo.targetSdkVersion + >= android.os.Build.VERSION_CODES.DONUT)) { + pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES; } - */ return pkg; } @@ -2446,9 +2422,6 @@ public class PackageParser { // We store the application meta-data independently to avoid multiple unwanted references public Bundle mAppMetaData = null; - public final ArrayList<Integer> supportsDensityList = new ArrayList<Integer>(); - public int[] supportsDensities = null; - // If this is a 3rd party app, this is the path of the zip file. public String mPath; @@ -2630,10 +2603,6 @@ public class PackageParser { && p.usesLibraryFiles != null) { return true; } - if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0 - && p.supportsDensities != null) { - return true; - } return false; } @@ -2656,9 +2625,6 @@ public class PackageParser { if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) { ai.sharedLibraryFiles = p.usesLibraryFiles; } - if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0) { - ai.supportsDensities = p.supportsDensities; - } if (!sCompatibilityModeEnabled) { ai.disableCompatibilityMode(); } diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java index 5c7b01f..8ebe093 100644 --- a/core/java/android/content/res/AssetManager.java +++ b/core/java/android/content/res/AssetManager.java @@ -637,12 +637,13 @@ public final class AssetManager { * mRetData. */ private native final int loadResourceBagValue(int ident, int bagEntryId, TypedValue outValue, boolean resolve); - /*package*/ static final int STYLE_NUM_ENTRIES = 5; + /*package*/ static final int STYLE_NUM_ENTRIES = 6; /*package*/ static final int STYLE_TYPE = 0; /*package*/ static final int STYLE_DATA = 1; /*package*/ static final int STYLE_ASSET_COOKIE = 2; /*package*/ static final int STYLE_RESOURCE_ID = 3; /*package*/ static final int STYLE_CHANGING_CONFIGURATIONS = 4; + /*package*/ static final int STYLE_DENSITY = 5; /*package*/ native static final boolean applyStyle(int theme, int defStyleAttr, int defStyleRes, int xmlParser, int[] inAttrs, int[] outValues, int[] outIndices); diff --git a/core/java/android/content/res/CompatibilityInfo.java b/core/java/android/content/res/CompatibilityInfo.java index 517551e..50faf57 100644 --- a/core/java/android/content/res/CompatibilityInfo.java +++ b/core/java/android/content/res/CompatibilityInfo.java @@ -131,41 +131,15 @@ public class CompatibilityInfo { mCompatibilityFlags |= EXPANDABLE | CONFIGURED_EXPANDABLE; } - float packageDensityScale = -1.0f; - int packageDensity = 0; - if (appInfo.supportsDensities != null) { - int minDiff = Integer.MAX_VALUE; - for (int density : appInfo.supportsDensities) { - if (density == ApplicationInfo.ANY_DENSITY) { - packageDensity = DisplayMetrics.DENSITY_DEVICE; - packageDensityScale = 1.0f; - break; - } - int tmpDiff = Math.abs(DisplayMetrics.DENSITY_DEVICE - density); - if (tmpDiff == 0) { - packageDensity = DisplayMetrics.DENSITY_DEVICE; - packageDensityScale = 1.0f; - break; - } - // prefer higher density (appScale>1.0), unless that's only option. - if (tmpDiff < minDiff && packageDensityScale < 1.0f) { - packageDensity = density; - packageDensityScale = DisplayMetrics.DENSITY_DEVICE / (float) density; - minDiff = tmpDiff; - } - } - } - if (packageDensityScale > 0.0f) { - applicationDensity = packageDensity; - applicationScale = packageDensityScale; + if ((appInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) { + applicationDensity = DisplayMetrics.DENSITY_DEVICE; + applicationScale = 1.0f; + applicationInvertedScale = 1.0f; } else { applicationDensity = DisplayMetrics.DENSITY_DEFAULT; - applicationScale = - DisplayMetrics.DENSITY_DEVICE / (float) DisplayMetrics.DENSITY_DEFAULT; - } - - applicationInvertedScale = 1.0f / applicationScale; - if (applicationScale != 1.0f) { + applicationScale = DisplayMetrics.DENSITY_DEVICE + / (float) DisplayMetrics.DENSITY_DEFAULT; + applicationInvertedScale = 1.0f / applicationScale; mCompatibilityFlags |= SCALING_REQUIRED; } } @@ -254,20 +228,11 @@ public class CompatibilityInfo { } /** - * Returns the translator which can translate the coordinates of the window. - * There are five different types of Translator. + * Returns the translator which translates the coordinates in compatibility mode. * @param params the window's parameter */ - public Translator getTranslator(WindowManager.LayoutParams params) { - if ( (mCompatibilityFlags & SCALING_EXPANDABLE_MASK) - == (EXPANDABLE|LARGE_SCREENS)) { - if (DBG) Log.d(TAG, "no translation required"); - return null; - } - if (!isScalingRequired()) { - return null; - } - return new Translator(); + public Translator getTranslator() { + return isScalingRequired() ? new Translator() : null; } /** diff --git a/core/java/android/content/res/TypedArray.java b/core/java/android/content/res/TypedArray.java index 3a32c03..016ee7f 100644 --- a/core/java/android/content/res/TypedArray.java +++ b/core/java/android/content/res/TypedArray.java @@ -654,6 +654,7 @@ public class TypedArray { outValue.assetCookie = data[index+AssetManager.STYLE_ASSET_COOKIE]; outValue.resourceId = data[index+AssetManager.STYLE_RESOURCE_ID]; outValue.changingConfigurations = data[index+AssetManager.STYLE_CHANGING_CONFIGURATIONS]; + outValue.density = data[index+AssetManager.STYLE_DENSITY]; if (type == TypedValue.TYPE_STRING) { outValue.string = loadStringValueAt(index); } diff --git a/core/java/android/database/MatrixCursor.java b/core/java/android/database/MatrixCursor.java index cf5a573..d5c3a32 100644 --- a/core/java/android/database/MatrixCursor.java +++ b/core/java/android/database/MatrixCursor.java @@ -214,53 +214,64 @@ public class MatrixCursor extends AbstractCursor { // AbstractCursor implementation. + @Override public int getCount() { return rowCount; } + @Override public String[] getColumnNames() { return columnNames; } + @Override public String getString(int column) { - return String.valueOf(get(column)); + Object value = get(column); + if (value == null) return null; + return value.toString(); } + @Override public short getShort(int column) { Object value = get(column); - return (value instanceof String) - ? Short.valueOf((String) value) - : ((Number) value).shortValue(); + if (value == null) return 0; + if (value instanceof Number) return ((Number) value).shortValue(); + return Short.parseShort(value.toString()); } + @Override public int getInt(int column) { Object value = get(column); - return (value instanceof String) - ? Integer.valueOf((String) value) - : ((Number) value).intValue(); + if (value == null) return 0; + if (value instanceof Number) return ((Number) value).intValue(); + return Integer.parseInt(value.toString()); } + @Override public long getLong(int column) { Object value = get(column); - return (value instanceof String) - ? Long.valueOf((String) value) - : ((Number) value).longValue(); + if (value == null) return 0; + if (value instanceof Number) return ((Number) value).longValue(); + return Long.parseLong(value.toString()); } + @Override public float getFloat(int column) { Object value = get(column); - return (value instanceof String) - ? Float.valueOf((String) value) - : ((Number) value).floatValue(); + if (value == null) return 0.0f; + if (value instanceof Number) return ((Number) value).floatValue(); + return Float.parseFloat(value.toString()); } + @Override public double getDouble(int column) { Object value = get(column); - return (value instanceof String) - ? Double.valueOf((String) value) - : ((Number) value).doubleValue(); + if (value == null) return 0.0d; + if (value instanceof Number) return ((Number) value).doubleValue(); + return Double.parseDouble(value.toString()); } + @Override public boolean isNull(int column) { return get(column) == null; } diff --git a/core/java/android/gesture/GestureLibrary.java b/core/java/android/gesture/GestureLibrary.java index a29c2c8..ec2e78c 100644 --- a/core/java/android/gesture/GestureLibrary.java +++ b/core/java/android/gesture/GestureLibrary.java @@ -35,6 +35,7 @@ public abstract class GestureLibrary { return false; } + /** @hide */ public Learner getLearner() { return mStore.getLearner(); } diff --git a/core/java/android/inputmethodservice/KeyboardView.java b/core/java/android/inputmethodservice/KeyboardView.java index 8b474d5..9c9c143 100755 --- a/core/java/android/inputmethodservice/KeyboardView.java +++ b/core/java/android/inputmethodservice/KeyboardView.java @@ -32,6 +32,7 @@ import android.os.Handler; import android.os.Message; import android.os.SystemClock; import android.util.AttributeSet; +import android.util.TypedValue; import android.view.GestureDetector; import android.view.Gravity; import android.view.LayoutInflater; @@ -161,8 +162,8 @@ public class KeyboardView extends View implements View.OnClickListener { private static final int MSG_REMOVE_PREVIEW = 2; private static final int MSG_REPEAT = 3; private static final int MSG_LONGPRESS = 4; - - private static final int DELAY_BEFORE_PREVIEW = 70; + + private static final int DELAY_BEFORE_PREVIEW = 40; private static final int DELAY_AFTER_PREVIEW = 60; private int mVerticalCorrection; @@ -825,10 +826,10 @@ public class KeyboardView extends View implements View.OnClickListener { mPreviewText.setCompoundDrawables(null, null, null, null); mPreviewText.setText(getPreviewText(key)); if (key.label.length() > 1 && key.codes.length < 2) { - mPreviewText.setTextSize(mKeyTextSize); + mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyTextSize); mPreviewText.setTypeface(Typeface.DEFAULT_BOLD); } else { - mPreviewText.setTextSize(mPreviewTextSizeLarge); + mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSizeLarge); mPreviewText.setTypeface(Typeface.DEFAULT); } } diff --git a/core/java/android/provider/CallLog.java b/core/java/android/provider/CallLog.java index 7d03801..afe219c 100644 --- a/core/java/android/provider/CallLog.java +++ b/core/java/android/provider/CallLog.java @@ -151,34 +151,20 @@ public class CallLog { int presentation, int callType, long start, int duration) { final ContentResolver resolver = context.getContentResolver(); - // TODO(Moto): Which is correct: original code, this only changes the - // number if the number is empty and never changes the caller info name. - if (false) { - if (TextUtils.isEmpty(number)) { - if (presentation == Connection.PRESENTATION_RESTRICTED) { - number = CallerInfo.PRIVATE_NUMBER; - } else if (presentation == Connection.PRESENTATION_PAYPHONE) { - number = CallerInfo.PAYPHONE_NUMBER; - } else { - number = CallerInfo.UNKNOWN_NUMBER; - } - } - } else { - // NEWCODE: From Motorola - - //If this is a private number then set the number to Private, otherwise check - //if the number field is empty and set the number to Unavailable + // If this is a private number then set the number to Private, otherwise check + // if the number field is empty and set the number to Unavailable if (presentation == Connection.PRESENTATION_RESTRICTED) { number = CallerInfo.PRIVATE_NUMBER; - ci.name = ""; + if (ci != null) ci.name = ""; } else if (presentation == Connection.PRESENTATION_PAYPHONE) { number = CallerInfo.PAYPHONE_NUMBER; - ci.name = ""; - } else if (TextUtils.isEmpty(number) || presentation == Connection.PRESENTATION_UNKNOWN) { + if (ci != null) ci.name = ""; + } else if (TextUtils.isEmpty(number) + || presentation == Connection.PRESENTATION_UNKNOWN) { number = CallerInfo.UNKNOWN_NUMBER; - ci.name = ""; + if (ci != null) ci.name = ""; } - } + ContentValues values = new ContentValues(5); values.put(NUMBER, number); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index b5440f2..9a9ddc9 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2917,6 +2917,13 @@ public final class Settings { public static final String VENDING_TOS_URL = "vending_tos_url"; /** + * URL to navigate to in browser (not Market) when the terms of service + * for Vending Machine could not be accessed due to bad network + * connection. + */ + public static final String VENDING_TOS_MISSING_URL = "vending_tos_missing_url"; + + /** * Whether to use sierraqa instead of sierra tokens for the purchase flow in * Vending Machine. * diff --git a/core/java/android/server/search/SearchDialogWrapper.java b/core/java/android/server/search/SearchDialogWrapper.java index d3ef5de..49718cb 100644 --- a/core/java/android/server/search/SearchDialogWrapper.java +++ b/core/java/android/server/search/SearchDialogWrapper.java @@ -63,6 +63,8 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { private static final int MSG_STOP_SEARCH = 2; // arg1 is activity id private static final int MSG_ACTIVITY_RESUMING = 3; + // obj is the reason + private static final int MSG_CLOSING_SYSTEM_DIALOGS = 4; private static final String KEY_INITIAL_QUERY = "q"; private static final String KEY_LAUNCH_ACTIVITY = "a"; @@ -127,8 +129,7 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { private void registerBroadcastReceiver() { if (!mReceiverRegistered) { IntentFilter filter = new IntentFilter( - Intent.ACTION_CLOSE_SYSTEM_DIALOGS); - filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); + Intent.ACTION_CONFIGURATION_CHANGED); mContext.registerReceiver(mBroadcastReceiver, filter, null, mSearchUiThread); mReceiverRegistered = true; @@ -149,12 +150,7 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); - if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) { - if (!"search".equals(intent.getStringExtra("reason"))) { - if (DBG) debug(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); - performStopSearch(); - } - } else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) { + if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) { if (DBG) debug(Intent.ACTION_CONFIGURATION_CHANGED); performOnConfigurationChanged(); } @@ -190,6 +186,9 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { msgData.putBundle(KEY_APP_SEARCH_DATA, appSearchData); msgData.putInt(KEY_IDENT, ident); mSearchUiThread.sendMessage(msg); + // be a little more eager in setting this so isVisible will return the correct value if + // called immediately after startSearch + mVisible = true; } /** @@ -199,6 +198,9 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { public void stopSearch() { if (DBG) debug("stopSearch()"); mSearchUiThread.sendEmptyMessage(MSG_STOP_SEARCH); + // be a little more eager in setting this so isVisible will return the correct value if + // called immediately after stopSearch + mVisible = false; } /** @@ -213,6 +215,18 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { mSearchUiThread.sendMessage(msg); } + /** + * Handles closing of system windows/dialogs + * Can be called from any thread. + */ + public void closingSystemDialogs(String reason) { + if (DBG) debug("closingSystemDialogs(reason=" + reason + ")"); + Message msg = Message.obtain(); + msg.what = MSG_CLOSING_SYSTEM_DIALOGS; + msg.obj = reason; + mSearchUiThread.sendMessage(msg); + } + // // Implementation methods that run on the search UI thread // @@ -238,6 +252,9 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { case MSG_ACTIVITY_RESUMING: performActivityResuming(msg.arg1); break; + case MSG_CLOSING_SYSTEM_DIALOGS: + performClosingSystemDialogs((String)msg.obj); + break; } } @@ -324,6 +341,19 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { } /** + * Updates due to system dialogs being closed + * This must be called on the search UI thread. + */ + void performClosingSystemDialogs(String reason) { + if (DBG) debug("performClosingSystemDialogs(): mStartedIdent=" + + mStartedIdent + ", reason: " + reason); + if (!"search".equals(reason)) { + if (DBG) debug(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); + performStopSearch(); + } + } + + /** * Must be called from the search UI thread. */ void performOnConfigurationChanged() { diff --git a/core/java/android/server/search/SearchManagerService.java b/core/java/android/server/search/SearchManagerService.java index fdeb8f9..afed4a4 100644 --- a/core/java/android/server/search/SearchManagerService.java +++ b/core/java/android/server/search/SearchManagerService.java @@ -138,6 +138,11 @@ public class SearchManagerService extends ISearchManager.Stub { if (mSearchDialog == null) return; mSearchDialog.activityResuming(activityId); } + public void closingSystemDialogs(String reason) { + if (DBG) Log.i("foo", "********************** closing dialogs: " + reason); + if (mSearchDialog == null) return; + mSearchDialog.closingSystemDialogs(reason); + } }; /** diff --git a/core/java/android/server/search/SearchableInfo.java b/core/java/android/server/search/SearchableInfo.java index 045b0c2..69ef98c 100644 --- a/core/java/android/server/search/SearchableInfo.java +++ b/core/java/android/server/search/SearchableInfo.java @@ -103,6 +103,14 @@ public final class SearchableInfo implements Parcelable { } /** + * Gets the name of the package where the suggestion provider lives, + * or {@code null}. + */ + public String getSuggestPackage() { + return mSuggestProviderPackage; + } + + /** * Gets the component name of the searchable activity. */ public ComponentName getSearchActivity() { diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java index bb6b4b0..b033c6a 100755 --- a/core/java/android/speech/tts/TextToSpeech.java +++ b/core/java/android/speech/tts/TextToSpeech.java @@ -18,6 +18,8 @@ package android.speech.tts; import android.speech.tts.ITts; import android.speech.tts.ITtsCallback; +import android.annotation.SdkConstant; +import android.annotation.SdkConstant.SdkConstantType; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -41,51 +43,60 @@ public class TextToSpeech { /** * Denotes a successful operation. */ - public static final int TTS_SUCCESS = 0; + public static final int SUCCESS = 0; /** * Denotes a generic operation failure. */ - public static final int TTS_ERROR = -1; + public static final int ERROR = -1; /** * Queue mode where all entries in the playback queue (media to be played * and text to be synthesized) are dropped and replaced by the new entry. */ - public static final int TTS_QUEUE_FLUSH = 0; + public static final int QUEUE_FLUSH = 0; /** * Queue mode where the new entry is added at the end of the playback queue. */ - public static final int TTS_QUEUE_ADD = 1; + public static final int QUEUE_ADD = 1; /** * Denotes the language is available exactly as specified by the locale */ - public static final int TTS_LANG_COUNTRY_VAR_AVAILABLE = 2; + public static final int LANG_COUNTRY_VAR_AVAILABLE = 2; /** * Denotes the language is available for the language and country specified * by the locale, but not the variant. */ - public static final int TTS_LANG_COUNTRY_AVAILABLE = 1; + public static final int LANG_COUNTRY_AVAILABLE = 1; /** * Denotes the language is available for the language by the locale, * but not the country and variant. */ - public static final int TTS_LANG_AVAILABLE = 0; + public static final int LANG_AVAILABLE = 0; /** * Denotes the language data is missing. */ - public static final int TTS_LANG_MISSING_DATA = -1; + public static final int LANG_MISSING_DATA = -1; /** * Denotes the language is not supported by the current TTS engine. */ - public static final int TTS_LANG_NOT_SUPPORTED = -2; + public static final int LANG_NOT_SUPPORTED = -2; + + + /** + * Broadcast Action: The TextToSpeech synthesizer has completed processing + * of all the text in the speech queue. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_TTS_QUEUE_PROCESSING_COMPLETED = + "android.speech.tts.TTS_QUEUE_PROCESSING_COMPLETED"; /** @@ -119,126 +130,167 @@ public class TextToSpeech { /** * {@hide} */ - public static final int FALLBACK_TTS_DEFAULT_RATE = 100; // 1x + public static final int DEFAULT_RATE = 100; // 1x /** * {@hide} */ - public static final int FALLBACK_TTS_DEFAULT_PITCH = 100;// 1x + public static final int DEFAULT_PITCH = 100;// 1x /** * {@hide} */ - public static final int FALLBACK_TTS_USE_DEFAULTS = 0; // false + public static final int USE_DEFAULTS = 0; // false /** * {@hide} */ - public static final String FALLBACK_TTS_DEFAULT_SYNTH = "com.svox.pico"; + public static final String DEFAULT_SYNTH = "com.svox.pico"; // default values for rendering - public static final int TTS_DEFAULT_STREAM = AudioManager.STREAM_MUSIC; + public static final int DEFAULT_STREAM = AudioManager.STREAM_MUSIC; // return codes for a TTS engine's check data activity /** * Indicates success when checking the installation status of the resources used by the - * text-to-speech engine with the android.intent.action.CHECK_TTS_DATA intent. + * text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. */ public static final int CHECK_VOICE_DATA_PASS = 1; /** * Indicates failure when checking the installation status of the resources used by the - * text-to-speech engine with the android.intent.action.CHECK_TTS_DATA intent. + * text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. */ public static final int CHECK_VOICE_DATA_FAIL = 0; /** * Indicates erroneous data when checking the installation status of the resources used by - * the text-to-speech engine with the android.intent.action.CHECK_TTS_DATA intent. + * the text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. */ public static final int CHECK_VOICE_DATA_BAD_DATA = -1; /** * Indicates missing resources when checking the installation status of the resources used - * by the text-to-speech engine with the android.intent.action.CHECK_TTS_DATA intent. + * by the text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. */ public static final int CHECK_VOICE_DATA_MISSING_DATA = -2; /** * Indicates missing storage volume when checking the installation status of the resources - * used by the text-to-speech engine with the android.intent.action.CHECK_TTS_DATA intent. + * used by the text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. */ public static final int CHECK_VOICE_DATA_MISSING_VOLUME = -3; - // return codes for a TTS engine's check data activity + // intents to ask engine to install data or check its data + /** + * Broadcast Action: Triggers the platform Text-To-Speech engine to + * start the activity that installs the resource files on the device + * that are required for TTS to be operational. Since the installation + * of the data can be interrupted or declined by the user, the application + * shouldn't expect successful installation upon return from that intent, + * and if need be, should check installation status with + * {@link #ACTION_CHECK_TTS_DATA}. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_INSTALL_TTS_DATA = + "android.speech.tts.engine.INSTALL_TTS_DATA"; + + /** + * Broadcast Action: Starts the activity from the platform Text-To-Speech + * engine to verify the proper installation and availability of the + * resource files on the system. Upon completion, the activity will + * return one of the following codes: + * {@link #CHECK_VOICE_DATA_PASS}, + * {@link #CHECK_VOICE_DATA_FAIL}, + * {@link #CHECK_VOICE_DATA_BAD_DATA}, + * {@link #CHECK_VOICE_DATA_MISSING_DATA}, or + * {@link #CHECK_VOICE_DATA_MISSING_VOLUME}. + * <p> Moreover, the data received in the activity result will contain the following + * fields: + * <ul> + * <li>{@link #EXTRA_VOICE_DATA_ROOT_DIRECTORY} which + * indicates the path to the location of the resource files</li>, + * <li>{@link #EXTRA_VOICE_DATA_FILES} which contains + * the list of all the resource files</li>, + * <li>and {@link #EXTRA_VOICE_DATA_FILES_INFO} which + * contains, for each resource file, the description of the language covered by + * the file in the xxx-YYY format, where xxx is the 3-letter ISO language code, + * and YYY is the 3-letter ISO country code.</li> + * </ul> + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_CHECK_TTS_DATA = + "android.speech.tts.engine.CHECK_TTS_DATA"; + + // extras for a TTS engine's check data activity /** - * Extra information received with the android.intent.action.CHECK_TTS_DATA intent where + * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where * the text-to-speech engine specifies the path to its resources. */ - public static final String VOICE_DATA_ROOT_DIRECTORY = "dataRoot"; + public static final String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot"; /** - * Extra information received with the android.intent.action.CHECK_TTS_DATA intent where + * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where * the text-to-speech engine specifies the file names of its resources under the * resource path. */ - public static final String VOICE_DATA_FILES = "dataFiles"; + public static final String EXTRA_VOICE_DATA_FILES = "dataFiles"; /** - * Extra information received with the android.intent.action.CHECK_TTS_DATA intent where + * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where * the text-to-speech engine specifies the locale associated with each resource file. */ - public static final String VOICE_DATA_FILES_INFO = "dataFilesInfo"; + public static final String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo"; // keys for the parameters passed with speak commands. Hidden keys are used internally // to maintain engine state for each TextToSpeech instance. /** * {@hide} */ - public static final String TTS_KEY_PARAM_RATE = "rate"; + public static final String KEY_PARAM_RATE = "rate"; /** * {@hide} */ - public static final String TTS_KEY_PARAM_LANGUAGE = "language"; + public static final String KEY_PARAM_LANGUAGE = "language"; /** * {@hide} */ - public static final String TTS_KEY_PARAM_COUNTRY = "country"; + public static final String KEY_PARAM_COUNTRY = "country"; /** * {@hide} */ - public static final String TTS_KEY_PARAM_VARIANT = "variant"; + public static final String KEY_PARAM_VARIANT = "variant"; /** * Parameter key to specify the audio stream type to be used when speaking text * or playing back a file. */ - public static final String TTS_KEY_PARAM_STREAM = "streamType"; + public static final String KEY_PARAM_STREAM = "streamType"; /** * Parameter key to identify an utterance in the completion listener after text has been * spoken, a file has been played back or a silence duration has elapsed. */ - public static final String TTS_KEY_PARAM_UTTERANCE_ID = "utteranceId"; + public static final String KEY_PARAM_UTTERANCE_ID = "utteranceId"; // key positions in the array of cached parameters /** * {@hide} */ - protected static final int TTS_PARAM_POSITION_RATE = 0; + protected static final int PARAM_POSITION_RATE = 0; /** * {@hide} */ - protected static final int TTS_PARAM_POSITION_LANGUAGE = 2; + protected static final int PARAM_POSITION_LANGUAGE = 2; /** * {@hide} */ - protected static final int TTS_PARAM_POSITION_COUNTRY = 4; + protected static final int PARAM_POSITION_COUNTRY = 4; /** * {@hide} */ - protected static final int TTS_PARAM_POSITION_VARIANT = 6; + protected static final int PARAM_POSITION_VARIANT = 6; /** * {@hide} */ - protected static final int TTS_PARAM_POSITION_STREAM = 8; + protected static final int PARAM_POSITION_STREAM = 8; /** * {@hide} */ - protected static final int TTS_PARAM_POSITION_UTTERANCE_ID = 10; + protected static final int PARAM_POSITION_UTTERANCE_ID = 10; /** * {@hide} */ - protected static final int TTS_NB_CACHED_PARAMS = 6; + protected static final int NB_CACHED_PARAMS = 6; } /** @@ -273,25 +325,25 @@ public class TextToSpeech { mPackageName = mContext.getPackageName(); mInitListener = listener; - mCachedParams = new String[2*Engine.TTS_NB_CACHED_PARAMS]; // store key and value - mCachedParams[Engine.TTS_PARAM_POSITION_RATE] = Engine.TTS_KEY_PARAM_RATE; - mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE] = Engine.TTS_KEY_PARAM_LANGUAGE; - mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY] = Engine.TTS_KEY_PARAM_COUNTRY; - mCachedParams[Engine.TTS_PARAM_POSITION_VARIANT] = Engine.TTS_KEY_PARAM_VARIANT; - mCachedParams[Engine.TTS_PARAM_POSITION_STREAM] = Engine.TTS_KEY_PARAM_STREAM; - mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID] = Engine.TTS_KEY_PARAM_UTTERANCE_ID; + mCachedParams = new String[2*Engine.NB_CACHED_PARAMS]; // store key and value + mCachedParams[Engine.PARAM_POSITION_RATE] = Engine.KEY_PARAM_RATE; + mCachedParams[Engine.PARAM_POSITION_LANGUAGE] = Engine.KEY_PARAM_LANGUAGE; + mCachedParams[Engine.PARAM_POSITION_COUNTRY] = Engine.KEY_PARAM_COUNTRY; + mCachedParams[Engine.PARAM_POSITION_VARIANT] = Engine.KEY_PARAM_VARIANT; + mCachedParams[Engine.PARAM_POSITION_STREAM] = Engine.KEY_PARAM_STREAM; + mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID] = Engine.KEY_PARAM_UTTERANCE_ID; - mCachedParams[Engine.TTS_PARAM_POSITION_RATE + 1] = - String.valueOf(Engine.FALLBACK_TTS_DEFAULT_RATE); + mCachedParams[Engine.PARAM_POSITION_RATE + 1] = + String.valueOf(Engine.DEFAULT_RATE); // initialize the language cached parameters with the current Locale Locale defaultLoc = Locale.getDefault(); - mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE + 1] = defaultLoc.getISO3Language(); - mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY + 1] = defaultLoc.getISO3Country(); - mCachedParams[Engine.TTS_PARAM_POSITION_VARIANT + 1] = defaultLoc.getVariant(); + mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = defaultLoc.getISO3Language(); + mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = defaultLoc.getISO3Country(); + mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = defaultLoc.getVariant(); - mCachedParams[Engine.TTS_PARAM_POSITION_STREAM + 1] = - String.valueOf(Engine.TTS_DEFAULT_STREAM); - mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID + 1] = ""; + mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = + String.valueOf(Engine.DEFAULT_STREAM); + mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = ""; initTts(); } @@ -308,7 +360,7 @@ public class TextToSpeech { mStarted = true; if (mInitListener != null) { // TODO manage failures and missing resources - mInitListener.onInit(TTS_SUCCESS); + mInitListener.onInit(SUCCESS); } } } @@ -349,8 +401,7 @@ public class TextToSpeech { /** * Adds a mapping between a string of text and a sound resource in a * package. - * - * @see #TTS.speak(String text, int queueMode, String[] params) + * @see #speak(String, int, HashMap) * * @param text * Example: <b><code>"south_south_east"</code></b><br/> @@ -371,16 +422,16 @@ public class TextToSpeech { * @param resourceId * Example: <b><code>R.raw.south_south_east</code></b> * - * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS. + * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. */ public int addSpeech(String text, String packagename, int resourceId) { synchronized(mStartLock) { if (!mStarted) { - return TTS_ERROR; + return ERROR; } try { mITts.addSpeech(mPackageName, text, packagename, resourceId); - return TTS_SUCCESS; + return SUCCESS; } catch (RemoteException e) { // TTS died; restart it. Log.e("TextToSpeech.java - addSpeech", "RemoteException"); @@ -400,7 +451,7 @@ public class TextToSpeech { mStarted = false; initTts(); } - return TTS_ERROR; + return ERROR; } } @@ -415,16 +466,16 @@ public class TextToSpeech { * The full path to the sound file (for example: * "/sdcard/mysounds/hello.wav") * - * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS. + * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. */ public int addSpeech(String text, String filename) { synchronized (mStartLock) { if (!mStarted) { - return TTS_ERROR; + return ERROR; } try { mITts.addSpeechFile(mPackageName, text, filename); - return TTS_SUCCESS; + return SUCCESS; } catch (RemoteException e) { // TTS died; restart it. Log.e("TextToSpeech.java - addSpeech", "RemoteException"); @@ -444,7 +495,7 @@ public class TextToSpeech { mStarted = false; initTts(); } - return TTS_ERROR; + return ERROR; } } @@ -453,7 +504,7 @@ public class TextToSpeech { * Adds a mapping between a string of text and a sound resource in a * package. * - * @see #TTS.playEarcon(String earcon, int queueMode, String[] params) + * @see #playEarcon(String, int, HashMap) * * @param earcon The name of the earcon * Example: <b><code>"[tick]"</code></b><br/> @@ -474,16 +525,16 @@ public class TextToSpeech { * @param resourceId * Example: <b><code>R.raw.tick_snd</code></b> * - * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS. + * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. */ public int addEarcon(String earcon, String packagename, int resourceId) { synchronized(mStartLock) { if (!mStarted) { - return TTS_ERROR; + return ERROR; } try { mITts.addEarcon(mPackageName, earcon, packagename, resourceId); - return TTS_SUCCESS; + return SUCCESS; } catch (RemoteException e) { // TTS died; restart it. Log.e("TextToSpeech.java - addEarcon", "RemoteException"); @@ -503,7 +554,7 @@ public class TextToSpeech { mStarted = false; initTts(); } - return TTS_ERROR; + return ERROR; } } @@ -518,16 +569,16 @@ public class TextToSpeech { * The full path to the sound file (for example: * "/sdcard/mysounds/tick.wav") * - * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS. + * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. */ public int addEarcon(String earcon, String filename) { synchronized (mStartLock) { if (!mStarted) { - return TTS_ERROR; + return ERROR; } try { mITts.addEarconFile(mPackageName, earcon, filename); - return TTS_SUCCESS; + return SUCCESS; } catch (RemoteException e) { // TTS died; restart it. Log.e("TextToSpeech.java - addEarcon", "RemoteException"); @@ -547,7 +598,7 @@ public class TextToSpeech { mStarted = false; initTts(); } - return TTS_ERROR; + return ERROR; } } @@ -563,29 +614,29 @@ public class TextToSpeech { * The string of text to be spoken. * @param queueMode * The queuing strategy to use. - * See TTS_QUEUE_ADD and TTS_QUEUE_FLUSH. + * See QUEUE_ADD and QUEUE_FLUSH. * @param params * The hashmap of speech parameters to be used. * - * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS. + * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. */ public int speak(String text, int queueMode, HashMap<String,String> params) { synchronized (mStartLock) { - int result = TTS_ERROR; + int result = ERROR; Log.i("TTS received: ", text); if (!mStarted) { return result; } try { if ((params != null) && (!params.isEmpty())) { - String extra = params.get(Engine.TTS_KEY_PARAM_STREAM); + String extra = params.get(Engine.KEY_PARAM_STREAM); if (extra != null) { - mCachedParams[Engine.TTS_PARAM_POSITION_STREAM + 1] = extra; + mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = extra; } - extra = params.get(Engine.TTS_KEY_PARAM_UTTERANCE_ID); + extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID); if (extra != null) { - mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID + 1] = extra; + mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra; } } result = mITts.speak(mPackageName, text, queueMode, mCachedParams); @@ -621,28 +672,28 @@ public class TextToSpeech { * @param earcon * The earcon that should be played * @param queueMode - * See TTS_QUEUE_ADD and TTS_QUEUE_FLUSH. + * See QUEUE_ADD and QUEUE_FLUSH. * @param params * The hashmap of parameters to be used. * - * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS. + * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. */ public int playEarcon(String earcon, int queueMode, HashMap<String,String> params) { synchronized (mStartLock) { - int result = TTS_ERROR; + int result = ERROR; if (!mStarted) { return result; } try { if ((params != null) && (!params.isEmpty())) { - String extra = params.get(Engine.TTS_KEY_PARAM_STREAM); + String extra = params.get(Engine.KEY_PARAM_STREAM); if (extra != null) { - mCachedParams[Engine.TTS_PARAM_POSITION_STREAM + 1] = extra; + mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = extra; } - extra = params.get(Engine.TTS_KEY_PARAM_UTTERANCE_ID); + extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID); if (extra != null) { - mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID + 1] = extra; + mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra; } } result = mITts.playEarcon(mPackageName, earcon, queueMode, null); @@ -678,21 +729,21 @@ public class TextToSpeech { * @param durationInMs * A long that indicates how long the silence should last. * @param queueMode - * See TTS_QUEUE_ADD and TTS_QUEUE_FLUSH. + * See QUEUE_ADD and QUEUE_FLUSH. * - * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS. + * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. */ public int playSilence(long durationInMs, int queueMode, HashMap<String,String> params) { synchronized (mStartLock) { - int result = TTS_ERROR; + int result = ERROR; if (!mStarted) { return result; } try { if ((params != null) && (!params.isEmpty())) { - String extra = params.get(Engine.TTS_KEY_PARAM_UTTERANCE_ID); + String extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID); if (extra != null) { - mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID + 1] = extra; + mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra; } } result = mITts.playSilence(mPackageName, durationInMs, queueMode, mCachedParams); @@ -760,11 +811,11 @@ public class TextToSpeech { /** * Stops speech from the TTS. * - * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS. + * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. */ public int stop() { synchronized (mStartLock) { - int result = TTS_ERROR; + int result = ERROR; if (!mStarted) { return result; } @@ -808,24 +859,24 @@ public class TextToSpeech { * lower values slow down the speech (0.5 is half the normal speech rate), * greater values accelerate it (2 is twice the normal speech rate). * - * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS. + * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. */ public int setSpeechRate(float speechRate) { synchronized (mStartLock) { - int result = TTS_ERROR; + int result = ERROR; if (!mStarted) { return result; } try { if (speechRate > 0) { int rate = (int)(speechRate*100); - mCachedParams[Engine.TTS_PARAM_POSITION_RATE + 1] = String.valueOf(rate); + mCachedParams[Engine.PARAM_POSITION_RATE + 1] = String.valueOf(rate); // the rate is not set here, instead it is cached so it will be associated // with all upcoming utterances. if (speechRate > 0.0f) { - result = TTS_SUCCESS; + result = SUCCESS; } else { - result = TTS_ERROR; + result = ERROR; } } } catch (NullPointerException e) { @@ -860,11 +911,11 @@ public class TextToSpeech { * lower values lower the tone of the synthesized voice, * greater values increase it. * - * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS. + * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. */ public int setPitch(float pitch) { synchronized (mStartLock) { - int result = TTS_ERROR; + int result = ERROR; if (!mStarted) { return result; } @@ -907,25 +958,27 @@ public class TextToSpeech { * @param loc * The locale describing the language to be used. * - * @return code indicating the support status for the locale. See {@link #TTS_LANG_AVAILABLE}, - * {@link #TTS_LANG_COUNTRY_AVAILABLE}, {@link #TTS_LANG_COUNTRY_VAR_AVAILABLE}, - * {@link #TTS_LANG_MISSING_DATA} and {@link #TTS_LANG_NOT_SUPPORTED}. + * @return code indicating the support status for the locale. See {@link #LANG_AVAILABLE}, + * {@link #LANG_COUNTRY_AVAILABLE}, {@link #LANG_COUNTRY_VAR_AVAILABLE}, + * {@link #LANG_MISSING_DATA} and {@link #LANG_NOT_SUPPORTED}. */ public int setLanguage(Locale loc) { synchronized (mStartLock) { - int result = TTS_LANG_NOT_SUPPORTED; + int result = LANG_NOT_SUPPORTED; if (!mStarted) { return result; } try { - mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE + 1] = loc.getISO3Language(); - mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY + 1] = loc.getISO3Country(); - mCachedParams[Engine.TTS_PARAM_POSITION_VARIANT + 1] = loc.getVariant(); - - result = mITts.setLanguage(mPackageName, - mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE + 1], - mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY + 1], - mCachedParams[Engine.TTS_PARAM_POSITION_VARIANT + 1] ); + mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = loc.getISO3Language(); + mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = loc.getISO3Country(); + mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = loc.getVariant(); + // the language is not set here, instead it is cached so it will be associated + // with all upcoming utterances. But we still need to report the language support, + // which is achieved by calling isLanguageAvailable() + result = mITts.isLanguageAvailable( + mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1], + mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1], + mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] ); } catch (RemoteException e) { // TTS died; restart it. Log.e("TextToSpeech.java - setLanguage", "RemoteException"); @@ -997,13 +1050,13 @@ public class TextToSpeech { * @param loc * The Locale describing the language to be used. * - * @return code indicating the support status for the locale. See {@link #TTS_LANG_AVAILABLE}, - * {@link #TTS_LANG_COUNTRY_AVAILABLE}, {@link #TTS_LANG_COUNTRY_VAR_AVAILABLE}, - * {@link #TTS_LANG_MISSING_DATA} and {@link #TTS_LANG_NOT_SUPPORTED}. + * @return code indicating the support status for the locale. See {@link #LANG_AVAILABLE}, + * {@link #LANG_COUNTRY_AVAILABLE}, {@link #LANG_COUNTRY_VAR_AVAILABLE}, + * {@link #LANG_MISSING_DATA} and {@link #LANG_NOT_SUPPORTED}. */ public int isLanguageAvailable(Locale loc) { synchronized (mStartLock) { - int result = TTS_LANG_NOT_SUPPORTED; + int result = LANG_NOT_SUPPORTED; if (!mStarted) { return result; } @@ -1046,25 +1099,25 @@ public class TextToSpeech { * The string that gives the full output filename; it should be * something like "/sdcard/myappsounds/mysound.wav". * - * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS. + * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. */ public int synthesizeToFile(String text, HashMap<String,String> params, String filename) { synchronized (mStartLock) { - int result = TTS_ERROR; + int result = ERROR; if (!mStarted) { return result; } try { if ((params != null) && (!params.isEmpty())) { // no need to read the stream type here - String extra = params.get(Engine.TTS_KEY_PARAM_UTTERANCE_ID); + String extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID); if (extra != null) { - mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID + 1] = extra; + mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra; } } if (mITts.synthesizeToFile(mPackageName, text, mCachedParams, filename)){ - result = TTS_SUCCESS; + result = SUCCESS; } } catch (RemoteException e) { // TTS died; restart it. @@ -1097,9 +1150,9 @@ public class TextToSpeech { * if they are not persistent between calls to the service. */ private void resetCachedParams() { - mCachedParams[Engine.TTS_PARAM_POSITION_STREAM + 1] = - String.valueOf(Engine.TTS_DEFAULT_STREAM); - mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID+ 1] = ""; + mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = + String.valueOf(Engine.DEFAULT_STREAM); + mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID+ 1] = ""; } /** @@ -1108,12 +1161,12 @@ public class TextToSpeech { * @param listener * The OnUtteranceCompletedListener * - * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS. + * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. */ public int setOnUtteranceCompletedListener(
final OnUtteranceCompletedListener listener) {
synchronized (mStartLock) { - int result = TTS_ERROR; + int result = ERROR; if (!mStarted) { return result; } diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java index 3d10f17..524f941 100644 --- a/core/java/android/text/format/DateFormat.java +++ b/core/java/android/text/format/DateFormat.java @@ -284,6 +284,12 @@ public class DateFormat { */ public static java.text.DateFormat getDateFormatForSetting(Context context, String value) { + String format = getDateFormatStringForSetting(context, value); + + return new java.text.SimpleDateFormat(format); + } + + private static String getDateFormatStringForSetting(Context context, String value) { if (value != null) { int month = value.indexOf('M'); int day = value.indexOf('d'); @@ -291,7 +297,7 @@ public class DateFormat { if (month >= 0 && day >= 0 && year >= 0) { String template = context.getString(R.string.numeric_date_template); - if (year < month) { + if (year < month && year < day) { if (month < day) { value = String.format(template, "yyyy", "MM", "dd"); } else { @@ -311,7 +317,7 @@ public class DateFormat { } } - return new java.text.SimpleDateFormat(value); + return value; } } @@ -321,7 +327,7 @@ public class DateFormat { * so that we get a four-digit year instead a two-digit year. */ value = context.getString(R.string.numeric_date_format); - return new java.text.SimpleDateFormat(value); + return value; } /** @@ -347,7 +353,11 @@ public class DateFormat { /** * Gets the current date format stored as a char array. The array will contain * 3 elements ({@link #DATE}, {@link #MONTH}, and {@link #YEAR}) in the order - * preferred by the user. + * specified by the user's format preference. Note that this order is + * only appropriate for all-numeric dates; spelled-out (MEDIUM and LONG) + * dates will generally contain other punctuation, spaces, or words, + * not just the day, month, and year, and not necessarily in the same + * order returned here. */ public static final char[] getDateFormatOrder(Context context) { char[] order = new char[] {DATE, MONTH, YEAR}; @@ -380,22 +390,10 @@ 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) { - /* - * No need to localize -- this is an emergency fallback in case - * the setting is missing, but it should always be set. - */ - value = "MM-dd-yyyy"; - } - return value; + + return getDateFormatStringForSetting(context, value); } /** diff --git a/core/java/android/text/style/ImageSpan.java b/core/java/android/text/style/ImageSpan.java index 29c0c76..86ef5f6 100644 --- a/core/java/android/text/style/ImageSpan.java +++ b/core/java/android/text/style/ImageSpan.java @@ -33,17 +33,34 @@ public class ImageSpan extends DynamicDrawableSpan { private Context mContext; private String mSource; + /** + * @deprecated Use {@link #ImageSpan(Context, Bitmap)} instead. + */ public ImageSpan(Bitmap b) { - this(b, ALIGN_BOTTOM); + this(null, b, ALIGN_BOTTOM); + } + + /** + * @deprecated Use {@link #ImageSpan(Context, Bitmap, int) instead. + */ + public ImageSpan(Bitmap b, int verticalAlignment) { + this(null, b, verticalAlignment); + } + + public ImageSpan(Context context, Bitmap b) { + this(context, b, ALIGN_BOTTOM); } /** * @param verticalAlignment one of {@link DynamicDrawableSpan#ALIGN_BOTTOM} or * {@link DynamicDrawableSpan#ALIGN_BASELINE}. */ - public ImageSpan(Bitmap b, int verticalAlignment) { + public ImageSpan(Context context, Bitmap b, int verticalAlignment) { super(verticalAlignment); - mDrawable = new BitmapDrawable(b); + mContext = context; + mDrawable = context != null + ? new BitmapDrawable(context.getResources(), b) + : new BitmapDrawable(b); int width = mDrawable.getIntrinsicWidth(); int height = mDrawable.getIntrinsicHeight(); mDrawable.setBounds(0, 0, width > 0 ? width : 0, height > 0 ? height : 0); @@ -117,7 +134,7 @@ public class ImageSpan extends DynamicDrawableSpan { InputStream is = mContext.getContentResolver().openInputStream( mContentUri); bitmap = BitmapFactory.decodeStream(is); - drawable = new BitmapDrawable(bitmap); + drawable = new BitmapDrawable(mContext.getResources(), bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); is.close(); diff --git a/core/java/android/util/DisplayMetrics.java b/core/java/android/util/DisplayMetrics.java index 061f98a..dd5a440 100644 --- a/core/java/android/util/DisplayMetrics.java +++ b/core/java/android/util/DisplayMetrics.java @@ -80,6 +80,11 @@ public class DisplayMetrics { */ public float density; /** + * The screen density expressed as dots-per-inch. May be either + * {@link #DENSITY_LOW}, {@link #DENSITY_MEDIUM}, or {@link #DENSITY_HIGH}. + */ + public int densityDpi; + /** * A scaling factor for fonts displayed on the display. This is the same * as {@link #density}, except that it may be adjusted in smaller * increments at runtime based on a user preference for the font size. @@ -101,6 +106,7 @@ public class DisplayMetrics { widthPixels = o.widthPixels; heightPixels = o.heightPixels; density = o.density; + densityDpi = o.densityDpi; scaledDensity = o.scaledDensity; xdpi = o.xdpi; ydpi = o.ydpi; @@ -110,6 +116,7 @@ public class DisplayMetrics { widthPixels = 0; heightPixels = 0; density = DENSITY_DEVICE / (float) DENSITY_DEFAULT; + densityDpi = DENSITY_DEVICE; scaledDensity = density; xdpi = DENSITY_DEVICE; ydpi = DENSITY_DEVICE; @@ -186,9 +193,11 @@ public class DisplayMetrics { heightPixels = defaultHeight; } } + if (compatibilityInfo.isScalingRequired()) { float invertedRatio = compatibilityInfo.applicationInvertedScale; density *= invertedRatio; + densityDpi = (int)((density*DisplayMetrics.DENSITY_DEFAULT)+.5f); scaledDensity *= invertedRatio; xdpi *= invertedRatio; ydpi *= invertedRatio; diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 5551f64..b055d51 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -94,6 +94,7 @@ public class Display outMetrics.widthPixels = getWidth(); outMetrics.heightPixels = getHeight(); outMetrics.density = mDensity; + outMetrics.densityDpi = (int)((mDensity*DisplayMetrics.DENSITY_DEFAULT)+.5f); outMetrics.scaledDensity= outMetrics.density; outMetrics.xdpi = mDpiX; outMetrics.ydpi = mDpiY; diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 83c30e1..5100fff 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -16,6 +16,7 @@ package android.view; +import android.content.res.CompatibilityInfo.Translator; import android.graphics.*; import android.os.Parcelable; import android.os.Parcel; @@ -106,8 +107,14 @@ public class Surface implements Parcelable { public static final int SURFACE_HIDDEN = 0x01; /** Freeze the surface. Equivalent to calling freeze() */ + public static final int SURFACE_FROZEN = 0x02; + + /** + * @deprecated use {@link #SURFACE_FROZEN} instead. + */ + @Deprecated public static final int SURACE_FROZEN = 0x02; - + /** Enable dithering when compositing this surface */ public static final int SURFACE_DITHER = 0x04; @@ -133,8 +140,12 @@ public class Surface implements Parcelable { private Canvas mCanvas; // The display metrics used to provide the pseudo canvas size for applications - // running in compatibility mode. This is set to null for regular mode. - private DisplayMetrics mDisplayMetrics; + // running in compatibility mode. This is set to null for non compatibility mode. + private DisplayMetrics mCompatibleDisplayMetrics; + + // A matrix to scale the matrix set by application. This is set to null for + // non compatibility mode. + private Matrix mCompatibleMatrix; /** * Exception thrown when a surface couldn't be created or resized @@ -172,23 +183,70 @@ public class Surface implements Parcelable { * {@hide} */ public Surface() { - mCanvas = new Canvas() { - @Override - public int getWidth() { - return mDisplayMetrics == null ? super.getWidth() : mDisplayMetrics.widthPixels; + mCanvas = new CompatibleCanvas(); + } + + /** + * A Canvas class that can handle the compatibility mode. This does two things differently. + * <ul> + * <li> Returns the width and height of the target metrics, rather than native. + * For example, the canvas returns 320x480 even if an app is running in WVGA high density. + * <li> Scales the matrix in setMatrix by the application scale, except if the matrix looks + * like obtained from getMatrix. This is a hack to handle the case that an application + * uses getMatrix to keep the original matrix, set matrix of its own, then set the original + * matrix back. There is no perfect solution that works for all cases, and there are a lot of + * cases that this model dose not work, but we hope this works for many apps. + * </ul> + */ + private class CompatibleCanvas extends Canvas { + // A temp matrix to remember what an application obtained via {@link getMatrix} + private Matrix mOrigMatrix = null; + + @Override + public int getWidth() { + return mCompatibleDisplayMetrics == null ? + super.getWidth() : mCompatibleDisplayMetrics.widthPixels; + } + + @Override + public int getHeight() { + return mCompatibleDisplayMetrics == null ? + super.getHeight() : mCompatibleDisplayMetrics.heightPixels; + } + + @Override + public void setMatrix(Matrix matrix) { + if (mCompatibleMatrix == null || mOrigMatrix == null || mOrigMatrix.equals(matrix)) { + // don't scale the matrix if it's not compatibility mode, or + // the matrix was obtained from getMatrix. + super.setMatrix(matrix); + } else { + Matrix m = new Matrix(mCompatibleMatrix); + m.preConcat(matrix); + super.setMatrix(m); } - @Override - public int getHeight() { - return mDisplayMetrics == null ? super.getHeight() : mDisplayMetrics.heightPixels; + } + + @Override + public void getMatrix(Matrix m) { + super.getMatrix(m); + if (mOrigMatrix == null) { + mOrigMatrix = new Matrix(); } - }; - } + mOrigMatrix.set(m); + } + }; /** * Sets the display metrics used to provide canva's width/height in comaptibility mode. */ - void setCompatibleDisplayMetrics(DisplayMetrics metrics) { - mDisplayMetrics = metrics; + void setCompatibleDisplayMetrics(DisplayMetrics metrics, Translator translator) { + mCompatibleDisplayMetrics = metrics; + if (translator != null) { + float appScale = translator.applicationScale; + mCompatibleMatrix = new Matrix(); + mCompatibleMatrix.setScale(appScale, appScale); + } } /** diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 95bba97..9cf7092 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -140,7 +140,7 @@ public class SurfaceView extends View { int mType = -1; final Rect mSurfaceFrame = new Rect(); private Translator mTranslator; - + public SurfaceView(Context context) { super(context); setWillNotDraw(true); @@ -253,23 +253,6 @@ public class SurfaceView extends View { } @Override - public boolean dispatchTouchEvent(MotionEvent event) { - // SurfaceView uses pre-scaled size unless fixed size is requested. This hook - // scales the event back to the pre-scaled coordinates for such surface. - if (mScaled) { - MotionEvent scaledBack = MotionEvent.obtain(event); - mTranslator.translateEventInScreenToAppWindow(event); - try { - return super.dispatchTouchEvent(scaledBack); - } finally { - scaledBack.recycle(); - } - } else { - return super.dispatchTouchEvent(event); - } - } - - @Override protected void dispatchDraw(Canvas canvas) { // if SKIP_DRAW is cleared, draw() has already punched a hole if ((mPrivateFlags & SKIP_DRAW) == SKIP_DRAW) { @@ -291,8 +274,6 @@ public class SurfaceView extends View { mWindowType = type; } - boolean mScaled = false; - private void updateWindow(boolean force) { if (!mHaveFrame) { return; @@ -300,11 +281,9 @@ public class SurfaceView extends View { ViewRoot viewRoot = (ViewRoot) getRootView().getParent(); mTranslator = viewRoot.mTranslator; - float appScale = mTranslator == null ? 1.0f : mTranslator.applicationScale; - Resources res = getContext().getResources(); if (mTranslator != null || !res.getCompatibilityInfo().supportsScreen()) { - mSurface.setCompatibleDisplayMetrics(res.getDisplayMetrics()); + mSurface.setCompatibleDisplayMetrics(res.getDisplayMetrics(), mTranslator); } int myWidth = mRequestedWidth; @@ -312,16 +291,6 @@ public class SurfaceView extends View { int myHeight = mRequestedHeight; if (myHeight <= 0) myHeight = getHeight(); - // Use original size if the app specified the size of the view, - // and let the flinger to scale up. - if (mRequestedWidth <= 0 && mTranslator != null) { - myWidth = (int) (myWidth * appScale + 0.5f); - myHeight = (int) (myHeight * appScale + 0.5f); - mScaled = true; - } else { - mScaled = false; - } - getLocationInWindow(mLocation); final boolean creating = mWindow == null; final boolean formatChanged = mFormat != mRequestedFormat; @@ -394,10 +363,17 @@ public class SurfaceView extends View { if (localLOGV) Log.i(TAG, "New surface: " + mSurface + ", vis=" + visible + ", frame=" + mWinFrame); + mSurfaceFrame.left = 0; mSurfaceFrame.top = 0; - mSurfaceFrame.right = mWinFrame.width(); - mSurfaceFrame.bottom = mWinFrame.height(); + if (mTranslator == null) { + mSurfaceFrame.right = mWinFrame.width(); + mSurfaceFrame.bottom = mWinFrame.height(); + } else { + float appInvertedScale = mTranslator.applicationInvertedScale; + mSurfaceFrame.right = (int) (mWinFrame.width() * appInvertedScale + 0.5f); + mSurfaceFrame.bottom = (int) (mWinFrame.height() * appInvertedScale + 0.5f); + } mSurfaceLock.unlock(); try { @@ -641,10 +617,6 @@ public class SurfaceView extends View { if (localLOGV) Log.i(TAG, "Returned canvas: " + c); if (c != null) { mLastLockTime = SystemClock.uptimeMillis(); - if (mScaled) { - mSaveCount = c.save(); - mTranslator.translateCanvas(c); - } return c; } @@ -667,9 +639,6 @@ public class SurfaceView extends View { } public void unlockCanvasAndPost(Canvas canvas) { - if (mScaled) { - canvas.restoreToCount(mSaveCount); - } mSurface.unlockCanvasAndPost(canvas); mSurfaceLock.unlock(); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index ff8868b..7ed2712 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -46,6 +46,7 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.util.AttributeSet; import android.util.Config; +import android.util.DisplayMetrics; import android.util.EventLog; import android.util.Log; import android.util.Pool; @@ -5976,6 +5977,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility try { bitmap = Bitmap.createBitmap(width, height, quality); + bitmap.setDensity(getResources().getDisplayMetrics().densityDpi); if (autoScale) { mDrawingCache = new SoftReference<Bitmap>(bitmap); } else { diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java index 46aea02..4baf612 100644 --- a/core/java/android/view/ViewDebug.java +++ b/core/java/android/view/ViewDebug.java @@ -16,6 +16,7 @@ package android.view; +import android.util.Config; import android.util.Log; import android.util.DisplayMetrics; import android.content.res.Resources; @@ -140,7 +141,9 @@ public class ViewDebug { public static boolean consistencyCheckEnabled = false; static { - Debug.setFieldsOn(ViewDebug.class, true); + if (Config.DEBUG) { + Debug.setFieldsOn(ViewDebug.class, true); + } } /** diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index 2f92b32..f7cb06b 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -21,7 +21,6 @@ import com.android.internal.view.IInputMethodSession; import android.graphics.Canvas; import android.graphics.PixelFormat; -import android.graphics.Point; import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.Region; @@ -187,7 +186,7 @@ public final class ViewRoot extends Handler implements ViewParent, */ AudioManager mAudioManager; - private final float mDensity; + private final int mDensity; public ViewRoot(Context context) { super(); @@ -229,7 +228,7 @@ public final class ViewRoot extends Handler implements ViewParent, mAdded = false; mAttachInfo = new View.AttachInfo(sWindowSession, mWindow, this, this); mViewConfiguration = ViewConfiguration.get(context); - mDensity = context.getResources().getDisplayMetrics().density; + mDensity = context.getResources().getDisplayMetrics().densityDpi; } @Override @@ -389,10 +388,11 @@ public final class ViewRoot extends Handler implements ViewParent, attrs = mWindowAttributes; Resources resources = mView.getContext().getResources(); CompatibilityInfo compatibilityInfo = resources.getCompatibilityInfo(); - mTranslator = compatibilityInfo.getTranslator(attrs); + mTranslator = compatibilityInfo.getTranslator(); if (mTranslator != null || !compatibilityInfo.supportsScreen()) { - mSurface.setCompatibleDisplayMetrics(resources.getDisplayMetrics()); + mSurface.setCompatibleDisplayMetrics(resources.getDisplayMetrics(), + mTranslator); } boolean restore = false; @@ -1212,6 +1212,8 @@ public final class ViewRoot extends Handler implements ViewParent, if (mTranslator != null) { mTranslator.translateCanvas(canvas); } + canvas.setScreenDensity(scalingRequired + ? DisplayMetrics.DENSITY_DEVICE : 0); mView.draw(canvas); if (Config.DEBUG && ViewDebug.consistencyCheckEnabled) { mView.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_DRAWING); @@ -1269,7 +1271,7 @@ public final class ViewRoot extends Handler implements ViewParent, } // TODO: Do this in native - canvas.setDensityScale(mDensity); + canvas.setDensity(mDensity); } catch (Surface.OutOfResourcesException e) { Log.e("ViewRoot", "OutOfResourcesException locking surface", e); // TODO: we should ask the window manager to do something! @@ -1320,6 +1322,8 @@ public final class ViewRoot extends Handler implements ViewParent, if (mTranslator != null) { mTranslator.translateCanvas(canvas); } + canvas.setScreenDensity(scalingRequired + ? DisplayMetrics.DENSITY_DEVICE : 0); mView.draw(canvas); } finally { mAttachInfo.mIgnoreDirtyState = false; diff --git a/core/java/android/webkit/LoadListener.java b/core/java/android/webkit/LoadListener.java index 474fa82..9ca2909 100644 --- a/core/java/android/webkit/LoadListener.java +++ b/core/java/android/webkit/LoadListener.java @@ -31,7 +31,6 @@ import android.os.Message; import android.security.CertTool; import android.util.Log; import android.webkit.CacheManager.CacheResult; -import android.widget.Toast; import com.android.internal.R; @@ -77,6 +76,7 @@ class LoadListener extends Handler implements EventHandler { static { sCertificateMimeTypeMap = new HashSet<String>(); sCertificateMimeTypeMap.add("application/x-x509-ca-cert"); + sCertificateMimeTypeMap.add("application/x-x509-user-cert"); sCertificateMimeTypeMap.add("application/x-pkcs12"); } @@ -1016,8 +1016,6 @@ class LoadListener extends Handler implements EventHandler { mDataBuilder.releaseChunk(c); } CertTool.getInstance().addCertificate(cert, mContext); - Toast.makeText(mContext, R.string.certificateSaved, - Toast.LENGTH_SHORT).show(); mBrowserFrame.stopLoading(); return; } diff --git a/core/java/android/webkit/MimeTypeMap.java b/core/java/android/webkit/MimeTypeMap.java index fdbc692..9fdde61 100644 --- a/core/java/android/webkit/MimeTypeMap.java +++ b/core/java/android/webkit/MimeTypeMap.java @@ -357,6 +357,7 @@ public /* package */ class MimeTypeMap { sMimeTypeMap.loadEntry( "application/x-webarchive", "webarchive", false); // added sMimeTypeMap.loadEntry("application/x-x509-ca-cert", "crt", false); + sMimeTypeMap.loadEntry("application/x-x509-user-cert", "crt", false); sMimeTypeMap.loadEntry("application/x-xcf", "xcf", false); sMimeTypeMap.loadEntry("application/x-xfig", "fig", false); sMimeTypeMap.loadEntry("audio/basic", "snd", false); diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index fcf946f..6936435 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -545,7 +545,6 @@ public class WebView extends AbsoluteLayout private ZoomButtonsController mZoomButtonsController; private ImageView mZoomOverviewButton; - private ImageView mZoomFitPageButton; // These keep track of the center point of the zoom. They are used to // determine the point around which we should zoom. @@ -617,6 +616,16 @@ public class WebView extends AbsoluteLayout // Create the buttons controller mZoomButtonsController = new ZoomButtonsController(this); mZoomButtonsController.setOnZoomListener(mZoomListener); + // ZoomButtonsController positions the buttons at the bottom, but in + // the middle. Change their layout parameters so they appear on the + // right. + View controls = mZoomButtonsController.getZoomControls(); + ViewGroup.LayoutParams params = controls.getLayoutParams(); + if (params instanceof FrameLayout.LayoutParams) { + FrameLayout.LayoutParams frameParams = (FrameLayout.LayoutParams) + params; + frameParams.gravity = Gravity.RIGHT; + } // Create the accessory buttons LayoutInflater inflater = @@ -636,15 +645,6 @@ public class WebView extends AbsoluteLayout } } }); - mZoomFitPageButton = - (ImageView) container.findViewById(com.android.internal.R.id.zoom_fit_page); - mZoomFitPageButton.setOnClickListener( - new View.OnClickListener() { - public void onClick(View v) { - zoomWithPreview(mDefaultScale); - updateZoomButtonsEnabled(); - } - }); } private void updateZoomButtonsEnabled() { @@ -654,17 +654,14 @@ public class WebView extends AbsoluteLayout // Hide the zoom in and out buttons, as well as the fit to page // button, if the page cannot zoom mZoomButtonsController.getZoomControls().setVisibility(View.GONE); - mZoomFitPageButton.setVisibility(View.GONE); } else { // Bring back the hidden zoom controls. mZoomButtonsController.getZoomControls() .setVisibility(View.VISIBLE); - mZoomFitPageButton.setVisibility(View.VISIBLE); // Set each one individually, as a page may be able to zoom in // or out. mZoomButtonsController.setZoomInEnabled(canZoomIn); mZoomButtonsController.setZoomOutEnabled(canZoomOut); - mZoomFitPageButton.setEnabled(mActualScale != mDefaultScale); } mZoomOverviewButton.setVisibility(canZoomScrollOut() ? View.VISIBLE: View.GONE); diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 777beed..eea97dc 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -1535,6 +1535,9 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te protected void onDetachedFromWindow() { super.onDetachedFromWindow(); + // Dismiss the popup in case onSaveInstanceState() was not invoked + dismissPopup(); + final ViewTreeObserver treeObserver = getViewTreeObserver(); if (treeObserver != null) { treeObserver.removeOnTouchModeChangeListener(this); diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java index 4bc00de..456f8ed 100644 --- a/core/java/android/widget/AutoCompleteTextView.java +++ b/core/java/android/widget/AutoCompleteTextView.java @@ -104,6 +104,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe private View mDropDownAnchorView; // view is retrieved lazily from id once needed private int mDropDownWidth; private int mDropDownHeight; + private final Rect mTempRect = new Rect(); private Drawable mDropDownListHighlight; @@ -116,6 +117,8 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe private boolean mDropDownAlwaysVisible = false; private boolean mDropDownDismissedOnCompletion = true; + + private boolean mForceIgnoreOutsideTouch = false; private int mLastKeyCode = KeyEvent.KEYCODE_UNKNOWN; private boolean mOpenBefore; @@ -205,11 +208,9 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe * Private hook into the on click event, dispatched from {@link PassThroughClickListener} */ private void onClickImpl() { - // if drop down should always visible, bring it back in front of the soft - // keyboard when the user touches the text field - if (mDropDownAlwaysVisible - && mPopup.isShowing() - && mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED) { + // If the dropdown is showing, bring it back in front of the soft + // keyboard when the user touches the text field. + if (mPopup.isShowing() && isInputMethodNotNeeded()) { ensureImeVisible(); } } @@ -1102,6 +1103,13 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe } /** + * @hide internal used only here and SearchDialog + */ + public boolean isInputMethodNotNeeded() { + return mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED; + } + + /** * <p>Displays the drop down on screen.</p> */ public void showDropDown() { @@ -1110,7 +1118,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe int widthSpec = 0; int heightSpec = 0; - boolean noInputMethod = mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED; + boolean noInputMethod = isInputMethodNotNeeded(); if (mPopup.isShowing()) { if (mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT) { @@ -1143,6 +1151,8 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe heightSpec = mDropDownHeight; } + mPopup.setOutsideTouchable(mForceIgnoreOutsideTouch ? false : !mDropDownAlwaysVisible); + mPopup.update(getDropDownAnchorView(), mDropDownHorizontalOffset, mDropDownVerticalOffset, widthSpec, heightSpec); } else { @@ -1171,7 +1181,7 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe // use outside touchable to dismiss drop down when touching outside of it, so // only set this if the dropdown is not always visible - mPopup.setOutsideTouchable(!mDropDownAlwaysVisible); + mPopup.setOutsideTouchable(mForceIgnoreOutsideTouch ? false : !mDropDownAlwaysVisible); mPopup.setTouchInterceptor(new PopupTouchIntercepter()); mPopup.showAsDropDown(getDropDownAnchorView(), mDropDownHorizontalOffset, mDropDownVerticalOffset); @@ -1180,6 +1190,17 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe post(mHideSelector); } } + + /** + * Forces outside touches to be ignored. Normally if {@link #isDropDownAlwaysVisible()} is + * false, we allow outside touch to dismiss the dropdown. If this is set to true, then we + * ignore outside touch even when the drop down is not set to always visible. + * + * @hide used only by SearchDialog + */ + public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) { + mForceIgnoreOutsideTouch = forceIgnoreOutsideTouch; + } /** * <p>Builds the popup window's content and returns the height the popup @@ -1303,7 +1324,15 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe getDropDownAnchorView(), mDropDownVerticalOffset, ignoreBottomDecorations); if (mDropDownAlwaysVisible) { - return maxHeight; + // getMaxAvailableHeight() subtracts the padding, so we put it back, + // to get the available height for the whole window + int padding = 0; + Drawable background = mPopup.getBackground(); + if (background != null) { + background.getPadding(mTempRect); + padding = mTempRect.top + mTempRect.bottom; + } + return maxHeight + padding; } return mDropDownList.measureHeightOfChildren(MeasureSpec.UNSPECIFIED, diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index 3b9f1de..5e76cc3 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -31,6 +31,7 @@ import com.android.internal.widget.NumberPicker; import com.android.internal.widget.NumberPicker.OnChangedListener; import java.text.DateFormatSymbols; +import java.text.SimpleDateFormat; import java.util.Calendar; /** @@ -101,7 +102,8 @@ public class DatePicker extends FrameLayout { mMonthPicker = (NumberPicker) findViewById(R.id.month); mMonthPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); DateFormatSymbols dfs = new DateFormatSymbols(); - mMonthPicker.setRange(1, 12, dfs.getShortMonths()); + String[] months = dfs.getShortMonths(); + mMonthPicker.setRange(1, 12, months); mMonthPicker.setSpeed(200); mMonthPicker.setOnChangeListener(new OnChangedListener() { public void onChanged(NumberPicker picker, int oldVal, int newVal) { @@ -146,7 +148,7 @@ public class DatePicker extends FrameLayout { init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), null); // re-order the number pickers to match the current date format - reorderPickers(); + reorderPickers(months); if (!isEnabled()) { setEnabled(false); @@ -161,30 +163,70 @@ public class DatePicker extends FrameLayout { mYearPicker.setEnabled(enabled); } - private void reorderPickers() { - char[] order = DateFormat.getDateFormatOrder(mContext); - - /* Default order is month, date, year so if that's the order then - * do nothing. + private void reorderPickers(String[] months) { + java.text.DateFormat format; + String order; + + /* + * If the user is in a locale where the medium date format is + * still numeric (Japanese and Czech, for example), respect + * the date format order setting. Otherwise, use the order + * that the locale says is appropriate for a spelled-out date. */ - if ((order[0] == DateFormat.MONTH) && (order[1] == DateFormat.DATE)) { - return; + + if (months[0].startsWith("1")) { + format = DateFormat.getDateFormat(getContext()); + } else { + format = DateFormat.getMediumDateFormat(getContext()); } - + + if (format instanceof SimpleDateFormat) { + order = ((SimpleDateFormat) format).toPattern(); + } else { + // Shouldn't happen, but just in case. + order = new String(DateFormat.getDateFormatOrder(getContext())); + } + /* Remove the 3 pickers from their parent and then add them back in the * required order. */ LinearLayout parent = (LinearLayout) findViewById(R.id.parent); parent.removeAllViews(); - for (char c : order) { - if (c == DateFormat.DATE) { - parent.addView(mDayPicker); - } else if (c == DateFormat.MONTH) { - parent.addView(mMonthPicker); - } else { - parent.addView (mYearPicker); + + boolean quoted = false; + boolean didDay = false, didMonth = false, didYear = false; + + for (int i = 0; i < order.length(); i++) { + char c = order.charAt(i); + + if (c == '\'') { + quoted = !quoted; + } + + if (!quoted) { + if (c == DateFormat.DATE && !didDay) { + parent.addView(mDayPicker); + didDay = true; + } else if ((c == DateFormat.MONTH || c == 'L') && !didMonth) { + parent.addView(mMonthPicker); + didMonth = true; + } else if (c == DateFormat.YEAR && !didYear) { + parent.addView (mYearPicker); + didYear = true; + } } } + + // Shouldn't happen, but just in case. + if (!didMonth) { + parent.addView(mMonthPicker); + } + if (!didDay) { + parent.addView(mDayPicker); + } + if (!didYear) { + parent.addView(mYearPicker); + } } public void updateDate(int year, int monthOfYear, int dayOfMonth) { @@ -192,6 +234,7 @@ public class DatePicker extends FrameLayout { mMonth = monthOfYear; mDay = dayOfMonth; updateSpinners(); + reorderPickers(new DateFormatSymbols().getShortMonths()); } private static class SavedState extends BaseSavedState { diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index 2796774..b8f0a7e 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -317,7 +317,7 @@ public class ImageView extends View { public void setImageBitmap(Bitmap bm) { // if this is used frequently, may handle bitmaps explicitly // to reduce the intermediate drawable object - setImageDrawable(new BitmapDrawable(bm)); + setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); } public void setImageState(int[] state, boolean merge) { @@ -463,6 +463,7 @@ public class ImageView extends View { if (matrix == null && !mMatrix.isIdentity() || matrix != null && !mMatrix.equals(matrix)) { mMatrix.set(matrix); + configureBounds(); invalidate(); } } diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index 24c0e2a..e19a93d 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -432,7 +432,7 @@ public class RelativeLayout extends ViewGroup { width = resolveSize(width, widthMeasureSpec); if (offsetHorizontalAxis) { - for (int i = 0; i < count; i++) { + for (int i = 0; i < count; i++) { View child = getChildAt(i); if (child.getVisibility() != GONE) { LayoutParams params = (LayoutParams) child.getLayoutParams(); @@ -486,10 +486,14 @@ public class RelativeLayout extends ViewGroup { View child = getChildAt(i); if (child.getVisibility() != GONE && child != ignore) { LayoutParams params = (LayoutParams) child.getLayoutParams(); - params.mLeft += horizontalOffset; - params.mRight += horizontalOffset; - params.mTop += verticalOffset; - params.mBottom += verticalOffset; + if (horizontalGravity) { + params.mLeft += horizontalOffset; + params.mRight += horizontalOffset; + } + if (verticalGravity) { + params.mTop += verticalOffset; + params.mBottom += verticalOffset; + } } } } diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java index a26bfa2..47f5c6c 100644 --- a/core/java/android/widget/TabWidget.java +++ b/core/java/android/widget/TabWidget.java @@ -277,7 +277,7 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { if (child.getLayoutParams() == null) { final LinearLayout.LayoutParams lp = new LayoutParams( 0, - ViewGroup.LayoutParams.WRAP_CONTENT, 1); + ViewGroup.LayoutParams.FILL_PARENT, 1.0f); lp.setMargins(0, 0, 0, 0); child.setLayoutParams(lp); } @@ -289,10 +289,10 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { // If we have dividers between the tabs and we already have at least one // tab, then add a divider before adding the next tab. if (mDividerDrawable != null && getTabCount() > 0) { - View divider = new View(mContext); + ImageView divider = new ImageView(mContext); final LinearLayout.LayoutParams lp = new LayoutParams( mDividerDrawable.getIntrinsicWidth(), - mDividerDrawable.getIntrinsicHeight()); + LayoutParams.FILL_PARENT); lp.setMargins(0, 0, 0, 0); divider.setLayoutParams(lp); divider.setBackgroundDrawable(mDividerDrawable); diff --git a/core/java/com/android/internal/widget/EditStyledText.java b/core/java/com/android/internal/widget/EditStyledText.java index f0ad7b3..82197c0 100644 --- a/core/java/com/android/internal/widget/EditStyledText.java +++ b/core/java/com/android/internal/widget/EditStyledText.java @@ -1242,7 +1242,8 @@ public class EditStyledText extends EditText { try { InputStream is = mEST.getContext().getContentResolver().openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(is); - Drawable drawable = new BitmapDrawable(bitmap); + Drawable drawable = new BitmapDrawable( + getContext().getResources(), bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); diff --git a/core/jni/android/graphics/Canvas.cpp b/core/jni/android/graphics/Canvas.cpp index 93d68cb..1c2e055 100644 --- a/core/jni/android/graphics/Canvas.cpp +++ b/core/jni/android/graphics/Canvas.cpp @@ -462,17 +462,27 @@ public: static void drawBitmap__BitmapFFPaint(JNIEnv* env, jobject jcanvas, SkCanvas* canvas, SkBitmap* bitmap, jfloat left, jfloat top, - SkPaint* paint, - jboolean autoScale, jfloat densityScale) { + SkPaint* paint, jint canvasDensity, + jint screenDensity, jint bitmapDensity) { SkScalar left_ = SkFloatToScalar(left); SkScalar top_ = SkFloatToScalar(top); - if (!autoScale || densityScale <= 0.0f) { - canvas->drawBitmap(*bitmap, left_, top_, paint); + if (canvasDensity == bitmapDensity || canvasDensity == 0 + || bitmapDensity == 0) { + if (screenDensity != 0 && screenDensity != bitmapDensity) { + SkPaint filteredPaint; + if (paint) { + filteredPaint = *paint; + } + filteredPaint.setFilterBitmap(true); + canvas->drawBitmap(*bitmap, left_, top_, &filteredPaint); + } else { + canvas->drawBitmap(*bitmap, left_, top_, paint); + } } else { canvas->save(); - SkScalar canvasScale = GraphicsJNI::getCanvasDensityScale(env, jcanvas); - SkScalar scale = canvasScale / SkFloatToScalar(densityScale); + SkScalar scale = SkFloatToScalar(canvasDensity / (float)bitmapDensity); + canvas->translate(left_, top_); canvas->scale(scale, scale); SkPaint filteredPaint; @@ -481,37 +491,52 @@ public: } filteredPaint.setFilterBitmap(true); - canvas->drawBitmap(*bitmap, left_, top_, &filteredPaint); + canvas->drawBitmap(*bitmap, 0, 0, &filteredPaint); canvas->restore(); } } static void doDrawBitmap(JNIEnv* env, SkCanvas* canvas, SkBitmap* bitmap, - jobject srcIRect, const SkRect& dst, SkPaint* paint) { + jobject srcIRect, const SkRect& dst, SkPaint* paint, + jint screenDensity, jint bitmapDensity) { SkIRect src, *srcPtr = NULL; if (NULL != srcIRect) { GraphicsJNI::jrect_to_irect(env, srcIRect, &src); srcPtr = &src; } - canvas->drawBitmapRect(*bitmap, srcPtr, dst, paint); + + if (screenDensity != 0 && screenDensity != bitmapDensity) { + SkPaint filteredPaint; + if (paint) { + filteredPaint = *paint; + } + filteredPaint.setFilterBitmap(true); + canvas->drawBitmapRect(*bitmap, srcPtr, dst, &filteredPaint); + } else { + canvas->drawBitmapRect(*bitmap, srcPtr, dst, paint); + } } static void drawBitmapRF(JNIEnv* env, jobject, SkCanvas* canvas, SkBitmap* bitmap, jobject srcIRect, - jobject dstRectF, SkPaint* paint) { + jobject dstRectF, SkPaint* paint, + jint screenDensity, jint bitmapDensity) { SkRect dst; GraphicsJNI::jrectf_to_rect(env, dstRectF, &dst); - doDrawBitmap(env, canvas, bitmap, srcIRect, dst, paint); + doDrawBitmap(env, canvas, bitmap, srcIRect, dst, paint, + screenDensity, bitmapDensity); } static void drawBitmapRR(JNIEnv* env, jobject, SkCanvas* canvas, SkBitmap* bitmap, jobject srcIRect, - jobject dstRect, SkPaint* paint) { + jobject dstRect, SkPaint* paint, + jint screenDensity, jint bitmapDensity) { SkRect dst; GraphicsJNI::jrect_to_rect(env, dstRect, &dst); - doDrawBitmap(env, canvas, bitmap, srcIRect, dst, paint); + doDrawBitmap(env, canvas, bitmap, srcIRect, dst, paint, + screenDensity, bitmapDensity); } static void drawBitmapArray(JNIEnv* env, jobject, SkCanvas* canvas, @@ -905,11 +930,11 @@ static JNINativeMethod gCanvasMethods[] = { {"native_drawRoundRect","(ILandroid/graphics/RectF;FFI)V", (void*) SkCanvasGlue::drawRoundRect}, {"native_drawPath","(III)V", (void*) SkCanvasGlue::drawPath}, - {"native_drawBitmap","(IIFFIZF)V", + {"native_drawBitmap","(IIFFIIII)V", (void*) SkCanvasGlue::drawBitmap__BitmapFFPaint}, - {"native_drawBitmap","(IILandroid/graphics/Rect;Landroid/graphics/RectF;I)V", + {"native_drawBitmap","(IILandroid/graphics/Rect;Landroid/graphics/RectF;III)V", (void*) SkCanvasGlue::drawBitmapRF}, - {"native_drawBitmap","(IILandroid/graphics/Rect;Landroid/graphics/Rect;I)V", + {"native_drawBitmap","(IILandroid/graphics/Rect;Landroid/graphics/Rect;III)V", (void*) SkCanvasGlue::drawBitmapRR}, {"native_drawBitmap", "(I[IIIFFIIZI)V", (void*)SkCanvasGlue::drawBitmapArray}, diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp index 6e159a8..ca1cb7d 100644 --- a/core/jni/android/graphics/Graphics.cpp +++ b/core/jni/android/graphics/Graphics.cpp @@ -163,7 +163,6 @@ static jfieldID gBitmapConfig_nativeInstanceID; static jclass gCanvas_class; static jfieldID gCanvas_nativeInstanceID; -static jfieldID gCanvas_densityScaleID; static jclass gPaint_class; static jfieldID gPaint_nativeInstanceID; @@ -320,13 +319,6 @@ SkCanvas* GraphicsJNI::getNativeCanvas(JNIEnv* env, jobject canvas) { return c; } -SkScalar GraphicsJNI::getCanvasDensityScale(JNIEnv* env, jobject canvas) { - SkASSERT(env); - SkASSERT(canvas); - SkASSERT(env->IsInstanceOf(canvas, gCanvas_class)); - return SkFloatToScalar(env->GetFloatField(canvas, gCanvas_densityScaleID)); -} - SkPaint* GraphicsJNI::getNativePaint(JNIEnv* env, jobject paint) { SkASSERT(env); SkASSERT(paint); @@ -557,7 +549,6 @@ int register_android_graphics_Graphics(JNIEnv* env) gCanvas_class = make_globalref(env, "android/graphics/Canvas"); gCanvas_nativeInstanceID = getFieldIDCheck(env, gCanvas_class, "mNativeCanvas", "I"); - gCanvas_densityScaleID = getFieldIDCheck(env, gCanvas_class, "mDensityScale", "F"); gPaint_class = make_globalref(env, "android/graphics/Paint"); gPaint_nativeInstanceID = getFieldIDCheck(env, gPaint_class, "mNativePaint", "I"); diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h index 16925e4..f8b60a8 100644 --- a/core/jni/android/graphics/GraphicsJNI.h +++ b/core/jni/android/graphics/GraphicsJNI.h @@ -38,7 +38,6 @@ public: static SkBitmap* getNativeBitmap(JNIEnv*, jobject bitmap); static SkPicture* getNativePicture(JNIEnv*, jobject picture); static SkRegion* getNativeRegion(JNIEnv*, jobject region); - static SkScalar getCanvasDensityScale(JNIEnv*, jobject canvas); /** Return the corresponding native config from the java Config enum, or kNo_Config if the java object is null. diff --git a/core/jni/android/graphics/MaskFilter.cpp b/core/jni/android/graphics/MaskFilter.cpp index e6048cd..0f8dff1 100644 --- a/core/jni/android/graphics/MaskFilter.cpp +++ b/core/jni/android/graphics/MaskFilter.cpp @@ -4,15 +4,23 @@ #include <jni.h> +static void ThrowIAE_IfNull(JNIEnv* env, void* ptr) { + if (NULL == ptr) { + doThrowIAE(env); + } +} + class SkMaskFilterGlue { public: static void destructor(JNIEnv* env, jobject, SkMaskFilter* filter) { - SkASSERT(filter); - filter->unref(); + filter->safeUnref(); } static SkMaskFilter* createBlur(JNIEnv* env, jobject, float radius, int blurStyle) { - return SkBlurMaskFilter::Create(SkFloatToScalar(radius), (SkBlurMaskFilter::BlurStyle)blurStyle); + SkMaskFilter* filter = SkBlurMaskFilter::Create(SkFloatToScalar(radius), + (SkBlurMaskFilter::BlurStyle)blurStyle); + ThrowIAE_IfNull(env, filter); + return filter; } static SkMaskFilter* createEmboss(JNIEnv* env, jobject, jfloatArray dirArray, float ambient, float specular, float radius) { @@ -24,8 +32,12 @@ public: direction[i] = SkFloatToScalar(values[i]); } - return SkBlurMaskFilter::CreateEmboss(direction, SkFloatToScalar(ambient), - SkFloatToScalar(specular), SkFloatToScalar(radius)); + SkMaskFilter* filter = SkBlurMaskFilter::CreateEmboss(direction, + SkFloatToScalar(ambient), + SkFloatToScalar(specular), + SkFloatToScalar(radius)); + ThrowIAE_IfNull(env, filter); + return filter; } }; diff --git a/core/jni/android/graphics/NinePatch.cpp b/core/jni/android/graphics/NinePatch.cpp index b11edfc..fd5271e 100644 --- a/core/jni/android/graphics/NinePatch.cpp +++ b/core/jni/android/graphics/NinePatch.cpp @@ -1,5 +1,6 @@ #include <utils/ResourceTypes.h> +#include "SkCanvas.h" #include "SkRegion.h" #include "GraphicsJNI.h" @@ -45,7 +46,8 @@ public: } static void draw(JNIEnv* env, SkCanvas* canvas, SkRect& bounds, - const SkBitmap* bitmap, jbyteArray chunkObj, const SkPaint* paint) + const SkBitmap* bitmap, jbyteArray chunkObj, const SkPaint* paint, + jint destDensity, jint srcDensity) { size_t chunkSize = env->GetArrayLength(chunkObj); void* storage = alloca(chunkSize); @@ -56,13 +58,32 @@ public: Res_png_9patch* chunk = static_cast<Res_png_9patch*>(storage); assert(chunkSize == chunk->serializedSize()); // this relies on deserialization being done in place - Res_png_9patch::deserialize(chunk); - NinePatch_Draw(canvas, bounds, *bitmap, *chunk, paint, NULL); + Res_png_9patch::deserialize(chunk); + + if (destDensity == srcDensity || destDensity == 0 + || srcDensity == 0) { + NinePatch_Draw(canvas, bounds, *bitmap, *chunk, paint, NULL); + } else { + canvas->save(); + + SkScalar scale = SkFloatToScalar(destDensity / (float)srcDensity); + canvas->translate(bounds.fLeft, bounds.fTop); + canvas->scale(scale, scale); + + bounds.fRight = SkScalarDiv(bounds.fRight-bounds.fLeft, scale); + bounds.fBottom = SkScalarDiv(bounds.fBottom-bounds.fTop, scale); + bounds.fLeft = bounds.fTop = 0; + + NinePatch_Draw(canvas, bounds, *bitmap, *chunk, paint, NULL); + + canvas->restore(); + } } } static void drawF(JNIEnv* env, jobject, SkCanvas* canvas, jobject boundsRectF, - const SkBitmap* bitmap, jbyteArray chunkObj, const SkPaint* paint) + const SkBitmap* bitmap, jbyteArray chunkObj, const SkPaint* paint, + jint destDensity, jint srcDensity) { SkASSERT(canvas); SkASSERT(boundsRectF); @@ -73,11 +94,12 @@ public: SkRect bounds; GraphicsJNI::jrectf_to_rect(env, boundsRectF, &bounds); - draw(env, canvas, bounds, bitmap, chunkObj, paint); + draw(env, canvas, bounds, bitmap, chunkObj, paint, destDensity, srcDensity); } static void drawI(JNIEnv* env, jobject, SkCanvas* canvas, jobject boundsRect, - const SkBitmap* bitmap, jbyteArray chunkObj, const SkPaint* paint) + const SkBitmap* bitmap, jbyteArray chunkObj, const SkPaint* paint, + jint destDensity, jint srcDensity) { SkASSERT(canvas); SkASSERT(boundsRect); @@ -87,7 +109,7 @@ public: SkRect bounds; GraphicsJNI::jrect_to_rect(env, boundsRect, &bounds); - draw(env, canvas, bounds, bitmap, chunkObj, paint); + draw(env, canvas, bounds, bitmap, chunkObj, paint, destDensity, srcDensity); } static jint getTransparentRegion(JNIEnv* env, jobject, @@ -126,8 +148,8 @@ public: static JNINativeMethod gNinePatchMethods[] = { { "isNinePatchChunk", "([B)Z", (void*)SkNinePatchGlue::isNinePatchChunk }, { "validateNinePatchChunk", "(I[B)V", (void*)SkNinePatchGlue::validateNinePatchChunk }, - { "nativeDraw", "(ILandroid/graphics/RectF;I[BI)V", (void*)SkNinePatchGlue::drawF }, - { "nativeDraw", "(ILandroid/graphics/Rect;I[BI)V", (void*)SkNinePatchGlue::drawI }, + { "nativeDraw", "(ILandroid/graphics/RectF;I[BIII)V", (void*)SkNinePatchGlue::drawF }, + { "nativeDraw", "(ILandroid/graphics/Rect;I[BIII)V", (void*)SkNinePatchGlue::drawI }, { "nativeGetTransparentRegion", "(I[BLandroid/graphics/Rect;)I", (void*)SkNinePatchGlue::getTransparentRegion } }; diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp index b28eb90..b09c62b 100644 --- a/core/jni/android/graphics/Shader.cpp +++ b/core/jni/android/graphics/Shader.cpp @@ -43,25 +43,23 @@ static int Color_HSVToColor(JNIEnv* env, jobject, int alpha, jfloatArray hsvArra static void Shader_destructor(JNIEnv* env, jobject, SkShader* shader) { - SkASSERT(shader != NULL); - shader->unref(); + shader->safeUnref(); } static bool Shader_getLocalMatrix(JNIEnv* env, jobject, const SkShader* shader, SkMatrix* matrix) { - SkASSERT(shader != NULL); - return shader->getLocalMatrix(matrix); + return shader ? shader->getLocalMatrix(matrix) : false; } static void Shader_setLocalMatrix(JNIEnv* env, jobject, SkShader* shader, const SkMatrix* matrix) { - SkASSERT(shader != NULL); - - if (NULL == matrix) { - shader->resetLocalMatrix(); - } - else { - shader->setLocalMatrix(*matrix); + if (shader) { + if (NULL == matrix) { + shader->resetLocalMatrix(); + } + else { + shader->setLocalMatrix(*matrix); + } } } diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index 59f4067..66b2506 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -74,12 +74,13 @@ static void doThrow(JNIEnv* env, const char* exc, const char* msg = NULL) } enum { - STYLE_NUM_ENTRIES = 5, + STYLE_NUM_ENTRIES = 6, STYLE_TYPE = 0, STYLE_DATA = 1, STYLE_ASSET_COOKIE = 2, STYLE_RESOURCE_ID = 3, - STYLE_CHANGING_CONFIGURATIONS = 4 + STYLE_CHANGING_CONFIGURATIONS = 4, + STYLE_DENSITY = 5 }; static jint copyValue(JNIEnv* env, jobject outValue, const ResTable* table, @@ -896,6 +897,7 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla ResTable::Theme* theme = (ResTable::Theme*)themeToken; const ResTable& res = theme->getResTable(); ResXMLParser* xmlParser = (ResXMLParser*)xmlParserToken; + ResTable_config config; Res_value value; const jsize NI = env->GetArrayLength(attrs); @@ -995,6 +997,7 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla value.dataType = Res_value::TYPE_NULL; value.data = 0; typeSetFlags = 0; + config.density = 0; // Skip through XML attributes until the end or the next possible match. while (ix < NX && curIdent > curXmlAttr) { @@ -1042,7 +1045,8 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla if (value.dataType != Res_value::TYPE_NULL) { // Take care of resolving the found resource to its final value. //printf("Resolving attribute reference\n"); - ssize_t newBlock = theme->resolveAttributeReference(&value, block, &resid, &typeSetFlags); + ssize_t newBlock = theme->resolveAttributeReference(&value, block, + &resid, &typeSetFlags, &config); if (newBlock >= 0) block = newBlock; } else { // If we still don't have a value for this attribute, try to find @@ -1051,7 +1055,8 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla ssize_t newBlock = theme->getAttribute(curIdent, &value, &typeSetFlags); if (newBlock >= 0) { //printf("Resolving resource reference\n"); - newBlock = res.resolveReference(&value, block, &resid, &typeSetFlags); + newBlock = res.resolveReference(&value, block, &resid, + &typeSetFlags, &config); if (newBlock >= 0) block = newBlock; } } @@ -1070,6 +1075,7 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla block != kXmlBlock ? (jint)res.getTableCookie(block) : (jint)-1; dest[STYLE_RESOURCE_ID] = resid; dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags; + dest[STYLE_DENSITY] = config.density; if (indices != NULL && value.dataType != Res_value::TYPE_NULL) { indicesIdx++; @@ -1108,6 +1114,7 @@ static jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, job } const ResTable& res(am->getResources()); ResXMLParser* xmlParser = (ResXMLParser*)xmlParserToken; + ResTable_config config; Res_value value; const jsize NI = env->GetArrayLength(attrs); @@ -1160,6 +1167,7 @@ static jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, job value.dataType = Res_value::TYPE_NULL; value.data = 0; typeSetFlags = 0; + config.density = 0; // Skip through XML attributes until the end or the next possible match. while (ix < NX && curIdent > curXmlAttr) { @@ -1179,7 +1187,8 @@ static jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, job if (value.dataType != Res_value::TYPE_NULL) { // Take care of resolving the found resource to its final value. //printf("Resolving attribute reference\n"); - ssize_t newBlock = res.resolveReference(&value, block, &resid, &typeSetFlags); + ssize_t newBlock = res.resolveReference(&value, block, &resid, + &typeSetFlags, &config); if (newBlock >= 0) block = newBlock; } @@ -1197,6 +1206,7 @@ static jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, job block != kXmlBlock ? (jint)res.getTableCookie(block) : (jint)-1; dest[STYLE_RESOURCE_ID] = resid; dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags; + dest[STYLE_DENSITY] = config.density; if (indices != NULL && value.dataType != Res_value::TYPE_NULL) { indicesIdx++; @@ -1250,6 +1260,7 @@ static jint android_content_AssetManager_retrieveArray(JNIEnv* env, jobject claz return JNI_FALSE; } const ResTable& res(am->getResources()); + ResTable_config config; Res_value value; ssize_t block; @@ -1276,13 +1287,15 @@ static jint android_content_AssetManager_retrieveArray(JNIEnv* env, jobject claz while (i < NV && arrayEnt < endArrayEnt) { block = arrayEnt->stringBlock; typeSetFlags = arrayTypeSetFlags; + config.density = 0; value = arrayEnt->map.value; uint32_t resid = 0; if (value.dataType != Res_value::TYPE_NULL) { // Take care of resolving the found resource to its final value. //printf("Resolving attribute reference\n"); - ssize_t newBlock = res.resolveReference(&value, block, &resid, &typeSetFlags); + ssize_t newBlock = res.resolveReference(&value, block, &resid, + &typeSetFlags, &config); if (newBlock >= 0) block = newBlock; } @@ -1299,6 +1312,7 @@ static jint android_content_AssetManager_retrieveArray(JNIEnv* env, jobject claz dest[STYLE_ASSET_COOKIE] = (jint)res.getTableCookie(block); dest[STYLE_RESOURCE_ID] = resid; dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags; + dest[STYLE_DENSITY] = config.density; dest += STYLE_NUM_ENTRIES; i+= STYLE_NUM_ENTRIES; arrayEnt++; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 00d9cf6..4558660 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -209,7 +209,7 @@ <!-- Allows an application to read (but not write) the user's browsing history and bookmarks. --> - <permission android:name="android.permission.READ_HISTORY_BOOKMARKS" + <permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS" android:permissionGroup="android.permission-group.PERSONAL_INFO" android:label="@string/permlab_readHistoryBookmarks" android:description="@string/permdesc_readHistoryBookmarks" @@ -217,7 +217,7 @@ <!-- Allows an application to write (but not read) the user's browsing history and bookmarks. --> - <permission android:name="android.permission.WRITE_HISTORY_BOOKMARKS" + <permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS" android:permissionGroup="android.permission-group.PERSONAL_INFO" android:label="@string/permlab_writeHistoryBookmarks" android:description="@string/permdesc_writeHistoryBookmarks" @@ -833,7 +833,8 @@ android:protectionLevel="signature" /> <!-- Allows an application to call the activity manager shutdown() API - to put the higher-level system there into a shutdown state. --> + to put the higher-level system there into a shutdown state. + @hide --> <permission android:name="android.permission.SHUTDOWN" android:label="@string/permlab_shutdown" android:description="@string/permdesc_shutdown" @@ -842,7 +843,8 @@ <!-- 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. --> + critical UI such as the home screen. + @hide --> <permission android:name="android.permission.STOP_APP_SWITCHES" android:label="@string/permlab_stopAppSwitches" android:description="@string/permdesc_stopAppSwitches" diff --git a/core/res/res/drawable/expander_ic_maximized.9.png b/core/res/res/drawable/expander_ic_maximized.9.png Binary files differindex 778255a..465cabd 100644 --- a/core/res/res/drawable/expander_ic_maximized.9.png +++ b/core/res/res/drawable/expander_ic_maximized.9.png diff --git a/core/res/res/drawable/expander_ic_minimized.9.png b/core/res/res/drawable/expander_ic_minimized.9.png Binary files differindex 5235c18..9967ecb 100644 --- a/core/res/res/drawable/expander_ic_minimized.9.png +++ b/core/res/res/drawable/expander_ic_minimized.9.png diff --git a/core/res/res/drawable/rate_star_small_half.png b/core/res/res/drawable/rate_star_small_half.png Binary files differindex a81449b..437a11c 100644 --- a/core/res/res/drawable/rate_star_small_half.png +++ b/core/res/res/drawable/rate_star_small_half.png diff --git a/core/res/res/drawable/rate_star_small_off.png b/core/res/res/drawable/rate_star_small_off.png Binary files differindex 618766f..6fb0a36 100644 --- a/core/res/res/drawable/rate_star_small_off.png +++ b/core/res/res/drawable/rate_star_small_off.png diff --git a/core/res/res/drawable/rate_star_small_on.png b/core/res/res/drawable/rate_star_small_on.png Binary files differindex 74e3280..5392361 100644 --- a/core/res/res/drawable/rate_star_small_on.png +++ b/core/res/res/drawable/rate_star_small_on.png diff --git a/core/res/res/layout/zoom_browser_accessory_buttons.xml b/core/res/res/layout/zoom_browser_accessory_buttons.xml index 4bf2bdf..69afca9 100644 --- a/core/res/res/layout/zoom_browser_accessory_buttons.xml +++ b/core/res/res/layout/zoom_browser_accessory_buttons.xml @@ -18,18 +18,11 @@ */ --> <merge xmlns:android="http://schemas.android.com/apk/res/android"> - <ImageView android:id="@+id/zoom_fit_page" - android:background="@android:drawable/btn_browser_zoom_fit_page" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="bottom|left" - android:layout_marginLeft="7dip" - /> <ImageView android:id="@+id/zoom_page_overview" android:background="@android:drawable/btn_browser_zoom_page_overview" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="bottom|right" - android:layout_marginRight="7dip" + android:layout_gravity="bottom|left" + android:layout_marginLeft="7dip" /> </merge> diff --git a/core/res/res/values-bg-rBG/donottranslate-cldr.xml b/core/res/res/values-bg-rBG/donottranslate-cldr.xml index b8b50cc..527cdb9 100644 --- a/core/res/res/values-bg-rBG/donottranslate-cldr.xml +++ b/core/res/res/values-bg-rBG/donottranslate-cldr.xml @@ -111,7 +111,7 @@ <string name="abbrev_month_day">%-e %b</string> <string name="abbrev_month">%b</string> <string name="abbrev_month_year">%b %Y</string> - <string name="time1_time2">%1$s - %2$s</string> + <string name="time1_time2">%1$s-%2$s</string> <string name="date1_date2">%2$s - %5$s</string> <string name="numeric_md1_md2">%3$s.%2$s - %8$s.%7$s</string> <string name="numeric_wday1_md1_wday2_md2">%3$s.%2$s, %1$s - %8$s.%7$s, %6$s</string> diff --git a/core/res/res/values-cs-rCZ/donottranslate-cldr.xml b/core/res/res/values-cs-rCZ/donottranslate-cldr.xml deleted file mode 100644 index 41f5dea..0000000 --- a/core/res/res/values-cs-rCZ/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%-e.%-m.%Y</string> - <string name="numeric_date_format">d.M.yyyy</string> - <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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.%-m</string> - <string name="abbrev_month">%-B</string> - <string name="abbrev_month_year">%-B %Y</string> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s. - %8$s.%7$s.</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s. - %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s - %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s - %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s - %10$s %8$s.%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s. - %10$s %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s - %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s, %2$s - %6$s %4$s, %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s, %2$s - %4$s, %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s, %3$s</string> - <string name="wday_date">%2$s, %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s. %2$s - %8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s. %2$s - %10$s %6$s, %8$s. %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s. %2$s - %10$s %6$s, %8$s. %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s %4$s - %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s.-%8$s. %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s. %2$s - %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s.-%8$s. %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s %9$s</string> - <string name="short_format_month">%B</string> -</resources> diff --git a/core/res/res/values-cs/donottranslate-cldr.xml b/core/res/res/values-cs/donottranslate-cldr.xml index 41f5dea..53dc312 100644 --- a/core/res/res/values-cs/donottranslate-cldr.xml +++ b/core/res/res/values-cs/donottranslate-cldr.xml @@ -27,18 +27,18 @@ <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_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> @@ -96,52 +96,52 @@ <string name="hour_minute_cap_ampm">%-l:%M %^p</string> <string name="twelve_hour_time_format">h:mm a</string> <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%-e.%-m.%Y</string> - <string name="numeric_date_format">d.M.yyyy</string> - <string name="numeric_date_template">"%s.%s.%s"</string> + <string name="numeric_date">%-e. %-m. %Y</string> + <string name="numeric_date_format">d. M. yyyy</string> + <string name="numeric_date_template">"%s. %s. %s"</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="date_and_time">%-k:%M:%S %-e. %-m. %Y</string> <string name="date_time">%2$s %1$s</string> <string name="time_date">%1$s %3$s</string> - <string name="abbrev_month_day_year">%-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.%-m</string> + <string name="abbrev_month_day">%-e. %-m.</string> <string name="abbrev_month">%-B</string> <string name="abbrev_month_year">%-B %Y</string> - <string name="time1_time2">%1$s - %2$s</string> + <string name="time1_time2">%1$s-%2$s</string> <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s. - %8$s.%7$s.</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s. - %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s - %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s - %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s - %10$s %8$s.%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s. - %10$s %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s - %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s, %2$s - %6$s %4$s, %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s, %2$s - %4$s, %5$s</string> + <string name="numeric_md1_md2">%3$s. %2$s. - %8$s. %7$s.</string> + <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s. %2$s. - %6$s %8$s. %7$s.</string> + <string name="numeric_mdy1_mdy2">%3$s. %2$s. %4$s - %8$s. %7$s. %9$s</string> + <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s. %4$s - %6$s %8$s. %7$s. %9$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s. %4$s - %10$s %6$s %8$s. %7$s. %9$s</string> + <string name="numeric_md1_time1_md2_time2">%5$s %3$s. %2$s. - %10$s %8$s. %7$s.</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s. - %10$s %6$s %8$s. %7$s.</string> + <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s. %4$s - %10$s %8$s. %7$s. %9$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s - %6$s %4$s %5$s</string> + <string name="wday1_date1_wday2_date2">%1$s %2$s - %4$s %5$s</string> <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s, %3$s</string> - <string name="wday_date">%2$s, %3$s</string> + <string name="time_wday_date">%1$s %2$s %3$s</string> + <string name="wday_date">%2$s %3$s</string> <string name="time_wday">%1$s %2$s</string> <string name="same_year_md1_md2">%3$s. %2$s - %8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s</string> + <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s. %2$s - %10$s %6$s, %8$s. %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s. %2$s - %10$s %6$s, %8$s. %7$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s - %10$s %6$s %8$s. %7$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s - %10$s %6$s %8$s. %7$s</string> <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s %4$s - %6$s, %8$s. %7$s %9$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s %4$s - %10$s %6$s %8$s. %7$s %9$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s %4$s - %10$s %6$s %8$s. %7$s %9$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s %4$s - %6$s %8$s. %7$s %9$s</string> <string name="same_month_md1_md2">%3$s.-%8$s. %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s</string> + <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> <string name="same_year_mdy1_mdy2">%3$s. %2$s - %8$s. %7$s %9$s</string> <string name="same_month_mdy1_mdy2">%3$s.-%8$s. %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s %9$s</string> - <string name="short_format_month">%B</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s - %6$s %8$s. %7$s %9$s</string> + <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 7160b41..35a169f 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -111,7 +111,6 @@ <string name="httpErrorFile">"K souboru nelze získat přístup."</string> <string name="httpErrorFileNotFound">"Požadovaný soubor nebyl nalezen."</string> <string name="httpErrorTooManyRequests">"Je zpracováváno příliš mnoho požadavků. Opakujte akci později."</string> - <string name="certificateSaved">"Certifikát je uložen v systémovém úložišti klíčů."</string> <string name="contentServiceSync">"Synchronizace"</string> <string name="contentServiceSyncNotificationTitle">"Synchronizace"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"Příliš mnoho smazaných položek služby <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> diff --git a/core/res/res/values-da-rDK/donottranslate-cldr.xml b/core/res/res/values-da-rDK/donottranslate-cldr.xml deleted file mode 100644 index 2d0db93..0000000 --- a/core/res/res/values-da-rDK/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%H.%M</string> - <string name="hour_minute_ampm">%-l.%M %p</string> - <string name="hour_minute_cap_ampm">%-l.%M %^p</string> - <string name="twelve_hour_time_format">h.mm a</string> - <string name="twenty_four_hour_time_format">HH.mm</string> - <string name="numeric_date">%d/%m/%Y</string> - <string name="numeric_date_format">dd/MM/yyyy</string> - <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$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> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s/%2$s - %8$s/%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s/%2$s - %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s/%2$s/%4$s - %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s/%2$s/%4$s - %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s. %3$s-%2$s-%4$s - %10$s %6$s. %8$s-%7$s-%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s - %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s. %3$s-%2$s - %10$s %6$s. %8$s-%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s/%2$s/%4$s - %10$s %8$s/%7$s/%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s den %2$s - %6$s %4$s den %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s den %2$s - %4$s den %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s den %3$s</string> - <string name="wday_date">%2$s den %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s. %2$s - %8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %2$s - %6$s %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s - %10$s %6$s %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s - %10$s %6$s %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s. %3$s. %2$s %4$s - %10$s %6$s. %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s. %3$s. %2$s %4$s - %10$s %6$s. %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s. %3$s. %2$s %4$s - %6$s. %8$s. %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s.-%8$s. %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s - %6$s %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s. %2$s - %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s.-%8$s. %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s den %3$s. %2$s - %6$s den %8$s. %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-da/donottranslate-cldr.xml b/core/res/res/values-da/donottranslate-cldr.xml index 2d0db93..a4faca2 100644 --- a/core/res/res/values-da/donottranslate-cldr.xml +++ b/core/res/res/values-da/donottranslate-cldr.xml @@ -61,21 +61,21 @@ <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_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_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> @@ -91,20 +91,20 @@ <string name="today">i dag</string> <string name="tomorrow">i morgen</string> - <string name="hour_minute_24">%H.%M</string> + <string name="hour_minute_24">%H:%M</string> <string name="hour_minute_ampm">%-l.%M %p</string> <string name="hour_minute_cap_ampm">%-l.%M %^p</string> <string name="twelve_hour_time_format">h.mm a</string> - <string name="twenty_four_hour_time_format">HH.mm</string> + <string name="twenty_four_hour_time_format">HH:mm</string> <string name="numeric_date">%d/%m/%Y</string> <string name="numeric_date_format">dd/MM/yyyy</string> <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</string> - <string name="abbrev_month_day_year">%d/%m/%Y</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="date_time">%2$s, %1$s</string> + <string name="time_date">%1$s, %3$s</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> @@ -117,31 +117,31 @@ <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s/%2$s - %6$s %8$s/%7$s</string> <string name="numeric_mdy1_mdy2">%3$s/%2$s/%4$s - %8$s/%7$s/%9$s</string> <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s/%2$s/%4$s - %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s. %3$s-%2$s-%4$s - %10$s %6$s. %8$s-%7$s-%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s - %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s. %3$s-%2$s - %10$s %6$s. %8$s-%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s/%2$s/%4$s - %10$s %8$s/%7$s/%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s den %2$s - %6$s %4$s den %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s den %2$s - %4$s den %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s den %3$s</string> - <string name="wday_date">%2$s den %3$s</string> - <string name="time_wday">%1$s %2$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s, %1$s %3$s/%2$s/%4$s - %10$s, %6$s %8$s/%7$s/%9$s</string> + <string name="numeric_md1_time1_md2_time2">%5$s, %3$s/%2$s - %10$s, %8$s/%7$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s, %1$s %3$s/%2$s - %10$s, %6$s %8$s/%7$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%5$s, %3$s/%2$s/%4$s - %10$s, %8$s/%7$s/%9$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%3$s, %1$s %2$s - %6$s, %4$s %5$s</string> + <string name="wday1_date1_wday2_date2">%1$s %2$s - %4$s %5$s</string> + <string name="date1_time1_date2_time2">%3$s, %2$s - %6$s, %5$s</string> + <string name="time_wday_date">%1$s, %2$s %3$s</string> + <string name="wday_date">%2$s %3$s</string> + <string name="time_wday">%1$s, %2$s</string> <string name="same_year_md1_md2">%3$s. %2$s - %8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %2$s - %6$s %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s - %10$s %6$s %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s - %10$s %6$s %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s. %3$s. %2$s %4$s - %10$s %6$s. %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s. %3$s. %2$s %4$s - %10$s %6$s. %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s. %3$s. %2$s %4$s - %6$s. %8$s. %7$s %9$s</string> + <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> + <string name="same_year_md1_time1_md2_time2">%5$s, %3$s. %2$s - %10$s, %8$s. %7$s</string> + <string name="same_month_md1_time1_md2_time2">%5$s, %3$s. %2$s - %10$s, %8$s. %7$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s, %1$s %3$s. %2$s - %10$s, %6$s %8$s. %7$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s, %1$s %3$s. %2$s - %10$s, %6$s %8$s. %7$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%5$s, %3$s. %2$s %4$s - %10$s, %8$s. %7$s %9$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%5$s, %3$s. %2$s %4$s - %10$s, %8$s. %7$s %9$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s, %1$s %3$s. %2$s %4$s - %10$s, %6$s %8$s. %7$s %9$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s, %1$s %3$s. %2$s %4$s - %10$s, %6$s %8$s. %7$s %9$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s %4$s - %6$s %8$s. %7$s %9$s</string> <string name="same_month_md1_md2">%3$s.-%8$s. %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s - %6$s %8$s %7$s</string> + <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> <string name="same_year_mdy1_mdy2">%3$s. %2$s - %8$s. %7$s %9$s</string> <string name="same_month_mdy1_mdy2">%3$s.-%8$s. %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s den %3$s. %2$s - %6$s den %8$s. %7$s %9$s</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s d. %3$s. %2$s - %6$s d. %8$s. %7$s %9$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index a3e8dc5..3392546 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -134,8 +134,6 @@ <string name="httpErrorFile">"Der kunne ikke oprettes adgang til filen."</string> <string name="httpErrorFileNotFound">"Den anmodede fil blev ikke fundet."</string> <string name="httpErrorTooManyRequests">"Der behandles for mange anmodninger. Prøv igen senere."</string> - <!-- no translation found for certificateSaved (2832076323378077191) --> - <skip /> <string name="contentServiceSync">"Synkroniser"</string> <string name="contentServiceSyncNotificationTitle">"Synkroniser"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"For mange <xliff:g id="CONTENT_TYPE">%s</xliff:g> sletninger"</string> diff --git a/core/res/res/values-de-rAT/donottranslate-cldr.xml b/core/res/res/values-de-rAT/donottranslate-cldr.xml deleted file mode 100644 index 27624a3..0000000 --- a/core/res/res/values-de-rAT/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_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">Jänner</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">Jän</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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%d.%m.%Y</string> - <string name="numeric_date_format">dd.MM.yyyy</string> - <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$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">%d. %b</string> - <string name="abbrev_month">%-b</string> - <string name="abbrev_month_year">%b %Y</string> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s. - %8$s.%7$s.</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s. - %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s - %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s - %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s. - %10$s %8$s.%7$s.</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s. - %10$s %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s - %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s, %2$s - %6$s %4$s, %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s, %2$s - %4$s, %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s, %3$s</string> - <string name="wday_date">%2$s, %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s. %2$s - %8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s. %2$s - %10$s %6$s, %8$s. %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s. %2$s - %10$s %6$s, %8$s. %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s %4$s - %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s.-%8$s. %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s. %2$s - %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s.-%8$s. %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-de-rCH/donottranslate-cldr.xml b/core/res/res/values-de-rCH/donottranslate-cldr.xml deleted file mode 100644 index f32095b..0000000 --- a/core/res/res/values-de-rCH/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%d.%m.%Y</string> - <string name="numeric_date_format">dd.MM.yyyy</string> - <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$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> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s. - %8$s.%7$s.</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s. - %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s - %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s - %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s. - %10$s %8$s.%7$s.</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s. - %10$s %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s - %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s - %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s - %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s. %2$s - %8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s - %10$s %6$s %8$s. %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s - %10$s %6$s %8$s. %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s %4$s - %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s.-%8$s. %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s. %2$s - %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s.-%8$s. %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-de-rDE/donottranslate-cldr.xml b/core/res/res/values-de-rDE/donottranslate-cldr.xml deleted file mode 100644 index f32095b..0000000 --- a/core/res/res/values-de-rDE/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%d.%m.%Y</string> - <string name="numeric_date_format">dd.MM.yyyy</string> - <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$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> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s. - %8$s.%7$s.</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s. - %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s - %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s - %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s. - %10$s %8$s.%7$s.</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s. - %10$s %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s - %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s - %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s - %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s. %2$s - %8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s - %10$s %6$s %8$s. %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s - %10$s %6$s %8$s. %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s %4$s - %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s.-%8$s. %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s. %2$s - %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s.-%8$s. %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-de-rLI/donottranslate-cldr.xml b/core/res/res/values-de-rLI/donottranslate-cldr.xml deleted file mode 100644 index f32095b..0000000 --- a/core/res/res/values-de-rLI/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%d.%m.%Y</string> - <string name="numeric_date_format">dd.MM.yyyy</string> - <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$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> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s. - %8$s.%7$s.</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s. - %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s - %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s - %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s. - %10$s %8$s.%7$s.</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s. - %10$s %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s - %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s - %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s - %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s. %2$s - %8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s - %10$s %6$s %8$s. %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s - %10$s %6$s %8$s. %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s %4$s - %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s.-%8$s. %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s. %2$s - %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s.-%8$s. %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-de/donottranslate-cldr.xml b/core/res/res/values-de/donottranslate-cldr.xml index f32095b..babf1a0 100644 --- a/core/res/res/values-de/donottranslate-cldr.xml +++ b/core/res/res/values-de/donottranslate-cldr.xml @@ -27,18 +27,18 @@ <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_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> @@ -91,19 +91,19 @@ <string name="today">Heute</string> <string name="tomorrow">Morgen</string> - <string name="hour_minute_24">%-k:%M</string> + <string name="hour_minute_24">%-k:%M h</string> <string name="hour_minute_ampm">%-l:%M %p</string> <string name="hour_minute_cap_ampm">%-l:%M %^p</string> <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> + <string name="twenty_four_hour_time_format">H:mm \'h\'</string> <string name="numeric_date">%d.%m.%Y</string> <string name="numeric_date_format">dd.MM.yyyy</string> <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</string> + <string name="time_of_day">%H:%M:%S h</string> + <string name="date_and_time">%d.%m.%Y, %H:%M:%S h</string> + <string name="date_time">%1$s, %2$s</string> + <string name="time_date">%3$s, %1$s</string> <string name="abbrev_month_day_year">%d.%m.%Y</string> <string name="month_day">%-e. %B</string> <string name="month">%-B</string> @@ -111,37 +111,37 @@ <string name="abbrev_month_day">%-e. %b</string> <string name="abbrev_month">%-b</string> <string name="abbrev_month_year">%b %Y</string> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s. - %8$s.%7$s.</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s. - %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s - %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s - %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s. - %10$s %8$s.%7$s.</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s. - %10$s %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s - %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s - %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s - %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s. %2$s - %8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s - %10$s %6$s %8$s. %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s - %10$s %6$s %8$s. %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s %4$s - %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s.-%8$s. %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s. %2$s - %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s.-%8$s. %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s %9$s</string> + <string name="time1_time2">%1$s bis %2$s</string> + <string name="date1_date2">%2$s bis %5$s</string> + <string name="numeric_md1_md2">%3$s.%2$s. bis %8$s.%7$s.</string> + <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s. bis %6$s, %8$s.%7$s.</string> + <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s bis %8$s.%7$s.%9$s</string> + <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s bis %6$s, %8$s.%7$s.%9$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s.%2$s.%4$s, %5$s bis %6$s, %8$s.%7$s.%9$s, %10$s</string> + <string name="numeric_md1_time1_md2_time2">%3$s.%2$s., %5$s bis %8$s.%7$s., %10$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s.%2$s., %5$s bis %6$s, %8$s.%7$s., %10$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%3$s.%2$s.%4$s, %5$s bis %8$s.%7$s.%9$s, %10$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%1$s, %2$s, %3$s bis %4$s, %5$s, %6$s</string> + <string name="wday1_date1_wday2_date2">%1$s, %2$s bis %4$s, %5$s</string> + <string name="date1_time1_date2_time2">%2$s, %3$s bis %5$s, %6$s</string> + <string name="time_wday_date">%2$s, %3$s, %1$s</string> + <string name="wday_date">%2$s, %3$s</string> + <string name="time_wday">%2$s, %1$s</string> + <string name="same_year_md1_md2">%3$s. %2$s bis %8$s. %7$s</string> + <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s. %2$s bis %6$s, %8$s. %7$s</string> + <string name="same_year_md1_time1_md2_time2">%3$s. %2$s, %5$s bis %8$s. %7$s, %10$s</string> + <string name="same_month_md1_time1_md2_time2">%3$s. %2$s, %5$s bis %8$s. %7$s, %10$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s. %2$s, %5$s bis %6$s, %8$s. %7$s, %10$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s. %2$s, %5$s bis %6$s, %8$s. %7$s, %10$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%3$s. %2$s %4$s, %5$s bis %8$s. %7$s %9$s, %10$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%3$s. %2$s %4$s, %5$s bis %8$s. %7$s %9$s, %10$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s. %2$s %4$s, %5$s bis %6$s, %8$s. %7$s %9$s, %10$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s. %2$s %4$s, %5$s bis %6$s, %8$s. %7$s %9$s, %10$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s %4$s bis %6$s, %8$s. %7$s %9$s</string> + <string name="same_month_md1_md2">%3$s. bis %8$s. %2$s</string> + <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s. %2$s bis %6$s, %8$s. %7$s</string> + <string name="same_year_mdy1_mdy2">%3$s. %2$s bis %8$s. %7$s %9$s</string> + <string name="same_month_mdy1_mdy2">%3$s. bis %8$s. %2$s %9$s</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s bis %6$s, %8$s. %7$s %9$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 56d9ef8..1f9001b 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -111,7 +111,6 @@ <string name="httpErrorFile">"Auf die Datei konnte nicht zugegriffen werden."</string> <string name="httpErrorFileNotFound">"Die angeforderte Datei wurde nicht gefunden."</string> <string name="httpErrorTooManyRequests">"Es werden zurzeit zu viele Anfragen verarbeitet. Versuchen Sie es später erneut."</string> - <string name="certificateSaved">"Das Zertifikat wird im Schlüsselspeicher des Systems gespeichert."</string> <string name="contentServiceSync">"Synchronisieren"</string> <string name="contentServiceSyncNotificationTitle">"Synchronisieren"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"Zu viele <xliff:g id="CONTENT_TYPE">%s</xliff:g> gelöscht."</string> diff --git a/core/res/res/values-el-rGR/donottranslate-cldr.xml b/core/res/res/values-el-rGR/donottranslate-cldr.xml deleted file mode 100644 index e8f02fb..0000000 --- a/core/res/res/values-el-rGR/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%d/%m/%Y</string> - <string name="numeric_date_format">dd/MM/yyyy</string> - <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s/%2$s - %8$s/%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s/%2$s - %6$s, %8$s/%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s/%2$s/%4$s - %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s/%2$s/%4$s - %6$s, %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s/%2$s/%4$s - %10$s %6$s, %8$s/%7$s/%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s - %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s/%2$s - %10$s %6$s, %8$s/%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s/%2$s/%4$s - %10$s %8$s/%7$s/%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s, %2$s - %6$s %4$s, %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s, %2$s - %4$s, %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s, %3$s</string> - <string name="wday_date">%2$s, %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s %2$s - %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s %2$s - %6$s, %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s %2$s - %10$s %6$s, %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s %2$s - %10$s %6$s, %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s - %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s - %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s - %6$s, %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s %2$s - %6$s, %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s - %6$s, %8$s %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 5c6ba5a..e340095 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -134,8 +134,6 @@ <string name="httpErrorFile">"Η πρόσβαση στο αρχείο δεν ήταν δυνατή."</string> <string name="httpErrorFileNotFound">"Το αρχείο που ζητήθηκε δεν βρέθηκε."</string> <string name="httpErrorTooManyRequests">"Πραγματοποιείται επεξεργασία πάρα πολλών αιτημάτων. Προσπαθήστε ξανά αργότερα."</string> - <!-- no translation found for certificateSaved (2832076323378077191) --> - <skip /> <string name="contentServiceSync">"Συγχρονισμός"</string> <string name="contentServiceSyncNotificationTitle">"Συγχρονισμός"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"Πάρα πολλές <xliff:g id="CONTENT_TYPE">%s</xliff:g> διαγραφές."</string> diff --git a/core/res/res/values-en-rGB/donottranslate-cldr.xml b/core/res/res/values-en-rGB/donottranslate-cldr.xml index 0e3e035..65545ba 100644 --- a/core/res/res/values-en-rGB/donottranslate-cldr.xml +++ b/core/res/res/values-en-rGB/donottranslate-cldr.xml @@ -121,25 +121,25 @@ <string name="numeric_md1_time1_md2_time2">%3$s/%2$s, %5$s - %8$s/%7$s, %10$s</string> <string name="numeric_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s/%2$s, %5$s - %6$s, %8$s/%7$s, %10$s</string> <string name="numeric_mdy1_time1_mdy2_time2">%3$s/%2$s/%4$s, %5$s - %8$s/%7$s/%9$s, %10$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%1$s %2$s, %3$s - %4$s %5$s, %6$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s - %4$s %5$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%1$s, %2$s, %3$s - %4$s, %5$s, %6$s</string> + <string name="wday1_date1_wday2_date2">%1$s, %2$s - %4$s, %5$s</string> <string name="date1_time1_date2_time2">%2$s, %3$s - %5$s, %6$s</string> - <string name="time_wday_date">%1$s, %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> + <string name="time_wday_date">%1$s, %2$s, %3$s</string> + <string name="wday_date">%2$s, %3$s</string> <string name="time_wday">%1$s, %2$s</string> <string name="same_year_md1_md2">%3$s %2$s - %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %2$s - %6$s %8$s %7$s</string> + <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s %2$s - %6$s, %8$s %7$s</string> <string name="same_year_md1_time1_md2_time2">%3$s %2$s, %5$s - %8$s %7$s, %10$s</string> <string name="same_month_md1_time1_md2_time2">%3$s %2$s, %5$s - %8$s %7$s, %10$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%1$s %3$s %2$s, %5$s - %6$s %8$s %7$s, %10$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%1$s %3$s %2$s, %5$s - %6$s %8$s %7$s, %10$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s %2$s, %5$s - %6$s, %8$s %7$s, %10$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s %2$s, %5$s - %6$s, %8$s %7$s, %10$s</string> <string name="same_year_mdy1_time1_mdy2_time2">%3$s %2$s %4$s, %5$s - %8$s %7$s %9$s, %10$s</string> <string name="same_month_mdy1_time1_mdy2_time2">%3$s %2$s %4$s, %5$s - %8$s %7$s %9$s, %10$s</string> <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s %2$s %4$s, %5$s - %6$s, %8$s %7$s %9$s, %10$s</string> <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s %2$s %4$s, %5$s - %6$s, %8$s %7$s %9$s, %10$s</string> <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s - %6$s, %8$s %7$s %9$s</string> <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s - %6$s %8$s %7$s</string> + <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s %2$s - %6$s, %8$s %7$s</string> <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s</string> <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s</string> <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s - %6$s, %8$s %7$s %9$s</string> diff --git a/core/res/res/values-en-rSG/donottranslate-cldr.xml b/core/res/res/values-en-rSG/donottranslate-cldr.xml deleted file mode 100644 index 286cc0e..0000000 --- a/core/res/res/values-en-rSG/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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">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_24">%H:%M</string> - <string name="hour_minute_ampm">%-l:%M%p</string> - <string name="hour_minute_cap_ampm">%-l:%M%^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">HH:mm</string> - <string name="numeric_date">%-m/%-e/%Y</string> - <string name="numeric_date_format">M/d/yyyy</string> - <string name="numeric_date_template">"%s/%s/%s"</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">%b %-e, %Y, %-l:%M:%S %p</string> - <string name="date_time">%1$s, %2$s</string> - <string name="time_date">%1$s, %3$s</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> - <string name="time1_time2">%1$s – %2$s</string> - <string name="date1_date2">%2$s – %5$s</string> - <string name="numeric_md1_md2">%2$s/%3$s – %7$s/%8$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %2$s/%3$s – %6$s, %7$s/%8$s</string> - <string name="numeric_mdy1_mdy2">%2$s/%3$s/%4$s – %7$s/%8$s/%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %2$s/%3$s/%4$s – %6$s, %7$s/%8$s/%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %2$s/%3$s/%4$s, %5$s – %6$s, %7$s/%8$s/%9$s, %10$s</string> - <string name="numeric_md1_time1_md2_time2">%2$s/%3$s, %5$s – %7$s/%8$s, %10$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%1$s, %2$s/%3$s, %5$s – %6$s, %7$s/%8$s, %10$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%2$s/%3$s/%4$s, %5$s – %7$s/%8$s/%9$s, %10$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%1$s, %2$s, %3$s – %4$s, %5$s, %6$s</string> - <string name="wday1_date1_wday2_date2">%1$s, %2$s – %4$s, %5$s</string> - <string name="date1_time1_date2_time2">%2$s, %3$s – %5$s, %6$s</string> - <string name="time_wday_date">%1$s, %2$s, %3$s</string> - <string name="wday_date">%2$s, %3$s</string> - <string name="time_wday">%1$s, %2$s</string> - <string name="same_year_md1_md2">%2$s %3$s – %7$s %8$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s, %2$s %3$s – %6$s, %7$s %8$s</string> - <string name="same_year_md1_time1_md2_time2">%2$s %3$s, %5$s – %7$s %8$s, %10$s</string> - <string name="same_month_md1_time1_md2_time2">%2$s %3$s, %5$s – %7$s %8$s, %10$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%1$s, %2$s %3$s, %5$s – %6$s, %7$s %8$s, %10$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%1$s, %2$s %3$s, %5$s – %6$s, %7$s %8$s, %10$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%2$s %3$s, %4$s, %5$s – %7$s %8$s, %9$s, %10$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%2$s %3$s, %4$s, %5$s – %7$s %8$s, %9$s, %10$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %2$s %3$s, %4$s, %5$s – %6$s, %7$s %8$s, %9$s, %10$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %2$s %3$s, %4$s, %5$s – %6$s, %7$s %8$s, %9$s, %10$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %2$s %3$s, %4$s – %6$s, %7$s %8$s, %9$s</string> - <string name="same_month_md1_md2">%2$s %3$s – %8$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s, %2$s %3$s – %6$s, %7$s %8$s</string> - <string name="same_year_mdy1_mdy2">%2$s %3$s – %7$s %8$s, %9$s</string> - <string name="same_month_mdy1_mdy2">%2$s %3$s – %8$s, %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %2$s %3$s – %6$s, %7$s %8$s, %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-es-rES/donottranslate-cldr.xml b/core/res/res/values-es-rES/donottranslate-cldr.xml deleted file mode 100644 index c1dc58b..0000000 --- a/core/res/res/values-es-rES/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%d/%m/%Y</string> - <string name="numeric_date_format">dd/MM/yyyy</string> - <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s – %2$s</string> - <string name="date1_date2">%2$s – %5$s</string> - <string name="numeric_md1_md2">%3$s/%2$s – %8$s/%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s/%2$s – %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s/%2$s/%4$s – %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s/%2$s/%4$s – %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s/%2$s/%4$s – %10$s %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s – %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s-%2$s – %10$s %6$s, %8$s-%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s/%2$s/%4$s – %10$s %8$s/%7$s/%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s – %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s – %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s de %2$s – %8$s de %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s de %2$s – %10$s %8$s de %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s de %2$s – %10$s %8$s de %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s – %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s – %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s – %6$s, %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s–%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s – %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s–%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s – %6$s %8$s %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-es-rUS/donottranslate-cldr.xml b/core/res/res/values-es-rUS/donottranslate-cldr.xml index d6d8954..7ade142 100644 --- a/core/res/res/values-es-rUS/donottranslate-cldr.xml +++ b/core/res/res/values-es-rUS/donottranslate-cldr.xml @@ -27,18 +27,18 @@ <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_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> @@ -61,21 +61,21 @@ <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_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_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> @@ -85,8 +85,8 @@ <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="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> @@ -111,7 +111,7 @@ <string name="abbrev_month_day">%-e de %b</string> <string name="abbrev_month">%b</string> <string name="abbrev_month_year">%b de %Y</string> - <string name="time1_time2">%1$s a el %2$s</string> + <string name="time1_time2">%1$s a %2$s</string> <string name="date1_date2">%2$s a el %5$s</string> <string name="numeric_md1_md2">%2$s/%3$s - %7$s/%8$s</string> <string name="numeric_wday1_md1_wday2_md2">%1$s %2$s/%3$s - %6$s %7$s/%8$s</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 6eb1c01..6544d4b 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -134,8 +134,6 @@ <string name="httpErrorFile">"No se ha podido acceder al archivo."</string> <string name="httpErrorFileNotFound">"No se ha encontrado el archivo solicitado."</string> <string name="httpErrorTooManyRequests">"Se están procesando demasiadas solicitudes. Vuelve a intentarlo más tarde."</string> - <!-- no translation found for certificateSaved (2832076323378077191) --> - <skip /> <string name="contentServiceSync">"Sincronización"</string> <string name="contentServiceSyncNotificationTitle">"Sincronización"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"Demasiadas eliminaciones de <xliff:g id="CONTENT_TYPE">%s</xliff:g>"</string> diff --git a/core/res/res/values-es/donottranslate-cldr.xml b/core/res/res/values-es/donottranslate-cldr.xml index c1dc58b..0de0b64 100644 --- a/core/res/res/values-es/donottranslate-cldr.xml +++ b/core/res/res/values-es/donottranslate-cldr.xml @@ -27,18 +27,18 @@ <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_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> @@ -61,21 +61,21 @@ <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_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_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> @@ -101,47 +101,47 @@ <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</string> + <string name="date_and_time">%d/%m/%Y, %H:%M:%S</string> + <string name="date_time">%1$s, %2$s</string> + <string name="time_date">%3$s, %1$s</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_day">%-e de %b</string> <string name="abbrev_month">%-b</string> - <string name="abbrev_month_year">%b %Y</string> + <string name="abbrev_month_year">%b de %Y</string> <string name="time1_time2">%1$s – %2$s</string> <string name="date1_date2">%2$s – %5$s</string> <string name="numeric_md1_md2">%3$s/%2$s – %8$s/%7$s</string> <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s/%2$s – %6$s %8$s/%7$s</string> <string name="numeric_mdy1_mdy2">%3$s/%2$s/%4$s – %8$s/%7$s/%9$s</string> <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s/%2$s/%4$s – %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s/%2$s/%4$s – %10$s %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s – %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s-%2$s – %10$s %6$s, %8$s-%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s/%2$s/%4$s – %10$s %8$s/%7$s/%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s – %6$s %4$s %5$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%1$s %3$s/%2$s/%4$s, %5$s – %6$s %8$s/%7$s/%9$s, %10$s</string> + <string name="numeric_md1_time1_md2_time2">%3$s/%2$s, %5$s – %8$s/%7$s, %10$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%1$s %3$s-%2$s, %5$s – %6$s %8$s-%7$s, %10$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%3$s/%2$s/%4$s, %5$s – %8$s/%7$s/%9$s, %10$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%1$s %2$s, %3$s – %4$s %5$s, %6$s</string> <string name="wday1_date1_wday2_date2">%1$s %2$s – %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> + <string name="date1_time1_date2_time2">%2$s, %3$s – %5$s, %6$s</string> + <string name="time_wday_date">%2$s %3$s, %1$s</string> <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> + <string name="time_wday">%2$s, %1$s</string> <string name="same_year_md1_md2">%3$s de %2$s – %8$s de %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s de %2$s – %10$s %8$s de %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s de %2$s – %10$s %8$s de %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s – %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s – %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s – %6$s, %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s–%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s – %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s–%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s – %6$s %8$s %7$s %9$s</string> + <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s de %2$s – %6$s %8$s de %7$s</string> + <string name="same_year_md1_time1_md2_time2">%3$s de %2$s, %5$s – %8$s de %7$s, %10$s</string> + <string name="same_month_md1_time1_md2_time2">%3$s de %2$s, %5$s – %8$s de %7$s, %10$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%1$s %3$s de %2$s, %5$s – %6$s %8$s de %7$s, %10$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%1$s %3$s de %2$s, %5$s – %6$s %8$s de %7$s, %10$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%3$s de %2$s de %4$s, %5$s – %8$s de %7$s de %9$s, %10$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%3$s de %2$s de %4$s, %5$s – %8$s de %7$s de %9$s, %10$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%1$s %3$s de %2$s de %4$s, %5$s – %6$s %8$s de %7$s de %9$s, %10$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%1$s %3$s de %2$s de %4$s, %5$s – %6$s %8$s de %7$s de %9$s, %10$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s de %2$s de %4$s – %6$s %8$s de %7$s de %9$s</string> + <string name="same_month_md1_md2">%3$s–%8$s de %2$s</string> + <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s de %2$s – %6$s %8$s de %7$s</string> + <string name="same_year_mdy1_mdy2">%3$s de %2$s – %8$s de %7$s de %9$s</string> + <string name="same_month_mdy1_mdy2">%3$s–%8$s de %2$s de %9$s</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s de %2$s – %6$s %8$s de %7$s de %9$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 464e1a2..b0b2d51 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -111,7 +111,6 @@ <string name="httpErrorFile">"No se ha podido acceder al archivo."</string> <string name="httpErrorFileNotFound">"No se ha encontrado el archivo solicitado."</string> <string name="httpErrorTooManyRequests">"Se están procesando demasiadas solicitudes. Vuelve a intentarlo más tarde."</string> - <string name="certificateSaved">"El certificado se guarda en el almacén de claves del sistema."</string> <string name="contentServiceSync">"Sincronización"</string> <string name="contentServiceSyncNotificationTitle">"Sincronización"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"Demasiadas eliminaciones de <xliff:g id="CONTENT_TYPE">%s</xliff:g>"</string> diff --git a/core/res/res/values-fi-rFI/donottranslate-cldr.xml b/core/res/res/values-fi-rFI/donottranslate-cldr.xml index df3866e..151d935 100644 --- a/core/res/res/values-fi-rFI/donottranslate-cldr.xml +++ b/core/res/res/values-fi-rFI/donottranslate-cldr.xml @@ -53,13 +53,13 @@ <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_long_sunday">sunnuntai</string> + <string name="day_of_week_long_monday">maanantai</string> + <string name="day_of_week_long_tuesday">tiistai</string> + <string name="day_of_week_long_wednesday">keskiviikko</string> + <string name="day_of_week_long_thursday">torstai</string> + <string name="day_of_week_long_friday">perjantai</string> + <string name="day_of_week_long_saturday">lauantai</string> <string name="day_of_week_medium_sunday">su</string> <string name="day_of_week_medium_monday">ma</string> @@ -106,42 +106,42 @@ <string name="time_date">%1$s %3$s</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">%-B</string> <string name="month_year">%-B %Y</string> - <string name="abbrev_month_day">%-e. %b</string> + <string name="abbrev_month_day">%-e.%-m.</string> <string name="abbrev_month">%-b</string> - <string name="abbrev_month_year">%-b %Y</string> + <string name="abbrev_month_year">%-B %Y</string> <string name="time1_time2">%1$s–%2$s</string> - <string name="date1_date2">%2$s–%5$s</string> + <string name="date1_date2">%2$s – %5$s</string> <string name="numeric_md1_md2">%3$s.%2$s.–%8$s.%7$s.</string> <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s.%2$s. – %6$s %8$s.%7$s.</string> <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s–%8$s.%7$s.%9$s</string> <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s.%2$s.%4$s – %6$s %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s.%2$s.%4$s–%10$s %6$s %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s.–%10$s %8$s.%7$s.</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s.%2$s.–%10$s %6$s %8$s.%7$s.</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s–%10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s–%6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s–%4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s–%6$s %5$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s.%2$s.%4$s – %10$s %6$s %8$s.%7$s.%9$s</string> + <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s. – %10$s %8$s.%7$s.</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s.%2$s. – %10$s %6$s %8$s.%7$s.</string> + <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s – %10$s %8$s.%7$s.%9$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s – %6$s %4$s %5$s</string> + <string name="wday1_date1_wday2_date2">%1$s %2$s – %4$s %5$s</string> + <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> <string name="time_wday_date">%1$s %2$s %3$s</string> <string name="wday_date">%2$s %3$s</string> <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s. %2$s–%8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s. %2$s–%6$s %8$s. %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s–%10$s %8$s. %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s–%10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s–%10$s %6$s %8$s. %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s–%10$s %6$s %8$s. %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s–%10$s %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s–%10$s %8$s. %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s %4$s–%10$s %6$s %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s %4$s–%10$s %6$s %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s %4$s–%6$s %8$s. %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s.–%8$s. %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s. %2$s–%6$s %8$s. %7$s</string> + <string name="same_year_md1_md2">%3$s. %2$s – %8$s. %7$s</string> + <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s. %2$s – %6$s %8$s. %7$s</string> + <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s – %10$s %8$s. %7$s</string> + <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s – %10$s %8$s. %7$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s – %10$s %6$s %8$s. %7$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s – %10$s %6$s %8$s. %7$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s – %10$s %8$s. %7$s %9$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s – %10$s %8$s. %7$s %9$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s %4$s – %10$s %6$s %8$s. %7$s %9$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s %4$s – %10$s %6$s %8$s. %7$s %9$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s %4$s – %6$s %8$s. %7$s %9$s</string> + <string name="same_month_md1_md2">%3$s. – %8$s. %2$s</string> + <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s. %2$s – %6$s %8$s. %7$s</string> <string name="same_year_mdy1_mdy2">%3$s. %2$s – %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s.–%8$s. %2$s %9$s</string> + <string name="same_month_mdy1_mdy2">%3$s. – %8$s. %2$s %9$s</string> <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s – %6$s %8$s. %7$s %9$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-fr-rBE/donottranslate-cldr.xml b/core/res/res/values-fr-rBE/donottranslate-cldr.xml deleted file mode 100644 index e190837..0000000 --- a/core/res/res/values-fr-rBE/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%-e/%m/%Y</string> - <string name="numeric_date_format">d/MM/yyyy</string> - <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">du %1$s au %2$s</string> - <string name="date1_date2">du %2$s au %5$s</string> - <string name="numeric_md1_md2">%3$s/%2$s - %8$s/%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s/%2$s - %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s/%2$s/%4$s - %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s/%2$s/%4$s - %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">du %5$s %1$s %3$s/%2$s/%4$s au %10$s %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_md1_time1_md2_time2">du %5$s %3$s/%2$s au %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">du %5$s %1$s %3$s/%2$s au %10$s %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">du %5$s %3$s/%2$s/%4$s au %10$s %8$s/%7$s/%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">du %3$s %1$s %2$s au %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">du %1$s %2$s au %4$s %5$s</string> - <string name="date1_time1_date2_time2">du %3$s %2$s au %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">du %3$s %2$s au %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">du %1$s %3$s %2$s au %6$s %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">du %5$s %3$s %2$s au %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">du %5$s %3$s %2$s au %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">du %5$s %1$s %3$s %2$s au %10$s %6$s %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">du %5$s %1$s %3$s %2$s au %10$s %6$s %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">du %5$s %3$s %2$s %4$s au %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">du %5$s %3$s %2$s %4$s au %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">du %5$s %1$s %3$s %2$s %4$s au %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">du %5$s %1$s %3$s %2$s %4$s au %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">du %1$s %3$s %2$s %4$s au %6$s %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">du %1$s %3$s %2$s au %6$s %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s au %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s au %6$s %8$s %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-fr-rCA/donottranslate-cldr.xml b/core/res/res/values-fr-rCA/donottranslate-cldr.xml deleted file mode 100644 index 346b971..0000000 --- a/core/res/res/values-fr-rCA/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%Y-%m-%d</string> - <string name="numeric_date_format">yyyy-MM-dd</string> - <string name="numeric_date_template">"%s-%s-%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s – %2$s</string> - <string name="date1_date2">%2$s – %5$s</string> - <string name="numeric_md1_md2">%2$s-%3$s – %7$s-%8$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s %2$s-%3$s – %6$s %7$s-%8$s</string> - <string name="numeric_mdy1_mdy2">%4$s-%2$s-%3$s – %9$s-%7$s-%8$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">du %1$s %4$s-%2$s-%3$s au %6$s %9$s-%7$s-%8$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %4$s-%2$s-%3$s – %10$s %6$s %9$s-%7$s-%8$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %2$s-%3$s – %10$s %7$s-%8$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %2$s-%3$s – %10$s %6$s %7$s-%8$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %4$s-%2$s-%3$s – %10$s %9$s-%7$s-%8$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s – %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s – %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s %2$s – %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s – %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s – %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s – %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s – %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s %4$s – %6$s %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s–%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">du %3$s %2$s au %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s–%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">du %1$s %3$s %2$s au %6$s %8$s %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-fr-rCH/donottranslate-cldr.xml b/core/res/res/values-fr-rCH/donottranslate-cldr.xml deleted file mode 100644 index 48db6b8..0000000 --- a/core/res/res/values-fr-rCH/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%d.%m.%Y</string> - <string name="numeric_date_format">dd.MM.yyyy</string> - <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">du %1$s au %2$s</string> - <string name="date1_date2">du %2$s au %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s - %8$s.%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s - %6$s, %8$s.%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s - %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">du %5$s %1$s, %3$s.%2$s.%4$s au %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">du %5$s %3$s.%2$s au %10$s %8$s.%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">du %5$s %1$s, %3$s.%2$s au %10$s %6$s, %8$s.%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">du %5$s %3$s.%2$s.%4$s au %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">du %3$s %1$s, %2$s au %6$s %4$s, %5$s</string> - <string name="wday1_date1_wday2_date2">du %1$s, %2$s au %4$s, %5$s</string> - <string name="date1_time1_date2_time2">du %3$s %2$s au %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s, %3$s</string> - <string name="wday_date">%2$s, %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">du %3$s %2$s au %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">du %1$s, %3$s %2$s au %6$s, %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">du %5$s %3$s %2$s au %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">du %5$s %3$s %2$s au %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">du %5$s %1$s, %3$s %2$s au %10$s %6$s, %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">du %5$s %1$s, %3$s %2$s au %10$s %6$s, %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">du %5$s %3$s %2$s %4$s au %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">du %5$s %3$s %2$s %4$s au %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">du %5$s %1$s, %3$s %2$s %4$s au %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">du %5$s %1$s, %3$s %2$s %4$s au %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">du %1$s, %3$s %2$s %4$s au %6$s, %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">du %1$s, %3$s %2$s au %6$s, %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s au %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s au %6$s, %8$s %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-fr-rFR/donottranslate-cldr.xml b/core/res/res/values-fr-rFR/donottranslate-cldr.xml deleted file mode 100644 index f340e83..0000000 --- a/core/res/res/values-fr-rFR/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%d/%m/%Y</string> - <string name="numeric_date_format">dd/MM/yyyy</string> - <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s – %2$s</string> - <string name="date1_date2">%2$s – %5$s</string> - <string name="numeric_md1_md2">%3$s/%2$s - %8$s/%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s/%2$s - %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s/%2$s/%4$s – %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s/%2$s/%4$s – %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s/%2$s/%4$s – %10$s %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s – %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s/%2$s – %10$s %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s/%2$s/%4$s – %10$s %8$s/%7$s/%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s – %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s – %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s %2$s – %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s – %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s – %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s – %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s – %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s %4$s – %6$s %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s–%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s – %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s–%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s – %6$s %8$s %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-fr/donottranslate-cldr.xml b/core/res/res/values-fr/donottranslate-cldr.xml index f340e83..bf93039 100644 --- a/core/res/res/values-fr/donottranslate-cldr.xml +++ b/core/res/res/values-fr/donottranslate-cldr.xml @@ -101,9 +101,9 @@ <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</string> + <string name="date_and_time">%-e %b %Y à %H:%M:%S</string> + <string name="date_time">%1$s à %2$s</string> + <string name="time_date">%3$s à %1$s</string> <string name="abbrev_month_day_year">%-e %b %Y</string> <string name="month_day">%-e %B</string> <string name="month">%-B</string> @@ -111,37 +111,37 @@ <string name="abbrev_month_day">%-e %b</string> <string name="abbrev_month">%-b</string> <string name="abbrev_month_year">%b %Y</string> - <string name="time1_time2">%1$s – %2$s</string> - <string name="date1_date2">%2$s – %5$s</string> - <string name="numeric_md1_md2">%3$s/%2$s - %8$s/%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s/%2$s - %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s/%2$s/%4$s – %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s/%2$s/%4$s – %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s/%2$s/%4$s – %10$s %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s – %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s/%2$s – %10$s %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s/%2$s/%4$s – %10$s %8$s/%7$s/%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s – %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s – %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> + <string name="time1_time2">de %1$s à %2$s</string> + <string name="date1_date2">du %2$s au %5$s</string> + <string name="numeric_md1_md2">du %3$s/%2$s au %8$s/%7$s</string> + <string name="numeric_wday1_md1_wday2_md2">du %1$s %3$s/%2$s au %6$s %8$s/%7$s</string> + <string name="numeric_mdy1_mdy2">du %3$s/%2$s/%4$s au %8$s/%7$s/%9$s</string> + <string name="numeric_wday1_mdy1_wday2_mdy2">du %1$s %3$s/%2$s/%4$s au %6$s %8$s/%7$s/%9$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">du %1$s %3$s/%2$s/%4$s à %5$s au %6$s %8$s/%7$s/%9$s à %10$s</string> + <string name="numeric_md1_time1_md2_time2">du %3$s/%2$s à %5$s au %8$s/%7$s à %10$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">du %1$s %3$s/%2$s à %5$s au %6$s %8$s/%7$s à %10$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">du %3$s/%2$s/%4$s à %5$s au %8$s/%7$s/%9$s à %10$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">du %1$s %2$s à %3$s au %4$s %5$s à %6$s</string> + <string name="wday1_date1_wday2_date2">du %1$s %2$s au %4$s %5$s</string> + <string name="date1_time1_date2_time2">du %2$s à %3$s au %5$s à %6$s</string> + <string name="time_wday_date">%2$s %3$s à %1$s</string> <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s %2$s – %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s – %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s – %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s – %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s – %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s %4$s – %6$s %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s–%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s – %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s–%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s – %6$s %8$s %7$s %9$s</string> + <string name="time_wday">%2$s à %1$s</string> + <string name="same_year_md1_md2">du %3$s %2$s au %8$s %7$s</string> + <string name="same_year_wday1_md1_wday2_md2">du %1$s %3$s %2$s au %6$s %8$s %7$s</string> + <string name="same_year_md1_time1_md2_time2">du %3$s %2$s à %5$s au %8$s %7$s à %10$s</string> + <string name="same_month_md1_time1_md2_time2">du %3$s %2$s à %5$s au %8$s %7$s à %10$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">du %1$s %3$s %2$s à %5$s au %6$s %8$s %7$s à %10$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">du %1$s %3$s %2$s à %5$s au %6$s %8$s %7$s à %10$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">du %3$s %2$s %4$s à %5$s au %8$s %7$s %9$s à %10$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">du %3$s %2$s %4$s à %5$s au %8$s %7$s %9$s à %10$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">du %1$s %3$s %2$s %4$s à %5$s au %6$s %8$s %7$s %9$s à %10$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">du %1$s %3$s %2$s %4$s à %5$s au %6$s %8$s %7$s %9$s à %10$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">du %1$s %3$s %2$s %4$s au %6$s %8$s %7$s %9$s</string> + <string name="same_month_md1_md2">du %3$s au %8$s %2$s</string> + <string name="same_month_wday1_md1_wday2_md2">du %1$s %3$s %2$s au %6$s %8$s %7$s</string> + <string name="same_year_mdy1_mdy2">du %3$s %2$s au %8$s %7$s %9$s</string> + <string name="same_month_mdy1_mdy2">du %3$s au %8$s %2$s %9$s</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">du %1$s %3$s %2$s au %6$s %8$s %7$s %9$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 6bd9389..b46ea02 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -111,7 +111,6 @@ <string name="httpErrorFile">"Impossible d\'accéder au fichier."</string> <string name="httpErrorFileNotFound">"Le fichier demandé est introuvable."</string> <string name="httpErrorTooManyRequests">"Trop de requêtes sont en cours de traitement. Veuillez réessayer ultérieurement."</string> - <string name="certificateSaved">"Le certificat est enregistré dans le magasin de clés du système."</string> <string name="contentServiceSync">"Synchroniser"</string> <string name="contentServiceSyncNotificationTitle">"Synchronisation"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"Trop de contenus supprimés (<xliff:g id="CONTENT_TYPE">%s</xliff:g>)."</string> diff --git a/core/res/res/values-he-rIL/donottranslate-cldr.xml b/core/res/res/values-he-rIL/donottranslate-cldr.xml deleted file mode 100644 index 3378ed7..0000000 --- a/core/res/res/values-he-rIL/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%d/%m/%Y</string> - <string name="numeric_date_format">dd/MM/yyyy</string> - <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s – %2$s</string> - <string name="date1_date2">%2$s – %5$s</string> - <string name="numeric_md1_md2">%3$s/%2$s - %8$s/%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s/%2$s - %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s/%2$s/%4$s - %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s/%2$s/%4$s - %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s – %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s – %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %2$s-%3$s – %10$s %6$s, %7$s-%8$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s/%2$s/%4$s – %10$s %8$s/%7$s/%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s – %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s – %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s ב%2$s – %8$s ב%7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s ב%2$s – %10$s %8$s ב%7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s ב%2$s – %10$s %8$s ב%7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %4$s %2$s %3$s – %10$s %6$s, %9$s %7$s %8$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %4$s %2$s %3$s – %10$s %6$s, %9$s %7$s %8$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %4$s %2$s %3$s – %6$s, %9$s %7$s %8$s</string> - <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s - %6$s %8$s %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-hu-rHU/donottranslate-cldr.xml b/core/res/res/values-hu-rHU/donottranslate-cldr.xml index 08a70b8..1940889 100644 --- a/core/res/res/values-hu-rHU/donottranslate-cldr.xml +++ b/core/res/res/values-hu-rHU/donottranslate-cldr.xml @@ -92,18 +92,18 @@ <string name="tomorrow">holnap</string> <string name="hour_minute_24">%H:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> + <string name="hour_minute_ampm">%p %-l:%M</string> + <string name="hour_minute_cap_ampm">%^p %-l:%M</string> + <string name="twelve_hour_time_format">a h:mm</string> <string name="twenty_four_hour_time_format">HH:mm</string> <string name="numeric_date">%Y.%m.%d.</string> <string name="numeric_date_format">yyyy.MM.dd.</string> <string name="numeric_date_template">"%s.%s.%s."</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</string> + <string name="date_and_time">%Y.%m.%d., %-k:%M:%S</string> + <string name="date_time">%1$s, %2$s</string> + <string name="time_date">%3$s, %1$s</string> <string name="abbrev_month_day_year">%Y.%m.%d.</string> <string name="month_day">%B %-e.</string> <string name="month">%-B</string> @@ -117,26 +117,26 @@ <string name="numeric_wday1_md1_wday2_md2">%2$s.%3$s., %1$s - %7$s.%8$s., %6$s</string> <string name="numeric_mdy1_mdy2">%4$s.%2$s.%3$s. - %9$s.%7$s.%8$s.</string> <string name="numeric_wday1_mdy1_wday2_mdy2">%4$s.%2$s.%3$s., %1$s - %9$s.%7$s.%8$s., %6$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s.%2$s.%3$s., %1$s - %10$s %9$s.%7$s.%8$s., %6$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %2$s. %3$s. - %10$s %7$s. %8$s.</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %2$s. %3$s., %1$s - %10$s %7$s. %8$s., %6$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %4$s.%2$s.%3$s. - %10$s %9$s.%7$s.%8$s.</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %2$s, %1$s - %6$s %5$s, %4$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%4$s.%2$s.%3$s., %1$s, %5$s - %9$s.%7$s.%8$s., %6$s, %10$s</string> + <string name="numeric_md1_time1_md2_time2">%2$s.%3$s., %5$s - %7$s.%8$s., %10$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%2$s.%3$s., %1$s, %5$s - %7$s.%8$s., %6$s, %10$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%4$s.%2$s.%3$s., %5$s - %9$s.%7$s.%8$s., %10$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%2$s, %1$s, %3$s - %5$s, %4$s, %6$s</string> <string name="wday1_date1_wday2_date2">%2$s, %1$s - %5$s, %4$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %3$s, %2$s</string> + <string name="date1_time1_date2_time2">%2$s, %3$s - %5$s, %6$s</string> + <string name="time_wday_date">%3$s, %2$s, %1$s</string> <string name="wday_date">%3$s, %2$s</string> - <string name="time_wday">%1$s %2$s</string> + <string name="time_wday">%2$s, %1$s</string> <string name="same_year_md1_md2">%2$s %3$s. - %7$s %8$s.</string> <string name="same_year_wday1_md1_wday2_md2">%2$s %3$s., %1$s - %7$s %8$s., %6$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %2$s %3$s. - %10$s %7$s %8$s.</string> - <string name="same_month_md1_time1_md2_time2">%5$s %2$s %3$s. - %10$s %7$s %8$s.</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %2$s %3$s., %1$s - %10$s %7$s %8$s., %6$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %2$s %3$s., %1$s - %10$s %7$s %8$s., %6$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %4$s. %2$s %3$s. - %10$s %9$s. %7$s %8$s.</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %4$s. %2$s %3$s. - %10$s %9$s. %7$s %8$s.</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s. %2$s %3$s., %1$s - %10$s %9$s. %7$s %8$s., %6$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s. %2$s %3$s., %1$s - %10$s %9$s. %7$s %8$s., %6$s</string> + <string name="same_year_md1_time1_md2_time2">%2$s %3$s., %5$s - %7$s %8$s., %10$s</string> + <string name="same_month_md1_time1_md2_time2">%2$s %3$s., %5$s - %7$s %8$s., %10$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%2$s %3$s., %1$s, %5$s - %7$s %8$s., %6$s, %10$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%2$s %3$s., %1$s, %5$s - %7$s %8$s., %6$s, %10$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%4$s. %2$s %3$s., %5$s - %9$s. %7$s %8$s., %10$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%4$s. %2$s %3$s., %5$s - %9$s. %7$s %8$s., %10$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%4$s. %2$s %3$s., %1$s, %5$s - %9$s. %7$s %8$s., %6$s, %10$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%4$s. %2$s %3$s., %1$s, %5$s - %9$s. %7$s %8$s., %6$s, %10$s</string> <string name="same_month_wday1_mdy1_wday2_mdy2">%4$s. %2$s %3$s., %1$s - %9$s. %7$s %8$s., %6$s</string> <string name="same_month_md1_md2">%2$s %3$s-%8$s.</string> <string name="same_month_wday1_md1_wday2_md2">%2$s %3$s., %1$s - %7$s %8$s., %6$s</string> diff --git a/core/res/res/values-id-rID/donottranslate-cldr.xml b/core/res/res/values-id-rID/donottranslate-cldr.xml index 6adec84..ee33241 100644 --- a/core/res/res/values-id-rID/donottranslate-cldr.xml +++ b/core/res/res/values-id-rID/donottranslate-cldr.xml @@ -99,49 +99,49 @@ <string name="numeric_date">%d/%m/%Y</string> <string name="numeric_date_format">dd/MM/yyyy</string> <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> <string name="time_date">%1$s %3$s</string> <string name="abbrev_month_day_year">%-e %b %Y</string> - <string name="month_day">%B %-e</string> + <string name="month_day">%-e %B</string> <string name="month">%-B</string> + <string name="month_day_year">%-e %B %Y</string> <string name="month_year">%B %Y</string> - <string name="abbrev_month_day">%b %-e</string> + <string name="abbrev_month_day">%-e %b</string> <string name="abbrev_month">%-b</string> - <string name="abbrev_month_year">%Y %b</string> + <string name="abbrev_month_year">%b %Y</string> <string name="time1_time2">%1$s – %2$s</string> <string name="date1_date2">%2$s – %5$s</string> - <string name="numeric_md1_md2">%2$s-%3$s – %7$s-%8$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %2$s-%3$s – %6$s, %7$s-%8$s</string> - <string name="numeric_mdy1_mdy2">%4$s-%2$s-%3$s – %9$s-%7$s-%8$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %4$s-%2$s-%3$s – %6$s, %9$s-%7$s-%8$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %4$s-%2$s-%3$s – %10$s %6$s, %9$s-%7$s-%8$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %2$s-%3$s – %10$s %7$s-%8$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %2$s-%3$s – %10$s %6$s, %7$s-%8$s</string> + <string name="numeric_md1_md2">%3$s-%2$s – %8$s-%7$s</string> + <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s-%2$s – %6$s, %8$s-%7$s</string> + <string name="numeric_mdy1_mdy2">%3$s-%2$s-%4$s – %8$s-%7$s-%9$s</string> + <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s-%2$s-%4$s – %6$s, %8$s-%7$s-%9$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s-%2$s-%4$s – %10$s %6$s, %8$s-%7$s-%9$s</string> + <string name="numeric_md1_time1_md2_time2">%5$s %3$s-%2$s – %10$s %8$s-%7$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s-%2$s – %10$s %6$s, %8$s-%7$s</string> <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s/%2$s/%4$s – %10$s %8$s/%7$s/%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s – %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s – %4$s %5$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s, %2$s – %6$s %4$s, %5$s</string> + <string name="wday1_date1_wday2_date2">%1$s, %2$s – %4$s, %5$s</string> <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> + <string name="time_wday_date">%1$s %2$s, %3$s</string> + <string name="wday_date">%2$s, %3$s</string> <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%2$s %3$s – %7$s %8$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %2$s %3$s – %6$s %7$s %8$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %2$s %3$s – %10$s %7$s %8$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %2$s %3$s – %10$s %7$s %8$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %2$s %3$s – %10$s %6$s %7$s %8$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %2$s %3$s – %10$s %6$s %7$s %8$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %4$s-%2$s-%3$s – %10$s %9$s-%7$s-%8$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %4$s-%2$s-%3$s – %10$s %9$s-%7$s-%8$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %4$s %2$s %3$s – %10$s %6$s, %9$s %7$s %8$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %4$s %2$s %3$s – %10$s %6$s, %9$s %7$s %8$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %4$s %2$s %3$s – %6$s, %9$s %7$s %8$s</string> - <string name="same_month_md1_md2">%2$s-%3$s – %8$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %2$s %3$s – %6$s %7$s %8$s</string> - <string name="same_year_mdy1_mdy2">%9$s-%2$s-%3$s – %7$s-%8$s</string> - <string name="same_month_mdy1_mdy2">%9$s-%2$s-%3$s – %8$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %9$s-%2$s-%3$s – %6$s, yyyy-%7$s-%8$s</string> + <string name="same_year_md1_md2">%3$s %2$s – %8$s %7$s</string> + <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s %2$s – %6$s, %8$s %7$s</string> + <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s – %10$s %8$s %7$s</string> + <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s – %10$s %8$s %7$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s %2$s – %10$s %6$s, %8$s %7$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s %2$s – %10$s %6$s, %8$s %7$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s – %10$s %6$s, %8$s %7$s %9$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s – %10$s %6$s, %8$s %7$s %9$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s – %6$s, %8$s %7$s %9$s</string> + <string name="same_month_md1_md2">%3$s - %8$s %2$s</string> + <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s %2$s – %6$s, %8$s %7$s</string> + <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s</string> + <string name="same_month_mdy1_mdy2">%3$s - %8$s %2$s %9$s</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s - %6$s, %8$s %7$s %9$s</string> <string name="short_format_month">%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 deleted file mode 100644 index 12170d6..0000000 --- a/core/res/res/values-it-rCH/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_standalone_august">Agosto</string> - <string name="month_long_standalone_september">Settembre</string> - <string name="month_long_standalone_october">Ottobre</string> - <string name="month_long_standalone_november">Novembre</string> - <string name="month_long_standalone_december">Dicembre</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_24">%H:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">HH:mm</string> - <string name="numeric_date">%d.%m.%Y</string> - <string name="numeric_date_format">dd.MM.yyyy</string> - <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s - %8$s.%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s - %6$s, %8$s.%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s - %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s - %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s - %10$s %8$s.%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s - %10$s %6$s, %8$s.%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s - %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s, %2$s - %6$s %4$s, %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s, %2$s - %4$s, %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s, %3$s</string> - <string name="wday_date">%2$s, %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s %2$s - %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s %2$s - %6$s, %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s %2$s - %10$s %6$s, %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s %2$s - %10$s %6$s, %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s - %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s - %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s - %6$s, %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s %2$s - %6$s, %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s - %6$s, %8$s %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-it-rIT/donottranslate-cldr.xml b/core/res/res/values-it-rIT/donottranslate-cldr.xml deleted file mode 100644 index 2178bbe..0000000 --- a/core/res/res/values-it-rIT/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_standalone_august">Agosto</string> - <string name="month_long_standalone_september">Settembre</string> - <string name="month_long_standalone_october">Ottobre</string> - <string name="month_long_standalone_november">Novembre</string> - <string name="month_long_standalone_december">Dicembre</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_24">%H:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">HH:mm</string> - <string name="numeric_date">%d/%m/%Y</string> - <string name="numeric_date_format">dd/MM/yyyy</string> - <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s/%2$s - %8$s/%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s/%2$s - %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s/%2$s/%4$s - %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s/%2$s/%4$s - %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s/%2$s/%4$s - %10$s %6$s, %8$s/%7$s/%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s - %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s/%2$s - %10$s %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s/%2$s/%4$s - %10$s %8$s/%7$s/%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s - %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s - %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s %2$s - %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %2$s - %6$s %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s - %10$s %6$s %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s - %10$s %6$s %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s - %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s - %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s %4$s - %6$s %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s - %6$s %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s - %6$s %8$s %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-it/donottranslate-cldr.xml b/core/res/res/values-it/donottranslate-cldr.xml index 2178bbe..5cc697c 100644 --- a/core/res/res/values-it/donottranslate-cldr.xml +++ b/core/res/res/values-it/donottranslate-cldr.xml @@ -1,18 +1,18 @@ <?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_standalone_august">Agosto</string> - <string name="month_long_standalone_september">Settembre</string> - <string name="month_long_standalone_october">Ottobre</string> - <string name="month_long_standalone_november">Novembre</string> - <string name="month_long_standalone_december">Dicembre</string> + <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_standalone_august">agosto</string> + <string name="month_long_standalone_september">settembre</string> + <string name="month_long_standalone_october">ottobre</string> + <string name="month_long_standalone_november">novembre</string> + <string name="month_long_standalone_december">dicembre</string> <string name="month_long_january">gennaio</string> <string name="month_long_february">febbraio</string> @@ -100,8 +100,8 @@ <string name="numeric_date_format">dd/MM/yyyy</string> <string name="numeric_date_template">"%s/%s/%s"</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="time_of_day">%H:%M:%S</string> + <string name="date_and_time">%H:%M:%S %d/%b/%Y</string> <string name="date_time">%2$s %1$s</string> <string name="time_date">%1$s %3$s</string> <string name="abbrev_month_day_year">%d/%b/%Y</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 1a18450..1b8d504 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -111,7 +111,6 @@ <string name="httpErrorFile">"Impossibile accedere al file."</string> <string name="httpErrorFileNotFound">"Impossibile trovare il file richiesto."</string> <string name="httpErrorTooManyRequests">"Troppe richieste in fase di elaborazione. Riprova più tardi."</string> - <string name="certificateSaved">"Il certificato viene salvato nell\'archivio chiavi del sistema."</string> <string name="contentServiceSync">"Sinc"</string> <string name="contentServiceSyncNotificationTitle">"Sincronizzazione"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"Troppe eliminazioni di <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> diff --git a/core/res/res/values-ja-rJP/donottranslate-cldr.xml b/core/res/res/values-ja-rJP/donottranslate-cldr.xml deleted file mode 100644 index d2510f6..0000000 --- a/core/res/res/values-ja-rJP/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%p%-l:%M</string> - <string name="hour_minute_cap_ampm">%p%-l:%M</string> - <string name="twelve_hour_time_format">ah:mm</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%Y/%m/%d</string> - <string name="numeric_date_format">yyyy/MM/dd</string> - <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s~%2$s</string> - <string name="date1_date2">%2$s~%5$s</string> - <string name="numeric_md1_md2">%2$s/%3$s~%7$s/%8$s</string> - <string name="numeric_wday1_md1_wday2_md2">%2$s/%3$s(%1$s)~%7$s/%8$s(%6$s)</string> - <string name="numeric_mdy1_mdy2">%4$s/%2$s/%3$s~%9$s/%7$s/%8$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%4$s/%2$s/%3$s(%1$s)~%9$s/%7$s/%8$s(%6$s)</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s/%2$s/%3$s(%1$s)~%10$s %9$s/%7$s/%8$s(%6$s)</string> - <string name="numeric_md1_time1_md2_time2">%5$s %2$s/%3$s~%10$s %7$s/%8$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %2$s/%3$s(%1$s)~%10$s %7$s/%8$s(%6$s)</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %4$s/%2$s/%3$s~%10$s %9$s/%7$s/%8$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %2$s(%1$s)~%6$s %5$s(%4$s)</string> - <string name="wday1_date1_wday2_date2">%2$s(%1$s)~%5$s(%4$s)</string> - <string name="date1_time1_date2_time2">%3$s %2$s~%6$s %5$s</string> - <string name="time_wday_date">%1$s %3$s(%2$s)</string> - <string name="wday_date">%3$s(%2$s)</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%2$s%3$s日~%7$s%8$s日</string> - <string name="same_year_wday1_md1_wday2_md2">%2$s%3$s日(%1$s)~%7$s%8$s日(%6$s)</string> - <string name="same_year_md1_time1_md2_time2">%5$s %2$s%3$s日~%10$s %7$s%8$s日</string> - <string name="same_month_md1_time1_md2_time2">%5$s %2$s%3$s日~%10$s %7$s%8$s日</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %2$s%3$s日(%1$s)~%10$s %7$s%8$s日(%6$s)</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %2$s%3$s日(%1$s)~%10$s %7$s%8$s日(%6$s)</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %4$s年%2$s%3$s日~%10$s %9$s年%7$s%8$s日</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %4$s年%2$s%3$s日~%10$s %9$s年%7$s%8$s日</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s年%2$s%3$s日(%1$s)~%10$s %9$s年%7$s%8$s日(%6$s)</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s年%2$s%3$s日(%1$s)~%10$s %9$s年%7$s%8$s日(%6$s)</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%4$s年%2$s%3$s日(%1$s)~%9$s年%7$s%8$s日(%6$s)</string> - <string name="same_month_md1_md2">%2$s%3$s日~%8$s日</string> - <string name="same_month_wday1_md1_wday2_md2">%2$s%3$s日(%1$s)~%7$s%8$s日(%6$s)</string> - <string name="same_year_mdy1_mdy2">%9$s年%2$s%3$s日~%7$s%8$s日</string> - <string name="same_month_mdy1_mdy2">%9$s年%2$s%3$s日~%8$s日</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%9$s年%2$s%3$s日(%1$s)~%7$s%8$s日(%6$s)</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-ja/donottranslate-cldr.xml b/core/res/res/values-ja/donottranslate-cldr.xml index d2510f6..dab8e2a 100644 --- a/core/res/res/values-ja/donottranslate-cldr.xml +++ b/core/res/res/values-ja/donottranslate-cldr.xml @@ -53,13 +53,13 @@ <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_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> @@ -85,25 +85,25 @@ <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="am">AM</string> + <string name="pm">PM</string> <string name="yesterday">昨日</string> <string name="today">今日</string> <string name="tomorrow">明日</string> <string name="hour_minute_24">%-k:%M</string> - <string name="hour_minute_ampm">%p%-l:%M</string> - <string name="hour_minute_cap_ampm">%p%-l:%M</string> - <string name="twelve_hour_time_format">ah:mm</string> + <string name="hour_minute_ampm">%-l:%M%p</string> + <string name="hour_minute_cap_ampm">%-l:%M%^p</string> + <string name="twelve_hour_time_format">h:mma</string> <string name="twenty_four_hour_time_format">H:mm</string> <string name="numeric_date">%Y/%m/%d</string> <string name="numeric_date_format">yyyy/MM/dd</string> <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</string> + <string name="date_and_time">%Y/%m/%d %-k:%M:%S</string> + <string name="date_time">%1$s %2$s</string> + <string name="time_date">%3$s %1$s</string> <string name="abbrev_month_day_year">%Y/%m/%d</string> <string name="month_day">%-m月%-e日</string> <string name="month">%-B</string> @@ -114,34 +114,34 @@ <string name="time1_time2">%1$s~%2$s</string> <string name="date1_date2">%2$s~%5$s</string> <string name="numeric_md1_md2">%2$s/%3$s~%7$s/%8$s</string> - <string name="numeric_wday1_md1_wday2_md2">%2$s/%3$s(%1$s)~%7$s/%8$s(%6$s)</string> + <string name="numeric_wday1_md1_wday2_md2">%2$s/%3$s (%1$s)~%7$s/%8$s (%6$s)</string> <string name="numeric_mdy1_mdy2">%4$s/%2$s/%3$s~%9$s/%7$s/%8$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%4$s/%2$s/%3$s(%1$s)~%9$s/%7$s/%8$s(%6$s)</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s/%2$s/%3$s(%1$s)~%10$s %9$s/%7$s/%8$s(%6$s)</string> - <string name="numeric_md1_time1_md2_time2">%5$s %2$s/%3$s~%10$s %7$s/%8$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %2$s/%3$s(%1$s)~%10$s %7$s/%8$s(%6$s)</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %4$s/%2$s/%3$s~%10$s %9$s/%7$s/%8$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %2$s(%1$s)~%6$s %5$s(%4$s)</string> - <string name="wday1_date1_wday2_date2">%2$s(%1$s)~%5$s(%4$s)</string> - <string name="date1_time1_date2_time2">%3$s %2$s~%6$s %5$s</string> - <string name="time_wday_date">%1$s %3$s(%2$s)</string> - <string name="wday_date">%3$s(%2$s)</string> - <string name="time_wday">%1$s %2$s</string> + <string name="numeric_wday1_mdy1_wday2_mdy2">%4$s/%2$s/%3$s (%1$s)~%9$s/%7$s/%8$s (%6$s)</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%4$s/%2$s/%3$s (%1$s) %5$s~%9$s/%7$s/%8$s (%6$s) %10$s</string> + <string name="numeric_md1_time1_md2_time2">%2$s/%3$s %5$s~%7$s/%8$s %10$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%2$s/%3$s (%1$s) %5$s~%7$s/%8$s (%6$s) %10$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%4$s/%2$s/%3$s %5$s~%9$s/%7$s/%8$s %10$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%2$s (%1$s) %3$s~%5$s (%4$s) %6$s</string> + <string name="wday1_date1_wday2_date2">%2$s (%1$s)~%5$s (%4$s)</string> + <string name="date1_time1_date2_time2">%2$s%3$s~%5$s%6$s</string> + <string name="time_wday_date">%3$s (%2$s) %1$s</string> + <string name="wday_date">%3$s (%2$s)</string> + <string name="time_wday">%2$s %1$s</string> <string name="same_year_md1_md2">%2$s%3$s日~%7$s%8$s日</string> - <string name="same_year_wday1_md1_wday2_md2">%2$s%3$s日(%1$s)~%7$s%8$s日(%6$s)</string> - <string name="same_year_md1_time1_md2_time2">%5$s %2$s%3$s日~%10$s %7$s%8$s日</string> - <string name="same_month_md1_time1_md2_time2">%5$s %2$s%3$s日~%10$s %7$s%8$s日</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %2$s%3$s日(%1$s)~%10$s %7$s%8$s日(%6$s)</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %2$s%3$s日(%1$s)~%10$s %7$s%8$s日(%6$s)</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %4$s年%2$s%3$s日~%10$s %9$s年%7$s%8$s日</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %4$s年%2$s%3$s日~%10$s %9$s年%7$s%8$s日</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s年%2$s%3$s日(%1$s)~%10$s %9$s年%7$s%8$s日(%6$s)</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s年%2$s%3$s日(%1$s)~%10$s %9$s年%7$s%8$s日(%6$s)</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%4$s年%2$s%3$s日(%1$s)~%9$s年%7$s%8$s日(%6$s)</string> + <string name="same_year_wday1_md1_wday2_md2">%2$s%3$s日 (%1$s)~%7$s%8$s日 (%6$s)</string> + <string name="same_year_md1_time1_md2_time2">%2$s%3$s日%5$s~%7$s%8$s日%10$s</string> + <string name="same_month_md1_time1_md2_time2">%2$s%3$s日%5$s~%7$s%8$s日%10$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%2$s%3$s日 (%1$s) %5$s~%7$s%8$s日 (%6$s) %10$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%2$s%3$s日 (%1$s) %5$s~%7$s%8$s日 (%6$s) %10$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%4$s年%2$s%3$s日%5$s~%9$s年%7$s%8$s日%10$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%4$s年%2$s%3$s日%5$s~%9$s年%7$s%8$s日%10$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%4$s年%2$s%3$s日 (%1$s) %5$s~%9$s年%7$s%8$s日 (%6$s) %10$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%4$s年%2$s%3$s日 (%1$s) %5$s~%9$s年%7$s%8$s日 (%6$s) %10$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%4$s年%2$s%3$s日 (%1$s)~%9$s年%7$s%8$s日 (%6$s)</string> <string name="same_month_md1_md2">%2$s%3$s日~%8$s日</string> - <string name="same_month_wday1_md1_wday2_md2">%2$s%3$s日(%1$s)~%7$s%8$s日(%6$s)</string> + <string name="same_month_wday1_md1_wday2_md2">%2$s%3$s日 (%1$s)~%7$s%8$s日 (%6$s)</string> <string name="same_year_mdy1_mdy2">%9$s年%2$s%3$s日~%7$s%8$s日</string> <string name="same_month_mdy1_mdy2">%9$s年%2$s%3$s日~%8$s日</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%9$s年%2$s%3$s日(%1$s)~%7$s%8$s日(%6$s)</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%9$s年%2$s%3$s日 (%1$s)~%7$s%8$s日 (%6$s)</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 618d16b..6a659ee 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -134,8 +134,6 @@ <string name="httpErrorFile">"ファイルにアクセスできませんでした。"</string> <string name="httpErrorFileNotFound">"要求されたファイルが見つかりませんでした。"</string> <string name="httpErrorTooManyRequests">"処理中のリクエストが多すぎます。しばらくしてからもう一度試してください。"</string> - <!-- no translation found for certificateSaved (2832076323378077191) --> - <skip /> <string name="contentServiceSync">"同期"</string> <string name="contentServiceSyncNotificationTitle">"同期"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"<xliff:g id="CONTENT_TYPE">%s</xliff:g>での削除が多すぎます。"</string> diff --git a/core/res/res/values-ko-rKR/donottranslate-cldr.xml b/core/res/res/values-ko-rKR/donottranslate-cldr.xml deleted file mode 100644 index 57cd356..0000000 --- a/core/res/res/values-ko-rKR/donottranslate-cldr.xml +++ /dev/null @@ -1,135 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%Y. %-m. %-e.</string> - <string name="numeric_date_format">yyyy. M. d.</string> - <string name="numeric_date_template">"%s. %s. %s."</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s – %2$s</string> - <string name="date1_date2">%2$s – %5$s</string> - <string name="numeric_md1_md2">%2$s. %3$s ~ %7$s. %8$s</string> - <string name="numeric_wday1_md1_wday2_md2">%2$s. %3$s %1$s ~ %7$s. %8$s %6$s</string> - <string name="numeric_mdy1_mdy2">%4$s. %2$s. %3$s. ~ %9$s. %7$s. %8$s.</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%4$s. %2$s. %3$s. %1$s ~ %9$s. %7$s. %8$s. %6$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s. %2$s. %3$s. %1$s – %10$s %9$s. %7$s. %8$s. %6$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %2$s. %3$s. – %10$s %7$s. %8$s.</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %2$s. %3$s. (%1$s) – %10$s %7$s. %8$s. (%6$s)</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %4$s. %2$s. %3$s. – %10$s %9$s. %7$s. %8$s.</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %2$s (%1$s) – %6$s %5$s (%4$s)</string> - <string name="wday1_date1_wday2_date2">%2$s (%1$s) – %5$s (%4$s)</string> - <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> - <string name="time_wday_date">%1$s %3$s (%2$s)</string> - <string name="wday_date">%3$s (%2$s)</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%2$s %3$s일 – %7$s %8$s일</string> - <string name="same_year_wday1_md1_wday2_md2">%2$s %3$s일 (%1$s) – %7$s %8$s일 (%6$s)</string> - <string name="same_year_md1_time1_md2_time2">%5$s %2$s %3$s일 – %10$s %7$s %8$s일</string> - <string name="same_month_md1_time1_md2_time2">%5$s %2$s %3$s일 – %10$s %7$s %8$s일</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %2$s %3$s일 (%1$s) – %10$s %7$s %8$s일 (%6$s)</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %2$s %3$s일 (%1$s) – %10$s %7$s %8$s일 (%6$s)</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %4$s년 %2$s %3$s일 – %10$s %9$s년 %7$s %8$s일</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %4$s년 %2$s %3$s일 – %10$s %9$s년 %7$s %8$s일</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s년 %2$s %3$s일 %1$s – %10$s %9$s년 %7$s %8$s일 %6$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s년 %2$s %3$s일 %1$s – %10$s %9$s년 %7$s %8$s일 %6$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%4$s년 %2$s %3$s일 %1$s – %9$s년 %7$s %8$s일 %6$s</string> - <string name="same_month_md1_md2">%2$s %3$s일 ~ %8$s일</string> - <string name="same_month_wday1_md1_wday2_md2">%2$s %3$s일 (%1$s) – %7$s %8$s일 (%6$s)</string> - <string name="same_year_mdy1_mdy2">%9$s년 %2$s %3$s일 ~ %7$s %8$s일</string> - <string name="same_month_mdy1_mdy2">%9$s년 %2$s %3$s일~%8$s일</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%9$s년 %2$s %3$s일 %1$s ~ %7$s %8$s일 %6$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-ko/donottranslate-cldr.xml b/core/res/res/values-ko/donottranslate-cldr.xml index 57cd356..47f8c03 100644 --- a/core/res/res/values-ko/donottranslate-cldr.xml +++ b/core/res/res/values-ko/donottranslate-cldr.xml @@ -27,6 +27,18 @@ <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> @@ -80,56 +92,56 @@ <string name="tomorrow">내일</string> <string name="hour_minute_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %p</string> - <string name="twelve_hour_time_format">h:mm a</string> + <string name="hour_minute_ampm">%p %-l:%M</string> + <string name="hour_minute_cap_ampm">%p %-l:%M</string> + <string name="twelve_hour_time_format">a h:mm</string> <string name="twenty_four_hour_time_format">H:mm</string> <string name="numeric_date">%Y. %-m. %-e.</string> <string name="numeric_date_format">yyyy. M. d.</string> <string name="numeric_date_template">"%s. %s. %s."</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</string> + <string name="date_and_time">%Y. %-m. %-e. %p %-l:%M:%S</string> + <string name="date_time">%1$s %2$s</string> + <string name="time_date">%3$s %1$s</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> - <string name="time1_time2">%1$s – %2$s</string> - <string name="date1_date2">%2$s – %5$s</string> + <string name="abbrev_month_day">%-m. %-e.</string> + <string name="abbrev_month">%-m월</string> + <string name="abbrev_month_year">%Y. %-m.</string> + <string name="time1_time2">%1$s ~ %2$s</string> + <string name="date1_date2">%2$s ~ %5$s</string> <string name="numeric_md1_md2">%2$s. %3$s ~ %7$s. %8$s</string> <string name="numeric_wday1_md1_wday2_md2">%2$s. %3$s %1$s ~ %7$s. %8$s %6$s</string> <string name="numeric_mdy1_mdy2">%4$s. %2$s. %3$s. ~ %9$s. %7$s. %8$s.</string> <string name="numeric_wday1_mdy1_wday2_mdy2">%4$s. %2$s. %3$s. %1$s ~ %9$s. %7$s. %8$s. %6$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s. %2$s. %3$s. %1$s – %10$s %9$s. %7$s. %8$s. %6$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %2$s. %3$s. – %10$s %7$s. %8$s.</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %2$s. %3$s. (%1$s) – %10$s %7$s. %8$s. (%6$s)</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %4$s. %2$s. %3$s. – %10$s %9$s. %7$s. %8$s.</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %2$s (%1$s) – %6$s %5$s (%4$s)</string> - <string name="wday1_date1_wday2_date2">%2$s (%1$s) – %5$s (%4$s)</string> - <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> - <string name="time_wday_date">%1$s %3$s (%2$s)</string> - <string name="wday_date">%3$s (%2$s)</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%2$s %3$s일 – %7$s %8$s일</string> - <string name="same_year_wday1_md1_wday2_md2">%2$s %3$s일 (%1$s) – %7$s %8$s일 (%6$s)</string> - <string name="same_year_md1_time1_md2_time2">%5$s %2$s %3$s일 – %10$s %7$s %8$s일</string> - <string name="same_month_md1_time1_md2_time2">%5$s %2$s %3$s일 – %10$s %7$s %8$s일</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %2$s %3$s일 (%1$s) – %10$s %7$s %8$s일 (%6$s)</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %2$s %3$s일 (%1$s) – %10$s %7$s %8$s일 (%6$s)</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %4$s년 %2$s %3$s일 – %10$s %9$s년 %7$s %8$s일</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %4$s년 %2$s %3$s일 – %10$s %9$s년 %7$s %8$s일</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s년 %2$s %3$s일 %1$s – %10$s %9$s년 %7$s %8$s일 %6$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s년 %2$s %3$s일 %1$s – %10$s %9$s년 %7$s %8$s일 %6$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%4$s년 %2$s %3$s일 %1$s – %9$s년 %7$s %8$s일 %6$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%4$s. %2$s. %3$s. %1$s %5$s ~ %9$s. %7$s. %8$s. %6$s %10$s</string> + <string name="numeric_md1_time1_md2_time2">%2$s. %3$s. %5$s ~ %7$s. %8$s. %10$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%2$s. %3$s. %1$s %5$s ~ %7$s. %8$s. %6$s %10$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%4$s. %2$s. %3$s. %5$s ~ %9$s. %7$s. %8$s. %10$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%2$s %1$s %3$s ~ %5$s %4$s %6$s</string> + <string name="wday1_date1_wday2_date2">%2$s %1$s ~ %5$s %4$s</string> + <string name="date1_time1_date2_time2">%2$s %3$s ~ %5$s %6$s</string> + <string name="time_wday_date">%3$s %2$s %1$s</string> + <string name="wday_date">%3$s %2$s</string> + <string name="time_wday">%2$s %1$s</string> + <string name="same_year_md1_md2">%2$s %3$s일 ~ %7$s %8$s일</string> + <string name="same_year_wday1_md1_wday2_md2">%2$s %3$s일 %1$s ~ %7$s %8$s일 %6$s</string> + <string name="same_year_md1_time1_md2_time2">%2$s %3$s일 %5$s ~ %7$s %8$s일 %10$s</string> + <string name="same_month_md1_time1_md2_time2">%2$s %3$s일 %5$s ~ %7$s %8$s일 %10$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%2$s %3$s일 %1$s %5$s ~ %7$s %8$s일 %6$s %10$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%2$s %3$s일 %1$s %5$s ~ %7$s %8$s일 %6$s %10$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%4$s년 %2$s %3$s일 %5$s ~ %9$s년 %7$s %8$s일 %10$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%4$s년 %2$s %3$s일 %5$s ~ %9$s년 %7$s %8$s일 %10$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%4$s년 %2$s %3$s일 %1$s %5$s ~ %9$s년 %7$s %8$s일 %6$s %10$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%4$s년 %2$s %3$s일 %1$s %5$s ~ %9$s년 %7$s %8$s일 %6$s %10$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%4$s년 %2$s %3$s일 %1$s ~ %9$s년 %7$s %8$s일 %6$s</string> <string name="same_month_md1_md2">%2$s %3$s일 ~ %8$s일</string> - <string name="same_month_wday1_md1_wday2_md2">%2$s %3$s일 (%1$s) – %7$s %8$s일 (%6$s)</string> + <string name="same_month_wday1_md1_wday2_md2">%2$s %3$s일 %1$s ~ %7$s %8$s일 %6$s</string> <string name="same_year_mdy1_mdy2">%9$s년 %2$s %3$s일 ~ %7$s %8$s일</string> - <string name="same_month_mdy1_mdy2">%9$s년 %2$s %3$s일~%8$s일</string> + <string name="same_month_mdy1_mdy2">%9$s년 %2$s %3$s일 ~ %8$s일</string> <string name="same_year_wday1_mdy1_wday2_mdy2">%9$s년 %2$s %3$s일 %1$s ~ %7$s %8$s일 %6$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index d60ebaa..34b19b6 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -134,8 +134,6 @@ <string name="httpErrorFile">"파일에 액세스할 수 없습니다."</string> <string name="httpErrorFileNotFound">"요청한 파일을 찾을 수 없습니다."</string> <string name="httpErrorTooManyRequests">"처리 중인 요청이 너무 많습니다. 잠시 후에 다시 시도해 주세요."</string> - <!-- no translation found for certificateSaved (2832076323378077191) --> - <skip /> <string name="contentServiceSync">"동기화"</string> <string name="contentServiceSyncNotificationTitle">"동기화"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"<xliff:g id="CONTENT_TYPE">%s</xliff:g> 삭제가 너무 많습니다."</string> diff --git a/core/res/res/values-lt-rLT/donottranslate-cldr.xml b/core/res/res/values-lt-rLT/donottranslate-cldr.xml index 20d58e0..ad410e7 100644 --- a/core/res/res/values-lt-rLT/donottranslate-cldr.xml +++ b/core/res/res/values-lt-rLT/donottranslate-cldr.xml @@ -27,18 +27,18 @@ <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_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> @@ -101,47 +101,47 @@ <string name="numeric_date_template">"%s-%s-%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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="date_and_time">%H:%M:%S, %Y-%m-%d</string> + <string name="date_time">%2$s, %1$s</string> + <string name="time_date">%1$s, %3$s</string> + <string name="abbrev_month_day_year">%Y-%m-%d</string> + <string name="month_day">%B %-e d.</string> + <string name="month">%B mėn.</string> + <string name="month_year">%Y m. %B mėn.</string> <string name="abbrev_month_day">%b %-e d.</string> - <string name="abbrev_month">%b</string> - <string name="abbrev_month_year">%Y m. %b</string> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%2$s-%3$s - %7$s-%8$s</string> - <string name="numeric_wday1_md1_wday2_md2">%2$s-%3$s%1$s - %7$s-%8$s%6$s</string> - <string name="numeric_mdy1_mdy2">%4$s-%2$s-%3$s - %9$s-%7$s-%8$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%4$s-%2$s-%3$s%1$s - %9$s-%7$s-%8$s%6$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s-%2$s-%3$s%1$s - %10$s %9$s-%7$s-%8$s%6$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %2$s-%3$s - %10$s %7$s-%8$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %2$s-%3$s%1$s - %10$s %7$s-%8$s%6$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %4$s-%2$s-%3$s - %10$s %9$s-%7$s-%8$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %2$s%1$s - %6$s %5$s%4$s</string> - <string name="wday1_date1_wday2_date2">%2$s%1$s - %5$s%4$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %3$s%2$s</string> - <string name="wday_date">%3$s%2$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%2$s %3$s - %7$s %8$s</string> - <string name="same_year_wday1_md1_wday2_md2">%2$s %3$s d.%1$s - %7$s %8$s d.%6$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %2$s %3$s - %10$s %7$s %8$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %2$s %3$s - %10$s %7$s %8$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %2$s %3$s d.%1$s - %10$s %7$s %8$s d.%6$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %2$s %3$s d.%1$s - %10$s %7$s %8$s d.%6$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %4$s m. %2$s %3$s d. - %10$s %9$s m. %7$s %8$s d.</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %4$s m. %2$s %3$s d. - %10$s %9$s m. %7$s %8$s d.</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s m. %2$s %3$s d.,%1$s - %10$s %9$s m. %7$s %8$s d.,%6$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s m. %2$s %3$s d.,%1$s - %10$s %9$s m. %7$s %8$s d.,%6$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%4$s m. %2$s %3$s d.,%1$s - %9$s m. %7$s %8$s d.,%6$s</string> - <string name="same_month_md1_md2">%2$s %3$s d.-%8$s d.</string> - <string name="same_month_wday1_md1_wday2_md2">%2$s %3$s d.%1$s - %7$s %8$s d.%6$s</string> - <string name="same_year_mdy1_mdy2">%9$s m. %2$s %3$s d. - %7$s %8$s d.</string> - <string name="same_month_mdy1_mdy2">%9$s m. %2$s %3$s d.-%8$s d.</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%9$s m. %2$s %3$s d.,%1$s - %7$s %8$s d.,%6$s</string> + <string name="abbrev_month">%b mėn.</string> + <string name="abbrev_month_year">%Y m. %b mėn.</string> + <string name="time1_time2">%1$s-%2$s</string> + <string name="date1_date2">%2$s-%5$s</string> + <string name="numeric_md1_md2">%2$s-%3$s-%7$s-%8$s</string> + <string name="numeric_wday1_md1_wday2_md2">%2$s-%3$s, %1$s-%7$s-%8$s, %6$s</string> + <string name="numeric_mdy1_mdy2">%4$s-%2$s-%3$s-%9$s-%7$s-%8$s</string> + <string name="numeric_wday1_mdy1_wday2_mdy2">%4$s-%2$s-%3$s, %1$s-%9$s-%7$s-%8$s, %6$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s, %4$s-%2$s-%3$s, %1$s-%10$s, %9$s-%7$s-%8$s, %6$s</string> + <string name="numeric_md1_time1_md2_time2">%5$s, %2$s-%3$s-%10$s, %7$s-%8$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s, %2$s-%3$s, %1$s-%10$s, %7$s-%8$s, %6$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%5$s, %4$s-%2$s-%3$s-%10$s, %9$s-%7$s-%8$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%3$s, %2$s, %1$s-%6$s, %5$s, %4$s</string> + <string name="wday1_date1_wday2_date2">%2$s, %1$s-%5$s, %4$s</string> + <string name="date1_time1_date2_time2">%3$s, %2$s-%6$s, %5$s</string> + <string name="time_wday_date">%1$s, %3$s, %2$s</string> + <string name="wday_date">%3$s, %2$s</string> + <string name="time_wday">%1$s, %2$s</string> + <string name="same_year_md1_md2">%2$s %3$s d.-%7$s %8$s d.</string> + <string name="same_year_wday1_md1_wday2_md2">%2$s %3$s d., %1$s-%7$s %8$s d., %6$s</string> + <string name="same_year_md1_time1_md2_time2">%5$s, %2$s %3$s d.-%10$s, %7$s %8$s d.</string> + <string name="same_month_md1_time1_md2_time2">%5$s, %2$s %3$s d.-%10$s, %7$s %8$s d.</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s, %2$s %3$s d., %1$s-%10$s, %7$s %8$s d., %6$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s, %2$s %3$s d., %1$s-%10$s, %7$s %8$s d., %6$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%5$s, %4$s m. %2$s %3$s d.-%10$s, %9$s m. %7$s %8$s d.</string> + <string name="same_month_mdy1_time1_mdy2_time2">%5$s, %4$s m. %2$s %3$s d.-%10$s, %9$s m. %7$s %8$s d.</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s, %4$s m. %2$s %3$s d., %1$s-%10$s, %9$s m. %7$s %8$s d., %6$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s, %4$s m. %2$s %3$s d., %1$s-%10$s, %9$s m. %7$s %8$s d., %6$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%4$s m. %2$s %3$s d., %1$s-%9$s m. %7$s %8$s d., %6$s</string> + <string name="same_month_md1_md2">%2$s %3$s-%8$s d.</string> + <string name="same_month_wday1_md1_wday2_md2">%2$s %3$s d., %1$s-%7$s %8$s d., %6$s</string> + <string name="same_year_mdy1_mdy2">%9$s m. %2$s %3$s d.-%7$s %8$s d.</string> + <string name="same_month_mdy1_mdy2">%9$s m. %2$s %3$s-%8$s d.</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%9$s m. %2$s %3$s d., %1$s-%7$s %8$s d., %6$s</string> <string name="short_format_month">%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 index 3dec1d2..2c6765a 100644 --- a/core/res/res/values-lv-rLV/donottranslate-cldr.xml +++ b/core/res/res/values-lv-rLV/donottranslate-cldr.xml @@ -101,9 +101,9 @@ <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</string> + <string name="date_and_time">%Y. gada %-e. %b, %H:%M:%S</string> + <string name="date_time">%1$s, %2$s</string> + <string name="time_date">%3$s, %1$s</string> <string name="abbrev_month_day_year">%Y. gada %-e. %b</string> <string name="month_day">%-e. %B</string> <string name="month">%-B</string> @@ -111,37 +111,37 @@ <string name="abbrev_month_day">%-e. %b</string> <string name="abbrev_month">%-b</string> <string name="abbrev_month_year">%Y. g. %b</string> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s–%8$s.%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s - %6$s, %8$s.%7$s</string> + <string name="time1_time2">%1$s-%2$s</string> + <string name="date1_date2">%2$s-%5$s</string> + <string name="numeric_md1_md2">%3$s.%2$s.–%8$s.%7$s.</string> + <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s.-%6$s, %8$s.%7$s.</string> <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s.–%8$s.%7$s.%9$s.</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s. – %6$s, %8$s.%7$s.%9$s.</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s. - %10$s %6$s, %8$s.%7$s.%9$s.</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s. - %10$s %8$s.%7$s.</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s. - %10$s %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s - %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s, %2$s - %6$s %4$s, %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s, %2$s - %4$s, %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s, %3$s</string> + <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s.–%6$s, %8$s.%7$s.%9$s.</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s.%2$s.%4$s., %5$s-%6$s, %8$s.%7$s.%9$s., %10$s</string> + <string name="numeric_md1_time1_md2_time2">%3$s.%2$s., %5$s-%8$s.%7$s., %10$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s.%2$s., %5$s-%6$s, %8$s.%7$s., %10$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%3$s.%2$s.%4$s, %5$s-%8$s.%7$s.%9$s, %10$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%1$s, %2$s, %3$s-%4$s, %5$s, %6$s</string> + <string name="wday1_date1_wday2_date2">%1$s, %2$s-%4$s, %5$s</string> + <string name="date1_time1_date2_time2">%2$s, %3$s-%5$s, %6$s</string> + <string name="time_wday_date">%2$s, %3$s, %1$s</string> <string name="wday_date">%2$s, %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s. %2$s - %8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s. %2$s - %10$s %6$s, %8$s. %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s. %2$s - %10$s %6$s, %8$s. %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %4$s. gada %3$s. %2$s - %10$s %9$s. gada %8$s. %7$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %4$s. gada %3$s. %2$s - %10$s %9$s. gada %8$s. %7$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %4$s. g. %3$s. %2$s - %10$s %6$s, %9$s. g. %8$s. %7$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %4$s. g. %3$s. %2$s - %10$s %6$s, %9$s. g. %8$s. %7$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %4$s. g. %3$s. %2$s - %6$s, %9$s. g. %8$s. %7$s</string> + <string name="time_wday">%2$s, %1$s</string> + <string name="same_year_md1_md2">%3$s. %2$s-%8$s. %7$s</string> + <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s. %2$s-%6$s, %8$s. %7$s</string> + <string name="same_year_md1_time1_md2_time2">%3$s. %2$s, %5$s-%8$s. %7$s, %10$s</string> + <string name="same_month_md1_time1_md2_time2">%3$s. %2$s, %5$s-%8$s. %7$s, %10$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s. %2$s, %5$s-%6$s, %8$s. %7$s, %10$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s. %2$s, %5$s-%6$s, %8$s. %7$s, %10$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%4$s. gada %3$s. %2$s, %5$s-%9$s. gada %8$s. %7$s, %10$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%4$s. gada %3$s. %2$s, %5$s-%9$s. gada %8$s. %7$s, %10$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %4$s. g. %3$s. %2$s, %5$s-%6$s, %9$s. g. %8$s. %7$s, %10$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %4$s. g. %3$s. %2$s, %5$s-%6$s, %9$s. g. %8$s. %7$s, %10$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %4$s. g. %3$s. %2$s-%6$s, %9$s. g. %8$s. %7$s</string> <string name="same_month_md1_md2">%3$s.-%8$s. %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s</string> - <string name="same_year_mdy1_mdy2">%9$s. gada %3$s. %2$s - %8$s. %7$s</string> + <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s. %2$s-%6$s, %8$s. %7$s</string> + <string name="same_year_mdy1_mdy2">%9$s. gada %3$s. %2$s-%8$s. %7$s</string> <string name="same_month_mdy1_mdy2">%9$s. gada %3$s.-%8$s. %2$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %9$s. gada %3$s. %2$s - %6$s, y. gada %8$s. %7$s</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %9$s. gada %3$s. %2$s-%6$s, y. gada %8$s. %7$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-nb-rNO/donottranslate-cldr.xml b/core/res/res/values-nb-rNO/donottranslate-cldr.xml deleted file mode 100644 index ecf0111..0000000 --- a/core/res/res/values-nb-rNO/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%H.%M</string> - <string name="hour_minute_ampm">%-l.%M %p</string> - <string name="hour_minute_cap_ampm">%-l.%M %^p</string> - <string name="twelve_hour_time_format">h.mm a</string> - <string name="twenty_four_hour_time_format">HH.mm</string> - <string name="numeric_date">%d.%m.%Y</string> - <string name="numeric_date_format">dd.MM.yyyy</string> - <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s–%2$s</string> - <string name="date1_date2">%2$s–%5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s.–%8$s.%7$s.</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s.%2$s.–%6$s %8$s.%7$s.</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s–%8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s.%2$s.%4$s–%6$s %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s.%2$s.%4$s–%10$s %6$s %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s.–%10$s %8$s.%7$s.</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s.%2$s–%10$s %6$s %8$s.%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s–%10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s–%6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s–%4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s–%6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s. %2$s–%8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s. %2$s–%6$s %8$s. %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s–%10$s %8$s. %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s–%10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s–%10$s %6$s %8$s. %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s–%10$s %6$s %8$s. %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s–%10$s %8$s. %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s–%10$s %8$s. %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s %4$s–%10$s %6$s %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s %4$s–%10$s %6$s %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s %4$s–%6$s %8$s. %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s.–%8$s. %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s. %2$s–%6$s %8$s. %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s. %2$s–%8$s. %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s.–%8$s. %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s–%6$s %8$s. %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 875b4bc..dff943c 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -134,8 +134,6 @@ <string name="httpErrorFile">"Kunne ikke åpne filen."</string> <string name="httpErrorFileNotFound">"Fant ikke den forespurte filen."</string> <string name="httpErrorTooManyRequests">"For mange forespørsler blir behandlet. Prøv igjen senere."</string> - <!-- no translation found for certificateSaved (2832076323378077191) --> - <skip /> <string name="contentServiceSync">"Synkronisering"</string> <string name="contentServiceSyncNotificationTitle">"Synkronisering"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"For mange slettinger av <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> diff --git a/core/res/res/values-nl-rBE/donottranslate-cldr.xml b/core/res/res/values-nl-rBE/donottranslate-cldr.xml deleted file mode 100644 index 680a392..0000000 --- a/core/res/res/values-nl-rBE/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%H:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">HH:mm</string> - <string name="numeric_date">%-e/%m/%Y</string> - <string name="numeric_date_format">d/MM/yyyy</string> - <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s/%2$s - %8$s/%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s/%2$s - %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s/%2$s/%4$s - %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s/%2$s/%4$s - %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s/%2$s/%4$s - %10$s %6$s %8$s/%7$s/%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s - %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s/%2$s - %10$s %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s/%2$s/%4$s - %10$s %8$s/%7$s/%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s - %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s - %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s %2$s - %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %2$s - %6$s %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s - %10$s %6$s %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s - %10$s %6$s %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s - %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s - %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s %4$s - %6$s %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s - %6$s %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s - %6$s %8$s %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-nl-rNL/donottranslate-cldr.xml b/core/res/res/values-nl-rNL/donottranslate-cldr.xml deleted file mode 100644 index b6231b6..0000000 --- a/core/res/res/values-nl-rNL/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%H:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">HH:mm</string> - <string name="numeric_date">%d-%m-%Y</string> - <string name="numeric_date_format">dd-MM-yyyy</string> - <string name="numeric_date_template">"%s-%s-%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s-%2$s - %8$s-%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s-%2$s - %6$s %8$s-%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s-%2$s-%4$s - %8$s-%7$s-%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s-%2$s-%4$s - %6$s %8$s-%7$s-%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s-%2$s-%4$s - %10$s %6$s %8$s-%7$s-%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s-%2$s - %10$s %8$s-%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s-%2$s - %10$s %6$s %8$s-%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s-%2$s-%4$s - %10$s %8$s-%7$s-%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s - %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s - %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s %2$s - %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %2$s - %6$s %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s - %10$s %6$s %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s - %10$s %6$s %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s - %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s - %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s %4$s - %6$s %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s - %6$s %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s - %6$s %8$s %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-nl/donottranslate-cldr.xml b/core/res/res/values-nl/donottranslate-cldr.xml index b6231b6..2360e3f 100644 --- a/core/res/res/values-nl/donottranslate-cldr.xml +++ b/core/res/res/values-nl/donottranslate-cldr.xml @@ -108,7 +108,7 @@ <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_day">%-e %b</string> <string name="abbrev_month">%-b</string> <string name="abbrev_month_year">%b %Y</string> <string name="time1_time2">%1$s - %2$s</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index cd1b460..533be17 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -111,7 +111,6 @@ <string name="httpErrorFile">"Het bestand kan niet worden geopend."</string> <string name="httpErrorFileNotFound">"Het opgevraagde bestand is niet gevonden."</string> <string name="httpErrorTooManyRequests">"Er worden te veel aanvragen verwerkt. Probeer het later opnieuw."</string> - <string name="certificateSaved">"Het certificaat is opgeslagen in de opslagruimte voor sleutels van het systeem."</string> <string name="contentServiceSync">"Synchroniseren"</string> <string name="contentServiceSyncNotificationTitle">"Synchroniseren"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"Te veel verwijderen voor <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> diff --git a/core/res/res/values-pl-rPL/donottranslate-cldr.xml b/core/res/res/values-pl-rPL/donottranslate-cldr.xml deleted file mode 100644 index 4ad17bf..0000000 --- a/core/res/res/values-pl-rPL/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%d-%m-%Y</string> - <string name="numeric_date_format">dd-MM-yyyy</string> - <string name="numeric_date_template">"%s-%s-%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$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">%b %-e</string> - <string name="abbrev_month">%-b</string> - <string name="abbrev_month_year">%Y %b</string> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s-%8$s.%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s - %6$s, %8$s.%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s-%8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s-%2$s-%4$s-%6$s, %8$s-%7$s-%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s - %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s - %10$s %8$s.%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %2$s-%3$s - %10$s %6$s, %7$s-%8$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s-%2$s-%4$s - %10$s %8$s-%7$s-%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s, %2$s - %6$s %4$s, %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s, %2$s - %4$s, %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s, %3$s</string> - <string name="wday_date">%2$s, %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s %2$s - %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%3$s %2$s %1$s - %8$s %7$s %6$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %3$s %2$s %1$s - %10$s %8$s %7$s %6$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %3$s %2$s %1$s - %10$s %8$s %7$s %6$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s - %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s - %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s - %6$s, %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%3$s %2$s %1$s - %8$s %7$s %6$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s - %6$s, %8$s %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-pl/donottranslate-cldr.xml b/core/res/res/values-pl/donottranslate-cldr.xml index 4ad17bf..f20a5b7 100644 --- a/core/res/res/values-pl/donottranslate-cldr.xml +++ b/core/res/res/values-pl/donottranslate-cldr.xml @@ -96,52 +96,52 @@ <string name="hour_minute_cap_ampm">%-l:%M %^p</string> <string name="twelve_hour_time_format">h:mm a</string> <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%d-%m-%Y</string> - <string name="numeric_date_format">dd-MM-yyyy</string> - <string name="numeric_date_template">"%s-%s-%s"</string> + <string name="numeric_date">%d.%m.%Y</string> + <string name="numeric_date_format">dd.MM.yyyy</string> + <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> + <string name="date_and_time">%d.%m.%Y %H:%M:%S</string> + <string name="date_time">%1$s %2$s</string> <string name="time_date">%1$s %3$s</string> - <string name="abbrev_month_day_year">%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_day">%-e %b</string> <string name="abbrev_month">%-b</string> - <string name="abbrev_month_year">%Y %b</string> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> + <string name="abbrev_month_year">%b %Y</string> + <string name="time1_time2">%1$s-%2$s</string> + <string name="date1_date2">%2$s-%5$s</string> <string name="numeric_md1_md2">%3$s.%2$s-%8$s.%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s - %6$s, %8$s.%7$s</string> + <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s-%6$s, %8$s.%7$s</string> <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s-%8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s-%2$s-%4$s-%6$s, %8$s-%7$s-%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s - %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s - %10$s %8$s.%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %2$s-%3$s - %10$s %6$s, %7$s-%8$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s-%2$s-%4$s - %10$s %8$s-%7$s-%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s, %2$s - %6$s %4$s, %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s, %2$s - %4$s, %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> + <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s-%6$s, %8$s.%7$s.%9$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s.%2$s.%4$s %5$s-%6$s, %8$s.%7$s.%9$s %10$s</string> + <string name="numeric_md1_time1_md2_time2">%3$s.%2$s %5$s-%8$s.%7$s %10$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s.%2$s %5$s-%6$s, %8$s.%7$s %10$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%3$s.%2$s.%4$s %5$s-%8$s.%7$s.%9$s %10$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%1$s, %2$s %3$s-%4$s, %5$s %6$s</string> + <string name="wday1_date1_wday2_date2">%1$s, %2$s-%4$s, %5$s</string> + <string name="date1_time1_date2_time2">%2$s %3$s-%5$s %6$s</string> <string name="time_wday_date">%1$s %2$s, %3$s</string> <string name="wday_date">%2$s, %3$s</string> <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s %2$s - %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%3$s %2$s %1$s - %8$s %7$s %6$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %3$s %2$s %1$s - %10$s %8$s %7$s %6$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %3$s %2$s %1$s - %10$s %8$s %7$s %6$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s - %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s - %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s - %6$s, %8$s %7$s %9$s</string> + <string name="same_year_md1_md2">%3$s %2$s-%8$s %7$s</string> + <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s %2$s-%6$s, %8$s %7$s</string> + <string name="same_year_md1_time1_md2_time2">%3$s %2$s %5$s-%8$s %7$s %10$s</string> + <string name="same_month_md1_time1_md2_time2">%3$s %2$s %5$s-%8$s %7$s %10$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s %2$s %5$s-%6$s, %8$s %7$s %10$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s %2$s %5$s-%6$s, %8$s %7$s %10$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%3$s %2$s %4$s %5$s-%8$s %7$s %9$s %10$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%3$s %2$s %4$s %5$s-%8$s %7$s %9$s %10$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s %2$s %4$s %5$s-%6$s, %8$s %7$s %9$s %10$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s %2$s %4$s %5$s-%6$s, %8$s %7$s %9$s %10$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s-%6$s, %8$s %7$s %9$s</string> <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%3$s %2$s %1$s - %8$s %7$s %6$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s</string> + <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s %2$s-%6$s, %8$s %7$s</string> + <string name="same_year_mdy1_mdy2">%3$s %2$s-%8$s %7$s %9$s</string> <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s - %6$s, %8$s %7$s %9$s</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s-%6$s, %8$s %7$s %9$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 65f3ad1..3a8c6a6 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -111,7 +111,6 @@ <string name="httpErrorFile">"Nie można uzyskać dostępu do pliku."</string> <string name="httpErrorFileNotFound">"Nie znaleziono żądanego pliku."</string> <string name="httpErrorTooManyRequests">"Zbyt wiele żądań jest przetwarzanych. Spróbuj ponownie później."</string> - <string name="certificateSaved">"Certyfikat jest zapisywany w magazynie kluczy systemu."</string> <string name="contentServiceSync">"Synchronizacja"</string> <string name="contentServiceSyncNotificationTitle">"Synchronizuj"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"Zbyt wiele usuwanych <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> diff --git a/core/res/res/values-pt-rBR/donottranslate-cldr.xml b/core/res/res/values-pt-rBR/donottranslate-cldr.xml deleted file mode 100644 index 1111658..0000000 --- a/core/res/res/values-pt-rBR/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-kh%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H\'h\'mm</string> - <string name="numeric_date">%d/%m/%Y</string> - <string name="numeric_date_format">dd/MM/yyyy</string> - <string name="numeric_date_template">"%s/%s/%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s/%2$s - %8$s/%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s/%2$s - %6$s, %8$s/%7$s</string> - <string name="numeric_mdy1_mdy2">%3$s/%2$s/%4$s - %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s/%2$s/%4$s - %6$s, %8$s/%7$s/%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s/%2$s/%4$s - %10$s %6$s, %8$s/%7$s/%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s - %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s/%2$s - %10$s %6$s, %8$s/%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s/%2$s/%4$s - %10$s %8$s/%7$s/%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s, %2$s - %6$s %4$s, %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s, %2$s - %4$s, %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s, %3$s</string> - <string name="wday_date">%2$s, %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s de %2$s - %8$s de %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s de %2$s - %6$s, %8$s de %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s de %2$s - %10$s %8$s de %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s de %2$s - %10$s %8$s de %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s de %2$s - %10$s %6$s, %8$s de %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s de %2$s - %10$s %6$s, %8$s de %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s de %2$s de %4$s - %10$s %8$s de %7$s de %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s de %2$s de %4$s - %10$s %8$s de %7$s de %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s de %2$s de %4$s - %10$s %6$s, %8$s de %7$s de %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s de %2$s de %4$s - %10$s %6$s, %8$s de %7$s de %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s de %2$s de %4$s - %6$s, %8$s de %7$s de %9$s</string> - <string name="same_month_md1_md2">%3$s-%8$s de %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s de %2$s - %6$s, %8$s de %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s de %2$s - %8$s de %7$s de %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s-%8$s de %2$s de %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s de %2$s - %6$s, %8$s de %7$s de %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index d4623f9..04ca746 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -134,8 +134,6 @@ <string name="httpErrorFile">"Não foi possível aceder ao ficheiro."</string> <string name="httpErrorFileNotFound">"Não foi possível localizar o ficheiro pedido."</string> <string name="httpErrorTooManyRequests">"Existem demasiados pedidos em processamento. Tente novamente mais tarde."</string> - <!-- no translation found for certificateSaved (2832076323378077191) --> - <skip /> <string name="contentServiceSync">"Sincronização"</string> <string name="contentServiceSyncNotificationTitle">"Sincronização"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"Demasiadas eliminações de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 97d7596..8c5babb 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -134,8 +134,6 @@ <string name="httpErrorFile">"Não foi possível acessar o arquivo."</string> <string name="httpErrorFileNotFound">"O arquivo solicitado não foi encontrado."</string> <string name="httpErrorTooManyRequests">"Há muitas solicitações sendo processadas. Tente novamente mais tarde."</string> - <!-- no translation found for certificateSaved (2832076323378077191) --> - <skip /> <string name="contentServiceSync">"Sincronizar"</string> <string name="contentServiceSyncNotificationTitle">"Sincronizar"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"Muitas exclusões de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> diff --git a/core/res/res/values-ru-rRU/donottranslate-cldr.xml b/core/res/res/values-ru-rRU/donottranslate-cldr.xml deleted file mode 100644 index 21c06ff..0000000 --- a/core/res/res/values-ru-rRU/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%d.%m.%Y</string> - <string name="numeric_date_format">dd.MM.yyyy</string> - <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$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> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s - %8$s.%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %2$s-%3$s – %6$s, %7$s-%8$s</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %4$s-%2$s-%3$s - %10$s %6$s, %9$s-%7$s-%8$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s - %10$s %8$s.%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %2$s-%3$s - %10$s %6$s, %7$s-%8$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s - %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="wday1_date1_wday2_date2">%2$s - %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %3$s</string> - <string name="wday_date">%3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s %2$s - %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %2$s %3$s - %6$s %7$s %8$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %2$s %3$s - %10$s %6$s %7$s %8$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %2$s %3$s - %10$s %6$s %7$s %8$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s </string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s </string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s - %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s - %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s - %6$s, %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %2$s %3$s - %6$s %7$s %8$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s г.</string> - <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s г.</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%3$s %2$s - %8$s %7$s %9$s г.</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-ru/donottranslate-cldr.xml b/core/res/res/values-ru/donottranslate-cldr.xml index 21c06ff..7745944 100644 --- a/core/res/res/values-ru/donottranslate-cldr.xml +++ b/core/res/res/values-ru/donottranslate-cldr.xml @@ -1,18 +1,18 @@ <?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_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> @@ -61,21 +61,21 @@ <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_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_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> @@ -101,45 +101,45 @@ <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</string> + <string name="date_and_time">%-k:%M:%S, %d.%m.%Y</string> + <string name="date_time">%2$s, %1$s</string> + <string name="time_date">%1$s, %3$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="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> + <string name="abbrev_month_year">%-b %Y</string> <string name="time1_time2">%1$s - %2$s</string> <string name="date1_date2">%2$s - %5$s</string> <string name="numeric_md1_md2">%3$s.%2$s - %8$s.%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %2$s-%3$s – %6$s, %7$s-%8$s</string> + <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s – %6$s, %8$s.%7$s</string> <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> <string name="numeric_wday1_mdy1_wday2_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %4$s-%2$s-%3$s - %10$s %6$s, %9$s-%7$s-%8$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s - %10$s %8$s.%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %2$s-%3$s - %10$s %6$s, %7$s-%8$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s - %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="wday1_date1_wday2_date2">%2$s - %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %3$s</string> - <string name="wday_date">%3$s</string> - <string name="time_wday">%1$s %2$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s, %1$s, %3$s.%2$s.%4$s - %10$s, %6$s, %8$s.%7$s.%9$s</string> + <string name="numeric_md1_time1_md2_time2">%5$s, %3$s.%2$s - %10$s, %8$s.%7$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s, %1$s, %3$s.%2$s - %10$s, %6$s, %8$s.%7$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%5$s, %3$s.%2$s.%4$s - %10$s, %8$s.%7$s.%9$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%3$s, %1$s, %2$s - %6$s, %4$s, %5$s</string> + <string name="wday1_date1_wday2_date2">%1$s, %2$s - %4$s, %5$s</string> + <string name="date1_time1_date2_time2">%3$s, %2$s - %6$s, %5$s</string> + <string name="time_wday_date">%1$s, %2$s, %3$s</string> + <string name="wday_date">%2$s, %3$s</string> + <string name="time_wday">%1$s, %2$s</string> <string name="same_year_md1_md2">%3$s %2$s - %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %2$s %3$s - %6$s %7$s %8$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %2$s %3$s - %10$s %6$s %7$s %8$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %2$s %3$s - %10$s %6$s %7$s %8$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s </string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s </string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s - %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s - %10$s %6$s, %8$s %7$s %9$s</string> + <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s %2$s - %6$s, %8$s %7$s</string> + <string name="same_year_md1_time1_md2_time2">%5$s, %3$s %2$s - %10$s, %8$s %7$s</string> + <string name="same_month_md1_time1_md2_time2">%5$s, %3$s %2$s - %10$s, %8$s %7$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s, %1$s, %3$s %2$s - %10$s, %6$s, %8$s %7$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s, %1$s, %3$s %2$s - %10$s, %6$s, %8$s %7$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%5$s, %3$s %2$s %4$s - %10$s, %8$s %7$s %9$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%5$s, %3$s %2$s %4$s - %10$s, %8$s %7$s %9$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s, %1$s, %3$s %2$s %4$s - %10$s, %6$s, %8$s %7$s %9$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s, %1$s, %3$s %2$s %4$s - %10$s, %6$s, %8$s %7$s %9$s</string> <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s - %6$s, %8$s %7$s %9$s</string> <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %2$s %3$s - %6$s %7$s %8$s</string> + <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s %2$s - %6$s, %8$s %7$s</string> <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s г.</string> <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s г.</string> <string name="same_year_wday1_mdy1_wday2_mdy2">%3$s %2$s - %8$s %7$s %9$s г.</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 03284c1..bb218c5 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -134,8 +134,6 @@ <string name="httpErrorFile">"Не удается получить доступ к файлу."</string> <string name="httpErrorFileNotFound">"Не удалось найти указанные файлы."</string> <string name="httpErrorTooManyRequests">"Обрабатывается слишком много запросов. Повторите попытку позднее."</string> - <!-- no translation found for certificateSaved (2832076323378077191) --> - <skip /> <string name="contentServiceSync">"Синхр."</string> <string name="contentServiceSyncNotificationTitle">"Синхр."</string> <string name="contentServiceTooManyDeletesNotificationDesc">"Слишком много удалений <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string> diff --git a/core/res/res/values-sk-rSK/donottranslate-cldr.xml b/core/res/res/values-sk-rSK/donottranslate-cldr.xml index 16239df..6478074 100644 --- a/core/res/res/values-sk-rSK/donottranslate-cldr.xml +++ b/core/res/res/values-sk-rSK/donottranslate-cldr.xml @@ -96,52 +96,52 @@ <string name="hour_minute_cap_ampm">%-l:%M %p</string> <string name="twelve_hour_time_format">h:mm a</string> <string name="twenty_four_hour_time_format">HH:mm</string> - <string name="numeric_date">%-e.%-m.%Y</string> - <string name="numeric_date_format">d.M.yyyy</string> - <string name="numeric_date_template">"%s.%s.%s"</string> + <string name="numeric_date">%-e. %-m. %Y</string> + <string name="numeric_date_format">d. M. yyyy</string> + <string name="numeric_date_template">"%s. %s. %s"</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="date_and_time">%-k:%M:%S %-e. %-m. %Y</string> <string name="date_time">%2$s %1$s</string> <string name="time_date">%1$s %3$s</string> - <string name="abbrev_month_day_year">%-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="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> + <string name="abbrev_month_year">%-b %Y</string> <string name="time1_time2">%1$s - %2$s</string> <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s. - %8$s.%7$s.</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s. - %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s - %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s - %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s. - %10$s %8$s.%7$s.</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s. - %10$s %6$s, %8$s.%7$s.</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s - %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s, %2$s - %6$s %4$s, %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s, %2$s - %4$s, %5$s</string> + <string name="numeric_md1_md2">%3$s. %2$s. - %8$s. %7$s.</string> + <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s. %2$s. - %6$s %8$s. %7$s.</string> + <string name="numeric_mdy1_mdy2">%3$s. %2$s. %4$s - %8$s. %7$s. %9$s</string> + <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s. %4$s - %6$s %8$s. %7$s. %9$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s. %4$s - %10$s %6$s %8$s. %7$s. %9$s</string> + <string name="numeric_md1_time1_md2_time2">%5$s %3$s. %2$s. - %10$s %8$s. %7$s.</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s. - %10$s %6$s %8$s. %7$s.</string> + <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s. %4$s - %10$s %8$s. %7$s. %9$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s - %6$s %4$s %5$s</string> + <string name="wday1_date1_wday2_date2">%1$s %2$s - %4$s %5$s</string> <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s, %3$s</string> - <string name="wday_date">%2$s, %3$s</string> + <string name="time_wday_date">%1$s %2$s %3$s</string> + <string name="wday_date">%2$s %3$s</string> <string name="time_wday">%1$s %2$s</string> <string name="same_year_md1_md2">%3$s. %2$s - %8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s</string> + <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s. %2$s - %10$s %6$s, %8$s. %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s. %2$s - %10$s %6$s, %8$s. %7$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s - %10$s %6$s %8$s. %7$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s - %10$s %6$s %8$s. %7$s</string> <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s - %10$s %8$s. %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s. %2$s %4$s - %10$s %6$s, %8$s. %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s %4$s - %6$s, %8$s. %7$s %9$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s %4$s - %10$s %6$s %8$s. %7$s %9$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s %4$s - %10$s %6$s %8$s. %7$s %9$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s %4$s - %6$s %8$s. %7$s %9$s</string> <string name="same_month_md1_md2">%3$s. - %8$s. %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s</string> + <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s. %2$s - %6$s %8$s. %7$s</string> <string name="same_year_mdy1_mdy2">%3$s. %2$s - %8$s. %7$s %9$s</string> <string name="same_month_mdy1_mdy2">%3$s. - %8$s. %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s - %6$s, %8$s. %7$s %9$s</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s - %6$s %8$s. %7$s %9$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-sl-rSI/donottranslate-cldr.xml b/core/res/res/values-sl-rSI/donottranslate-cldr.xml index b4ea32f..ae16782 100644 --- a/core/res/res/values-sl-rSI/donottranslate-cldr.xml +++ b/core/res/res/values-sl-rSI/donottranslate-cldr.xml @@ -27,18 +27,18 @@ <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_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> @@ -61,21 +61,21 @@ <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_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_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> @@ -101,47 +101,47 @@ <string name="numeric_date_template">"%s. %s. %s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</string> - <string name="abbrev_month_day_year">%-e. %b. %Y</string> + <string name="date_and_time">%H:%M:%S, %-e. %b %Y</string> + <string name="date_time">%2$s, %1$s</string> + <string name="time_date">%1$s, %3$s</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_day">%-e. %b</string> <string name="abbrev_month">%b</string> - <string name="abbrev_month_year">%b. %Y</string> - <string name="time1_time2">%1$s – %2$s</string> - <string name="date1_date2">%2$s – %5$s</string> - <string name="numeric_md1_md2">%3$s. %2$s. – %8$s. %7$s.</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s., %3$s. %2$s. – %6$s., %8$s. %7$s.</string> - <string name="numeric_mdy1_mdy2">%3$s. %2$s. %4$s – %8$s. %7$s. %9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s., %3$s. %2$s. %4$s – %6$s., %8$s. %7$s. %9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s., %3$s. %2$s. %4$s – %10$s %6$s., %8$s. %7$s. %9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s. %2$s. – %10$s %8$s. %7$s.</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s., %3$s. %2$s. – %10$s %6$s., %8$s. %7$s.</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s. %4$s – %10$s %8$s. %7$s. %9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s., %2$s – %6$s %4$s., %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s., %2$s – %4$s., %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s., %3$s</string> - <string name="wday_date">%2$s., %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s. %2$s – %8$s. %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s., %3$s. %2$s. – %6$s., %8$s. %7$s.</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s – %10$s %8$s. %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s – %10$s %8$s. %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s., %3$s. %2$s. – %10$s %6$s., %8$s. %7$s.</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s., %3$s. %2$s. – %10$s %6$s., %8$s. %7$s.</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s. %4$s – %10$s %8$s. %7$s. %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s. %4$s – %10$s %8$s. %7$s. %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s., %3$s. %2$s. %4$s – %10$s %6$s., %8$s. %7$s. %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s., %3$s. %2$s. %4$s – %10$s %6$s., %8$s. %7$s. %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s., %3$s. %2$s. %4$s – %6$s., %8$s. %7$s. %9$s</string> - <string name="same_month_md1_md2">%3$s.–%8$s. %2$s.</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s., %3$s. %2$s. – %6$s., %8$s. %7$s.</string> - <string name="same_year_mdy1_mdy2">%3$s. %2$s. – %8$s. %7$s. %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s.–%8$s. %2$s. %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s., %3$s. %2$s. – %6$s., %8$s. %7$s. %9$s</string> + <string name="abbrev_month_year">%b %Y</string> + <string name="time1_time2">%1$s–%2$s</string> + <string name="date1_date2">%2$s–%5$s</string> + <string name="numeric_md1_md2">%3$s. %2$s.–%8$s. %7$s.</string> + <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s. %2$s.–%6$s, %8$s. %7$s.</string> + <string name="numeric_mdy1_mdy2">%3$s. %2$s. %4$s–%8$s. %7$s. %9$s</string> + <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s. %4$s–%6$s, %8$s. %7$s. %9$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s, %1$s, %3$s. %2$s. %4$s–%10$s, %6$s, %8$s. %7$s. %9$s</string> + <string name="numeric_md1_time1_md2_time2">%5$s, %3$s. %2$s.–%10$s, %8$s. %7$s.</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s, %1$s, %3$s. %2$s.–%10$s, %6$s, %8$s. %7$s.</string> + <string name="numeric_mdy1_time1_mdy2_time2">%5$s, %3$s. %2$s. %4$s–%10$s, %8$s. %7$s. %9$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%3$s, %1$s, %2$s–%6$s, %4$s, %5$s</string> + <string name="wday1_date1_wday2_date2">%1$s, %2$s–%4$s, %5$s</string> + <string name="date1_time1_date2_time2">%3$s, %2$s–%6$s, %5$s</string> + <string name="time_wday_date">%1$s, %2$s, %3$s</string> + <string name="wday_date">%2$s, %3$s</string> + <string name="time_wday">%1$s, %2$s</string> + <string name="same_year_md1_md2">%3$s. %2$s–%8$s. %7$s</string> + <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s. %2$s–%6$s, %8$s. %7$s</string> + <string name="same_year_md1_time1_md2_time2">%5$s, %3$s. %2$s–%10$s, %8$s. %7$s</string> + <string name="same_month_md1_time1_md2_time2">%5$s, %3$s. %2$s–%10$s, %8$s. %7$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s, %1$s, %3$s. %2$s–%10$s, %6$s, %8$s. %7$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s, %1$s, %3$s. %2$s–%10$s, %6$s, %8$s. %7$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%5$s, %3$s. %2$s %4$s–%10$s, %8$s. %7$s %9$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%5$s, %3$s. %2$s %4$s–%10$s, %8$s. %7$s %9$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s, %1$s, %3$s. %2$s %4$s–%10$s, %6$s, %8$s. %7$s %9$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s, %1$s, %3$s. %2$s %4$s–%10$s, %6$s, %8$s. %7$s %9$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s %4$s–%6$s, %8$s. %7$s %9$s</string> + <string name="same_month_md1_md2">%3$s.–%8$s. %2$s</string> + <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s. %2$s–%6$s, %8$s. %7$s</string> + <string name="same_year_mdy1_mdy2">%3$s. %2$s–%8$s. %7$s %9$s</string> + <string name="same_month_mdy1_mdy2">%3$s.–%8$s. %2$s %9$s</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s. %2$s–%6$s, %8$s. %7$s %9$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-sv-rSE/donottranslate-cldr.xml b/core/res/res/values-sv-rSE/donottranslate-cldr.xml deleted file mode 100644 index a6ffc9a..0000000 --- a/core/res/res/values-sv-rSE/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%-k.%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H.mm</string> - <string name="numeric_date">%Y-%m-%d</string> - <string name="numeric_date_format">yyyy-MM-dd</string> - <string name="numeric_date_template">"%s-%s-%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s – %2$s</string> - <string name="date1_date2">%2$s – %5$s</string> - <string name="numeric_md1_md2">%3$s/%2$s – %8$s/%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s/%2$s – %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_mdy2">%4$s-%2$s-%3$s – %9$s-%7$s-%8$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %4$s-%2$s-%3$s – %6$s, %9$s-%7$s-%8$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %4$s-%2$s-%3$s – %10$s %6$s, %9$s-%7$s-%8$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s – %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s/%2$s – %10$s %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %4$s-%2$s-%3$s – %10$s %9$s-%7$s-%8$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s – %6$s %4$s %5$s</string> - <string name="wday1_date1_wday2_date2">%1$s %2$s – %4$s %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s %3$s</string> - <string name="wday_date">%2$s %3$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s %2$s – %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s – %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s – %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s %2$s – %10$s %6$s %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s – %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s %2$s %4$s – %10$s %6$s %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s %4$s – %6$s %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s–%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s–%8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s–%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s–%6$s %8$s %7$s %9$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-sv/donottranslate-cldr.xml b/core/res/res/values-sv/donottranslate-cldr.xml index a6ffc9a..0172755 100644 --- a/core/res/res/values-sv/donottranslate-cldr.xml +++ b/core/res/res/values-sv/donottranslate-cldr.xml @@ -91,13 +91,13 @@ <string name="today">idag</string> <string name="tomorrow">imorgon</string> - <string name="hour_minute_24">%-k.%M</string> + <string name="hour_minute_24">%-k:%M</string> <string name="hour_minute_ampm">%-l:%M %p</string> <string name="hour_minute_cap_ampm">%-l:%M %^p</string> <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">H.mm</string> - <string name="numeric_date">%Y-%m-%d</string> - <string name="numeric_date_format">yyyy-MM-dd</string> + <string name="twenty_four_hour_time_format">H:mm</string> + <string name="numeric_date">%d-%m-%Y</string> + <string name="numeric_date_format">dd-MM-yyyy</string> <string name="numeric_date_template">"%s-%s-%s"</string> <string name="month_day_year">%-e %B %Y</string> <string name="time_of_day">%H:%M:%S</string> @@ -110,17 +110,17 @@ <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> - <string name="time1_time2">%1$s – %2$s</string> + <string name="abbrev_month_year">%b %Y</string> + <string name="time1_time2">%1$s–%2$s</string> <string name="date1_date2">%2$s – %5$s</string> <string name="numeric_md1_md2">%3$s/%2$s – %8$s/%7$s</string> <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s/%2$s – %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_mdy2">%4$s-%2$s-%3$s – %9$s-%7$s-%8$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %4$s-%2$s-%3$s – %6$s, %9$s-%7$s-%8$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %4$s-%2$s-%3$s – %10$s %6$s, %9$s-%7$s-%8$s</string> + <string name="numeric_mdy1_mdy2">%3$s-%2$s-%4$s – %8$s-%7$s-%9$s</string> + <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s-%2$s-%4$s – %6$s %8$s-%7$s-%9$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s-%2$s-%4$s – %10$s %6$s %8$s-%7$s-%9$s</string> <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s – %10$s %8$s/%7$s</string> <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s/%2$s – %10$s %6$s %8$s/%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %4$s-%2$s-%3$s – %10$s %9$s-%7$s-%8$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s-%2$s-%4$s – %10$s %8$s-%7$s-%9$s</string> <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s – %6$s %4$s %5$s</string> <string name="wday1_date1_wday2_date2">%1$s %2$s – %4$s %5$s</string> <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> @@ -140,8 +140,8 @@ <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s %4$s – %6$s %8$s %7$s %9$s</string> <string name="same_month_md1_md2">%3$s–%8$s %2$s</string> <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s %2$s – %6$s %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s–%8$s %7$s %9$s</string> + <string name="same_year_mdy1_mdy2">%3$s %2$s – %8$s %7$s %9$s</string> <string name="same_month_mdy1_mdy2">%3$s–%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s–%6$s %8$s %7$s %9$s</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s %2$s – %6$s %8$s %7$s %9$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 383126a..a9e7989 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -134,8 +134,6 @@ <string name="httpErrorFile">"Det gick inte att komma åt filen."</string> <string name="httpErrorFileNotFound">"Den begärda filen hittades inte."</string> <string name="httpErrorTooManyRequests">"För många begäranden bearbetas. Försök igen senare."</string> - <!-- no translation found for certificateSaved (2832076323378077191) --> - <skip /> <string name="contentServiceSync">"Synkronisera"</string> <string name="contentServiceSyncNotificationTitle">"Synkronisera"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"För många <xliff:g id="CONTENT_TYPE">%s</xliff:g>-borttagningar."</string> diff --git a/core/res/res/values-tr-rTR/donottranslate-cldr.xml b/core/res/res/values-tr-rTR/donottranslate-cldr.xml deleted file mode 100644 index d612305..0000000 --- a/core/res/res/values-tr-rTR/donottranslate-cldr.xml +++ /dev/null @@ -1,147 +0,0 @@ -<?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_24">%H:%M</string> - <string name="hour_minute_ampm">%-l:%M %p</string> - <string name="hour_minute_cap_ampm">%-l:%M %^p</string> - <string name="twelve_hour_time_format">h:mm a</string> - <string name="twenty_four_hour_time_format">HH:mm</string> - <string name="numeric_date">%d %m %Y</string> - <string name="numeric_date_format">dd MM yyyy</string> - <string name="numeric_date_template">"%s %s %s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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> - <string name="time1_time2">%1$s - %2$s</string> - <string name="date1_date2">%2$s - %5$s</string> - <string name="numeric_md1_md2">%3$s.%2$s - %8$s.%7$s</string> - <string name="numeric_wday1_md1_wday2_md2">%3$s.%2$s %1$s - %8$s.%7$s %6$s</string> - <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%3$s.%2$s.%4$s %1$s - %8$s.%7$s.%9$s %6$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %3$s.%2$s.%4$s %1$s - %10$s %8$s.%7$s.%9$s %6$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s - %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %3$s/%2$s %1$s - %10$s %8$s/%7$s %6$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %2$s %1$s - %6$s %5$s %4$s</string> - <string name="wday1_date1_wday2_date2">%2$s %1$s - %5$s %4$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %3$s %2$s</string> - <string name="wday_date">%3$s %2$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%3$s %2$s - %8$s %7$s</string> - <string name="same_year_wday1_md1_wday2_md2">%3$s %2$s %1$s - %8$s %7$s %6$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %3$s %2$s %1$s - %10$s %8$s %7$s %6$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %3$s %2$s %1$s - %10$s %8$s %7$s %6$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %3$s %2$s %4$s %1$s - %10$s %8$s %7$s %9$s %6$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %3$s %2$s %4$s %1$s - %10$s %8$s %7$s %9$s %6$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%3$s %2$s %4$s %1$s - %8$s %7$s %9$s %6$s</string> - <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> - <string name="same_month_wday1_md1_wday2_md2">%3$s %2$s %1$s - %8$s %7$s %6$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%3$s %2$s %9$s %1$s - %8$s %7$s y %6$s</string> - <string name="short_format_month">%b</string> -</resources> diff --git a/core/res/res/values-tr/donottranslate-cldr.xml b/core/res/res/values-tr/donottranslate-cldr.xml index d612305..fd8e762 100644 --- a/core/res/res/values-tr/donottranslate-cldr.xml +++ b/core/res/res/values-tr/donottranslate-cldr.xml @@ -101,9 +101,9 @@ <string name="numeric_date_template">"%s %s %s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</string> + <string name="date_and_time">%d %b %Y %H:%M:%S</string> + <string name="date_time">%1$s %2$s</string> + <string name="time_date">%3$s %1$s</string> <string name="abbrev_month_day_year">%d %b %Y</string> <string name="month_day">%d %B</string> <string name="month">%-B</string> @@ -117,31 +117,31 @@ <string name="numeric_wday1_md1_wday2_md2">%3$s.%2$s %1$s - %8$s.%7$s %6$s</string> <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s - %8$s.%7$s.%9$s</string> <string name="numeric_wday1_mdy1_wday2_mdy2">%3$s.%2$s.%4$s %1$s - %8$s.%7$s.%9$s %6$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %3$s.%2$s.%4$s %1$s - %10$s %8$s.%7$s.%9$s %6$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s/%2$s - %10$s %8$s/%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %3$s/%2$s %1$s - %10$s %8$s/%7$s %6$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %2$s %1$s - %6$s %5$s %4$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%3$s.%2$s.%4$s %1$s %5$s - %8$s.%7$s.%9$s %6$s %10$s</string> + <string name="numeric_md1_time1_md2_time2">%3$s/%2$s %5$s - %8$s/%7$s %10$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%3$s/%2$s %1$s %5$s - %8$s/%7$s %6$s %10$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%3$s %2$s %4$s %5$s - %8$s %7$s %9$s %10$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%2$s %1$s %3$s - %5$s %4$s %6$s</string> <string name="wday1_date1_wday2_date2">%2$s %1$s - %5$s %4$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string> - <string name="time_wday_date">%1$s %3$s %2$s</string> + <string name="date1_time1_date2_time2">%2$s %3$s - %5$s %6$s</string> + <string name="time_wday_date">%3$s %2$s %1$s</string> <string name="wday_date">%3$s %2$s</string> - <string name="time_wday">%1$s %2$s</string> + <string name="time_wday">%2$s %1$s</string> <string name="same_year_md1_md2">%3$s %2$s - %8$s %7$s</string> <string name="same_year_wday1_md1_wday2_md2">%3$s %2$s %1$s - %8$s %7$s %6$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s - %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %3$s %2$s %1$s - %10$s %8$s %7$s %6$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %3$s %2$s %1$s - %10$s %8$s %7$s %6$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s - %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %3$s %2$s %4$s %1$s - %10$s %8$s %7$s %9$s %6$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %3$s %2$s %4$s %1$s - %10$s %8$s %7$s %9$s %6$s</string> + <string name="same_year_md1_time1_md2_time2">%3$s %2$s %5$s - %8$s %7$s %10$s</string> + <string name="same_month_md1_time1_md2_time2">%3$s %2$s %5$s - %8$s %7$s %10$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%3$s %2$s %1$s %5$s - %8$s %7$s %6$s %10$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%3$s %2$s %1$s %5$s - %8$s %7$s %6$s %10$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%3$s %2$s %4$s %5$s - %8$s %7$s %9$s %10$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%3$s %2$s %4$s %5$s - %8$s %7$s %9$s %10$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%3$s %2$s %4$s %1$s %5$s - %8$s %7$s %9$s %6$s %10$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%3$s %2$s %4$s %1$s %5$s - %8$s %7$s %9$s %6$s %10$s</string> <string name="same_month_wday1_mdy1_wday2_mdy2">%3$s %2$s %4$s %1$s - %8$s %7$s %9$s %6$s</string> <string name="same_month_md1_md2">%3$s-%8$s %2$s</string> <string name="same_month_wday1_md1_wday2_md2">%3$s %2$s %1$s - %8$s %7$s %6$s</string> <string name="same_year_mdy1_mdy2">%3$s %2$s - %8$s %7$s %9$s</string> <string name="same_month_mdy1_mdy2">%3$s-%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%3$s %2$s %9$s %1$s - %8$s %7$s y %6$s</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%3$s %2$s %1$s - %8$s %7$s %6$s %9$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index ccaa08b..e4bbca7 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -134,8 +134,6 @@ <string name="httpErrorFile">"Dosyaya erişilemedi."</string> <string name="httpErrorFileNotFound">"İstenen dosya bulunamadı."</string> <string name="httpErrorTooManyRequests">"Çok fazla sayıda istek işleniyor. Daha sonra yeniden deneyin."</string> - <!-- no translation found for certificateSaved (2832076323378077191) --> - <skip /> <string name="contentServiceSync">"Senk."</string> <string name="contentServiceSyncNotificationTitle">"Senk."</string> <string name="contentServiceTooManyDeletesNotificationDesc">"Çok fazla <xliff:g id="CONTENT_TYPE">%s</xliff:g> silme var."</string> diff --git a/core/res/res/values-uk-rUA/donottranslate-cldr.xml b/core/res/res/values-uk-rUA/donottranslate-cldr.xml index c51f8d1..ed310c8 100644 --- a/core/res/res/values-uk-rUA/donottranslate-cldr.xml +++ b/core/res/res/values-uk-rUA/donottranslate-cldr.xml @@ -1,18 +1,18 @@ <?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_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> @@ -53,29 +53,29 @@ <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_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_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_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> @@ -101,47 +101,47 @@ <string name="numeric_date_template">"%s.%s.%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</string> - <string name="abbrev_month_day_year">%-e %b %Y</string> + <string name="date_and_time">%-e %b %Y р., %H:%M:%S</string> + <string name="date_time">%1$s, %2$s</string> + <string name="time_date">%3$s, %1$s</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="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> + <string name="abbrev_month_year">%-b %Y р.</string> <string name="time1_time2">%1$s – %2$s</string> <string name="date1_date2">%2$s – %5$s</string> <string name="numeric_md1_md2">%3$s.%2$s – %8$s.%7$s</string> <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s – %6$s, %8$s.%7$s</string> <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s – %8$s.%7$s.%9$s</string> <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s – %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s – %10$s %6$s, %8$s.%7$s.%9$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s – %10$s %8$s.%7$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s – %10$s %6$s, %8$s.%7$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s – %10$s %8$s.%7$s.%9$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s, %2$s – %6$s %4$s, %5$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s.%2$s.%4$s, %5$s – %6$s, %8$s.%7$s.%9$s, %10$s</string> + <string name="numeric_md1_time1_md2_time2">%3$s.%2$s, %5$s – %8$s.%7$s, %10$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s.%2$s, %5$s – %6$s, %8$s.%7$s, %10$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%3$s.%2$s.%4$s, %5$s – %8$s.%7$s.%9$s, %10$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%1$s, %2$s, %3$s – %4$s, %5$s, %6$s</string> <string name="wday1_date1_wday2_date2">%1$s, %2$s – %4$s, %5$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s – %6$s %5$s</string> - <string name="time_wday_date">%1$s %2$s, %3$s</string> + <string name="date1_time1_date2_time2">%2$s, %3$s – %5$s, %6$s</string> + <string name="time_wday_date">%2$s, %3$s, %1$s</string> <string name="wday_date">%2$s, %3$s</string> - <string name="time_wday">%1$s %2$s</string> + <string name="time_wday">%2$s, %1$s</string> <string name="same_year_md1_md2">%3$s %2$s – %8$s %7$s</string> <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s %2$s – %6$s, %8$s %7$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %3$s %2$s – %10$s %8$s %7$s</string> - <string name="same_month_md1_time1_md2_time2">%5$s %3$s %2$s – %10$s %8$s %7$s</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s %2$s – %10$s %6$s, %8$s %7$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s %2$s – %10$s %6$s, %8$s %7$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s %2$s %4$s – %10$s %8$s %7$s %9$s</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s – %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s %2$s %4$s – %10$s %6$s, %8$s %7$s %9$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s – %6$s, %8$s %7$s %9$s</string> - <string name="same_month_md1_md2">%3$s–%8$s %2$s</string> + <string name="same_year_md1_time1_md2_time2">%3$s %2$s, %5$s – %8$s %7$s, %10$s</string> + <string name="same_month_md1_time1_md2_time2">%3$s %2$s, %5$s – %8$s %7$s, %10$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s %2$s, %5$s – %6$s, %8$s %7$s, %10$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%1$s, %3$s %2$s, %5$s – %6$s, %8$s %7$s, %10$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%3$s %2$s %4$s р., %5$s – %8$s %7$s %9$s р., %10$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%3$s %2$s %4$s р., %5$s – %8$s %7$s %9$s р., %10$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s %2$s %4$s р., %5$s – %6$s, %8$s %7$s %9$s р., %10$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s %2$s %4$s р., %5$s – %6$s, %8$s %7$s %9$s р., %10$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s р. – %6$s, %8$s %7$s %9$s р.</string> + <string name="same_month_md1_md2">%3$s – %8$s %2$s</string> <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s %2$s – %6$s, %8$s %7$s</string> - <string name="same_year_mdy1_mdy2">%3$s %2$s – %8$s %7$s %9$s</string> - <string name="same_month_mdy1_mdy2">%3$s–%8$s %2$s %9$s</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s – %6$s, %8$s %7$s %9$s</string> + <string name="same_year_mdy1_mdy2">%3$s %2$s – %8$s %7$s %9$s р.</string> + <string name="same_month_mdy1_mdy2">%3$s – %8$s %2$s %9$s р.</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s – %6$s, %8$s %7$s %9$s р.</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-zh-rCN/donottranslate-cldr.xml b/core/res/res/values-zh-rCN/donottranslate-cldr.xml index 6d52d70..5077e94 100644 --- a/core/res/res/values-zh-rCN/donottranslate-cldr.xml +++ b/core/res/res/values-zh-rCN/donottranslate-cldr.xml @@ -1,57 +1,57 @@ <?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_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_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_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="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> @@ -92,56 +92,56 @@ <string name="tomorrow">明天</string> <string name="hour_minute_24">%-k:%M</string> - <string name="hour_minute_ampm">%p%-l:%M</string> - <string name="hour_minute_cap_ampm">%p%-l:%M</string> - <string name="twelve_hour_time_format">ah:mm</string> + <string name="hour_minute_ampm">%p %-l:%M</string> + <string name="hour_minute_cap_ampm">%p %-l:%M</string> + <string name="twelve_hour_time_format">a h:mm</string> <string name="twenty_four_hour_time_format">H:mm</string> <string name="numeric_date">%Y-%-m-%-e</string> <string name="numeric_date_format">yyyy-M-d</string> <string name="numeric_date_template">"%s-%s-%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</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">%Y 年 %-m 月 %-e 日%p %I:%M:%S</string> + <string name="date_time">%1$s %2$s</string> + <string name="time_date">%3$s %1$s</string> <string name="abbrev_month_day_year">%Y-%-m-%-e</string> - <string name="month_day">%B%-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="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> - <string name="time1_time2">%1$s–%2$s</string> - <string name="date1_date2">%2$s–%5$s</string> - <string name="numeric_md1_md2">%2$s-%3$s至%7$s-%8$s</string> - <string name="numeric_wday1_md1_wday2_md2">%2$s-%3$s%1$s至%7$s-%8$s%6$s</string> - <string name="numeric_mdy1_mdy2">%4$s-%2$s-%3$s至%9$s-%7$s-%8$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%4$s-%2$s-%3$s%1$s至%9$s-%7$s-%8$s%6$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s年%2$s月%3$s日,%1$s–%10$s %9$s年%7$s月%8$s日,%6$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %2$s-%3$s–%10$s %7$s-%8$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %2$s-%3$s%1$s–%10$s %7$s-%8$s%6$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %4$s-%2$s-%3$s–%10$s %9$s-%7$s-%8$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %2$s%1$s–%6$s %5$s%4$s</string> - <string name="wday1_date1_wday2_date2">%2$s%1$s–%5$s%4$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s–%6$s %5$s</string> - <string name="time_wday_date">%1$s %3$s%2$s</string> + <string name="abbrev_month_year">%Y 年 %b</string> + <string name="time1_time2">%1$s – %2$s</string> + <string name="date1_date2">%2$s – %5$s</string> + <string name="numeric_md1_md2">%2$s 月 %3$s 日 - %7$s 月 %8$s 日</string> + <string name="numeric_wday1_md1_wday2_md2">%2$s 月 %3$s 日%1$s - %7$s 月 %8$s 日%6$s</string> + <string name="numeric_mdy1_mdy2">%4$s-%2$s-%3$s - %9$s-%7$s-%8$s</string> + <string name="numeric_wday1_mdy1_wday2_mdy2">%4$s-%2$s-%3$s %1$s - %9$s-%7$s-%8$s %6$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%4$s-%2$s-%3$s %5$s %1$s – %9$s-%7$s-%8$s %10$s %6$s</string> + <string name="numeric_md1_time1_md2_time2">%2$s 月 %3$s 日 %5$s – %7$s 月 %8$s 日 %10$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%2$s 月 %3$s 日 %5$s %1$s – %7$s 月 %8$s 日 %10$s %6$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%4$s-%2$s-%3$s %5$s – %9$s-%7$s-%8$s %10$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%2$s %3$s %1$s – %5$s %6$s %4$s</string> + <string name="wday1_date1_wday2_date2">%2$s%1$s – %5$s%4$s</string> + <string name="date1_time1_date2_time2">%2$s %3$s – %5$s %6$s</string> + <string name="time_wday_date">%3$s %1$s %2$s</string> <string name="wday_date">%3$s%2$s</string> <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%2$s%3$s日–%7$s%8$s日</string> - <string name="same_year_wday1_md1_wday2_md2">%2$s%3$s日%1$s–%7$s%8$s日%6$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %2$s%3$s日–%10$s %7$s%8$s日</string> - <string name="same_month_md1_time1_md2_time2">%5$s %2$s%3$s日–%10$s %7$s%8$s日</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %2$s%3$s日%1$s–%10$s %7$s%8$s日%6$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %2$s%3$s日%1$s–%10$s %7$s%8$s日%6$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %4$s年%2$s%3$s日–%10$s %9$s年%7$s%8$s日</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %4$s年%2$s%3$s日–%10$s %9$s年%7$s%8$s日</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s年%2$s%3$s日%1$s–%10$s %9$s年%7$s%8$s日%6$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s年%2$s%3$s日%1$s–%10$s %9$s年%7$s%8$s日%6$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%4$s年%2$s%3$s日%1$s–%9$s年%7$s%8$s日%6$s</string> - <string name="same_month_md1_md2">%2$s%3$s日至%8$s日</string> - <string name="same_month_wday1_md1_wday2_md2">%2$s%3$s日%1$s–%7$s%8$s日%6$s</string> - <string name="same_year_mdy1_mdy2">%9$s年%2$s%3$s日至%7$s%8$s日</string> - <string name="same_month_mdy1_mdy2">%9$s年%2$s%3$s日至%8$s日</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%9$s年%2$s%3$s日%1$s至%7$s%8$s日%6$s</string> + <string name="same_year_md1_md2">%2$s %3$s 日 – %7$s %8$s 日</string> + <string name="same_year_wday1_md1_wday2_md2">%2$s %3$s 日%1$s – %7$s %8$s 日%6$s</string> + <string name="same_year_md1_time1_md2_time2">%2$s %3$s 日 %5$s – %7$s %8$s 日 %10$s</string> + <string name="same_month_md1_time1_md2_time2">%2$s %3$s 日 %5$s – %7$s %8$s 日 %10$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%2$s %3$s 日 %5$s %1$s – %7$s %8$s 日 %10$s %6$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%2$s %3$s 日 %1$s %5$s – %7$s %8$s 日 %6$s %10$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%4$s 年 %2$s %3$s 日 %5$s – %9$s 年 %7$s %8$s 日 %10$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%4$s 年 %2$s %3$s 日 %5$s – %9$s 年 %7$s %8$s 日 %10$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%4$s 年 %2$s %3$s 日 %5$s %1$s – %9$s 年 %7$s %8$s 日 %10$s %6$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%4$s 年 %2$s %3$s 日 %5$s %1$s – %9$s 年 %7$s %8$s 日 %10$s %6$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%4$s 年 %2$s %3$s 日%1$s – %9$s 年 %7$s %8$s 日%6$s</string> + <string name="same_month_md1_md2">%2$s %3$s - %8$s 日</string> + <string name="same_month_wday1_md1_wday2_md2">%2$s %3$s 日%1$s – %7$s %8$s 日%6$s</string> + <string name="same_year_mdy1_mdy2">%9$s 年 %2$s %3$s 日 - %7$s %8$s 日</string> + <string name="same_month_mdy1_mdy2">%9$s 年 %2$s %3$s - %8$s 日</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%9$s 年 %2$s %3$s 日%1$s - %7$s %8$s 日%6$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 48c4d38..bc95c59 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -134,8 +134,6 @@ <string name="httpErrorFile">"无法访问该文件。"</string> <string name="httpErrorFileNotFound">"找不到请求的文件。"</string> <string name="httpErrorTooManyRequests">"正在处理的请求太多,请稍后重试。"</string> - <!-- no translation found for certificateSaved (2832076323378077191) --> - <skip /> <string name="contentServiceSync">"同步"</string> <string name="contentServiceSyncNotificationTitle">"同步"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"太多<xliff:g id="CONTENT_TYPE">%s</xliff:g>删除项。"</string> diff --git a/core/res/res/values-zh-rTW/donottranslate-cldr.xml b/core/res/res/values-zh-rTW/donottranslate-cldr.xml index 6d52d70..3e1acf1 100644 --- a/core/res/res/values-zh-rTW/donottranslate-cldr.xml +++ b/core/res/res/values-zh-rTW/donottranslate-cldr.xml @@ -1,57 +1,57 @@ <?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_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_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_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="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> @@ -92,56 +92,56 @@ <string name="tomorrow">明天</string> <string name="hour_minute_24">%-k:%M</string> - <string name="hour_minute_ampm">%p%-l:%M</string> - <string name="hour_minute_cap_ampm">%p%-l:%M</string> - <string name="twelve_hour_time_format">ah:mm</string> + <string name="hour_minute_ampm">%p %-l:%M</string> + <string name="hour_minute_cap_ampm">%p %-l:%M</string> + <string name="twelve_hour_time_format">a h:mm</string> <string name="twenty_four_hour_time_format">H:mm</string> - <string name="numeric_date">%Y-%-m-%-e</string> - <string name="numeric_date_format">yyyy-M-d</string> - <string name="numeric_date_template">"%s-%s-%s"</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="date_time">%2$s %1$s</string> - <string name="time_date">%1$s %3$s</string> - <string name="abbrev_month_day_year">%Y-%-m-%-e</string> - <string name="month_day">%B%-e日</string> + <string name="numeric_date">%Y/%-m/%-e</string> + <string name="numeric_date_format">yyyy/M/d</string> + <string name="numeric_date_template">"%s/%s/%s"</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">%Y/%-m/%-e %p %I:%M:%S</string> + <string name="date_time">%1$s %2$s</string> + <string name="time_date">%3$s %1$s</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="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> - <string name="time1_time2">%1$s–%2$s</string> - <string name="date1_date2">%2$s–%5$s</string> - <string name="numeric_md1_md2">%2$s-%3$s至%7$s-%8$s</string> - <string name="numeric_wday1_md1_wday2_md2">%2$s-%3$s%1$s至%7$s-%8$s%6$s</string> - <string name="numeric_mdy1_mdy2">%4$s-%2$s-%3$s至%9$s-%7$s-%8$s</string> - <string name="numeric_wday1_mdy1_wday2_mdy2">%4$s-%2$s-%3$s%1$s至%9$s-%7$s-%8$s%6$s</string> - <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s年%2$s月%3$s日,%1$s–%10$s %9$s年%7$s月%8$s日,%6$s</string> - <string name="numeric_md1_time1_md2_time2">%5$s %2$s-%3$s–%10$s %7$s-%8$s</string> - <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %2$s-%3$s%1$s–%10$s %7$s-%8$s%6$s</string> - <string name="numeric_mdy1_time1_mdy2_time2">%5$s %4$s-%2$s-%3$s–%10$s %9$s-%7$s-%8$s</string> - <string name="wday1_date1_time1_wday2_date2_time2">%3$s %2$s%1$s–%6$s %5$s%4$s</string> - <string name="wday1_date1_wday2_date2">%2$s%1$s–%5$s%4$s</string> - <string name="date1_time1_date2_time2">%3$s %2$s–%6$s %5$s</string> - <string name="time_wday_date">%1$s %3$s%2$s</string> + <string name="abbrev_month_year">%Y 年 %b</string> + <string name="time1_time2">%1$s - %2$s</string> + <string name="date1_date2">%2$s至 %5$s</string> + <string name="numeric_md1_md2">%2$s/%3$s 至 %7$s/%8$s</string> + <string name="numeric_wday1_md1_wday2_md2">%2$s/%3$s %1$s至 %7$s/%8$s %6$s</string> + <string name="numeric_mdy1_mdy2">%4$s/%2$s/%3$s 至 %9$s/%7$s/%8$s</string> + <string name="numeric_wday1_mdy1_wday2_mdy2">%4$s/%2$s/%3$s %1$s至 %9$s/%7$s/%8$s %6$s</string> + <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%4$s 年 %2$s 月 %3$s 日%1$s %5$s 至 %9$s 年 %7$s 月 %8$s 日%6$s %10$s</string> + <string name="numeric_md1_time1_md2_time2">%2$s/%3$s %5$s 至 %7$s/%8$s %10$s</string> + <string name="numeric_wday1_md1_time1_wday2_md2_time2">%2$s/%3$s %1$s %5$s 至 %7$s/%8$s %6$s %10$s</string> + <string name="numeric_mdy1_time1_mdy2_time2">%4$s/%2$s/%3$s %5$s 至 %9$s/%7$s/%8$s %10$s</string> + <string name="wday1_date1_time1_wday2_date2_time2">%2$s%1$s %3$s 至 %5$s%4$s %6$s</string> + <string name="wday1_date1_wday2_date2">%2$s%1$s至 %5$s%4$s</string> + <string name="date1_time1_date2_time2">%2$s %3$s 至 %5$s %6$s</string> + <string name="time_wday_date">%3$s%2$s %1$s</string> <string name="wday_date">%3$s%2$s</string> - <string name="time_wday">%1$s %2$s</string> - <string name="same_year_md1_md2">%2$s%3$s日–%7$s%8$s日</string> - <string name="same_year_wday1_md1_wday2_md2">%2$s%3$s日%1$s–%7$s%8$s日%6$s</string> - <string name="same_year_md1_time1_md2_time2">%5$s %2$s%3$s日–%10$s %7$s%8$s日</string> - <string name="same_month_md1_time1_md2_time2">%5$s %2$s%3$s日–%10$s %7$s%8$s日</string> - <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %2$s%3$s日%1$s–%10$s %7$s%8$s日%6$s</string> - <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %2$s%3$s日%1$s–%10$s %7$s%8$s日%6$s</string> - <string name="same_year_mdy1_time1_mdy2_time2">%5$s %4$s年%2$s%3$s日–%10$s %9$s年%7$s%8$s日</string> - <string name="same_month_mdy1_time1_mdy2_time2">%5$s %4$s年%2$s%3$s日–%10$s %9$s年%7$s%8$s日</string> - <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s年%2$s%3$s日%1$s–%10$s %9$s年%7$s%8$s日%6$s</string> - <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %4$s年%2$s%3$s日%1$s–%10$s %9$s年%7$s%8$s日%6$s</string> - <string name="same_month_wday1_mdy1_wday2_mdy2">%4$s年%2$s%3$s日%1$s–%9$s年%7$s%8$s日%6$s</string> - <string name="same_month_md1_md2">%2$s%3$s日至%8$s日</string> - <string name="same_month_wday1_md1_wday2_md2">%2$s%3$s日%1$s–%7$s%8$s日%6$s</string> - <string name="same_year_mdy1_mdy2">%9$s年%2$s%3$s日至%7$s%8$s日</string> - <string name="same_month_mdy1_mdy2">%9$s年%2$s%3$s日至%8$s日</string> - <string name="same_year_wday1_mdy1_wday2_mdy2">%9$s年%2$s%3$s日%1$s至%7$s%8$s日%6$s</string> + <string name="time_wday">%2$s %1$s</string> + <string name="same_year_md1_md2">%2$s %3$s 日至 %7$s %8$s 日</string> + <string name="same_year_wday1_md1_wday2_md2">%2$s %3$s 日%1$s至 %7$s %8$s 日%6$s</string> + <string name="same_year_md1_time1_md2_time2">%2$s %3$s 日 %5$s 至 %7$s %8$s 日 %10$s</string> + <string name="same_month_md1_time1_md2_time2">%2$s %3$s 日 %5$s 至 %7$s %8$s 日 %10$s</string> + <string name="same_year_wday1_md1_time1_wday2_md2_time2">%2$s %3$s 日%1$s %5$s 至 %7$s %8$s 日%6$s %10$s</string> + <string name="same_month_wday1_md1_time1_wday2_md2_time2">%2$s %3$s 日%1$s %5$s 至 %7$s %8$s 日%6$s %10$s</string> + <string name="same_year_mdy1_time1_mdy2_time2">%4$s 年 %2$s %3$s 日 %5$s 至 %9$s 年 %7$s %8$s 日 %10$s</string> + <string name="same_month_mdy1_time1_mdy2_time2">%4$s 年 %2$s %3$s 日 %5$s 至 %9$s 年 %7$s %8$s 日 %10$s</string> + <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%4$s 年 %2$s %3$s 日%1$s %5$s 至 %9$s 年 %7$s %8$s 日%6$s %10$s</string> + <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%4$s 年 %2$s %3$s 日%1$s %5$s 至 %9$s 年 %7$s %8$s 日%6$s %10$s</string> + <string name="same_month_wday1_mdy1_wday2_mdy2">%4$s 年 %2$s %3$s 日%1$s至 %9$s 年 %7$s %8$s 日%6$s</string> + <string name="same_month_md1_md2">%2$s %3$s 日至 %8$s 日</string> + <string name="same_month_wday1_md1_wday2_md2">%2$s %3$s 日%1$s至 %7$s %8$s 日%6$s</string> + <string name="same_year_mdy1_mdy2">%9$s 年 %2$s %3$s 日至 %7$s %8$s 日</string> + <string name="same_month_mdy1_mdy2">%9$s 年 %2$s %3$s 日至 %8$s 日</string> + <string name="same_year_wday1_mdy1_wday2_mdy2">%9$s 年 %2$s %3$s 日%1$s至 %7$s %8$s 日%6$s</string> <string name="short_format_month">%b</string> </resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 0f9c423..87b3ee2 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -111,7 +111,6 @@ <string name="httpErrorFile">"無法存取此檔案。"</string> <string name="httpErrorFileNotFound">"找不到要求的檔案。"</string> <string name="httpErrorTooManyRequests">"太多執行要求。請稍後再試一次。"</string> - <string name="certificateSaved">"憑證已儲存在系統的金鑰存放區。"</string> <string name="contentServiceSync">"同步處理"</string> <string name="contentServiceSyncNotificationTitle">"同步處理"</string> <string name="contentServiceTooManyDeletesNotificationDesc">"同時刪除太多 <xliff:g id="CONTENT_TYPE">%s</xliff:g>。"</string> diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 75568e1..48b565f 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -827,28 +827,6 @@ <attr name="name" /> </declare-styleable> - <!-- The <code>supports-density</code> specifies a screen density that this - package supports. Application can specify multiple densities it supports. - <p>This appears as a child tag of the - {@link #AndroidManifest manifest} tag. --> - <declare-styleable name="AndroidManifestSupportsDensity" parent="AndroidManifest"> - <!-- Required value of the density in dip (device independent pixel). - You should use one of the pre-defined constants for the standard - screen densities defined here. - --> - <attr name="density" format="integer"> - <!-- A low density screen, such as a QVGA or WQVGA screen in a - typical hand-held phone. The constant for this is 120. --> - <enum name="low" value="120" /> - <!-- A medium density screen, such as an HVGA screen in a - typical hand-held phone. The constant for this is 160. --> - <enum name="medium" value="160" /> - <!-- A high density screen, such as a VGA or WVGA screen in a - typical hand-held phone. The constant for this is 240. --> - <enum name="high" value="240" /> - </attr> - </declare-styleable> - <!-- The <code>supports-screens</code> specifies the screen dimensions an application supports. By default a modern application supports all screen sizes and must explicitly disable certain screen sizes here; @@ -892,6 +870,11 @@ set for you automatically based on whether you are targeting a newer platform that supports more screens. --> <attr name="resizeable" format="boolean" /> + <!-- Indicates whether the application can accommodate any screen + density. Older applications are assumed to not be able to, + new ones able to. You can explicitly supply your abilities + here. --> + <attr name="anyDensity" format="boolean" /> </declare-styleable> <!-- Private tag to declare system protected broadcast actions. diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 919c3d6..6a6b7fc 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -1093,7 +1093,7 @@ <public type="attr" name="tension" id="0x0101026a" /> <public type="attr" name="extraTension" /> - <public type="attr" name="density" /> + <public type="attr" name="anyDensity" /> <public type="attr" name="searchSuggestThreshold" /> <public type="attr" name="includeInGlobalSearch" /> <public type="attr" name="onClick" /> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 9b9ba68..aaaebbb 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -228,8 +228,6 @@ <string name="httpErrorFileNotFound">The requested file was not found.</string> <!-- Displayed when a request failed because there are too many requests right now. --> <string name="httpErrorTooManyRequests">Too many requests are being processed. Try again later.</string> - <!-- Displayed a toast that a certificate is saved in the keystore --> - <string name="certificateSaved">The certificate is saved in the system\'s key store.</string> <!-- Sync notifications --> <skip /> <!-- A notification is shown when there is a sync error. This is the text that will scroll through the notification bar (will be seen by the user as he uses another application). --> @@ -911,12 +909,12 @@ you.</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_readPhoneState">read phone state</string> + <string name="permlab_readPhoneState">read phone state and identity</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_readPhoneState">Allows the application to access the phone features of the device. An application with this permission can determine the phone - number of this phone, whether a call is active, the number that call is connected to - and the like.</string> + number and serial number of this phone, whether a call is active, the number that call + is connected to and the like.</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_wakeLock">prevent phone from sleeping</string> diff --git a/data/sounds/AudioPackage2.mk b/data/sounds/AudioPackage2.mk index 649787e..5dacc70 100644 --- a/data/sounds/AudioPackage2.mk +++ b/data/sounds/AudioPackage2.mk @@ -23,7 +23,6 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/Ring_Digital_02.ogg:system/media/audio/ringtones/Ring_Digital_02.ogg \ $(LOCAL_PATH)/Ring_Synth_04.ogg:system/media/audio/ringtones/Ring_Synth_04.ogg \ $(LOCAL_PATH)/Ring_Synth_02.ogg:system/media/audio/ringtones/Ring_Synth_02.ogg \ - $(LOCAL_PATH)/Silence.ogg:system/media/audio/ringtones/notifications/Silence.ogg \ $(LOCAL_PATH)/newwavelabs/BeatPlucker.ogg:system/media/audio/ringtones/BeatPlucker.ogg \ $(LOCAL_PATH)/newwavelabs/BentleyDubs.ogg:system/media/audio/ringtones/BentleyDubs.ogg \ $(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:system/media/audio/ringtones/BirdLoop.ogg \ diff --git a/data/sounds/OriginalAudio.mk b/data/sounds/OriginalAudio.mk index fc1e921..291f0b6 100644 --- a/data/sounds/OriginalAudio.mk +++ b/data/sounds/OriginalAudio.mk @@ -22,7 +22,6 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/Ring_Digital_02.ogg:system/media/audio/ringtones/Ring_Digital_02.ogg \ $(LOCAL_PATH)/Ring_Synth_04.ogg:system/media/audio/ringtones/Ring_Synth_04.ogg \ $(LOCAL_PATH)/Ring_Synth_02.ogg:system/media/audio/ringtones/Ring_Synth_02.ogg \ - $(LOCAL_PATH)/Silence.ogg:system/media/audio/ringtones/notifications/Silence.ogg \ $(LOCAL_PATH)/newwavelabs/BeatPlucker.ogg:system/media/audio/ringtones/BeatPlucker.ogg \ $(LOCAL_PATH)/newwavelabs/BentleyDubs.ogg:system/media/audio/ringtones/BentleyDubs.ogg \ $(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:system/media/audio/ringtones/BirdLoop.ogg \ diff --git a/data/sounds/Silence.ogg b/data/sounds/Silence.ogg Binary files differdeleted file mode 100644 index 6d78907..0000000 --- a/data/sounds/Silence.ogg +++ /dev/null diff --git a/docs/html/community/index.jd b/docs/html/community/index.jd index 91c54aa..eb5887a 100644 --- a/docs/html/community/index.jd +++ b/docs/html/community/index.jd @@ -9,7 +9,7 @@ page.title=Community <p class="note"><strong>Note:</strong> If you are seeking discussion about Android source code (not application development), then please refer to the <a href="http://source.android.com/discuss">Open Source Project Mailing lists</a>.</p> -<p style="margin-bottom".5em"><strong>Contents</strong></p> +<p style="margin-bottom:.5em"><strong>Contents</strong></p> <ol class="toc"> <li><a href="#BeforeYouPost">Before you post</a></li> <li><a href="#ApplicationDeveloperLists">Application developer mailing lists</a></li> diff --git a/docs/html/guide/developing/device.jd b/docs/html/guide/developing/device.jd index 35c0a1a..8051678 100644 --- a/docs/html/guide/developing/device.jd +++ b/docs/html/guide/developing/device.jd @@ -137,7 +137,7 @@ would on the emulator. There are just a few things to do before you can start.</ <li>If you're developing on Mac OS X, it just works. Skip this step.</li> <li>If you're developing on Ubuntu Linux, you need to add a rules file: <ol> - <li>Login as root and create this file: <code>/etc/udev/rules.d/50-android.rules</code>. + <li>Login as root and create this file: <code>/etc/udev/rules.d/51-android.rules</code>. <p>For Gusty/Hardy, edit the file to read: <br/> <code>SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"</code></p> diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs index da4a2c3..2127187 100644 --- a/docs/html/guide/guide_toc.cs +++ b/docs/html/guide/guide_toc.cs @@ -1,84 +1,175 @@ +<?cs # Table of contents for Dev Guide. + + For each document available in translation, add an localized title to this TOC. + Do not add localized title for docs not available in translation. + Below are template spans for adding localized doc titles. Please ensure that + localized titles are added in the language order specified below. +?> <ul> -<li><h2>Android Basics</h2> + <li> + <h2><span class="en">Android Basics</span> + <span class="de">Einführung in Android</span> + <span class="es">Información básica sobre Android</span> + <span class="fr">Présentation d'Android</span> + <span class="it">Nozioni di base su Android</span> + <span class="ja">Android の基本</span> + <span class="zh-CN">Android 基础知识</span> + <span class="zh-TW">Android 簡介</span> + </h2> <ul> - <li><a href="<?cs var:toroot ?>guide/basics/what-is-android.html">What Is Android?</a></li> -<!-- <li><a style="color:gray;">The Android SDK</a></li> --> -<!-- <li><a style="color:gray;">Walkthrough for Developers</a></li> --> + <li><a href="<?cs var:toroot ?>guide/basics/what-is-android.html"> + <span class="en">What Is Android?</span> + <span class="de">Was ist Android?</span> + <span class="es">¿Qué es Android?</span> + <span class="fr">Qu'est-ce qu'Android ?</span> + <span class="it">Che cos'è Android?</span> + <span class="ja">Android とは</span> + <span class="zh-CN">Android 是什么?</span> + <span class="zh-TW">什麼是 Android?</span> + </a></li> + <!-- <li><a style="color:gray;">The Android SDK</a></li> --> + <!-- <li><a style="color:gray;">Walkthrough for Developers</a></li> --> <!-- quick overview of what it's like to develop on Android --> </ul> -</li> - -<li><h2>Framework Topics</h2> + </li> + + <li> + <h2> + <span class="en">Framework Topics</span> + <span class="de">Framework-Themen</span> + <span class="es">Temas sobre el framework</span> + <span class="fr">Thèmes relatifs au framework</span> + <span class="it">Argomenti relativi al framework</span> + <span class="ja">フレームワーク トピック</span> + <span class="zh-CN">框架主题</span> + <span class="zh-TW">架構主題</span> + </h2> <ul> - <li><a href="<?cs var:toroot ?>guide/topics/fundamentals.html">Application Fundamentals</a></li> + <li><a href="<?cs var:toroot ?>guide/topics/fundamentals.html"> + <span class="en">Application Fundamentals</span> + <span class="de" style="display:none">Anwendungsgrundlagen</span> + <span class="es" style="display:none">Fundamentos de las aplicaciones</span> + <span class="fr" style="display:none">Principes de base des applications</span> + <span class="it" style="display:none">Concetti fondamentali sulle applicazioni</span> + <span class="ja" style="display:none">開発の基礎</span> + <span class="zh-CN" style="display:none">应用程序基础</span> + <span class="zh-TW" style="display:none">應用程式基本原理</span> + + </a></li> </ul> <ul> <li class="toggle-list"> - <div><a href="<?cs var:toroot ?>guide/topics/ui/index.html">User Interface</a></div> - <ul> - <li><a href="<?cs var:toroot ?>guide/topics/ui/declaring-layout.html">Declaring Layout</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/ui/menus.html">Creating Menus</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/ui/dialogs.html">Creating Dialogs</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/ui/ui-events.html">Handling UI Events</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/ui/notifiers/index.html">Notifying the User</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/ui/themes.html">Applying Styles and Themes</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/ui/custom-components.html">Building Custom Components</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/ui/binding.html">Binding to Data with AdapterView</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/ui/layout-objects.html">Common Layout Objects</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/ui/how-android-draws.html">How Android Draws Views</a></li> - </ul> + <div><a href="<?cs var:toroot ?>guide/topics/ui/index.html"> + <span class="en">User Interface</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>guide/topics/ui/declaring-layout.html"> + <span class="en">Declaring Layout</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/ui/menus.html"> + <span class="en">Creating Menus</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/ui/dialogs.html"> + <span class="en">Creating Dialogs</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/ui/ui-events.html"> + <span class="en">Handling UI Events</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/ui/notifiers/index.html"> + <span class="en">Notifying the User</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/ui/themes.html"> + <span class="en">Applying Styles and Themes</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/ui/custom-components.html"> + <span class="en">Building Custom Components</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/ui/binding.html"> + <span class="en">Binding to Data with AdapterView</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/ui/layout-objects.html"> + <span class="en">Common Layout Objects</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/ui/how-android-draws.html"> + <span class="en">How Android Draws Views</span> + </a></li> + </ul> </li> <li class="toggle-list"> - <div><a href="<?cs var:toroot ?>guide/topics/resources/index.html">Resources and Assests</a></div> - <ul> - <li><a href="<?cs var:toroot ?>guide/topics/resources/resources-i18n.html">Resources and I18n</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/resources/available-resources.html">Available Resource Types</a></li> - </ul> + <div><a href="<?cs var:toroot ?>guide/topics/resources/index.html"> + <span class="en">Resources and Assests</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>guide/topics/resources/resources-i18n.html"> + <span class="en">Resources and I18n</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/resources/available-resources.html"> + <span class="en">Available Resource Types</span> + </a></li> + </ul> </li> - <li><a href="<?cs var:toroot ?>guide/topics/intents/intents-filters.html">Intents and Intent Filters</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/data/data-storage.html">Data Storage</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/providers/content-providers.html">Content Providers</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/security/security.html">Security and Permissions</a></li> -<!-- <li><a style="color:gray;">Processes and Threads</a></li> --> -<!-- <li><a style="color:gray;">Interprocess Communication</a></li> --> + <li><a href="<?cs var:toroot ?>guide/topics/intents/intents-filters.html"> + <span class="en">Intents and Intent Filters</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/data/data-storage.html"> + <span class="en">Data Storage</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/providers/content-providers.html"> + <span class="en">Content Providers</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/security/security.html"> + <span class="en">Security and Permissions</span> + </a></li> + <!-- <li><a style="color:gray;">Processes and Threads</a></li> --> + <!-- <li><a style="color:gray;">Interprocess Communication</a></li> --> <li class="toggle-list"> - <div><a href="<?cs var:toroot ?>guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a></div> - <ul> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/action-element.html"><action></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/activity-element.html"><activity></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/activity-alias-element.html"><activity-alias></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/application-element.html"><application></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/category-element.html"><category></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/data-element.html"><data></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/grant-uri-permission-element.html"><grant-uri-permission></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/instrumentation-element.html"><instrumentation></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/intent-filter-element.html"><intent-filter></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/manifest-element.html"><manifest></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/meta-data-element.html"><meta-data></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/permission-element.html"><permission></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/permission-group-element.html"><permission-group></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/permission-tree-element.html"><permission-tree></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/provider-element.html"><provider></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/receiver-element.html"><receiver></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/service-element.html"><service></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/uses-configuration-element.html"><uses-configuration></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/uses-library-element.html"><uses-library></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/uses-permission-element.html"><uses-permission></a></li> - <li><a href="<?cs var:toroot ?>guide/topics/manifest/uses-sdk-element.html"><uses-sdk></a></li> - </ul> + <div><a href="<?cs var:toroot ?>guide/topics/manifest/manifest-intro.html"> + <span class="en">The AndroidManifest.xml File</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/action-element.html"><action></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/activity-element.html"><activity></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/activity-alias-element.html"><activity-alias></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/application-element.html"><application></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/category-element.html"><category></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/data-element.html"><data></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/grant-uri-permission-element.html"><grant-uri-permission></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/instrumentation-element.html"><instrumentation></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/intent-filter-element.html"><intent-filter></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/manifest-element.html"><manifest></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/meta-data-element.html"><meta-data></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/permission-element.html"><permission></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/permission-group-element.html"><permission-group></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/permission-tree-element.html"><permission-tree></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/provider-element.html"><provider></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/receiver-element.html"><receiver></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/service-element.html"><service></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/uses-configuration-element.html"><uses-configuration></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/uses-library-element.html"><uses-library></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/uses-permission-element.html"><uses-permission></a></li> + <li><a href="<?cs var:toroot ?>guide/topics/manifest/uses-sdk-element.html"><uses-sdk></a></li> + </ul> </li> </ul> <ul> <li class="toggle-list"> - <div><a href="<?cs var:toroot ?>guide/topics/graphics/index.html">Graphics</a></div> - <ul> - <li><a href="<?cs var:toroot ?>guide/topics/graphics/2d-graphics.html">2D Graphics</a></li> - <li><a href="<?cs var:toroot ?>guide/topics/graphics/opengl.html">3D with OpenGL</a></li> - </ul> + <div><a href="<?cs var:toroot ?>guide/topics/graphics/index.html"> + <span class="en">Graphics</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>guide/topics/graphics/2d-graphics.html"> + <span class="en">2D Graphics</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/topics/graphics/opengl.html"> + <span class="en">3D with OpenGL</span> + </a></li> + </ul> </li> - <li><a href="<?cs var:toroot ?>guide/topics/media/index.html">Audio and Video</a></li> -<!-- <li class="toggle-list"> + <li><a href="<?cs var:toroot ?>guide/topics/media/index.html"> + <span class="en">Audio and Video</span> + </a></li> + <!--<li class="toggle-list"> <div><a style="color:gray;">Sensors</a></div> <ul> <li><a style="color:gray;">Camera</a></li> @@ -86,115 +177,256 @@ <li><a style="color:gray;">Accelerometer</a></li> </ul> </li> --> - <li><a href="<?cs var:toroot ?>guide/topics/location/index.html">Location and Maps</a></li> -<!-- <li class="toggle-list"> + <li><a href="<?cs var:toroot ?>guide/topics/location/index.html"> + <span class="en">Location and Maps</span> + </a></li> + <!--<li class="toggle-list"> <div><a style="color:gray;">Wireless Controls</a></div> <ul> <li><a style="color:gray;">Wi-Fi</a></li> <li><a style="color:gray;">Bluetooth</a></li> </ul> </li> --> -<!-- <li><a style="color:gray;">Localization</a></li> --> - <li><a href="<?cs var:toroot ?>guide/topics/appwidgets/index.html">App Widgets</a></li> + <!--<li><a style="color:gray;">Localization</a></li> --> + <li><a href="<?cs var:toroot ?>guide/topics/appwidgets/index.html"> + <span class="en">App Widgets</span> + </a></li> </ul> -</li> - -<li><h2>Developing</h2> + </li> + + <li> + <h2><span class="en">Developing</span> + <span class="de">Entwicklung</span> + <span class="es">Desarrollo</span> + <span class="fr">Développement</span> + <span class="it">Sviluppo</span> + <span class="ja">開発</span> + <span class="zh-CN">开发</span> + <span class="zh-TW">開發</span> + </h2> <ul> - <!-- <li><a style="color:gray;">Developing for Android</a></li> + <!--<li><a href="">Developing for Android</a></li> signing, upgrading, selecting a package name, select device profile, touch, trackball, dpad available, etc. --> - <li><a href="<?cs var:toroot ?>guide/developing/eclipse-adt.html">In Eclipse, with ADT</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/other-ide.html">In Other IDEs</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/device.html">On a Device</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/debug-tasks.html">Debugging Tasks</a></li> + <li><a href="<?cs var:toroot ?>guide/developing/eclipse-adt.html"> + <span class="en">In Eclipse, with ADT</span> + <span class="de" style="display:none">In Eclipse, mit ADT</span> + <span class="es" style="display:none">En Eclipse, con ADT</span> + <span class="fr" style="display:none">Sous Eclipse, à l'aide du plugin ADT</span> + <span class="it" style="display:none">In Eclipse, con ADT</span> + <span class="ja" style="display:none">Eclipse 内で ADT を使用</span> + <span class="zh-CN" style="display:none">利用 ADT 在 Eclipse 中开发</span> + <span class="zh-TW" style="display:none">在加裝 ADT 工具的 Eclipse 環境中</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/developing/other-ide.html"> + <span class="en">In Other IDEs</span> + <span class="de" style="display:none">In anderen IDEs</span> + <span class="es" style="display:none">En otros entornos</span> + <span class="fr" style="display:none">Sous d'autres environnements</span> + <span class="it" style="display:none">In altri IDE</span> + <span class="ja" style="display:none">その他の統合開発環境</span> + <span class="zh-CN" style="display:none">在其他 IDE 中开发</span> + <span class="zh-TW" style="display:none">在其他開發環境中</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/developing/device.html"> + <span class="en">On a Device</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/developing/debug-tasks.html"> + <span class="en">Debugging Tasks</span> + </a></li> <li class="toggle-list"> - <div><a href="<?cs var:toroot ?>guide/developing/tools/index.html">Tools</a></div> - <ul> - <li><a href="<?cs var:toroot ?>guide/developing/tools/aapt.html">aapt</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/tools/adb.html">adb</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/tools/othertools.html#android">android</a></li> -<!-- <li><a href="<?cs var:toroot ?>guide/developing/tools/adt.html">ADT Plugin</a></li>--> - <li><a href="<?cs var:toroot ?>guide/developing/tools/aidl.html" >aidl</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/tools/avd.html" >AVDs</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/tools/ddms.html" >ddms</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/tools/othertools.html#dx">dx</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/tools/draw9patch.html">Draw 9-Patch</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/tools/emulator.html">Emulator</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/tools/hierarchy-viewer.html">Hierarchy Viewer</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/tools/othertools.html#mksdcard">mksdcard</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/tools/monkey.html">Monkey</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/tools/adb.html#sqlite">sqlite3</a></li> - <li><a href="<?cs var:toroot ?>guide/developing/tools/traceview.html" >Traceview</a></li> - </ul></li> -<!-- <li><a href="<?cs var:toroot ?>guide/developing/instrumentation/index.html">Instrumentation</a></li> + <div><a href="<?cs var:toroot ?>guide/developing/tools/index.html"> + <span class="en">Tools</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>guide/developing/tools/aapt.html">aapt</a></li> + <li><a href="<?cs var:toroot ?>guide/developing/tools/adb.html">adb</a></li> + <li><a href="<?cs var:toroot ?>guide/developing/tools/othertools.html#android">android</a></li> + <!--<li><a href="<?cs var:toroot ?>guide/developing/tools/adt.html">ADT Plugin</a></li>--> + <li><a href="<?cs var:toroot ?>guide/developing/tools/aidl.html">aidl</a></li> + <li><a href="<?cs var:toroot ?>guide/developing/tools/avd.html">AVDs</a></li> + <li><a href="<?cs var:toroot ?>guide/developing/tools/ddms.html">ddms</a></li> + <li><a href="<?cs var:toroot ?>guide/developing/tools/othertools.html#dx">dx</a></li> + <li><a href="<?cs var:toroot ?>guide/developing/tools/draw9patch.html">Draw 9-Patch</a></li> + <li><a href="<?cs var:toroot ?>guide/developing/tools/emulator.html">Emulator</a></li> + <li><a href="<?cs var:toroot ?>guide/developing/tools/hierarchy-viewer.html">Hierarchy Viewer</a></li> + <li><a href="<?cs var:toroot ?>guide/developing/tools/othertools.html#mksdcard">mksdcard</a></li> + <li><a href="<?cs var:toroot ?>guide/developing/tools/monkey.html">Monkey</a></li> + <li><a href="<?cs var:toroot ?>guide/developing/tools/adb.html#sqlite">sqlite3</a></li> + <li><a href="<?cs var:toroot ?>guide/developing/tools/traceview.html" >Traceview</a></li> + </ul> + </li> + <!--<li><a href="<?cs var:toroot ?>guide/developing/instrumentation/index.html">Instrumentation</a></li> <li><a style="color:gray;">JUnit</a></li> --> - </ul> - -</li> - -<li><h2>Publishing</h2> + </ul> + </li> + + <li> + <h2><span class="en">Publishing</span> + <span class="de">Veröffentlichung</span> + <span class="es">Publicación</span> + <span class="fr">Publication</span> + <span class="it">Pubblicazione</span> + <span class="ja">公開</span> + <span class="zh-CN">发布</span> + <span class="zh-TW">發佈</span> + </h2> <ul> - <li><a href="<?cs var:toroot ?>guide/publishing/app-signing.html">Signing Your Applications</a></li> - <li><a href="<?cs var:toroot ?>guide/publishing/versioning.html">Versioning Your Applications</a></li> - <li><a href="<?cs var:toroot ?>guide/publishing/preparing.html">Preparing to Publish</a></li> - <li><a href="<?cs var:toroot ?>guide/publishing/publishing.html">Publishing Your Applications</a></li> + <li><a href="<?cs var:toroot ?>guide/publishing/app-signing.html"> + <span class="en">Signing Your Applications</span> + <span class="de" style="display:none">Signieren Ihrer Anwendungen</span> + <span class="es" style="display:none">Firma de aplicaciones</span> + <span class="fr" style="display:none">Attribution de votre signature <br />à vos applications</span> + <span class="it" style="display:none">Firma delle applicazioni</span> + <span class="ja" style="display:none">アプリケーションへの署名</span> + <span class="zh-CN" style="display:none">应用程序签名</span> + <span class="zh-TW" style="display:none">簽署應用程式</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/publishing/versioning.html"> + <span class="en">Versioning Your Applications</span> + <span class="de" style="display:none">Versionsverwaltung für Ihre <br />Anwendungen</span> + <span class="es" style="display:none">Versiones de las aplicaciones</span> + <span class="fr" style="display:none">Attribution d'une version à vos applications</span> + <span class="it" style="display:none">Controllo versioni delle applicazioni</span> + <span class="ja" style="display:none">アプリケーションのバージョニング</span> + <span class="zh-CN" style="display:none">应用程序版本控制</span> + <span class="zh-TW" style="display:none">應用程式版本設定</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/publishing/preparing.html"> + <span class="en">Preparing to Publish</span> + <span class="de" style="display:none">Vorbereitung auf die Veröffentlichung</span> + <span class="es" style="display:none">Publicación de aplicaciones</span> + <span class="fr" style="display:none">Préparation à la publication</span> + <span class="it" style="display:none">Preparativi per la pubblicazione</span> + <span class="ja" style="display:none">公開の準備</span> + <span class="zh-CN" style="display:none">准备发布</span> + <span class="zh-TW" style="display:none">準備發佈</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/publishing/publishing.html"> + <span class="en">Publishing Your Applications</span> + </a></li> </ul> -</li> - -<li><h2>Best Practices</h2> + </li> + + <li> + <h2><span class="en">Best Practices</span> + <span class="de">Bewährte Verfahren</span> + <span class="es">Prácticas recomendadas</span> + <span class="fr">Meilleures pratiques</span> + <span class="it">Best practice</span> + <span class="ja">ベスト プラクティス</span> + <span class="zh-CN">最佳实践</span> + <span class="zh-TW">最佳實務</span> + </h2> <ul> <li class="toggle-list"> - <div><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/index.html">UI Guidelines</a></div> - <ul> - <li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/icon_design.html">Icon Design</a></li> - <li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/widget_design.html">App Widget Design</a></li> - <li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/activity_task_design.html">Activity and Task Design</a></li> - </ul> + <div><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/index.html"> + <span class="en">UI Guidelines</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/icon_design.html"> + <span class="en">Icon Design</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/widget_design.html"> + <span class="en">App Widget Design</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/activity_task_design.html"> + <span class="en">Activity and Task Design</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/menu_design.html"> + <span class="en">Menu Design</span> + </a></li> + </ul> </li> - <li><a href="<?cs var:toroot ?>guide/practices/design/performance.html">Designing for Performance</a></li> - <li><a href="<?cs var:toroot ?>guide/practices/design/responsiveness.html">Designing for Responsiveness</a></li> - <li><a href="<?cs var:toroot ?>guide/practices/design/seamlessness.html">Designing for Seamlessness</a></li> -<!-- <li><a style="color:gray;">User Interface Guidelines</a></li> --> + <li><a href="<?cs var:toroot ?>guide/practices/design/performance.html"> + <span class="en">Designing for Performance</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/practices/design/responsiveness.html"> + <span class="en">Designing for Responsiveness</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/practices/design/seamlessness.html"> + <span class="en">Designing for Seamlessness</span> + </a></li> </ul> -</li> - -<li><h2>Tutorials and Sample Code</h2> + </li> + + <li> + <h2><span class="en">Tutorials and Sample Code</span> + <span class="de">Lernprogramme und Beispielcode</span> + <span class="es">Tutoriales y código de ejemplo</span> + <span class="fr">Didacticiels et exemple de code</span> + <span class="it">Esercitazioni e codice di esempio</span> + <span class="ja">チュートリアルとサンプル コード</span> + <span class="zh-CN">辅导手册和示例代码</span> + <span class="zh-TW">教學課程與程式碼範例</span> + </h2> <ul> - <li><a href="<?cs var:toroot ?>guide/tutorials/hello-world.html">Hello World</a></li> - <li><a href="<?cs var:toroot ?>guide/tutorials/views/index.html">Hello Views</a></li> - <li><a href="<?cs var:toroot ?>guide/tutorials/notepad/index.html">Notepad Tutorial</a></li> + <li><a href="<?cs var:toroot ?>guide/tutorials/hello-world.html"> + <span class="en">Hello World</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/tutorials/views/index.html"> + <span class="en">Hello Views</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/tutorials/notepad/index.html"> + <span class="en">Notepad Tutorial</span> + </a></li> </ul> <ul> <?cs if:android.whichdoc != "online" ?> - <li><a href="<?cs var:toroot ?>../samples">Sample Code »</a></li> + <li><a href="<?cs var:toroot ?>../samples"> + <span class="en">Sample Code</span> + »</a></li> <?cs else ?> <li class="toggle-list"> - <div><a href="<?cs var:toroot ?>guide/samples/index.html">Sample Code</a></div> - <ul> - <li><a href="<?cs var:toroot ?>guide/samples/ApiDemos/index.html">API Demos</a></li> - <li><a href="<?cs var:toroot ?>guide/samples/LunarLander/index.html">Lunar Lander</a></li> - <li><a href="<?cs var:toroot ?>guide/samples/NotePad/index.html">NotePad</a></li> - </ul> + <div><a href="<?cs var:toroot ?>guide/samples/index.html"> + <span class="en">Sample Code</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>guide/samples/ApiDemos/index.html"> + <span class="en">API Demos</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/samples/LunarLander/index.html"> + <span class="en">Lunar Lander</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/samples/NotePad/index.html"> + <span class="en">NotePad</span> + </a></li> + </ul> </li> <?cs /if ?> </ul> -</li> - - + </li> -<li><h2>Appendix</h2> + <li> + <h2><span class="en">Appendix</span> + <span class="de">Anhang</span> + <span class="es">Apéndice</span> + <span class="fr">Annexes</span> + <span class="it">Appendice</span> + <span class="ja">付録</span> + <span class="zh-CN">附录</span> + <span class="zh-TW">附錄</span> + </h2> <ul> - <li><a href="<?cs var:toroot ?>guide/appendix/media-formats.html">Supported Media Formats</a></li> - <li><a href="<?cs var:toroot ?>guide/appendix/g-app-intents.html">Intents List: Google Apps</a></li> - <li><a href="<?cs var:toroot ?>guide/appendix/glossary.html">Glossary</a></li> - <li><a href="<?cs var:toroot ?>guide/appendix/faq/index.html">FAQ</a></li> + <li><a href="<?cs var:toroot ?>guide/appendix/media-formats.html"> + <span class="en">Supported Media Formats</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/appendix/g-app-intents.html"> + <span class="en">Intents List: Google Apps</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/appendix/glossary.html"> + <span class="en">Glossary</span> + </a></li> + <li><a href="<?cs var:toroot ?>guide/appendix/faq/index.html"> + <span class="en">FAQ</span> + </a></li> </ul> -</li> + </li> </ul> <script type="text/javascript"> <!-- buildToggleLists(); + changeNavLang(getLangPref()); //--> </script> diff --git a/docs/html/guide/practices/ui_guidelines/icon_design.jd b/docs/html/guide/practices/ui_guidelines/icon_design.jd index 155684a..5f0a278 100644 --- a/docs/html/guide/practices/ui_guidelines/icon_design.jd +++ b/docs/html/guide/practices/ui_guidelines/icon_design.jd @@ -25,7 +25,7 @@ application can use the standard icons by referencing them as resources.</li> <li style="margin-top:4px;"><a href="#dodonts">General guidelines</a></li> <li><a href="#templatespack">Using the Icon Templates Pack</a></li> -<li><a href="#file">Icon appendix</a> +<li><a href="#iconappendix">Icon appendix</a> <ol> <li><a href="#launcherapx">Launcher icons</a></li> <li><a href="#menuapx">Menu icons</a></li> @@ -989,25 +989,9 @@ simply look at image filenames, which use the format <table class="image-caption"> <tr> - <td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_add.png" title="ic_menu_add" alt="Android asset" /> <div class="caption">Add</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/ic_menu_archive.png" title="ic_menu_archive" alt="Android asset" /> - <div class="caption">Archive</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/ic_menu_attachment.png" title="ic_menu_attachment" alt="Android asset" /> - <div class="caption">Attach</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/ic_menu_back.png" title="ic_menu_back" alt="Android asset" /> - <div class="caption">Back</div></td> <td class="image-caption-i image-list"> @@ -1024,9 +1008,6 @@ simply look at image filenames, which use the format <img src="{@docRoot}images/icon_design/ic_menu_close_clear_cancel.png" title="ic_menu_close_clear_cancel" alt="Android asset" /> <div class="caption">Clear / Close / Cancel / Discard </div></td> -</tr> -<tr> - <td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_compass.png" title="ic_menu_compass" alt="Android asset" /> @@ -1036,40 +1017,24 @@ simply look at image filenames, which use the format <td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_delete.png" title="ic_menu_delete" alt="Android asset" /> <div class="caption">Delete</div></td> - + <td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_directions.png" title="ic_menu_directions" alt="Android asset" /> <div class="caption">Directions</div></td> - + +</tr> +<tr> <td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_edit.png" title="ic_menu_edit" alt="Android asset" /> <div class="caption">Edit</div></td> -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/ic_menu_favorite.png" title="ic_menu_favorite" alt="Android asset" /> - <div class="caption">Favorite</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/ic_menu_forward.png" title="ic_menu_forward" alt="Android asset" /> - <div class="caption">Forward</div></td> - - <td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_gallery.png" title="ic_menu_gallery" alt="Android asset" /> <div class="caption">Gallery</div></td> -</tr> -<tr> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/ic_menu_goto.png" title="ic_menu_goto" alt="Android asset" /> - <div class="caption">Go to</div></td> - <td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_help.png" title="ic_menu_help" alt="Android asset" /> @@ -1077,16 +1042,6 @@ simply look at image filenames, which use the format <td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/ic_menu_recent_history.png" title="ic_menu_recent_history" alt="Android asset" /> - <div class="caption">History</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/ic_menu_home.png" title="ic_menu_home" alt="Android asset" /> - <div class="caption">Home</div></td> - - -<td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_info_details.png" title="ic_menu_info_details" alt="Android asset" /> <div class="caption">Info / details</div></td> @@ -1094,14 +1049,6 @@ simply look at image filenames, which use the format <td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_mapmode.png" title="ic_menu_mapmode" alt="Android asset" /> <div class="caption">Map mode</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/ic_menu_mark.png" title="ic_menu_mark" alt="Android asset" /> - <div class="caption">Mark</div></td> - -</tr> -<tr> <td class="image-caption-i image-list"> @@ -1113,11 +1060,8 @@ simply look at image filenames, which use the format <img src="{@docRoot}images/icon_design/ic_menu_more.png" title="ic_menu_more" alt="Android asset" /> <div class="caption">More</div></td> - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/ic_menu_play_clip.png" title="ic_menu_play_clip" alt="Android asset" /> - <div class="caption">Play</div></td> - +</tr> +<tr> <td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_preferences.png" title="ic_menu_preferences" alt="Android asset" /> @@ -1125,11 +1069,6 @@ simply look at image filenames, which use the format <td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/ic_menu_refresh.png" title="ic_menu_refresh" alt="Android asset" /> - <div class="caption">Refresh</div></td> - - -<td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_rotate.png" title="ic_menu_rotate" alt="Android asset" /> <div class="caption">Rotate</div></td> @@ -1138,9 +1077,6 @@ simply look at image filenames, which use the format <img src="{@docRoot}images/icon_design/ic_menu_save.png" title="ic_menu_save" alt="Android asset" /> <div class="caption">Save</div></td> -</tr> -<tr> - <td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_send.png" title="ic_menu_send" alt="Android asset" /> @@ -1158,26 +1094,15 @@ simply look at image filenames, which use the format <td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/ic_menu_shuffle.png" title="ic_menu_shuffle" alt="Android asset" /> - <div class="caption">Shuffle</div></td> - - -<td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_upload.png" title="ic_menu_upload" alt="Android asset" /> <div class="caption">Upload</div></td> - + +</tr> +<tr> <td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/ic_menu_view.png" title="ic_menu_view" alt="Android asset" /> <div class="caption">View</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/ic_menu_camera_video_view.png" title="ic_menu_camera_video_view" alt="Android asset" /> - <div class="caption">Video</div></td> - -</tr> -<tr> <td class="image-caption-i image-list"> @@ -1214,131 +1139,21 @@ or simply look at the image filename, which use the format <tr> <td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_data_connected_3g.png" title="stat_sys_data_connected_3g" alt="Android asset" /> - <div class="caption">3G</div></td> - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_signal_flightmode.png" title="stat_sys_signal_flightmode" alt="Android asset" /> - <div class="caption">Airplane mode</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_notify_alarm.png" title="stat_notify_alarm" alt="Android asset" /> - <div class="caption">Alarm</div></td> - - -<td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/stat_sys_data_bluetooth.png" title="stat_sys_data_bluetooth" alt="Android asset" /> <div class="caption">Bluetooth</div></td> <td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_data_bluetooth_connected.png" title="stat_sys_data_bluetooth_connected" alt="Android asset" /> - <div class="caption">Bluetooth connected</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_notify_calendar.png" title="stat_notify_calendar" alt="Android asset" /> - <div class="caption">Calendar</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_notify_disk_full.png" title="stat_notify_disk_full" alt="Android asset" /> - <div class="caption">Disk full</div></td> - -</tr> -<tr> - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_data_connected_e.png" title="stat_sys_data_connected_e" alt="Android asset" /> - <div class="caption">EDGE</div></td> - - -<td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/stat_notify_email_generic.png" title="stat_notify_email_generic" alt="Android asset" /> <div class="caption">Email</div></td> <td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_notify_email.png" title="stat_notify_email" alt="Android asset" /> - <div class="caption">Gmail</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_data_connected_g.png" title="stat_sys_data_connected_g" alt="Android asset" /> - <div class="caption">GPRS</div></td> - - -<td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/stat_notify_chat.png" title="stat_notify_chat" alt="Android asset" /> <div class="caption">IM</div></td> <td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_install_complete.png" title="stat_sys_install_complete" alt="Android asset" /> - <div class="caption">Installation complete</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_notify_musicplayer.png" title="stat_notify_musicplayer" alt="Android asset" /> - <div class="caption">Music</div></td> - -</tr> -<tr> - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_r_signal_4.png" title="stat_sys_r_signal_4" alt="Android asset" /> - <div class="caption">Roaming</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_signal_4.png" title="stat_sys_signal_4" alt="Android asset" /> - <div class="caption">Signal</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_signal_null.png" title="stat_sys_signal_null" alt="Android asset" /> - <div class="caption">Signal unavailable</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_ringer_silent_old.png" title="stat_sys_ringer_silent_old" alt="Android asset" /> - <div class="caption">Silent mode</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_notify_sms.png" title="stat_notify_sms" alt="Android asset" /> - <div class="caption">SMS/MMS</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_speakerphone.png" title="stat_sys_speakerphone" alt="Android asset" /> - <div class="caption">Speaker phone</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_notify_sync_anim0.png" title="stat_notify_sync_anim0" alt="Android asset" /> - <div class="caption">Sync</div></td> - -</tr> -<tr> - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_notify_sync_error.png" title="stat_notify_sync_error" alt="Android asset" /> - <div class="caption">Sync error</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_data_usb.png" title="stat_sys_data_usb" alt="Android asset" /> - <div class="caption">USB connected</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_ringer_vibrate.png" title="stat_sys_ringer_vibrate" alt="Android asset" /> - <div class="caption">Vibrate</div></td> - - -<td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/stat_notify_voicemail.png" title="stat_notify_voicemail" alt="Android asset" /> <div class="caption">Voicemail</div></td> @@ -1349,32 +1164,6 @@ or simply look at the image filename, which use the format <td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_wifi_signal_4.png" title="stat_sys_wifi_signal_4" alt="Android asset" /> - <div class="caption">WiFi</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_notify_wifi_in_range.png" title="stat_notify_wifi_in_range" alt="Android asset" /> - <div class="caption">WiFi network available</div></td> - -</tr> -<tr> - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_wifi_unavailable.png" title="stat_sys_wifi_unavailable" alt="Android asset" /> - <div class="caption">WiFi unavailable</div></td> - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_battery_100.png" title="stat_sys_battery_100" alt="Android asset" /> - <div class="caption">Battery 100%</div></td> - - -<td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_battery_empty.png" title="stat_sys_battery_empty" alt="Android asset" /> - <div class="caption">Battery empty</div></td> - - -<td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/stat_sys_phone_call.png" title="stat_sys_phone_call" alt="Android asset" /> <div class="caption">Call</div></td> @@ -1383,6 +1172,8 @@ or simply look at the image filename, which use the format <img src="{@docRoot}images/icon_design/stat_sys_phone_call_forward.png" title="stat_sys_phone_call_forward" alt="Android asset" /> <div class="caption">Call forward</div></td> +</tr> +<tr> <td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/stat_sys_phone_call_on_hold.png" title="stat_sys_phone_call_on_hold" alt="Android asset" /> @@ -1390,13 +1181,6 @@ or simply look at the image filename, which use the format <td class="image-caption-i image-list"> - <img src="{@docRoot}images/icon_design/stat_sys_gps_on.png" title="stat_sys_gps_on" alt="Android asset" /> - <div class="caption">GPS on</div></td> - -</tr> -<tr> - -<td class="image-caption-i image-list"> <img src="{@docRoot}images/icon_design/stat_notify_missed_call.png" title="stat_notify_missed_call" alt="Android asset" /> <div class="caption">Missed call</div></td> diff --git a/docs/html/guide/practices/ui_guidelines/index.jd b/docs/html/guide/practices/ui_guidelines/index.jd index 0b9d275..2d14fa6 100644 --- a/docs/html/guide/practices/ui_guidelines/index.jd +++ b/docs/html/guide/practices/ui_guidelines/index.jd @@ -39,6 +39,14 @@ graphics files and templates that will make your designer's life easier.</dd> multitasking, activity reuse, intents, the activity stack, and tasks. It covers this all from a high-level design perspective. </dd> + <dt><a href="{@docRoot}guide/practices/ui_guidelines/menu_design.html">Menu Design Guidelines</a> </dt> + <dd>Android applications make use of Option menus and Context menus + that enable users to perform operations and navigate to other parts + of your application or to other applications. These guidelines describe + the difference between Options and Context menus, how to arrange + menu items, when to put commands on-screen, and other details about + menu design. +</dd> </dl> diff --git a/docs/html/guide/practices/ui_guidelines/menu_design.jd b/docs/html/guide/practices/ui_guidelines/menu_design.jd new file mode 100644 index 0000000..518cea1 --- /dev/null +++ b/docs/html/guide/practices/ui_guidelines/menu_design.jd @@ -0,0 +1,507 @@ +page.title=Menu Design Guidelines +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + +<h2>Menu design quickview</h2> + +<ul> + <li>An Options menu is for any commands that are global to the current activity. </li> + <li>A Context menu is for any commands that apply to the current selection. </li> + <li>Place the most frequently used operations first. </li> + <li>Put only the most important commands fixed on the screen. </li> + <li>The commands on the Context menu that appears when you touch & hold on an item should be duplicated on the activity you get to by a normal press on that item. +</ul> + + +<h2>In this document</h2> + +<ol> + <li><a href=#tour_of_the_menus>Tour of the Menus</a> + <ol> + <li style="padding-top: 4px;"><a href=#options_menu>Options Menu</a></li> + <li style="padding-top: 4px;"><a href=#context_menu>Context Menu</a></li> + <li style="padding-top: 4px;"><a href=#comparison_of_options_and_context_menus>Comparison of Options & Context Menus</a></li> + <li style="padding-top: 4px;"><a href=#commands_fixed>Commands Fixed in an Activity Screen</a></li> + </ol> + </li> + <li><a href=#guidelines>Guidelines</a> + <ol> + <li style="padding-top: 4px;"><a href=#separate_commands>Separate specific from global commands</a></li> + <li style="padding-top: 4px;"><a href=#most_frequently_used>Place most frequently used first</a></li> + <li style="padding-top: 4px;"><a href=#dont_put_commands>Don't put commands <em>only</em> in a Context menu</li> + <li style="padding-top: 4px;"><a href=#first_in_context_menu>First command in Context menu should be most intuitive</li> + <li style="padding-top: 4px;"><a href=#selecting_content_item>Selecting an item should perform most intuitive operation</a></li> + <li style="padding-top: 4px;"><a href=#context_menu_should_identify>A Context menu should identify the selected item</li> + <li style="padding-top: 4px;"><a href=#most_important_commands>Put only most important commands fixed on the screen</a></li> + <li style="padding-top: 4px;"><a href=#short_names>Use short names in Options icon menu</a></li> + <li style="padding-top: 4px;"><a href=#a_dialog_should_not_have_an_options_menu>A dialog should not have Options menu</a></li> + <li style="padding-top: 4px;"><a href=#do_not_substitute_message>If no Options menu, don't display message</a></li> + <li style="padding-top: 4px;"><a href=#dim_hide_menu_items>Dim or hide menu items not available</a></li> + </ol> + </li> +</ol> + +<h2>See also</h2> + +<ol> + <li><a href="http://android-developers.blogspot.com/2008/12/touch-mode.html">Touch mode</a></li> + <li><a href="{@docRoot}guide/practices/ui_guidelines/activity_task_design.html">Activity and Task Design</a></li> +</ol> + +</div> +</div> + +<p> + A menu holds a set of commands (user actions) that are normally hidden, and + are accessible by a button, key, or gesture. Menu commands provide a means + for performing operations and for navigating to other parts of your + application or other applications. Menus are useful for freeing screen space, + as an alternative to placing functionality and navigation, in buttons or other + user controls in the content area of your application. +</p> + +<p> + The Android system provides two types of menus you can use to provide + functionality or navigation. Between them, you should be able to organize + the functionality and navigation for your application. Briefly: + <ul> + <li>The <em>Options menu</em> contains primary functionality that applies + globally to the current activity or starts a related activity. + It is typically invoked by a user pressing a hard button, often labeled MENU.</li> + <li>The <em>Context menu</em> contains secondary functionality for the currently + selected item. It is typically invoked by a user's touch & hold + on an item. Like on the Options menu, the operation can run either + in the current or another activity.</li> + </ul> +</p> + +<p> + All but the simplest applications have menus. The system automatically + lays the menus out and provides standard ways for users to access them. + In this sense, they are familiar and dependable ways for users to access + functionality across all applications. All menus are panels that "float" + on top of the activity screen and are smaller than full screen, so that the + application is still visible around its edges. This is a visual reminder + that a menu is an intermediary operation that disappears once it's used. +</p> + +<p> + Let's start out with a quick tour of the menus. +</p> + +<h2 id="tour_of_the_menus">Tour of the Menus</h2> + +<blockquote> + <b>NOTE</b> - Your menus and screens might not look like those shown in this document; + they may vary from one version of Android or device to another. +</blockquote> + +<h3 id="options_menu">Options Menu</h3> + +<p> + The Options menu contains commands that apply globally across the current + activity, or can start another activity. They do not apply to a selected + item in the content (a <a href="#context_menu">Context menu</a> does that). +</p> + +<p> + On most devices, a user presses the MENU button to access the Options menu, + as shown in the screenshot below. To close the menu, the user presses + MENU again, or presses the BACK button. + In fact, to cancel out of any menu, press the BACK button. (Pressing the MENU + button or touching outside the menu also works.) Note that how to invoke this + menu may be different on different devices. +</p> + +<p> + Each + <a href="{@docRoot}guide/practices/ui_guidelines/activity_task_design.html#activities">activity</a> + activity has its own set of operations and therefore its own Options menu. + An application with multiple activities would have a different Options menu + for each activity. +</p> + +<p> + For example, in the message list view of an email program, the Options menu + might let you search the messages, compose a new message, refresh the list, + or change the email settings. The compose view of an email program would + have a different Options menu, such as adding a CC field, attaching a file, + or discarding the message. +</p> + +<p id="options_icon_expanded_menus"> + In order to handle a large number of menu items, the Options menu + progressively discloses them in two steps: +</p> + +<ul> + <li> + <b>Options icon menu</b> - The first press of the MENU button displays a + non-scrollable grid of icons at the bottom of the screen. (On the G1 + phone, up to 6 buttons typically appear.) + </li> + <li> + <b>Options expanded menu</b> - If the activity has more menu items than will + fit on the icon menu, then the last icon is labeled "More" — selecting it + displays a list that can contain any number of menu items and will scroll + as necessary. + </li> +</ul> + +<img src={@docRoot}images/menu_design/MenuDiagram.png> + +<p> + On some versions of Android, the user can display keyboard shortcuts in the + icon menu by long pressing the MENU button — the text in the icon menu + alternates between the command names and their keyboard shortcuts (if any). +</p> + +<h3 id="context_menu">Context Menu</h3> + +<p> + A Context menu is similar to a right-click context menu in a desktop + operating system. It is normally a shortcut that duplicates commands + found elsewhere. +</p> + +<p> + A user can touch & hold on content on the screen to + access a Context menu (if one exists), as shown in the screenshot below. + A Context menu is a list of menu items (commands) that can operate + on the selected content. The command can either be part of the current + activity, or the system can pass the selected content along to + an operation in another activity (by way of an + <a href="{@docRoot}guide/practices/ui_guidelines/activity_task_design.html#intents">intent</a>). +</p> + +<p> + For example, in an email message list, a user can touch & hold on + an email message to open a Context menu containing commands to read, + archive, or delete the message. +</p> + +<p id="location"> + A user can also touch & hold a <em>location</em> on the screen to + access a Context menu. An example is when the user does touch & hold + on a blank spot on the Home screen, a Context menu appears; selecting + an item from that menu inserts an icon at that location. +</p> + +<img src={@docRoot}images/menu_design/ContextMenuDiagram.png> + +<h4 id="context_menu_shortcut">Context Menu is a Shortcut</h4> + +<p> + In the above example, if the user performs touch & hold on the contact + "Obi Wan Kenobi", a Context menu opens. The commands provided in + this Context menu are the complete set of actions that can be performed + on this contact. +</p> + +<p> + A normal touch on an item in the content activates the most intuitive + command for that selection — in this case, "View contact". + We recommend that the most intuitive command also be listed as the + first item in the Context menu. In this example, selecting the contact + "Obi Wan Kenobi" runs the same command "View contact" that is listed + at the top of the Context menu. +</p> + +<p> + Also note, as shown in the following screenshot, the Context menu and the + next screen both hold the same complete set of commands that can be performed + on this contact. The Context menu displays the commands in a list, + while the "View contact" activity splits them into various items in the + Options menu, icon buttons and list items. +</p> + +<p> + Because of this duplication, using the Context menu is considered a <em>shortcut</em> + for going to the next screen and performing the operation there. Context menus + are less discoverable than either buttons fixed on-screen or the Options menu. + Many users never discover or use Context menus. It is for this reason that, for + the most part, any command on a Context menu should also appear on the most + intuitive operation's screen. As the next section explains, text operations, + such as "Select text" might appear only on a Context menu. Also, rich + applications, such as browsers, which themselves can contain web applications, + may have commands on Context menus that are not available elsewhere. +</p> + +<img src={@docRoot}images/menu_design/ContextMenuViewContactDiagram.png> + +<h4>Text Commands in Context Menu</h4> + +<p> + Text links and text fields in the content both have system-provided operations + that are common across all applications: operations such as "Select all", "Select text", + "Copy all", and "Add to dictionary". If the text field is editable, it also + has other operations, such as "Cut all" and "Input Method", and if text + is also on the clipboard, it has "Paste". The system automatically inserts + the appropriate menu items into the Context menu of text links and text + fields, as shown in the following screenshot. +</p> + +<img src={@docRoot}images/menu_design/TextFieldContextMenuDiagram.png> + + +<h3 id="comparison_of_options_and_context_menus">Comparison of Options and Context Menus</h3> + +<p> + An Options menu holds commands that are global to the activity while a + Context menu holds commands that apply only to an item in the content. + As shown in these diagrams, the user navigates to the menu, then + touches a menu item to perform an action or open a dialog. +</p> + +<img src={@docRoot}images/menu_design/TaskFlowDiagram.png> + +<p> + For more technical information on menus, see + <a href="{@docRoot}guide/topics/ui/menus.html">Creating Menus</a>. +</p> + +<h3 id="commands_fixed">Commands Fixed in an Activity Screen</h4> + +<p> + Commands can also be fixed directly on screen, typically in + text buttons, graphic buttons, or list items. This placement is by far the most + discoverable location for commands — a user can immediately see the command + without having to first press a button. This increased visibility needs to be + weighed against the space such user controls take up, or the sense that they + might clutter the visual design. +</p> + +<h2 id="guidelines">Guidelines</h2> + +<p> + Selecting the right kind of menu to present, and using menus + consistently, are critical factors in good application design. The following + guidelines should assist user experience designers and application developers + toward this end. +</p> + +<h3 id="separate_commands">Separate selection-specific commands from global commands</h3> + +<p> + Put any commands that are global to the current activity in the Options menu + or place them fixed in an activity screen; put commands that apply to the + current selection in the Context menu. (In any case, the command + could either run as part of this activity or start another activity.) +</p> + +<p> + You can determine in which menu to place a command by what it operates on: + If the command acts on selected content (or a particular + <a href="#location">location</a>) on the screen, put the command in the + Context menu for that content. If the command acts on no specific content + or location, put it in the Options menu. This separation of commands + is enforced by the system in the following way. When you press the MENU + button to display the Options menu, the selected content becomes unselected, + and so cannot be operated on. For an explanation + of why the content becomes unselected, see the article on + <a href="http://android-developers.blogspot.com/2008/12/touch-mode.html">Touch mode</a>. +</p> + +<p> + An example of a selection-specific Context menu is when a user performs a + touch & hold on a person's name in a list view of a contacts application. + The Context menu would typically contain commands "View contact", "Call contact", + and "Edit contact". +</p> + +<h3 id="most_frequently_used">Place the most frequently used operations first</h3> + +<p> + Because of limited screen height, some menus may be scrollable, so it's + important to place the most important commands so they can be viewed without + scrolling. In the case of the Options menu, place the most frequently used + operation on its <a href="#options_icon_expanded_menus">icon menu</a>; + the user will have to select "More" to see the rest. + It's also useful to place similar commands in the same location — + for example, the Search icon might always be the first icon in the Options + menu across several activities that offer search. +</p> + +<p> + In a Context menu, the most intuitive command should be first, followed + by commands in order of decreasing use, with the least used command at the bottom. +</p> + +<h3 id="dont_put_commands">Don't put commands <em>only</em> in a Context menu</h3> +<p> + If a user can fully access your application without using Context menus, + then it's designed properly! In general, if part of your application is inaccessible + without using Context menus, then you need to duplicate those commands elsewhere. +</p> + +<p> + Before opening a Context menu, it has no visual representation that identifies + its presence (whereas the Options menu has the MENU button), and so is not + particularly discoverable. + Therefore, in general, a Context menu should <em>duplicate</em> commands + found in the corresponding activity screen. For example, while it's useful to + let the user call a phone number from a Context menu invoked by touch + & hold on a name in a list of contacts, that operation should <em>also</em> + be available by the user touching the phone number itself when viewing contact details. + See <a href="#context_menu_shortcut">shortcut</a> for an illustration of this example. +</p> + +<h3 id="first_in_context_menu">The first command in a Context menu should be the selection's most intuitive command</h3> + +<p> + As described under <a href="#context_menu_shortcut">shortcut</a>, + touching on an item in the content should activate the same command as touching + the first item in the Context menu. Both cases should be the most intuitive + operation for that item. +</p> + +<h3 id="selecting_content_item">Selecting an item in the content should perform the most intuitive operation</h3> + +<p> + In your application, when the user touches any actionable text (such as a link + or list item) or image (such as a photo icon), execute the operation most + likely to be desired by the user. +</p> + +<p> + Some examples of primary operations: +</p> + +<ul> + <li>Selecting an image executes "View image"</li> + <li>Selecting a media icon or filename executes "Play"</li> + <li>Selecting a URL link executes "Open link"</li> + <li>Selecting an address executes "Go to address" (in a maps application)</li> +</ul> + +<p> + Note that selecting the same item in different contexts might invoke + different operations: +</p> + +<ul> + <li>In a contact application, selecting a contact executes "View details"</li> + <li>In an IM application, selecting a contact executes "Start chat"</li> + <li>In an Email application, when adding a recipient to the "To" field + through the contact book, selecting a contact executes "Add to recipient + list"</li> +</ul> + + +<h3 id="context_menu_should_identify">A Context menu should identify the selected item</h3> + +<p> + When a user does touch & hold on an item, the Context menu should + contain the name of the selected item. Therefore, + when creating a Context menu, be sure to include a title and the name of the + selected item so that it's clear to the user what the context is. + For example, if a user selects a contact "Joan of Arc", put that name in the + title of the Context menu (using + {@link android.view.ContextMenu#setHeaderTitle(java.lang.CharSequence) setHeaderTitle}). + Likewise, a command to edit the contact should be called "Edit contact", + not just "Edit". +</p> + + +<h3 id="most_important_commands">Put only the most important commands fixed on the screen</h3> + +<p> + By putting commands in menus, you free up the screen to hold more content. + On the other hand, fixing commands in the content area of an activity + makes them more prominent and easy to use. +</p> + +<p> + Here are a number of important reasons to place commands fixed on the activity screen: +</p> + + <ul> + <li> + To give a command the highest prominence, ensuring the command is obvious and won't be overlooked.<br> + Example: A "Buy" button in a store application. + </li> + <li> + When quick access to the command is important and going to the menu would be + tedious or slow.<br> + Example: Next/Previous buttons or Zoom In/Out buttons in an image viewing application. + </li> + <li> + When in the middle of an operation that needs to be completed.<br> + Example: Save/Discard buttons in an image crop activity. + </li> + <li> + Dialogs and wizards.<br> + Example: OK/Cancel buttons + </li> + <li> + For direct manipulation.<br> + Example: Dragging an icon in the Home screen to the trash + </li> + </ul> + +<h3 id="short_names">Use short names in the Options icon menu</h3> + +<p> + If a text label in the <a href="#options_icon_expanded_menus">Options icon menu</a> + is too long, the system truncates it in the middle. Thus, "Create Notification" + is truncated to something like "Create…ication". You have no control over + this truncation, so the best bet is to keep the text short. In some versions of Android, + when the icon is highlighted by a navigation key (such as a trackball), the + entire descriptive text may be shown as a marquee, where the words are + readable as they scroll by. <!--For more information, see the Text Guidelines + [update link].--> +</p> + +<h3 id="a_dialog_should_not_have_an_options_menu">A dialog should not have an Options menu</h3> + +<p> + When a dialog is displayed, pressing the MENU button should do nothing. This also holds true + for activities that look like dialogs. A dialog box is recognizable by being + smaller than full-screen, having zero to three buttons, is non-scrollable, and + possibly a list of selectable items that can include checkboxes or radio buttons. + <!--For examples of dialogs, see Text Guidelines.--> +</p> + +<p> + The rationale behind not having a menu is that when a dialog is displayed, the user is in + the middle of a procedure and should not be allowed to start a new global task + (which is what the Option menu provides). +</p> + +<h3 id="do_not_substitute_message">If an activity has no Options menu, do not display a message</h3> + +<p> + When the user presses the MENU button, if there is no Options menu, the system + currently does nothing. We recommend you do not perform any action (such as + displaying a message). It's a better user experience for this behavior to be + consistent across applications. +</p> + + + +<h3 id="dim_hide_menu_items">Dim or hide menu items that are not available in the current context</h3> + +<p> + Sometimes a menu item's action cannot be performed — for example, + the "Forward" button in a browser cannot work until after the "Back" + button has been pressed. We recommend: +</p> + +<ul> + <li> + <b>In Options menu</b> - disable the menu item, which dims the text and icon, + turning it gray. This applies to menu items in both the icon menu and the + "More" menu. It would be disorienting for the icon menu to change from 6 + items to 5 items, and we treat the "More" menu the same way. + </li> + <li> + <b>In Context menu</b> - hide the menu item. This makes the menu shorter so the + user sees only available choices (which also reduces any scrolling). + </li> +</ul> + +</body> +</html> + diff --git a/docs/html/guide/topics/appwidgets/index.jd b/docs/html/guide/topics/appwidgets/index.jd index 01a9648..fc0061d 100644 --- a/docs/html/guide/topics/appwidgets/index.jd +++ b/docs/html/guide/topics/appwidgets/index.jd @@ -150,14 +150,26 @@ folder.</p> <code>(number of cells * 74) - 2</code><br/> Following this formula, you should use 72 dp for a height of one cell, 294 dp and for a width of four cells.</p> </li> - <li>The <code>updatePerdiodMillis</code> attribute defines how often the App Widget framework should + <li>The <code>updatePeriodMillis</code> attribute defines how often the App Widget framework should request an update from the {@link android.appwidget.AppWidgetProvider} by calling the {@link android.appwidget.AppWidgetProvider#onUpdate(Context,AppWidgetManager,int[]) onUpdate()} method. The actual update is not guaranteed to occur exactly on time with this value and we suggest updating as infrequently as possible—perhaps no more than once an hour to conserve the battery. You might also allow the user to adjust the frequency in a configuration—some people might want a stock ticker to update every 15 minutes, or maybe - only four times a day.</li> + only four times a day. + <p class="note"><strong>Note:</strong> If the device is asleep when it is time for an update + (as defined by <code>updatePeriodMillis</code>), then the device will wake up in order + to perform the update. If you don't update more than once per hour, this probably won't + cause significant problems for the battery life. If, however, you need to update more + frequently and/or you do not need to update while the device is asleep, then you can instead + perform updates based on an alarm that will not wake the device. To do so, set an alarm with + an Intent that your AppWidgetProvider receives, using the {@link android.app.AlarmManager}. + Set the alarm type to either {@link android.app.AlarmManager#ELAPSED_REALTIME} or + {@link android.app.AlarmManager#RTC}, which will only + deliver the alarm when the device is awake. Then set <code>updatePeriodMillis</code> to + zero (<code>"0"</code>).</p> + </li> <li>The <code>initialLayout</code> attribute points to the layout resource that defines the App Widget layout.</li> <li>The <code>configure</code> attribute defines the {@link android.app.Activity} to launch when diff --git a/docs/html/guide/topics/resources/resources-i18n.jd b/docs/html/guide/topics/resources/resources-i18n.jd index c26cb63..85b89d1 100755 --- a/docs/html/guide/topics/resources/resources-i18n.jd +++ b/docs/html/guide/topics/resources/resources-i18n.jd @@ -465,37 +465,37 @@ MyApp/ </tr> <tr> <td>MCC and MNC</td> - <td>The mobile country code optionally followed by mobile network code + <td><p>The mobile country code optionally followed by mobile network code from the SIM in the device. For example <code>mcc310</code> (U.S. on any carrier); <code>mcc310-mnc004</code> (U.S., Verizon brand); <code>mcc208-mnc00</code> (France, Orange brand); <code>mcc234-mnc00</code> (U.K., BT brand). - <p> + </p><p> If the device uses a radio connection (GSM phone), the MCC will come from the SIM, and the MNC will come from the network to which the device is attached. You might sometimes use the MCC alone, for example to include country-specific legal resources in your application. If your application specifies resources for a MCC/MNC combination, those - resources can only be used if both the MCC and the MNC match. </td> + resources can only be used if both the MCC and the MNC match. </p></td> </tr> <tr> <td>Language and region</td> - <td>The two letter <a href="http://www.loc.gov/standards/iso639-2/php/code_list.php">ISO + <td><p>The two letter <a href="http://www.loc.gov/standards/iso639-2/php/code_list.php">ISO 639-1</a> language code optionally followed by a two letter <a href="http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html">ISO 3166-1-alpha-2</a> region code (preceded by lowercase "r"). For example <code>fr</code>, <code>en-rUS</code>, <code>fr-rFR</code>, <code>es-rES</code>. - <p> + </p><p> The codes are <em>not</em> case-sensitive; the r prefix is used to distinguish the region portion. You cannot specify a region alone, but you can specify a language alone, - for example <code>en</code>, <code>fr</code>, <code>es</code>. </td> + for example <code>en</code>, <code>fr</code>, <code>es</code>.</p> </td> </tr> <tr> <td>Screen dimensions</td> - <td><code>small</code>, <code>normal</code>, <code>large</code> - <p> + <td><p><code>small</code>, <code>normal</code>, <code>large</code> + </p><p> Specify that the resource is for a particular class of screen. The meanings of these are:</p> <ul> @@ -517,27 +517,27 @@ MyApp/ </tr> <tr> <td>Wider/taller screens</td> - <td><code>long</code>, <code>notlong</code> - <p> + <td><p><code>long</code>, <code>notlong</code> + </p><p> Specify that the resource is for a taller/wider than traditional screen. This is based purely on the aspect ration of the screen: QVGA, HVGA, and VGA are notlong; WQVGA, WVGA, FWVGA are long. Note that long may mean either wide or tall, depending on the current - orientation. + orientation.</p> </td> </tr> <tr> <td>Screen orientation</td> - <td><code>port</code>, <code>land</code>, <code>square</code> - <p> + <td><p><code>port</code>, <code>land</code>, <code>square</code> + </p><p> Specifies that the resource is for a screen that is tall (port) - or wide (land); square is not currently used. + or wide (land); square is not currently used.</p> </td> </tr> <tr> <td>Screen pixel density</td> - <td><code>ldpi</code>, <code>mdpi</code>, <code>hdpi</code>, <code>nodpi</code> - <p> + <td><p><code>ldpi</code>, <code>mdpi</code>, <code>hdpi</code>, <code>nodpi</code> + </p><p> Specifies the screen density the resource is defined for. The medium density of traditional HVGA screens (mdpi) is defined to be approximately 160dpi; low density (ldpi) is 120, and high density (hdpi) is 240. There @@ -545,7 +545,7 @@ MyApp/ in ldpi would be 12x12 is mdpi and 16x16 in hdpi. The special <code>nodpi</code> density can be used with bitmap resources to prevent them from being scaled at load time to match the device density. - <p> + </p><p> When Android selects which resource files to use, it handles screen density differently than the other qualifiers. In step 1 of <a href="#best-match">How Android finds the best @@ -553,10 +553,11 @@ MyApp/ be a match. In step 4, if the qualifier being considered is screen density, Android will select the best final match at that point, without any need to move on to step 5. - <p> + </p><p> You can also specify explicit densities like <code>92dpi</code> or <code>108dpi</code>, but these are not fully supported by the system so should not be used. + </p> </td> </tr> <tr> @@ -565,9 +566,9 @@ MyApp/ </tr> <tr> <td>Whether the keyboard is available to the user</td> - <td><code>keysexposed</code>, <code>keyshidden</code>, <code>keyssoft</code> - <p> - If your application has specific resources that should only be used with a soft keyboard, use the <code>keyssoft</code> value. If no <code>keyssoft</code> resources are available (only <code>keysexposed</code> and <code>keyshidden</code>) and the device shows a soft keyboard, the system will use <code>keysexposed</code> resources. </td> + <td><p><code>keysexposed</code>, <code>keyshidden</code>, <code>keyssoft</code> + </p><p> + If your application has specific resources that should only be used with a soft keyboard, use the <code>keyssoft</code> value. If no <code>keyssoft</code> resources are available (only <code>keysexposed</code> and <code>keyshidden</code>) and the device shows a soft keyboard, the system will use <code>keysexposed</code> resources.</p> </td> </tr> <tr> <td>Primary text input method</td> diff --git a/docs/html/images/menu_design/ContextMenuDiagram.png b/docs/html/images/menu_design/ContextMenuDiagram.png Binary files differnew file mode 100644 index 0000000..06678c7 --- /dev/null +++ b/docs/html/images/menu_design/ContextMenuDiagram.png diff --git a/docs/html/images/menu_design/ContextMenuViewContactDiagram.png b/docs/html/images/menu_design/ContextMenuViewContactDiagram.png Binary files differnew file mode 100644 index 0000000..dcee981 --- /dev/null +++ b/docs/html/images/menu_design/ContextMenuViewContactDiagram.png diff --git a/docs/html/images/menu_design/MenuDiagram.png b/docs/html/images/menu_design/MenuDiagram.png Binary files differnew file mode 100644 index 0000000..543328a --- /dev/null +++ b/docs/html/images/menu_design/MenuDiagram.png diff --git a/docs/html/images/menu_design/TaskFlowDiagram.png b/docs/html/images/menu_design/TaskFlowDiagram.png Binary files differnew file mode 100644 index 0000000..0157132 --- /dev/null +++ b/docs/html/images/menu_design/TaskFlowDiagram.png diff --git a/docs/html/images/menu_design/TextFieldContextMenuDiagram.png b/docs/html/images/menu_design/TextFieldContextMenuDiagram.png Binary files differnew file mode 100644 index 0000000..b23a7da --- /dev/null +++ b/docs/html/images/menu_design/TextFieldContextMenuDiagram.png diff --git a/docs/html/index.jd b/docs/html/index.jd index 07d0abe..c39e9a8 100644 --- a/docs/html/index.jd +++ b/docs/html/index.jd @@ -11,19 +11,19 @@ home=true </div><!-- end homeTitle --> <div id="announcement-block"> <!-- total max width is 520px --> - <img src="/assets/images/home/IO-logo.png" alt="Google I/O Developer Conference 2009" width="242px" /> - <div id="announcement" style="width:270px"> - <p>Google I/O is a two-day developer event that will take place May 27-28 at Moscone Center, San Francisco. The agenda includes a number of great sessions on Android topics by team engineers and other developers.</p> - <p><a href="http://code.google.com/events/io/">Learn more »</a></p> + <img src="/assets/images/home/android_adc.png" alt="Android Developer Challenge 2" width="232px" /> + <div id="announcement" style="width:275px"> + <p>The second Android Developer Challenge has begun! In this contest, + real-world users will help review and score applications and the overall winner will + take away $250,000. The deadline for submitting an application to the contest is August 31, 2009.</p> + <p><a href="http://code.google.com/android/adc/">Learn more about ADC 2 »</a></p> </div> <!-- end annoucement --> </div> <!-- end annoucement-block --> </div><!-- end topAnnouncement --> - <div id="carousel"> - <div id="carouselMain"> - <div id="bulletinImg"></div> - <div id="bulletinDesc"></div> - </div> + <div id="carouselMain" style="height:192px"> <!-- this height can be adjusted based on the content height --> + </div> <div class="clearer"></div> + <div id="carouselWheel"> <div class="app-list-container" align="center"> <a href="javascript:{}" id="arrow-left" onclick="" class="arrow-left-off"></a> <div id="list-clip"> @@ -31,10 +31,10 @@ home=true <!-- populated by buildCarousel() --> </div> </div><!-- end list-clip --> - <a href="javascript:page_right()" id="arrow-right" onclick="" class="arrow-right-on"></a> + <a href="javascript:{ page_right(); }" id="arrow-right" onclick="" class="arrow-right-on"></a> <div class="clearer"></div> </div><!-- end app-list container --> - </div><!-- end carousel --> + </div><!-- end carouselWheel --> </div><!-- end homeMiddle --> <div style="clear:both"> </div> @@ -79,8 +79,8 @@ home=true <td class="imageCell"><a href="http://www.youtube.com/user/androiddevelopers"><img src="{@docRoot}assets/images/video-droid.png" style="padding:0" /></a></td> <td> <h2 class="green">Watch</h2> - <object width="150" height="140"><param name="movie" value="http://www.youtube.com/v/x1ZZ-R3p_w8&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/x1ZZ-R3p_w8&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="150" height="140"></embed></object> - <p style="margin-top:1em"><a href="http://www.youtube.com/user/androiddevelopers">More Android videos »</a></p> + <object width="150" height="140"><param name="movie" value="http://www.youtube.com/v/GARMe7Km_gk&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/GARMe7Km_gk&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="150" height="140"></embed></object> + <p style="margin-top:1em"><a href="{@docRoot}videos/index.html">More Android videos »</a></p> </td> </tr> @@ -120,10 +120,19 @@ home=true 'sdk': { 'layout':"imgLeft", 'icon':"sdk-small.png", - 'name':"SDK 1.5 r2", + 'name':"SDK 1.5 r3", 'img':"sdk-large.png", 'title':"Android 1.5 SDK", - 'desc': "<p>Android 1.5 SDK is now available. It includes new APIs for Android 1.5, updated developer tools, multiple platform versions, and a Google APIs add-on.</p><p><a href='{@docRoot}sdk/1.5_r2/index.html'>Download Android 1.5 SDK</a></p>" + 'desc': "<p>Android 1.5 SDK is now available. It includes new APIs for Android 1.5, updated developer tools, multiple platform versions, and a Google APIs add-on.</p><p><a href='{@docRoot}sdk/1.5_r3/index.html'>Download Android 1.5 SDK »</a></p>" + }, + + 'io': { + 'layout':"imgLeft", + 'icon':"io-small.png", + 'name':"Google I/O", + 'img':"io-large.png", + 'title':"Google I/O Developer Conference", + 'desc': "<p>The Google I/O developer conference took place May 27-28 in San Francisco. If you missed the conference, you can experience the Android sessions by viewing YouTube videos.</p><p><a href='{@docRoot}videos/index.html'>See the sessions from Google I/O »</a></p>" }, 'mapskey': { @@ -135,15 +144,6 @@ home=true 'desc':"<p>If you're writing an Android application that uses Google Maps (with MapView), you must register your application to obtain a Maps API Key. Without the key, your maps application will not work on Android devices. Obtaining a key requires just a couple of steps.</p><p><a href='http://code.google.com/android/add-ons/google-apis/maps-overview.html'>Learn more »</a></p>" }, - 'market': { - 'layout':"imgTop", - 'icon':"market-small.png", - 'name':"Android Market", - 'img':"market-large.png", - 'title':"", - 'desc': "<p>Android Market helps you get your applications into the hands of users. The beta version of Market is now open and you can begin sharing your applications with users of the first Android-powered phone, the T-Mobile G1.</p><p><a href='http://market.android.com/publish/'>Publish your Android app on Market »</a></p>" - }, - 'devphone': { 'layout':"imgLeft", 'icon':"devphone-small.png", diff --git a/docs/html/intl/ja/community/index.jd b/docs/html/intl/ja/community/index.jd new file mode 100644 index 0000000..e0a645b --- /dev/null +++ b/docs/html/intl/ja/community/index.jd @@ -0,0 +1,108 @@ +community=true +page.title=コミュニティ +@jd:body + + <div id="mainBodyFluid"> + <h1>コミュニティ</h1> + <p>Android デベロッパー コミュニティへようこそ。コミュニティでのディスカッションにぜひ参加してください。投稿する前に、コミュニティ ガイドラインが記載されている<a href="http://source.android.com/discuss/android-discussion-groups-charter">グループの趣意</a>をお読みください。</p> + +<p class="note"><strong>注:</strong> Android ソース コード(アプリケーション開発ではなく)に関するディスカッションは、<a href="http://source.android.com/discuss">オープンソース プロジェクトのメーリング リスト</a>(英語)を参照してください。</p> + +<p style="margin-bottom:.5em"><strong>目次</strong></p> +<ol class="toc"> + <li><a href="#BeforeYouPost">質問を投稿する前に</a></li> + <li><a href="#ApplicationDeveloperLists">アプリケーション デベロッパー メーリング リスト</a></li> + <li><a href="#UsingEmail">メーリング リストにメールを使用</a></li> + <li><a href="#UsingIRC">IRC の使用</a></li> +</ol> + +<h2 id="BeforeYouPost">質問を投稿する前に</h2> +<p>投稿を作成する前に、下記をお試しください:</p> + +<ol> +<li><a href="{@docRoot}guide/appendix/faq/index.html">よくある質問を参照します</a>。Android アプリケーションの開発について非常に一般的な質問が、この一覧に記載されており、頻繁に更新されています。</li> +<li><strong>Android のメイン サイトの検索バー(このページの上部にあるのと同じもの)に、調べたいキーワードを入力してください</strong>。この検索は、サイト、ドキュメント、ブログに含まれるすべてのコンテンツの他に、すべてのグループで以前行われたすべてのディスカッションを網羅しています。誰か他の人が、以前にも同じ問題に遭遇した可能性は大いにあります。</li> +<li><b>メーリング リストのアーカイブを検索</b>して、同じ質問に関するディスカッションが既に存在しないか調べてください。 + </li> +</ol> + +<p>質問への答えが見つからない場合、コミュニティで質問することをおすすめします。投稿する際は、次の手順に従ってください。 +<ol> +<li>コミュニティ ガイドラインが記載されている<b><a href="http://sites.google.com/a/android.com/opensource/discuss/android-discussion-groups-charter">Android メーリングリストの趣意</a></b>をお読みください。 +</li> +<li><b>質問に最適なメーリング リストを選択してください</b>。後述するように、デベロッパー向けのメーリング リストは何種類かに分かれています。</li> +<li> + <b>質問の内容を明確に</b>。明確な質問は、回答者と、将来情報を探そうとする人の双方にとって有益です。</li> +<li><b>投稿は詳しく書いてください</b>。回答者の人たちが問題を理解するのに役立ちます。コードやログのスニペット、スクリーンショットへのリンクを含めることも有用です。質問をわかりやすく表現するための詳しいガイドラインは、<a href="http://www.catb.org/%7Eesr/faqs/smart-questions.html">賢い質問のしかた</a>(英語)をご覧ください。 + </li> +</ol> + + +<h3 id="ApplicationDeveloperLists">アプリケーション デベロッパー メーリング リスト</h3> +<ul> +<li><b>Android 初心者向け</b> - Android アプリケーションの開発初心者向けです。Android SDK と基本的な Android API の利用方法について学習したい場合は、このメーリング リストから始めてください。このメーリング リストには、SDK を利用するデベロッパーの初歩的なディスカッションの場所です。Android プラットフォームで初めてアプリケーションを作成して実行する際は、非常に有益な情報を得ることができるでしょう。開発環境のインストール方法についての質問を投稿したり、Android 開発の初歩(初めて作成するユーザー インターフェース、権限、Android ファイルシステムでのファイル、Android マーケットでのアプリケーションなど)について教えてもらうことができます。新たに質問する前に、必ず最初にアーカイブを確認してください。高度な内容の質問の場合はここでは質問せず、android-developers メーリング リストで質問してください。また使用に関する質問は、android-discuss メーリング リストの方が適しています。 +<ul> +<li>Google グループで登録: <a href="http://groups.google.com/group/android-beginners?hl=ja">android-beginners</a></li> +<li>メールで登録: <a href="mailto:android-beginners-subscribe@googlegroups.com">android-beginners-subscribe@googlegroups.com</a><a href="mailto:android-platform-subscribe@googlegroups.com"> </a></li> +</ul> +</li> + +<li><b>Android デベロッパー向け</b> - Android アプリケーション デベロッパーとして経験を積むにつれ、Android アプリケーション開発の基本を把握して、SDK を使いこなせるようになります。今度は、より高度な内容について質問する必要があります。アプリケーションのトラブルシューティング、実装へのアドバイス、アプリケーションのパフォーマンスやユーザー エクスペリエンスを改良するテクニックに関する質問には、次のメーリング リストが役立ちます。使用に関する問題(android-discuss をご利用ください)や、Android SDK を使用する際の初歩的質問(android-beginners をご利用ください)についてのディスカッションの場所ではありません。 +<ul> +<li>Google グループで登録: <a href="http://groups.google.com/group/android-developers?hl=ja">android-developers</a></li> +<li>メールで登録: <a href="mailto:android-developers-subscribe@googlegroups.com">android-developers-subscribe@googlegroups.com</a><a href="mailto:android-platform-subscribe@googlegroups.com"> </a></li> +</ul> +</li> + +<li><b>Android ディスカッション</b> - Android に関する「井戸端会議」です。ここでは、Android プラットフォームへのアイデア、自分のアプリケーションの公表、Android 携帯端末に関するディスカッション、コミュニティ リソースなど、Android に関することなら何でも投稿可能です。ただし他のメーリング リストに該当する内容の場合は、そのメーリング リストに投稿することをおすすめします。質問のテーマが限定されている場所の方が、より多くの回答を得ることができるでしょう。 +<ul> +<li>Google グループで登録: <a href="http://groups.google.com/group/android-discuss?hl=ja">android-discuss</a></li> +<li>メールで登録: <a href="mailto:android-discuss-subscribe@googlegroups.com">android-discuss-subscribe@googlegroups.com</a><a href="mailto:android-platform-subscribe@googlegroups.com"> </a></li> +</ul> +</li> + +<li><b>Android セキュリティ ディスカッション</b> - 安全な開発、新たに発生したセキュリティの問題、Android デベロッパー向けの Android デベロッパーによるベスト プラクティスについて自由にディスカッションを行える場所です。メーリング リストで脆弱性を直接公開することは、すべての Android ユーザーを危険にさらすことになるので、避けてください。 +<ul> +<li>Google グループで登録: <a href="http://groups.google.com/group/android-security-discuss?hl=ja">android-security-discuss</a></li> +<li>メールで登録: <a href="mailto:android-security-discuss@googlegroups.com">android-security-discuss@googlegroups.com</a><a href="mailto:android-platform-subscribe@googlegroups.com"> </a></li> +</ul> +</li> + +<li><b>Android セキュリティに関する発表</b> - Android セキュリティ チームがセキュリティ関連の発表を行う、小規模なグループです。 +<ul> +<li>Google グループで登録: <a href="http://groups.google.com/group/android-security-announce?hl=ja">android-security-announce</a></li> +<li>メールで登録: <a href="mailto:android-security-announce-subscribe@googlegroups.com">android-security-announce-subscribe@googlegroups.com</a> <a href="mailto:android-platform-subscribe@googlegroups.com"> </a></li> +</ul> +</li> + +<li><b>Android マーケット ヘルプフォーラム</b> - Android マーケットに関する質問や問題の報告をするための、ウェブベースのディスカッション フォーラムです。 +<ul> +<li>URL: <a href="http://www.google.com/support/forum/p/Android+Market?hl=ja">http://www.google.com/support/forum/p/Android+Market?hl=ja</a></li> +</ul> +</li> + +</ul> + + + +<h2 id="UsingEmail">メーリング リストにメールを使用</h2> +<p><a href="http://groups.google.com/">Google グループ</a> のサイトを使用する代わりに、メール クライアントを使用して、メーリング リストに投稿することも可能です。</p> +<p>Google グループのサイトを使用せずに、グループに登録するには、上記の「メールで登録」のリンクを使用します。</p> +<p>メーリング リストへの投稿をメールで受信するように設定する方法は、次のとおりです:</p> + +<ol><li>Google グループ サイトから、グループにログインします。たとえば android-framework グループには <a href="http://groups.google.com/group/android-framework?hl=ja">http://groups.google.com/group/android-framework?hl=ja</a> にアクセスします。</li> +<li>右側の [メンバーステータスを編集] をクリックします。</li> +<li>[このグループの閲覧方法] で、メール オプションのいずれかを選択します。 </li> +</ol> + +<h2 id="UsingIRC">IRC の使用</h2> +<p>Android コミュニティは irc.freenode.net サーバーの #android チャンネルを使用しています。 +</p> + + + + + + + +</div> diff --git a/docs/html/intl/ja/guide/basics/what-is-android.jd b/docs/html/intl/ja/guide/basics/what-is-android.jd new file mode 100644 index 0000000..89558a0 --- /dev/null +++ b/docs/html/intl/ja/guide/basics/what-is-android.jd @@ -0,0 +1,81 @@ +page.title=Android とは +@jd:body + +<p>Android は、オペレーティング システム、ミドルウェア、主要なアプリケーションを含む、携帯電話向けのソフトウェア スタックです。<a href="http://code.google.com/android/download.html">Android SDK</a> は、Java プログラミング言語を使用した Android プラットフォーム向けのアプリケーションの開発を始めるのに必要なツールと API を提供します。</p> + +<h2>特長</h2> + +<ul> + <li>コンポーネントの再利用と置換が可能な<strong>アプリケーション フレームワーク</strong></li> + <li>携帯電話用に最適化された <strong>Dalvik 仮想マシン</strong></li> + <li>オープンソース <a + href="http://webkit.org/">WebKit</a> エンジンをベースにした<strong>統合ブラウザ</strong> </li> + <li>カスタム 2D グラフィックス ライブラリと OpenGL ES 1.0 仕様に基づいた 3D グラフィックスにより提供される<strong>最適化されたグラフィックス</strong>(オプションのハードウェア アクセラレーション)</li> + <li><strong>SQLite</strong> による構造化データ ストレージ</li> + <li>音声、映像、静止画の一般的なフォーマット(MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF)に対する<strong>メディア サポート</strong></li> + <li><strong>GSM テレフォニー機能</strong>(ハードウェアに依存)</li> + <li><strong>Bluetooth、EDGE、3G、WiFi</strong>(ハードウェアに依存)</li> + <li><strong>カメラ、GPS、コンパス、加速度計</strong>(ハードウェアに依存)</li> + <li>デバイス エミュレータ、デバッグ用ツール、メモリとパフォーマンスの分析、Eclipse IDE 用プラグインを含む<strong>機能の豊富な開発環境</strong></li> +</ul> + +<a name="os_architecture" id="os_architecture"></a> +<h2>Android アーキテクチャ</h2> + +<p>Android オペレーティング システムの主なコンポーネントを次の図に示します。それぞれのセクションには、各コンポーネントの詳細が記述されています。</p> + +<p><img src="{@docRoot}images/system-architecture.jpg" alt="Android システム アーキテクチャ" width="713" height="512"></p> + +<a name="applications" id="applications"></a> +<h2>アプリケーション</h2> + +<p>Android には、メール クライアント、SMS プログラム、カレンダー、地図、ブラウザ、連絡先などのコア アプリケーションのセットが付属しています。アプリケーションはすべて Java プログラミング言語で作成されています。</p> + +<a name="application_framework" id="application_framework"></a> +<h2>アプリケーション フレームワーク</h2> + +<p>デベロッパーは、コア アプリケーションによって使用されるフレームワーク API のすべてにアクセスできます。アプリケーション アーキテクチャは、コンポーネントの再利用を容易にするように設計されています。このため、どのアプリケーションも機能を公開し、別のアプリケーションがその機能を使用することが可能です(ただし、フレームワークによって実施されるセキュリティ制限の対象となります)。このメカニズムによって、ユーザーによるコンポーネントの入れ替えも可能です。</p> + +<p>アプリケーションの基盤となるのは、次のサービスとシステムのセットです: +<ul> + <li>アプリケーションの構築を可能にする、拡張可能で豊富な<a + href="{@docRoot}guide/tutorials/views/index.html">ビュー</a>のセット。ビューには、リスト、グリッド、テキスト ボックス、ボタンだけでなく、埋め込み可能なウェブブラウザも含まれます。</li> + <li><a href="{@docRoot}guide/topics/providers/content-providers.html">コンテンツ プロバイダ</a>を使用すると、アプリケーションのデータ(たとえば、連絡先アプリケーション)に、別のアプリケーションからアクセスしたり、データを共有させることができます。</li> <li><a + href="{@docRoot}guide/topics/resources/resources-i18n.html">リソース マネージャ</a>は、ローカライズされた文字列、グラフィックス、レイアウト ファイルなどのコード以外のリソースへのアクセスを提供します。</li> + <li>{@link android.app.NotificationManager 通知マネージャ}を使用すると、すべてのアプリケーションからステータス バーにカスタマイズした警告を表示することができます。</li> + <li>{@link android.app.Activity アクティビティ マネージャ}は、アプリケーションのライフサイクルを管理し、共通のナビゲーション バックスタックを提供します。</li> +</ul> + +<p>アプリケーションの簡単な説明と詳細については、<a +href="{@docRoot}guide/tutorials/notepad/index.html">Notepad チュートリアル</a>をご覧ください。</p> + +<a name="libraries" id="libraries"></a> +<h2>ライブラリ</h2> + +<p>Android には C/C++ ライブラリのセットが含まれており、Android システムのさまざまなコンポーネントにおいて使用されています。これらの機能は、Android アプリケーション フレームワークを介して、デベロッパーに公開されています。コア ライブラリの一部を次に示します:</p> +<ul> + <li><strong>システム C ライブラリ</strong> - BSD による実装をベースにした標準の C システム ライブラリ(libc)です。埋め込み Linux ベースのデバイス用に最適化されています。</li> + <li><strong>メディア ライブラリ</strong> - PacketVideo の OpenCORE をベースにしたライブラリです。MPEG4、H.264、MP3、AAC、AMR、JPG、PNG などの多くの一般的な映像と音声のフォーマットと、静止画ファイルの再生と記録をサポートしています。</li> + <li><strong>サーフェス マネージャ</strong> - 表示サブシステムへのアクセスを管理し、複数のアプリケーションからの 2D と 3D のグラフィック レイヤーをシームレスに合成します。</li> + <li><strong>LibWebCore</strong> - 最新式のウェブブラウザ エンジンで、Android ブラウザと埋め込み可能な Web 表示の両方を提供します。</li> + <li><strong>SGL</strong> - ベースとなる 2D グラフィックス エンジンです。</li> + <li><strong>3D ライブラリ</strong> - OpenGL ES 1.0 API をベースとして実装されたライブラリです。ハードウェア 3D アクセラレーション(可能な場合)か、高度に最適化された埋め込みの 3D ソフトウェア ラスタライザのいずれかを使用します。</li> + <li><strong>FreeType</strong> - ビットマップ フォントやベクタ フォントのレンダリングを行います。</li> + <li><strong>SQLite</strong> - すべてのアプリケーションで利用可能な強力で軽量のリレーショナル データベース エンジンです。</li> +</ul> + +<a name="runtime" id="runtime"></a> + +<h2>Android ランタイム</h2> + +<p>Android には、Java プログラミング言語のコア ライブラリで利用できる機能のほとんどを提供するコア ライブラリのセットが含まれています。</p> + +<p>Android の各アプリケーションは、独自のプロセスとして実行され、Dalvik 仮想マシン(VM)の独自のインスタンスにより実行されます。Dalvik は、携帯電話で複数の VM を効率よく実行できるように設計されています。Dalvik VM は、メモリの使用量を最小にするように最適化された Dalvik 実行可能(.dex)フォーマットのファイルを実行します。この VM はレジスタベースであり、Java 言語コンパイラによりコンパイルされた組み込みの「dx」ツールにより .dex フォーマットに変換されたクラスを実行します。</p> + +<p>Dalvik VM は、Linux カーネルを使用して、スレッディングや低レベルのメモリ管理などの基本機能を実行しています。</p> + +<a name="kernel" id="kernel"></a> + +<h2>Linux カーネル</h2> + +<p>Android は、Linux バージョン 2.6 を使用して、セキュリティ、メモリ管理、プロセス管理、ネットワーク スタック、ドライバ モデルなどのコア システム サービスを提供します。このカーネルは、ハードウェアと他のソフトウェア スタックの間の抽象化レイヤーとしても機能します。</p> diff --git a/docs/html/intl/ja/guide/developing/eclipse-adt.jd b/docs/html/intl/ja/guide/developing/eclipse-adt.jd new file mode 100644 index 0000000..26cae54 --- /dev/null +++ b/docs/html/intl/ja/guide/developing/eclipse-adt.jd @@ -0,0 +1,243 @@ +page.title=Eclipse 内で ADT を使用 +@jd:body + +<div id="qv-wrapper"> + <div id="qv"> + <h2>このドキュメントの内容</h2> + <ol> + <li><a href="#CreatingAProject">Android プロジェクトの作成</a></li> + <li><a href="#Running">アプリケーションの実行</a> + <ol> + <li><a href="#CreatingAnAvd">AVD の作成</a></li> + <li><a href="#RunningAnApplication">アプリケーションの実行</a></li> + </ol> + </li> + <li><a href="#RunConfig">カスタム起動構成の作成</a></li> + <li><a href="#Signing">アプリケーションの署名設定</a></li> + <li><a href="#Tips">Eclipse のヒント</a></li> + </div> +</div> + + +<p>「Android Development Tools (ADT) plugin for Eclipse」は、Eclipse 統合開発環境に強力な拡張機能を追加します。拡張機能により、Android アプリケーションの作成とデバッグが容易になります。Eclipse を使用している場合、ADT プラグインを組み込むことで、Android アプリケーションを驚くほど効率よく開発できるようになります:</p> + +<ul> + <li>Eclipse 総合開発環境内から、他の Android 開発ツールにもアクセスできます。たとえば ADT では、DDMS ツールの多くの機能が利用できます。Eclipse からスクリーンショットの撮影、ポート転送の管理、ブレークポイントの設定、スレッドやプロセスの情報の表示を直接行うことが可能です。</li> + <li>Android 開発用の新たなプロジェクト ウィザードが追加されます。それを使用して、新しい Android アプリケーションに必要な基本ファイルをすべて簡単に作成してセットアップできます。</li> + <li>Android アプリケーションのビルド プロセスを自動化と単純化できます。</li> + <li>同梱の Android コード エディタを使用して、Android のマニフェスト ファイルとリソース ファイルの適切な XML をスムーズに作成できます。</li> + <li>プロジェクトを、ユーザーに配布可能な署名済みの APK 形式でエクスポートすることもできます。</li> +</ul> + +<p>ADT を組み込んだ Eclipse 総合開発環境で Android アプリケーションの開発を始めるには、最初に Eclipse 総合開発環境をダウンロードしてから、ADT プラグインをダウンロードしてインストールする必要があります。そのためには、<a href="{@docRoot}sdk/{@sdkCurrent}/installing.html#installingplugin">Eclipse 用 ADT プラグインのインストール</a>に記載されている手順どおりに操作します。</p> +<p>バージョン 0.9 より前の ADT を使用してアプリケーションを既に開発中の場合は、必ず最新バージョンにアップグレードしてから続行してください。<a href="{@docRoot}sdk/{@sdkCurrent}/upgrading.html#UpdateAdt">Eclipse ADT プラグインをアップデート</a>するためのガイドをご覧ください。</p> +<p class="note"><strong>注:</strong> このガイドでは、ADT プラグインの最新バージョンを使用していることを前提としています。説明の大半は、以前のバージョンにも当てはまりますが、以前のバージョンを使用している場合は、このドキュメントのオンライン版ではなく、SDK パッケージに付属された資料内の同ドキュメントをご覧ください。</p> + + +<h2 id="CreatingAProject">Android プロジェクトの作成</h2> + +<p>ADT プラグインが提供する新規プロジェクト ウィザードを使用すると、簡単に Android プロジェクトを新規作成(または既存のコードから作成)できるようになります。新しいプロジェクトを作成するには: </p> + +<ol> + <li>[<strong>ファイル(File)</strong>] > [<strong>新規(New)</strong>] > [<strong>プロジェクト(Project)</strong>] を選択します。</li> + <li>[<strong>Android</strong>] > [<strong>Android プロジェクト(Android Project)</strong>] を選択し、[<strong>次へ(Next)</strong>] をクリックします。</li> + <li>プロジェクトの内容を選択します: + <ul> + <li>プロジェクト名を入力します。<em></em>これはそのプロジェクトが作成されるフォルダの名前になります。</li> <li>[内容(Contents)] セクションで、[<strong>ワークスペース内に新規プロジェクトを作成(Create new project in workspace</strong>] を選択します。プロジェクト ワークスペースのロケーションを選択します。</li> + <li>[ターゲット(Target)] タブで、プロジェクトの [ビルド ターゲット(Build Target)] として使用する Android ターゲットを選択します。このビルド ターゲットは、アプリケーションをビルドする Android プラットフォームを指定します。 + <p>最新の SDK に導入されている新しい API を使用することがわかっている場合を除き、Android 1.1 などの最も古いバージョンのターゲット (Target Name) を選択してください。</p> + <p class="note"><strong>注:</strong> プロジェクトのビルド ターゲットはいつでも変更できます。変更するには、[パッケージ エクスプローラー(Package Explorer)] でプロジェクトを右クリックし、[<strong>プロパティ(Properties)</strong>] を選択し、[<strong>Android</strong>] を選択して、指定するプロジェクト ターゲットのチェックボックスをオンにします。</p> + </li> + <li>[プロパティ(Properties)] セクションで、必要なすべてのフィールドに入力します。 + <ul> + <li>アプリケーション名 (Application name) を入力します。<em></em>アプリケーション名はユーザーにわかりやすいアプリケーションのタイトルにします。この名前が Android 携帯端末に表示されます。</li> + <li>パッケージ名 (Package name) を入力します。<em></em>これは(Java プログラミング言語でのパッケージのルールに従った)パッケージの名前空間であり、作成するソース コードはすべてこの中に含まれます。</li> + <li>[Activity を作成(Create Activity)] を選択し(オプションですが、一般的な手順です)、メインの Activity クラスの名前を入力します。<em></em></li> + <li>[SDK の最小バージョン(Min SDK Version)] を入力します。<em></em>これは、そのアプリケーションを正常に実行するために必要となる API の最小レベルを示す番号です。ここで入力すると、<code>minSdkVersion</code> 属性が Android マニフェスト ファイルの <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><uses-sdk></a> に自動的に設定されます。使用する適切な API レベルがわからない場合は、ビルド ターゲット(Build Target)にリストされている API レベル(API Level)をコピーします。</li> + </ul> + </li> + </ul> + </li> + <li>[<strong>完了(Finish)</strong>] をクリックします。</li> +</ol> + +<p class="note"><strong>ヒント:</strong> 新規プロジェクト ウィザードは、ツールバーの [新規(New)] アイコンからも開始できます。<em></em></p> + +<p>新規プロジェクト ウィザードを完了すると、ADT は新しいプロジェクトに次のフォルダとファイルを作成します:</p> + <dl> + <dt><code>src/</code></dt> + <dd>スタブ Activity Java ファイルが含まれます。アプリケーションの他のすべての Java ファイルも含まれます。</dd> + <dt><code><em><Android Version></em>/</code>(例: <code>Android 1.1/</code>)</dt> + <dd>アプリケーションのビルド対象となる <code>android.jar</code> ファイルが含まれます。これは、新規プロジェクト ウィザードで選択したビルド ターゲットによって決まります。<em></em></dd> + <dt><code>gen/</code></dt> + <dd>ADT により生成された Java ファイル(<code>R.java</code> ファイル、AIDL ファイルから作成されたインターフェースなど)がこのフォルダに含まれます。</dd> + <dt><code>assets/</code></dt> + <dd>このフォルダは空です。未加工のアセット ファイルの保存に使用できます。<a href="{@docRoot}guide/topics/resources/index.html">Resources and Assets</a>をご覧ください。</dd> + <dt><code>res/</code></dt> + <dd>アプリケーションのリソース用(描画ファイル、レイアウト ファイル、文字列値など)のフォルダです。<a href="{@docRoot}guide/topics/resources/index.html">Resources and Assets</a>をご覧ください。</dd> + <dt><code>AndroidManifest.xml</code></dt> + <dd>このプロジェクトの Android マニフェストです。<a href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a>をご覧ください。</dd> + <dt><code>default.properties</code></dt> + <dd>このファイルには、ビルド ターゲットのようなプロジェクトの設定が含まれます。このファイルはプロジェクトに不可欠なので、ソース リビジョン管理システムで管理する必要があります。このファイルを手動で編集しないでください。プロジェクトのプロパティを編集するには、プロジェクト フォルダを右クリックして、[プロパティ(Properties)] を選択します。</dd> + </dl> + + +<h2 id="Running">アプリケーションの実行</h2> + +<p>注意してください。<em></em>アプリケーションを Android エミュレータで実行する前に、Android 仮想デバイス(AVD)を作成する<strong>必要があります</strong>。AVD では、エミュレータで使用する Android プラットフォームを指定します。詳しくは <a href="{@docRoot}guide/developing/tools/avd.html">Android 仮想デバイス</a> のドキュメントをご覧ください。ただし、すぐにアプリケーションを実行したい場合は、次の簡単な手順に従って AVD を作成してください。</p> + +<p>携帯端末の実機でのみアプリケーションを実行する場合は、AVD は必要ありません。この場合のアプリケーションの実行について詳しくは、<a href="{@docRoot}guide/developing/device.html">Developing On a Device</a> をご覧ください。</p> + +<h3 id="CreatingAnAvd">AVD の作成</h3> + +<p>詳しい説明はこのドキュメントの範囲外なので、AVD を作成する基本的な手順のみをここに示します:</p> + +<ol> + <li>コマンドライン(たとえば Windows では「コマンド プロンプト」アプリケーション、Mac/Linux では「ターミナル」)を開き、SDK パッケージの <code>tools/</code> ディレクトリに移動します。</li> + <li>最初に、配備ターゲットを選択する必要があります。選択可能なターゲットを表示するには、次のコマンドを実行します: + <pre>android list targets</pre> + <p>次のように選択可能な Android ターゲットのリストが表示されます:</p> +<pre> +id:1 + Name: Android 1.1 + Type: platform + API level: 2 + Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P +id:2 + Name: Android 1.5 + Type: platform + API level: 3 + Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P +</pre> + <p>アプリケーションを実行する Android プラットフォームに一致するターゲットを探します。<code>id</code> の整数を書き留めておき、次のステップで使用します。</p> + </li> + <li>選択した配備ターゲットを使用して、新しい AVD を作成します。次のコマンドを実行します: + <pre>android create avd --name <em><your_avd_name></em> --target <em><targetID></em></pre> + <li>カスタム ハードウェア プロファイルを作成するかどうかの問い合わせがあります。「yes」と答えると、携帯端末ハードウェアのさまざまな要素を定義するための一連のプロンプトが開始されます(空白のまま入力すると、かっこ内に表示されたデフォルト値が使用されます)。または、Enter キーを押すと、すべてデフォルト値が使用されます(「no」がデフォルトです)。</li> + </li> +</ol> + +<p>これで AVD が作成できました。次のセクションでは、エミュレータでアプリケーションを起動する際に、AVD がどのように使用されるかについて説明します。</p> + +<p>AVD の作成と管理について詳しくは、<a href="{@docRoot}guide/developing/tools/avd.html">Android 仮想デバイス</a> のドキュメントをご覧ください。</p> + + +<h3 id="RunningYourApplication">アプリケーションの実行</h3> + +<p class="note"><strong>注:</strong> アプリケーションを実行する前に、アプリケーションのビルド ターゲットを満たすターゲットを指定した AVD を必ず作成してください。ビルド ターゲットの要件を満たす AVD が見つからない場合、それを示すコンソール エラーが表示され、起動は中止されます。</p> + +<p>アプリケーションを実行(またはデバッグ)するには、Eclipse のメイン メニューで [<strong>実行(Run)</strong>] > [<strong>実行(Run)</strong>](または [<strong>実行(Run)</strong>] > [<strong>デバッグ(Debug)</strong>])を選択します。ADT プラグインはそのプロジェクトのデフォルトの起動構成を自動的に作成します。</p> + +<p>アプリケーションの実行またはデバッグを選択すると、Eclipse では以下が行われます:</p> + +<ol> + <li>プロジェクトがコンパイルされます(最後のビルド以降、変更があった場合)。</li> + <li>デフォルトの起動構成が作成されます(そのプロジェクトでまだ作成されていない場合)。</li> + <li>エミュレータまたは端末(起動構成で定義された配備ターゲットに基づきます)にアプリケーションがインストールされ、起動されます。 + <p>デフォルトでは、Android アプリケーションの起動構成ではデバイス ターゲットの選択に「自動ターゲット」モードを使用します。自動ターゲット モードでの配備ターゲットの選択について詳しくは、下記の<a href="#AutoAndManualTargetModes">自動または手動のターゲット モード</a>をご覧ください。</p> + </li> +</ol> + +<p>デバッグの場合は、アプリケーションは「デバッガ待ち」モードで開始されます。デバッガの接続後、Eclipse はデバッグ パースペクティブを開きます。</p> + +<p>プロジェクトで使用する起動構成を設定または変更するには、構成マネージャを使用します。詳しくは<a href="#launchconfig">起動構成の作成</a>をご覧ください。</p> + + +<h2 id="RunConfig">起動構成の作成</h2> + +<p>起動構成では、実行するプロジェクト、開始する Activity、使用するエミュレータ オプションなどを指定します。プロジェクトを初めて Android アプリケーションとして実行すると、ADT は自動的に起動構成を作成します。<em></em>デフォルトの起動構成は、デフォルトのプロジェクト アクティビティを起動し、自動ターゲット モードで端末を選択します(優先 AVD が指定されていない場合)。デフォルト設定がプロジェクトに適さない場合は、起動構成をカスタマイズするか、新規作成することができます。</p> + +<p>起動構成を作成または変更するには、使用している Eclipse のバージョンに合わせて、次の手順どおりに操作します:</p> + +<ol> + <li>構成マネージャを開きます。 + <ul> + <li>Eclipse 3.3(Europa)では、[<strong>実行(Run)</strong>] > [<strong>実行ダイアログを開く(Open Run Dialog)</strong>](または [<strong>デバッグ ダイアログを開く(Open Debug Dialog)</strong>])を選択します。 + </li> + <li>Eclipse 3.4(Ganymede)では、[<strong>Run(実行)</strong>] > [<strong>実行の構成(Run Configurations)</strong>](または [<strong>デバッグの構成(Debug Configurations)</strong>])を選択します。 + </li> + </ul> + </li> + <li>[<strong>Android アプリケーション(Android Application)</strong>] 項目を展開し、新しい構成を作成するか、既存の構成を開きます。 + <ul> + <li>新しい構成を作成するには: + <ol> + <li>[<strong>Android アプリケーション(Android Application)</strong>] を選択し、<em></em>リストの上にある 新規起動の構成(New launch configuration) アイコンをクリックします(または [<strong>Android アプリケーション(Android Application)</strong>] を右クリックして、[<strong>新規(New)</strong>] をクリックします)。</li> + <li>この構成の名前を入力します。</li> + <li>[Android] タブで、この構成を使用して実行するプロジェクトを参照し、選択します。</li> + </ol> + <li>既存の構成を開くには、[<strong>Android アプリケーション(Android Application)</strong>] の下にネストされているリストからその構成名を選択します。</li> + </ul> + </li> + <li>必要に応じて起動構成の設定を変更します。 + <p>[ターゲット(Target)] タブでは、アプリケーションを実行する AVD の選択を手動(Manual)モードで行うか、自動(Automatic)モードで行うかを考えます(次の<a href=#AutoAndManualModes">自動または手動のターゲット モード</a>のセクションをご覧ください)。</p> + </li> +</ol> + + +<h3 id="AutoAndManualTargetModes">自動または手動のターゲット モード</h3> + +<p>デフォルトでは、起動構成には、<strong>自動</strong>ターゲット モードで選択された AVD が使用されます。このモードでは、ADT は次の方法により、アプリケーションの AVD を選択します:</p> + +<ol> + <li>既に実行中の端末またはエミュレータがあり、その AVD 構成がアプリケーションのビルド ターゲットの要件を満たす場合は、その端末またはエミュレータにアプリケーションがインストールされ、実行されます。</li> + <li>端末またはエミュレータが複数実行中の場合は、そのうちのビルド ターゲットの要件を満たすものが「デバイス選択(Device Chooser)」に表示されるので、その中から選択できます。</li> + <li>ビルド ターゲットの要件を満たす実行中の端末やエミュレータがない場合は、ADT は使用可能な AVD を調べます。ビルド ターゲットの要件を満たす AVD があれば、その AVD を使用して新しいエミュレータが起動され、そこにアプリケーションがインストールされ、実行されます。</li> + <li>上記を満たすものがない場合は、アプリケーションは実行されず、ビルド ターゲット要件を満たす既存の AVD がないというエラーがコンソールに表示されます。</li> +</ol> + +<p>ただし起動構成で「優先 AVD」が選択されている場合は、アプリケーションは常にその AVD に配備されます。<em></em>その AVD がまだ実行されていない場合は、新しいエミュレータが起動されます。</p> +<p>起動構成が<strong>手動</strong>モードの場合は、アプリケーションを実行するたびに、「Device Chooser」が表示されるので、使用する AVD を選択できます。</p> + +<h2 id="Signing">アプリケーションへの署名</h2> + +<p>Android アプリケーションの開発を始めると、Android アプリケーションをシステムがエミュレータや実機にインストールする前に、どの Android アプリケーションにもデジタル署名が必要であることがわかります。署名には、デバッグ キーを使用する方法(エミュレータや開発用端末ですぐにテストする場合)と、非公開キーを使用する方法(アプリケーションを配布する場合)の 2 つがあります。</p> +<p>ADT プラグインでは、アプリケーションをエミュレータや開発用端末にインストールする前に、.apk ファイルがデバッグ キーを使用して署名されるので、開発を早めることができます。つまり、独自の非公開キーを生成する必要がなく、Eclipse からアプリケーションをすぐに実行できます。Keytool に ADT がアクセスできれば、デベロッパーが特に操作する必要はありません。ただし、アプリケーションを公開する場合は、SDK ツールが生成するデバッグ キーではなく、独自の非公開キーを使用してアプリケーションに署名する<strong>必要があります</strong>。</p> +<p><a href="{@docRoot}guide/publishing/app-signing.html">アプリケーションへの署名</a>をご覧ください。Android でのアプリケーションへの署名と、Android アプリケーション デベロッパーにとっての署名の意味について説明しています。このドキュメントには、ADT のエクスポート ウィザードを使用してアプリケーションをエクスポートし、署名するためのガイドも含まれています。</p> + +<h2 id="Tips">Eclipse のヒント </h2> + +<h3 id="arbitraryexpressions">Eclipse での任意の Java コードの実行</h3> + +<p>Eclipse のブレークポイントで中断したとき、任意のコードを実行できます。たとえば「zip」という文字列引数を使用する関数では、パッケージと呼び出しクラスのメソッドに関する情報を取得できます。任意の静的メソッドを呼び出すこともできます。たとえば <code>android.os.Debug.startMethodTracing()</code> と入力すると、dmTrace が起動されます。 </p><p>コードの実行ウィンドウを開き、メイン メニューから [<strong>ウィンドウ(Window)</strong>] > [<strong>ビューの表示(Show View)</strong>] > [<strong>表示(Display)</strong>] を選択すると、簡単なテキスト エディタである [表示(Display)] ウィンドウが開きます。式を入力し、そのテキストをハイライト表示し、'J' アイコンをクリックして(または Ctrl+Shift+D キーを押して)そのコードを実行します。コードは、選択したスレッド(ブレークポイントまたはシングルステップ ポイントで停止している必要があります)のコンテキストで実行されます(手動でスレッドを強制停止した場合は、シングルステップを 1 回実行する必要があります。スレッドが Object.wait() 状態の場合は、上記を実行できません)。</p><p>現在、ブレークポイントで中断している場合は、ソース コードの一部をハイライト表示し、Ctrl+Shift+D キーを押して実行することができます。 </p><p>同じスコープ内のテキストの一部をハイライト表示するには、Alt+Shift+上矢印キーを押して、より広い範囲の閉じたブロック(複数可)を選択するか、下矢印キーを押して選択範囲を小さくすることができます。 </p><p>Eclipse で [表示(Display)] ウィンドウを使用した入力とその応答のサンプルを次に示します。</p> + +<table width="100%" border="1"> + <tr> + <th scope="col">入力</th> + <th scope="col">応答</th> + </tr> + <tr> + <td><code>zip</code></td> + <td><code>(java.lang.String) + /work/device/out/linux-x86-debug/android/app/android_sdk.zip</code></td> + </tr> + <tr> + <td><code>zip.endsWith(".zip")</code></td> + <td><code>(boolean) true</code></td> + </tr> + <tr> + <td><code>zip.endsWith(".jar")</code></td> + <td><code>(boolean) false</code></td> + </tr> +</table> +<p>デバッガではなくスクラップブック ページを使用しても、任意のコードを実行できます。Eclipse ドキュメントで「スクラップブック」を検索してください。</p> + +<h3>DDMS の手動による実行</h3> + +<p>ADT プラグインを使用するデバッグをおすすめしますが、手動で DDMS を実行し、ポート 8700 でデバッグするように Eclipse を設定することができます(<strong>注:</strong> 最初に必ず <a href="{@docRoot}guide/developing/tools/ddms.html">DDMS</a> を起動してください)。 </p> + +<!-- TODO: clean this up and expand it to cover more wizards and features +<h3>ADT Wizards</h3> + +<p>Notice that the "New Android Project" wizard has been expanded to use the multi-platform +capabilities of the new SDK.</p> + +<p>There is now a "New XML File" wizard that lets you create skeleton XML resource +files for your Android projects. This makes it easier to create a new layout, a new menu, a +new strings file, etc.</p> + +<p>Both wizards are available via <strong>File > New</strong> and new icons in the main +Eclipse toolbar (located to the left of the Debug and Run icons). +If you do not see the new icons, you may need to select <strong>Window > Reset +Perspective</strong> from the Java perspective.</p> +--> diff --git a/docs/html/intl/ja/guide/developing/other-ide.jd b/docs/html/intl/ja/guide/developing/other-ide.jd new file mode 100644 index 0000000..2983da2 --- /dev/null +++ b/docs/html/intl/ja/guide/developing/other-ide.jd @@ -0,0 +1,271 @@ +page.title=その他の統合開発環境 +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + <h2>このドキュメントの内容</h2> + <ol> + <li><a href="#CreatingAProject">Android プロジェクトの作成</a></li> + <li><a href="#Signing">アプリケーションへの署名の準備</a></li> + <li><a href="#Building">アプリケーションのビルド</a> + <ol> + <li><a href="#DebugMode">デバッグ モードでのビルド</a></li> + <li><a href="#ReleaseMode">リリース モードでのビルド</a></li> + </ol> + </li> + <li><a href="#Running">アプリケーションの実行</a></li> + <li><a href="#AttachingADebugger">アプリケーションへのデバッガの接続</a></li> + </ol> + + <h2>関連項目</h2> + <ol> + <li><a href="{@docRoot}guide/developing/tools/othertools.html#android">android ツール</a></li> + <li><a href="{@docRoot}guide/developing/tools/emulator.html">Android Emulator</a></li> + <li><a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a></li> + </ol> +</div> +</div> + +<p>Android アプリケーションの開発では、<a href="{@docRoot}guide/developing/eclipse-adt.html">ADT プラグイン搭載の Eclipse</a> を使用する開発方法が推奨されています。ADT プラグインは、編集、ビルド、デバッグ、.apk パッケージング、署名の機能を統合開発環境に直接統合して提供します。</p> + +<p>しかし Eclipse の代わりに IntelliJ のような別の総合開発環境や Emacs のような基本的なエディタを使用した開発も可能です。SDK には Android プロジェクトのセットアップ、ビルド、デバッグ、および配布用パッケージ作成に必要なすべてのツールが含まれています。このドキュメントでは、こうしたツールの使用方法について説明します。</p> + + +<h2 id="EssentialTools">主要なツール</h2> + +<p>Eclipse 以外の統合開発環境やエディタで開発する際には、次の Android SDK ツールについて知っておく必要があります:</p> + +<dl> + <dt><a href="{@docRoot}guide/developing/tools/othertools.html#android">android</a></dt> + <dd>Android プロジェクトの作成/更新、AVD の作成/移動/削除のために使用します。</dd> + <dt><a href="{@docRoot}guide/developing/tools/emulator.html">Android Emulator</a></dt> + <dd>Android のエミュレーション プラットフォームで Android アプリケーションを実行するために使用します。</dd> + <dt><a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a></dt> + <dd>エミュレータまたは接続先の端末とのインターフェースとして使用します(アプリケーションのインストール、端末のシェル、コマンドの実行などに使用)。 + </dd> +</dl> + +<p>上記のツールに加えて、SDK に含まれている次のオープンソースとおよびサードパーティ製のツールを使用します:</p> + +<dl> + <dt>Ant</dt> + <dd>Android プロジェクトをコンパイルし、インストール可能な .apk ファイルにビルドするために使用します。</dd> + <dt>Keytool</dt> + <dd>.apk ファイルに署名するために使用するキーストアと非公開キーを生成します。</dd> + <dt>Jarsigner(または同様の署名ツール)</dt> + <dd>Keytool で生成した非公開キーを使って .apk ファイルに署名するために使用します。</dd> +</dl> + +<p>下記のトピックでは、必要な箇所でそれぞれの各ツールを説明しています。さらに高度な操作については、ツールのそれぞれのドキュメントをご覧ください。</p> + + +<h2 id="CreatingAProject">Android プロジェクトの作成</h2> + +<p>Android プロジェクトを作成するには、<code>android</code> ツールを使用する必要があります。新しいプロジェクトを <code>android</code> で作成すると、デフォルトのアプリケーション ファイル、スタブ ファイル、構成ファイル、ビルド ファイルを含むプロジェクト ディレクトリが生成されます。</p> + + +<h3 id="CreatingANewProject">新しいプロジェクトの作成</h3> + +<p>新しいプロジェクトを開始する場合、<code>android create project</code> コマンドを使用すると、必要なファイルとフォルダがすべて生成されます。</p> + +<p>新しい Android プロジェクトを作成するには、コマンドラインを開き、SDK の <code>tools/</code> ディレクトリに移動して、次を実行します:</p> +<pre> +android create project \ +--target <em><targetID></em> \ +--path <em>/path/to/your/project</em> \ +--activity <em><your_activity_name></em> \ +--package <em><your_package_namespace></em> +</pre> + +<ul> + <li><code>target</code> は、アプリケーションの「ビルド ターゲット」です。これは、プロジェクトをビルドする Android プラットフォーム ライブラリ(Google API のようなアドオンも含まれます)に対応します。使用可能なターゲットとそれに対応する ID の一覧を表示するには、<code>android list targets</code> を実行します。</li> + <li><code>path</code> は、プロジェクト ディレクトリのロケーションです。このディレクトリが存在しない場合は、自動的に作成されます。</li> + <li><code>activity</code> は使用する {@link android.app.Activity} クラスの名前です。このクラス ファイルは <code><em><path_to_your_project></em>/src/<em><your_package_namespace_path></em>/</code> 内に作成されます。</li> + <li><code>package</code> はプロジェクトのパッケージ名前空間であり、Java プログラミング言語でのパッケージと同じルールに従います。</li> +</ul> + +<p>次に例を示します:</p> +<pre> +android create project \ +--target 1 \ +--path ./myProject \ +--activity MyActivity \ +--package com.example.myproject +</pre> + +<p>このツールは次のファイルとディレクトリを生成します:</p> + +<ul> + <li><code>AndroidManifest.xml</code> - アプリケーションのマニフェスト ファイル。指定したプロジェクトの Activity クラスと同期されます。</li> + <li><code>build.xml</code> - Ant 用のビルド ファイルです。</li> + <li><code>default.properties</code> - ビルド システム用のプロパティです。このファイルを変更しないでください。<em></em></li> + <li><code>build.properties</code> - ビルド システム用のカスタマイズ可能なプロパティです。このファイルを編集して、Ant が使用するデフォルトのビルド設定をオーバーライドできます。</li> + <li><code>src<em>/your/package/namespace/ActivityName</em>.java</code> - プロジェクトの作成時に指定した Activity クラスです。</li> + <li><code>bin/</code> - ビルド スクリプト用の出力ディレクトリです。</li> + <li><code>gen/</code> - <code>Ant</code> が生成するファイル(<code>R.java</code> など)が含まれます。 </li> + <li><code>libs/</code> - プライベート ライブラリが含まれます。</li> + <li><code>res/</code> - プロジェクト リソースが含まれます。</li> + <li><code>src/</code> - ソース コードが含まれます。</li> + <li><code>tests/</code> - テスト用に、上記のすべての複製が含まれます。</li> +</ul> + +<p>プロジェクトを作成すると、開発を始める準備ができます。開発のために、プロジェクト フォルダをどこにでも移動できますが、アプリケーションをエミュレータに送信するために(方法については後述します)、SDK の <code>tools/</code> ディレクトリにある <a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a>(adb)を使用する必要があります。そのためにプロジェクト ソリューションと <code>tools/</code> フォルダ間でアクセスする必要があります。</p> + +<p class="warning"><strong>注:</strong> SDK ディレクトリは移動させないでください。移動するとビルド スクリプトが機能しなくなります(ビルド スクリプトをもう一度機能させるには、手動でスクリプトを更新して、SDK の新しいロケーションを反映させる必要があります)。</p> + + +<h3 id="UpdatingAProject">プロジェクトの更新</h3> + +<p>Android SDK の古いバージョンからプロジェクトをアップグレードする場合や、既存のコードから新しいプロジェクトを作成する場合は、<code>android update project</code> コマンドを使って新しい開発環境に合わせてプロジェクトを更新します。このコマンドを使って(<code>--target</code> オプションにより)、既存のプロジェクトのビルド ターゲットを修正することもできます。<code>android</code> ツールは、指定された Android プロジェクトの必要に応じて、欠落している、または更新を必要としているファイルやフォルダの生成を行います。生成物は前セクションに記述されたリストどおりです。</p> + +<p>既存の Android プロジェクトを更新するには、コマンドラインを開き、SDK の <code>tools/</code> ディレクトリに移動します。ここで次を実行します:</p> +<pre> +android update project --target <em><targetID></em> --path <em>path/to/your/project/</em> +</pre> + +<ul> + <li><code>target</code> は、アプリケーションの「ビルド ターゲット」です。これは、プロジェクトをビルドする Android プラットフォーム ライブラリ(Google API のようなアドオンも含まれます)に対応します。使用可能なターゲットとそれに対応する ID の一覧を表示するには、<code>android list targets</code> を実行します。</li> + <li><code>path</code> は、プロジェクト ディレクトリのロケーションです。</li> +</ul> + +<p>次に例を示します:</p> +<pre> +android update project --target 2 --path ./myProject +</pre> + + +<h2 id="Signing">アプリケーションへの署名の準備</h2> + +<p>Android アプリケーションの開発を始めると、Android アプリケーションをエミュレータや端末上のシステムにインストールする前に、どの Android アプリケーションにもデジタル署名が必要であることがわかります。解決策としては「デバッグ キー」を使用する方法(エミュレータや開発用端末上ですぐにテストする場合)と、非公開キーを使用する方法(アプリケーションを配布する場合)の 2 つがあります。<em></em><em></em></p> + +<p>Android のビルド ツールを使用すると、ビルド時にデバッグキーを使用して .apk ファイルに自動的に署名できるので、スムーズな開発が可能です。つまり、独自の非公開キーを生成しなくても、アプリケーションをコンパイルして、エミュレータにインストールすることができます。ただし、アプリケーションを公開する場合は、SDK ツールが生成したデバッグ キーではなく、独自の非公開キーを使用してアプリケーションに署名する<strong>必要があります</strong>。 </p> + +<p><a href="{@docRoot}guide/publishing/app-signing.html">アプリケーションへの署名</a>をご覧ください。Android でのアプリケーションへの署名と、Android アプリケーション デベロッパーにとっての署名の意味について説明しています。</p> + + + +<h2 id="Building">アプリケーションのビルド</h2> + +<p>アプリケーションのビルドには、アプリケーションをテスト/デバッグするための「デバッグ モード」と、リリース用の最終パッケージをビルドするための「リリース モード」の 2 つがあります。<em></em><em></em>前のセクションで説明したように、アプリケーションをエミュレータや端末にインストールする前に、アプリケーションに署名する必要があります。</p> + +<p>デバッグ モードとリリース モードのどちらでビルドしているかに関係なく、プロジェクトをコンパイルし、ビルドするには Ant ツールが必要です。これにより、エミュレータや端末にインストールする .apk ファイルが作成されます。デバッグ モードでビルドすると、.apk ファイルは SDK ツールによりデバッグ キーを使用して自動的に署名されるので、インストールの準備がすぐに整います(ただし、エミュレータまたは接続された開発用端末上にのみインストールできます)。リリース モードでビルドされた .apk ファイルは署名されないので、Keytool と Jarsigner を使って、独自の非公開キーで手動で署名する必要があります。<em></em></p> + +<p><a href="{@docRoot}guide/publishing/app-signing.html">アプリケーションへの署名</a>の内容をよく理解する必要があります。また、アプリケーションをリリースしてエンドユーザーと共有することを計画している場合は非常に重要です。「アプリケーションへの署名」では、非公開キーを生成し、それを使用して .apk ファイルに署名する手順について説明しています。ただし、開発を始めたばかりであれば、デバッグ モードでビルドすることにより、エミュレータまたは独自の開発用端末でアプリケーションをすぐに実行できます。</p> + +<p>Ant をお持ちでない場合は、<a href="http://ant.apache.org/">Apache Ant ホームページ</a>から入手してください。Ant をインストールして、必ず実行可能パスに置きます。Ant を実行する前に、「JAVA_HOME」環境変数を宣言して JDK のインストールパスを指定する必要があります。</p> + +<p class="note"><strong>注:</strong> Windows 上に JDK をインストールすると、デフォルトでは「Program Files」ディレクトリにインストールされます。このパス名にはスペースが含まれるために、<code>ant</code> は実行されません。この問題は、JAVA_HOME 変数を次のように指定することで解決できます: <code>set JAVA_HOME=c:\Prora~1\Java\<jdkdir></code> ただし最も簡単な解決策は、JDK をスペースを含まないディレクトリ(例: <code>c:\java\jdk1.6.0_02</code>)にインストールすることです。</p> + + +<h3 id="DebugMode">デバッグ モードでのビルド</h3> + +<p>アプリケーションのテストとデバッグをすぐに行いたい場合は、デバッグ モードでアプリケーションをビルドし、すぐにエミュレータにインストールすることができます。デバッグ モードでは、ビルド ツールはデバッグ キーを使用してアプリケーションに自動的に署名します。ただしアプリケーションはリリース モードでテストすることも可能であり、リリース モードでのテストは推奨されています。デバッグ モードは、手動でアプリケーションに署名しなくても、アプリケーションを実行できるようにします。</p> + +<p>デバッグ モードでビルドするには:</p> + +<ol> + <li>コマンドラインを開き、プロジェクトのルート ディレクトリに移動します。</li> + <li>Ant を使用してプロジェクトをデバッグ モードでコンパイルします: + <pre>ant debug</pre> + <p>Android アプリケーションの .apk ファイルがプロジェクトの <code>bin/</code> ディレクトリに、<code><em><your_DefaultActivity_name></em>-debug.apk</code> という名前で作成されます。このファイルはデバッグ キーで署名済みです。</p> + </li> +</ol> + +<p>ソース ファイルまたはリソースを変更するたびに、アプリケーションの最新バージョンをパッケージングするために、Ant を再度実行する必要があります。</p> + +<p>アプリケーションをエミュレータにインストールして実行する方法については、下記の<a href="#Running">アプリケーションの実行</a>セクションをご覧ください。</p> + + +<h3 id="ReleaseMode">リリース モードでのビルド</h3> + +<p>アプリケーションをエンドユーザーにリリースして配布する準備ができたら、アプリケーションをリリース モードでビルドする必要があります。リリース モードでビルドした後、最終的な .apk ファイルを使用して追加のテストとデバッグをすることをおすすめします。</p> + +<p>リリース モードでビルドするには:</p> + +<ol> + <li>コマンドラインを開き、プロジェクトのルート ディレクトリに移動します。</li> + <li>Ant を使用してプロジェクトをリリース モードでコンパイルします: + <pre>ant release</pre> + <p>これにより Android アプリケーションの .apk ファイルがプロジェクトの <code>bin/</code> ディレクトリに、<code><em><your_DefaultActivity_name></em>.apk</code> という名前で作成されます。</p> + <p class="note"><strong>注:</strong> .apk ファイルはこの時点では署名されていません。<em></em>つまり非公開キーで署名するまで、エミュレータや端末にインストールすることはできません。</p> + </li> +</ol> + +<p>リリース モードではアプリケーションを署名せずにビルドを行います。このため、アプリケーションをエンドユーザーに配布するためには、次に非公開キーを使用して署名を行う必要があります。この手順を行う方法については、<a href="{@docRoot}guide/publishing/app-signing.html">Signing Your Application</a>をご覧ください。</p> + +<p>非公開キーを使用してアプリケーションに署名すると、アプリケーションをエミュレータや端末にインストールできるようになります。これについては次の<a href="#Running">アプリケーションの実行</a>のセクションで説明します。次の方法でウェブ サーバーから端末にインストールすることもできます。署名した APK をウェブサイトにアップロードし、Android ウェブブラウザでその .apk の URL を読み込んでアプリケーションをダウンロードし、インストールを開始します(端末上では、[設定] > [アプリケーション] を選択し、[提供元不明のアプリ] をオンにする必要があります)。<em></em></p> + + +<h2 id="Running">アプリケーションの実行</h2> + +<p>端末のハードウェア以外でアプリケーションを実行する場合は、アプリケーションのインストール先となるエミュレータを起動する必要があります。Android エミュレータのインスタンスは、特有の端末構成に合わせて設定された、特定の Android プラットフォームを実行しています。このプラットフォームと構成は、Android 仮想デバイス(AVD)で定義されます。そのためエミュレータを起動する前に、AVD を定義しなくてはいけません。</p> + +<p>端末ハードウェアでアプリケーションを実行する場合は、代わりに、<a href="{@docRoot}guide/developing/device.html">端末のでの開発</a> をご覧ください。</p> + +<ol> + <li><strong>AVD の作成</strong> + <ol> + <li>コマンドラインを開き、SDK パッケージの <code>tools/</code> ディレクトリに移動します。</li> + <li>最初に、「配備ターゲット」を選択する必要があります。選択可能なターゲットを表示するには、次のコマンドを実行します: + <pre>android list targets</pre> + <p>次のように選択可能な Android ターゲットのリストが表示されます:</p> +<pre> +id:1 + Name: Android 1.1 + Type: platform + API level: 2 + Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P +id:2 + Name: Android 1.5 + Type: platform + API level: 3 + Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P +</pre> + <p>アプリケーションを実行する Android プラットフォームに一致するターゲットを探します。<code>id</code> の番号を書き留めておき、次のステップで使用します。</p> + </li> + <li>選択した配備ターゲットを使用して、新しい AVD を作成します: + <pre>android create avd --name <em><your_avd_name></em> --target <em><targetID></em></pre> + <li>カスタム ハードウェア プロファイルを作成するかどうかの問い合わせがあります。「yes」と答えると、携帯端末ハードウェアのさまざまな面を定義するための一連の問い合わせがあります(入力を空白のままにすると、かっこ内に表示されたデフォルト値が使用されます)。または、Enter キーを押すと、すべてデフォルト値が使用されます(「no」がデフォルトです)。</li> + </li> + </ol> + </li> + + <li><strong>エミュレータの起動</strong></li> + <p>SDK の <code>tools/</code> ディレクトリから、上記で作成した既存の AVD を使用してエミュレータを起動します: + <pre>emulator -avd <em><your_avd_name></em></pre> + <p>エミュレータのインスタンスが起動し、AVD で定義されたターゲットと構成が実行されます。</p> + </li> + + <li><strong>アプリケーションのインストール</strong> + <p>SDK の <code>tools/</code> ディレクトリから .apk をエミュレータにインストールします: + <pre>adb install <em>/path/to/your/application</em>.apk</pre> + <p>複数のエミュレータが実行中の場合、<code>-s</code> オプションでシリアル番号を指定して、アプリケーションをインストールするエミュレーションを指定する必要があります。次に例を示します:</p> + <pre>adb -s emulator-5554 install /my/project/path/myapp.apk</pre> + </li> + <li><strong>アプリケーションを開く</strong> + <p>エミュレータで、使用可能なアプリケーションのリストを開き、実行するアプリケーションを探して開きます。</p> + </li> +</ol> + +<p>実行するアプリケーションがエミュレータ上にない場合、同じ AVD を指定してエミュレータを再起動してください。Activity を初めてインストールすると、アプリケーション ランチャに表示されず、他のアプリケーションからアクセスできないことがあります。パッケージ マネージャは通常、エミュレータの起動時にしかマニフェストを完全には調べないためです。</p> + +<p class="note"><strong>ヒント:</strong> 実行中のエミュレータが 1 つしかない場合、1 つの簡単なステップで、アプリケーションをビルドし、エミュレータにインストールすることができます。プロジェクトのルート ディレクトリに移動し、Ant を使用してインストール モードでプロジェクトをコンパイルします<em></em>(<code>ant install</code>)。これにより、アプリケーションがビルドされ、デバッグ キーにより署名され、現在実行中のエミュレータにインストールされます。現在実行中のエミュレータが複数あると、<code>install</code> コマンドは失敗します。複数のエミュレータからの選択を行うことはできません。</p> + +<p>上記で使用したツールについて詳しくは、次のドキュメントをご覧ください:</p> +<ul> + <li><a href="{@docRoot}guide/developing/tools/othertools.html#android">android ツール</a></li> + <li><a href="{@docRoot}guide/developing/tools/emulator.html">Android Emulator</a></li> + <li><a href="{@docRoot}guide/developing/tools/adb.html">Android Debug Bridge</a> (ADB)</li> +</ul> + + +<h2 id="AttachingADebugger">アプリケーションへのデバッガの接続</h2> + +<p>このセクションでは、画面上でのデバッグ情報(CPU の使用率など)の表示方法や、総合開発環境に接続してエミュレータ上で実行するアプリケーションをデバッグする方法について説明します。 </p> + +<p>Eclipse プラグインを使用すると、デバッガへの接続は自動化されます。しかし他の総合開発環境でも、デバッグ ポートをリッスンしてデバッグ情報を受信するように設定することができます:</p> +<ol> + <li>総合開発環境とエミュレータ間のポート転送サービスとして機能する <strong><a href="{@docRoot}guide/developing/tools/ddms.html">Dalvik Debug Monitor Server(DDMS)</a>ツールを起動します。</strong></li> + <li><strong>エミュレータでオプションのデバッグ構成を設定します</strong>。設定には、デバッガ接続まで Activity のアプリケーション起動をブロックするオプションなどが含まれます。エミュレータでの CPU 使用率や画面の更新率の表示のように、これらのデバッグ用オプションの多くは DDMS がなくても使用できます。</li> + <li><strong>総合開発環境を設定して、デバッグ用にポート 8700 に接続します。</strong><a href="{@docRoot}guide/developing/debug-tasks.html#ide-debug-port">総合開発環境を設定してデバッグ ポートに接続する</a> をご覧ください。 </li> +</ol> diff --git a/docs/html/intl/ja/guide/index.jd b/docs/html/intl/ja/guide/index.jd new file mode 100644 index 0000000..73ca18a --- /dev/null +++ b/docs/html/intl/ja/guide/index.jd @@ -0,0 +1,52 @@ +page.title=デベロッパー ガイド +@jd:body + +<p> +Android デベロッパー ガイドへようこそ。<i></i>デベロッパー ガイドは、Android 向けアプリケーション開発における実用的な入門資料です。この資料では、Android の背後にある概念、アプリケーション構築用のフレームワーク、およびAndroid プラットフォーム向けソフトウェアを開発、テスト、公開するためのツールについて説明します。 +</p> + +<p> +デベロッパー ガイドには Android プラットフォームに関するほとんどのドキュメントが含まれていますが、フレームワーク API に関する参考資料は含まれていません。API の仕様については、上部にある [<a href="{@docRoot}reference/packages.html">リファレンス</a>] タブをご覧ください。 +</p> + +<p> +左側のパネルに表示されているように、デベロッパー ガイドは複数のセクションに分かれています。各セクションは次のとおりです: +<p> + +<dl> +<dt><b>Android の基本</b></dt> +<dd>Android とは何か、基本機能、アプリケーションとの関係など、Android の基本事項について紹介します。</dd> + +<dt><b>フレームワーク トピック</b></dt> +<dd>Android のフレームワークと API の各部分について説明します。フレームワークの概要については、<a href="{@docRoot}guide/topics/fundamentals.html">アプリケーションの基礎</a>を最初にご覧ください。次に、ユーザー インターフェースの設計やリソースの設定、データの保存、権限の利用など、それぞれのトピックを必要に応じて参照してください。</dd> + +<dt><b>開発</b></dt> +<dd>Android の開発とデバッグ用ツールの使用方法、結果のテスト方法について説明します。</dd> + +<dt><b>公開</b></dt> +<dd>アプリケーション配布の準備をする方法と、準備ができたら公開する方法について説明します。</dd> + +<dt><b>ベスト プラクティス</b></dt> +<dd>効率よく機能し、ユーザーにとって役立つアプリケーションを作成するための推奨テクニックについて説明します。</dd> + +<dt><b>チュートリアルとサンプル</b></dt> +<dd>Android アプリケーションを構築する方法を例示する段階的なチュートリアルとサンプル コードです。</dd> + +<dt><b>付録</b></dt> +<dd>関連情報、仕様、よくある質問、用語解説などの情報です。</dd> +</dl> + +<p> +Android 向けプログラム開発の最初のステップは、SDK(ソフトウェア開発キット)をダウンロードすることです。このキットのダウンロード方法と説明については、上部にある [<a href="{@docRoot}sdk/index.html">SDK</a>] タブをご覧ください。 +</p> + +<p> +SDK のダウンロード後は、まずはじめにデベロッパー ガイドを参照してください。コードを実際に見てみることから始めたい場合は、簡単な <a href="{@docRoot}guide/tutorials/hello-world.html">Hello World</a> チュートリアルを参照してください。Android プラットフォーム向けに作成された標準的な「Hello, World」アプリケーションについて説明しています。<a href="{@docRoot}guide/topics/fundamentals.html">アプリケーションの基礎</a>ドキュメントは、アプリケーション フレームワークを理解したいユーザーに最適な出発点となります。 +</p> + + +<p> +不明点などがある場合は、Android ディスカッション グループへの参加をおすすめします。詳しくは上部にある [<a href="{@docRoot}community/index.html">コミュニティ</a>] タブをご覧ください。 +</p> + +<p>デベロッパー ガイドの別のページに移動してから、このページに戻るには、[デベロッパー ガイド] タブをクリックします。 </p>
\ No newline at end of file diff --git a/docs/html/intl/ja/guide/publishing/app-signing.jd b/docs/html/intl/ja/guide/publishing/app-signing.jd new file mode 100644 index 0000000..23d8cf7 --- /dev/null +++ b/docs/html/intl/ja/guide/publishing/app-signing.jd @@ -0,0 +1,336 @@ +page.title=アプリケーションへの署名 +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + +<h2>署名の概略</h2> + +<ul> +<li>Android アプリケーションはすべて<em>署名する必要がある</em></a></li> +<li>自己署名キーで署名可能</li> +<li>アプリケーションの署名方法は重要です。このドキュメントをよくお読みください</li> +<li>開発プロセスの初期段階で署名戦略を決定します</li> +</ul> + +<h2>このドキュメントの内容</h2> + +<ol> +<li><a href="#overview">概要</a></li> +<li><a href="#strategies">署名戦略</a></li> +<li><a href="#setup">署名の基本設定</a></li> +<li><a href="#debugmode">デバッグ モードでの署名</a></li> +<li><a href="#releasemode">公開リリースへの署名</a> + <ol> + <li><a href="#releasecompile">リリース向けのコンパイル</a></li> + <li><a href="#cert">適切な秘密鍵の取得</a></li> + <li><a href="#signapp">アプリケーションの署名</a></li> + <li><a href="#ExportWizard">Eclipse ADT によるコンパイルと署名</a></li> + </ol> +</li> +<li><a href="#secure-key">秘密鍵のセキュリティ設定</a></li> + +</ol> + +<h2>関連項目</h2> + +<ol> +<li><a href="{@docRoot}guide/publishing/versioning.html">アプリケーションのバージョニング</a></li> +<li><a href="{@docRoot}guide/publishing/preparing.html">公開の準備</a></li> +</ol> + +</div> +</div> + +<p>このドキュメントでは、Android アプリケーションを携帯端末ユーザーに公開する前に署名する方法について説明します。</p> + +<h2 id="overview">概要</h2> + +<p>Android システムでは、インストールするすべてのアプリケーションに対してデジタル署名されて証明書を必要とします。この証明書の秘密鍵は、アプリケーションのデベロッパーが所持するものです。Android システムは証明書をアプリケーションの作成者の識別手段、およびアプリケーション間の信頼関係の確立手段として使用します。証明書は、ユーザーがどのアプリケーションをインストールできるかを制御するものではありません。証明書は認証機関によって署名される必要はありません。通常の Android アプリケーションは自己署名証明書を使用して正常に機能します。</p> + +<p>Android アプリケーションの署名について、次の点を理解することが重要です:</p> + +<ul> + <li>すべてのアプリケーションは<em>署名される必要があります</em>。署名されていないアプリケーションはシステムにインストールされません。</li> + <li>アプリケーションの署名に、自己署名証明書を使用できます。認証機関は不要です。</li> + <li>アプリケーションをエンド ユーザーにリリースする準備ができたら、適切な秘密鍵を使用してアプリケーションに署名する必要があります。SDK ツールで生成されたデバッグ キーで署名されたアプリケーションは、公開できません。 + </li> + <li>システムが署名証明書の有効期限を確認するのは、インストール時のみです。アプリケーションのインストール後に署名者証明書が期限切れになった場合、アプリケーションは正常な動作を継続します。</li> + <li>標準ツールである Keytool と Jarsigner を使用してキーを生成し、アプリケーションの .apk ファイルに署名できます。</li> +</ul> + +<p>Android システムは、適切に署名されていないアプリケーションをインストールせず、実行もしません。この規則は、実際のデバイスでもエミュレータでも、Android システムが実行されるすべての状況で適用されます。このため、エミュレータまたはデバイス上で実行またはデバッグする前に、アプリケーションの署名を設定する必要があります。</p> + +<p>Android SDK ツールは、デバッグ時のアプリケーション署名を支援します。「ADT Plugin for Eclipse」と「Ant ビルド ツール」では両方とも、<em>デバッグ モード</em>と<em>リリース モード</em>の 2 種類の署名モードを利用できます。 + +<ul> +<li>開発およびテスト中は、デバッグ モードでコンパイルできます。デバッグ モードでは、ビルド ツールは JDK に付属の Keytool ユーティリティを使用して、キーストアとキーを既知のエイリアスとパスワードで作成します。コンパイルのたびに、ツールはデバッグ キーを使用してアプリケーションの .apk ファイルに署名します。パスワードは既知のものなので、コンパイルのたびにツールにキーストア/キー パスワードを入力する必要はありません。</li> + +<li>アプリケーションをリリースする準備ができたら、リリース モードでコンパイルして、.apk に<span style="color:red">秘密鍵</span>で署名する必要があります。次の 2 通りの方法があります: + <ul> + <li>Keytool と Jarsigner をコマンド ラインで使用する方法。このアプローチでは、まずアプリケーションを<em>署名されていない</em> .apk にコンパイルします。次に、Jarsigner(または類似のツール)を使用して秘密鍵で .apk に手動で署名します。適切な秘密鍵を所持していない場合は、Keytool を手動で実行して独自のキーストア/キーを生成し、Jarsigner でアプリケーションに署名できます。</li> + <li>ADT Export Wizard を使用する方法。ADT プラグイン搭載の Eclipse を使用して開発している場合、Export Wizard を使用してアプリケーションをコンパイルし、秘密鍵を生成して(必要な場合)、.apk に署名できます。この作業をすべて Export Wizard を使用して 1 つのプロセスで実行できます。 + </li> + </ul> +</li> +</ul> + +<h2 id="strategies">署名戦略</h2> + +<p>アプリケーションの署名は、開発アプローチに一部影響します。特に、複数のアプリケーションをリリースする予定の場合、高い影響を与えます。 </p> + +<p>一般に、すべてのデベロッパーに推奨される戦略は、アプリケーションの予期される使用期間を通じて同じ証明書ですべてのアプリケーションに署名することです。このようにするには、複数の理由があります: </p> + +<ul> +<li>アプリケーションのアップグレード - アプリケーションのアップグレードをリリースするとき、ユーザーが新バージョンにシームレスにアップグレードできるように、アップグレードされたアプリケーションにも同じ証明書で署名します。システムがアプリケーションのアップデートをインストールする際は、新バージョンの証明書のいずれかが旧バージョンの証明書と一致する場合、システムがアップデートを許可します。一致する証明書を使用せずに署名する場合は、アプリケーションに別のパッケージ名を割り当てる必要があります。この場合、新しいバージョンがまったく新しいアプリケーションとしてインストールされます。 </li> + +<li>アプリケーションのモジュール性 - Android システムでは、アプリケーションが要求する場合、同じ証明書で署名されたアプリケーションを同じプロセスで実行できます。これにより、システムはこれらを単一のアプリケーションとして取り扱います。このようにすればアプリケーションをモジュールとして配備でき、ユーザーは必要に応じて各モジュールを個別に更新できます。</li> + +<li>許可によるコード/データ共有 - Android システムでは、署名ベースの権限付与を実施しているため、アプリケーションは指定された証明書で署名されている別のアプリケーションに機能を提供できます。同じ証明書で複数のアプリケーションに署名し、署名に基づいた権限のチェックを行うことで、アプリケーションはコードとデータを安全な方法で共有できます。 </li> + +</ul> + +<p>署名戦略を決定する際のもう 1 つの重要な検討事項として、アプリケーションの署名に使用するキーの有効期間の設定方法があります。</p> + +<ul> +<li>アプリケーションのアップグレードをサポートするには、キーの有効期間は、アプリケーションの予定される試用期間以上である必要があります。有効期間は、25年以上であることが推奨されます。キーの有効期間が切れた場合、ユーザーはアプリケーションの新バージョンにシームレスにアップグレードできなくなります。</li> + +<li>同じキーで複数の異なるアプリケーションに署名する場合、キーの有効期間が、今後のアプリケーション スイートに追加される依存アプリケーションを含め、<em>すべてのアプリケーションのすべてのバージョンの</em>予定される使用期間を超えることを確認してください。 </li> + +<li>アプリケーションを Android マーケットに公開する予定の場合、アプリケーションの署名に使用するキーの有効期間を、2033 年 10 月 22 日以降の期限に設定する必要があります。マーケット サーバーは、新バージョンが公開されたときにユーザーがマーケット アプリケーションをシームレスにアップグレードできるよう、この要件を義務付けています。 </li> +</ul> + +<p>アプリケーションの設計時にこれらの点を考慮し、アプリケーションの署名に<a href="#cert">適切な証明書</a>を使用してください。 </p> + +<h2 id="setup">署名の基本設定</h2> + +<p>キーストアとデバッグ キーの生成をサポートするため、SDK ビルド ツールで Keytool を使用できることを初めに確認してください。たいていの場合、「JAVA_HOME」環境変数を設定して適切な JDK を参照させることで、SDK ビルド ツールで Keytool を認識できます。または、JDK バージョンの Keytool を PATH 変数に追加しても認識できます。</p> + +<p>Linux バージョンに付属されている GNU Java コンパイラで開発している場合は、gcj バージョンではなく、JDK バージョンの Keytool を使用していることを確認してください。Keytool が既に PATH に指定されている場合は、<code>/usr/bin/keytool</code> の symlink を指していることがあります。この場合は、symlink ターゲットが JDK の Keytool を指していることを確認してください。</p> + +<p>アプリケーションを公開する場合は、Jarsigner ツールをコンピュータで使用できるようにする必要があります。Jarsigner と Keytool の両方が JDK によって提供されます。 </p> + +<h2 id="debugmode">デバッグ モードでの署名</h2> + +<p>Android ビルド ツールにはデバッグ署名モードがあり、アプリケーションの開発とデバッグがスムーズに行えます。また、.apk をエミュレータまたはデバイスにインストールする際の、署名に対する Android システム要件を満たします。デバッグモードでは、SDK ツールは Keytool を呼び出してデバッグ キーストアとキーを作成します。</p> + +<p>SDK ツールは事前に指定された名前とパスワードを使用してデバッグ キーストア/キーを作成します。</p> +<ul> +<li>キーストア名 – 「debug.keystore」</li> +<li>キーストアのパスワード – 「android」</li> +<li>キーのエイリアス – 「androiddebugkey」</li> +<li>キーのパスワード – 「android」</li> +<li>CN – 「CN=Android Debug,O=Android,C=US」</li> +</ul></p> + +<p>必要に応じて、デバッグ キーストア/キーの場所および名前を変更できます。また、自分で作成したデバッグ キーストア/キーを指定することもできます。Eclipse/ADT で、[[]<strong>ウィンドウ(Windows)</strong>] > [[]<strong>設定(Prefs)</strong>] > [[]<strong>Android</strong>] > [[]<strong>ビルド(Build)</strong>] を選択します。ただし、自分で作成したデバッグ キーストア/キーは、デフォルトのデバッグ キー(上述)と同じキーストア/キー名とパスワードを使用する必要があります。</p> + +<p class="note"><strong>注:</strong> デバッグ証明書で署名した場合は、アプリケーションを<em>公開できません</em>。</p> + +<h3>Eclipse ユーザー</h3> + +<p>Eclipse/ADT で開発し、Keytool を上記のように設定してある場合は、デバッグモードにおける署名はデフォルトで有効になっています。アプリケーションを実行またはデバッグするときに、ADT は .apk にデバッグ証明書で署名し、エミュレータにインストールします。ADT が Keytool にアクセスできる場合は、ユーザーは特に操作する必要はありません。</p> + +<h3>Ant ユーザー</h3> + +<p>Ant を使用して .apk ファイルを構築する場合、デバッグ署名モードは <code>debug</code> オプションを使用することで有効になります(<code>android</code> ツールで生成された <code>build.xml</code> ファイルを使用していることが前提となります)。<code>ant debug</code> を実行してアプリケーションをコンパイルする際、ビルド スクリプトはキーストア/キーを生成し、.apk に署名します。ユーザーは操作する必要はありません。詳細は、<a href="{@docRoot}guide/developing/other-ide.html#DebugMode">その他の統合開発環境での開発: デバッグモードにおけるビルド </a> をお読みください。</p> + + +<h3 id="debugexpiry">デバッグ証明書の有効期限</h3> + +<p>デバッグ モード(Eclipse/ADT と Ant ビルドのデフォルト)でのアプリケーション署名に使用した自己署名証明書には、作成日から 365 日の有効期限が設定されます。</p> + +<p>証明書の期限が切れると、ビルド エラーが発生します。Ant ビルドでは、エラーは次のようになります:</p> + +<pre>debug: +[echo] Packaging bin/samples-debug.apk, and signing it with a debug key... +[exec] Debug Certificate expired on 8/4/08 3:43 PM</pre> + +<p>Eclipse/ADT では、Android コンソールに同様のエラーが表示されます。</p> + +<p>この問題を解決するには、<code>debug.keystore</code> ファイルを削除します。AVD のデフォルトの格納場所は、OS X と Linux の場合は <code>~/.android/avd</code>、Windows XP の場合は <code>C:\Documents and Settings\<user>\.android\</code>、Windows Vista の場合は <code>C:\Users\<user>\.android\</code> です。</p> + + +<p>次にビルドを行うと、ビルド ツールは新しいキーストアとデバッグ キーを再度生成します。</p> + +<p>開発コンピュータがグレゴリオ暦以外のロケールを使用している場合、ビルド ツールが誤って期限切れのデバッグ証明書を生成することがあります。このため、アプリケーションをコンパイルしようとするとエラーが発生します。解決策については、トラブルシューティング トピックの <a href="{@docRoot}guide/appendix/faq/troubleshooting.html#signingcalendar">ビルド ツールが期限切れのデバッグ証明書を生成するため、アプリケーションがコンパイルできない</a> をご覧ください。 </p> + + +<h2 id="releasemode">公開リリースへの署名</h2> + +<p>アプリケーションを他のユーザーに公開する準備ができたら、次のことを行う必要があります:</p> +<ol> + <li>アプリケーションをリリース モードでコンパイルする</li> + <li>適切な秘密鍵を取得する</li> + <li>アプリケーションに秘密鍵で署名する</li> +</ol> + +<p>以下のセクションでは、これらの手順を実行する方法について説明します。</p> + +<p>ADT プラグイン搭載の Eclipse を使用している場合、これらの手順を実行する代わりに Export Wizard を使用して .apk をコンパイルして秘密鍵で署名できます。Export Wizard では、処理過程で新しいキーストアと秘密鍵の生成も可能です。<a href="#ExportWizard">Eclipse ADT によるコンパイルと署名</a>を参考にコンパイルを行ってください。</p> + + +<h3 id="releasecompile">リリース向けのコンパイル</h3> + +<p>アプリケーションのリリースを準備するには、リリース モードでコンパイルする必要があります。リリース モードでは、Android ビルド ツールはアプリケーションを通常どおりにコンパイルしますが、デバッグ キーで署名しません。</p> + +<p class="warning"><strong>注:</strong> 署名されていないアプリケーション、またはデバッグ キーで署名されたアプリケーションはリリースできません。</p> + +<h4>Eclipse ユーザー</h4> + +<p><em>署名されていない</em> .apk ファイルを Eclipse からエクスポートするには、パッケージ エクスプローラー(Package Explorer)でプロジェクトを右クリックして、[[]<strong>Android ツール(Android Tools)</strong>] > [[]<strong>署名されていないアプリケーション パッケージのエクスポート(Export Unsigned Application Package)</strong>] を選択します。次に、署名されていない .apk ファイルの場所を指定します(または、<code>AndroidManifest.xml</code> ファイルを Eclipse で開き、[[]<em>概要(Overview)</em>] タブを開いて [[]<strong>署名されていない .apk のエクスポート(Export an unsigned .apk)</strong>] をクリックします)。</p> + +<p>Export Wizard では、コンパイルと署名の手順を一緒に処理できます。<a href="#ExportWizard">Eclipse ADT によるコンパイルと署名</a>をご覧ください。</p> + +<h4>Ant ユーザー</h4> + +<p>Ant を使用している場合は、必要な作業は Ant コマンドでビルド ターゲットとして「release」を指定するだけです。たとえば、Ant を build.xml ファイルがあるディレクトリから実行している場合、コマンドは次のようになります:</p> + +<pre>$ ant release</pre> + +<p>ビルド スクリプトは、アプリケーション .apk を署名せずにコンパイルします。</p> + + +<h3 id="cert">適切な秘密鍵の取得</h3> + +<p>アプリケーションの署名を準備するには、まず署名に使用する適切な秘密鍵があることを確認することが必要です。適切な秘密鍵とは、次の条件を満たすものです:</p> + +<ul> +<li>自分が所有している。</li> +<li>アプリケーションで識別される、個人、法人、または組織の実体を表す。</li> +<li>アプリケーションまたはアプリケーション スイートの予期される使用期間を超える有効期間を持っている。有効期間として、25 年以上を推奨します。 +<p>アプリケーションを Android マーケットに公開する予定の場合、2033 年 10 月 22 日までの有効期間が必要です。有効期間がこの日付以前に期限切れになるキーで署名されたアプリケーションは、アップロードできません。 +</p></li> +<li>Android SDK ツールで生成されたデバッグ キーではない。 </li> +</ul> + +<p>自己署名されたキーを使用できます。適切なキーがない場合、Keytool を使用して生成する必要があります。<a href="#setup">基本設定</a>で説明した手順に従って、Keytool を使用できるようにしてください。</p> + +<p>Keytool で自己署名キーを生成するには、<code>keytool</code> コマンドを使用して以下に示すオプション(および、必要に応じてその他のオプション)を渡します。 </p> + +<p class="warning"><strong>注:</strong> Keytool を実行する前に、<a href="#secure-key">秘密鍵のセキュリティ設定</a>を読んで、キーのセキュリティを確保する方法と、自分とユーザーにとってセキュリティ確保が重要な理由を理解してください。特に、自分のキーを生成する場合、キーストアとキーの両方に強力なパスワードを選択する必要があります。</p> + +<table> +<tr> +<th>Keytool のオプション</th> +<th>説明</th> +</tr> +<tr> +<td><code>-genkey</code></td><td>キー ペアを生成します(公開キーと秘密鍵)。</td> +</tr> +<tr> +<td><code>-v</code></td><td>詳しいメッセージを出力する。</td> +</tr> +<tr> +<td><code>-keystore <keystore-name>.keystore</code></td><td>秘密鍵を含むキーストアの名前。</td> +</tr> +<tr> +<td><code>-storepass <password></code></td><td><p>キーストアのパスワード。</p><p>セキュリティ上の注意として、安全なコンピュータで作業している場合を除き、このオプションをコマンド ラインに指定しないでください。指定しなかった場合、Keytool からパスワードの入力が求められます。このため、パスワードはシェルの履歴に記録されません。</p></td> +</tr> +<tr> +<td><code>-alias <alias_name></code></td><td>キーのエイリアス。</td> +</tr> +<tr> +<td><code>-keyalg <alg></code></td><td>キーの生成時に使用する暗号化アルゴリズム。DSA と RSA の 2 つをサポートしています。</td> +</tr> +<tr> +<td><code>-dname <name></code></td><td><p>キーの作成者を識別する、識別名。値は、自己署名証明書の発行者およびサブジェクト フィールドとして使用されます。 </p><p>このオプションはコマンド ラインで指定する必要はありません。指定しなかった場合、Jarsigner からそれぞれの識別名フィールド(CN、OU など)の入力が求められます。</p></td> +</tr> +<tr> +<td><code>-validity <valdays></code></td><td><p>キーの有効期間(日数)。 </p><p><strong>注:</strong> 10000 以上の値を推奨します。</p></td> +</tr> +<tr> +<td><code>-keypass <password></code></td><td><p>キーのパスワード。</p> +<p>セキュリティ上の注意として、安全なコンピュータで作業している場合を除き、このオプションをコマンド ラインに指定しないでください。指定しなかった場合、Keytool からパスワードの入力が求められます。このため、パスワードはシェルの履歴に記録されません。</p></td> +</tr> +</table> + + +<p>秘密鍵を生成する Keytool コマンドの例を示します。</p> + +<pre>$ keytool -genkey -v -keystore my-release-key.keystore +-alias alias_name -keyalg RSA -validity 10000</pre> + +<p>上記のコマンド例を実行すると、Keytool からキーストアとキーのパスワードと、キーの識別名フィールドの指定が求められます。キーストアが <code>my-release-key.keystore</code> というファイルとして生成されます。キーストアとキーは、入力したパスワードで保護されます。キーストアには 1 つのキーが含まれ、10000 日間有効です。エイリアスは、後で使用する名前で、アプリケーションに署名するときにこのキーストアを参照する名前です。 </p> + +<p>Keytool の詳細は <a +href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security">http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security</a> のドキュメント(英語のみ)をご覧ください。</p> + + +<h3 id="signapp">アプリケーションの署名</h3> + +<p>リリースする .apk に実際に署名する準備ができたら、Jarsigner ツールを使用して署名できます。<a href="#setup">基本設定</a>で説明したように、Jarsigner をコンピュータで使用できることを確認してください。また、秘密鍵を含むキーストアがあることも確認してください。</p> + +<p>アプリケーションに署名するには、Jarsigner を実行して、アプリケーションの .apk と、.apk の署名に使用する秘密鍵を含むキーストアの両方を参照します。以下の表では、使用できるオプションを示します。 <p> + +<table> +<tr> +<th>Jarsigner のオプション</th> +<th>説明</th> +</tr> +<tr> +<td><code>-keystore <keystore-name>.keystore</code></td><td>秘密鍵を含むキーストアの名前。</td> +</tr> +<tr> +<td><code>-verbose</code></td><td>詳しいメッセージを出力する。</td> +</tr> +<tr> +<td><code>-storepass <password></code></td><td><p>キーストアのパスワード。 </p><p>セキュリティ上の注意として、安全なコンピュータで作業している場合を除き、このオプションをコマンド ラインに指定しないでください。指定しなかった場合、Jarsigner からパスワードの入力が求められます。このため、パスワードはシェルの履歴に記録されません。</p></td> +</tr> +<tr> +<td><code>-keypass <password></code></td><td><p>秘密鍵のパスワード。 </p><p>セキュリティ上の注意として、安全なコンピュータで作業している場合を除き、このオプションをコマンド ラインに指定しないでください。指定しなかった場合、Jarsigner からパスワードの入力が求められます。このため、パスワードはシェルの履歴に記録されません。</p></td> +</tr> +</table> + +<p>Jarsigner を使用して <code>my_application.apk</code> というアプリケーション パッケージに署名する例を、上記で作成したキーストアを使用して示します。 +</p> + +<pre>$ jarsigner -verbose -keystore my-release-key.keystore +my_application.apk alias_name</pre> + +<p>上記のコマンドを実行すると、Jarsigner からキーストアとキーのパスワードの入力が求められます。.apk がその場で変更され、.apk は署名されます。.apk に別のキーで複数回署名できます。</p> + +<p>.apk が署名されたことを確認するには、次のようなコマンドを使用できます:</p> + +<pre>$ jarsigner -verify my_signed.apk</pre> + +<p>.apk が適切に署名されると、Jarsigner から「jar verified」と出力されます。詳細情報が必要な場合は、次のコマンドを使用できます。</p> + +<pre>$ jarsigner -verify -verbose my_application.apk</pre> + +<p>または、次のコマンドを使用します。</p> + +<pre>$ jarsigner -verify -verbose -certs my_application.apk</pre> + +<p>上記の <code>-certs</code> オプションが付加されたコマンドでは、「CN=」行が出力され、キーの作成者が示されます。</p> + +<p class="note"><strong>注:</strong> 「CN=Android Debug」と出力される場合、.apk が Android SDK によって生成されたデバッグ キーで署名されたことを示しています。アプリケーションをリリースする予定の場合は、デバッグ キーではなく秘密鍵で署名する必要があります。</p> + +<p>Jarsigner の詳細は <a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security">http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security</a> のドキュメント(英語のみ)をご覧ください。</p> + + +<h3 id="ExportWizard">Eclipse ADT によるコンパイルと署名</h3> + +<p>ADT 搭載 Eclipse を使用している場合、Export Wizard を使用して<em>署名済み</em> .apk をエクスポートできます(必要に応じて、新しいキーストアを作成することもできます)。Export Wizard は、Keytool と Jarsigner のすべての処理を、コマンド ラインを使用せず、グラフィカル ユーザー インターフェースで署名を実行できます。Export Wizard は Keytool と Jarsigner の両方を使用するため、上記の<a href=#setup">署名の基本設定</a>の条件を満たすコンピュータで使用できます。</p> + +<p>署名された .apk を作成するには、パッケージ エクスプローラー(Package Explorer)でプロジェクトを右クリックして、<strong>[[]Android ツール(Android Tools)] > [[]署名済みアプリケーション パッケージのエクスポート(Export Signed Application Package)]</strong> を選択します(または、<code>AndroidManifest.xml</code> ファイルを Eclipse で開き、[[]<em>概要(Overview)</em>] タブを開いて [[]<strong>Export Wizard を使用する(Use the Export Wizard)</strong>] をクリックします)。表示されたウィンドウには、アプリケーションのエクスポート中に見つかったエラーが表示されます。エラーが見つからなかった場合は Export Wizard で処理を続行します。.apk に署名する秘密鍵の選択や、新しいキーストアと秘密鍵の作成など、アプリケーション署名のプロセスを手順を追って実行できます。</p> + +<p>Export Wizard が完了すると、配布可能な署名済み .apk が作成されています。</p> + + +<h2 id="secure-key">秘密鍵のセキュリティ設定</h2> + +<p>秘密鍵のセキュリティ設定は、作成者とユーザーの両者にとって重要です。他人にキーを使用させたり、第三者が見つけて使用できるような安全ではない場所にキーストアとキーを放置したりすると、作成者とユーザー間の信頼が損なわれます。 </p> + +<p>他者が許可を得ずにキーを取得した場合、その人物はアプリケーションに署名して配布し、本物のアプリケーションを故意に置き換えたり破損させたりすることができます。このような人物は、身元を詐称してアプリケーションに署名して配布し、その他のアプリケーションまたはシステム自体を攻撃したり、ユーザー データを破損させたり盗み出したりすることもあります。 </p> + +<p>キーの有効期限が切れるまで、秘密鍵のセキュリティを常に適切に維持できるかは、デベロッパーとしての評価を左右します。キーを安全に保つためのヒントをいくつか紹介します。 </p> + +<ul> +<li>キーストアとキーに強力なパスワードを選択します。</li> +<li>Keytool でキーを生成するとき、<em></em>コマンド ラインで <code>-storepass</code> および <code>-keypass</code> オプションを指定しないようにします。指定すると、パスワードがシェル履歴に記録され、コンピュータのすべてのユーザーがアクセスできるようになります。</li> +<li>同様に、Jarsigner でアプリケーションに署名するとき、<em></em>コマンド ラインで <code>-storepass</code> と <code>-keypass</code> オプションを指定しないようにします。 </li> +<li>秘密鍵を誰にも与えたり貸したりせず、不正なユーザーにキーストアとキーのパスワードを知られないようにします。</li> +</ul> + +<p>一般的には、キーの生成、使用、保管に関して常識的な注意を払っていれば、セキュリティを確保することができます。 </p>
\ No newline at end of file diff --git a/docs/html/intl/ja/guide/publishing/preparing.jd b/docs/html/intl/ja/guide/publishing/preparing.jd new file mode 100644 index 0000000..f1e7b45 --- /dev/null +++ b/docs/html/intl/ja/guide/publishing/preparing.jd @@ -0,0 +1,154 @@ +page.title=公開の準備 +@jd:body + +<!-- +<div id="qv-wrapper"> +<div id="qv"> + +<h2>In this document</h2> + +<ol> +<li><a href=""></a></li> +</ol> + +</div> +</div> +--> + +<p>アプリケーションの公開とは、アプリケーションをテストして適切にパッケージし、Android 搭載の携帯端末のユーザーが利用できる状態にすることです。</p> + +<p>アプリケーションを公開して Android 搭載デバイスにインストールするには、いくつかの作業を行ってアプリケーションの準備を整える必要があります。このドキュメントでは、アプリケーションのリリースを成功させるための準備における、重要なチェックポイントを説明しています。 +</p> + +<p>アプリケーションを Android マーケットに公開する場合は、アプリケーションの具体的な準備要件について <a +href="{@docRoot}guide/publishing/publishing.html#market">Android マーケットでの公開</a> もご覧ください。 </p> + +<p>アプリケーションを公開する方法の一般的な情報については、<a href="{@docRoot}guide/publishing/publishing.html">Publishing Your Applications</a> のドキュメントをご覧ください。 </p> + +<div class="special"> + +<p>アプリケーションのリリースを準備する前の作業:</p> + +<ol> +<li>アプリケーションを実際のデバイスで徹底的にテストする </li> +<li>アプリケーションへのエンド ユーザー ライセンス契約の追加を検討する</li> +<li>アプリケーションのマニフェストにアイコンとラベルを指定する</li> +<li>ロギングとデバッグを無効にして、データとファイルをクリーンアップする</li> +</ol> + +<p>アプリケーションの最終コンパイルを実行する前の作業:</p> + +<ol start="5"> +<li>アプリケーションでバージョン管理を行う</li> +<li>適切な暗号化キーを取得する</li> +<li>アプリケーションが MapView 要素を使用している場合は、Maps API キーに登録する</li> +</ol> + +<p><em>アプリケーションのコンパイル</em></p> +<p>アプリケーションをコンパイルした後の作業:</p> +<ol start="8"> +<li>アプリケーションに署名する</li> +<li>コンパイルしたアプリケーションをテストする</li> +</ol> +</div> + +<h2 id="releaseready">アプリケーションのリリースを準備する前の作業</h2> + +<h3 id="test">1. アプリケーションを実際のデバイスで徹底的にテストする</h3> + +<p>アプリケーションをできる限り広範に徹底的にテストすることが重要です。この作業を支援するため、Android では多数のテスト用クラスとツールを用意しています。{@link android.app.Instrumentation Instrumentation} を使用して JUnit およびその他のテスト ケースを実行できます。また、<a href="{@docRoot}guide/developing/tools/monkey.html">UI/Application Exerciser Monkey</a> などのテスティング ツールを使用できます。 </p> + +<ul> +<li>ユーザーがアプリケーションを正常に実行できるようにするため、アプリケーションが実行されると予想されるタイプの携帯端末の実機を入手してください。実際のデバイスで、実際のネットワーク条件の下でアプリケーションをテストします。アプリケーションを実際のデバイスでテストすることは非常に重要です。これによって、作成したユーザー インターフェース要素のサイズが正しく(特にタッチスクリーン UI の場合)、アプリケーションのパフォーマンスと電池効率が適正であることを確認できるからです。</li> + +<li>アプリケーションの対象とするタイプの携帯端末が手に入らない場合は、<code>-dpi</code>、<code>-device</code>、<code>-scale</code>、<code>-netspeed</code>、<code>-netdelay</code>、<code>-cpu-delay</code> などのエミュレータ オプションを使用して、エミュレータの画面、ネットワーク パフォーマンス、その他の属性をモデル化して可能な限り対象デバイスに適応させることができます。このようにして、アプリケーションの UI とパフォーマンスをテストできます。ただし、公開する前にアプリケーションを実際の対象デバイスでテストすることを強く推奨します。 </li> + +<li>アプリケーションが <a href="http://www.t-mobileg1.com/">T-Mobile G1</a> デバイスを対象としている場合、UI が画面の向き変更に対応しているか確認してください。 </li> +</ul> + +<h3 id="eula">2. アプリケーションへのエンドユーザー ライセンス契約の追加を検討する</h3> + +<p>個人、組織、知的財産を保護するため、アプリケーションのエンドユーザー ライセンス契約(EULA)を付加することを推奨します。 + +<h3 id="iconlabel">3. アプリケーションのマニフェストにアイコンとラベルを指定する</h3> + +<p>アプリケーションのマニフェストに指定するアイコンとラベルは、アプリケーションのアイコンと名前としてユーザーに表示されるため、重要な要素です。アイコンとラベルは、デバイスの [[]ホーム] 画面や、[[]アプリケーションの管理]、[[]マイダウンロード] などに表示されます。また、公開サービスによってアイコンとラベルがユーザーに表示される可能性もあります。 </p> + +<p>アイコンとラベルを指定するには、<code>android:icon</code> と <code>android:label</code> 属性をマニフェストの <code><application></code> 要素に定義します。 </p> + +<p>アイコンのデザインについては、組み込みの Android アプリケーションのスタイルとできるだけ統一感を持たせてください。</p> + +<h3 id="logging">4. ロギングとデバッグを無効にして、データとファイルをクリーンアップする</h3> + +<p>リリース時にはデバッグ機能を無効にし、デバッグおよびその他の不要なデータ/ファイルをアプリケーション プロジェクトから削除してください。</p> +<ul> +<li><code>android:debuggable="true"</code> 属性をマニフェストの <code><application></code> 要素から削除します。</li> +<li>ログ ファイル、バックアップ ファイル、およびその他の不要なファイルをアプリケーション プロジェクトから削除します。</li> +<li>個人的または自分専用のデータがないか確認し、必要に応じて削除します。</li> +<li>ソース コード内に {@link android.util.Log} メソッドへの呼び出しがある場合は、無効にします。</li> +</ul> + +<h2 id="finalcompile">アプリケーションの最終コンパイルを実行する前の作業</h2> + +<h3 id="versionapp">5. アプリケーションでバージョン管理を行う</h3> + +<p>アプリケーションをコンパイルする前に、アプリケーションにバージョン番号を定義しておく必要があります。定義するには、アプリケーションのマニフェスト ファイルの <code><manifest></code> 要素の <code>android:versionCode</code> と <code>android:versionName</code> 属性の両方に適切な値を指定します。バージョン番号の設定は、全体的なアプリケーションアップグレードの計画を考慮して、慎重に検討してください。 </p> + +<p>これまでにリリースしたバージョンがある場合、最新のアプリケーションのバージョン番号を旧バージョンから増加させる必要があります。アプリケーションのマニフェスト ファイルの <code><manifest></code> 要素の <code>android:versionCode</code> と <code>android:versionName</code> 属性の両方を適切な値を使用して増加する必要があります。 </p> + +<p>アプリケーションのバージョン情報を定義する方法は、<a href="{@docRoot}guide/publishing/versioning.html">Versioning Your Applications</a>をご覧ください。</p> + +<h3 id="cryptokey">6. 適切な暗号化キーを取得する</h3> + +<p>ここまで準備作業をすべて読んで実行していれば、アプリケーションはコンパイルされ、署名の準備ができています。.apk の内部では、アプリケーションは適切にバージョン管理されており、上記のように余分なファイルや非公開データは削除されています。 </p> + +<p>アプリケーションに署名する前に、適切な非公開キーがあることを確認する必要があります。非公開キーを取得(または生成)する方法については、<a href="{@docRoot}guide/publishing/app-signing.html#cert">適切な非公開キーの取得</a>をご覧ください。</p> + +<p>適切な非公開キーを取得(または生成)したら、キーを使用して次の手順を実行します:</p> + +<ul> +<li>アプリケーションが MapView 要素を使用している場合は、Maps API キー(以下をご覧ください)に登録します。</li> +<li>以降の準備プロセスで、リリースするアプリケーションに署名します。</li> +</ul> + +<h3 id="mapsApiKey">7. アプリケーションが MapView 要素を使用している場合は、Maps API キーに登録する</h3> + +<div class="sidebox" style="margin-bottom:.5em;padding:1em;"><p> +Maps API キーを取得する方法は、<a +href="http://code.google.com/android/add-ons/google-apis/mapkey.html">Maps API キーの取得(英語のみ)</a> をご覧ください。</p></div> + +<p>アプリケーションが Mapview 要素を使用する場合、アプリケーションを Google Maps サービスで登録し、Maps API キーを取得する必要があります。その後、MapView で Google Maps からデータを取得できるようになります。この処理を行うため、Maps サービスに署名証明書の MD5 フィンガープリントを提出します。 </p> + +<p>開発中は、SDK ツールが生成したデバッグ キーを登録して一時的な Maps API キーを取得できます。ただし、アプリケーションを公開する前には、非公開キーに基づく新しい Maps API キーで登録する必要があります。 </p> + +<p>アプリケーションが MapView 要素を使用する場合、次の点を理解することが重要です:</p> + +<ol> +<li>アプリケーションをリリース用にコンパイルする前に、Maps API キーを取得する必要があります。<em></em>このキーを、アプリケーションのレイアウト ファイルにある各 MapView 要素の、<code>android:apiKey</code> という特殊な属性に追加する必要があるからです。MapView オブジェクトをコードから直接インスタンス化している場合は、Maps API キーをコンストラクタのパラメータとして渡す必要があります。 +</li> +<li>アプリケーションの MapView 要素が参照する Maps API キーは Google Maps 内で登録され、アプリケーションの署名に使用される証明書に登録される必要があります。これはアプリケーションを公開する際に特に重要です。MapView 要素は、アプリケーションの署名に使用されるリリース証明書に登録されるキーを参照する必要があります。 </li> +<li>SDK ツールが生成したデバッグ証明書を登録して一時的な Maps API キーを取得している場合、リリース証明書を登録して新しい Maps API キーを取得する<em>必要があります</em>。また、MapView 要素を変更して、デバッグ証明書と関連付けられたキーではなく、新しいキーを参照させることも忘れないでください。このようにしないと、MapView 要素には Maps データをダウンロードする許可が与えられません。 </li> +<li>アプリケーションの署名に使用する非公開キーを変更するには、Google Maps サービスから新しい Maps API キーを取得する<em>必要があります</em>。新しい Maps API キーを取得してすべての MapView 要素に適用してください。以前のキーを参照する MapView 要素には、Maps データをダウンロードする許可が与えられません。 </li> +</ol> + +<p>署名と非公開キーについては、<a +href="{@docRoot}guide/publishing/app-signing.html">アプリケーションへの署名</a>をご覧ください。</p> + + +<h2 id="compile">アプリケーションのコンパイル</h2> + +<p>前述のセクションで説明したアプリケーションの準備ができたら、アプリケーションをリリース用にコンパイルできます。 </p> + +<h2 id="post-compile">アプリケーションをコンパイルした後の作業</h2> + +<h3 id="signapp">8. アプリケーションに署名する</h3> + +<p>非公開キーを使用してアプリケーションに署名します。アプリケーションに正しく署名することは、非常に重要です。詳細は、<a href="{@docRoot}guide/publishing/app-signing.html">アプリケーションへの署名</a>をご覧ください。 </p> + +<h3 id="testapp">9. コンパイルして署名したアプリケーションのテスト</h3> + +<p>コンパイルしたアプリケーションをリリースする前に、対象とする携帯端末(および可能ならば対象ネットワーク)上で徹底的にテストする必要があります。特に、UI 部分の MapView 要素がマップ データを正常に受信していることを確認してください。正常に受信していない場合、<a href="#mapsApiKey">Maps API キーに登録する</a>に戻って問題を解決してください。アプリケーションがサーバー側サービスを正しく利用できること、指定データまたは使用データを正しく処理できること、そして認証要件を正常に処理できることも確認してください。 </p> + +<p>これらのテストが完了したら、アプリケーションを携帯端末ユーザーに公開する準備が整ったと言えるでしょう。</p> + + diff --git a/docs/html/intl/ja/guide/publishing/versioning.jd b/docs/html/intl/ja/guide/publishing/versioning.jd new file mode 100644 index 0000000..bf86016 --- /dev/null +++ b/docs/html/intl/ja/guide/publishing/versioning.jd @@ -0,0 +1,100 @@ +page.title=アプリケーションのバージョニング +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + +<h2>バージョン管理の概略</h2> + +<ul> +<li>アプリケーションにはバージョンを設定する必要がある<em></em></a></li> +<li>バージョンは、アプリケーションのマニフェスト ファイルで設定する</li> +<li>アプリケーションのバージョン管理方法は、ユーザーのアップグレード方法に影響 </li> +<li>開発プロセスの初期段階で、今後のリリースの検討事項を含めて、バージョン管理戦略を決定します</li> +</ul> + +<h2>このドキュメントの内容</h2> + +<ol> +<li><a href="#appversion">アプリケーションのバージョンの設定</a></li> +<li><a href="#minsdkversion">最小システム API バージョンの指定</a> +</ol> + + +<h2>関連項目</h2> + +<ol> +<li><a href="{@docRoot}guide/publishing/preparing.html">公開の準備</a></li> +<li><a href="{@docRoot}guide/publishing/publishing.html#market">Android マーケットでの公開</a></li> +<li><a href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a></li> +</ol> + +</div> +</div> + +<p>バージョン管理のコンポーネントは、アプリケーションのアップグレード及びメンテナンスの計画を立てるのに重要です。 </p> + +<ul> +<li>ユーザーは、デバイスにインストールされたアプリケーション バージョンと、インストールが可能なアップグレード バージョンについて、特定の情報が必要です。 </li> +<li>スイートとして公開されたその他のアプリケーションなどでは、アプリケーションのバージョンをシステムに問い合わせて、互換性と依存関係を確認する必要があります。</li> +<li>アプリケーションを公開するサービスでは、アプリケーションにバージョンを問い合わせて、バージョンをユーザーに表示できるようにする必要があります。公開サービスでは、互換性を確認してアップグレードとダウングレードの関係を確立するために、アプリケーション バージョンを確認する必要があります。</li> +</ul> + +<p>Android システム自体は、アップグレードや互換性の制約の実施などのために、アプリケーション バージョン情報をアプリケーションに対して<em>確認することはありません</em>。代わりに、アプリケーションにおけるバージョン制約はユーザーまたはアプリケーション自体によって完全に実施されます。 </p> + +<p>Android システムが確認を行うのは、アプリケーションによってマニフェストの <code>minSdkVersion</code> 属性に指定されたシステム バージョン互換性です。<em></em>この属性によりアプリケーションは互換性を持つ最小システム API を指定できます。詳細は、<a href="#minsdkversion">最小システム API バージョンの指定</a>をご覧ください。 + +<h2 id="appversioning">アプリケーションのバージョンの設定</h2> +<p>アプリケーションのバージョン情報を定義するには、アプリケーションのマニフェスト ファイルで属性を設定します。2 つの属性を使用でき、常にこの両方に値を定義することが推奨されています: </p> + +<ul> +<li><code>android:versionCode</code> - アプリケーション コードのバージョンを他のバージョンと相対的に示す整数値。 + +<p>この値は整数なので、その他のアプリケーションはプログラムでバージョンの値を評価して関係を確認できます(たとえば、このバージョンがアップグレードかダウングレードなのか、など)。任意の整数値を設定できますが、アプリケーションの後続のリリースでは、現在より大きな値を使用するようにしてください。システムではこのバージョン管理の基準を強制しませんが、後継リリースの値を増加させることは標準的です。 </p> + +<p>通常、アプリケーションの最初のバージョンの versionCode を 1 に設定してリリースし、その後は各リリースについて、リリースがメジャー リリースであってもマイナー リリースであっても、値を単調増加させます。これは、<code>android:versionCode</code> の値は、ユーザーに表示されるアプリケーション リリース バージョンと類似している必要性はないことを意味します。以下の <code>android:versionName</code> をご覧ください。アプリケーションと公開サービスでは、このバージョンの値はユーザーには表示されません。</p> +</li> +<li><code>android:versionName</code> - アプリケーション コードのリリース バージョンを表す文字列値で、ユーザーに表示される値です。 +<p>値は文字列なので、アプリケーション バージョンを「<major>.<minor>.<point>」といった文字列や、その他のタイプの絶対的または相対的バージョン ID として記述できます。 </p> + +<p><code>android:versionCode</code> の場合と同様に、システムではこの値をアプリケーションでユーザーに表示する以外の目的で内部的に利用することはありません。公開サービスでは、ユーザーに表示するために <code>android:versionName</code> 値を取り出す可能性もあります。</p> +</li> +</ul> + +<p>これらのバージョン属性の両方をマニフェスト ファイルの <code><manifest></code> 要素で定義します。 </p> + +<p>ここに、<code><manifest></code> 要素の <code>android:versionCode</code> と <code>android:versionName</code> 属性を示すマニフェストの例を示します。 </p> + +<pre> +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.example.package.name" + android:versionCode="2" + android:versionName="1.1"> + <application android:icon="@drawable/icon" android:label="@string/app_name"> + ... + </application> +</manifest> +</pre> + +<p>この例では、<code>android:versionCode</code> 値は現在の .apk がこのアプリケーション コードの 2 番目のリリースを含んでいることを表し、これは <code>android:codeName</code> 文字列が示すようにマイナー後継リリースであることを示します。 </p> + +<p>Android フレームワークには、アプリケーションがシステムに別のアプリケーションのバージョン情報を問い合わせる API が用意されています。バージョン情報を取得するため、アプリケーションは {@link android.content.pm.PackageManager#getPackageInfo(java.lang.String, int)} +method of {@link android.content.pm.PackageManager PackageManager}. </p> を使用します。 + +<h2 id="minsdkversion">最小システム API バージョンの指定</h2> + +<p>アプリケーションが最低でも Android プラットフォームの特定のバージョンを必要とする場合、このバージョンを API レベルの ID としてアプリケーションのマニフェスト ファイルに指定できます。このようにすると、互換性のあるバージョンの Android システムを実行しているデバイスにのみアプリケーションをインストールできるようになります。 </p> + +<p>最小システム バージョンをマニフェストに指定するには、次の属性を使用します: </p> + +<ul> +<li><code>android:minSdkVersion</code> - Android プラットフォームのコード バージョンに対応する整数値。 +<p>アプリケーションのインストールを準備する際に、システムはこの属性の値を確認して、システム バージョンと比較します。<code>android:minSdkVersion</code> 値がシステム バージョンよりも大きい場合、システムはアプリケーションのインストールを中止します。 </p> + +<p>この属性をマニフェストに指定しない場合、システムではアプリケーションがすべてのプラットフォーム バージョンと互換性があると仮定します。</p></li> +</ul> + +<p>アプリケーションに最小プラットフォーム バージョンを指定するには、<code><uses-sdk></code> 要素を <code><manifest></code> の子として追加し、<code>android:minSdkVersion</code> を属性として定義します。 </p> + +<p>詳細は、<a href="{@docRoot}sdk/android-1.1.html">Android System Image 1.1 Version Notes</a> もご覧ください。</p> diff --git a/docs/html/intl/ja/guide/topics/fundamentals.jd b/docs/html/intl/ja/guide/topics/fundamentals.jd new file mode 100644 index 0000000..247d076 --- /dev/null +++ b/docs/html/intl/ja/guide/topics/fundamentals.jd @@ -0,0 +1,922 @@ +page.title=開発の基礎 +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> +<h2>主なクラス</h2> +<ol> +<li>{@link android.app.Activity}</li> +<li>{@link android.app.Service}</li> +<li>{@link android.content.BroadcastReceiver}</li> +<li>{@link android.content.ContentProvider}</li> +<li>{@link android.content.Intent}</li> +</ol> + +<h2>このドキュメントの内容</h2> +<ol> +<li><a href="#appcomp">アプリケーションのコンポーネント</a> + <ol> + <li><a href="#actcomp">コンポーネントのアクティブ化: インテント</a></li> + <li><a href="#endcomp">コンポーネントの終了</a></li> + <li><a href="#manfile">マニフェスト ファイル</a></li> + <li><a href="#ifilters">インテント フィルタ</a></li> + </ol></li> +<li><a href="#acttask">アクティビティとタスク</a> + <ol> + <li><a href="#afftask">親和性と新しいタスク</a></li> + <li><a href="#lmodes">起動モード</a></li> + <li><a href="#clearstack">スタックのクリア</a></li> + <li><a href="#starttask">タスクの開始</a></li> + </ol></li> +<li><a href="#procthread">プロセスとスレッド</a> + <ol> + <li><a href="#procs">プロセス</a></li> + <li><a href="#threads">スレッド</a></li> + <li><a href="#rpc">リモート プロシージャ コール</a></li> + <li><a href="#tsafe">スレッドセーフなメソッド</a></li> + </ol></li> +<li><a href="#lcycles">コンポーネントのライフサイクル</a> + <ol> + <li><a href="#actlife">アクティビティのライフサイクル</a></li> + <li><a href="#servlife">サービスのライフサイクル</a></li> + <li><a href="#broadlife">ブロードキャスト レシーバのライフサイクル</a></li> + <li><a href="#proclife">プロセスとライフサイクル</a></li> + </ol></li> +</ol> +</div> +</div> + +<p> +Android アプリケーションはすべて Java プログラミング言語で記述します。コンパイル済みの Java コード(およびそのアプリケーションに必要なすべてのデータやリソース ファイル)は、<a href="{@docRoot}guide/developing/tools/aapt.html"><code>aapt</code> ツール</a>を使用して Android パッケージにバンドルします。Android パッケージは、拡張子が {@code .apk} のアーカイブ ファイルです。<i></i>ユーザーは、このファイルをデバイスにダウンロードして利用します。つまり、Android パッケージは、アプリケーションをモバイル デバイスに配布およびインストールするための媒体として機能します。1 つの {@code .apk} ファイルに含まれているすべてのコードが、1 つのアプリケーションと見なされます。<i></i> +</p> + +<p> +各 Android アプリケーションは、以下に示すさまざまな方法で他のアプリケーションから隔離されています: +</p> + +<ul> +<li>すべてのアプリケーションは、デフォルトではそのアプリケーション個別の Linux プロセスで実行されます。Android は、アプリケーション コードの実行が必要になったときにプロセスを開始し、その必要がなくなって他のアプリケーションからシステム リソースを要求されたときにプロセスを終了します。</li> + +<li>プロセスごとに専用の Java 仮想マシン(VM)が割り当てられるため、アプリケーション コードは他のアプリケーションから隔離された状態で実行されます。</li> + +<li>デフォルトでは、アプリケーションごとに固有の Linux ユーザー ID が割り当てられます。権限が設定されているため、アプリケーションのファイルはそのユーザーからしか認識できず、そのアプリケーション自体からのみ利用できます。ただし、ファイルを他のアプリケーションにエクスポートすることは可能です。</li> +</ul> + +<p> +2 つのアプリケーションで同じユーザー ID を共有することもできます。その場合は、それぞれのアプリケーションのファイルを相互に認識できます。システム リソースを節約するため、同じ ID のアプリケーションで同じ VM を共有し、同じ Linux プロセスで実行することも可能です。 +</p> + + +<h2 id="appcomp">アプリケーションのコンポーネント</h2> + +<p> +Android の大きな特長の 1 つは、許可されていれば、あるアプリケーションから別のアプリケーションの要素を利用できる点です。たとえば、開発中のアプリケーションで画像の一覧をスクロール表示したい場合、他のアプリケーションで開発済みの適切なスクローラがあり、その利用が許可されていれば、独自に開発しなくてもそのスクローラを利用できます。アプリケーションに他のアプリケーションのコードを組み込んだり、リンクを設定したりする必要はありません。必要になった時点で、他のアプリケーションの一部分を開始するだけです。 +</p> + +<p> +この仕組みが機能するには、アプリケーション プロセスの一部分を必要に応じて開始でき、その部分の Java オブジェクトをインスタンス化できなくてはなりません。そのため、Android アプリケーションには、他のシステムで動作するアプリケーションでよく使用されるような、アプリケーション全体にアクセスするための単一のエントリ ポイント(たとえば {@code main()} 関数)はありません。代わりに、システムが必要に応じてインスタンス化して実行できるコンポーネントで構成されます。<i></i>コンポーネントには以下の 4 つのタイプがあります: +</p> + +<dl> + +<dt><b>アクティビティ</b></dt> +<dd>アクティビティは、ユーザーが 1 つの操作を集中的に行うための視覚的なユーザー インターフェースを表します。<i></i>たとえば、ユーザーが選択できるメニュー アイテムの一覧を表示するアクティビティや、写真をキャプション付きで表示するアクティビティなどが考えられます。SMS アプリケーションなら、あるアクティビティでメッセージを送信する連絡先の一覧を表示し、別のアクティビティで選択した連絡先へのメッセージを入力し、その他のアクティビティで古いメッセージを参照したり設定を変更したりできます。これらのアクティビティを組み合わせて全体としてのユーザー インターフェースを形成しますが、それぞれのアクティビティは相互に独立しています。各アクティビティは、{@link android.app.Activity} 基本クラスのサブクラスとして実装されます。 + +<p> +アプリケーションは、1 つのアクティビティで構成することも、上記のSMS アプリケーションのように複数のアクティビティで構成することもできます。どのようなアクティビティがいくつ必要になるかは、アプリケーションやその設計に応じて異なります。通常は、アクティビティのうちのいずれかを最初のアクティビティとして指定し、ユーザーがアプリケーションを起動したときに表示します。あるアクティビティから別のアクティビティに移動するには、現在のアクティビティから次のアクティビティを開始します。 +</p> + +<p> +各アクティビティには、それを表示するためのデフォルトのウィンドウが割り当てられます。通常はウィンドウを画面全体に表示しますが、画面より小さいウィンドウを他のウィンドウの前面に表示することもできます。アクティビティに、新たなウィンドウを追加することも可能です。たとえば、アクティビティの途中でユーザーの応答を要求するポップアップ ダイアログを表示したり、ユーザーが画面上の特定のアイテムを選択したときに別ウィンドウで重要な情報を表示したりできます。 +</p> + +<p> +ウィンドウの視覚的なコンテンツは、ビュー({@link android.view.View} 基本クラスの派生オブジェクト)の階層として提供されます。各ビューは、ウィンドウ内の特定の矩形領域を制御します。親ビューは、その子となるビューで構成され、それらの子ビューのレイアウトを決定します。リーフ ビュー(階層の最下位に位置するビュー)は、そのビューが制御する矩形領域に表示され、その領域でのユーザーのアクションに対して応答します。つまり、ビューはアクティビティとユーザーが対話する場所です。たとえば、ビューに小さな画像を表示し、ユーザーがその画像をタップしたら何らかのアクションを開始することもできます。Android には、ボタン、テキスト フィールド、スクロール バー、メニュー アイテム、チェックボックスなど、さまざまなビューがあらかじめ用意されています。 +</p> + +<p> +ビューの階層は、<code>{@link android.app.Activity#setContentView Activity.setContentView()}</code> メソッドを使用してアクティビティのウィンドウ内に配置します。コンテンツ ビューは、階層のルートとなる View オブジェクトです<i></i>(ビューおよびその階層について詳しくは<a href="{@docRoot}guide/topics/ui/index.html">User Interface</a> のドキュメントをご覧ください)。 +</p> + +<p><dt><b>サービス</b></dt> +<dd>サービスは、視覚的なユーザー インターフェースを持たず、バックグラウンドにおいて明確な終了期限がなくで実行されます。<i></i>たとえば、ユーザーが他の操作をしている間 BGM を再生するサービス、ネットワーク経由でデータをフェッチするサービス、何かを計算してその結果をアクティビティに提供するサービスなどが考えられます。各サービスは、{@link android.app.Service} 基本クラスの拡張です。 + +<p> +典型的な例としては、プレイリストの曲を再生するメディア プレーヤーが挙げられます。プレーヤー アプリケーションは、ユーザーが曲を選んで再生するための 1 つ以上のアクティビティで構成することが予想されますが、ユーザーはプレーヤーを離れて別の操作に移った後も曲を聞いていたいと考えられることから、曲の再生自体をアクティビティで処理するわけにはいきません。音楽の再生を続けるには、メディア プレーヤー アクティビティから、バックグラウンドで実行するサービスを開始します。音楽再生サービスは、それを開始したアクティビティが画面上に見えなくなった後もそのまま実行されます。 +</p> + +<p> +また、実行中のサービスに接続(バインド)することもできます(実行されていない場合はそのサービスを開始することも可能です)。接続中は、サービスが公開しているインターフェースを使ってサービスと対話できます。音楽再生サービスであれは、このインターフェースを使って一時停止、巻き戻し、停止、再生の再開などの操作を実行できるようにします。 +</p> + +<p> +アクティビティや他のコンポーネントと同様に、サービスもアプリケーション プロセスのメイン スレッドで実行します。したがって、サービスによって他のコンポーネントやユーザー インターフェースの実行を妨げられることはなく、時間がかかるタスク(たとえば曲の再生)については、通常は別のスレッドを生成して処理します。詳しくは、<a href="#procthread">プロセスとスレッド</a>をご覧ください。 +</p></dd> + +<dt><b>ブロードキャスト レシーバ</b></dt> +<dd>ブロードキャスト レシーバは、ブロードキャストの連絡を受信してそれに対処するだけのコンポーネントです。<i></i>ブロードキャストの多くが元々はシステム コードで、たとえばタイム ゾーンが変更されたこと、電池の残量が少なくなったこと、写真が撮影されたこと、ユーザーが言語設定を変更したことなどを連絡するために使用します。アプリケーションでも、たとえば何らかのデータがデバイスにダウンロードされて利用できるようになったことを、他のアプリケーションにブロードキャストで知らせることができます。 + +<p> +アプリケーションでは、重要と思われるすべての連絡に応答できるよう、ブロードキャスト レシーバをいくつでも設定できます。すべてのレシーバは、{@link android.content.BroadcastReceiver} 基本クラスの拡張です。 +</p> + +<p> +ブロードキャスト レシーバがユーザー インターフェースを表示することはありません。ただし、受信した情報への応答としてアクティビティを開始したり、{@link android.app.NotificationManager} を使用してユーザーにアラートを送信したりすることはあります。通知の際には、バックライトを点滅させる、バイブレーションを起動する、音を鳴らすなど、さまざまな方法でユーザーの注意を喚起できます。通常は、ステータス バーに永続アイコンを表示し、ユーザーがこれを開いてメッセージを取得できるようにします。 +</p></dd> + +<dt><b>コンテンツ プロバイダ</b></dt> +<dd>コンテンツ プロバイダは、アプリケーションのデータを他のアプリケーションでも利用できるようにします。<i></i>データは、ファイル システムや SQLite データベースなど、一般に利用できる方法で格納されていれば使用できます。コンテンツ プロバイダは、{@link android.content.ContentProvider} 基本クラスの拡張です。プロバイダが制御する型のデータを、他のアプリケーションから取得および格納するための標準メソッド セットを実装しています。ただし、これらのメソッドをアプリケーションから直接呼び出すことはできません。代わりに、{@link android.content.ContentResolver} オブジェクトのメソッドを呼び出します。ContentResolver は、すべてのプロバイダと通信でき、プロバイダと連携して関係のあるすべてのプロセス間通信を管理します。 + +<p> +コンテンツ プロバイダの使用方法について詳しくは、<a href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a>のドキュメントをご覧ください。 +</p></dd> + +</dl> + +<p> +Android では、特定のコンポーネントで処理すべきリクエストがあると、そのコンポーネントのアプリケーション プロセスが実行中かどうかを確認(必要に応じてプロセスを開始)し、そのコンポーネントの適切なインスタンスが利用可能かどうかを確認(必要に応じてインスタンスを作成)します。 +</p> + + +<h3 id="actcomp">コンポーネントのアクティブ化: インテント</h3> + +<p> +コンテンツ プロバイダは、ContentResolver からのリクエストの対象になるとアクティブ化されます。それ以外の 3 つのコンポーネント(アクティビティ、サービス、ブロードキャスト レシーバ)は、インテントと呼ばれる非同期メッセージによってアクティブ化されます。<i></i>インテントは、メッセージのコンテンツを保持する {@link android.content.Intent} オブジェクトです。アクティビティやサービスの場合の Intent オブジェクトの主な役割は、リクエストされているアクションを指名し、その対象となるデータの URI を指定することです。たとえば、ユーザーに画像を表示するためのリクエストや、ユーザーにテキストを編集させるリクエストをアクティビティに伝達できます。ブロードキャスト レシーバの場合は、Intent オブジェクトがこれから通知を行うアクションを指名します。たとえば、カメラのボタンが押されたことを、関係のあるブロードキャスト レシーバに通知できます。 +</p> + +<p> +以下に示すように、コンポーネントのタイプごとに別々のアクティブ化メソッドが用意されています: +</p> + +<ul> + +<li>アクティビティを起動する(または何か新しい処理を実行させる)には、Intent オブジェクトを <code>{@link android.content.Context#startActivity +Context.startActivity()}</code> または <code>{@link +android.app.Activity#startActivityForResult +Activity.startActivityForResult()}</code> に渡します。応答アクティビティで <code>{@link android.app.Activity#getIntent getIntent()}</code> メソッドを呼び出すと、最初にそのアクティビティが起動されたときのインテントの内容を確認できます。Android によってアクティビティの <code>{@link +android.app.Activity#onNewIntent onNewIntent()}</code> メソッドが呼び出され、アクティビティが後続のインテントに渡されます。 + +<p> +多くの場合、アクティビティから次のアクティビティを開始します。開始するアクティビティから結果が返される場合は、{@code startActivity()} ではなく {@code startActivityForResult()} を呼び出します。たとえば、ユーザーに写真を選択させるアクティビティを開始する場合は、ユーザーによって選択された写真が返されるかもしれません。結果は、呼び出し側のアクティビティの <code>{@link android.app.Activity#onActivityResult +onActivityResult()}</code> メソッドに渡した Intent オブジェクトで返されます。 +</p> +</li> + +<li><p>サービスを開始する(または実行中のサービスに新しい指示を与える)には、<code>{@link +android.content.Context#startService Context.startService()}</code> に Intent オブジェクトを渡します。Android により、サービスの <code>{@link android.app.Service#onStart +onStart()}</code> メソッドが呼び出されて Intent オブジェクトが渡されます。</p> + +<p> +同様に、インテントを <code>{@link +android.content.Context#bindService Context.bindService()}</code> に渡すと、呼び出し側のコンポーネントと対象となるサービスの間の継続中の接続を確立できます。サービスは、<code>{@link android.app.Service#onBind onBind()}</code> 呼び出しで Intent オブジェクトを受け取ります(サービスがまだ開始されていない場合は、必要に応じて {@code bindService()} で開始できます)。たとえば、上で例に挙げた音楽再生サービスとの接続を確立するアクティビティを使用して、ユーザーが再生を操作するための手段(ユーザー インターフェース)を提供できます。アクティビティで {@code bindService()} を呼び出して接続を確立してから、サービスに定義されているメソッドを呼び出して再生を操作します。 +</p> + +<p> +サービスのバインドについては、後ほど<a href="#rpc">リモート プロシージャ コール</a>のセクションで詳しく説明します。 +</p> +</li> + +<li><p>アプリケーションでブロードキャストを開始するには、<code>{@link +android.content.Context#sendBroadcast(Intent) Context.sendBroadcast()}</code>、<code>{@link android.content.Context#sendOrderedBroadcast(Intent, String) +Context.sendOrderedBroadcast()}</code>、<code>{@link +android.content.Context#sendStickyBroadcast Context.sendStickyBroadcast()}</code> などのメソッドのいずれかのバリエーションに Intent オブジェクトを渡します。Android によって <code>{@link +android.content.BroadcastReceiver#onReceive onReceive()}</code> メソッドが呼び出され、関係のあるすべてのブロードキャスト レシーバにインテントが配信されます。</p></li> + +</ul> + +<p> +インテント メッセージについて詳しくは、<a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and Intent Filters</a> をご覧ください。 +</p> + + +<h3 id="endcomp">コンポーネントの終了</h3> + +<p> +コンテンツ プロバイダは、ContentResolver からのリクエストに応答している間のみアクティブになります。ブロードキャスト レシーバは、ブロードキャスト メッセージに応答している間のみアクティブになります。つまり、これらのコンポーネントを明示的に終了させる必要はありません。 +</p> + +<p> +一方、アクティビティはユーザー インターフェースを提供します。長い時間をかけてユーザーと会話するためのものであり、待機状態の間も、会話が続いてきる限りはアクティブなままになっている可能性があります。同様に、サービスも長い間実行されたままになる可能性があります。Android には、アクティビティとサービスを以下のような規則的な方法で終了させるためのメソッドが用意されています: +</p> + +<ul> +<li>アクティビティを終了させるには、その <code>{@link android.app.Activity#finish finish()}</code> メソッドを呼び出します。あるアクティビティから {@code startActivityForResult()} で開始した別のアクティビティは、<code>{@link android.app.Activity#finishActivity finishActivity()}</code> を呼び出して終了させることができます。</li> + +<li>サービスは、その <code>{@link android.app.Service#stopSelf stopSelf()}</code> メソッドを呼び出すか、<code>{@link android.content.Context#stopService Context.stopService()}</code> を呼び出すことで停止できます。</li> +</ul> + +<p> +コンポーネントが、既に利用されていない場合や、Android がよりアクティブな他のコンポーネントにメモリを割り当てる必要がある場合は、システムがコンポーネントを終了させることもあります。このような状況およびその影響については、<a href="#lcycles">コンポーネントのライフサイクル</a>で詳しく説明します。 +</p> + + +<h3 id="manfile">マニフェスト ファイル</h3> + +<p> +アプリケーション コンポーネントを開始するには、Android がそのコンポーネントの存在を認識している必要があります。アプリケーションのコンポーネントは、マニフェスト ファイルで宣言します。このファイルは、アプリケーションのコード、ファイル、リソースなどとともに Android パッケージ({@code .apk} ファイル)にバンドルされます。 +</p> + +<p> +マニフェストは構造化された XML ファイルで、どのアプリケーションでも常に AndroidManifest.xml という名前になります。アプリケーション コンポーネントの宣言以外にも、アプリケーションをリンクさせる必要のあるライブラリ(デフォルトの Android ライブラリを除く)の指定や、アプリケーションに付与されるべき権限の指定などにも使用します。 +</p> + +<p> +しかし、マニフェストの最も重要な役割は、アプリケーションのコンポーネントに関する情報を Android に提供することです。たとえば、アクティビティを次のように宣言できます: +</p> + +<pre><?xml version="1.0" encoding="utf-8"?> +<manifest . . . > + <application . . . > + <activity android:name="com.example.project.FreneticActivity" + android:icon="@drawable/small_pic.png" + android:label="@string/freneticLabel" + . . . > + </activity> + . . . + </application> +</manifest></pre> + +<p> +<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> 要素の {@code name} 属性は、そのアクティビティを実装する {@link android.app.Activity} サブクラスを指名します。{@code icon} および {@code label} 属性には、ユーザーに対して表示するアイコンやラベルが保持されているリソース ファイルを指定します。 +</p> + +<p> +その他のコンポーネントも、サービスは <code><a href="{@docRoot}guide/topics/manifest/service-element.html"><service></a></code> 要素、ブロードキャスト レシーバは <code><a href="{@docRoot}guide/topics/manifest/receiver-element.html"><receiver></a></code> 要素、コンテンツ プロバイダは <code><a href="{@docRoot}guide/topics/manifest/provider-element.html"><provider></a></code> 要素を使用して同じような方法で宣言します。マニフェストに宣言されていないアクティビティ、サービス、およびコンテンツ プロバイダは、システムから認識できないため実行されることはありません。ただし、ブロードキャスト レシーバの場合は、マニフェストで宣言する方法と、コード内で {@link android.content.BroadcastReceiver} オブジェクトとして動的に作成し、<code>{@link android.content.Context#registerReceiver Context.registerReceiver()}</code> を呼び出してシステムに登録する方法があります。 +</p> + +<p> +マニフェスト ファイルの作成方法について詳しくは、<a href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a>をご覧ください。 +</p> + + +<h3 id="ifilters">インテント フィルタ</h3> + +<p> +Intent オブジェクトでは、対象とするコンポーネントを明示的に指名できます。明示的に指名されている場合、Android はマニフェスト ファイル内の宣言に基づいてコンポーネントを特定してアクティブにします。一方、明示的に指名されていない場合は、そのインテントに応答する上で最適なコンポーネントが選択されます。方法としては、Intent オブジェクトを、その対象となりうるコンポーネントのインテント フィルタと照合します。<i></i>コンポーネントのインテント フィルタは、そのコンポーネントで処理できるインテントの種類を示します。これもコンポーネントに関する重要な情報の 1 つなので、マニフェスト ファイルで宣言します。次に、上に示した例を拡張して 2 つのインテント フィルタを追加したアクティビティを示します: +</p> + +<pre><?xml version="1.0" encoding="utf-8"?> +<manifest . . . > + <application . . . > + <activity android:name="com.example.project.FreneticActivity" + android:icon="@drawable/small_pic.png" + android:label="@string/freneticLabel" + . . . > + <intent-filter . . . > + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + <intent-filter . . . > + <action android:name="com.example.project.BOUNCE" /> + <data android:mimeType="image/jpeg" /> + <category android:name="android.intent.category.DEFAULT" /> + </intent-filter> + </activity> + . . . + </application> +</manifest></pre> + +<p> +この例の 1 つ目のフィルタは、アクション「{@code android.intent.action.MAIN}」とカテゴリ「{@code android.intent.category.LAUNCHER}」を組み合わせた一般的なフィルタです。このフィルタは、アプリケーション ランチャ(ユーザーがデバイス上で起動できるアプリケーションを一覧表示した画面)に、このアクティビティを表示する必要があることを示しています。つまり、このアクティビティはアプリケーションへのエントリ ポイントとして機能し、ユーザーがランチャでそのアプリケーションを選択したときに最初に表示されるということです。 +</p> + +<p> +2 つ目のフィルタでは、アクティビティが特定のタイプのデータに対して実行できるアクションを宣言しています。 +</p> + +<p> +コンポーネントにはインテント フィルタをいくつでも指定でき、それぞれのフィルタで別々の機能を宣言できます。フィルタが 1 つも指定されていないコンポーネントは、そのコンポーネントが対象として明示的に指名されているインテントでのみアクティブにできます。 +</p> + +<p> +コード内で作成して登録したブロードキャスト レシーバの場合、インテント フィルタは {@link android.content.IntentFilter} オブジェクトとして直接インスタンス化されます。それ以外の全てのフィルタは、マニフェストで設定します。 +</p> + +<p> +インテント フィルタについて詳しくは、<a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and Intent Filters</a> をご覧ください。 +</p> + + +<h2 id="acttask">アクティビティとタスク</h2> + +<p> +既に説明したように、あるアクティビティから別のアクティビティを開始することができます。これには、別のアプリケーションで定義されているアクティビティも含まれます。たとえば、ユーザーに特定の場所の地図を表示するとします。そのためのアクティビティは既に存在しているので、現在のアクティビティで必要な情報を Intent オブジェクトに格納して {@code startActivity()} に渡すだけで、マップ ビューアに地図を表示できます。ユーザーが [戻る] キーを押すと、画面に元のアクティビティが再表示されます。 +</p> + +<p> +この場合、マップ ビューアは別のアプリケーションで定義されており、そのアプリケーションのプロセスで実行されていますが、ユーザーにとってはマップ ビューアが元のアプリケーションの一部であるかのように感じられます。Android では、両方のアクティビティを同じタスクに組み込むことで、このようなユーザー エクスペリエンスを実現できます。<i></i>簡単に言えば、ユーザーが 1 つの「アプリケーション」と感じるものがタスクです。関連するアクティビティをスタックにまとめたものがタスクです。スタック内のルート アクティビティは、タスクを開始するアクティビティです。通常であれば、ユーザーがアプリケーション ランチャで選択するアクティビティがこれに相当します。スタックの最上位にあるアクティビティは、ユーザーのアクションの焦点となっている実行中のアクティビティです。あるアクティビティから別のアクティビティを開始すると、そのアクティビティが新たにスタックにプッシュされて実行中のアクティビティになります。1 つ前のアクティビティはスタック内に残されています。ユーザーが [[]戻る] キーを押すと、現在のアクティビティがスタックからポップされ、1 つ前のアクティビティが実行中のアクティビティとして再開されます。 +</p> + +<p> +スタックはオブジェクトを保持します。したがって、同じ Activity サブクラスのインスタンス(たとえばマップ インスタンス)を複数開くと、それぞれのインスタンスが別々のエントリになります。スタック内のアクティビティは、プッシュまたはポップされるのみで再配置されることはありません。 +</p> + +<p> +タスクはアクティビティのスタックであり、マニフェスト ファイル内のクラスや要素ではありません。したがって、アクティビティと無関係にタスクの値を設定することはできません。タスクの値は、ルート アクティビティでまとめて設定します。たとえば、次のセクションでは「タスクの親和性」について説明しますが、値はタスクのルート アクティビティの親和性のセットから読み込まれます。 +</p> + +<p> +タスク内のアクティビティは、1 つのユニットとして一緒に移動します。タスク全体(アクティビティ スタック全体)をフォアグラウンドに移動したり、バックグラウンドに移動したりできます。たとえば、現在のタスクは 4 つのアクティビティからなるスタックで、現在のアクティビティの下にアクティビティが 3 つあるとします。ここで、ユーザーが [ホーム] キーを押してアプリケーション ランチャに移動し、新しいアプリケーション(実際には新しいタスク)を選択したとします。<i></i>すると、現在のタスクはバックグラウンドに移動し、新しいタスクのルート アクティビティが表示されます。しばらくして、ユーザーがホーム画面に戻り 1 つ前のアプリケーション(タスク)を選択すると、そのタスクがスタック内の 4 つのアクティビティとともにフォアグラウンドに移動します。ここでユーザーが [戻る] キーを押しても、中断したばかりのアプリケーション(1 つ前のタスクのルート アクティビティ)は表示されません。代わりに、スタックの最上位のアクティビティがポップされ、同じタスクの 1 つ前のアクティビティが表示されます。 +</p> + +<p> +アクティビティとタスクの動作としては、ここで説明した動作がデフォルトです。ただし、この動作のほとんどの要素は変更可能です。タスクとアクティビティの関連付けやタスク内でのアクティビティの動作は、アクティビティを開始した Intent オブジェクトのフラグ セットと、マニフェストに指定されているアクティビティの <code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> 要素の属性セットとの相互作用によって決まります。リクエスト側と応答側の両方が動作に影響を及ぼします。 +</p> + +<p> +この点において、主に使用する Intent フラグは以下のとおりです: + +<p style="margin-left: 2em">{@code FLAG_ACTIVITY_NEW_TASK} <br/>{@code FLAG_ACTIVITY_CLEAR_TOP} <br/>{@code FLAG_ACTIVITY_RESET_TASK_IF_NEEDED} <br/>{@code FLAG_ACTIVITY_SINGLE_TOP}</p> + +<p> +また、主に使用する {@code <activity>} 属性は以下のとおりです: + +<p style="margin-left: 2em">{@code taskAffinity} <br/>{@code launchMode} <br/>{@code allowTaskReparenting} <br/>{@code clearTaskOnLaunch} <br/>{@code alwaysRetainTaskState} <br/>{@code finishOnTaskLaunch}</p> + +<p> +以降のセクションでは、これらのフラグや属性の役割、相互作用の仕組み、使用する際の留意事項などについて説明します。 +</p> + + +<h3 id="afftask">親和性と新しいタスク</h3> + +<p> +デフォルトでは、アプリケーション内のすべてのアクティビティは相互に親和性があり、すべてのアクティビティができる限り同じタスクに属そうとします。<i></i>ただし、{@code <activity>} 要素の {@code taskAffinity} 属性を使用して、アクティビティごとに個別の親和性を設定することもできます。つまり、別々のアプリケーションで定義されているアクティビティで親和性を共有したり、同じアプリケーションで定義されているアクティビティに別々の親和性を割り当てたりできるということです。親和性が作用する状況は 2 つあります。1 つはアクティビティを起動する Intent オブジェクトに {@code FLAG_ACTIVITY_NEW_TASK} フラグが含まれている場合、もう 1 つはアクティビティの {@code allowTaskReparenting} 属性が "{@code true}" に設定されている場合です。 +</p> + +<dl> +<dt><code>{@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK}</code> フラグ</dt> +<dd>既に説明したとおり、新しいアクティビティは、デフォルトでは {@code startActivity()} を呼び出したアクティビティのタスクの一部として起動します。つまり、呼び出し側のアクティビティと同じスタックにプッシュされるということです。しかし、{@code startActivity()} に渡された Intent オブジェクトに {@code FLAG_ACTIVITY_NEW_TASK} フラグが含まれている場合、システムはその新しいアクティビティを別のタスクに収容しようとします。フラグの名前からも判断できますが、ほとんどの場合は新しいタスクが開始されます。ただし常にそうなるとは限りません。既存のタスクに新しいアクティビティと同じ親和性が割り当てられている場合、そのアクティビティはそのタスクの一部として起動します。そうでない場合には、新しいタスクが開始されます。</dd> + +<dt><code><a +href="{@docRoot}guide/topics/manifest/activity-element.html#reparent">allowTaskReparenting</a></code> 属性</dt> +<dd>{@code allowTaskReparenting} 属性が "{@code true}" に設定されているアクティビティは、そのアクティビティと親和性のあるタスクがフォアグラウンドに移ったときに、アクティビティを開始したタスクから親和性のあるタスクに移動できます。たとえば、旅行アプリケーションの一部として、選択された都市の天気予報を表示するアクティビティが定義されているとします。このアクティビティには、同じアプリケーション内の他のアクティビティと同じ親和性(デフォルトの親和性)が割り当てられていますが、その親の割り当てを変更することも可能です。あるアクティビティが天気予報アクティビティを開始すると、その時点では開始側のアクティビティと同じタスクに属した状態になります。しかし、次に旅行アプリケーションがフォアグラウンドに移ると、天気予報アクティビティの割り当てが変更され、旅行アプリケーションのタスクの一部として表示されます。</dd> +</dl> + +<p> +ユーザーから見て複数の「アプリケーション」が 1 つの {@code .apk} ファイルに含まれている場合は、それぞれのアプリケーションに関連付けられているアクティビティに別々の親和性を割り当てることをおすすめします。 +</p> + + +<h3 id="lmodes">起動モード</h3> + +<p> +<code><a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">launchMode</a></code> 属性の {@code <activity>} 要素には、以下の 4 種類の起動モードを割り当てることができます: +</p> + +<p style="margin-left: 2em">"{@code standard}"(デフォルト モード)<br>"{@code singleTop}"<br>"{@code singleTask}"<br>"{@code singleInstance}"</p> + +<p> +これらのモードは、それぞれが以下の 4 つの点で異なります: +</p> + +<ul> + +<li><b>インテントに応答するアクティビティをどのタスクに保持するか</b>。"{@code standard}" および "{@code singleTop}" モードの場合は、そのインテントを開始した(つまり <code>{@link android.content.Context#startActivity startActivity()}</code> を呼び出した)タスクに保持されます。ただし、Intent オブジェクトに <code>{@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK}</code> フラグが含まれている場合は、前のセクション<a href="#afftask">親和性と新しいタスク</a>で説明したとおり、別のタスクが選択されます。 + +<p> +一方、"{@code singleTask}" および "{@code singleInstance}" モードの場合は、アクティビティが常にタスクのルート アクティビティになります。タスクは定義されており、他のタスクの一部として起動されることはありません。 +</p> + +<li><p><b>アクティビティのインスタンスを複数生成できるか</b>。"{@code standard}" または "{@code singleTop}" アクティビティは複数回インスタンス化できます。それらのインスタンスを複数のタスクに割り当てることも、特定のタスクに同じアクティビティの複数のインスタンスを割り当てることも可能です。 +</p> + +<p> +一方、"{@code singleTask}" および "{@code singleInstance}" アクティビティのインスタンスは 1 つに制限されます。これらのアクティビティはタスクのルートに当たります。したがって、これらのタスクの複数のインスタンスがデバイス上に同時に存在することはないということになります。 +</p> + +<li><p><b>インスタンスのタスクに他のアクティビティを含めることができるか</b>。"{@code singleInstance}" アクティビティは、そのタスク内の唯一のアクティビティとして単独で動作します。ここから別のアクティビティを開始した場合、そのアクティビティは起動モードに関係なく、あたかもインテントに {@code FLAG_ACTIVITY_NEW_TASK} フラグが含まれているかのように別のタスクで起動します。"{@code singleInstance}" モードと "{@code singleTask}" モードは、これ以外の点ではまったく同じです。</p> + +<p> +他の 3 つのモードでは、タスクに複数のアクティビティを割り当てることができます。"{@code singleTask}" アクティビティは、常にタスクのルート アクティビティになりますが、同じタスクに割り当てることになる別のアクティビティを開始することができます。"{@code standard}" および "{@code singleTop}" アクティビティのインスタンスは、スタック内のどの位置にでも配置できます。 +</p></li> + +<li><b>クラスの新しいインスタンスを起動して新しいインテントを処理するかどうか</b>。デフォルトの "{@code standard}" モードの場合は、新しいインテントに応答するときには必ず新しいインスタンスが作成されます。それぞれのインスタンスで処理するインテントは 1 つのみです。"{@code singleTop}" モードの場合は、クラスの既存のインスタンスが対象タスクのアクティビティ スタックの最上位にあれば、それを再利用して新しいインテントを処理します。スタックの最上位にない場合は再利用されません。代わりに、新しいインスタンスが作成されてスタックにプッシュされ、新しいインテントの処理に使用されます。 + +<p> +たとえば、タスクのアクティビティ スタックに、ルート アクティビティ A とアクティビティ B、C、D が含まれているとします。スタック内のアクティビティの順序は A-B-C-D で D が最上位です。ここに、アクティビティのタイプが D のインテントが届きます。D の起動モードがデフォルトの "{@code standard}" である場合は、そのクラスの新しいインスタンスが起動し、スタックは A-B-C-D-D となります。しかし、D の起動モードが "{@code singleTop}" であれば、スタックの最上位は D なので、新しいインテントは既存のインスタンスによって処理されるはずです。したがって、スタックは A-B-C-D のままとなります。 +</p> + +<p> +一方、届いたインテントのアクティビティ タイプが B だった場合は、B のモードが "{@code standard}" であっても "{@code singleTop}"であっても B の新しいインスタンスが起動します。これは B がスタックの最上位ではないためで、結果としてスタックは A-B-C-D-B となります。 +</p> + +<p> +"{@code singleTask}" または "{@code singleInstance}" アクティビティの場合は、既に説明したとおり同時に複数のインスタンスが存在することはないため、インスタンスは常に新しいインテントを処理することになります。"{@code singleInstance}" アクティビティはスタック内の唯一のアクティビティであるため、常にスタックの最上位、つまりインテントを処理する位置にあります。一方、"{@code singleTask}" アクティビティは、スタック内の上位に他のアクティビティがある場合とない場合があります。上位にアクティビティがある場合、インテントを処理する位置にはないため、そのインテントはドロップされます(インテントがドロップされたとしても、そのインテントが届いたことによって、タスクがフォアグラウンドに移ったままの状態になります)。 +</p> +</li> + +</ul> + +<p> +既存のアクティビティで新しいインテントを処理することになった場合は、<code>{@link android.app.Activity#onNewIntent onNewIntent()}</code> の呼び出しによって Intent オブジェクトがアクティビティに渡されます(最初にアクティビティを開始したインテント オブジェクトは <code>{@link android.app.Activity#getIntent getIntent()}</code> を呼び出して取得できます)。 +</p> + +<p> +なお、新しいインテントを処理するためにアクティビティの新しいインスタンスが作成された場合、ユーザーは [[]戻る] キーを押して 1 つ前の状態(1 つ前のアクティビティ)に戻ることができます。しかし、アクティビティの既存のインスタンスで新しいインテントを処理する場合は、[[]戻る] キーを押しても、新しいインテントが届く前にそのインスタンスで処理していた作業に戻ることはできません。 +</p> + +<p> +起動モードについて詳しくは、<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> 要素の説明をご覧ください。 +</p> + + +<h3 id="clearstack">スタックのクリア</h3> + +<p> +ユーザーがタスクを長時間放置すると、タスクのルート アクティビティを除くすべてのアクティビティがクリアされます。ユーザーがタスクに戻ると、タスクは以前のように表示されますが、残っているのは最初のアクティビティだけです。つまり、一定の時間が経過していればユーザーは以前の作業を放棄していて、新しい作業をするためにそのタスクに戻ってきたと考えるわけです。 +</p> + +<p> +これがデフォルトです。この動作を変更したい場合は、以下のアクティビティ属性を使用します: +</p> + +<dl> +<dt><code><a +href="{@docRoot}guide/topics/manifest/activity-element.html#always">alwaysRetainTaskState</a></code> 属性</dt> +<dd>タスクのルート アクティビティでこの属性を "{@code true}" に設定すると、上で説明したデフォルトの動作は発生しません。長時間経過しても、タスク内のすべてのアクティビティはそのまま残されます。</dd> + +<dt><code><a +href="{@docRoot}guide/topics/manifest/activity-element.html#clear">clearTaskOnLaunch</a></code> 属性</dt> +<dd>タスクのルート アクティビティでこの属性を "{@code true}" に設定した場合、ユーザーがいったんタスクを離れると、戻ったときにはルートを含むすべてのアクティビティがクリアされています。つまり、{@code alwaysRetainTaskState} の正反対の動作になります。ユーザーが一瞬でもタスクを離れると、最初の状態からやり直すことになります。</dd> + +<dt><code><a +href="{@docRoot}guide/topics/manifest/activity-element.html#finish">finishOnTaskLaunch</a></code> 属性</dt> +<dd>この属性は {@code clearTaskOnLaunch} に似ていますが、タスク全体ではなく単一のアクティビティに作用します。また、ルート アクティビティを含むどのアクティビティもクリアの対象となりえます。この属性が "{@code true}" に設定されたアクティビティは、現在のセッションの間のみタスクの一部を形成します。ユーザーがいったんそのタスクから離れてから、再度タスクに戻ると、このアクティビティはクリアされています</dd> +</dl> + +<p> +アクティビティをスタックから削除する方法は他にもあります。Intent オブジェクトに <code>{@link +android.content.Intent#FLAG_ACTIVITY_CLEAR_TOP FLAG_ACTIVITY_CLEAR_TOP}</code> フラグが含まれており、そのインテントを処理すべきタイプのアクティビティのインスタンスが対象タスクのスタック内に存在する場合は、そのインスタンスがスタックの最上位になってインテントに応答できるよう、それより上位のアクティビティはすべてクリアされます。指定されたアクティビティの起動モードが "{@code standard}" である場合は、そのアクティビティもスタックから削除され、新しいインスタンスが起動してインテントを処理します。起動モード "{@code standard}" では、新しいインテントを処理する際、常に新しいインスタンスが作成されるためです。 +</p> + +<p> +{@code FLAG_ACTIVITY_CLEAR_TOP} は、ほとんどの場合 {@code FLAG_ACTIVITY_NEW_TASK} と組み合わせて使用します。これらのフラグを組み合わせると、別のタスクに既に存在しているアクティビティを探し、それをインテントに応答できる位置に配置できます。 +</p> + + +<h3 id="starttask">タスクの開始</h3> + +<p> +アクティビティをタスクのエントリ ポイントとして設定するには、アクションとして "{@code android.intent.action.MAIN}"、カテゴリとして "{@code android.intent.category.LAUNCHER}" を指定したインテント フィルタをアクティビティに追加します(このタイプのフィルタの例については、<a href="#ifilters">インテント フィルタ</a>をご覧ください)。このタイプのフィルタを追加すると、アクティビティのアイコンとラベルがアプリケーション ランチャに表示されます。これにより、ユーザーがタスクを起動するための手段を提供できるだけでなく、起動後はいつでもそのタスクに戻れるようにすることができます。 +</p> + +<p> +この 2 番目の機能、つまりユーザーがいったんタスクを離れても後で戻ることができるようにする点が重要です。この理由から、アクティビティに {@code MAIN} と {@code LAUNCHER} フィルタが指定されている場合は、必ずタスクが開始される起動モード("{@code singleTask}" または "{@code singleInstance}")を使用する必要があります。たとえば、このフィルタを指定しなかった場合を考えてみましょう。インテントが "{@code singleTask}" アクティビティを起動し、新しいタスクが開始され、ユーザーがしばらくの間このタスクで作業を行います。その後、ユーザーが [ホーム] キーを押したとします。ホーム画面が表示され、先ほどのタスクはバックグラウンドに移動します。しかし、このタスクはアプリケーション ランチャには表示されていないため、ユーザーがタスクに戻るための手段がありません。 +</p> + +<p> +{@code FLAG_ACTIVITY_NEW_TASK} フラグにも、これと同じような難しさがあります。このフラグを指定したアクティビティでは、新しいタスクを開始した後にユーザーが [ホーム] キーを押してそのタスクを離れた場合に備え、タスクに戻るための手段を用意しておく必要があります。一部のエンティティ(たとえば通知マネージャ)は、アクティビティを常に外部タスクとして開始します。エンティティの一部として開始することはないため、{@code startActivity()} に渡すインテントには必ず {@code FLAG_ACTIVITY_NEW_TASK} を指定します。外部エンティティから呼び出すことのできるアクティビティでこのフラグが使用されている可能性がある場合は、開始されたタスクにユーザーが戻るための手段を別途提供するようにしてください。 +</p> + +<p> +ユーザーがアクティビティに戻ることができるようにしない場合は、{@code <activity>} 要素の {@code finishOnTaskLaunch} を "{@code true}" に設定します。詳しくは、<a href="#clearstack">スタックのクリア</a>をご覧ください。 +</p> + + +<h2 id="procthread">プロセスとスレッド</h2> + +<p> +Android では、最初のアプリケーション コンポーネントを実行する必要が生じると、そのための Linux プロセスを単一の実行スレッドで開始します。デフォルトでは、アプリケーションのすべてのコンポーネントがそのプロセスとスレッドで実行されます。 +</p> + +<p> +ただし、コンポーネントが他のプロセスで実行されるようにしたり、特定のプロセスに使用する追加スレッドを生成したりすることも可能です。 +</p> + + +<h3 id="procs">プロセス</h3> + +<p> +コンポーネントを実行するプロセスは、マニフェスト ファイルで管理します。コンポーネントの各要素({@code <activity>}、{@code <service>}、{@code <receiver>}、および {@code <provider>})には {@code process} 属性があり、そのコンポーネントをどのプロセスで実行すべきかを指定できるようになっています。これらの属性の設定によって、それぞれのコンポーネントを専用のプロセスで実行したり、一部のコンポーネントだけでプロセスを共有したりできます。また、別々のアプリケーションのコンポーネントが、同じプロセスで実行されるように設定することもできます。この場合は、それらのアプリケーションが同じ Linux ユーザー ID を共有し、同じ認証機関によって署名されている必要があります。{@code <application>} 要素にも {@code process} 属性があり、すべてのコンポーネントに適用されるデフォルト値を設定できます。 +</p> + +<p> +すべてのコンポーネントは指定されたプロセスのメイン スレッドでインスタンス化され、コンポーネントに対するシステム コールはそのスレッドからディスパッチされます。1 つのインスタンスに対して、複数のスレッドが作成されることはありません。したがって、システム コールに応答するメソッド(たとえば、後ほど<a href="#lcycles">コンポーネント ライフサイクル</a>で説明するライフサイクル通知や、ユーザーのアクションを報告する <code>{@link android.view.View#onKeyDown View.onKeyDown()}</code> のようなメソッド)は、常にそのプロセスのメイン スレッドで実行されます。つまり、コンポーネントがシステムから呼び出されたときに、プロセス内の他のコンポーネントの実行を妨げないよう、実行に時間がかかる処理や他の妨げになることの多い処理(ネットワーク処理、ループ計算など)をできる限り避ける必要があるということです。時間がかかる処理には別のスレッドを生成できます。詳しくは、次の<a href="#threads">スレッド</a> セクションをご覧ください。 +</p> + +<p> +状況によっては、Android がプロセスを終了させるべきと判断する場合があります。たとえば、メモリが不足してきた場合や、他のプロセスでユーザーにすばやく応答する必要がある場合です。プロセスが終了すると、そのプロセス内で実行されているアプリケーション コンポーネントは破棄されます。それらのコンポーネントで処理する作業がもう一度発生すると、そのためのプロセスが再び開始されます。 +</p> + +<p> +Android では、どのプロセスを終了させるかを判断するため、ユーザーにとっての相対的な重要度を重み付けして管理します。たとえば、アクティビティがまだ画面に表示されているプロセスを終了させるよりも、アクティビティが画面に表示されていないプロセスを終了させる方が合理的です。したがって、プロセスを終了させるかどうかは、そのプロセスで実行されているコンポーネントの状態に応じて判断されるということです。コンポーネントの状態については、後ほど<a href="#lcycles">コンポーネントのライフサイクル</a>で詳しく説明します。 +</p> + + +<h3 id="threads">スレッド</h3> + +<p> +アプリケーションを単一のプロセスに限定したとしても、バックグラウンドでの処理にスレッドが必要になることはよくあります。ユーザー インターフェースはユーザーのアクションに対して常にすばやく応答できなければならないため、アクティビティをホストするスレッドで、ネットワーク ダウンロードのような時間のかかる処理を一緒にホストしないようにする必要があります。すぐに完了しない可能性のあるすべての処理は、別のスレッドに割り当てるようにしてください。 +</p> + +<p> +スレッドは、標準の Java {@link java.lang.Thread} オブジェクトを使用してコード内で作成します。Android には、スレッドを管理するための便利なクラスが数多く用意されています。たとえば、スレッド内でメッセージ ループを実行するための {@link android.os.Looper}、メッセージを処理するための {@link android.os.Handler}、メッセージ ループでスレッドを設定するための {@link android.os.HandlerThread} などがあります。 +</p> + + +<h3 id="rpc">リモート プロシージャ コール</h3> + +<p> +Androidは軽量な仕組みのリモート・プロシージャ・コール (RPC) を採用しています。RPC とは、メソッドをローカルで呼び出しますが、実行はリモート(別のプロセス)で行い、その結果を呼び出し側に返します。そのためには、メソッド呼び出しとそれに付随するデータをオペレーティングシステムが解釈できるレベルまで分解してから、それらをローカルのプロセスとアドレス空間からリモートのプロセスとアドレス空間に転送し、リモートで呼び出しを再構築する必要があります。戻り値は、反対方向に転送しなければなりません。Android にはこの処理を行うためのコードがすべて用意されているため、RPC インターフェースを定義して実装するだけで RPC を利用できます。 +</p> + +<p> +RPC インターフェースに含めることができるのはメソッドのみです。すべてのメソッドは、戻り値がない場合でも同期的に実行されます(つまり、リモート メソッドが完了するまでローカル メソッドがブロックされます)。 +</p> + +<p> +このメカニズムを簡単に説明すると次のようになります。まず、シンプルなインターフェース定義言語(IDL)を使用して、実装したい RPC インターフェースを宣言します。<code><a href="{@docRoot}guide/developing/tools/aidl.html">aidl</a></code> ツールにより、RPC インターフェースの宣言から Java インターフェース定義が生成されます。この定義は、ローカルとリモートの両方のプロセスで使用する必要があります。定義には、次の図に示すように 2 つの内部クラスが含まれています: +</p> + +<p style="margin-left: 2em"> +<img src="{@docRoot}images/binder_rpc.png" alt="RPC のメカニズム" /> +</p> + +<p> +これらの内部クラスには、IDL で宣言したインターフェースのリモート プロシージャ コールを管理するために必要なコードがすべて含まれています。どちらの内部クラスも {@link android.os.IBinder} インターフェースを実装します。一方の内部クラスは、ローカルのシステムで内部的に使用しますが、記述するコードでは無視しても構いません。もう一方の内部クラスはスタブと呼ばれ、{@link android.os.Binder} クラスを拡張します。スタブには、IPC(プロセス間通信)呼び出しを発生させるための内部コードに加え、IDL で宣言した RPC インターフェース内のメソッドの宣言が含まれます。これらのメソッドを実装するには、図に示すようにスタブをサブクラス化します。2つの内部クラスのうちの一方は、システムがローカルかつ内部的に使用するので、開発者が記述するコードでは無視してかまいません。... リモート側では、図のようにスタブをサブクラス化して、これらのメソッドを実装する必要があります。 +</p> + +<p> + 通常、リモート プロセスはサービスで管理します。サービスなら、プロセスや他のプロセスへの接続に関する情報をシステムに伝えることができるからです。サービスには、{@code aidl} ツールで生成されたインターフェース ファイルと、RPC メソッドを実装するスタブ サブクラスの両方を持たせることになります。サービスのクライアントには、{@code aidl} ツールで生成されたインターフェース ファイルのみを持たせます。 +</p> + +<p> +以下に、サービスとそのクライアントの間の接続がどのように設定されるかを示します: +</p> + +<ul> +<li>サービスのクライアント(ローカル側)には <code>{@link android.content.ServiceConnection#onServiceConnected +onServiceConnected()}</code> および<code>{@link android.content.ServiceConnection#onServiceDisconnected +onServiceDisconnected()}</code> メソッドが実装されているため、リモート サービスとの接続が確立されたときや切断されたときには通知を受けることができます。通知があり次第、<code>{@link android.content.Context#bindService bindService()}</code> を呼び出して接続を設定します。 +</li> + +<li> +サービスの <code>{@link android.app.Service#onBind onBind()}</code> メソッドは、受け取ったインテント({@code bindService()} に渡されたインテント)に応じて、接続を承認または拒否するために実装します。接続が承認されると、接続を承認するのであれば、スタブ サブクラスのインスタンスを返します。 +</li> + +<li>サービスが接続を承認すると、Android がクライアントの {@code onServiceConnected()} メソッドを呼び出し、IBinder オブジェクト(サービスが管理するスタブ サブクラスのプロキシ)を渡します。クライアントは、このプロキシを介してリモートサービスを呼び出すことができます。 +</li> +</ul> + +<p> +ここでは、説明を簡単にするため、RPC メカニズムの細かい点は省略しています。詳しくは、<a href="{@docRoot}guide/developing/tools/aidl.html">Designing a Remote Interface Using AIDL</a>、および {@link android.os.IBinder IBinder} クラスの説明をご覧ください。 +</p> + + +<h3 id="tsafe">スレッドセーフなメソッド</h3> + +<p> +状況によっては実装したメソッドが複数のスレッドから呼び出されることもあるため、スレッドセーフな記述を心掛ける必要があります。 +</p> + +<p> +前のセクションで説明した RPC のようにメソッドをリモートで呼び出すことができる場合は、このような状況が特に発生しやすくなります。IBinder オブジェクトに実装されているメソッドを IBinder と同じプロセスから呼び出すと、そのメソッドは呼び出し側のスレッドで実行されます。一方、別のプロセスからメソッドを呼び出した場合は、プロセスのメイン スレッドではなく、IBinder と同じプロセス内に保持されているスレッドのプールから選択されたスレッドで実行されます。たとえば、サービスの {@code onBind()} メソッドはそのサービスのプロセスのメイン スレッドから呼び出されるのに対し、{@code onBind()} から返されたオブジェクトに実装されているメソッド(たとえば RPC メソッドを実装するスタブ サブクラス)はプール内のスレッドから呼び出されます。サービスには複数のクライアントを割り当てることができるため、複数のプール スレッドを同じ IBinder に同時に割り当てることも可能です。したがって、IBinder メソッドはスレッドセーフになるように実装する必要があります。 +</p> + +<p> +同様に、コンテンツ プロバイダも別のプロセスからのデータ リクエストを受け取ることができます。ContentResolver および ContentProvider クラスはプロセス間通信の管理の詳細を隠蔽しますが、それらのリクエストに応答する ContentProvider メソッド(<code>{@link android.content.ContentProvider#query query()}</code>、<code>{@link android.content.ContentProvider#insert insert()}</code>、<code>{@link android.content.ContentProvider#delete delete()}</code>、<code>{@link android.content.ContentProvider#update update()}</code>、および <code>{@link android.content.ContentProvider#getType getType()}</code> メソッド)は、プロセスのメイン スレッドではなく、コンテンツ プロバイダのプロセス内のスレッドのプールから呼び出されます。これらのメソッドを同時に呼び出すことのできるメソッドの数に制限はありません。したがって、これらのメソッドもスレッドセーフになるように実装する必要があります。 +</p> + + +<h2 id="lcycles">コンポーネントのライフサイクル</h2> + +<p> +アプリケーション コンポーネントにはライフサイクルがあります。ライフサイクルは、インテントへ応答することでのインスタンス化で始まり、そのインスタンスの破棄で終わります。この間、コンポーネントがアクティブなときとアクティブでないときがあり、アクティビティであればユーザーから見えるときと見えないときがあります。このセクションでは、アクティビティ、サービス、およびブロードキャスト レシーバのライフサイクルについて説明します。具体的には、それぞれがライフタイムの間に取ることのできる状態、状態の遷移を通知する方法、およびそれらの状態が、コンポーネントを実行しているプロセスが終了させられたり、インスタンスが破棄されたりする可能性への影響などについて説明します。 +</p> + + +<h3 id="actlife">アクティビティのライフサイクル</h3> + +<p>アクティビティは、基本的に以下の 3 つの状態を取ります:</p> + +<ul> +<li> 状態がアクティブまたは実行中のアクティビティは、画面のフォアグラウンドに表示されている(つまり現在のタスクのアクティビティ スタックの最上位にある)アクティビティです。<em></em><em></em>これが、ユーザーのアクションの焦点となっているアクティビティです。</li> + +<li><p>状態が一時停止のアクティビティは、ユーザーのアクションの焦点から外れていますが、まだユーザーから見ることのできるアクティビティです。<em></em>つまり、それよりも前面に他のアクティビティが表示されていますが、そのアクティビティが透明か全画面表示でないかのどちらかで、一時停止しているアクティビティの一部が見えている状態です。一時停止しているアクティビティは、完全に動作しています(すべての状態やメンバー情報は保持されており、ウィンドウ マネージャにアタッチされたままになっています)。ただし、メモリが極端に不足した場合は、システムによって強制終了させられる可能性があります。</p></li> + +<li><p>状態が停止のアクティビティは、別のアクティビティに隠されて完全に見えなくなったアクティビティです。<em></em>すべての状態とメンバー情報はまだ保持しています。しかし、もうユーザーに対して表示されていないため、他でメモリが必要な場合は強制終了させられる可能性が高いアクティビティです。</p></li> +</ul> + +<p> +システムが一時停止または停止しているアクティビティをメモリから削除する場合は、アクティビティの {@link android.app.Activity#finish finish()} メソッドを呼び出して終了を要求するか、単純のそのプロセスを強制終了します。そのアクティビティをもう一度ユーザーに表示する際は、完全に再起動して以前の状態に復元する必要があります。 +</p> + +<p> +アクティビティがある状態から別の状態に遷移すると、以下の protected メソッドに対する呼び出しによって変更が通知されます: +</p> + +<p style="margin-left: 2em">{@code void onCreate(Bundle <i>savedInstanceState</i>)} <br/>{@code void onStart()} <br/>{@code void onRestart()} <br/>{@code void onResume()} <br/>{@code void onPause()} <br/>{@code void onStop()} <br/>{@code void onDestroy()}</p> + +<p> +これらのメソッドはすべて、状態が変化したときに適切な処理を行うためにオーバーライドできるフックです。オブジェクトが初めてインスタンス化されたときに初期設定を行うため、すべてのアクティビティには <code>{@link android.app.Activity#onCreate onCreate()}</code> を実装する必要があります。多くのアクティビティには、データの変更をコミットするための <code>{@link android.app.Activity#onPause onPause()}</code> も実装します。これを実装しない場合は、何らかの方法でユーザーとの対話を停止できるようにしておく必要があります。 +</p> + +<div class="sidebox-wrapper"> +<div class="sidebox-inner"> +<h2>スーパークラスの呼び出し</h2> +<p> +どのアクティビティ ライフサイクル メソッドの実装でも、必ず最初にスーパークラス バージョンを呼び出す必要があります。次に例を示します: +</p> + +<pre>protected void onPause() { + super.onPause(); + . . . +}</pre> +</div> +</div> + + +<p> +これら 7 つのメソッドを使用すると、アクティビティのライフサイクル全体を定義できます。これらを実装することで、ネストされた 3 つのループからなるアクティビティのライフサイクルを監視できます: +</p> + +<ul> +<li>アクティビティの<b>ライフタイム全体</b>は、<code>{@link android.app.Activity#onCreate onCreate()}</code> が初めて呼び出されたときに始まり、最後に <code>{@link android.app.Activity#onDestroy}</code> が呼び出されたときに終了します。アクティビティは、{@code onCreate()} で「全体的」な状態のすべての初期設定を行い、{@code onDestroy()} 残っていたリソースをすべて解放します。たとえば、ネットワークからのデータのダウンロードをバックグラウンドで実行するスレッドは、{@code onCreate()} で作成され、{@code onDestroy()} で停止します。</li> + +<li><p>アクティビティの<b>可視ライフタイム</b>は、<code>{@link android.app.Activity#onStart onStart()}</code> の呼び出しで始まり、対応する <code>{@link android.app.Activity#onStop onStop()}</code> の呼び出しで終了します。このライフタイムの間は、ユーザーが画面上でそのアクティビティを見ることができます。ただし、アクティビティがフォアグラウンドにない場合や、ユーザーと対話していない場合もあります。これらの 2 つのメソッドの間は、ユーザーに対してアクティビティを表示するために必要なリソースを確保できます。たとえば、{@code onStart()} で {@link android.content.BroadcastReceiver} を登録して UI に影響する変化を監視し、表示しているアクティビティがユーザーから見えなくなったら {@code onStop()} で登録を解除できます。{@code onStart()} および {@code onStop()} メソッドは、アクティビティがユーザーから見え隠れするたびに繰り返し呼び出すことができます。</p></li> + +<li><p>アクティビティの<b>フォアグラウンド ライフタイム</b>は、<code>{@link android.app.Activity#onResume onResume()}</code> の呼び出しで始まり、対応する <code>{@link android.app.Activity#onPause onPause()}</code> の呼び出しで終了します。フォアグラウンド ランタイムの間は、このアクティビティが他のどのアクティビティよりも前面に表示され、ユーザーと対話しています。アクティビティは、一時停止状態と再開状態の間を頻繁に遷移します。たとえば、デバイスがスリープ状態になるときや新しいアクティビティを開始するときには {@code onPause()} が呼び出され、アクティビティの結果や新しいインテントが届いたときには {@code onResume()} が呼び出されます。したがって、これらのメソッドを記述する際は、できるだけ軽量化しておく必要があります。</p></li> +</ul> + +<p> +次の図に、これらのループとアクティビティの遷移経路を示します。色の付いた楕円は、アクティビティが取ることのできる主な状態です。長方形は、アクティビティが状態間を遷移するときに処理を実行するために実装できるコールバック メソッドを表します。 +<p> + +<p style="margin-left: 2em"><img src="{@docRoot}images/activity_lifecycle.png" +alt="Android のアクティビティ ライフサイクルの状態遷移図" /></p> + +<p> +次の表では、各メソッドについて詳しく説明し、ライフサイクル全体における位置付けを示します: +</p> + +<table border="2" width="85%" frame="hsides" rules="rows"> +<colgroup align="left" span="3"></colgroup> +<colgroup align="left"></colgroup> +<colgroup align="center"></colgroup> +<colgroup align="center"></colgroup> + +<thead> +<tr><th colspan="3">メソッド</th> <th>説明</th> <th>強制終了</th> <th>次</th></tr> +</thead> + +<tbody> +<tr> + <td colspan="3" align="left"><code>{@link android.app.Activity#onCreate onCreate()}</code></td> + <td>アクティビティが初めて作成されるときに呼び出されます。通常の静的な設定(ビューの作成、リストへのデータのバインドなど)は、すべてのこのメソッドで行う必要があります。このアクティビティの 以前の状態が保存されていた場合、このメソッドにはその状態を保持している Bundle オブジェクトが引数として(詳しくは、後述の<a href="#actstate">アクティビティの状態の保存</a>をご覧ください)。 + <p>この後には、必ず {@code onStart()} が呼び出されます。</p></td> + <td align="center">不可</td> + <td align="center">{@code onStart()}</td> +</tr> + +<tr> + <td rowspan="5" style="border-left: none; border-right: none;"> </td> + <td colspan="2" align="left"><code>{@link android.app.Activity#onRestart +onRestart()}</code></td> + <td>アクティビティが停止した後、それをもう一度開始する直前に呼び出されます。 + <p>この後には、必ず {@code onStart()} が呼び出されます。</p></td> + <td align="center">不可</td> + <td align="center">{@code onStart()}</td> +</tr> + +<tr> + <td colspan="2" align="left"><code>{@link android.app.Activity#onStart onStart()}</code></td> + <td>アクティビティがユーザーから見えるようになる直前に呼び出されます。 + <p>その後、アクティビティがフォアグラウンドに表示された場合は {@code onResume()} が、他のアクティビティの後ろに隠れた場合は {@code onStop()} が呼び出されます。</p></td> + <td align="center">不可</td> + <td align="center">{@code onResume()} <br/>または<br/>{@code onStop()}</td> +</tr> + +<tr> + <td rowspan="2" style="border-left: none;"> </td> + <td align="left"><code>{@link android.app.Activity#onResume onResume()}</code></td> + <td>アクティビティがユーザーとの対話を開始する直前に呼び出されます。この時点で、アクティビティはアクティビティ スタックの最上位にあり、ユーザーからの入力はこのアクティビティに対して行われます。 + <p>この後には、必ず {@code onPause()} が呼び出されます。</p></td> + <td align="center">不可</td> + <td align="center">{@code onPause()}</td> +</tr> + +<tr> + <td align="left"><code>{@link android.app.Activity#onPause onPause()}</code></td> + <td>システムが別のアクティビティを開始しようとしているときに呼び出されます。このメソッドは、保存されていない変更を永続データにコミットする場合や、アニメーションのように CPU を大量に消費する処理を停止する場合に使用するのが一般的です。このメソッドが終了するまでは次のアクティビティが開始されたないため、できる限り短時間で実行できるようにしておく必要があります。 + <p>その後、アクティビティがフォアグラウンドに戻った場合は {@code onResume()} が、ユーザーから見えなくなった場合は {@code onStop()} が呼び出されます。</td> + <td align="center"><strong style="color:#800000">可能</strong></td> + <td align="center">{@code onResume()} <br/>または<br/>{@code onStop()}</td> +</tr> + +<tr> + <td colspan="2" align="left"><code>{@link android.app.Activity#onStop onStop()}</code></td> + <td>アクティビティがユーザーから見えなくなったときに呼び出されます。見えなくなる状況としては、アクティビティが破棄された場合や、再開された別のアクティビティ(既存か新規かを問わず)によって隠された場合が考えられます。 + <p>その後、アクティビティがユーザーとの対話に戻った場合は {@code onRestart()} が、アクティビティが完全に終了する場合は {@code onDestroy()} が呼び出されます。</p></td> + <td align="center"><strong style="color:#800000">可能</strong></td> + <td align="center">{@code onRestart()} <br/>または<br/>{@code onDestroy()}</td> +</tr> + +<tr> + <td colspan="3" align="left"><code>{@link android.app.Activity#onDestroy +onDestroy()}</code></td> + <td>アクティビティが破棄される前に呼び出されます。これが、アクティビティが受け取る最後の呼び出しとなります。このメソッドが呼び出される状況としては、アクティビティが完了する場合(<code>{@link android.app.Activity#finish + finish()}</code> が呼び出されたとき)や、システムが領域を確保するために一時的にそのアクティビティのインスタンスを破棄する場合が考えられます。これらの 2 つの状況は、<code>{@link + android.app.Activity#isFinishing isFinishing()}</code> メソッドを使用して識別できます。</td> + <td align="center"><strong style="color:#800000">可能</strong></td> + <td align="center"><em>なし</em></td> +</tr> +</tbody> +</table> + +<p> +表の<b>強制終了</b>列に注目してください。この列は、メソッドが終了した後であれば、システムがアクティビティのコードの別の行を実行することなくいつでもアクティビティを実行しているプロセスを強制終了できるかどうかを示しています。<em></em>{@code onPause()}、{@code onStop()}、および {@code onDestroy()} メソッドの 3 つは「可能」となっています。1 番目に挙げた {@code onPause()} だけは、プロセスが強制終了する前に必ず呼び出されます。{@code onStop()} と {@code onDestroy()} は、必ず呼び出されるとは限りません。したがって、永続データ(たとえばユーザーによる編集)をストレージに書き込む際は {@code onPause()} を使用する必要があります。 +</p> + +<p> +<b>強制終了</b>列が「不可」になっているメソッドは、それらが呼び出された瞬間から、アクティビティを実行しているプロセスを保護して強制終了されないようにします。したがって、アクティビティが強制終了可能な状態にあるのは、たとえば {@code onPause()} が返されてから {@code onResume()} が呼び出されるまでの間ということです。その後は、もう一度 {@code onPause()} が返されるまで、強制終了できる状態には戻りません。 +</p> + +<p> +後述の<a href="#proclife">プロセスとライフサイクル</a>のセクションで詳しく説明しますが、ここでの定義で技術的には「強制終了可能」でないアクティビティでも、システムによって強制終了させられる可能性はありますが、他に利用できるリソースがないなど、極端に急を要する場合に限られます。 +</p> + + +<h4 id="actstate">アクティビティの状態の保存</h4> + +<p> +メモリ不足を補うためにユーザーではなくシステムがアクティビティを終了させた場合には,ユーザがそのアクティビティに戻ったときに、以前の状態のままであることを期待するでしょう。 +</p> + +<p> +アクティビティが強制終了させられる前の状態を保存しておきたい場合は、アクティビティに <code>{@link android.app.Activity#onSaveInstanceState +onSaveInstanceState()}</code> メソッドを実装します。このメソッドは、アクティビティが破棄されやすい状態になる前(つまり {@code onPause()} が呼び出される前)に呼び出されます。その際、アクティビティの動的な状態を名前/値ペアとして記録できる {@link android.os.Bundle} オブジェクトが渡されます。アクティビティがもう一度開始されると、Bundle は {@code onCreate()} だけでなく、{@code onStart()} の後に呼び出される <code>{@link +android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}</code> メソッドにも渡され、保存されている状態をそのどちらかまたは両方で復元できます。 +</p> + +<p> +{@code onSaveInstanceState()} および {@code onRestoreInstanceState()} メソッドは、これまでに説明した {@code onPause()} などとは異なり、ライフサイクル メソッドではありません。これらのメソッドは、常に呼び出されるわけではありません。たとえば、{@code onSaveInstanceState()} は、システムによってアクティビティが破棄しやすい状態にされる前には呼び出されますが、ユーザーのアクション(たとえば [[]戻る] キー)によってインスタンスが実際に破棄されるときには呼び出されません。そのような場合は、ユーザーがそのアクティビティに戻ることを想定する必要はないため、状態を保存する理由がないのです。 +</p> + +<p> +{@code onSaveInstanceState()} は常に呼び出されるとは限らないため、アクティビティの一時的な状態を記録する目的のみに使用し、永続データの格納には使用しないようにしてください。この目的には {@code onPause()} を使用します。 +</p> + + +<h4 id="coordact">アクティビティの協調</h4> + +<p> +あるアクティビティが別のアクティビティを開始すると、両方のアクティビティのライフサイクル状態が遷移します。一方が一時停止または停止し、もう一方が開始されます。場合によっては、これらの協調させる必要があります。 +</p> + +<p> +ライフサイクルのコールバックの順序は明確に定義されており、特に 2 つのアクティビティが同じプロセス内に存在する場合は次のようになります: +</p> + +<ol> +<li>現在のアクティビティの {@code onPause()} メソッドが呼び出されます。</li> + +<li>続いて、開始されるアクティビティの {@code onCreate()}、{@code onStart()}、および {@code onResume()} メソッドが順番に呼び出されます。</li> + +<li>その後、開始されたアクティビティが画面上で見えなくなると、その {@code onStop()} メソッドが呼び出されます。</li> +</ol> + + +<h3 id="servlife">サービスのライフサイクル</h3> + +<p> +サービスは、以下の 2 つの方法で使用できます: +</p> + +<ul> +<li>いったん開始したら、停止させられる(または自ら停止する)まで実行し続けることができます。このモードでは、<code>{@link android.content.Context#startService Context.startService()}</code> が呼び出されて開始し、<code>{@link android.content.Context#stopService Context.stopService()}</code> 呼び出されて停止します。サービス自体が <code>{@link android.app.Service#stopSelf() Service.stopSelf()}</code> または <code>{@link android.app.Service#stopSelfResult Service.stopSelfResult()}</code> を呼び出して停止することもできます。サービスの開始時に {@code startService()} が何度呼び出されたとしても、{@code stopService()} を一度呼び出せばサービスは停止します。</li> + +<li><p>サービスで定義されているインターフェースをエクスポートし、これを介してプログラム的に操作できます。クライアントから Service オブジェクトへの接続を確立し、その接続を使用してサービスにアクセスします。接続は、<code>{@link android.content.Context#bindService Context.bindService()}</code> を呼び出して確立し、<code>{@link android.content.Context#unbindService Context.unbindService()}</code> でサービスを開始します。複数のクライアントが同じサービスにバインドすることも可能です。サービスがまだ開始されていなかった場合は,必要に応じて {@code bindService()} で開始できます。 +</p></li> +</ul> + +<p> +これら 2 つのモードは、完全に分離されているわけではありません。{@code startService()} で開始されたサービスにバインドすることも可能です。たとえば、再生する曲を指定した Intent オブジェクトで {@code startService()} を呼び出して音楽再生サービスを開始したとします。その後、たとえばユーザーがプレーヤーを操作したい場合や再生中の曲に関する情報を入手したい場合には、アクティビティから {@code bindService()} を呼び出してサービスとの接続を確立できます。このような場合、最後のバインドが閉じられるまでは、{@code stopService()} を呼び出してもサービスは停止しません。 +</p> + +<p> +アクティビティと同様、サービスにもライフサイクル メソッドがあり、これらを実装することでサービスの状態の変化を監視できます。ただし、protected ではなく public で、以下の 3 つしかありません: +</p> + +<p style="margin-left: 2em">{@code void onCreate()} <br/>{@code void onStart(Intent <i>intent</i>)} <br/>{@code void onDestroy()}</p> + +<p> +これらのメソッドを実装することで、ネストされた 2 つのループからなるサービスのライフサイクルを監視できます: +</p> + +<ul> +<li>サービスの<b>ライフタイム全体</b>は、<code>{@link android.app.Service#onCreate onCreate()}</code> が呼び出されたときに始まり、<code>{@link android.app.Service#onDestroy}</code> 終了したときに終わります。アクティビティと同じく、サービスも {@code onCreate()} で初期設定を行い、{@code onDestroy()} で残っていたリソースをすべて解放します。たとえば、音楽再生サービスであれば、{@code onCreate()} で音楽を再生するスレッドを作成し、{@code onDestroy()} でそのスレッドを停止できます。</li> + +<li><p>サービスの<b>アクティブ ライフタイム</b>は、<code>{@link android.app.Service#onStart onStart()}</code> を呼び出したときに始まります。このメソッドには、{@code startService()} に渡された Intent オブジェクトが渡されます。音楽再生サービスは、この Intent オブジェクトをみて曲を見つけ、その再生を開始します。</p> + +<p> +サービスの停止に相当するコールバック、つまり {@code onStop()} メソッドはありません。 +</p></li> +</ul> + +<p> +{@code onCreate()} および {@code onDestroy()} メソッドは、サービスを <code>{@link android.content.Context#startService Context.startService()}</code> または <code>{@link android.content.Context#bindService Context.bindService()}</code> のどちらで開始したかに関係なく、すべてのサービスで呼び出されます。一方、{@code onStart()} は、サービスを {@code startService()} で開始した場合のみ呼び出されます。 +</p> + +<p> +サービスが他からのバインドを許可している場合は、以下のコールバック メソッドを追加で実装できます: +</p> + +<p style="margin-left: 2em">{@code IBinder onBind(Intent <i>intent</i>)} <br/>{@code boolean onUnbind(Intent <i>intent</i>)} <br/>{@code void onRebind(Intent <i>intent</i>)}</p> + +<p> +<code>{@link android.app.Service#onBind onBind()}</code> コールバックには {@code bindService()} に渡された Intent オブジェクトが渡され、<code>{@link android.app.Service#onUnbind onUnbind()}</code> には {@code unbindService()} 渡された Intent オブジェクトが渡されます。サービスがバインドを許可している場合は、クライアントがサービスと対話する通信チャネルを {@code onBind()} で返します。{@code onUnbind()} メソッドは、サービスに新しいクライアントが接続した場合に <code>{@link android.app.Service#onRebind onRebind()}</code> の呼び出しを要求できます。 +</p> + +<p> +次の図に、サービスのコールバック メソッドを示します。なお、{@code startService()} で作成されたサービスと、{@code bindService()} で作成されたサービスを分けて記述していますが、作成された方法に関係なく,すべてのサービスはクライアントからのバインドを許可できます。したがって、どのサービスも {@code onBind()} および{@code onUnbind()} メソッドの呼び出しを受け取る可能性はあります。 +</p> + +<p style="margin-left: 2em"><img src="{@docRoot}images/service_lifecycle.png" +alt="サービス コールバックの状態遷移図" /></p> + + +<h3 id="broadlife">ブロードキャスト レシーバのライフサイクル</h3> + +<p> +ブロードキャスト レシーバのコールバック メソッドは次の 1 つのみです: +</p> + +<p style="margin-left: 2em">{@code void onReceive(Context <i>curContext</i>, Intent <i>broadcastMsg</i>)}</p> + +<p> +レシーバにブロードキャスト メッセージが届くと、<code>{@link android.content.BroadcastReceiver#onReceive onReceive()}</code> メソッドが呼び出され、メッセージを保持する Intent オブジェクトが渡されます。ブロードキャスト レシーバは、このメソッドの実行中のみアクティブと見なされます。{@code onReceive()} 終了すると、ブロードキャスト レシーバはアクティブでなくなります。 +</p> + +<p> +ブロードキャスト レシーバがアクティブになっているプロセスは、強制終了しないよう保護されます。一方、アクティブでないコンポーネントのみからなるプロセスは、それが消費しているメモリが他のプロセスで必要になった場合は、いつでも強制終了される可能性があります。 +</p> + +<p> +この点は、ブロードキャスト メッセージへの応答に時間がかかるため、ユーザー インターフェースの他のコンポーネントを実行しているメイン スレッドとは別のスレッドで何らかの処理を行う必要がある場合に問題になります。{@code onReceive()} が新しいスレッドを生成して終了した場合、プロセス内に他にアクティブなアプリケーション コンポーネントがなければ、そのスレッドを含めたプロセス全体がアクティブでないと判断されて強制終了させられるおそれがあります。この問題を回避するには、{@code onReceive()} でサービスを開始し、そのサービスにジョブを実行させます。これにより、プロセス内にまだアクティブなコンポーネントがあると見なされます。 +</p> + +<p> +次のセクションでは、プロセスが強制終了される可能性が高くなる状況についてさらに詳しく説明します。 +</p> + + +<h3 id="proclife">プロセスとライフサイクル</h3> + +<p>Android は、プロセスをできるだけ長い間維持しようとします。しかし、最終的にメモリが不足したときには、古いプロセスを削除しなければならなくなります。Android では、どのプロセスを維持し、どのプロセスを強制終了させるかを判断するため、プロセス内で実行されているコンポーネントと各コンポーネントの状態に基づいて、各プロセスを「重要度の階層」の位置づけます。まず最も重要度の低いプロセスが削除され、次は 2 番目に重要度の低いプロセス、その次に 3 番目、というように判断されます。階層は 5 つのレベルで構成されます。以下では、重要度の高いものから順に説明します: +</p> + +<ol> + +<li><b>フォアグラウンド プロセス</b>は、ユーザーがその時点で行っている作業に必要なプロセスです。以下のいずれかの条件を満たしているプロセスは、フォアグラウンド プロセスと見なされます: + +<ul> +<li>ユーザーと対話中のアクティビティを実行している(Activity オブジェクトの <code>{@link android.app.Activity#onResume +onResume()}</code> メソッドが呼び出されている)。</li> + +<li><p>ユーザーと対話中のアクティビティにバインドされているサービスを実行している。</p></li> + +<li><p>いずれかのライフサイクル コールバック(<code>{@link android.app.Service#onCreate +onCreate()}</code>、<code>{@link android.app.Service#onStart onStart()}</code>、または <code>{@link android.app.Service#onDestroy onDestroy()}</code>)を実行している {@link android.app.Service} オブジェクトを保持している。</p></li> + +<li><p><code>{@link android.content.BroadcastReceiver#onReceive +onReceive()}</code> メソッドを実行している {@link android.content.BroadcastReceiver} オブジェクトを保持している。</p></li> +</ul> + +<p> +同時に存在するフォアグラウンド プロセスは少数に限られています。フォアグラウンド プロセスは、メモリが極端に不足し、すべてのフォアグラウンド プロセスの実行を継続できない場合の最終手段として強制終了させられます。通常、その時点でデバイスはメモリ ページングの状態に達しており、ユーザー インターフェースを応答可能な状態に維持するためには、フォアグラウンド プロセスの一部を強制終了させなければならない状況に陥っています。 +</p></li> + +<li><p><b>可視プロセス</b>は、フォアグラウンド コンポーネントではないものの、ユーザーが見ている画面に影響を及ぼすことのできるプロセスです。以下のいずれかの条件を満たしているプロセスは、可視プロセスと見なされます:</p> + +<ul> +<li>フォアグラウンドではないがユーザーから見ることができるアクティビティを実行している(その <code>{@link android.app.Activity#onPause onPause()}</code> メソッドが呼び出されている)。これは、たとえばフォアグラウンド アクティビティがダイアログで、その背後に直前のアクティビティが見えるような状況です。</li> + +<li><p>ユーザーから見ることのできるアクティビティにバインドされているサービスを実行している。</p></li> +</ul> + +<p> +可視プロセスは、非常に重要なプロセスと見なされ、すべてのフォアグラウンド プロセスの実行を維持するために必要でない限り、強制終了させられることはありません。 +</p></li> + +<li><p><b>サービス プロセス</b>は、<code>{@link android.content.Context#startService startService()}</code> メソッドで開始されたサービスを実行しているプロセスのうち、より重要度の高い 2 つのレベルのどちらにも該当しないプロセスです。サービス プロセスは、ユーザーに見えるものとの直接的な関係はありませんが、たとえばバックグラウンドでの MP3 の再生、ネットワークからのデータのダウンロードなど、ユーザーが気にかけている処理であることが一般的です。したがって、すべてのフォアグラウンド プロセスと可視プロセスに加え、これらのサービス プロセスの実行を維持するだけのメモリが確保できる限り、強制終了させられることはありません。 +</p></li> + +<li><p><b>バックグラウンド プロセス</b>は、その時点でユーザーから見えないアクティビティを保持している(Activity オブジェクトの <code>{@link android.app.Activity#onStop onStop()}</code> メソッドが呼び出されている)プロセスです。これらのプロセスは、ユーザー エクスペリエンスに直接的には影響しておらず、フォアグラウンド、可視、サービス プロセスからメモリが要求された場合はいつでも強制終了する可能性があります。通常は数多くのバックグラウンド プロセスが実行されているため、それらを LRU(least recently used)リストに登録し、ユーザーが一番最近見たアクティビティのプロセスが最後に強制終了するような仕組みになっています。アクティビティにライフサイクル メソッドが正しく実装されており、現在の状態が正しく保存されていれば、プロセスを強制終了してもユーザー エクスペリエンスに悪影響が及ぶことはありません。 +</p></li> + +<li><p><b>空のプロセス</b>は、アクティブなアプリケーション コンポーネントを保持していないプロセスです。このようなプロセスを維持しておく唯一の理由は、これをキャッシュとして使用し、次回コンポーネントを実行するときの起動時間を短くするためです。多くの場合、システムはこれらのプロセスを強制終了させて、プロセス キャッシュとその基礎となるカーネル キャッシュの間でシステム リソース全体のバランスを取ります。</p></li> + +</ol> + +<p> +各プロセスは、その時点でアクティブなコンポーネントの重要度に基づいて、そのプロセスが取りうる最も高いレベルにランク付けされます。たとえば、あるプロセスがサービスと可視アクティビティをホストしている場合、そのプロセスはサービス プロセスではなく可視プロセスとしてランク付けされます。 +</p> + +<p> +また、あるプロセスに他のプロセスが依存しているために、そのプロセスのランクが引き上げられる可能性もあります。他のプロセスから依存されているプロセスが、依存しているプロセスよりも低いレベルにランク付けされることはありません。たとえば、プロセス A 内のコンテンツ プロバイダにプロセス B 内のクライアントが依存している場合や、プロセス A 内のサービスがプロセス B 内のコンポーネントにバインドされている場合、プロセス A は常にプロセス B よりは重要度が高いと見なされます。 +</p> + +<p> +サービスを実行しているプロセスは、バックグラウンド アクティビティを実行しているプロセスよりも高くランク付けされます。したがって、時間のかかる処理を実行する場合、特にその処理がアクティビティよりも長く続くような場合は、単にスレッドを生成するのではなく、その処理用のサービスを開始することをおすすめします。たとえば、バックグラウンドで音楽を再生する場合や、カメラで撮影した写真を Web サイトにアップロードする場合などはこれに当たります。サービスを使用することで、アクティビティがどのような状況にあっても、処理の重要度として「サービス プロセス」レベル以上を維持できます。<a href="#broadlife">ブロードキャスト レシーバのライフサイクル</a>のセクションでも説明しましたが、ブロードキャスト レシーバにおいてもこれと同じ理由で、処理に時間がかかる場合はスレッドではなくサービスを使用することをおすすめします。 +</p> diff --git a/docs/html/intl/ja/guide/tutorials/hello-world.jd b/docs/html/intl/ja/guide/tutorials/hello-world.jd new file mode 100644 index 0000000..31857ce --- /dev/null +++ b/docs/html/intl/ja/guide/tutorials/hello-world.jd @@ -0,0 +1,375 @@ +page.title=Hello, World +@jd:body + +<div id="qv-wrapper"> + <div id="qv"> + <h2>このドキュメントの内容</h2> + <ol> + <li><a href="#avd">AVD の作成</a></li> + <li><a href="#create">プロジェクトを作成する</a></li> + <li><a href="#ui">UI を構築する</a></li> + <li><a href="#run">コードを実行する</a></li> + <li><a href="#upgrading">UI を XML レイアウトにアップグレードする</a></li> + <li><a href="#debugging">プロジェクトをデバッグする</a></li> + <li><a href="#noeclipse">Eclipse を使用せずにプロジェクトを作成する</a></li> + </ol> + </div> +</div> + +<p>デベロッパーにとって、開発フレームワークの第一印象は、どれだけ簡単に「Hello, World」を記述できるかで決まります。Android では、非常に簡単に記述できます。総合開発環境として Eclipse を使用している場合には、開発は特に簡単です。プロジェクトの作成と管理に使用できる便利なプラグインが用意されており、開発サイクルを大幅にスピードアップできるためです。</p> + +<p>Eclipse を使用していない場合でも問題ありません。<a href="{@docRoot}guide/developing/other-ide.html">Developing in Other IDEs</a>に慣れてから、このチュートリアルに戻り、Eclipse に関する部分以外を参考にしてください。</p> + +<p>開始する前に、最新の SDK がインストールされている必要があります。また、Eclipse を使用する場合には、ADT プラグインもインストールされている必要があります。これらのプログラムがインストールされていない場合は、「<a href="{@docRoot}sdk/{@sdkCurrent}/installing.html">Installing the Android SDK</a>」を参考にインストールを実行して、完了後にこのチュートリアルに戻ってください。</p> + +<h2 id="avd">AVD の作成</h2> + +<div class="sidebox-wrapper"> + <div class="sidebox-inner"> + <p>AVD の使用方法と使用可能なオプションについて詳しくは、<a href="{@docRoot}guide/developing/tools/avd.html">Android 仮想デバイス</a> のドキュメントを参照してください。</p> + </div> +</div> + +<p>このチュートリアルでは、開発したアプリケーションを Android エミュレータで実行します。エミュレータを起動するには、事前に Android 仮想デバイス(AVD)を作成する必要があります。AVD は、エミュレータが使用するシステム イメージとデバイスの設定を定義するものです。</p> + +<p>AVD を作成するには、Android SDK に含まれている「android」ツールを使用します。コマンド プロンプトまたはターミナルを開き、SDK パッケージの中の <code>tools/</code> ディレクトリに移動して、次のコマンドを実行します。 +<pre> +android create avd --target 2 --name my_avd +</pre> + +<p>カスタム ハードウェア プロファイルを作成するかどうかを尋ねられます。ここではひとまず、リターン キーを押してスキップします(デフォルトの回答は「No」となっています)以上で AVD の作成は終了です。この作業により、Android 1.5 プラットフォームを使用する「my_avd」という名前の AVD が構成されました。これで、AVD をエミュレータで使用できる状態になりました。</p> + +<p>上記のコマンドで使用した <code>--target</code> オプションは、エミュレータを実行する配備ターゲットを指定するもので、必須オプションです。<code>--name</code> オプションは新規 AVD の名前を定義するもので、これも必須オプションです。</p> + + +<h2 id="create">新規 Android プロジェクトを作成する</h2> + +<p>AVD を作成したら、次は Eclipse 内で新規 Android プロジェクトを開始します。</p> + +<ol> + <li>Eclipse で、<strong>[[]ファイル(File)] > [[]新規(New)] > [[]プロジェクト(Project)]</strong> を選択します。 + <p>ADT Plugin for Eclipse が正常にインストールされていれば、表示されるダイアログに、「Android」というラベルの付いたフォルダと、その中の「Android プロジェクト(Android Project)」が表示されます(1 つまたは複数の Android プロジェクトを作成した後は、「Android XML File」というエントリも表示されるようになります)。</p> + </li> + + <li>「Android プロジェクト(Android Project)」を選択して、[[]<strong>次へ(Next)</strong>] をクリックします。<br/><a href="images/hello_world_0.png"><img src="images/hello_world_0.png" style="height:230px" alt="" /></a> + </li> + + <li>プロジェクトの詳細項目に以下の値を入力します。 + <ul> + <li><em>プロジェクト名(Project name):</em> HelloAndroid</li> + <li><em>アプリケーション名(Application name):</em> Hello, Android</li> + <li><em>パッケージ名(Package name):</em> com.example.helloandroid(または自分のプライベート ネームスペース)</li> + <li><em>アクティビティを作成(Create Activity):</em> HelloAndroid</li> + <li><em>SDK の最小バージョン(Min SDK Version):</em> 2</li> + </ul> + <p>[[]<strong>完了(Finish)</strong>] をクリックします。</p> + + <a href="images/hello_world_1.png"><img src="images/hello_world_1.png" style="height:230px" alt="" /></a> + + <p>各フィールドの説明は以下のとおりです。</p> + + <dl> + <dt><em>プロジェクト名(Project Name)</em></dt> + <dd>Eclipse のプロジェクト名。プロジェクト ファイルを格納するディレクトリの名前です。</dd> + <dt><em>アプリケーション名(Application Name)</em></dt> + <dd>アプリケーション名はユーザーにわかりやすいアプリケーションのタイトルにします。この名前が Android 携帯端末に表示されます。</dd> + <dt><em>パッケージ名(Package Name)</em></dt> + <dd>作成したすべてのソース コードを格納するパッケージ ネームスペースです(Java プログラミング言語で作成するパッケージと同じルールに従います)。また、これにより、スタブ Activity が生成されるパッケージの名前も設定されます。 + <p>パッケージ名は Android システムにインストールされたすべてのパッケージに共通して固有のものでなければなりません。このため、作成するアプリケーションに標準的なドメイン スタイルのパッケージを使用することが非常に重要です。上記の例では、「com.example」というネームスペースを使用しています。これはサンプル ドキュメント用のネームスペースです。実際にアプリケーションを作成する際には、所属する組織または法人に適切なネームスペースを使用します。</p></dd> + <dt><em>アクティビティを作成(Create Activity)</em></dt> + <dd>プラグインによって生成されるクラス スタブの名前です。クラス スタブは Android の {@link android.app.Activity} クラスのサブクラスとなります。アクティビティとは単に、実行して何らかの処理を行うことができるクラスを意味します。選択に応じて UI を作成することもできます(ただし必須ではありません)。チェックボックスになっていることからわかるように、これは任意選択の項目です。しかし、実際にはほとんどのアプリケーションでは、アクティビティをアプリケーションの基盤として使用しています。</dd> + <dt><em>SDK の最小バージョン(Min SDK Version)</em></dt> + <dd>作成するアプリケーションが必要とする最小 API レベルを指定する値です。ここに入力した API レベルが、選択可能なターゲットのいずれかで提供される API レベルと一致する場合は、ビルド ターゲットが自動的に選択されます(この例では、API レベルに「2」と入力するとターゲット Android 1.1 が選択されます)。Android システム イメージと Android SDK それぞれの新しいバージョンでは、API に追加または変更が加えられている可能性があります。追加または変更が加えられている場合、新しい API レベルがシステム イメージに割り当てられ、どのアプリケーションの実行を許可するかが規制されます。アプリケーションで必要な API レベルがデバイスでサポートされるレベルよりも<em>高い</em>場合、アプリケーションはインストールされません。</dd> + </dl> + + <p><em>その他のフィールド</em>: 「デフォルト ロケーションの使用」チェックボックスでは、プロジェクトのファイルが生成され保存されるディスク上の場所を変更することができます。「ビルド ターゲット」は、作成するアプリケーションがコンパイルされるときにターゲットとするプラットフォームです(この項目は [[]SDK の最小バージョン(Min SDK Version)] の入力値に基づいて自動的に選択されます)。</p> + + <p class="note">ここで、選択した「ビルド ターゲット」で Android 1.1 プラットフォームが使用されることに注目してください。これは、作成するアプリケーションが Android 1.1 プラットフォーム ライブラリをターゲットとしてコンパイルされることを意味します。先ほど作成した AVD は Android 1.5 プラットフォームで実行されます。バージョンの数字が一致しませんが、Android アプリケーションには上方互換性があるため、1.1 プラットフォーム ライブラリをターゲットとして構築されたアプリケーションでも 1.5 プラットフォームで正常に動作します。ただしその逆の場合は正常に動作しません。</p> + </li> +</ol> + +<p>さて、これで Android プロジェクトを使用できる状態になりました。プロジェクトは左側のパッケージ エクスプローラー(Package Explorer)で表示できます。<em>「HelloAndroid」 > 「src」 > 「com.example.helloandroid」</em> の中にある <code>HelloAndroid.java</code> ファイルを開きます。ファイルの内容は次のようになっています。</p> + +<pre> +package com.example.helloandroid; + +import android.app.Activity; +import android.os.Bundle; + +public class HelloAndroid extends Activity { + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + } +}</pre> + +<p>クラスが {@link android.app.Activity} クラスに基づいていることに注目してください。アクティビティ(Activity)とは、処理を実行するために使用される単体のアプリケーション エンティティです。1 つのアプリケーションにはいくつものアクティビティが含まれる場合がありますが、ユーザーが一度に操作するのは 1 つのアクティビティです。アクティビティが開始すると、Android システムによって {@link android.app.Activity#onCreate(Bundle) onCreate()} メソッドが呼び出されます。このタイミングですべての初期化と UI セットアップを実行します。アクティビティにユーザー インターフェースは必須ではありませんが、通常はユーザー インターフェースを装備します。</p> + +<p>では、コードを変更してみましょう。 </p> + + +<h2 id="ui">UI を構築する</h2> + +<p>下記の変更済みのコードを参照して、お手元の HelloAndroid クラスに同じ変更を加えてみてください。太字の部分が追加された行です。</p> + +<pre> +package com.android.helloandroid; + +import android.app.Activity; +import android.os.Bundle; +<strong>import android.widget.TextView;</strong> + +public class HelloAndroid extends Activity { + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + <strong>TextView tv = new TextView(this); + tv.setText("Hello, Android"); + setContentView(tv);</strong> + } +}</pre> + +<p class="note"><strong>ヒント:</strong> プロジェクトにインポート パッケージを簡単に追加できる方法として、<strong>Ctrl+Shift+O</strong>(Mac では <strong>コマンド+Shift+O</strong>)を押す方法があります。これは、コードの記述に基づいて足りないパッケージを特定して追加する Eclipse のショートカット キーです。</p> + +<p>Android のユーザー インターフェースは、「ビュー(Views)」と呼ばれるオブジェクトの階層で構成されています。{@link android.view.View} は、UI レイアウト内でボタン、画像、または(このサンプルのように)テキスト ラベルといった要素として使用される、描画可能なオブジェクトです。これらのオブジェクトのそれぞれが View クラスのサブクラスであり、テキストを処理するサブクラスは {@link android.widget.TextView} です。</p> + +<p>この変更では、クラス コンストラクタを使用して TextView を作成します。このクラス コンストラクタは、パラメータとして Android {@link android.content.Context} インスタンスを受け入れます。Context とは、システムへのハンドルであり、リソースの解決、データベースや設定へのアクセスの取得などのサービスを提供します。Activity クラスは Context を継承します。作成する HelloAndroid クラスは、Activity のサブクラスであるため、Context でもあります。したがって、<code>this</code> を Context 参照として TextView に引き渡すことができます。</p> + +<p>次に、{@link android.widget.TextView setText(CharSequence) setText()} を使用してテキスト コンテンツを定義します。</p> + +<p>最後に、そのコンテンツが Activity UI のコンテンツとして表示されるように、TextView を {@link android.app.Activity#setContentView(View) setContentView()} に引き渡します。Activity によってこのメソッドが呼び出されなければ、UI は表示されず、空白の画面が表示されます。</p> + +<p>これで、Android で「Hello, World」が表示されるようになりました。次の手順はもちろん、アプリケーションの実行です。</p> + + +<h2 id="run">アプリケーションを実行する</h2> + +<p>Eclipse プラグインでは、非常に簡単にアプリケーションを実行できます。</p> + +<ol> + <li><strong>[[]実行] > [[]実行]</strong> を選択します。</li> + <li>「Android Application」を選択します。</li> +</ol> + +<div class="sidebox-wrapper"> + <div class="sidebox-inner"> + <p>Eclipse での起動構成の作成と編集について詳しくは、「<a href="{@docRoot}guide/developing/eclipse-adt.html#RunConfig">ADT を使用した Eclipse での開発</a>」を参照してください。</p> + </div> +</div> + +<p>Eclipse ADT によって自動的にプロジェクトの新規起動構成が作成され、Android エミュレータが自動的に起動します。エミュレータが起動した後、少し経つとアプリケーションが表示されます。次のような画面が表示されます。</p> + + <a href="images/hello_world_5.png"><img src="images/hello_world_5.png" style="height:230px" alt="" /></a> + +<p>グレーのバーに表示されている「Hello, Android」は、アプリケーションのタイトルです。このタイトルは Eclipse プラグインによって自動的に作成されます(文字列は <code>res/values/strings.xml</code> ファイル内で定義され、<code>AndroidManifest.xml</code> によって参照されます)。タイトルの下のテキストは、先ほど TextView オブジェクトで作成した実際のテキストです。</p> + +<p>これで「Hello World」についての基本的なチュートリアルは終了ですが、この続きもぜひ読んでください。Android アプリケーションの開発に関するさらに有益な情報を紹介しています。</p> + + +<h2 id="upgrading">UI を XML レイアウトにアップグレードする</h2> + +<p>先ほど作成した「Hello, World」のサンプルは、「プログラマティック」と呼ばれる UI レイアウトを使用しています。「プログラマティック」とは、アプリケーションの UI を直接ソース コードで作成および構築することを意味します。UI プログラミングの経験が豊富な方であればおそらく、このようなアプローチが時にいかに脆弱になり得るかをよくご存じでしょう。レイアウトの軽微な変更のたびに、ソース コード全体に関わる大きな問題が発生する可能性があるからです。また、複数のビューを適切に結びつけることも忘れられがちであるため、これによりレイアウトにエラーが発生し、コードのデバッグで時間が無駄になる場合があります。</p> + +<p>その理由から、Android では、XML ベースのレイアウト ファイルを使用する別の UI 構築モデルを用意しています。この概念を簡単に説明するには、サンプルを紹介するのが一番です。ここに示すのは、上記の「プログラマティック」に構築したサンプルと同じように動作する XML レイアウト ファイルです。</p> + +<pre><?xml version="1.0" encoding="utf-8"?> +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:text="@string/hello"/></pre> + +<p>Android XML レイアウト ファイルの全般的な構造はシンプルです。XML 要素がツリー構造になっており、含まれた各ノードが View クラスの名前を表しています(このサンプルでは View 要素が 1 つのみですが)。XML レイアウト内の要素として、{@link android.view.View} を拡張する任意のクラスの名前を使用できます。これには作成するコードの中で定義するカスタム View クラスも含まれます。この構造により、プログラマティックなレイアウトよりもシンプルな構造と構文を使用して、迅速な UI 構築を非常に簡単に行うことができます。このモデルは、アプリケーションの表示(つまり UI)を、データの取得と入力に使用されるアプリケーション ロジックから切り離すことができる Web 開発モデルからヒントを得て考案されました。</p> + +<p>上記の XML サンプルには、<code>TextView</code> という View 要素 1 つのみが含まれています。この要素は 4 つの XML 属性を持っています。下表に、これらの 4 つの属性の説明をまとめました。</p> + +<table> + <tbody> + <tr> + <th> + 属性 + </th> + <th> + 説明 + </th> + </tr> + <tr> + <td> + <code>xmlns:android</code> + </td> + <td> + Android ネームスペースで定義された共通の属性を参照することを Android ツールに伝える XML ネームスペース宣言です。すべての Android レイアウト ファイル内の最初と最後のタグはこの属性を持つ必要があります。<br> + </td> + </tr> + <tr> + <td> + <code>android:layout_width</code> + </td> + <td> + 該当の View が画面の利用可能な幅のうちどれくらいを占めるかを定義します。このサンプルでは、この View しかないため、「fill_parent」という値を使用して画面全体を占めることにします。<br> + </td> + </tr> + <tr> + <td> + <code>android:layout_height</code> + </td> + <td> + android:layout_width とよく似た属性で、幅ではなく高さを表します。 + </td> + </tr> + <tr> + <td> + <code>android:text</code> + </td> + <td> + TextView が表示するテキストを設定します。このサンプルでは、ハードコード記述された文字列値ではなく文字列リソースを使用します。文字列「<em>hello</em>」は <em>res/values/strings.xml</em> ファイル内で定義されます。アプリケーションに文字列を挿入する場合にはこの方法が推奨されます。レイアウト ファイルのハードコードを直接変更する必要がないため、アプリケーションの他の言語へのローカライズがスムーズに進むからです。詳しくは、「<a href="{@docRoot}guide/topics/resources/resources-i18n.html">リソースと国際化</a>」を参照してください。 + </td> + </tr> + </tbody> +</table> + + +<p>これらの XML レイアウト ファイルは、作成するプロジェクトの <code>res/layout/</code> ディレクトリ内に置かれます。「res」は「resources」の略で、アプリケーションに必要なコード以外のすべてのアセットがこのディレクトリに格納されます。リソースには、レイアウト ファイルの他に、画像、音声、ローカライズされた文字列などのアセットがあります。</p> + +<div class="sidebox"> + <h2>横表示レイアウト</h2> + <p>横表示の場合に異なるデザインで表示するには、レイアウト XML ファイルを /res/layout-land 内に入れます。Android 端末のレイアウトが横表示に変わると自動的にこのディレクトリが参照されます。このように横表示向けに定義されたレイアウトが存在しない場合、自動的にデフォルトのレイアウトが拡大して使用されます。</p> +</div> + +<p>Eclipse プラグインでは、このようなレイアウト ファイルの 1 つである「main.xml」が自動的に作成されます。先ほど「Hello World」アプリケーションを作成した際には、このファイルは無視してプログラマティックにレイアウトを作成しました。この作成方法は Android フレームワークについてより深く理解していただくことを意図したもので、実際にはほとんどの場合レイアウトはコードではなく XML ファイルで定義します。以下の手順では、既存のアプリケーションを変更して XML レイアウトが使用されるようにする方法を説明します。</p> + +<ol> + <li>Eclipse のパッケージ エクスプローラー(Package Explorer)で、<code>/res/layout/</code> フォルダを展開し、<code>main.xml</code> を開きます(開いた後、場合によっては XML ソースを見るのにウィンドウ下部にある「main.xml」タブをクリックする必要があります)。ファイルの内容を以下の XML に置き換えます。 + +<pre><?xml version="1.0" encoding="utf-8"?> +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:text="@string/hello"/></pre> +<p>ファイルを保存します。</p> +</li> + +<li><code>res/values/</code> フォルダ内の <code>strings.xml</code> を開きます。このファイルは、作成するユーザー インターフェースのためのすべてのデフォルトのテキスト文字列を保存するものです。Eclipse を使用している場合、ADT によってあらかじめ <em>hello</em> と <em>app_name</em> という 2 つの文字列が用意された状態になります。<em>hello</em> を何か別の文字列に書き換えてみましょう。たとえば「Hello, Android! I am a string resource!」としてみましょう。変更後のファイルの全体は次のようになります。 +<pre> +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="hello">Hello, Android! I am a string resource!</string> + <string name="app_name">Hello, Android</string> +</resources> +</pre> +</li> + +<li>次に、<code>HelloAndroid</code> クラスを開いて、XML レイアウトを使用して変更します。ファイルを編集して次のような内容にします。 +<pre> +package com.example.helloandroid; + +import android.app.Activity; +import android.os.Bundle; + +public class HelloAndroid extends Activity { + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + } +}</pre> + +<p>この変更を行う際に、コードを手入力してコード補完機能を試してみましょう。「R.layout.main」と入力しようとすると、プラグインによって入力候補が表示されます。この機能の便利さは、開発中に何回も実感すると思います。</p> + +<p>View オブジェクトに <code>setContentView()</code> を引き渡す代わりに、レイアウト リソースへの参照を付与します。リソースは <code>R.layout.main</code> として識別されます。これは、<code>/res/layout/main.xml</code> で定義されたレイアウトを、コンパイルされたオブジェクトで表したものです。Eclipse プラグインでは、この参照がプロジェクトの R.java クラス内に自動的に作成されます。Eclipse を使用していない場合、Ant を実行してアプリケーションのビルドを行う際に R.java クラスが生成されます(R クラスについて詳しくは後ほど説明します)。</p> +</li> +</ol> + +<p>ここで、アプリケーションを再実行します。起動構成は作成済みであるため、ここでは緑色の矢印アイコンをクリックして実行するか、または <strong>[[]実行(Run)] > [[]ヒストリーの実行(Run History)] > [[]Android Activity]</strong> を選択するだけです。TextView 文字列に加えた変更を除けば、アプリケーションは同じに見えます。ここでポイントとなるのは、2 つの異なるレイアウト編集方法を使用して同じ結果が得られるということです。</p> + +<p class="note"><strong>ヒント:</strong> ショートカット キー<strong>Ctrl+F11</strong>(Mac では <strong>コマンド+Shift+F11</strong>)を使用して、現在表示されているアプリケーションを実行することができます。</p> + +<p>ここからは、デバッグの基礎知識と、他の総合開発環境に関する補足情報について説明します。さらに詳しく学習したい場合は、「<a href="{@docRoot}guide/topics/fundamentals.html">アプリケーションの基礎</a>」を参照してください。Android アプリケーションが動作するためのすべての要素について説明しています。また、「<a href="{@docRoot}guide/index.html">デベロッパー ガイド</a>」の導入ページを参照して、<em>デベロッパー ガイド</em> ドキュメントの概要を確認してください。</p> + + +<div class="special"> +<h3>R クラス</h3> +<p>Eclipse で、<code>R.java</code> という名前のファイル(<code>gen/</code>(「生成された Java ファイル(Generated Java Files)」フォルダ内)を開きます。ファイルの内容は次のようになっています。</p> + +<pre> +package com.example.helloandroid; + +public final class R { + public static final class attr { + } + public static final class drawable { + public static final int icon=0x7f020000; + } + public static final class layout { + public static final int main=0x7f030000; + } + public static final class string { + public static final int app_name=0x7f040001; + public static final int hello=0x7f040000; + } +} +</pre> + +<p>プロジェクトの <code>R.java</code> ファイルは、ファイル内で定義されたすべてのリソースへのインデックスです。ソース コード内では、プロジェクトに含めたすべてのリソースを参照するための簡略形式としてこのクラスを使用します。これは、Eclipse などの総合開発環境のコード補完機能とともに使用すると特に便利です。探している特定の参照をすばやくインタラクティブに見つけることができるからです。</p> + +<p>お手元のファイルはこれとは若干異なる可能性があります(おそらく 16 進値が異なるためです)。ここでは、「layout」という名前の内部クラスと、そのメンバーであるフィールド「main」に注目します。Eclipse プラグインにより main.xml という名前の XML レイアウト ファイルが認識され、ここにそのためのクラスが生成されたものです。プロジェクトに他のリソース(<code>res/values/string.xml</code> ファイル内の文字列や <code>res/drawable/</code> ディレクトリ内の描画可能オブジェクトなど)を追加すると、<code>R.java</code> に最新の変更が反映されます。</p> +<p>Eclipse を使用していない場合は、(Ant ツールを使用した)ビルド時にこのクラス ファイルが生成されます。</p> +<p><em>くれぐれもこのファイルを手動で編集しないようにしてください。</em></p> +</div> + +<h2 id="debugging">プロジェクトをデバッグする</h2> + +<p>Android Plugin for Eclipse は、Eclipse のデバッガと優れた連動性を発揮します。このメリットを確認するため、作成したコードにバグを埋め込んでみましょう。作成した HelloAndroid ソース コードを次のように変更します。</p> + +<pre> +package com.android.helloandroid; + +import android.app.Activity; +import android.os.Bundle; + +public class HelloAndroid extends Activity { + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Object o = null; + o.toString(); + setContentView(R.layout.main); + } +}</pre> + +<p>この変更は、単にコードに NullPointerException を発生させるものです。アプリケーションを再度実行すると、最終的に次のような画面が表示されます。</p> + + <a href="images/hello_world_8.png"><img src="images/hello_world_8.png" style="height:230px" alt="" /></a> + +<p>「強制終了」を押してアプリケーションを終了し、エミュレータ ウィンドウを閉じます。</p> + +<p>エラーの詳細を確認するには、ソース コード内の <code>Object o = null;</code> 行にブレークポイントを設定します(該当するソース コード行の横にあるマーカー バーをダブルクリックします)。次に、メニューから <strong>[[]実行(Run)] > [[]デバッグ ヒストリー(Debug History)] > [[]Hello, Android]</strong> を選択して、デバッグ モードに入ります。エミュレータでアプリケーションが再起動されますが、今度は、先ほど設定したブレークポイントに到達した時点で中断されます。その後 Eclipse のデバッグ パースペクティブ(Debug Perspective)で、他のアプリケーションで通常行うように、コードの内容を確認できます。</p> + + <a href="images/hello_world_9.png"><img src="images/hello_world_9.png" style="height:230px" alt="" /></a> + + +<h2 id="noeclipse">Eclipse を使用せずにプロジェクトを作成する</h2> + + <p>Eclipse を使用していない場合(普段から使用している総合開発環境がある場合や、シンプルにテキスト エディタやコマンド ライン ツールを使用している場合など)は、Eclipse プラグインを利用することはできません。しかし心配は無用です。Eclipse を使用していないからといって何らかの機能が失われることはありません。</p> + + <p>Android Plugin for Eclipse は、単に Android SDK に含まれるツール セットをまとめたものに過ぎません(エミュレータ、aapt、adb、ddms などの個別のツールについては、<a href="{@docRoot}guide/developing/tools/index.html">こちらで別途説明</a>しています)。このため、これらのツールを別のツール、たとえば「Ant」のビルド ファイルなどでまとめることも可能です。</p> + + <p>Android SDK には、「android」という名前のツールが含まれています。このツールを使用すると、作成するプロジェクトのソース コードとディレクトリ スタブすべて、および Ant と互換性のある <code>build.xml</code> ファイルを作成することができます。これにより、プロジェクトをコマンド ラインで作成したり、普段使用している総合開発環境と統合したりすることができます。</p> + + <p>たとえば、Eclipse で作成されるものと同様の HelloAndroid プロジェクトを作成するには、次のコマンドを使用します。</p> + + <pre> +android create project \ + --package com.android.helloandroid \ + --activity HelloAndroid \ + --target 2 \ + --path <em><path-to-your-project></em>/HelloAndroid +</pre> + + <p>これにより、<em>path</em> で定義された場所に、プロジェクトに必要なフォルダとファイルが作成されます。</p> + + <p>SDK ツールを使用してプロジェクトを作成および構築する方法について詳しくは、「<a href="{@docRoot}guide/developing/other-ide.html">Developing in Other IDEs</a>」を参照してください。</p> diff --git a/docs/html/intl/ja/index.jd b/docs/html/intl/ja/index.jd new file mode 100644 index 0000000..a5378c9 --- /dev/null +++ b/docs/html/intl/ja/index.jd @@ -0,0 +1,159 @@ +home=true +@jd:body + + + <div id="mainBodyFixed"> + <div id="mainBodyLeft"> + <div id="homeMiddle"> + <div id="topAnnouncement"> + <div id="homeTitle"> + <h2>デベロッパーへのお知らせ</h2> + </div><!-- end homeTitle --> + <div id="announcement-block"> + <!-- total max width is 520px --> + <img src="/assets/images/home/android_adc.png" alt="Android Developer Challenge 2" width="232px" /> + <div id="announcement" style="width:275px"> + <p>第2Android Developer Challengeが、遂に登場しました!このアプリケーション開発コンテストでは、Androidのユーザなら誰でも簡単に参加でき、一等の賞金は$250,000 です。登録の締切日は8月31日になります。</p> + <p><a href="http://code.google.com/android/adc/">Android Developer Challengeについて詳しくはこちら »</a></p> + </div> <!-- end annoucement --> + </div> <!-- end annoucement-block --> + </div><!-- end topAnnouncement --> + <div id="carouselMain" style="height:210px"> <!-- this height can be adjusted based on the content height --> + </div> + <div class="clearer"></div> + <div id="carouselWheel"> + <div class="app-list-container" align="center"> + <a href="javascript:{}" id="arrow-left" onclick="" class="arrow-left-off"></a> + <div id="list-clip"> + <div style="left: 0px;" id="app-list"> + <!-- populated by buildCarousel() --> + </div> + </div><!-- end list-clip --> + <a href="javascript:{ page_right(); }" id="arrow-right" onclick="" class="arrow-right-on"></a> + <div class="clearer"></div> + </div><!-- end app-list container --> + </div><!-- end carouselWheel --> + </div><!-- end homeMiddle --> + + <div style="clear:both"> </div> + </div><!-- end mainBodyLeft --> + + <div id="mainBodyRight"> + <table id="rightColumn"> + <tr> + <td class="imageCell"><a href="{@docRoot}sdk/index.html"><img src="{@docRoot}assets/images/icon_download.jpg" style="padding:0" /></a></td> + <td> + <h2 class="green">ダウンロード</h2> + <p>Android SDK には、優れたアプリケーションの作成に必要となるツール、サンプル コード、ドキュメントが含まれています。 </p> + <p><a href="{@docRoot}sdk/{@sdkCurrent}/index.html">詳細 »</a></p> + </td> + </tr> + <tr> + <td colspan="2"><div class="seperator"> </div></td> + </tr> + <tr> + <td class="imageCell"><a href="http://www.android.com/market.html"><img src="{@docRoot}assets/images/icon_market.jpg" style="padding:0" /></a></td> + <td> + <h2 class="green">公開</h2> + <p>Android マーケットは、アプリケーションを携帯端末に配信するためのオープン サービスです。</p> + <p><a href="http://www.android.com/market.html">詳細 »</a></p> + </td> + </tr> + <tr> + <td colspan="2"><div class="seperator"> </div></td> + </tr> + <tr> + <td class="imageCell"><a href="http://source.android.com"><img src="{@docRoot}assets/images/icon_contribute.jpg" style="padding:0" /></a></td> + <td> + <h2 class="green">貢献</h2> + <p>Android オープンソース プロジェクトでは、プラットフォーム全体のソースコードを公開しています。</p> + <p><a href="http://source.android.com">詳細 »</a></p> + </td> + </tr> + <tr> + <td colspan="2"><div class="seperator"> </div></td> + </tr> + <tr> + <td class="imageCell"><a href="http://www.youtube.com/user/androiddevelopers"><img src="{@docRoot}assets/images/video-droid.png" style="padding:0" /></a></td> + <td> + <h2 class="green">再生</h2> + <object width="150" height="140"><param name="movie" value="http://www.youtube.com/v/GARMe7Km_gk&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/GARMe7Km_gk&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="150" height="140"></embed></object> + <p style="margin-top:1em"><a href="{@docRoot}videos/index.html">その他の Android 動画 »</a></p> + </td> + </tr> + + </table> + </div> + </div> + +<!--[if lte IE 6]> + <style> + #arrow-left { + margin:0 0 0 5px; + } + #arrow-right { + margin-left:0; + } + .app-list-container { + margin: 37px 0 0 23px; + } + div#list-clip { + width:468px; + } + </style> +<![endif]--> + +<script type="text/javascript"> + +// * -- carousel dictionary -- * // + /* layout: imgLeft, imgRight, imgTop + icon: image for carousel entry. cropped (height:70px, width:90px) + name: string for carousel entry + img: image for bulletin post. cropped (height: 170, width:230px) + title: header for bulletin (optional, insert "" value to skip + desc: the bulletin post. must include html tags. + */ + + var droidList = { + 'sdk': { + 'layout':"imgLeft", + 'icon':"sdk-small.png", + 'name':"SDK 1.5 r3", + 'img':"sdk-large.png", + 'title':"Android 1.5 SDK", + 'desc': "<p>Android 1.5 SDK の最新バージョンが公開されました。このリリースには Android 1.5 用の API、最新版デベロッパーツール、複数プラットフォーム(バージョン)サポート、そして Google API のアドオンが含まれています。</p><p><a href='{@docRoot}sdk/1.5_r3/index.html'>Android 1.5 SDK をダウンロード »</a></p>" + }, + + 'io': { + 'layout':"imgLeft", + 'icon':"io-small.png", + 'name':"Google I/O", + 'img':"io-large.png", + 'title':"Google I/O Developer Conference", + 'desc': "<p>Google I/O は、サンフランシスコの Moscone Center で 5 月 27~28 日に開催された開発者会議です。このイベントに参加できなかった方は、各アンドロイド向けセッションを、YouTube ビデオ資料で体験する事が可能<nobr>です</nobr>。</p><p><a href='{@docRoot}videos/index.html'>セッションを参照してください »</a></p>" + }, + + 'mapskey': { + 'layout':"imgLeft", + 'icon':"maps-small.png", + 'name':"Maps API キー", + 'img':"maps-large.png", + 'title':"Maps API キー", + 'desc':"<p>MapView から Google マップを利用する Android アプリケーションを開発する場合は、アプリケーションを登録して Maps API キーを取得する必要があります。この API キーが無いアプリケーションは、Android 上で動作しません。キーの取得は、簡単な手順で行うことができます。</p><p><a href='http://code.google.com/android/add-ons/google-apis/maps-overview.html'>詳細 »</a></p>" + }, + + 'devphone': { + 'layout':"imgLeft", + 'icon':"devphone-small.png", + 'name':"Dev Phone 1", + 'img':"devphone-large.png", + 'title':"Android Dev Phone 1", + 'desc': "<p>この携帯電話を使用することで、開発した Android アプリケーションの実行とデバッグを行うことができます。Android オペレーティングシステムを変更してからリビルドし、携帯電話に書き込むことができます。Android Dev Phone 1 は携帯通信会社に依存しておらず、<a href='http://market.android.com/publish'>Android マーケット</a>に登録済みのデベロッパーなら誰でも購入可能です。</p><p><a href='/guide/developing/device.html#dev-phone-1'>Android Dev Phone 1 の詳細»</a></p>" + } + + } +</script> +<script type="text/javascript" src="{@docRoot}assets/carousel.js"></script> +<script type="text/javascript"> + initCarousel("sdk"); +</script> diff --git a/docs/html/intl/ja/sdk/1.5_r2/installing.jd b/docs/html/intl/ja/sdk/1.5_r2/installing.jd new file mode 100644 index 0000000..bcb1ffb --- /dev/null +++ b/docs/html/intl/ja/sdk/1.5_r2/installing.jd @@ -0,0 +1,212 @@ +page.title=Android SDK のインストール +@jd:body + + +<p>このページでは、Android SDK をインストールして、開発環境を設定する方法について説明します。SDK をまだダウンロードしていない場合は、[<a href="{@docRoot}sdk/{@sdkCurrent}/index.html">ダウンロード</a>] ページからダウンロードしてください。SDK をダウンロードした後に、このページの手順を行ってください。</p> + +<p>インストール中に問題が発生した場合は、このページの下部にある<a href="#installnotes">インストールに関する注意事項</a>を参照してください。</p> + +<h4 style="margin-top">アップグレードする場合</h4> +<p>SDK の以前のバージョンを使用してアプリケーションを既に開発している場合は、このページの代わりに、<a href="upgrading.html"><strong></strong>SDK のアップグレード</a></b> をご覧ください。 +</p> + + +<h2 id="setup">インストールの準備</h2> + +<p>インストールを始める前に、開発用マシンが<a href="requirements.html">システム要件</a>を満たしていることを確認してください。 +</p> + +<p>Eclipse 環境に Android Development Tools(ADT)プラグインを組み込んだ開発環境は、Android 向け開発の初心者に最適です。プラグインを利用する場合は、コンピュータに Eclipse の適切なバージョン(3.3 以降)がインストールされていることを確認してください。Eclipse のインストールが必要な場合は、次の場所からダウンロードできます: </p> + +<p style="margin-left:2em;"><a href= +"http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a></p> + +<p>Eclipse の Java バージョンまたは RCP バージョンをおすすめします。 </p> + +<h2 id="installingsdk">SDK のインストール</h2> + +<p>SDK のダウンロード後、お使いのマシンの適切な場所に .zip アーカイブを展開します。デフォルトでは、SDK ファイルは <code>android_sdk_<em><platform</em>>_<em><release></em></code> ディレクトリに展開されます。このディレクトリには、ドキュメントのローカル コピー(ブラウザで <code>documentation.html</code> を開くと参照できます)と、<code>tools/</code>、<code>add-ons/</code>、<code>platforms/</code> などのサブディレクトリが含まれます。<code>platforms/</code> のサブディレクトリ内には、プラットフォームの各バージョンに固有のコードのサンプルが含まれる <code>samples/</code> があります。</p> + +<p>システム上に展開した SDK ディレクトリの名前とパスをメモしておきましょう。Android プラグインの設定時や、SDK ツールの使用時にこの SDK ディレクトリを参照する必要があります。</p> + +<p>SDK のプライマリディレクトリである <code>tools</code> のパスを、システム PATH に追加することをおすすめします。<code>tools/</code> プライマリディレクトリは、SDK フォルダのルートにあります。<code>tools</code> をパスに追加すると、Android Debug Bridge(adb)やその他のコマンド ライン <a href="{@docRoot}guide/developing/tools/index.html">ツール</a>を、ツールの格納されたディレクトの完全なパスを指定せずに実行できるようになります。 </p> +<ul> + <li>Linux 上では <code>~/.bash_profile</code> ファイルまたは <code>~/.bashrc</code> ファイルを編集します。PATH 環境変数を設定している行を探し、その行に <code>tools/</code> ディレクトリへの完全なパスを追加します。PATH を設定する行が無い場合は、次の行を追加します:</li> + + <ul><code>export PATH=${PATH}:<em><your_sdk_dir></em>/tools</code></ul> + + <li>Mac 上では <code>.bash_profile</code> のホーム ディレクトリの内から同じファイルを検索し、Linux と同じように設定します。マシン上にまだ <code>.bash_profile</code> が無い場合は、ファイルを作成することができます。 </li> + + <li>Windows 上では、[マイ コンピュータ] を右クリックし、[プロパティ] を選択します。[詳細設定] タブで [環境変数] ボタンをクリックし、表示されたダイアログで [システム環境変数] の [Path] をダブルクリックします。その Path に <code>tools/</code> ディレクトリへの完全なパスを追加します。 </li> + </ul> + +<p>今後 SDK をアップグレードする際は、PATH の設定を更新することを忘れないでください。別のディレクトリに SDK を展開する場合は、その新しい場所を PATH に設定する必要があります。</p> + +<p>Eclipse IDE を開発環境として使用する場合、Android Development Tools プラグインをインストールして Eclipse を設定する方法について、次のセクションの情報を参照してください。Eclipse を使用しない場合は、別の IDE を使用して Android アプリケーションを開発してから、SDK に含まれているツールを使用してコンパイル、デバッグ、配布を行うことができます(この場合は、<a href="#next">次のステップ</a>に進んでください)。</p> + + +<h2 id="installingplugin">Eclipse 用 ADT プラグインのインストール</h2> + +<p>Android では、Android Development Tools(ADT)という Eclipse IDE 用のカスタム プラグインを提供しています。このプラグインは、Android アプリケーションの構築を可能にするために設計された、強力な統合環境です。プラグインによって Eclipse の機能が拡張され、新しい Android プロジェクトの設定、アプリケーションの UI の作成、Android Framework API に基づくコンポーネントの追加、Android SDK ツールを使用したアプリケーションのデバッグが可能になります。さらに、アプリケーションを配布するための署名済み(または未署名)の APK のエクスポートも簡単にできるようになります。</p> + +<p>一般的な Android 開発において、ADT を組み込んだ Eclipse の使用は強く推奨されており、Android 初心者に最も効率的な開発環境を提供します。(Eclipse 以外の IDE で作業する場合は、Eclipse や ADT をインストールする必要はありません。代わりに、SDK ツールを直接使用してアプリケーションを構築し、デバッグを行います)。</p> + +<p><a href="#setup">インストールの準備</a>で説明した手順に従って Eclipse をインストールした後は、次の手順に従って操作して ADT プラグインをダウンロードし、それぞれの Eclipse 環境にインストールします。 </p> + +<table style="font-size:100%"> +<tr><th>Eclipse 3.3(Europa)</th><th>Eclipse 3.4(Ganymede)</th></tr> +<tr> +<td width="45%"> +<!-- 3.3 steps --> +<ol> + <li>Eclipse を起動し、[<strong>ヘルプ</strong>] > [<strong>ソフトウェアの更新</strong>] > [<strong>検索とインストール</strong>] を選択します。 </li> + <li>表示されるダイアログで [<strong>インストールする新規フィーチャーを検索</strong>] を選択して [<strong>次へ</strong>] をクリックします。 </li> + <li>[<strong>新規リモートサイト</strong>] をクリックします。 </li> + <li>表示されるダイアログ ボックスで、リモート サイトの名前(例: 「Android Plugin」)を入力し、URL を入力します: + <pre>https://dl-ssl.google.com/android/eclipse/</pre> + <p>プラグインが入手できない場合は、URL の「https」の代わりに「http」を使用してみてください(セキュリティ上の理由からは、https をおすすめします)。</p> + <p>[<strong>OK</strong>] をクリックします。</p> </li> + <li>検索リストに新しいサイトが追加されており、チェックボックスがオンの状態で表示されるはずです。[<strong>終了</strong>] をクリックします。 </li> + <li>次の [検索結果] ダイアログボックスで、「Android Plugin」のチェックボックスをオンにします。これにより、そこに含まれているツール「Android DDMS」と「Android Development Tools」も自動的にオンになります。[<strong>次へ</strong>] をクリックします。</li> + <li>使用許諾契約を読み、同意して、[<strong>次へ</strong>] をクリックします。 </li> + <li>次のインストール ウィンドウで [<strong>終了</strong>] をクリックします。 </li> + <li>ADT プラグインはデジタル署名されていません。[<strong>すべてインストール</strong>] をクリックしてインストールを許可します。 </li> + <li>Eclipse を再起動します。 </li> +</ol> + +</td> +<td> + +<!-- 3.4 steps --> +<ol> + <li>Eclipse を起動し、[<strong>ヘルプ</strong>] > [<strong>ソフトウェアの更新</strong>] を選択します。</li> + <li>表示されるダイアログで [<strong>使用可能なソフトウェア</strong>] タブをクリックします。 </li> + <li>[<strong>サイトの追加</strong>] をクリックします。 </li> + <li>次の場所を入力します: + <pre>https://dl-ssl.google.com/android/eclipse/</pre> + <p>プラグインが入手できない場合は、場所の URL の「https」の代わりに「http」を使用してみてください(セキュリティ上の理由からは、https をおすすめします)。</p> + <p>[<strong>OK</strong>] をクリックします。</p></li> + <li>[使用可能なソフトウェア] のタブに戻ると、上記の URL によるプラグインとその中に含まれる「Developer Tools」が表示されているはずです。「Developer Tools」の横のチェックボックスをオンにし、[<strong>インストール</strong>] をクリックします。</li> + <li>次のインストール ウィンドウで、「Android DDMS」と「Android Development Tools」の両方のチェックボックスがオンになっていることを確認します。[<strong>次へ</strong>] をクリックします。 </li> + <li>使用許諾契約を読み、同意して、[<strong>終了</strong>] をクリックします。</li> + <li>Eclipse を再起動します。 </li> +</ol> + +</td> +</tr> +</table> + +<p>次に、Eclipse の設定を変更して、Android SDK ディレクトリを指すように変更します:</p> +<ol> + <li>[<strong>ウィンドウ</strong>] > [<strong>設定</strong>] を選択して、[設定] パネルを開きます(Mac 上では [<strong>Eclipse</strong>] > [<strong>設定</strong>])。</li> + <li>左側のパネルで [<strong>Android</strong>] を選択します。 </li> + <li>メイン パネルの [<em>SDK Location</em>] で [<strong>参照</strong>] をクリックし、ダウンロードした SDK ディレクトリを探します。 </li> + <li>[<strong>適用</strong>] をクリックして、[<strong>OK</strong>] をクリックします。</li> +</ol> + +<p>これで完了です。問題なく完了した場合は、Android アプリケーション開発を始める準備が整っています。開発を始めるヒントについては、<a href="#next">次のステップ</a>のセクションをご覧ください。 </p> + + +<h3 id="troubleshooting">ADT のインストールでのトラブルシューティング</h3> +<p> +上記の手順で、ADT プラグインのダウンロードに問題が生じた場合のヒントは次のとおりです: </p> + +<ul> + <li>Eclipse から ADT プラグインを含むリモート更新サイトが見つからない場合は、リモート サイトとして指定した URL の https を http に変更してみます。つまり、次のリモート サイトの URL を設定します: + <pre>http://dl-ssl.google.com/android/eclipse/</pre></li> + <li>ファイアウォール(社内のファイアウォールなど)の内部にいる場合、Eclipse でプロキシ情報が正しく設定されていることを確認してください。Eclipse 3.3/3.4 でプロキシ情報を設定するには、Eclipse のメイン メニューから [<strong>ウィンドウ</strong>](Mac 上では [<strong>Eclipse</strong>])> [<strong>環境設定</strong>] > [<strong>一般</strong>] > [<strong>ネットワーク接続</strong>] を選択します。</li> +</ul> +<p> +それでも Eclipse を使用して ADT プラグインをリモート更新サイトとしてダウンロードできない場合は、ADT zip ファイルをローカル マシン上にダウンロードして、手動でインストールすることができます: +</p> +<ol> + <li><a href="{@docRoot}sdk/adt_download.html">ADT zip ファイルをダウンロードします</a>(展開はしないでください)。</li> + <li>デフォルトのインストール手順(上記)のステップ 1 と 2 のとおりに操作します。</li> + <li>Eclipse 3.3 では [<strong>新規アーカイブ・サイト</strong>] をクリックします。<br/>Eclipse 3.4 では [<strong>サイトの追加</strong>] をクリックして、[<strong>アーカイブ</strong>] をクリックします。</li> + <li>ダウンロードした zip ファイルを参照して選択してください。</li> + <li>上記のステップ 5 から残りの手順に従って操作します。</li> +</ol> +<p>zip ファイルからインストールしたプラグインを後でアップデートする場合は、デフォルトのアップデート手順の代わりに、もう一度この手順どおりに操作する必要があります。</p> + +<h4>その他のインストール エラー</h4> + +<p>オプションの Eclipse コンポーネント(WST など)を必要とする ADT の機能があります。ADT のインストール時にエラーが発生した場合、お使いの Eclipse インストール環境にこうしたコンポーネントが含まれていない可能性があります。必要なコンポーネントを Eclipse インストール環境に簡単に追加する方法について詳しくは、トラブルシューティング トピック <a href="{@docRoot}guide/appendix/faq/troubleshooting.html#installeclipsecomponents">ADT インストールエラー: "requires plug-in org.eclipse.wst.sse.ui"</a> をご覧ください。</p> + +<h4>Linux ユーザーの場合</h4> +<p>Eclipse 用 ADT プラグインのインストール時に、次のエラーが発生する場合があります。 +<pre> +An error occurred during provisioning. +Cannot connect to keystore. +JKS</pre> +<p> +この場合、お使いの開発用マシンに適切な Java VM が搭載されていません。Sun Java 6 をインストールするとこの問題が解決し、ADT プラグインを再インストールすることができます。</p> + + +<h2 id="next">次のステップ</h2> +<p>インストールを完了すると、アプリケーションの開発を始める準備が整います。開発を始める方法をいくつか紹介します: </p> + +<p><strong>Android の詳細の学習</strong></p> +<ul> + <li><a href="{@docRoot}guide/index.html">デベロッパー ガイド</a>と、ガイドに説明されている情報の種類を参照します。</li> + <li>Android をプラットフォームとして紹介している <a + href="{@docRoot}guide/basics/what-is-android.html">Android とは</a>を読みます。</li> + <li><a href="{@docRoot}guide/topics/fundamentals.html">アプリケーションの基礎</a>を参照して、Android フレームワークとそこでのアプリケーションの実行方法について学びます。</li> + <li>[<a + href="{@docRoot}reference/packages.html">リファレンス</a>] タブの Android Framework API の仕様を参照します。</li> +</ul> + +<p><strong>SDK の探索</strong></p> +<ul> + <li>利用可能な<a + href="{@docRoot}guide/developing/tools/index.html">開発ツール</a>の概要を把握します。</li> + <li><a + href="{@docRoot}guide/developing/eclipse-adt.html">Eclipse/ADT</a> または<a href="{@docRoot}guide/developing/other-ide.html">別の IDE</a> での開発方法を参照します。 + </li> +</ul> + +<p><strong>サンプル コードの参照</strong></p> +<ul> + <li><a href="{@docRoot}guide/tutorials/hello-world.html">Hello World アプリケーション</a>を構築します(特に Eclipse ユーザーにおすすめです)。</li> + <li><a href="{@docRoot}guide/tutorials/notepad/index.html">Notepad チュートリアル</a>に沿って Android アプリケーションを完全に構築します。 </li> + <li><code><em><sdk></em>/platforms/<em><platfrom></em>/samples</code> に収められている他のサンプル アプリケーションのいずれかを新しいプロジェクトとして作成し、自分の開発環境でコンパイルし、実行します。</li> +</ul> + +<p><strong>Android デベロッパー グループへのアクセス</strong></p> +<ul> + <li>[<a + href="{@docRoot}community/index.html">コミュニティ</a>] タブで、Android デベロッパー グループの一覧を参照します。特に <a href="http://groups.google.com/group/android-developers">Android Developers</a> グループは、Android デベロッパー コミュニティがどういうものかを知るのに参考になります。</li> +</ul> + + +<h2 id="installnotes">インストールに関する注意事項</h2> + +<h3>Ubuntu Linux に関する注意事項</h3> + +<ul> + <li>開発マシン上で Java をインストールして設定する方法については、次のリソースが参考になります: + <ul> + <li><a href="https://help.ubuntu.com/community/Java">https://help.ubuntu.com/community/Java </a></li> + <li><a href="https://help.ubuntu.com/community/Java">https://help.ubuntu.com/community/JavaInstallation</a></li> + </ul> + </li> + <li>Android SDK と ADT プラグインをインストールする前に、Java と Eclipse をインストールする手順は次のとおりです。 + <ol> + <li>開発マシン上で 64 ビット版を実行している場合は、<code>apt-get:</code> を使用して <code>ia32-libs</code> パッケージをインストールする必要があります: + <pre>apt-get install ia32-libs</pre> + </li> + <li>次に Java をインストールします: <pre>apt-get install sun-java6-bin</pre></li> + <li>Ubuntu パッケージ マネージャでは現在、Eclipse 3.3 バージョンのダウンロードを提供していないので、eclipse.org( <a + href="http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a> )から Eclipse をダウンロードすることをおすすめします。Eclipse の Java バージョンまたは RCP バージョンをおすすめします。</li> + <li>上記のセクションの手順どおりに SDK と ADT プラグインをインストールします。 </li> + </ol> + </li> +</ul> + +<h3>その他の Linux に関する注意事項</h3> + +<ul> + <li>開発用コンピュータに JDK が既にインストールされている場合は、<a href="requirements.html">システム要件</a>に記載されているバージョン要件を満たしていることを確認してください。特に、ディストリビューションによっては JDK 1.4 または Gnu Compiler for Java が組み込まれている場合があります。これらは Android の開発ではサポートされていないので、ご注意ください。</li> +</ul> + + + diff --git a/docs/html/intl/ja/sdk/1.5_r3/installing.jd b/docs/html/intl/ja/sdk/1.5_r3/installing.jd new file mode 100644 index 0000000..bcb1ffb --- /dev/null +++ b/docs/html/intl/ja/sdk/1.5_r3/installing.jd @@ -0,0 +1,212 @@ +page.title=Android SDK のインストール +@jd:body + + +<p>このページでは、Android SDK をインストールして、開発環境を設定する方法について説明します。SDK をまだダウンロードしていない場合は、[<a href="{@docRoot}sdk/{@sdkCurrent}/index.html">ダウンロード</a>] ページからダウンロードしてください。SDK をダウンロードした後に、このページの手順を行ってください。</p> + +<p>インストール中に問題が発生した場合は、このページの下部にある<a href="#installnotes">インストールに関する注意事項</a>を参照してください。</p> + +<h4 style="margin-top">アップグレードする場合</h4> +<p>SDK の以前のバージョンを使用してアプリケーションを既に開発している場合は、このページの代わりに、<a href="upgrading.html"><strong></strong>SDK のアップグレード</a></b> をご覧ください。 +</p> + + +<h2 id="setup">インストールの準備</h2> + +<p>インストールを始める前に、開発用マシンが<a href="requirements.html">システム要件</a>を満たしていることを確認してください。 +</p> + +<p>Eclipse 環境に Android Development Tools(ADT)プラグインを組み込んだ開発環境は、Android 向け開発の初心者に最適です。プラグインを利用する場合は、コンピュータに Eclipse の適切なバージョン(3.3 以降)がインストールされていることを確認してください。Eclipse のインストールが必要な場合は、次の場所からダウンロードできます: </p> + +<p style="margin-left:2em;"><a href= +"http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a></p> + +<p>Eclipse の Java バージョンまたは RCP バージョンをおすすめします。 </p> + +<h2 id="installingsdk">SDK のインストール</h2> + +<p>SDK のダウンロード後、お使いのマシンの適切な場所に .zip アーカイブを展開します。デフォルトでは、SDK ファイルは <code>android_sdk_<em><platform</em>>_<em><release></em></code> ディレクトリに展開されます。このディレクトリには、ドキュメントのローカル コピー(ブラウザで <code>documentation.html</code> を開くと参照できます)と、<code>tools/</code>、<code>add-ons/</code>、<code>platforms/</code> などのサブディレクトリが含まれます。<code>platforms/</code> のサブディレクトリ内には、プラットフォームの各バージョンに固有のコードのサンプルが含まれる <code>samples/</code> があります。</p> + +<p>システム上に展開した SDK ディレクトリの名前とパスをメモしておきましょう。Android プラグインの設定時や、SDK ツールの使用時にこの SDK ディレクトリを参照する必要があります。</p> + +<p>SDK のプライマリディレクトリである <code>tools</code> のパスを、システム PATH に追加することをおすすめします。<code>tools/</code> プライマリディレクトリは、SDK フォルダのルートにあります。<code>tools</code> をパスに追加すると、Android Debug Bridge(adb)やその他のコマンド ライン <a href="{@docRoot}guide/developing/tools/index.html">ツール</a>を、ツールの格納されたディレクトの完全なパスを指定せずに実行できるようになります。 </p> +<ul> + <li>Linux 上では <code>~/.bash_profile</code> ファイルまたは <code>~/.bashrc</code> ファイルを編集します。PATH 環境変数を設定している行を探し、その行に <code>tools/</code> ディレクトリへの完全なパスを追加します。PATH を設定する行が無い場合は、次の行を追加します:</li> + + <ul><code>export PATH=${PATH}:<em><your_sdk_dir></em>/tools</code></ul> + + <li>Mac 上では <code>.bash_profile</code> のホーム ディレクトリの内から同じファイルを検索し、Linux と同じように設定します。マシン上にまだ <code>.bash_profile</code> が無い場合は、ファイルを作成することができます。 </li> + + <li>Windows 上では、[マイ コンピュータ] を右クリックし、[プロパティ] を選択します。[詳細設定] タブで [環境変数] ボタンをクリックし、表示されたダイアログで [システム環境変数] の [Path] をダブルクリックします。その Path に <code>tools/</code> ディレクトリへの完全なパスを追加します。 </li> + </ul> + +<p>今後 SDK をアップグレードする際は、PATH の設定を更新することを忘れないでください。別のディレクトリに SDK を展開する場合は、その新しい場所を PATH に設定する必要があります。</p> + +<p>Eclipse IDE を開発環境として使用する場合、Android Development Tools プラグインをインストールして Eclipse を設定する方法について、次のセクションの情報を参照してください。Eclipse を使用しない場合は、別の IDE を使用して Android アプリケーションを開発してから、SDK に含まれているツールを使用してコンパイル、デバッグ、配布を行うことができます(この場合は、<a href="#next">次のステップ</a>に進んでください)。</p> + + +<h2 id="installingplugin">Eclipse 用 ADT プラグインのインストール</h2> + +<p>Android では、Android Development Tools(ADT)という Eclipse IDE 用のカスタム プラグインを提供しています。このプラグインは、Android アプリケーションの構築を可能にするために設計された、強力な統合環境です。プラグインによって Eclipse の機能が拡張され、新しい Android プロジェクトの設定、アプリケーションの UI の作成、Android Framework API に基づくコンポーネントの追加、Android SDK ツールを使用したアプリケーションのデバッグが可能になります。さらに、アプリケーションを配布するための署名済み(または未署名)の APK のエクスポートも簡単にできるようになります。</p> + +<p>一般的な Android 開発において、ADT を組み込んだ Eclipse の使用は強く推奨されており、Android 初心者に最も効率的な開発環境を提供します。(Eclipse 以外の IDE で作業する場合は、Eclipse や ADT をインストールする必要はありません。代わりに、SDK ツールを直接使用してアプリケーションを構築し、デバッグを行います)。</p> + +<p><a href="#setup">インストールの準備</a>で説明した手順に従って Eclipse をインストールした後は、次の手順に従って操作して ADT プラグインをダウンロードし、それぞれの Eclipse 環境にインストールします。 </p> + +<table style="font-size:100%"> +<tr><th>Eclipse 3.3(Europa)</th><th>Eclipse 3.4(Ganymede)</th></tr> +<tr> +<td width="45%"> +<!-- 3.3 steps --> +<ol> + <li>Eclipse を起動し、[<strong>ヘルプ</strong>] > [<strong>ソフトウェアの更新</strong>] > [<strong>検索とインストール</strong>] を選択します。 </li> + <li>表示されるダイアログで [<strong>インストールする新規フィーチャーを検索</strong>] を選択して [<strong>次へ</strong>] をクリックします。 </li> + <li>[<strong>新規リモートサイト</strong>] をクリックします。 </li> + <li>表示されるダイアログ ボックスで、リモート サイトの名前(例: 「Android Plugin」)を入力し、URL を入力します: + <pre>https://dl-ssl.google.com/android/eclipse/</pre> + <p>プラグインが入手できない場合は、URL の「https」の代わりに「http」を使用してみてください(セキュリティ上の理由からは、https をおすすめします)。</p> + <p>[<strong>OK</strong>] をクリックします。</p> </li> + <li>検索リストに新しいサイトが追加されており、チェックボックスがオンの状態で表示されるはずです。[<strong>終了</strong>] をクリックします。 </li> + <li>次の [検索結果] ダイアログボックスで、「Android Plugin」のチェックボックスをオンにします。これにより、そこに含まれているツール「Android DDMS」と「Android Development Tools」も自動的にオンになります。[<strong>次へ</strong>] をクリックします。</li> + <li>使用許諾契約を読み、同意して、[<strong>次へ</strong>] をクリックします。 </li> + <li>次のインストール ウィンドウで [<strong>終了</strong>] をクリックします。 </li> + <li>ADT プラグインはデジタル署名されていません。[<strong>すべてインストール</strong>] をクリックしてインストールを許可します。 </li> + <li>Eclipse を再起動します。 </li> +</ol> + +</td> +<td> + +<!-- 3.4 steps --> +<ol> + <li>Eclipse を起動し、[<strong>ヘルプ</strong>] > [<strong>ソフトウェアの更新</strong>] を選択します。</li> + <li>表示されるダイアログで [<strong>使用可能なソフトウェア</strong>] タブをクリックします。 </li> + <li>[<strong>サイトの追加</strong>] をクリックします。 </li> + <li>次の場所を入力します: + <pre>https://dl-ssl.google.com/android/eclipse/</pre> + <p>プラグインが入手できない場合は、場所の URL の「https」の代わりに「http」を使用してみてください(セキュリティ上の理由からは、https をおすすめします)。</p> + <p>[<strong>OK</strong>] をクリックします。</p></li> + <li>[使用可能なソフトウェア] のタブに戻ると、上記の URL によるプラグインとその中に含まれる「Developer Tools」が表示されているはずです。「Developer Tools」の横のチェックボックスをオンにし、[<strong>インストール</strong>] をクリックします。</li> + <li>次のインストール ウィンドウで、「Android DDMS」と「Android Development Tools」の両方のチェックボックスがオンになっていることを確認します。[<strong>次へ</strong>] をクリックします。 </li> + <li>使用許諾契約を読み、同意して、[<strong>終了</strong>] をクリックします。</li> + <li>Eclipse を再起動します。 </li> +</ol> + +</td> +</tr> +</table> + +<p>次に、Eclipse の設定を変更して、Android SDK ディレクトリを指すように変更します:</p> +<ol> + <li>[<strong>ウィンドウ</strong>] > [<strong>設定</strong>] を選択して、[設定] パネルを開きます(Mac 上では [<strong>Eclipse</strong>] > [<strong>設定</strong>])。</li> + <li>左側のパネルで [<strong>Android</strong>] を選択します。 </li> + <li>メイン パネルの [<em>SDK Location</em>] で [<strong>参照</strong>] をクリックし、ダウンロードした SDK ディレクトリを探します。 </li> + <li>[<strong>適用</strong>] をクリックして、[<strong>OK</strong>] をクリックします。</li> +</ol> + +<p>これで完了です。問題なく完了した場合は、Android アプリケーション開発を始める準備が整っています。開発を始めるヒントについては、<a href="#next">次のステップ</a>のセクションをご覧ください。 </p> + + +<h3 id="troubleshooting">ADT のインストールでのトラブルシューティング</h3> +<p> +上記の手順で、ADT プラグインのダウンロードに問題が生じた場合のヒントは次のとおりです: </p> + +<ul> + <li>Eclipse から ADT プラグインを含むリモート更新サイトが見つからない場合は、リモート サイトとして指定した URL の https を http に変更してみます。つまり、次のリモート サイトの URL を設定します: + <pre>http://dl-ssl.google.com/android/eclipse/</pre></li> + <li>ファイアウォール(社内のファイアウォールなど)の内部にいる場合、Eclipse でプロキシ情報が正しく設定されていることを確認してください。Eclipse 3.3/3.4 でプロキシ情報を設定するには、Eclipse のメイン メニューから [<strong>ウィンドウ</strong>](Mac 上では [<strong>Eclipse</strong>])> [<strong>環境設定</strong>] > [<strong>一般</strong>] > [<strong>ネットワーク接続</strong>] を選択します。</li> +</ul> +<p> +それでも Eclipse を使用して ADT プラグインをリモート更新サイトとしてダウンロードできない場合は、ADT zip ファイルをローカル マシン上にダウンロードして、手動でインストールすることができます: +</p> +<ol> + <li><a href="{@docRoot}sdk/adt_download.html">ADT zip ファイルをダウンロードします</a>(展開はしないでください)。</li> + <li>デフォルトのインストール手順(上記)のステップ 1 と 2 のとおりに操作します。</li> + <li>Eclipse 3.3 では [<strong>新規アーカイブ・サイト</strong>] をクリックします。<br/>Eclipse 3.4 では [<strong>サイトの追加</strong>] をクリックして、[<strong>アーカイブ</strong>] をクリックします。</li> + <li>ダウンロードした zip ファイルを参照して選択してください。</li> + <li>上記のステップ 5 から残りの手順に従って操作します。</li> +</ol> +<p>zip ファイルからインストールしたプラグインを後でアップデートする場合は、デフォルトのアップデート手順の代わりに、もう一度この手順どおりに操作する必要があります。</p> + +<h4>その他のインストール エラー</h4> + +<p>オプションの Eclipse コンポーネント(WST など)を必要とする ADT の機能があります。ADT のインストール時にエラーが発生した場合、お使いの Eclipse インストール環境にこうしたコンポーネントが含まれていない可能性があります。必要なコンポーネントを Eclipse インストール環境に簡単に追加する方法について詳しくは、トラブルシューティング トピック <a href="{@docRoot}guide/appendix/faq/troubleshooting.html#installeclipsecomponents">ADT インストールエラー: "requires plug-in org.eclipse.wst.sse.ui"</a> をご覧ください。</p> + +<h4>Linux ユーザーの場合</h4> +<p>Eclipse 用 ADT プラグインのインストール時に、次のエラーが発生する場合があります。 +<pre> +An error occurred during provisioning. +Cannot connect to keystore. +JKS</pre> +<p> +この場合、お使いの開発用マシンに適切な Java VM が搭載されていません。Sun Java 6 をインストールするとこの問題が解決し、ADT プラグインを再インストールすることができます。</p> + + +<h2 id="next">次のステップ</h2> +<p>インストールを完了すると、アプリケーションの開発を始める準備が整います。開発を始める方法をいくつか紹介します: </p> + +<p><strong>Android の詳細の学習</strong></p> +<ul> + <li><a href="{@docRoot}guide/index.html">デベロッパー ガイド</a>と、ガイドに説明されている情報の種類を参照します。</li> + <li>Android をプラットフォームとして紹介している <a + href="{@docRoot}guide/basics/what-is-android.html">Android とは</a>を読みます。</li> + <li><a href="{@docRoot}guide/topics/fundamentals.html">アプリケーションの基礎</a>を参照して、Android フレームワークとそこでのアプリケーションの実行方法について学びます。</li> + <li>[<a + href="{@docRoot}reference/packages.html">リファレンス</a>] タブの Android Framework API の仕様を参照します。</li> +</ul> + +<p><strong>SDK の探索</strong></p> +<ul> + <li>利用可能な<a + href="{@docRoot}guide/developing/tools/index.html">開発ツール</a>の概要を把握します。</li> + <li><a + href="{@docRoot}guide/developing/eclipse-adt.html">Eclipse/ADT</a> または<a href="{@docRoot}guide/developing/other-ide.html">別の IDE</a> での開発方法を参照します。 + </li> +</ul> + +<p><strong>サンプル コードの参照</strong></p> +<ul> + <li><a href="{@docRoot}guide/tutorials/hello-world.html">Hello World アプリケーション</a>を構築します(特に Eclipse ユーザーにおすすめです)。</li> + <li><a href="{@docRoot}guide/tutorials/notepad/index.html">Notepad チュートリアル</a>に沿って Android アプリケーションを完全に構築します。 </li> + <li><code><em><sdk></em>/platforms/<em><platfrom></em>/samples</code> に収められている他のサンプル アプリケーションのいずれかを新しいプロジェクトとして作成し、自分の開発環境でコンパイルし、実行します。</li> +</ul> + +<p><strong>Android デベロッパー グループへのアクセス</strong></p> +<ul> + <li>[<a + href="{@docRoot}community/index.html">コミュニティ</a>] タブで、Android デベロッパー グループの一覧を参照します。特に <a href="http://groups.google.com/group/android-developers">Android Developers</a> グループは、Android デベロッパー コミュニティがどういうものかを知るのに参考になります。</li> +</ul> + + +<h2 id="installnotes">インストールに関する注意事項</h2> + +<h3>Ubuntu Linux に関する注意事項</h3> + +<ul> + <li>開発マシン上で Java をインストールして設定する方法については、次のリソースが参考になります: + <ul> + <li><a href="https://help.ubuntu.com/community/Java">https://help.ubuntu.com/community/Java </a></li> + <li><a href="https://help.ubuntu.com/community/Java">https://help.ubuntu.com/community/JavaInstallation</a></li> + </ul> + </li> + <li>Android SDK と ADT プラグインをインストールする前に、Java と Eclipse をインストールする手順は次のとおりです。 + <ol> + <li>開発マシン上で 64 ビット版を実行している場合は、<code>apt-get:</code> を使用して <code>ia32-libs</code> パッケージをインストールする必要があります: + <pre>apt-get install ia32-libs</pre> + </li> + <li>次に Java をインストールします: <pre>apt-get install sun-java6-bin</pre></li> + <li>Ubuntu パッケージ マネージャでは現在、Eclipse 3.3 バージョンのダウンロードを提供していないので、eclipse.org( <a + href="http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a> )から Eclipse をダウンロードすることをおすすめします。Eclipse の Java バージョンまたは RCP バージョンをおすすめします。</li> + <li>上記のセクションの手順どおりに SDK と ADT プラグインをインストールします。 </li> + </ol> + </li> +</ul> + +<h3>その他の Linux に関する注意事項</h3> + +<ul> + <li>開発用コンピュータに JDK が既にインストールされている場合は、<a href="requirements.html">システム要件</a>に記載されているバージョン要件を満たしていることを確認してください。特に、ディストリビューションによっては JDK 1.4 または Gnu Compiler for Java が組み込まれている場合があります。これらは Android の開発ではサポートされていないので、ご注意ください。</li> +</ul> + + + diff --git a/docs/html/sdk/1.5_r2/installing.jd b/docs/html/sdk/1.5_r2/installing.jd index 69b2c1b..1530dc5 100644 --- a/docs/html/sdk/1.5_r2/installing.jd +++ b/docs/html/sdk/1.5_r2/installing.jd @@ -9,7 +9,7 @@ page.title=Installing the Android SDK <p>This page describes how to install the Android SDK and set up your development environment. If you haven't downloaded the SDK, you can do so from the -<a href="{@docRoot}sdk/1.5_r2/index.html">Download</a> page. Once you've downloaded +<a href="index.html">Download</a> page. Once you've downloaded the SDK, return here.</p> <p>If you encounter any problems during installation, see the @@ -19,7 +19,7 @@ this page.</p> <h4 style="margin-top">Upgrading?</h4> <p>If you have already developed applications using an earlier version of the SDK, please read -<a href="{@docRoot}sdk/1.5_r2/upgrading.html"><strong>Upgrading the +<a href="upgrading.html"><strong>Upgrading the SDK</strong></a></b>, instead. </p> @@ -27,7 +27,7 @@ SDK</strong></a></b>, instead. <h2 id="setup">Preparing for Installation</h2> <p>Before you begin, take a moment to confirm that your development machine meets the -<a href="{@docRoot}sdk/1.5_r2/requirements.html">System Requirements</a>. +<a href="requirements.html">System Requirements</a>. </p> <p>If you will be developing on Eclipse with the Android Development @@ -323,7 +323,7 @@ begin developing applications. Here are a few ways you can get started: </p> <ul> <li>If JDK is already installed on your development computer, please take a moment to make sure that it meets the version requirements listed - in the <a href="{@docRoot}sdk/1.1_r1/requirements.html">System Requirements</a>. + in the <a href="{@docRoot}sdk/{@sdkCurrent}/requirements.html">System Requirements</a>. In particular, note that some Linux distributions may include JDK 1.4 or Gnu Compiler for Java, both of which are not supported for Android development.</li> </ul> diff --git a/docs/html/sdk/1.5_r3/index.jd b/docs/html/sdk/1.5_r3/index.jd new file mode 100644 index 0000000..3364f93 --- /dev/null +++ b/docs/html/sdk/1.5_r3/index.jd @@ -0,0 +1,87 @@ +sdk.version=1.5 +sdk.rel.id=3 +sdk.date=July 2009 + +sdk.win_download=android-sdk-windows-1.5_r3.zip +sdk.win_bytes=191477853 +sdk.win_checksum=1725fd6963ce69102ba7192568dfc711 + +sdk.mac_download=android-sdk-mac_x86-1.5_r3.zip +sdk.mac_bytes=183024673 +sdk.mac_checksum=b1bafdaefdcec89a14b604b504e7daec + +sdk.linux_download=android-sdk-linux_x86-1.5_r3.zip +sdk.linux_bytes=178117561 +sdk.linux_checksum=350d0211678ced38da926b8c9ffa4fac + +page.title=Android 1.5 SDK, Release 3 +@jd:body + +<p>For more information on this SDK release, read the +<a href="{@docRoot}sdk/RELEASENOTES.html#1.5_r3">Release Notes</a>.</p> + +<h2>SDK Contents</h2> + +<h4>Development tools</h4> + +<p>The SDK includes a full set of tools for developing and debugging application code and designing an application UI. You can read about the tools in the +<a href="{@docRoot}guide/developing/tools/index.html">Dev Guide</a> and access them in the <code><sdk>/tools/</code> directory. + +<p>The tools package in this SDK includes updates from those provided in the previous SDK. The tools also require a different project structure. To use the new tools, you need to migrate your applications to the new development environment. For more information about how to migrate, see <a href="upgrading.html">Upgrading the SDK</a>. + +<p>For more information about the new tools features, see the <a href="{@docRoot}sdk/RELEASENOTES.html">SDK Release Notes</a>. + +<h4 id="system_images">Android Platforms</h4> + +<p>This SDK includes multiple Android platform versions that you use to develop applications. For each version, both a fully compliant Android library and system image are provided. The table below lists the platform versions included in this SDK. For more information about a platform version — features, applications included, localizations, API changes, and so on — see its Version Notes. </p> + +<table style="margin-right:1em;" width="80%"> +<tr> +<th><nobr>Platform</nobr></th><th><nobr>API Level</nobr></th><th>Notes</th><th>Description</th> +</tr> + +<tr> +<td width="5%"><nobr>Android 1.5</nobr></td> +<td width="5%">3</td> +<td width="5%"><nobr><a href="{@docRoot}sdk/android-1.5.html">Version Notes</a></nobr></td> +<td>Includes a standard Android 1.5 library and system image with a set of development applications. Does not include any external libraries (such as the Maps external library).</td> +</tr> +<tr> +<td width="5%"><nobr>Android 1.1</nobr></td> +<td width="5%">2</td> +<td width="5%"><nobr><a href="{@docRoot}sdk/android-1.1.html">Version Notes</a></nobr></td> +<td>Includes a compliant Android 1.1 library and system image with a set of development applications. Also includes the Maps external library (due to legacy build system issues).</td> +</tr> +</table> + +<h4 id="system_images">SDK Add-Ons</h4> + +<p>An SDK add-on provides a development environment for an Android external library or a customized (but fully compliant) Android system image. This SDK includes the SDK add-on listed below. The Android system API Level required by the add-on is noted.</p> + +<table style="margin-right:1em;" width="80%"> +<tr> +<th><nobr>Add-On</nobr></th><th><nobr>API Level</nobr></th><th>Notes</th><th>Description</th> +</tr> +<tr> +<td width="5%"><nobr>Google APIs</nobr></td> +<td width="5%">3</td> +<td width="5%"> </td> +<td>Includes the com.google.android.maps external library, a compliant +system image, a {@link android.location.Geocoder Geocoder} +backend service implementation, documentation, and sample code. </td> +</tr> +</table> + +<h4>Sample Code and Applications</h4> + +<p>You can look at a variety of tutorials and samples in the <a href="{@docRoot}guide/samples/index.html">Dev Guide</a> and access the sample code itself +in the <code><sdk>/platforms/android-1.5/samples/</code> directory of the SDK package. Note the new location — the SDK now includes multiple platform versions that you can develop against and each has its own sample code directory. </p> + +<h4>Documentation</h4> + +<p>The SDK package includes a full set of local documentation. To view it, open the <code><sdk>/documentation.html</code> file in a web browser. If you are developing in an IDE such as Eclipse, you can also view the reference documentation directly in the IDE. </p> + +<p>The most current documentation is always available on the Android Developers site:</p> + +<p style="margin-left:2em;"><a href="http://developer.android.com/index.html">http://developer.android.com/</a></p> + diff --git a/docs/html/sdk/1.5_r3/installing.jd b/docs/html/sdk/1.5_r3/installing.jd new file mode 100644 index 0000000..8c3e8ee --- /dev/null +++ b/docs/html/sdk/1.5_r3/installing.jd @@ -0,0 +1,332 @@ +sdk.version=1.5 +sdk.rel.id=3 +sdk.date=April 2009 + +page.title=Installing the Android SDK +@jd:body + + +<p>This page describes how to install the Android SDK and set up your +development environment. If you haven't downloaded the SDK, you can +do so from the +<a href="index.html">Download</a> page. Once you've downloaded +the SDK, return here.</p> + +<p>If you encounter any problems during installation, see the +<a href="#installnotes">Installation Notes</a> at the bottom of +this page.</p> + +<h4 style="margin-top">Upgrading?</h4> +<p>If you have already developed applications using an earlier version +of the SDK, please read +<a href="upgrading.html"><strong>Upgrading the +SDK</strong></a></b>, instead. +</p> + + +<h2 id="setup">Preparing for Installation</h2> + +<p>Before you begin, take a moment to confirm that your development machine meets the +<a href="requirements.html">System Requirements</a>. +</p> + +<p>If you will be developing on Eclipse with the Android Development +Tools (ADT) Plugin — the recommended path if you are new to +Android — make sure that you have a suitable version of Eclipse +installed on your computer (3.3 or newer). If you need to install Eclipse, you can +download it from this location: </p> + +<p style="margin-left:2em;"><a href= +"http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a +></p> + +<p>A Java or RCP version of Eclipse is recommended. </p> + +<h2 id="installingsdk">Installing the SDK</h2> + +<p>After downloading the SDK, unpack the .zip archive to a suitable location on your machine. +By default, the SDK files are unpacked into a directory named +<code>android_sdk_<em><platform</em>>_<em><release></em></code>. +The directory contains a local copy of the documentation (accessible by opening +<code>documentation.html</code> in your browser) and the subdirectories +<code>tools/</code>, <code>add-ons/</code>, <code>platforms/</code>, and others. Inside +each subdirectory of <code>platforms/</code> you'll find <code>samples/</code>, which includes +code samples that are specific to each version of the platform.</p> + +<p>Make a note of the name and location of the unpacked SDK directory on your system — you +will need to refer to the SDK directory later, when setting up the Android plugin or when +using the SDK tools.</p> + +<p>Optionally, you may want to add the location of the SDK's primary <code>tools</code> directory +to your system PATH. The primary <code>tools/</code> directory is located at the root of the +SDK folder. Adding <code>tools</code> to your path lets you run Android Debug Bridge (adb) and +the other command line <a href="{@docRoot}guide/developing/tools/index.html">tools</a> without +needing to supply the full path to the tools directory. </p> +<ul> + <li>On Linux, edit your <code>~/.bash_profile</code> or <code>~/.bashrc</code> file. Look + for a line that sets the PATH environment variable and add the + full path to the <code>tools/</code> directory to it. If you don't + see a line setting the path, you can add one:</li> + + <ul><code>export PATH=${PATH}:<em><your_sdk_dir></em>/tools</code></ul> + + <li>On a Mac, look in your home directory for <code>.bash_profile</code> and + proceed as for Linux. You can create the <code>.bash_profile</code> if + you haven't already set one up on your machine. </li> + + <li>On Windows, right-click on My Computer, and select Properties. + Under the Advanced tab, hit the Environment Variables button, and in the + dialog that comes up, double-click on Path (under System Variables). Add the full path to the + <code>tools/</code> directory to the path. </li> + </ul> + +<p>Note that, if you update your SDK in the future, you +should remember to update your PATH settings to point to the new location, if different.</p> + +<p>If you will be using the Eclipse IDE as your development environment, +the next section describes how to install the Android Development Tools plugin and set up Eclipse. +If you choose not to use Eclipse, you can +develop Android applications in an IDE of your choice and then compile, debug and deploy using +the tools included in the SDK (skip to <a href="#next">Next Steps</a>).</p> + + +<h2 id="installingplugin">Installing the ADT Plugin for Eclipse</h2> + +<p>Android offers a custom plugin for the Eclipse IDE, called Android +Development Tools (ADT), that is designed to give you a powerful, +integrated environment in which to build Android applications. It +extends the capabilites of Eclipse to let you quickly set up new Android +projects, create an application UI, add components based on the Android +Framework API, debug your applications using the Android SDK tools, and even export +signed (or unsigned) APKs in order to distribute your application.</p> + +<p>In general, using Eclipse with ADT is a highly recommended +approach to Android development and is the fastest way to get started. +(If you prefer to work in an IDE other than Eclipse, +you do not need to install Eclipse or ADT, instead, you can directly +use the SDK tools to build and debug your application.)</p> + +<p>Once you have Eclipse installed, as described in <a href="#setup">Preparing for +Installation</a>, follow the steps below to +download the ADT plugin and install it in your respective Eclipse +environment. </p> + +<table style="font-size:100%"> +<tr><th>Eclipse 3.3 (Europa)</th><th>Eclipse 3.4 (Ganymede)</th></tr> +<tr> +<td width="45%"> +<!-- 3.3 steps --> +<ol> + <li>Start Eclipse, then select <strong>Help</strong> > <strong>Software Updates</strong> +> <strong>Find and Install...</strong>. </li> + <li>In the dialog that appears, select <strong>Search for new features to install</strong> +and click <strong>Next</strong>. </li> + <li>Click <strong>New Remote Site</strong>. </li> + <li>In the resulting dialog box, enter a name for the remote site (e.g. "Android Plugin") and + enter the URL: + <pre>https://dl-ssl.google.com/android/eclipse/</pre> + <p>If you have trouble aqcuiring the plugin, try using "http" in the URL, + instead of "https" (https is preferred for security reasons).</p> + <p>Click <strong>OK</strong>.</p> </li> + <li>You should now see the new site added to the search list (and checked). + Click <strong>Finish</strong>. </li> + <li>In the subsequent Search Results dialog box, select the checkbox for the + "Android Plugin". + This will select the nested tools: "Android DDMS" and "Android Development Tools". + Click <strong>Next</strong>.</li> + <li>Read and accept the license agreement, then click <strong>Next</strong>. </li> + <li>On the following Installation window, click <strong>Finish</strong>. </li> + <li>The ADT plugin is not digitally signed. Accept the installation anyway + by clicking <strong>Install All</strong>. </li> + <li>Restart Eclipse. </li> +</ol> + +</td> +<td> + +<!-- 3.4 steps --> +<ol> + <li>Start Eclipse, then select <strong>Help</strong> > <strong>Software Updates...</strong>.</li> + <li>In the dialog that appears, click the <strong>Available Software</strong> tab. </li> + <li>Click <strong>Add Site...</strong> </li> + <li>Enter the Location: + <pre>https://dl-ssl.google.com/android/eclipse/</pre> + <p>If you have trouble aqcuiring the plugin, try using "http" in the Location URL, + instead of "https" (https is preferred for security reasons).</p> + <p>Click <strong>OK</strong>.</p></li> + <li>Back in the Available Software view, you should see the plugin listed by the URL, + with "Developer Tools" nested within it. Select the checkbox next to + Developer Tools and click <strong>Install...</strong></li> + <li>On the subsequent Install window, "Android DDMS" and "Android Development Tools" + should both be checked. Click <strong>Next</strong>. </li> + <li>Read and accept the license agreement, then click <strong>Finish</strong>.</li> + <li>Restart Eclipse. </li> +</ol> + +</td> +</tr> +</table> + +<p>Now modify your Eclipse preferences to point to the Android SDK directory:</p> +<ol> + <li>Select <strong>Window</strong> > <strong>Preferences...</strong> to open the Preferences + panel (Mac: <strong>Eclipse</strong> > <strong>Preferences</strong>).</li> + <li>Select <strong>Android</strong> from the left panel. </li> + <li>For the <em>SDK Location</em> in the main panel, click <strong>Browse...</strong> and +locate your downloaded SDK directory. </li> + <li>Click <strong>Apply</strong>, then <strong>OK</strong>.</li> +</ol> + +<p>Done! If you haven't encountered any problems, then you're ready to +begin developing Android applications. See the +<a href="#next">Next Steps</a> section for suggestions on how to start. </p> + + +<h3 id="troubleshooting">Troubleshooting ADT Installation</h3> +<p> +If you are having trouble downloading the ADT plugin after following the steps above, here are +some suggestions: </p> + +<ul> + <li>If Eclipse can not find the remote update site containing the ADT plugin, try changing + the remote site URL to use http, rather than https. That is, set the Location for the remote site to: + <pre>http://dl-ssl.google.com/android/eclipse/</pre></li> + <li>If you are behind a firewall (such as a corporate firewall), make + sure that you have properly configured your proxy settings in Eclipse. + In Eclipse 3.3/3.4, you can configure proxy information from the main + Eclipse menu in <strong>Window</strong> (on Mac, <strong>Eclipse</strong>) > + <strong>Preferences</strong> > <strong>General</strong> > + <strong>Network Connections</strong>.</li> +</ul> +<p> +If you are still unable to use Eclipse to download the ADT plugin as a remote update site, you +can download the ADT zip file to your local machine and manually install the it: +</p> +<ol> + <li><a href="{@docRoot}sdk/adt_download.html">Download the ADT zip file</a> (do not unpack it).</li> + <li>Follow steps 1 and 2 in the default install instructions (above).</li> + <li>In Eclipse 3.3, click <strong>New Archive Site...</strong>. <br/> + In Eclipse 3.4, click <strong>Add Site...</strong>, then <strong>Archive...</strong></li> + <li>Browse and select the downloaded zip file.</li> + <li>Follow the remaining procedures, above, starting from steps 5.</li> +</ol> +<p>To update your plugin once you've installed using the zip file, you will have to +follow these steps again instead of the default update instructions.</p> + +<h4>Other install errors</h4> + +<p>Note that there are features of ADT that require some optional +Eclipse components (for example, WST). If you encounter an error when +installing ADT, your Eclipse installion might not include these components. +For information about how to quickly add the necessary components to your +Eclipse installation, see the troubleshooting topic +<a href="{@docRoot}guide/appendix/faq/troubleshooting.html#installeclipsecomponents">ADT +Installation Error: "requires plug-in org.eclipse.wst.sse.ui"</a>.</p> + +<h4>For Linux users</h4> +<p>If you encounter this error when installing the ADT Plugin for Eclipse: +<pre> +An error occurred during provisioning. +Cannot connect to keystore. +JKS</pre> +<p> +...then your development machine lacks a suitable Java VM. Installing Sun +Java 6 will resolve this issue and you can then reinstall the ADT +Plugin.</p> + + +<h2 id="next">Next Steps</h2> +<p>Once you have completed installation, you are ready to +begin developing applications. Here are a few ways you can get started: </p> + +<p><strong>Learn about Android</strong></p> +<ul> + <li>Take a look at the <a href="{@docRoot}guide/index.html">Dev + Guide</a> and the types of information it provides</li> + <li>Read an introduction to Android as a platform in <a + href="{@docRoot}guide/basics/what-is-android.html">What is + Android?</a></li> + <li>Learn about the Android framework and how applications run on it in + <a href="{@docRoot}guide/topics/fundamentals.html">Application + Fundamentals</a></li> + <li>Take a look at the Android framework API specification in the <a + href="{@docRoot}reference/packages.html">Reference</a> tab</li> +</ul> + +<p><strong>Explore the SDK</strong></p> +<ul> + <li>Get an overview of the <a + href="{@docRoot}guide/developing/tools/index.html">development + tools</a> that are available to you</li> + <li>Read how to develop <a + href="{@docRoot}guide/developing/eclipse-adt.html">in Eclipse/ADT</a> or + <a href="{@docRoot}guide/developing/other-ide.html">in other IDEs</a> + </li> +</ul> + +<p><strong>Explore some code</strong></p> +<ul> + <li>Set up a <a href="{@docRoot}guide/tutorials/hello-world.html">Hello + World application</a> (highly recommended, especially for Eclipse users)</li> + <li>Follow the <a href="{@docRoot}guide/tutorials/notepad/index.html"> + Notepad Tutorial</a> to build a full Android application </li> + <li>Create a new project for one of the other sample applications + included in <code><em><sdk></em>/platforms/<em><platfrom></em>/samples</code>, + then compile and run it in your development environment</li> +</ul> + +<p><strong>Visit the Android developer groups</strong></p> +<ul> + <li>Take a look at the <a + href="{@docRoot}community/index.html">Community</a> tab to see a list of + Android developers groups. In particular, you might want to look at the + <a href="http://groups.google.com/group/android-developers">Android + Developers</a> group to get a sense for what the Android developer + community is like.</li> +</ul> + + +<h2 id="installnotes">Installation Notes</h2> + +<h3>Ubuntu Linux Notes</h3> + +<ul> + <li>If you need help installing and configuring Java on your + development machine, you might find these resources helpful: + <ul> + <li><a href="https://help.ubuntu.com/community/Java">https://help.ubuntu.com/community/Java </a></li> + <li><a href="https://help.ubuntu.com/community/Java">https://help.ubuntu.com/community/JavaInstallation</a></li> + </ul> + </li> + <li>Here are the steps to install Java and Eclipse, prior to installing + the Android SDK and ADT Plugin. + <ol> + <li>If you are running a 64-bit distribution on your development + machine, you need to install the <code>ia32-libs</code> package using + <code>apt-get:</code>: + <pre>apt-get install ia32-libs</pre> + </li> + <li>Next, install Java: <pre>apt-get install sun-java6-bin</pre></li> + <li>The Ubuntu package manager does not currently offer an Eclipse 3.3 + version for download, so we recommend that you download Eclipse from + eclipse.org (<a + href="http://www.eclipse.org/downloads/">http://www.eclipse.org/ + downloads/</a>). A Java or RCP version of Eclipse is recommended.</li> + <li>Follow the steps given in previous sections to install the SDK + and the ADT plugin. </li> + </ol> + </li> +</ul> + +<h3>Other Linux Notes</h3> + +<ul> + <li>If JDK is already installed on your development computer, please + take a moment to make sure that it meets the version requirements listed + in the <a href="{@docRoot}sdk/{@sdkCurrent}/requirements.html">System Requirements</a>. + In particular, note that some Linux distributions may include JDK 1.4 or Gnu + Compiler for Java, both of which are not supported for Android development.</li> +</ul> + + + diff --git a/docs/html/sdk/1.5_r3/requirements.jd b/docs/html/sdk/1.5_r3/requirements.jd new file mode 100644 index 0000000..4ed38a7 --- /dev/null +++ b/docs/html/sdk/1.5_r3/requirements.jd @@ -0,0 +1,39 @@ +page.title=System Requirements +@jd:body + +<p>The sections below describe the system and software requirements for developing Android applications using the Android SDK tools included in Android <?cs var:sdk.version ?> SDK, Release <?cs var:sdk.rel.id ?>. </p> + +<h3>Supported Operating Systems</h3> +<ul> + <li>Windows XP (32-bit) or Vista (32- or 64-bit)</li> + <li>Mac OS X 10.4.8 or later (x86 only)</li> + <li>Linux (tested on Linux Ubuntu Dapper Drake)</li> +</ul> + +<h3>Supported Development Environments</h3> +<ul> + <li>Eclipse IDE + <ul> + <li><a href="http://www.eclipse.org/downloads/">Eclipse</a> 3.3 (Europa), 3.4 (Ganymede) + <ul> + <li>Recommended Eclipse IDE packages: Eclipse IDE for Java EE Developers, Eclipse IDE for Java Developers, Eclipse for RCP/Plug-in Developers</li> + <li>Eclipse <a href="http://www.eclipse.org/jdt">JDT</a> plugin (included in most Eclipse IDE packages) </li> + <li>Eclipse Classic IDE package is not supported.</li> + </ul> + </li> + <li><a href="http://java.sun.com/javase/downloads/index.jsp">JDK 5 or JDK 6</a> (JRE alone is not sufficient)</li> + <li><a href="installing.html#installingplugin">Android Development Tools plugin</a> (optional)</li> + <li><strong>Not</strong> compatible with Gnu Compiler for Java (gcj)</li> + </ul> + </li> + <li>Other development environments or IDEs + <ul> + <li><a href="http://java.sun.com/javase/downloads/index.jsp">JDK 5 or JDK 6</a> (JRE alone is not sufficient)</li> + <li><a href="http://ant.apache.org/">Apache Ant</a> 1.6.5 or later for Linux and Mac, 1.7 or later for Windows</li> + <li><strong>Not</strong> compatible with Gnu Compiler for Java (gcj)</li> + </ul> + </li> +</ul> + +<p class="note"><strong>Note:</strong> If JDK is already installed on your development computer, please take a moment to make sure that it meets the version requirements listed above. In +particular, note that some Linux distributions may include JDK 1.4 or Gnu Compiler for Java, both of which are not supported for Android development. </p>
\ No newline at end of file diff --git a/docs/html/sdk/1.5_r3/upgrading.jd b/docs/html/sdk/1.5_r3/upgrading.jd new file mode 100644 index 0000000..a0a62a2 --- /dev/null +++ b/docs/html/sdk/1.5_r3/upgrading.jd @@ -0,0 +1,395 @@ +page.title=Upgrading the SDK +sdk.version=1.5_r3 +@jd:body + + +<div id="qv-wrapper"> +<div id="qv"> + + <h2>Upgrading the SDK</h2> + <ul> + <li>The Android 1.5 SDK uses a new project structure and a new ADT plugin (ADT 0.9). </li> + <li>To move existing projects into the SDK, you must make some minor changes in your + development environment.</li> + <li>The new ADT plugin (ADT 0.9) <em>is not compatible</em> with projects created in previous SDKs.</li> + <li>You need to uninstall your existing ADT plugin, before installing ADT 0.9.</li> + </ul> + + <h2>In this document</h2> + <ol> + <li><a href="#Install">Install the SDK</a></li> + <li><a href="#UpdateAdt">Update Your Eclipse ADT Plugin</a></li> + <li><a href="#UpdateYourProjects">Update Your Projects</a> + <ol> + <li><a href="#EclipseUsers">Eclipse Users</a></li> + <li><a href="#AntUsers">Ant Users</a></li> + </ol> + </li> + <li><a href="#MigrateYourApplications">Migrate Your Applications</a> + <ol><li><a href="#FutureProofYourApps">Future-proof your apps</a></li></ol> + </li> + </ol> + + <h2>Migrating references</h2> + <ol> + <li><a href="{@docRoot}sdk/api_diff/3/changes.html">Android 1.5 API Differences</a></li> + <li><a +href="http://android-developers.blogspot.com/2009/04/future-proofing-your-apps.html">Future-Proofing +Your Apps »</a></li> + <li><a +href="http://android-developers.blogspot.com/2009/04/ui-framework-changes-in-android-15.html">UI +framework changes in Android 1.5 »</a></li> + </ol> + +</div> +</div> + +<p>This document describes how to move your development environment and existing +Android applications from an Android 1.0 or 1.1 SDK to the Android 1.5 SDK. +If you are migrating applications from an SDK older than 1.0, please also read the upgrading +document available in the Android 1.0 SDK package.</p> + +<p>There are several compelling reasons to upgrade, such as new SDK tools +that make developing more efficient and new APIs that allow you to expand the feature-set +of your applications. However, even if you or your applications don't require these enhancements, +it's important that you upgrade to ensure that your applications run properly on the +Android 1.5 platform.</p> + +<p>The Android 1.5 platform will soon be deployable to devices around the world. +If you have already released Android applications to the public, you should +test the forward-compatibility of your applications on the latest version of the platform +as soon as possible. It's unlikely that you'll encounter breakage in your applications, but +in the interest of maintaining the best user experience, you should take no risks. +So, please install the new Android SDK and test your applications on Android 1.5.</p> + +<p>For more information on new SDK features and system changes, +see the <a href="{@docRoot}sdk/android-1.5.html">Android 1.5 Version Notes</a>.</p> + + +<h2 id="Install">Install the SDK</h2> + +<p>If you haven't yet downloaded the SDK, <a href="index.html">download from here</a> +and unpack it into a safe location.</p> + +<p><strong>Before you begin:</strong> +If you had previously setup your PATH variable to point to the SDK tools directory, +then you need to update it to point to the new SDK. For example, for a +<code>.bashrc</code> or <code>.bash_profile</code> file:</p> +<pre>export PATH=$PATH:<em><your_sdk_dir></em>/tools</pre> + +<p>If you don't use Eclipse for development, +skip to <a href="#updateYourProjects">Update Your Projects</a>.</p> + + +<h2 id="UpdateAdt">Update Your Eclipse ADT Plugin</h2> + +<p><em>If you installed ADT-0.9_pre with the early look 1.5 SDK, there have been +additional changes, so please continue with this guide and update to the final ADT 0.9.</em></p> + +<p>A new ADT plugin (version 0.9) is required for the Android 1.5 SDK. +Because the component structure has been changed since Android 1.1, +the Android 1.5 SDK does not work with ADT 0.8 (or older) and previously installed SDKs will not +work with ADT 0.9. However, the Android 1.5 SDK includes an Android 1.1 SDK image that you +can build against while using ADT 0.9. </p> + +<p class="note">For information about using different system images (such as Android 1.1) +while running this SDK, see Developing <a href="{@docRoot}guide/developing/eclipse-adt.html"> +In Eclipse, with ADT</a> or <a href="{@docRoot}guide/developing/other-ide.html">In +Other IDEs</a>, as appropriate for your development environment.</p> + +<p>In order to upgrade your Eclipse IDE to use the new 0.9 ADT, follow the steps below +for your respective version of Eclipse.</p> + +<h3 id="uninstallAdt">Uninstall your previous ADT plugin</h3> + +<p>You must uninstall your existing ADT plugin (0.8 or older). If you do not uninstall it, +you will get a conflict with the Android Editors when installing the new ADT. +(If you have already installed ADT-0.9_pre with the early look 1.5 SDK, you can skip this +uninstall procedure and continue to <a href="#installAdt">Install the 0.9 ADT plugin</a>).</p> + +<table style="font-size:100%"> +<tr><th>Eclipse 3.3 (Europa)</th><th>Eclipse 3.4 (Ganymede)</th></tr> +<tr> +<td width="50%"> +<!-- 3.3 steps --> +<ol> + <li>Select <strong>Help</strong> > <strong>Software Updates</strong> > + <strong>Manage Configuration</strong>. </li> + <li>Expand the list in the left panel to reveal the installed tools.</li> + <li>Right-click "Android Editors" and click <strong>Uninstall</strong>. Click <strong>OK</strong> + to confirm.</li> + <li>Restart Eclipse. + <p>(Do not uninstall "Android Development Tools".)</p></li> +</ol> +</td> +<td> +<!-- 3.4 steps --> +<ol> + <li>Select <strong>Help</strong> > <strong>Software Updates</strong>.</li> + <li>Select the <strong>Installed Software</strong> tab.</li> + <li>Select "Android Editors". Click <strong>Uninstall</strong>.</li> + <li>In the next window, be sure "Android Editors" is checked, then click <strong>Finish</strong> + to uninstall.</li> + <li>Restart Eclipse. + <p>(Do not uninstall "Android Development Tools".)</p></li> +</ol> +</td> +</tr> +</table> + + +<h3 id="installAdt">Install the 0.9 ADT plugin</h3> + +<p>Only install the new plugin once you've completed the procedure to +<a href="#uninstallAdt">Uninstall your previous ADT plugin</a>.</p> + +<table style="font-size:100%"> +<tr><th>Eclipse 3.3 (Europa)</th><th>Eclipse 3.4 (Ganymede)</th></tr> +<tr> +<td width="50%"> +<!-- 3.3 steps --> +<ol> + <li>Select <strong>Help</strong> > <strong>Software Updates</strong> > + <strong>Find and Install</strong>. </li> + <li>Select <strong>Search for new features to install</strong>.</li> + <li>Select the Android plugin entry by checking the box next to it, + then click <strong>Finish</strong>. + <p>(Your original entry for the plugin should still be here. If not, see the guide + to <a href="installing.html#installingplugin">Installing the ADT Plugin</a>.) + </p></li> + <li>In the results, expand the entry for the Android plugin and + be sure that "Developer Tools" is checked, then click <strong>Next</strong>. + (This will install "Android DDMS" and "Android Development Tools".)</li> + <li>Read and accept the license agreement, then click <strong>Next</strong>. + <li>In the next window, click <strong>Finish</strong> to start installation.</li> + <li>The ADT plugin is not digitally signed. Accept the installation anyway by clicking + <strong>Install All</strong>.</li> + <li>Restart Eclipse.</li> +</ol> +</td> +<td> +<!-- 3.4 steps --> +<ol> + <li>Select <strong>Help</strong> > <strong>Software Updates</strong>.</li> + <li>Select the <strong>Available Software</strong> tab.</li> + <li>Expand the entry for the Andriod plugin (may be listed as the location URL) + and select "Developer Tools" by checking the box next to it, then click + <strong>Install</strong>.</li> + <li>On the next window, "Android DDMS" and "Android Development Tools" + should both be checked. Click <strong>Finish</strong>.</li> + <li>Restart Eclipse.</li> +</ol> +</td> +</tr> +</table> + +<p>If you encounter problems, ensure your ADT is fully uninstalled and then +follow the guide to +<a href="installingplugin">Installing the ADT Plugin +for Eclipse</a>.</p> + +<h3 id="updateEclipsePrefs">Update your Eclipse SDK Preferences</h3> + +<p>The last step is to update your Eclipse preferences to point to the new SDK directory:</p> + <ol> + <li>Select <strong>Window</strong> > <strong>Preferences</strong> to open the Preferences + panel (Mac: <strong>Eclipse</strong> > <strong>Preferences</strong>).</li> + <li>Select <strong>Android</strong> from the left panel.</li> + <li>For the <em>SDK Location</em> in the main panel, click <strong>Browse</strong> + and locate your SDK directory.</li> + <li>Click <strong>Apply</strong>, then <strong>OK</strong>.</li> + </ol> + + +<h2 id="UpdateYourProjects">Update Your Projects</h2> + +<p>You will now need to update any and all Android projects that you have +developed using a previous version of the Android SDK.</p> + + +<h3 id="EclipseUsers">Eclipse users</h3> + +<p>If you use Eclipse to develop applications, use the following procedure to +update each project:</p> + +<ol> + <li>Right-click on the individual project (in the Package Explorer) + and select <strong>Properties</strong>.</li> + <li>In the properties, open the Android panel and select a "build target" to compile + against. This SDK offers the Android 1.1 and Android 1.5 platforms to choose from. When + you are initially updating your projects to the new SDK, we recommend that you select a build + target with the Android 1.1 platform. Click <strong>Apply</strong>, then + <strong>OK</strong>.</li> +</ol> + +<p>The new plugin creates a <code>gen/</code> folder in your project, in which it puts the +<code>R.java</code> file +and all automatically generated AIDL java files. If you get an error such as +<code>The type R is already defined</code>, +then you probably need to delete your old <code>R.java</code> or your old auto-generated +AIDL Java files in the <code>src/</code> folder. +(This <em>does not</em> apply to your own hand-crafted parcelable AIDL java files.)</p> + +<p>Note that, with the Android 1.5 SDK, there is a new process for running +applications in the Android Emulator. +Specifically, you must create an Android Virtual Device (AVD) before you can launch an instance +of the Emulator. Before attempting to run your applications with the new SDK, +please continue with the section below to +<a href="#MigrateYourApplications">Migrate Your Applications</a>.</p> + + +<h3 id="AntUsers">Ant users</h3> + +<p>If you build your projects using the Ant tool (rather than with Eclipse), note the +following changes with the new SDK tools.</p> + +<h4>build.xml has changed</h4> + +<p>You must re-create your <code>build.xml</code> file.</p> + +<p>If you had customized your <code>build.xml</code>, first make a copy of it:</p> + +<pre> +$ cd <em>my-project</em> +$ cp build.xml build.xml.old +</pre> + +<p>Now use the new <code>android</code> tool (located in <code><em>your_sdk</em>/tools/</code>) +to create a new <code>build.xml</code> that references +a specific platform target:</p> + +<pre>$ android update project --path /path/to/my-project --target 1</pre> + +<p>The "target" corresponds to an Android platform library (including any add-ons, such as +Google APIs) that you would like to build your project against. You can view a list of available +targets (and their corresponding integer ID) with the command, <code>android list targets</code>. +When you are initially updating your projects to the new SDK, we recommend that you select the +first target ("1"), which uses the Android 1.1 platform library.</p> + +<p>A <code>gen/</code> folder will be created the first time you build and your <code>R.java</code> and +your AIDL Java files will be generated in here. You <strong>must</strong> remove +the old <code>R.java</code> and old auto-generated AIDL java files from the +<code>src/</code> folder. (This +does not apply to your own hand-crafted parcelabe AIDL java files.)</p> + +<p class="note"><strong>Note:</strong> The "activitycreator" tool has been replaced +by the new "android" tool. For information on creating new projects with the android tool, +see the documentation about <a href="{@docRoot}guide/developing/other-ide.html">Developing +In Other IDEs</a>.</p> + +<p>Note that, with the Android 1.5 SDK, there is a new process for running +applications in the Android Emulator. +Specifically, you must create an Android Virtual Device (AVD) before you can launch an instance +of the Emulator. Before attempting to run your applications with the new SDK, +please continue with the section below to +<a href="#MigrateYourApplications">Migrate Your Applications</a>.</p> + + +<h2 id="MigrateYourApplications">Migrate Your Applications</h2> + +<p>After you have completed the process above to <a href="#UpdateYourProjects">Update Your +Projects</a>, you are strongly encouraged to run each of your applications in an instance +of the emulator running the Android 1.5 system image. It's possible (however, unlikely) +that you'll encounter some breakage in your application when you run your applications on +the Android 1.5 system image. Whether you believe your application will be affected by +platform changes or not, it's very important that you test the application's +forward-compatibility on Android 1.5.</p> + +<p>To test forward-compatibility, simply run your existing application (as-is) on an Android +Emulator that's running the Android 1.5 system image. The following procedure will guide +you through the process to running your existing applications on an emulator. <em>Please read +the following guide completely before you begin</em>.</p> + +<p>To test your application on an emulator running Android 1.5:</p> +<ol> + <li><a href="#UpdateYourProjects">Update Your Project</a> (you should have done this + already, in the section above).</li> + <li>Run your existing project, as-is, on an emulator running the Android 1.5 system image. + <p>As mentioned in the guide to <a href="#UpdateYourProjects">Update Your Projects</a>, + you should have selected a "build + target" of "1", which compiles your application against the Android 1.1 system image, so there + should be no new errors in your code.</p> + <p>Eclipse users: follow the + <a href="{@docRoot}guide/developing/eclipse-adt.html#Running">Eclipse guide to + Running Your Application</a>.</p> + <p>Ant users: follow the + <a href="{@docRoot}guide/developing/other-ide.html#Running">Ant guide to + Running Your Application</a> + <p>During the procedure to Running Your Application, select a "deployment target" + for the AVD that includes the Android 1.5 platform. + If your application utilizes the Google Maps APIs (i.e., + MapView), be certain to select a target that includes the Google APIs.</p> + <p>Once you complete the procedures to run your application in your respective environment, + linked above, return here.</p> + </li> + <li>With your application running in the emulator, perform all regular testing on the application + to ensure that it functions normally (in both landscape and portrait orientations).</li> +</ol> + +<p>Chances are, your application runs just fine on the Android 1.5 platform — +new devices will be able to safely install and run your application and +current users who update their devices will be able to continue using your application as usual. +However, if something doesn't work the way you expect, then you might need to revisit +your project and make any necessary changes to your code.</p> + +<p>You can check for code breakages caused by API changes by opening your project +in Eclipse, changing the "build target" to one using the Android 1.5 platform, +and see where the ADT identifies errors in your code.</p> + + +<h3 id="FutureProofYourApps">Future-proof your apps</h3> + +<p>There have been several API additions made for this release, but there have been +very few actual API <em>changes</em>. Only a couple (relatively unused) elements +have been removed and a few have been deprecated, so your applications written with the +Android 1.1 system library should work just fine. However, +your application is more likely to encounter problems on Android 1.5 +if it performs any of the following:</p> + +<ul> + <li>Uses internal APIs. That is, APIs that are not officially supported + and not available in the reference documentation. Any un-official APIs are always subject + to change (which is why they're un-official) and some have indeed changed. + </li> + <li>Directly manipulates system settings. There are some settings (such as + GPS, data roaming, bluetooth and others) that used to be writable by + applications but have been changed so that they can only be explicitly modified by the user + through the system settings. Refer to {@link android.provider.Settings.Secure} + to see which settings are now secured and cannot be directly changed by your application. + </li> + <li>Uses View hierarchies that are unreasonably deep (more than 10 or so levels) or + broad (more than 30 total). View hierarchies this big have always been troublesome, but + Android 1.5 is much more efficient at exposing this and your application may crash. + </li> + <li>Makes assumptions about the available hardware. With new support for soft keyboards, + not all devices will have full QWERTY keyboards on the hardware. So if your application + listens for special keypress events that only occur on a keypad, then your application + should degrade gracefully when there is no keyboard available. + </li> + <li>Performs its own layout orientation changes based on the acceletometer (or via other + sensors). Some devices running Android 1.5 will automatically rotate the orientation + (and all devices have the option to turn on auto-rotation), so if your application also + attempts to rotate the orientation, it can result in strange behavior. In addition, if your + application uses the accelerometer to detect shaking and you do not want to rotate the + orientation, then you should lock the current orientation with + <a href="{@docRoot}guide/topics/manifest/activity-element.html#screen">android:screenOrientation</a>. + </li> +</ul> + +<p>Please read our blog post on <a +href="http://android-developers.blogspot.com/2009/04/future-proofing-your-apps.html">Future-Proofing +Your Apps</a> for more information on the issues mentioned above.</p> + +<p>For information +about other changes made to Android 1.5, refer to the following documents:</p> +<ul> + <li><a href="{@docRoot}sdk/api_diff/3/changes.html">Android 1.5 API Differences</a></li> + <li><a href="{@docRoot}sdk/android-1.5.html#api-changes">Android 1.5 Version Notes</a></li> + <li><a +href="http://android-developers.blogspot.com/2009/04/ui-framework-changes-in-android-15.html">UI +framework changes in Android 1.5 »</a></li> +</ul> + +<p>If you have additional trouble updating your code, visit the +<a href="http://groups.google.com/group/android-developers">Android Developers Group</a> +to seek help from other Android developers.</p> diff --git a/docs/html/sdk/RELEASENOTES.jd b/docs/html/sdk/RELEASENOTES.jd index f3a1951..03eeb4b 100644 --- a/docs/html/sdk/RELEASENOTES.jd +++ b/docs/html/sdk/RELEASENOTES.jd @@ -5,6 +5,75 @@ page.title=SDK Release Notes releases. For the latest known issues, please ensure that you're viewing this page at <a href="http://developer.android.com/sdk/RELEASENOTES.html">http://developer.android.com/sdk/RELEASENOTES.html</a>.</p> +<h2 id="1.5_r3">Android 1.5 SDK, Release 3</h2> + +<p>Provides an updated Android 1.5 system image that includes permissions +fixes, as described below, and a new application — an IME for Japanese +text input. Also provides the same set of developer tools included in the +previous SDK, but with bug fixes and several new features.</p> + +<h3>Permissions Fixes</h3> + +<p>The latest version of the Android platform, deployable to +Android-powered devices, includes fixes to the permissions-checking +in certain areas of the framework. Specifically, the Android system +now properly checks and enforces several existing permissions where it +did not do so in the previous release. Because of these changes in +enforcement, you are strongly encouraged to test your application +against the new Android 1.5 system image included in this SDK, to ensure +that it functions normally. </p> + +<p>In particular, if your application uses any of the system areas listed below, +you should add the required permissions to the application's manifest and then +test the areas of your code that depend on the permission-protected services. +Even if you believe your application does not use the permissions-protected +services, you should compile and test your application under the latest platform +version to ensure that users will not encounter problems when using your +application. </p> + +<p>The changes to permissions are as follows:</p> + +<ul> +<li>When an application requests access to device camera (through +android.hardware.camera), the <code>CAMERA</code> permission check is now +properly enforced. </li> +<li>When an application requests access to device audio capture (through +android.media.MediaRecorder), the <code>RECORD_AUDIO</code> permission check is +now properly enforced.</li> +</ul> + +<p>For more information, see the issue described in the oCert advisory +below:</p> + +<p style="margin-left: 2em;"><a href="http://www.ocert.org/advisories/ocert-2009-011.html">http://www.ocert.org/advisories/ocert-2009-011.html</a> </p> + +<h3>Resolved Issues, Changes</h3> + +<ul> +<li>The SDK includes a new version of the Google APIs add-on. The add-on +provides an updated com.google.android.maps external library that fixes compile +errors related to certain classes such as GeoPoint. For information about the +Google APIs add-on and the library it provides, see: + +<p style="margin-left:2em;"><a +href="http://code.google.com/android/add-ons/google-apis">http://code.google.com/android/add-ons/google-apis</a> </p></li> + +<li>The SDK add-on architecture now lets device manufacturers specify a USB +Vendor ID in their add-ons. +<li>The <code>android</code> tool provides a new command that scans SDK add-ons +for their USB Vendor IDs and makes them available to adb (OS X and Linux +versions of the SDK only). The command is <code>android update adb</code>. On +Windows versions of the SDK, a custom USB driver is included that supports the +"Google" and "HTC" Vendor IDs, which allow adb to recognize G1 and HTC +Magic devices. For other devices, contact the device manufacturer +to obtain a USB driver, especially if you have an SDK add-on that defines +a new USB Vendor ID.</li> +<li>The telephony, sensor, and geo fix issues in the emulator are now +fixed.</li> +<li>When you use adb to uninstall an upgraded application, the Android system +now properly restores any permissions that had already been granted to the +previous (downgrade) version of the application</li> +</ul> <h2 id="1.5_r2">Android 1.5 SDK, Release 2</h2> diff --git a/docs/html/sdk/android-1.5.jd b/docs/html/sdk/android-1.5.jd index addd644..748f3ee 100644 --- a/docs/html/sdk/android-1.5.jd +++ b/docs/html/sdk/android-1.5.jd @@ -125,6 +125,7 @@ application against the Android library that corresponds to the application's <li>Dialer</li> <li>Email</li> <li>Gallery</li> + <li>IME for Japanese text input</li> <li>Messaging</li> <li>Music</li> <li>Settings</li> diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd index 38db6f8..2ac7688 100644 --- a/docs/html/sdk/index.jd +++ b/docs/html/sdk/index.jd @@ -1,4 +1,5 @@ -sdk.redirect=1.1_r1 +sdk.redirect=true + @jd:body diff --git a/docs/html/sdk/ndk/1.5-r1/index.jd b/docs/html/sdk/ndk/1.5_r1/index.jd index 3d3137c..7ccbbcd 100644 --- a/docs/html/sdk/ndk/1.5-r1/index.jd +++ b/docs/html/sdk/ndk/1.5_r1/index.jd @@ -1,32 +1,35 @@ ndk=true ndk.version=1.5 ndk.rel.id=1 -ndk.date=May 2009 +ndk.date=June 2009 ndk.win_download=android-ndk-1.5_r1-windows.zip -ndk.win_bytes=22450814 -ndk.win_checksum=7b7836f705ec7e66225794edda34000f +ndk.win_bytes=22500667 +ndk.win_checksum=e5c53915903d8b81f3e2ea422e2e2717 ndk.mac_download=android-ndk-1.5_r1-darwin-x86.zip -ndk.mac_bytes=17165450 -ndk.mac_checksum=214ccfd704c0307609fbabeb7bf86acc +ndk.mac_bytes=17215303 +ndk.mac_checksum=1931f0e182798a4c98924fd87380b5b8 ndk.linux_download=android-ndk-1.5_r1-linux-x86.zip -ndk.linux_bytes=15976032 -ndk.linux_checksum=808fd4d6a7e45f76d546ba04ab9ef060 - -ndk.linux_64_download=android-ndk-1.5_r1-linux-x86_64.zip -ndk.linux_64_bytes=18112300 -ndk.linux_64_checksum=f8664c187b3ae077bcfe2b44294d0758 +ndk.linux_bytes=16025885 +ndk.linux_checksum=80a4e14704ca84c21bf1824cb25fbd8b page.title=Android 1.5 NDK, Release 1 @jd:body -<h2>What is the NDK?</h2> +<h2 id="overview">What is the Android NDK?</h2> + +<p>The Android NDK provides tools that allow Android application developers +to embed components that make use of native code in their Android applications. +</p> -<p>The Android 1.5 NDK provides tools that allow Android application developers -to embed and deploy native code within their Android applications. It -provides:</p> +<p>Android applications run in the Dalvik virtual machine. The NDK allows +developers to implement parts of their applications using native-code languages +such as C and C++. This can provide benefits to certain classes of applications, +in the form of reuse of existing code and in some cases increased speed.</p> + +<p>The NDK provides:</p> <ul> <li>A set of tools and build files used to generate native code libraries from C @@ -35,18 +38,21 @@ and C++ sources</li> files (.apks) that can be deployed on Android devices</li> <li>A set of native system headers and libraries that will be supported in all future versions of the Android platform, starting from Android 1.5 </li> +<li>Documentation, samples, and tutorials</li> </ul> -<p>This release of the NDK release supports the ARMv5TE machine instruction set -and provides stable headers for libc (the C library), libm (the Math library) -and the JNI interface.</p> +<p>This release of the NDK supports the ARMv5TE machine instruction set +and provides stable headers for libc (the C library), libm (the Math library), +the JNI interface, and other libraries.</p> -<p>Using the NDK may not be relevant for all Android applications. As a -developer, you will need to balance its benefits (faster execution) and its -drawbacks (no portability, JNI overhead, no access to system libraries, and -difficult debugging). Typical good candidates for the NDK are CPU-intensive -operations that don't allocate too much memory, such as signal processing, -physics simulation, custom bytecode/instruction interpreters, and so on.</p> +<p>The NDK will not benefit most applications. As a developer, you will need +to balance its benefits against its drawbacks; notably, using native code does +not result in an automatic performance increase, but does always increase +application complexity. Typical good candidates for the NDK are self-contained, +CPU-intensive operations that don't allocate much memory, such as signal processing, +physics simulation, and so on. Simply re-coding a method to run in C usually does +not result in a large performance increase. The NDK can, however, can be +an effective way to reuse a large corpus of existing C/C++ code.</p> <p>Please note that the NDK <em>does not</em> enable you to develop native-only applications. Android's primary runtime remains the Dalvik virtual machine.</p> @@ -64,8 +70,11 @@ guaranteed to be supported in all later releases of the platform:</p> <ul> <li>libc (C library) headers</li> -<li>libm (Math library) headers</li> +<li>libm (math library) headers</li> <li>JNI interface headers</li> +<li>libz (Zlib compression) headers</li> +<li>liblog (Android logging) header</li> +<li>A Minimal set of headers for C++ support</li> </ul> <p>The NDK also provides a build system that lets you work efficiently with your @@ -97,6 +106,22 @@ usage</li> defines the native sources you want to compile</li> <li>APPLICATION-MK.TXT — describes the use of the Application.mk file, which describes the native sources required by your Android application</li> +<li>HOWTO.TXT — information about common tasks associated with NDK +development.</li> +<li>SYSTEM-ISSUES.TXT — known issues in the Android system images +that you should be aware of, if you are developing using the NDK. </li> +<li>STABLE-APIS.TXT — a complete list of the stable APIs exposed +by headers in the NDK.</li> +</ul> + +<p>Additionally, the package includes detailed information about the "bionic" +C library provided with the Android platform that you should be aware of, if you +are developing using the NDK. You can find the documentation in the +<code><ndk>/docs/system/libc/</code> directory:</p> + +<ul> +<li>OVERVIEW.TXT — provides an overview of the "bionic" C library and the +features it offers.</li> </ul> <h4>Sample applications</h4> @@ -142,13 +167,14 @@ required.</li> <li>For all development platforms, GNU Make 3.81 or later is required. Earlier versions of GNU Make might work but have not been tested.</li> <li>For Windows, a recent release of <a -href="http://www.cygwin.com">Cygwin</a> is required.</li> +href="http://www.cygwin.com">Cygwin</a>, including both the gmake and gcc +packages, is required. </li> </ul> <h4>Android platform compatibility</h4> <ul> <li>The native libraries created by the Android NDK can only be used on -devices running the Android 1.5 platform version or later. This is due to subtle +devices running the Android 1.5 platform version or later. This is due to toolchain and ABI related changes that make the native libraries incompatible with 1.0 and 1.1 system images.</li> <li>For this reason, you should use native libraries produced with the NDK in diff --git a/docs/html/sdk/older_releases.jd b/docs/html/sdk/older_releases.jd index 3c2bbd4..febccd04 100644 --- a/docs/html/sdk/older_releases.jd +++ b/docs/html/sdk/older_releases.jd @@ -26,6 +26,12 @@ release</a>.</p> <th>Description</td> </tr> <tr> + <td><a href="{@docRoot}sdk/1.5_r1/index.html">Android 1.5 SDK, Release 2</a></td> + <td style="text-align:center;">Android 1.5<br>Android 1.1</td> + <td><em>May 2009</em></td> + <td>Replaced by Android 1.5 SDK, Release 3. <em><a href="RELEASENOTES.html#1.5_r2">Release notes</a></em></td> + </tr> + <tr> <td><a href="{@docRoot}sdk/1.5_r1/index.html">Android 1.5 SDK, Release 1</a></td> <td style="text-align:center;">Android 1.5<br>Android 1.1</td> <td><em>April 2009</em></td> diff --git a/docs/html/sdk/preview/features.html b/docs/html/sdk/preview/features.html deleted file mode 100644 index a2f085c..0000000 --- a/docs/html/sdk/preview/features.html +++ /dev/null @@ -1,191 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<html> - - <head> - <title>Redirecting...</title> - <meta http-equiv="refresh" content="0;url=/sdk/android-1.5-highlights.html"> - <link href="/assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> - </head> - -<body class="gc-documentation"> -<a name="top"></a> - - <div id="header"> - <div id="headerLeft"> - <a href="/index.html" tabindex="-1"><img - src="/assets/images/bg_logo.png" alt="Android Developers" /></a> - <ul class="sdk"> - <li id="home-link"><a href="/index.html"> - <span>Home</span></a></li> - <li id="sdk-link"><a href="/sdk/1.5_r1/index.html"><span>SDK</span></a></li> - <li id="guide-link"><a href="/guide/index.html" - onClick="return loadLast('guide')"><span>Dev Guide</span></a></li> - <li id="reference-link"><a href="/reference/packages.html" - onClick="return loadLast('reference')"><span>Reference</span></a></li> - <li><a href="http://android-developers.blogspot.com"><span>Blog</span></a></li> - <li id="community-link"><a href="/community/index.html"><span>Community</span></a></li> - </ul> - </div> - <div id="headerRight"> - <div id="headerLinks"> - <!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> - <span class="text"> - <!-- <a href="#">English</a> | --> - <a href="http://www.android.com">Android.com</a> - </span> - </div> - <div id="search" > - <div id="searchForm"> - <form accept-charset="utf-8" class="gsc-search-box" - onsubmit="return submit_search()"> - <table class="gsc-search-box" cellpadding="0" cellspacing="0"><tbody> - <tr> - <td class="gsc-input"> - <input id="search_autocomplete" class="gsc-input" type="text" size="33" autocomplete="off" - title="search developer docs" name="q" - value="search developer docs" - onFocus="search_focus_changed(this, true)" - onBlur="search_focus_changed(this, false)" - onkeydown="return search_changed(event, true, '/')" - onkeyup="return search_changed(event, false, '/')" /> - <div id="search_filtered_div" class="no-display"> - <table id="search_filtered" cellspacing=0> - </table> - </div> - </td> - <td class="gsc-search-button"> - <input type="submit" value="Search" title="search" id="search-button" class="gsc-search-button" /> - </td> - <td class="gsc-clear-button"> - <div title="clear results" class="gsc-clear-button"> </div> - </td> - </tr></tbody> - </table> - </form> - </div><!-- searchForm --> - </div><!-- search --> - </div><!-- headerRight --> - </div><!-- header --> - - - <div class="g-section g-tpl-240" id="body-content"> - <div class="g-unit g-first not-resizable" id="side-nav"> - <div id="devdoc-nav"> -<ul> - <li> - <h2>Current SDK Release</h2> - <ul> - <li><a href="/sdk/1.5_r2/index.html">Download</a></li> - <li><a href="/sdk/1.5_r2/installing.html">Installing</a></li> - <li><a href="/sdk/1.5_r2/upgrading.html">Upgrading</a></li> - <li><a href="/sdk/1.5_r2/requirements.html">System Requirements</a></li> - </ul> - <ul> - <li><a href="/sdk/terms.html">SDK Terms and Conditions</a></li> - <li><a href="/sdk/RELEASENOTES.html">SDK Release Notes</a></li> - </ul> - <li> - <h2>System Image Version Notes</h2> - <ul> - <li><a href="/sdk/android-1.5.html">Android 1.5 Version Notes</a></li> - <li><a href="/sdk/android-1.1.html">Android 1.1 Version Notes</a></li> - </ul> - </li> - <li> - <h2>Previous SDK Releases</h2> - <ul> - <li><a href="/sdk/1.1_r1/index.html">Android 1.1 SDK, r1</a></li> - <li><a href="/sdk/1.0_r2/index.html">Android 1.0 SDK, r2</a></li> - <li><a href="/sdk/older_releases.html">Other Releases</a></li> - </ul> - </li> -</ul> - -<script type="text/javascript"> -<!-- - buildToggleLists(); -//--> -</script> - </div> - </div> <!-- end side-nav --> - - - -<div class="g-unit"> - <div id="jd-content"> - <p>Redirecting to - <a href="/sdk/1.5_r1/index.html"> - /sdk/android-1.5-highlights.html - </a></p> - -</div><!-- end jd-content --> - - - -</div><!-- end doc-content --> - -</div> <!-- end body-content --> - -</body> -</html> - - - diff --git a/docs/html/sdk/preview/features.jd b/docs/html/sdk/preview/features.jd new file mode 100644 index 0000000..43856de --- /dev/null +++ b/docs/html/sdk/preview/features.jd @@ -0,0 +1,6 @@ +sdk.redirect=true +sdk.redirect.path=android-1.5-highlights.html + +@jd:body + + diff --git a/docs/html/sdk/preview/index.jd b/docs/html/sdk/preview/index.jd index cb699e9..1e6b26b 100644 --- a/docs/html/sdk/preview/index.jd +++ b/docs/html/sdk/preview/index.jd @@ -1,5 +1,5 @@ sdk.redirect=true -@jd:body +@jd:body diff --git a/docs/html/sdk/sdk_toc.cs b/docs/html/sdk/sdk_toc.cs index 2079dd8..22d6f43 100644 --- a/docs/html/sdk/sdk_toc.cs +++ b/docs/html/sdk/sdk_toc.cs @@ -1,16 +1,42 @@ - +<?cs if:!sdk.redirect ?> <ul> <li><?cs if:android.whichdoc != "online" ?> <h2>Android <?cs var:sdk.version ?> SDK, r<?cs var:sdk.rel.id ?></h2><?cs else ?> - <h2>Current SDK Release</h2><?cs + <h2><span class="en">Current SDK Release</span> + <span class="de">Aktuelle SDK-Version</span> + <span class="es">Versión actual del SDK</span> + <span class="fr">Version actuelle du SDK</span> + <span class="it">Release SDK attuale</span> + <span class="ja">現在リリースされている SDK</span> + <span class="zh-CN">当前的 SDK 版本</span> + <span class="zh-TW">目前 SDK 發行版本</span> + </h2><?cs /if ?> <ul><?cs if:android.whichdoc == "online" ?> - <li><a href="<?cs var:toroot ?>sdk/<?cs var:sdk.current ?>/index.html">Download</a></li><?cs + <li><a href="<?cs var:toroot ?>sdk/<?cs var:sdk.current ?>/index.html"> + <span class="en">Download</span> + <span class="de">Herunterladen</span> + <span class="es">Descargar</span> + <span class="fr">Téléchargement</span> + <span class="it">Download</span> + <span class="ja">ダウンロード</span> + <span class="zh-CN">下载</span> + <span class="zh-TW">下載</span> + </a></li><?cs /if ?> - <li><a href="<?cs var:toroot ?>sdk/<?cs var:sdk.current ?>/installing.html">Installing</a></li> + <li><a href="<?cs var:toroot ?>sdk/<?cs var:sdk.current ?>/installing.html"> + <span class="en">Installing</span> + <span class="de">Installieren</span> + <span class="es">Instalación</span> + <span class="fr">Installation</span> + <span class="it">Installazione</span> + <span class="ja">インストール</span> + <span class="zh-CN">安装</span> + <span class="zh-TW">安裝</span> + </a></li> <li><a href="<?cs var:toroot ?>sdk/<?cs var:sdk.current ?>/upgrading.html">Upgrading</a></li> <li><a href="<?cs var:toroot ?>sdk/<?cs var:sdk.current ?>/requirements.html">System Requirements</a></li> </ul> @@ -20,14 +46,37 @@ </ul><?cs if:android.whichdoc == "online" ?> <li> - <h2>System Image Version Notes</h2> + <h2><span class="en">System Image Version Notes</span> + <span class="de">Versionshinweise zum Systemabbild</span> + <span class="es">Notas de la versión de System Image</span> + <span class="fr">Notes de version de l'image système</span> + <span class="it">Note sulla versione dell'immagine <br />di sistema</span> + <span class="ja">システム イメージ バージョンに<br />関する注意事項</span> + <span class="zh-CN">系统图片版本说明</span> + <span class="zh-TW">系統影像版本資訊</span> + </h2> <ul> <li><a href="<?cs var:toroot ?>sdk/android-1.5.html">Android 1.5 Version Notes</a></li> <li><a href="<?cs var:toroot ?>sdk/android-1.1.html">Android 1.1 Version Notes</a></li> </ul> </li> <li> - <h2>Previous SDK Releases</h2> + <h2>Native Development Tools</h2> + <ul> + <li><a href="<?cs var:toroot ?>sdk/ndk/1.5_r1/index.html">Android 1.5 NDK, r1</a></li> + </ul> + </li> + <li> + <h2> + <span class="en">Previous SDK Releases</span> + <span class="de">Frühere SDK-Releases</span> + <span class="es">Versiones anteriores del SDK</span> + <span class="fr">Anciennes versions du SDK</span> + <span class="it">Release SDK precedenti</span> + <span class="ja">SDK の過去のリリース</span> + <span class="zh-CN">以前的 SDK 版本</span> + <span class="zh-TW">較舊的 SDK 發行版本</span> + </h2> <ul> <li><a href="<?cs var:toroot ?>sdk/1.1_r1/index.html">Android 1.1 SDK, r1</a></li> <li><a href="<?cs var:toroot ?>sdk/1.0_r2/index.html">Android 1.0 SDK, r2</a></li> @@ -40,5 +89,7 @@ <script type="text/javascript"> <!-- buildToggleLists(); + changeNavLang(getLangPref()); //--> -</script>
\ No newline at end of file +</script> +<?cs /if ?>
\ No newline at end of file diff --git a/docs/html/sitemap-intl.txt b/docs/html/sitemap-intl.txt new file mode 100644 index 0000000..ded0554 --- /dev/null +++ b/docs/html/sitemap-intl.txt @@ -0,0 +1,12 @@ +http://developer.android.com/ja/sdk/1.5_r3/installing.html +http://developer.android.com/ja/community/index.html +http://developer.android.com/ja/index.html +http://developer.android.com/ja/guide/publishing/versioning.html +http://developer.android.com/ja/guide/publishing/app-signing.html +http://developer.android.com/ja/guide/publishing/preparing.html +http://developer.android.com/ja/guide/tutorials/hello-world.html +http://developer.android.com/ja/guide/topics/fundamentals.html +http://developer.android.com/ja/guide/index.html +http://developer.android.com/ja/guide/basics/what-is-android.html +http://developer.android.com/ja/guide/developing/other-ide.html +http://developer.android.com/ja/guide/developing/eclipse-adt.html diff --git a/docs/html/videos/index.jd b/docs/html/videos/index.jd new file mode 100644 index 0000000..c9c88cf --- /dev/null +++ b/docs/html/videos/index.jd @@ -0,0 +1,338 @@ +videos=true +page.title=Videos +@jd:body + +<script src="http://swfobject.googlecode.com/svn/trunk/swfobject/swfobject.js" type="text/javascript"></script>
+<script src="{@docRoot}assets/jquery-history.js" type="text/javascript"></script> +<script type="text/javascript"> +// for debugging in FF, so other browsers ignore the console commands. +var console; +if (!console) console = { 'log': function() {} }; + +/* This 'playlist' object defines the playlist IDs for each tab. + * Each name inside 'playlist' corresponds to class names for the tab that the playlists belong to (eg: "googleioTab" and "googleioBox" divs). + * Each string in 'ids' is the ID of a YouTube playlist that belongs in the corresponding tab. + */ +var playlists = { + 'googleio' : { + 'ids': ["734A052F802C96B9"] + }, + 'about' : { + 'ids': ["D7C64411AF40DEA5","611F8C5DBF49CEC6"] + }, + 'developertips' : { + 'ids': ["43E15866EF0033A2"] + }, + 'developersandbox' : { + 'ids': ["77426907BBAD558E"] + } +}; + +/* Some playlists include the title in the description meta-data, so we need to account for this when building the thumbnail lists, so we don't show the title twice + * This string is read via indexOf(), so multiple IDs need only be comma-separated in this string. + */ +var playlistsWithTitleInDescription = "734A052F802C96B9"; + +/* This 'featured' object defines the Feature Videos list. + * Each playlist ID is paired with a custom video description. + */ +var featured = { +// How to Make your Android UI Fast.. + 'N6YdwzAvwOA' : "Make your user interface fast, with more efficient AdapterViews, better bitmap scaling, faster redrawing, ViewStub layouts, fewer Views, and more.", +// Coding for Life: Battery Life + 'OUemfrKe65c' : "Learn what kinds of operations consume the most battery and how you can reduce your usage, with tips for parsing and zipping data, using wakelocks, and running a Service.", +// How Do I Code Thee? + 'GARMe7Km_gk' : "If you'd like to augment your Android applications with pieces written in JavaScript or native code, watch this video." +}; +
+/* When an event on the browser history occurs (back, forward, load), + * load the video found in the URL hash + */
+$(window).history(function(e, hash) {
+ if (location.href.indexOf("#v=") != -1) {
+ videoId = location.href.split("#v=");
+ clickVideo(videoId[1]); // click the link with a matching class
+ }
+}); + +/* Load a video into the player box. + * @param id The YouTube video ID + * @param title The video title to display in the player box (character escaped) + * @param autoplay Whether to automatically play the video + */ +function loadVideo(id, title, autoplay) { + if($("." + id).hasClass("noplay")) { + console.log("noplay"); + autoplay = false; + $("." + id).removeClass("noplay"); + } + swfobject.embedSWF('http://www.youtube.com/v/' + id + '&rel=1&border=0&fs=1&autoplay=' + + (autoplay?1:0), 'player', '500', '334', '9.0.0', false, false, {allowfullscreen: 'true'}); + $("#videoPlayerTitle").html("<h2>" + unescape(title) + "</h2>"); +
+ $.history.add('v=' + id); // add the current video to the browser history + document.getElementById("doc-content").scrollTop = 0; // scroll the window to the top +} + +/* Draw all videos from a playlist into a 'videoPreviews' list + * @param data The feed data returned from the youtube request + */ +function renderPlaylist(data) { + var MAX_DESC_LENGTH = 390; // the length at which we will trim the description + var feed = data.feed; + var entries = feed.entry || []; + var playlistId = feed.yt$playlistId.$t; + + var ul = $('<ul class="videoPreviews" />'); + + // Loop through each entry (each video) and add it to the 'videoPreviews' list + for (var i = 0; i < entries.length; i++) { + var entry = entries[i]; + + var title = entry.title.$t; + var id = entry.media$group.yt$videoid.$t; + var thumbUrl = entry.media$group.media$thumbnail[0].url; + var fullDescription = entry.media$group.media$description.$t; + var playerUrl = entry.media$group.media$content[0].url; + + // Check whether this playlist includes the video title inside the description meta-data, so we can remove it + if (playlistsWithTitleInDescription.indexOf(playlistId) != -1) { + var lines = fullDescription.split("\n"); + // If the first line includes the first 17 chars from the title, let's use the title from the desciption instead (because it's a more complete title) + // This accounts for, literally, "Google I/O 2009 -", which is (so far) the min AND max for properly identifying a title in the only playlist with titles in the description + if (lines[0].indexOf(title.slice(0,16)) != -1) { + h3Title = "<h3>" + lines[0] + "</h3>"; + if (lines[2].length < 30) lines = lines.slice(3); // also, if the second line is very short (the speaker name), slice it out too + else lines = lines.slice(1); // otherwise, slice after the first line + } + fullDescription = lines.join(""); + } + + var shortDescription = fullDescription.substr(0, MAX_DESC_LENGTH); + shortDescription += shortDescription.length == MAX_DESC_LENGTH ? "..." : ""; // add ellipsis if we've chopped the description + + var img = $('<img src="' + thumbUrl + '" width="120" height="90"/>'); + var a = $('<a class="' + id + '" href="#" onclick="loadVideo(\'' + id + '\',\'' + escape(title) + '\',true); return setSelected(this);" />'); + var pShortDescription = $('<p class="short">' + shortDescription + '</p>'); + var pFullDescription = $('<p class="full">' + fullDescription + '</p>'); + var h3Title = "<h3>" + title + "</h3>"; + var pToggle = "<p class='toggle'><a href='#' onclick='return toggleDescription(this)'><span class='more'>more</span><span class='less'>less</span></a></p>"; + var li = $('<li/>'); + + li.append(a); + a.append(img).append(h3Title).append(pShortDescription); + + // Add the full description and "more/less" toggle, if necessary + if (fullDescription.length > MAX_DESC_LENGTH) { + a.append(pFullDescription); + li.append(pToggle); + } + + ul.append(li); + } + + // Now add the 'videoPreviews' list to the page, and be sure we put it in the right tab + // This is the part that allows us to put multiple playlists in one tab + for (var x in playlists) { + var ids = playlists[x].ids; + for (var i in ids) { + if (ids[i] == playlistId) { + $("#"+x+"Box").append(ul); + break; + } + } + } +} + +/* Draw a featured video into the existing 'videoPreviews' list + * @param data The video data returned from the youtube request + */ +function renderFeatured(data) { + var MAX_TITLE_LENGTH = 48; + var entry = data.entry || []; + var id = entry.media$group.yt$videoid.$t; + var description = featured[id]; + var title = entry.title.$t; + var thumbUrl = entry.media$group.media$thumbnail[0].url; + var playerUrl = entry.media$group.media$content[0].url; + + var ellipsis = title.length > MAX_TITLE_LENGTH ? "..." : ""; + + var h3Title = "<h3>"+ title.substr(0,MAX_TITLE_LENGTH) + ellipsis + "</h3>"; + var img = $('<img src="' + thumbUrl + '" width="120" height="90"/>'); + var p = $('<p>' + description + '</p>'); + var a = $('<a class="' + id + '" href="#" onclick="loadVideo(\'' + id + '\',\'' + title + '\',true); return setSelected(this);" />'); + var li = $("<li/>"); + + a.append(h3Title).append(img).append(p); + li.append(a); + + $("#mainBodyRight .videoPreviews").append(li); +} + +/* Request the playlist feeds from YouTube */ +function showPlaylists() { + for (var x in playlists) { + var ids = playlists[x].ids; + for (var i in ids) { + var script = "<script type='text/javascript' src='http://gdata.youtube.com/feeds/api/playlists/" + + ids[i] + + "?v=2&alt=json-in-script&callback=renderPlaylist'><\/script>"; + $("body").append(script); + } + } +} + +/* Request the featured videos from YouTube */ +function showFeatured() { + for (var id in featured) { + var script = "<script type='text/javascript' src='http://gdata.youtube.com/feeds/api/videos/" + + id + + "?v=2&alt=json-in-script&callback=renderFeatured'><\/script>"; + $("body").append(script); + } +} + +/* Reveal a tab (playlist) box + * @param name The name of the tab + */ +function showBox(name) { + $("#"+name+"Box").addClass("selected").siblings().removeClass("selected"); + $("#"+name+"Tab").addClass("selected").siblings().removeClass("selected"); + return false; +} + +/* Highlight a video thumbnail, including all duplicates that there may be + * @param link The link <a> object that was clicked + */ +function setSelected(link) { + var videoId = $(link).attr("class"); + if (videoId.indexOf("selected") != -1) { // this means this video is already selected and playing, so bail out + return false; + } + $(".videoPreviews .selected").removeClass("selected"); + $("a." + videoId).addClass("selected").each( function (i) { + if ($(this).is(":hidden")) { + var boxName = $(this).parent().parent().parent().attr("id").split("Box"); + $("#"+boxName[0]+"Tab a").click(); + } + }); + return false; +} + +/* Reveal and hide the long/short descriptions for a video in the playlist + * @param link The link <a> object that was clicked + */ +function toggleDescription(link) { + var aToggle = $(link); + $("span", aToggle).toggle(); + var aDescription = $(">a", aToggle.parent().parent()); + $("p.short", aDescription).toggle(); + $("p.full", aDescription).toggle(); + if ($("span.less", aToggle).is(":visible")) { + aDescription.css("height", "auto"); + } else { + aDescription.css("height", "90px"); + } + return false; +} + +/* Add actions to the page onload event so that we load a video right away */ +addLoadEvent(function () {
+ // if there's a video url in the hash, click that video
+ if (location.href.indexOf("#v=") != -1) {
+ var videoId = location.href.split("#v="); + clickVideo(videoId[1]); + } else { // otherwise, click the default video + clickDefaultVideo(); + } +}); + + +var clickVideoAttempts = 0; // Used with clickVideo() + +/* Click a video in order to load it and select it + * @param videoId The ID of the video to click + */ +function clickVideo(videoId) { + if ($("." + videoId).length != 0) { // if we find the video, click it and return + $("." + videoId).addClass("noplay"); // add class to indicate we should NOT autoplay (class removed by loadVideo)
+ $("." + videoId + ":first").click(); + return; + } else { // if we don't find it, increment clickVideoAttempts + console.log("video NOT found: " + videoId); + clickVideoAttempts++; + } + + // if we don't find it after 20 attempts (2 seconds), click the first feature video
+ if (clickVideoAttempts > 10) { + console.log("video never found, clicking default..."); + clickVideoAttempts = 0; + clickDefaultVideo(); + } else { // try again after 100 milliseconds + setTimeout('clickVideo("'+videoId+'")', 100); + } +} + +/* Click the default video that should be loaded on page load (the first video in the featured list) */ +function clickDefaultVideo() { + if ($("#mainBodyRight .videoPreviews a:first").length != 0) { + var videoId = $("#mainBodyRight .videoPreviews a:first").attr("class"); + $("." + videoId).addClass("noplay"); // add class to indicate we should NOT autoplay (class removed by loadVideo)
+ $("." + videoId + ":first").click(); + return; + } else { // if we don't find it, increment clickVideoAttempts + console.log("default video NOT found"); + clickVideoAttempts++; + } + + // if we don't find it after 50 attempts (5 seconds), just fail
+ if (clickVideoAttempts > 50) { + console.log("default video never found..."); + } else { // try again after 100 milliseconds + setTimeout('clickDefaultVideo()', 100); + } +} +</script> + + <div id="mainBodyFixed"> + + <div id="mainBodyLeft" class="videoPlayer" > + <div id="videoPlayerBox"> + <div id="videoBorder"> + <div id="videoPlayerTitle"></div> + <div id="objectWrapper"> + <object id="player"></object> + </div> + </div> + </div> + </div><!-- end mainBodyLeft --> + + <div id="mainBodyRight" class="videoPlayer"> + <h2>Featured Videos</h2> + <ul class="videoPreviews"></ul> + </div><!-- end mainBodyRight --> + + <ul id="videoTabs"> + <li id="aboutTab" class="selected"><a onclick="return showBox('about');" href="#">About the Platform</a></li> + <li id="developertipsTab"><a onclick="return showBox('developertips');" href="#">Developer Tips</a></li> + <li id="googleioTab"><a onclick="return showBox('googleio');" href="#">Google I/O Sessions</a></li> + <li id="developersandboxTab"><a onclick="return showBox('developersandbox');" href="#">Developer Sandbox</a></li> + </ul> + + <div id="videos"> + <div id="aboutBox" class="selected"></div> + <div id="developertipsBox"></div> + <div id="googleioBox"></div> + <div id="developersandboxBox"></div> + </div> + + </div><!-- end mainBodyFixed --> + +<script type="text/javascript"> +// Initialization actions +showFeatured(); // load featured videos +showPlaylists(); // load playslists +</script> + +
\ No newline at end of file diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index df659ef..eef1096 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -30,11 +30,11 @@ public final class Bitmap implements Parcelable { /** * Indicates that the bitmap was created for an unknown pixel density. * - * @see Bitmap#getDensityScale() - * @see Bitmap#setDensityScale(float) + * @see Bitmap#getDensity() + * @see Bitmap#setDensity(int) */ - public static final float DENSITY_SCALE_UNKNOWN = -1.0f; - + public static final int DENSITY_NONE = 0; + // Note: mNativeBitmap is used by FaceDetector_jni.cpp // Don't change/rename without updating FaceDetector_jni.cpp private final int mNativeBitmap; @@ -45,11 +45,30 @@ public final class Bitmap implements Parcelable { private int mHeight = -1; private boolean mRecycled; - private static volatile Matrix sScaleMatrix; + // Package-scoped for fast access. + /*package*/ int mDensity = sDefaultDensity = getDefaultDensity(); - private float mDensityScale = DENSITY_SCALE_UNKNOWN; - private boolean mAutoScaling; + private static volatile Matrix sScaleMatrix; + private static volatile int sDefaultDensity = -1; + + /** + * For backwards compatibility, allows the app layer to change the default + * density when running old apps. + * @hide + */ + public static void setDefaultDensity(int density) { + sDefaultDensity = density; + } + + /*package*/ static int getDefaultDensity() { + if (sDefaultDensity >= 0) { + return sDefaultDensity; + } + sDefaultDensity = DisplayMetrics.DENSITY_DEVICE; + return sDefaultDensity; + } + /** * @noinspection UnusedDeclaration */ @@ -70,84 +89,46 @@ public final class Bitmap implements Parcelable { } /** - * <p>Returns the density scale for this bitmap, expressed as a factor of - * the default density (160.) For instance, a bitmap designed for - * displays with a density of 240 will have a density scale of 1.5 whereas a bitmap - * designed for a density of 160 will have a density scale of 1.0.</p> + * <p>Returns the density for this bitmap.</p> * - * <p>The default density scale is {@link #DENSITY_SCALE_UNKNOWN}.</p> + * <p>The default density is the same density as the current display, + * unless the current application does not support different screen + * densities in which case it is + * {@link android.util.DisplayMetrics#DENSITY_DEFAULT}. Note that + * compatibility mode is determined by the application that was initially + * loaded into a process -- applications that share the same process should + * all have the same compatibility, or ensure they explicitly set the + * density of their bitmaps appropriately.</p> * - * @return A scaling factor of the default density (160) or {@link #DENSITY_SCALE_UNKNOWN} + * @return A scaling factor of the default density or {@link #DENSITY_NONE} * if the scaling factor is unknown. * - * @see #setDensityScale(float) - * @see #isAutoScalingEnabled() - * @see #setAutoScalingEnabled(boolean) + * @see #setDensity(int) * @see android.util.DisplayMetrics#DENSITY_DEFAULT - * @see android.util.DisplayMetrics#density - * @see #DENSITY_SCALE_UNKNOWN + * @see android.util.DisplayMetrics#densityDpi + * @see #DENSITY_NONE */ - public float getDensityScale() { - return mDensityScale; + public int getDensity() { + return mDensity; } /** - * <p>Specifies the density scale for this bitmap, expressed as a factor of - * the default density (160.) For instance, a bitmap designed for - * displays with a density of 240 will have a density scale of 1.5 whereas a bitmap - * designed for a density of 160 will have a density scale of 1.0.</p> + * <p>Specifies the density for this bitmap. When the bitmap is + * drawn to a Canvas that also has a density, it will be scaled + * appropriately.</p> * - * @param densityScale The density scaling factor to use with this bitmap or - * {@link #DENSITY_SCALE_UNKNOWN} if the factor is unknown. + * @param density The density scaling factor to use with this bitmap or + * {@link #DENSITY_NONE} if the density is unknown. * - * @see #getDensityScale() - * @see #isAutoScalingEnabled() - * @see #setAutoScalingEnabled(boolean) + * @see #getDensity() * @see android.util.DisplayMetrics#DENSITY_DEFAULT - * @see android.util.DisplayMetrics#density - * @see #DENSITY_SCALE_UNKNOWN + * @see android.util.DisplayMetrics#densityDpi + * @see #DENSITY_NONE */ - public void setDensityScale(float densityScale) { - mDensityScale = densityScale; + public void setDensity(int density) { + mDensity = density; } - - /** - * </p>Indicates whether this bitmap will be automatically be scaled at the - * target's density at drawing time. If auto scaling is enabled, this bitmap - * will be drawn with the following scale factor:</p> - * - * <pre>scale = (bitmap density scale factor) / (target density scale factor)</pre> - * - * <p>Auto scaling is turned off by default. If auto scaling is enabled but the - * bitmap has an unknown density scale, then the bitmap will never be automatically - * scaled at drawing time.</p> - * - * @return True if the bitmap must be scaled at drawing time, false otherwise. - * - * @see #setAutoScalingEnabled(boolean) - * @see #getDensityScale() - * @see #setDensityScale(float) - */ - public boolean isAutoScalingEnabled() { - return mAutoScaling; - } - - /** - * <p>Enables or disables auto scaling for this bitmap. When auto scaling is enabled, - * the bitmap will be scaled at drawing time to accomodate the drawing target's pixel - * density. The final scale factor for this bitmap is thus defined:</p> - * - * <pre>scale = (bitmap density scale factor) / (target density scale factor)</pre> - * - * <p>If auto scaling is enabled but the bitmap has an unknown density scale, then - * the bitmap will never be automatically scaled at drawing time.</p> - * - * @param autoScalingEnabled True to scale the bitmap at drawing time, false otherwise. - */ - public void setAutoScalingEnabled(boolean autoScalingEnabled) { - mAutoScaling = autoScalingEnabled; - } - + /** * Sets the nine patch chunk. * @@ -317,7 +298,8 @@ public final class Bitmap implements Parcelable { * Tries to make a new bitmap based on the dimensions of this bitmap, * setting the new bitmap's config to the one specified, and then copying * this bitmap's pixels into the new bitmap. If the conversion is not - * supported, or the allocator fails, then this returns NULL. + * supported, or the allocator fails, then this returns NULL. The returned + * bitmap initially has the same density as the original. * * @param config The desired config for the resulting bitmap * @param isMutable True if the resulting bitmap should be mutable (i.e. @@ -326,7 +308,11 @@ public final class Bitmap implements Parcelable { */ public Bitmap copy(Config config, boolean isMutable) { checkRecycled("Can't copy a recycled bitmap"); - return nativeCopy(mNativeBitmap, config.nativeInt, isMutable); + Bitmap b = nativeCopy(mNativeBitmap, config.nativeInt, isMutable); + if (b != null) { + b.mDensity = mDensity; + } + return b; } public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, @@ -361,7 +347,8 @@ public final class Bitmap implements Parcelable { /** * Returns an immutable bitmap from the source bitmap. The new bitmap may - * be the same object as source, or a copy may have been made. + * be the same object as source, or a copy may have been made. It is + * initialized with the same density as the original bitmap. */ public static Bitmap createBitmap(Bitmap src) { return createBitmap(src, 0, 0, src.getWidth(), src.getHeight()); @@ -370,7 +357,8 @@ public final class Bitmap implements Parcelable { /** * Returns an immutable bitmap from the specified subset of the source * bitmap. The new bitmap may be the same object as source, or a copy may - * have been made. + * have been made. It is + * initialized with the same density as the original bitmap. * * @param source The bitmap we are subsetting * @param x The x coordinate of the first pixel in source @@ -384,7 +372,8 @@ public final class Bitmap implements Parcelable { /** * Returns an immutable bitmap from subset of the source bitmap, - * transformed by the optional matrix. + * transformed by the optional matrix. It is + * initialized with the same density as the original bitmap. * * @param source The bitmap we are subsetting * @param x The x coordinate of the first pixel in source @@ -451,19 +440,20 @@ public final class Bitmap implements Parcelable { paint.setAntiAlias(true); } } + + // The new bitmap was created from a known bitmap source so assume that + // they use the same density + bitmap.mDensity = source.mDensity; + canvas.setBitmap(bitmap); canvas.drawBitmap(source, srcR, dstR, paint); - // The new bitmap was created from a known bitmap source so assume that - // they use the same density scale - bitmap.mDensityScale = source.mDensityScale; - bitmap.mAutoScaling = source.mAutoScaling; - return bitmap; } /** - * Returns a mutable bitmap with the specified width and height. + * Returns a mutable bitmap with the specified width and height. Its + * initial density is as per {@link #getDensity}. * * @param width The width of the bitmap * @param height The height of the bitmap @@ -478,7 +468,8 @@ public final class Bitmap implements Parcelable { /** * Returns a immutable bitmap with the specified width and height, with each - * pixel value set to the corresponding value in the colors array. + * pixel value set to the corresponding value in the colors array. Its + * initial density is as per {@link #getDensity}. * * @param colors Array of {@link Color} used to initialize the pixels. * @param offset Number of values to skip before the first color in the @@ -512,7 +503,8 @@ public final class Bitmap implements Parcelable { /** * Returns a immutable bitmap with the specified width and height, with each - * pixel value set to the corresponding value in the colors array. + * pixel value set to the corresponding value in the colors array. Its + * initial density is as per {@link #getDensity}. * * @param colors Array of {@link Color} used to initialize the pixels. * This array must be at least as large as width * height. @@ -603,65 +595,71 @@ public final class Bitmap implements Parcelable { } /** - * Convenience method that returns the width of this bitmap divided - * by the density scale factor. - * - * @param canvas The Canvas the bitmap will be drawn to. - * @return The scaled width of this bitmap, according to the density scale factor. + * Convenience for calling {@link #getScaledWidth(int)} with the target + * density of the given {@link Canvas}. */ public int getScaledWidth(Canvas canvas) { - final float scale = mDensityScale; - if (!mAutoScaling || scale < 0) { - return getWidth(); - } - return (int)(getWidth() * canvas.getDensityScale() / scale); + return scaleFromDensity(getWidth(), mDensity, canvas.mDensity); } /** - * Convenience method that returns the height of this bitmap divided - * by the density scale factor. - * - * @param canvas The Canvas the bitmap will be drawn to. - * @return The scaled height of this bitmap, according to the density scale factor. + * Convenience for calling {@link #getScaledHeight(int)} with the target + * density of the given {@link Canvas}. */ public int getScaledHeight(Canvas canvas) { - final float scale = mDensityScale; - if (!mAutoScaling || scale < 0) { - return getHeight(); - } - return (int)(getHeight() * canvas.getDensityScale() / scale); + return scaleFromDensity(getHeight(), mDensity, canvas.mDensity); + } + + /** + * Convenience for calling {@link #getScaledWidth(int)} with the target + * density of the given {@link DisplayMetrics}. + */ + public int getScaledWidth(DisplayMetrics metrics) { + return scaleFromDensity(getWidth(), mDensity, metrics.densityDpi); + } + + /** + * Convenience for calling {@link #getScaledHeight(int)} with the target + * density of the given {@link DisplayMetrics}. + */ + public int getScaledHeight(DisplayMetrics metrics) { + return scaleFromDensity(getHeight(), mDensity, metrics.densityDpi); } /** * Convenience method that returns the width of this bitmap divided * by the density scale factor. * - * @param metrics The target display metrics. + * @param targetDensity The density of the target canvas of the bitmap. * @return The scaled width of this bitmap, according to the density scale factor. */ - public int getScaledWidth(DisplayMetrics metrics) { - final float scale = mDensityScale; - if (!mAutoScaling || scale < 0) { - return getWidth(); - } - return (int)(getWidth() * metrics.density / scale); + public int getScaledWidth(int targetDensity) { + return scaleFromDensity(getWidth(), mDensity, targetDensity); } /** * Convenience method that returns the height of this bitmap divided * by the density scale factor. * - * @param metrics The target display metrics. + * @param targetDensity The density of the target canvas of the bitmap. * @return The scaled height of this bitmap, according to the density scale factor. */ - public int getScaledHeight(DisplayMetrics metrics) { - final float scale = mDensityScale; - if (!mAutoScaling || scale < 0) { - return getHeight(); + public int getScaledHeight(int targetDensity) { + return scaleFromDensity(getHeight(), mDensity, targetDensity); + } + + /** + * @hide + */ + static public int scaleFromDensity(int size, int sdensity, int tdensity) { + if (sdensity == DENSITY_NONE || sdensity == tdensity) { + return size; } - return (int)(getHeight() * metrics.density / scale); + + // Scale by tdensity / sdensity, rounding up. + return ( (size * tdensity) + (sdensity >> 1) ) / sdensity; } - + /** * Return the number of bytes between rows in the bitmap's pixels. Note that * this refers to the pixels as stored natively by the bitmap. If you call @@ -922,6 +920,9 @@ public final class Bitmap implements Parcelable { * -2, -2, so that drawing the alpha bitmap offset by (-2, -2) and then * drawing the original would result in the blur visually aligning with * the original. + * + * <p>The initial density of the returned bitmap is the same as the original's. + * * @param paint Optional paint used to modify the alpha values in the * resulting bitmap. Pass null for default behavior. * @param offsetXY Optional array that returns the X (index 0) and Y @@ -939,6 +940,7 @@ public final class Bitmap implements Parcelable { if (bm == null) { throw new RuntimeException("Failed to extractAlpha on Bitmap"); } + bm.mDensity = mDensity; return bm; } diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java index 76abaa2..c8bed24 100644 --- a/graphics/java/android/graphics/BitmapFactory.java +++ b/graphics/java/android/graphics/BitmapFactory.java @@ -39,7 +39,6 @@ public class BitmapFactory { */ public Options() { inDither = true; - inDensity = 0; inScaled = true; } @@ -79,22 +78,87 @@ public class BitmapFactory { public boolean inDither; /** - * The desired pixel density of the bitmap. + * The pixel density to use for the bitmap. This will always result + * in the returned bitmap having a density set for it (see + * {@link Bitmap#setDensity(int) Bitmap.setDensity(int)). In addition, + * if {@link #inScaled} is set (which it is by default} and this + * density does not match {@link #inTargetDensity}, then the bitmap + * will be scaled to the target density before being returned. + * + * <p>If this is 0, + * {@link BitmapFactory#decodeResource(Resources, int)}, + * {@link BitmapFactory#decodeResource(Resources, int, android.graphics.BitmapFactory.Options)}, + * and {@link BitmapFactory#decodeResourceStream} + * will fill in the density associated with the resource. The other + * functions will leave it as-is and no density will be applied. * - * @see android.util.DisplayMetrics#DENSITY_DEFAULT - * @see android.util.DisplayMetrics#density + * @see #inTargetDensity + * @see #inScreenDensity + * @see #inScaled + * @see Bitmap#setDensity(int) + * @see android.util.DisplayMetrics#densityDpi */ public int inDensity; /** - * </p>If the bitmap is loaded from {@link android.content.res.Resources} and - * this flag is turned on, the bitmap will be scaled to match the default - * display's pixel density.</p> + * The pixel density of the destination this bitmap will be drawn to. + * This is used in conjunction with {@link #inDensity} and + * {@link #inScaled} to determine if and how to scale the bitmap before + * returning it. + * + * <p>If this is 0, + * {@link BitmapFactory#decodeResource(Resources, int)}, + * {@link BitmapFactory#decodeResource(Resources, int, android.graphics.BitmapFactory.Options)}, + * and {@link BitmapFactory#decodeResourceStream} + * will fill in the density associated the Resources object's + * DisplayMetrics. The other + * functions will leave it as-is and no scaling for density will be + * performed. + * + * @see #inDensity + * @see #inScreenDensity + * @see #inScaled + * @see android.util.DisplayMetrics#densityDpi + */ + public int inTargetDensity; + + /** + * The pixel density of the actual screen that is being used. This is + * purely for applications running in density compatibility code, where + * {@link #inTargetDensity} is actually the density the application + * sees rather than the real screen density. + * + * <p>By setting this, you + * allow the loading code to avoid scaling a bitmap that is currently + * in the screen density up/down to the compatibility density. Instead, + * if {@link #inDensity} is the same as {@link #inScreenDensity}, the + * bitmap will be left as-is. Anything using the resulting bitmap + * must also used {@link Bitmap#getScaledWidth(int) + * Bitmap.getScaledWidth} and {@link Bitmap#getScaledHeight + * Bitmap.getScaledHeight} to account for any different between the + * bitmap's density and the target's density. + * + * <p>This is never set automatically for the caller by + * {@link BitmapFactory} itself. It must be explicitly set, since the + * caller must deal with the resulting bitmap in a density-aware way. + * + * @see #inDensity + * @see #inTargetDensity + * @see #inScaled + * @see android.util.DisplayMetrics#densityDpi + */ + public int inScreenDensity; + + /** + * When this flag is set, if {@link #inDensity} and + * {@link #inTargetDensity} are not 0, the + * bitmap will be scaled to match {@link #inTargetDensity} when loaded, + * rather than relying on the graphics system scaling it each time it + * is drawn to a Canvas. * - * </p>This flag is turned on by default and should be turned off if you need - * a non-scaled version of the bitmap. In this case, - * {@link android.graphics.Bitmap#setAutoScalingEnabled(boolean)} can be used - * to properly scale the bitmap at drawing time.</p> + * <p>This flag is turned on by default and should be turned off if you need + * a non-scaled version of the bitmap. Nine-patch bitmaps ignore this + * flag and are always scaled. */ public boolean inScaled; @@ -235,58 +299,32 @@ public class BitmapFactory { * Decode a new Bitmap from an InputStream. This InputStream was obtained from * resources, which we pass to be able to scale the bitmap accordingly. */ - public static Bitmap decodeStream(Resources res, TypedValue value, InputStream is, - Rect pad, Options opts) { + public static Bitmap decodeResourceStream(Resources res, TypedValue value, + InputStream is, Rect pad, Options opts) { if (opts == null) { opts = new Options(); } - Bitmap bm = decodeStream(is, pad, opts); - - if (bm != null && res != null && value != null) { + if (opts.inDensity == 0 && value != null) { final int density = value.density; - if (density == TypedValue.DENSITY_NONE) { - return bm; - } - - byte[] np = bm.getNinePatchChunk(); - final boolean isNinePatch = np != null && NinePatch.isNinePatchChunk(np); - - if (opts.inDensity == 0) { - opts.inDensity = density == TypedValue.DENSITY_DEFAULT ? - DisplayMetrics.DENSITY_DEFAULT : density; - } - float scale = opts.inDensity / (float) DisplayMetrics.DENSITY_DEFAULT; - - if (opts.inScaled || isNinePatch) { - bm.setDensityScale(1.0f); - bm.setAutoScalingEnabled(false); - // Assume we are going to prescale for the screen - scale = res.getDisplayMetrics().density / scale; - if (scale != 1.0f) { - // TODO: This is very inefficient and should be done in native by Skia - final Bitmap oldBitmap = bm; - bm = Bitmap.createScaledBitmap(oldBitmap, (int) (bm.getWidth() * scale + 0.5f), - (int) (bm.getHeight() * scale + 0.5f), true); - oldBitmap.recycle(); - - if (isNinePatch) { - np = nativeScaleNinePatch(np, scale, pad); - bm.setNinePatchChunk(np); - } - } - } else { - bm.setDensityScale(scale); - bm.setAutoScalingEnabled(true); + if (density == TypedValue.DENSITY_DEFAULT) { + opts.inDensity = DisplayMetrics.DENSITY_DEFAULT; + } else if (density != TypedValue.DENSITY_NONE) { + opts.inDensity = density; } } - - return bm; + + if (opts.inTargetDensity == 0 && res != null) { + opts.inTargetDensity = res.getDisplayMetrics().densityDpi; + } + + return decodeStream(is, pad, opts); } /** - * Decode an image referenced by a resource ID. + * Synonym for opening the given resource and calling + * {@link #decodeResourceStream}. * * @param res The resources object containing the image data * @param id The resource id of the image data @@ -303,7 +341,7 @@ public class BitmapFactory { final TypedValue value = new TypedValue(); final InputStream is = res.openRawResource(id, value); - bm = decodeStream(res, value, is, null, opts); + bm = decodeResourceStream(res, value, is, null, opts); is.close(); } catch (java.io.IOException e) { /* do nothing. @@ -315,7 +353,8 @@ public class BitmapFactory { } /** - * Decode an image referenced by a resource ID. + * Synonym for {@link #decodeResource(Resources, int, android.graphics.BitmapFactory.Options)} + * will null Options. * * @param res The resources object containing the image data * @param id The resource id of the image data @@ -412,6 +451,39 @@ public class BitmapFactory { bm = nativeDecodeStream(is, tempStorage, outPadding, opts); } + if (bm == null || opts == null) { + return bm; + } + + final int density = opts.inDensity; + if (density == 0) { + return bm; + } + + bm.setDensity(density); + final int targetDensity = opts.inTargetDensity; + if (targetDensity == 0 || density == targetDensity + || density == opts.inScreenDensity) { + return bm; + } + + byte[] np = bm.getNinePatchChunk(); + final boolean isNinePatch = np != null && NinePatch.isNinePatchChunk(np); + if (opts.inScaled || isNinePatch) { + float scale = targetDensity / (float)density; + // TODO: This is very inefficient and should be done in native by Skia + final Bitmap oldBitmap = bm; + bm = Bitmap.createScaledBitmap(oldBitmap, (int) (bm.getWidth() * scale + 0.5f), + (int) (bm.getHeight() * scale + 0.5f), true); + oldBitmap.recycle(); + + if (isNinePatch) { + np = nativeScaleNinePatch(np, scale, outPadding); + bm.setNinePatchChunk(np); + } + bm.setDensity(targetDensity); + } + return bm; } diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index da73597..345f810 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -20,6 +20,7 @@ import android.text.TextUtils; import android.text.SpannedString; import android.text.SpannableString; import android.text.GraphicsOperations; +import android.util.DisplayMetrics; import javax.microedition.khronos.opengles.GL; @@ -47,15 +48,21 @@ public class Canvas { // optional field set by the caller private DrawFilter mDrawFilter; + // Package-scoped for quick access. + /*package*/ int mDensity = Bitmap.DENSITY_NONE; + + // Used to determine when compatibility scaling is in effect. + private int mScreenDensity = Bitmap.DENSITY_NONE; + // Used by native code @SuppressWarnings({"UnusedDeclaration"}) private int mSurfaceFormat; - @SuppressWarnings({"UnusedDeclaration"}) - private float mDensityScale = 1.0f; /** * Construct an empty raster canvas. Use setBitmap() to specify a bitmap to - * draw into. + * draw into. The initial target density is {@link Bitmap#DENSITY_NONE}; + * this will typically be replaced when a target bitmap is set for the + * canvas. */ public Canvas() { // 0 means no native bitmap @@ -65,6 +72,9 @@ public class Canvas { /** * Construct a canvas with the specified bitmap to draw into. The bitmap * must be mutable. + * + * <p>The initial target density of the canvas is the same as the given + * bitmap's density. * * @param bitmap Specifies a mutable bitmap for the canvas to draw into. */ @@ -76,8 +86,7 @@ public class Canvas { throwIfRecycled(bitmap); mNativeCanvas = initRaster(bitmap.ni()); mBitmap = bitmap; - mDensityScale = bitmap.getDensityScale(); - if (mDensityScale == Bitmap.DENSITY_SCALE_UNKNOWN) mDensityScale = 1.0f; + mDensity = bitmap.mDensity; } /*package*/ Canvas(int nativeCanvas) { @@ -85,6 +94,7 @@ public class Canvas { throw new IllegalStateException(); } mNativeCanvas = nativeCanvas; + mDensity = Bitmap.getDefaultDensity(); } /** @@ -93,10 +103,14 @@ public class Canvas { * be supported in this mode (e.g. some GL implementations may not support * antialiasing or certain effects like ColorMatrix or certain Xfermodes). * However, no exception will be thrown in those cases. + * + * <p>The initial target density of the canvas is the same as the initial + * density of bitmaps as per {@link Bitmap#getDensity() Bitmap.getDensity()}. */ public Canvas(GL gl) { mNativeCanvas = initGL(); mGL = gl; + mDensity = Bitmap.getDefaultDensity(); } /** @@ -117,9 +131,13 @@ public class Canvas { } /** - * Specify a bitmap for the canvas to draw into. + * Specify a bitmap for the canvas to draw into. As a side-effect, also + * updates the canvas's target density to match that of the bitmap. * * @param bitmap Specifies a mutable bitmap for the canvas to draw into. + * + * @see #setDensity(int) + * @see #getDensity() */ public void setBitmap(Bitmap bitmap) { if (!bitmap.isMutable()) { @@ -132,8 +150,7 @@ public class Canvas { native_setBitmap(mNativeCanvas, bitmap.ni()); mBitmap = bitmap; - mDensityScale = bitmap.getDensityScale(); - if (mDensityScale == Bitmap.DENSITY_SCALE_UNKNOWN) mDensityScale = 1.0f; + mDensity = bitmap.mDensity; } /** @@ -172,46 +189,44 @@ public class Canvas { public native int getHeight(); /** - * <p>Returns the density scale for this Canvas' backing bitmap, expressed as a - * factor of the default density (160dpi.) For instance, a bitmap designed for - * 240dpi displays will have a density scale of 1.5 whereas a bitmap - * designed for 160dpi will have a density scale of 1.0.</p> - * - * <p>The default density scale is {@link Bitmap#DENSITY_SCALE_UNKNOWN}.</p> + * <p>Returns the target density of the canvas. The default density is + * derived from the density of its backing bitmap, or + * {@link Bitmap#DENSITY_NONE} if there is not one.</p> * - * @return A scaling factor of the default density (160dpi) or - * {@link Bitmap#DENSITY_SCALE_UNKNOWN} if the scaling factor is unknown. + * @return Returns the current target density of the canvas, which is used + * to determine the scaling factor when drawing a bitmap into it. * - * @see #setDensityScale(float) - * @see Bitmap#getDensityScale() + * @see #setDensity(int) + * @see Bitmap#getDensity() */ - public float getDensityScale() { - if (mBitmap != null) { - return mBitmap.getDensityScale(); - } - return mDensityScale; + public int getDensity() { + return mDensity; } /** - * <p>Specifies the density scale for this Canvas' backing bitmap, expressed as a - * factor of the default density (160dpi.) For instance, a bitmap designed for - * 240dpi displays will have a density scale of 1.5 whereas a bitmap - * designed for 160dpi will have a density scale of 1.0.</p> + * <p>Specifies the density for this Canvas' backing bitmap. This modifies + * the target density of the canvas itself, as well as the density of its + * backing bitmap via {@link Bitmap#setDensity(int) Bitmap.setDensity(int)}. * - * @param densityScale The density scaling factor to use with this bitmap or - * {@link Bitmap#DENSITY_SCALE_UNKNOWN} if the factor is unknown. + * @param density The new target density of the canvas, which is used + * to determine the scaling factor when drawing a bitmap into it. Use + * {@link Bitmap#DENSITY_NONE} to disable bitmap scaling. * - * @see #getDensityScale() - * @see Bitmap#setDensityScale(float) + * @see #getDensity() + * @see Bitmap#setDensity(int) */ - public void setDensityScale(float densityScale) { + public void setDensity(int density) { if (mBitmap != null) { - mBitmap.setDensityScale(densityScale); + mBitmap.setDensity(density); } - mDensityScale = densityScale; - if (mDensityScale == Bitmap.DENSITY_SCALE_UNKNOWN) mDensityScale = 1.0f; + mDensity = density; } + /** @hide */ + public void setScreenDensity(int density) { + mScreenDensity = density; + } + // the SAVE_FLAG constants must match their native equivalents /** restore the current matrix when restore() is called */ @@ -945,12 +960,17 @@ public class Canvas { /** * Draw the specified bitmap, with its top/left corner at (x,y), using * the specified paint, transformed by the current matrix. - * Note: if the paint contains a maskfilter that generates a mask which + * + * <p>Note: if the paint contains a maskfilter that generates a mask which * extends beyond the bitmap's original width/height (e.g. BlurMaskFilter), * then the bitmap will be drawn as if it were in a Shader with CLAMP mode. * Thus the color outside of the original width/height will be the edge * color replicated. * + * <p>If the bitmap and canvas have different densities, this function + * will take care of automatically scaling the bitmap to draw at the + * same density as the canvas. + * * @param bitmap The bitmap to be drawn * @param left The position of the left side of the bitmap being drawn * @param top The position of the top side of the bitmap being drawn @@ -959,20 +979,26 @@ public class Canvas { public void drawBitmap(Bitmap bitmap, float left, float top, Paint paint) { throwIfRecycled(bitmap); native_drawBitmap(mNativeCanvas, bitmap.ni(), left, top, - paint != null ? paint.mNativePaint : 0, bitmap.isAutoScalingEnabled(), - bitmap.getDensityScale()); + paint != null ? paint.mNativePaint : 0, mDensity, mScreenDensity, + bitmap.mDensity); } /** * Draw the specified bitmap, scaling/translating automatically to fill * the destination rectangle. If the source rectangle is not null, it * specifies the subset of the bitmap to draw. - * Note: if the paint contains a maskfilter that generates a mask which + * + * <p>Note: if the paint contains a maskfilter that generates a mask which * extends beyond the bitmap's original width/height (e.g. BlurMaskFilter), * then the bitmap will be drawn as if it were in a Shader with CLAMP mode. * Thus the color outside of the original width/height will be the edge * color replicated. * + * <p>This function <em>ignores the density associated with the bitmap</em>. + * This is because the source and destination rectangle coordinate + * spaces are in their respective densities, so must already have the + * appropriate scaling factor applied. + * * @param bitmap The bitmap to be drawn * @param src May be null. The subset of the bitmap to be drawn * @param dst The rectangle that the bitmap will be scaled/translated @@ -985,19 +1011,26 @@ public class Canvas { } throwIfRecycled(bitmap); native_drawBitmap(mNativeCanvas, bitmap.ni(), src, dst, - paint != null ? paint.mNativePaint : 0); + paint != null ? paint.mNativePaint : 0, + mScreenDensity, bitmap.mDensity); } /** * Draw the specified bitmap, scaling/translating automatically to fill * the destination rectangle. If the source rectangle is not null, it * specifies the subset of the bitmap to draw. - * Note: if the paint contains a maskfilter that generates a mask which + * + * <p>Note: if the paint contains a maskfilter that generates a mask which * extends beyond the bitmap's original width/height (e.g. BlurMaskFilter), * then the bitmap will be drawn as if it were in a Shader with CLAMP mode. * Thus the color outside of the original width/height will be the edge * color replicated. * + * <p>This function <em>ignores the density associated with the bitmap</em>. + * This is because the source and destination rectangle coordinate + * spaces are in their respective densities, so must already have the + * appropriate scaling factor applied. + * * @param bitmap The bitmap to be drawn * @param src May be null. The subset of the bitmap to be drawn * @param dst The rectangle that the bitmap will be scaled/translated @@ -1010,7 +1043,8 @@ public class Canvas { } throwIfRecycled(bitmap); native_drawBitmap(mNativeCanvas, bitmap.ni(), src, dst, - paint != null ? paint.mNativePaint : 0); + paint != null ? paint.mNativePaint : 0, + mScreenDensity, bitmap.mDensity); } /** @@ -1489,14 +1523,20 @@ public class Canvas { int paint); private native void native_drawBitmap(int nativeCanvas, int bitmap, float left, float top, - int nativePaintOrZero, boolean autoScale, - float densityScale); + int nativePaintOrZero, + int canvasDensity, + int screenDensity, + int bitmapDensity); private native void native_drawBitmap(int nativeCanvas, int bitmap, Rect src, RectF dst, - int nativePaintOrZero); + int nativePaintOrZero, + int screenDensity, + int bitmapDensity); private static native void native_drawBitmap(int nativeCanvas, int bitmap, Rect src, Rect dst, - int nativePaintOrZero); + int nativePaintOrZero, + int screenDensity, + int bitmapDensity); private static native void native_drawBitmap(int nativeCanvas, int[] colors, int offset, int stride, float x, float y, int width, int height, diff --git a/graphics/java/android/graphics/NinePatch.java b/graphics/java/android/graphics/NinePatch.java index 778c903..88dfd67 100644 --- a/graphics/java/android/graphics/NinePatch.java +++ b/graphics/java/android/graphics/NinePatch.java @@ -68,7 +68,7 @@ public class NinePatch { } /** - * Draw a bitmap to nine patches. + * Draw a bitmap of nine patches. * * @param canvas A container for the current matrix and clip used to draw the bitmap. * @param location Where to draw the bitmap. @@ -76,23 +76,25 @@ public class NinePatch { public void draw(Canvas canvas, RectF location) { nativeDraw(canvas.mNativeCanvas, location, mBitmap.ni(), mChunk, - mPaint != null ? mPaint.mNativePaint : 0); + mPaint != null ? mPaint.mNativePaint : 0, + canvas.mDensity, mBitmap.mDensity); } /** - * Draw a bitmap to nine patches. + * Draw a bitmap of nine patches. * * @param canvas A container for the current matrix and clip used to draw the bitmap. * @param location Where to draw the bitmap. */ public void draw(Canvas canvas, Rect location) { nativeDraw(canvas.mNativeCanvas, location, - mBitmap.ni(), mChunk, - mPaint != null ? mPaint.mNativePaint : 0); + mBitmap.ni(), mChunk, + mPaint != null ? mPaint.mNativePaint : 0, + canvas.mDensity, mBitmap.mDensity); } /** - * Draw a bitmap to nine patches. + * Draw a bitmap of nine patches. * * @param canvas A container for the current matrix and clip used to draw the bitmap. * @param location Where to draw the bitmap. @@ -100,9 +102,18 @@ public class NinePatch { */ public void draw(Canvas canvas, Rect location, Paint paint) { nativeDraw(canvas.mNativeCanvas, location, - mBitmap.ni(), mChunk, paint != null ? paint.mNativePaint : 0); + mBitmap.ni(), mChunk, paint != null ? paint.mNativePaint : 0, + canvas.mDensity, mBitmap.mDensity); } + /** + * Return the underlying bitmap's density, as per + * {@link Bitmap#getDensity() Bitmap.getDensity()}. + */ + public int getDensity() { + return mBitmap.mDensity; + } + public int getWidth() { return mBitmap.getWidth(); } @@ -129,9 +140,11 @@ public class NinePatch { private static native void validateNinePatchChunk(int bitmap, byte[] chunk); private static native void nativeDraw(int canvas_instance, RectF loc, int bitmap_instance, - byte[] c, int paint_instance_or_null); + byte[] c, int paint_instance_or_null, + int destDensity, int srcDensity); private static native void nativeDraw(int canvas_instance, Rect loc, int bitmap_instance, - byte[] c, int paint_instance_or_null); + byte[] c, int paint_instance_or_null, + int destDensity, int srcDensity); private static native int nativeGetTransparentRegion( int bitmap, byte[] chunk, Rect location); } diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java index 5b32246..eade73a 100644 --- a/graphics/java/android/graphics/drawable/BitmapDrawable.java +++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java @@ -63,18 +63,56 @@ public class BitmapDrawable extends Drawable { private boolean mApplyGravity; private boolean mRebuildShader; - private int mBitmapWidth; - private int mBitmapHeight; private boolean mMutated; + + private int mTargetDensity = DisplayMetrics.DENSITY_DEFAULT; + // These are scaled to match the target density. + private int mBitmapWidth; + private int mBitmapHeight; + + /** + * Create an empty drawable, not dealing with density. + * @deprecated Use {@link #BitmapDrawable(Resources)} to ensure + * that the drawable has correctly set its target density. + */ public BitmapDrawable() { mBitmapState = new BitmapState((Bitmap) null); } + /** + * Create an empty drawable, setting initial target density based on + * the display metrics of the resources. + */ + public BitmapDrawable(Resources res) { + mBitmapState = new BitmapState((Bitmap) null); + if (res != null) { + setTargetDensity(res.getDisplayMetrics()); + mBitmapState.mTargetDensity = mTargetDensity; + } + } + + /** + * Create drawable from a bitmap, not dealing with density. + * @deprecated Use {@link #BitmapDrawable(Resources, Bitmap)} to ensure + * that the drawable has correctly set its target density. + */ public BitmapDrawable(Bitmap bitmap) { this(new BitmapState(bitmap)); } + /** + * Create drawable from a bitmap, setting initial target density based on + * the display metrics of the resources. + */ + public BitmapDrawable(Resources res, Bitmap bitmap) { + this(new BitmapState(bitmap)); + if (res != null) { + setTargetDensity(res.getDisplayMetrics()); + mBitmapState.mTargetDensity = mTargetDensity; + } + } + public BitmapDrawable(String filepath) { this(new BitmapState(BitmapFactory.decodeFile(filepath))); if (mBitmap == null) { @@ -97,11 +135,15 @@ public class BitmapDrawable extends Drawable { return mBitmap; } + private void computeBitmapSize() { + mBitmapWidth = mBitmap.getScaledWidth(mTargetDensity); + mBitmapHeight = mBitmap.getScaledHeight(mTargetDensity); + } + private void setBitmap(Bitmap bitmap) { mBitmap = bitmap; if (bitmap != null) { - mBitmapWidth = bitmap.getWidth(); - mBitmapHeight = bitmap.getHeight(); + computeBitmapSize(); } else { mBitmapWidth = mBitmapHeight = -1; } @@ -114,13 +156,11 @@ public class BitmapDrawable extends Drawable { * * @param canvas The Canvas from which the density scale must be obtained. * - * @see android.graphics.Bitmap#setDensityScale(float) - * @see android.graphics.Bitmap#getDensityScale() - * - * @hide pending API council approval + * @see android.graphics.Bitmap#setDensity(int) + * @see android.graphics.Bitmap#getDensity() */ - public void setDensityScale(Canvas canvas) { - setDensityScale(canvas.getDensityScale()); + public void setTargetDensity(Canvas canvas) { + setTargetDensity(canvas.getDensity()); } /** @@ -128,32 +168,33 @@ public class BitmapDrawable extends Drawable { * * @param metrics The DisplayMetrics indicating the density scale for this drawable. * - * @see android.graphics.Bitmap#setDensityScale(float) - * @see android.graphics.Bitmap#getDensityScale() - * - * @hide pending API council approval + * @see android.graphics.Bitmap#setDensity(int) + * @see android.graphics.Bitmap#getDensity() */ - public void setDensityScale(DisplayMetrics metrics) { - setDensityScale(metrics.density); + public void setTargetDensity(DisplayMetrics metrics) { + mTargetDensity = metrics.densityDpi; + if (mBitmap != null) { + computeBitmapSize(); + } } /** - * Set the density scale at which this drawable will be rendered. + * Set the density at which this drawable will be rendered. * * @param density The density scale for this drawable. * - * @see android.graphics.Bitmap#setDensityScale(float) - * @see android.graphics.Bitmap#getDensityScale() - * - * @hide pending API council approval + * @see android.graphics.Bitmap#setDensity(int) + * @see android.graphics.Bitmap#getDensity() */ - public void setDensityScale(float density) { - density = (density == Bitmap.DENSITY_SCALE_UNKNOWN ? 1.0f : density); - mBitmapState.mTargetDensityScale = density; + public void setTargetDensity(int density) { + mTargetDensity = density == 0 ? DisplayMetrics.DENSITY_DEFAULT : density; + if (mBitmap != null) { + computeBitmapSize(); + } } /** Get the gravity used to position/stretch the bitmap within its bounds. - See android.view.Gravity + * See android.view.Gravity * @return the gravity applied to the bitmap */ public int getGravity() { @@ -302,7 +343,7 @@ public class BitmapDrawable extends Drawable { } mBitmapState.mBitmap = bitmap; setBitmap(bitmap); - setDensityScale(r.getDisplayMetrics()); + setTargetDensity(r.getDisplayMetrics()); final Paint paint = mBitmapState.mPaint; paint.setAntiAlias(a.getBoolean(com.android.internal.R.styleable.BitmapDrawable_antialias, @@ -332,29 +373,12 @@ public class BitmapDrawable extends Drawable { @Override public int getIntrinsicWidth() { - final Bitmap bitmap = mBitmap; - final BitmapState state = mBitmapState; - - if (!state.mAutoScale || state.mBitmapScale == Bitmap.DENSITY_SCALE_UNKNOWN) { - return mBitmapWidth; - } else { - return bitmap != null ? (int) (mBitmapWidth / - (state.mBitmapScale / state.mTargetDensityScale) + 0.5f) : -1; - - } + return mBitmapWidth; } @Override public int getIntrinsicHeight() { - final Bitmap bitmap = mBitmap; - final BitmapState state = mBitmapState; - - if (!state.mAutoScale || state.mBitmapScale == Bitmap.DENSITY_SCALE_UNKNOWN) { - return mBitmapHeight; - } else { - return bitmap != null ? (int) (mBitmapHeight / - (state.mBitmapScale / state.mTargetDensityScale) + 0.5f) : -1; - } + return mBitmapHeight; } @Override @@ -380,19 +404,10 @@ public class BitmapDrawable extends Drawable { Paint mPaint = new Paint(DEFAULT_PAINT_FLAGS); Shader.TileMode mTileModeX; Shader.TileMode mTileModeY; - boolean mAutoScale; - float mBitmapScale; - float mTargetDensityScale = 1.0f; + int mTargetDensity = DisplayMetrics.DENSITY_DEFAULT; BitmapState(Bitmap bitmap) { mBitmap = bitmap; - if (bitmap != null) { - mBitmapScale = bitmap.getDensityScale(); - mAutoScale = bitmap.isAutoScalingEnabled(); - } else { - mBitmapScale = 1.0f; - mAutoScale = false; - } } BitmapState(BitmapState bitmapState) { @@ -401,7 +416,7 @@ public class BitmapDrawable extends Drawable { mGravity = bitmapState.mGravity; mTileModeX = bitmapState.mTileModeX; mTileModeY = bitmapState.mTileModeY; - mTargetDensityScale = bitmapState.mTargetDensityScale; + mTargetDensity = bitmapState.mTargetDensity; mPaint = new Paint(bitmapState.mPaint); } @@ -418,6 +433,7 @@ public class BitmapDrawable extends Drawable { private BitmapDrawable(BitmapState state) { mBitmapState = state; + mTargetDensity = state.mTargetDensity; setBitmap(state.mBitmap); } } diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index 910e111..0a0e4eb 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -27,6 +27,7 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.*; import android.util.AttributeSet; +import android.util.DisplayMetrics; import android.util.StateSet; import android.util.Xml; import android.util.TypedValue; @@ -657,9 +658,8 @@ public abstract class Drawable { } /** - * Create a drawable from an inputstream - * - * @hide pending API council approval + * Create a drawable from an inputstream, using the given resources and + * value to determine density information. */ public static Drawable createFromResourceStream(Resources res, TypedValue value, InputStream is, String srcName) { @@ -675,7 +675,17 @@ public abstract class Drawable { Rects only to drop them on the floor. */ Rect pad = new Rect(); - Bitmap bm = BitmapFactory.decodeStream(res, value, is, pad, null); + + // Special stuff for compatibility mode: if the target density is not + // the same as the display density, but the resource -is- the same as + // the display density, then don't scale it down to the target density. + // This allows us to load the system's density-correct resources into + // an application in compatibility mode, without scaling those down + // to the compatibility density only to have them scaled back up when + // drawn to the screen. + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE; + Bitmap bm = BitmapFactory.decodeResourceStream(res, value, is, pad, opts); if (bm != null) { byte[] np = bm.getNinePatchChunk(); if (np == null || !NinePatch.isNinePatchChunk(np)) { @@ -754,10 +764,13 @@ public abstract class Drawable { } else if (name.equals("bitmap")) { drawable = new BitmapDrawable(); if (r != null) { - ((BitmapDrawable) drawable).setDensityScale(r.getDisplayMetrics()); + ((BitmapDrawable) drawable).setTargetDensity(r.getDisplayMetrics()); } } else if (name.equals("nine-patch")) { drawable = new NinePatchDrawable(); + if (r != null) { + ((NinePatchDrawable) drawable).setTargetDensity(r.getDisplayMetrics()); + } } else { throw new XmlPullParserException(parser.getPositionDescription() + ": invalid drawable tag " + name); @@ -812,15 +825,10 @@ public abstract class Drawable { Rect pad, String srcName) { if (np != null) { - return new NinePatchDrawable(bm, np, pad, srcName); + return new NinePatchDrawable(res, bm, np, pad, srcName); } - final BitmapDrawable drawable = new BitmapDrawable(bm); - if (res != null) { - drawable.setDensityScale(res.getDisplayMetrics()); - } - - return drawable; + return new BitmapDrawable(res, bm); } } diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java index 376b1df..dc80cf5 100644 --- a/graphics/java/android/graphics/drawable/DrawableContainer.java +++ b/graphics/java/android/graphics/drawable/DrawableContainer.java @@ -272,6 +272,8 @@ public class DrawableContainer extends Drawable implements Drawable.Callback { boolean mCheckedConstantState; boolean mCanConstantState; + boolean mPaddingChecked = false; + DrawableContainerState(DrawableContainerState orig, DrawableContainer owner) { mOwner = owner; @@ -334,6 +336,7 @@ public class DrawableContainer extends Drawable implements Drawable.Callback { mHaveStateful = false; mConstantPadding = null; + mPaddingChecked = false; mComputedConstantSize = false; return pos; @@ -359,23 +362,25 @@ public class DrawableContainer extends Drawable implements Drawable.Callback { if (mVariablePadding) { return null; } - if (mConstantPadding != null) { + if (mConstantPadding != null || mPaddingChecked) { return mConstantPadding; } - final Rect r = new Rect(0, 0, 0, 0); + Rect r = null; final Rect t = new Rect(); final int N = getChildCount(); final Drawable[] drawables = mDrawables; for (int i = 0; i < N; i++) { if (drawables[i].getPadding(t)) { + if (r == null) r = new Rect(0, 0, 0, 0); if (t.left > r.left) r.left = t.left; if (t.top > r.top) r.top = t.top; if (t.right > r.right) r.right = t.right; if (t.bottom > r.bottom) r.bottom = t.bottom; } } - return (mConstantPadding=r); + mPaddingChecked = true; + return (mConstantPadding = r); } public final void setConstantSize(boolean constant) { diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index dace96c..d5c8a08 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -20,6 +20,7 @@ import android.graphics.*; import android.content.res.Resources; import android.content.res.TypedArray; import android.util.AttributeSet; +import android.util.DisplayMetrics; import android.util.TypedValue; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -41,24 +42,122 @@ public class NinePatchDrawable extends Drawable { private Paint mPaint; private boolean mMutated; + private int mTargetDensity = DisplayMetrics.DENSITY_DEFAULT; + + // These are scaled to match the target density. + private int mBitmapWidth; + private int mBitmapHeight; + NinePatchDrawable() { } + /** + * Create drawable from raw nine-patch data, not dealing with density. + * @deprecated Use {@link #NinePatchDrawable(Resources, Bitmap, byte[], Rect, String)} + * to ensure that the drawable has correctly set its target density. + */ public NinePatchDrawable(Bitmap bitmap, byte[] chunk, Rect padding, String srcName) { this(new NinePatchState(new NinePatch(bitmap, chunk, srcName), padding)); } + /** + * Create drawable from raw nine-patch data, setting initial target density + * based on the display metrics of the resources. + */ + public NinePatchDrawable(Resources res, Bitmap bitmap, byte[] chunk, + Rect padding, String srcName) { + this(new NinePatchState(new NinePatch(bitmap, chunk, srcName), padding)); + if (res != null) { + setTargetDensity(res.getDisplayMetrics()); + mNinePatchState.mTargetDensity = mTargetDensity; + } + } + + /** + * Create drawable from existing nine-patch, not dealing with density. + * @deprecated Use {@link #NinePatchDrawable(Resources, NinePatch)} + * to ensure that the drawable has correctly set its target density. + */ public NinePatchDrawable(NinePatch patch) { this(new NinePatchState(patch, null)); } + /** + * Create drawable from existing nine-patch, setting initial target density + * based on the display metrics of the resources. + */ + public NinePatchDrawable(Resources res, NinePatch patch) { + this(new NinePatchState(patch, null)); + if (res != null) { + setTargetDensity(res.getDisplayMetrics()); + mNinePatchState.mTargetDensity = mTargetDensity; + } + } + private void setNinePatchState(NinePatchState state) { mNinePatchState = state; mNinePatch = state.mNinePatch; mPadding = state.mPadding; + mTargetDensity = state.mTargetDensity; if (state.mDither) setDither(state.mDither); + if (mNinePatch != null) { + computeBitmapSize(); + } } + /** + * Set the density scale at which this drawable will be rendered. This + * method assumes the drawable will be rendered at the same density as the + * specified canvas. + * + * @param canvas The Canvas from which the density scale must be obtained. + * + * @see android.graphics.Bitmap#setDensity(int) + * @see android.graphics.Bitmap#getDensity() + */ + public void setTargetDensity(Canvas canvas) { + setTargetDensity(canvas.getDensity()); + } + + /** + * Set the density scale at which this drawable will be rendered. + * + * @param metrics The DisplayMetrics indicating the density scale for this drawable. + * + * @see android.graphics.Bitmap#setDensity(int) + * @see android.graphics.Bitmap#getDensity() + */ + public void setTargetDensity(DisplayMetrics metrics) { + mTargetDensity = metrics.densityDpi; + if (mNinePatch != null) { + computeBitmapSize(); + } + } + + /** + * Set the density at which this drawable will be rendered. + * + * @param density The density scale for this drawable. + * + * @see android.graphics.Bitmap#setDensity(int) + * @see android.graphics.Bitmap#getDensity() + */ + public void setTargetDensity(int density) { + mTargetDensity = density == 0 ? DisplayMetrics.DENSITY_DEFAULT : density; + if (mNinePatch != null) { + computeBitmapSize(); + } + } + + private void computeBitmapSize() { + final int sdensity = mNinePatch.getDensity(); + final int tdensity = mTargetDensity; + mBitmapWidth = Bitmap.scaleFromDensity(mNinePatch.getWidth(), + sdensity, tdensity); + mBitmapHeight = Bitmap.scaleFromDensity(mNinePatch.getHeight(), + sdensity, tdensity); + } + // overrides @Override @@ -111,6 +210,7 @@ public class NinePatchDrawable extends Drawable { if (dither) { options.inDither = false; } + options.inScreenDensity = DisplayMetrics.DENSITY_DEVICE; final Rect padding = new Rect(); Bitmap bitmap = null; @@ -119,7 +219,7 @@ public class NinePatchDrawable extends Drawable { final TypedValue value = new TypedValue(); final InputStream is = r.openRawResource(id, value); - bitmap = BitmapFactory.decodeStream(r, value, is, padding, options); + bitmap = BitmapFactory.decodeResourceStream(r, value, is, padding, options); is.close(); } catch (IOException e) { @@ -136,6 +236,7 @@ public class NinePatchDrawable extends Drawable { setNinePatchState(new NinePatchState( new NinePatch(bitmap, bitmap.getNinePatchChunk(), "XML 9-patch"), padding, dither)); + mNinePatchState.mTargetDensity = mTargetDensity; a.recycle(); } @@ -153,7 +254,7 @@ public class NinePatchDrawable extends Drawable { */ @Override public int getIntrinsicWidth() { - return mNinePatch.getWidth(); + return mBitmapWidth; } /** @@ -161,17 +262,17 @@ public class NinePatchDrawable extends Drawable { */ @Override public int getIntrinsicHeight() { - return mNinePatch.getHeight(); + return mBitmapHeight; } @Override public int getMinimumWidth() { - return mNinePatch.getWidth(); + return mBitmapWidth; } @Override public int getMinimumHeight() { - return mNinePatch.getHeight(); + return mBitmapHeight; } /** @@ -211,6 +312,7 @@ public class NinePatchDrawable extends Drawable { final Rect mPadding; final boolean mDither; int mChangingConfigurations; + int mTargetDensity = DisplayMetrics.DENSITY_DEFAULT; NinePatchState(NinePatch ninePatch, Rect padding) { this(ninePatch, padding, false); @@ -225,8 +327,9 @@ public class NinePatchDrawable extends Drawable { NinePatchState(NinePatchState state) { mNinePatch = new NinePatch(state.mNinePatch); mPadding = new Rect(state.mPadding); - mChangingConfigurations = state.mChangingConfigurations; mDither = state.mDither; + mChangingConfigurations = state.mChangingConfigurations; + mTargetDensity = state.mTargetDensity; } @Override diff --git a/include/utils/ResourceTypes.h b/include/utils/ResourceTypes.h index edd0cae..e524e2a 100644 --- a/include/utils/ResourceTypes.h +++ b/include/utils/ResourceTypes.h @@ -1655,7 +1655,8 @@ public: ssize_t resolveReference(Res_value* inOutValue, ssize_t blockIndex, uint32_t* outLastRef = NULL, - uint32_t* inoutTypeSpecFlags = NULL) const; + uint32_t* inoutTypeSpecFlags = NULL, + ResTable_config* outConfig = NULL) const; enum { TMP_BUFFER_SIZE = 16 @@ -1729,7 +1730,8 @@ public: */ ssize_t resolveAttributeReference(Res_value* inOutValue, ssize_t blockIndex, uint32_t* outLastRef = NULL, - uint32_t* inoutTypeSpecFlags = NULL) const; + uint32_t* inoutTypeSpecFlags = NULL, + ResTable_config* inoutConfig = NULL) const; void dumpToLog() const; diff --git a/keystore/java/android/security/CertTool.java b/keystore/java/android/security/CertTool.java index 79418bd..b1b78ea 100644 --- a/keystore/java/android/security/CertTool.java +++ b/keystore/java/android/security/CertTool.java @@ -72,7 +72,7 @@ public class CertTool { private native String getPkcs12PrivateKey(int handle); private native String popPkcs12CertificateStack(int handle); private native void freePkcs12Handle(int handle); - private native String generateCertificateRequest(int bits, String subject); + private native String generateCertificateRequest(int bits, String challenge); private native boolean isPkcs12Keystore(byte[] data); private native int generateX509Certificate(byte[] data); private native boolean isCaCertificate(int handle); @@ -124,7 +124,7 @@ public class CertTool { public String generateKeyPair(int keyStrengthIndex, String challenge, String dirName) { return generateCertificateRequest(getKeyLength(keyStrengthIndex), - dirName); + challenge); } private Intent prepareIntent(String title, byte[] data, String namespace, @@ -140,7 +140,7 @@ public class CertTool { private void addExtraIntentInfo(Intent intent, String namespace, String data) { - intent.putExtra(KEY_ITEM + "1", data); + intent.putExtra(KEY_ITEM + "1", data.getBytes()); intent.putExtra(KEY_NAMESPACE + "1", namespace); } diff --git a/keystore/jni/cert.c b/keystore/jni/cert.c index 0db28fd..006a0a3 100644 --- a/keystore/jni/cert.c +++ b/keystore/jni/cert.c @@ -36,17 +36,17 @@ static char emsg[][30] = { STR(ERR_CONSTRUCT_NEW_DATA), STR(ERR_RSA_KEYGEN), STR(ERR_X509_PROCESS), - STR(ERR_BIO_READ), + STR(ERR_SPKAC_TOO_LONG), + STR(ERR_INVALID_ARGS), }; -static void save_in_store(X509_REQ *req, EVP_PKEY *pkey) +static void save_in_store(EVP_PKEY *pkey) { EVP_PKEY *newpkey = EVP_PKEY_new(); RSA *rsa = EVP_PKEY_get1_RSA(pkey); EVP_PKEY_set1_RSA(newpkey, rsa); PKEY_STORE_free(pkey_store[store_index]); - pkey_store[store_index].key_len = - i2d_X509_PUBKEY(req->req_info->pubkey, &pkey_store[store_index].public_key); + pkey_store[store_index].key_len = i2d_RSA_PUBKEY(rsa, &pkey_store[store_index].public_key); pkey_store[store_index++].pkey = newpkey; store_index %= KEYGEN_STORE_SIZE; RSA_free(rsa); @@ -69,17 +69,19 @@ static EVP_PKEY *get_pkey_from_store(X509 *cert) return (i == KEYGEN_STORE_SIZE) ? NULL : pkey_store[i].pkey; } -int gen_csr(int bits, const char *organizations, char reply[REPLY_MAX]) +int gen_csr(int bits, const char *challenge, char reply[REPLY_MAX]) { int len, ret_code = 0; BIGNUM *bn = NULL; - BIO *bio = NULL; + char *spkstr = NULL; EVP_PKEY *pkey = NULL; RSA *rsa = NULL; - X509_REQ *req = NULL; - X509_NAME *name = NULL; + NETSCAPE_SPKI *req = NULL; - if ((bio = BIO_new(BIO_s_mem())) == NULL) goto err; + if (challenge == NULL) { + ret_code = ERR_INVALID_ARGS; + goto err; + } if ((bits != KEYLENGTH_MEDIUM) && (bits != KEYLENGTH_MAXIMUM)) { ret_code = ERR_INVALID_KEY_LENGTH; @@ -87,7 +89,7 @@ int gen_csr(int bits, const char *organizations, char reply[REPLY_MAX]) } if (((pkey = EVP_PKEY_new()) == NULL) || - ((req = X509_REQ_new()) == NULL) || + ((req = NETSCAPE_SPKI_new()) == NULL) || ((rsa = RSA_new()) == NULL) || ((bn = BN_new()) == NULL)) { ret_code = ERR_CONSTRUCT_NEW_DATA; goto err; @@ -100,40 +102,26 @@ int gen_csr(int bits, const char *organizations, char reply[REPLY_MAX]) goto err; } - // rsa will be part of the req, it will be freed in X509_REQ_free(req) rsa = NULL; + ASN1_STRING_set(req->spkac->challenge, challenge, (int)strlen(challenge)); + NETSCAPE_SPKI_set_pubkey(req, pkey); + NETSCAPE_SPKI_sign(req, pkey, EVP_md5()); + spkstr = NETSCAPE_SPKI_b64_encode(req); - X509_REQ_set_pubkey(req, pkey); - name = X509_REQ_get_subject_name(req); - - X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, - (const unsigned char *)"US", -1, -1, 0); - X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC, - (const unsigned char *) ANDROID_KEYSTORE, - -1, -1, 0); - X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC, - (const unsigned char *)organizations, -1, -1, 0); - - if (!X509_REQ_sign(req, pkey, EVP_md5()) || - (PEM_write_bio_X509_REQ(bio, req) <= 0)) { - ret_code = ERR_X509_PROCESS; - goto err; - } - if ((len = BIO_read(bio, reply, REPLY_MAX - 1)) > 0) { - reply[len] = 0; - save_in_store(req, pkey); + if ((strlcpy(reply, spkstr, REPLY_MAX)) < REPLY_MAX) { + save_in_store(pkey); } else { - ret_code = ERR_BIO_READ; + ret_code = ERR_SPKAC_TOO_LONG; } err: if (rsa) RSA_free(rsa); if (bn) BN_free(bn); - if (req) X509_REQ_free(req); + if (req) NETSCAPE_SPKI_free(req); if (pkey) EVP_PKEY_free(pkey); - if (bio) BIO_free(bio); + if (spkstr) OPENSSL_free(spkstr); if ((ret_code > 0) && (ret_code < ERR_MAXIMUM)) LOGE(emsg[ret_code]); - return ret_code; + return -ret_code; } PKCS12 *get_p12_handle(const char *buf, int bufLen) diff --git a/keystore/jni/cert.h b/keystore/jni/cert.h index aaa7602..a9e1a9e 100644 --- a/keystore/jni/cert.h +++ b/keystore/jni/cert.h @@ -32,8 +32,9 @@ #define ERR_CONSTRUCT_NEW_DATA 2 #define ERR_RSA_KEYGEN 3 #define ERR_X509_PROCESS 4 -#define ERR_BIO_READ 5 -#define ERR_MAXIMUM 6 +#define ERR_SPKAC_TOO_LONG 5 +#define ERR_INVALID_ARGS 6 +#define ERR_MAXIMUM 7 typedef struct { EVP_PKEY *pkey; diff --git a/keystore/jni/certtool.c b/keystore/jni/certtool.c index 1ae8dab..b36b34a 100644 --- a/keystore/jni/certtool.c +++ b/keystore/jni/certtool.c @@ -30,13 +30,17 @@ jstring android_security_CertTool_generateCertificateRequest(JNIEnv* env, jobject thiz, jint bits, - jstring subject) + jstring jChallenge) { + int ret = -1; + jboolean bIsCopy; char csr[REPLY_MAX]; - if (gen_csr(bits, subject, csr) == 0) { - return (*env)->NewStringUTF(env, csr); - } + const char* challenge = (*env)->GetStringUTFChars(env, jChallenge, &bIsCopy); + + ret = gen_csr(bits, challenge , csr); + (*env)->ReleaseStringUTFChars(env, jChallenge, challenge); + if (ret == 0) return (*env)->NewStringUTF(env, csr); return NULL; } diff --git a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp index eec645e..ab02fa0 100644 --- a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp +++ b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp @@ -197,6 +197,9 @@ void DisplayHardware::init(uint32_t dpy) LOGW("ro.sf.lcd_density not defined, using 160 dpi by default."); strcpy(property, "160"); } + } else { + /* for the emulator case, reset the dpi values too */ + mDpiX = mDpiY = atoi(property); } mDensity = atoi(property) * (1.0f/160.0f); diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/SurfaceFlinger.cpp index fb25663..97dfecc 100644 --- a/libs/surfaceflinger/SurfaceFlinger.cpp +++ b/libs/surfaceflinger/SurfaceFlinger.cpp @@ -691,9 +691,14 @@ void SurfaceFlinger::handleTransaction(uint32_t transactionFlags) // some layers might have been removed, so // we need to update the regions they're exposing. - size_t c = mRemovedLayers.size(); + const SortedVector<LayerBase*>& removedLayers(mRemovedLayers); + size_t c = removedLayers.size(); if (c) { mVisibleRegionsDirty = true; + while (c--) { + mDirtyRegionRemovedLayer.orSelf( + removedLayers[c]->visibleRegionScreen); + } } const LayerVector& currentLayers = mCurrentState.layersSortedByZ; @@ -733,17 +738,15 @@ void SurfaceFlinger::computeVisibleRegions( layer->validateVisibility(planeTransform); // start with the whole surface at its current location - const Layer::State& s = layer->drawingState(); - const Rect bounds(layer->visibleBounds()); + const Layer::State& s(layer->drawingState()); // handle hidden surfaces by setting the visible region to empty Region opaqueRegion; Region visibleRegion; Region coveredRegion; - if (UNLIKELY((s.flags & ISurfaceComposer::eLayerHidden) || !s.alpha)) { - visibleRegion.clear(); - } else { + if (LIKELY(!(s.flags & ISurfaceComposer::eLayerHidden) && s.alpha)) { const bool translucent = layer->needsBlending(); + const Rect bounds(layer->visibleBounds()); visibleRegion.set(bounds); coveredRegion = visibleRegion; @@ -790,12 +793,16 @@ void SurfaceFlinger::computeVisibleRegions( layer->setVisibleRegion(visibleRegion); layer->setCoveredRegion(coveredRegion); - // If a secure layer is partially visible, lockdown the screen! + // If a secure layer is partially visible, lock-down the screen! if (layer->isSecure() && !visibleRegion.isEmpty()) { secureFrameBuffer = true; } } + // invalidate the areas where a layer was removed + dirtyRegion.orSelf(mDirtyRegionRemovedLayer); + mDirtyRegionRemovedLayer.clear(); + mSecureFrameBuffer = secureFrameBuffer; opaqueRegion = aboveOpaqueLayers; } diff --git a/libs/surfaceflinger/SurfaceFlinger.h b/libs/surfaceflinger/SurfaceFlinger.h index 15913f2..0d63e1d 100644 --- a/libs/surfaceflinger/SurfaceFlinger.h +++ b/libs/surfaceflinger/SurfaceFlinger.h @@ -351,6 +351,7 @@ private: // Can only accessed from the main thread, these members // don't need synchronization Region mDirtyRegion; + Region mDirtyRegionRemovedLayer; Region mInvalidRegion; Region mWormholeRegion; Client* mLastScheduledBroadcast; diff --git a/libs/utils/ResourceTypes.cpp b/libs/utils/ResourceTypes.cpp index 4dca8bd..0831f4a 100644 --- a/libs/utils/ResourceTypes.cpp +++ b/libs/utils/ResourceTypes.cpp @@ -1486,7 +1486,7 @@ ssize_t ResTable::Theme::getAttribute(uint32_t resID, Res_value* outValue, ssize_t ResTable::Theme::resolveAttributeReference(Res_value* inOutValue, ssize_t blockIndex, uint32_t* outLastRef, - uint32_t* inoutTypeSpecFlags) const + uint32_t* inoutTypeSpecFlags, ResTable_config* inoutConfig) const { //printf("Resolving type=0x%x\n", inOutValue->dataType); if (inOutValue->dataType == Res_value::TYPE_ATTRIBUTE) { @@ -1498,7 +1498,8 @@ ssize_t ResTable::Theme::resolveAttributeReference(Res_value* inOutValue, return blockIndex; } } - return mTable.resolveReference(inOutValue, blockIndex, outLastRef); + return mTable.resolveReference(inOutValue, blockIndex, outLastRef, + inoutTypeSpecFlags, inoutConfig); } void ResTable::Theme::dumpToLog() const @@ -1891,7 +1892,8 @@ ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag } ssize_t ResTable::resolveReference(Res_value* value, ssize_t blockIndex, - uint32_t* outLastRef, uint32_t* inoutTypeSpecFlags) const + uint32_t* outLastRef, uint32_t* inoutTypeSpecFlags, + ResTable_config* outConfig) const { int count=0; while (blockIndex >= 0 && value->dataType == value->TYPE_REFERENCE @@ -1899,7 +1901,8 @@ ssize_t ResTable::resolveReference(Res_value* value, ssize_t blockIndex, if (outLastRef) *outLastRef = value->data; uint32_t lastRef = value->data; uint32_t newFlags = 0; - const ssize_t newIndex = getResource(value->data, value, true, &newFlags); + const ssize_t newIndex = getResource(value->data, value, true, &newFlags, + outConfig); //LOGI("Resolving reference d=%p: newIndex=%d, t=0x%02x, d=%p\n", // (void*)lastRef, (int)newIndex, (int)value->dataType, (void*)value->data); //printf("Getting reference 0x%08x: newIndex=%d\n", value->data, newIndex); diff --git a/media/java/android/media/JetPlayer.java b/media/java/android/media/JetPlayer.java index 4fb0ead..d75d81d 100644 --- a/media/java/android/media/JetPlayer.java +++ b/media/java/android/media/JetPlayer.java @@ -183,6 +183,7 @@ public class JetPlayer */ public void release() { native_release(); + singletonRef = null; } diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp index ce80f92..1fdecdd 100644 --- a/media/jni/soundpool/SoundPool.cpp +++ b/media/jni/soundpool/SoundPool.cpp @@ -18,8 +18,7 @@ #define LOG_TAG "SoundPool" #include <utils/Log.h> -// -#define USE_SHARED_MEM_BUFFER +//#define USE_SHARED_MEM_BUFFER // XXX needed for timing latency #include <utils/Timers.h> diff --git a/packages/SettingsProvider/res/values-cs/defaults.xml b/packages/SettingsProvider/res/values-cs/defaults.xml deleted file mode 100644 index a7c01b3..0000000 --- a/packages/SettingsProvider/res/values-cs/defaults.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- 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. ---> -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="def_airplane_mode_radios">"mobil,bluetooth,wifi"</string> - <string name="def_location_providers_allowed">"gps"</string> - <!-- no translation found for def_backup_transport (6764822064303377157) --> - <skip /> -</resources> diff --git a/packages/SettingsProvider/res/values-cs/strings.xml b/packages/SettingsProvider/res/values-cs/strings.xml index dc75a92..2b089d9 100644 --- a/packages/SettingsProvider/res/values-cs/strings.xml +++ b/packages/SettingsProvider/res/values-cs/strings.xml @@ -15,5 +15,5 @@ --> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label">"Paměť pro nastavení"</string> + <string name="app_label" msgid="4567566098528588863">"Paměť pro nastavení"</string> </resources> diff --git a/packages/SettingsProvider/res/values-de/defaults.xml b/packages/SettingsProvider/res/values-de/defaults.xml deleted file mode 100644 index f85d3f0..0000000 --- a/packages/SettingsProvider/res/values-de/defaults.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- 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. ---> -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="def_airplane_mode_radios">"Mobilfunk, Bluetooth, WLAN"</string> - <string name="def_location_providers_allowed">"GPS"</string> - <!-- no translation found for def_backup_transport (6764822064303377157) --> - <skip /> -</resources> diff --git a/packages/SettingsProvider/res/values-de/strings.xml b/packages/SettingsProvider/res/values-de/strings.xml index 50c8a14..a293522 100644 --- a/packages/SettingsProvider/res/values-de/strings.xml +++ b/packages/SettingsProvider/res/values-de/strings.xml @@ -15,5 +15,5 @@ --> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label">"Einstellungsspeicher"</string> + <string name="app_label" msgid="4567566098528588863">"Einstellungsspeicher"</string> </resources> diff --git a/packages/SettingsProvider/res/values-es/defaults.xml b/packages/SettingsProvider/res/values-es/defaults.xml deleted file mode 100644 index a64805a..0000000 --- a/packages/SettingsProvider/res/values-es/defaults.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- 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. ---> -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="def_airplane_mode_radios">"móvil,bluetooth,wifi"</string> - <string name="def_location_providers_allowed">"gps"</string> - <!-- no translation found for def_backup_transport (6764822064303377157) --> - <skip /> -</resources> diff --git a/packages/SettingsProvider/res/values-es/strings.xml b/packages/SettingsProvider/res/values-es/strings.xml index d30d195..de3958b 100644 --- a/packages/SettingsProvider/res/values-es/strings.xml +++ b/packages/SettingsProvider/res/values-es/strings.xml @@ -15,5 +15,5 @@ --> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label">"Almacenamiento de configuración"</string> + <string name="app_label" msgid="4567566098528588863">"Almacenamiento de configuración"</string> </resources> diff --git a/packages/SettingsProvider/res/values-fr/defaults.xml b/packages/SettingsProvider/res/values-fr/defaults.xml deleted file mode 100644 index 56334cc..0000000 --- a/packages/SettingsProvider/res/values-fr/defaults.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- 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. ---> -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="def_airplane_mode_radios">"cellulaire, Bluetooth, Wi-Fi"</string> - <string name="def_location_providers_allowed">"gps"</string> - <!-- no translation found for def_backup_transport (6764822064303377157) --> - <skip /> -</resources> diff --git a/packages/SettingsProvider/res/values-fr/strings.xml b/packages/SettingsProvider/res/values-fr/strings.xml index 686ec8b..7a1386a 100644 --- a/packages/SettingsProvider/res/values-fr/strings.xml +++ b/packages/SettingsProvider/res/values-fr/strings.xml @@ -15,5 +15,5 @@ --> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label">"Stockage des paramètres"</string> + <string name="app_label" msgid="4567566098528588863">"Stockage des paramètres"</string> </resources> diff --git a/packages/SettingsProvider/res/values-it/defaults.xml b/packages/SettingsProvider/res/values-it/defaults.xml deleted file mode 100644 index 19c0896..0000000 --- a/packages/SettingsProvider/res/values-it/defaults.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- 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. ---> -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="def_airplane_mode_radios">"cellulare,bluetooth,wifi"</string> - <string name="def_location_providers_allowed">"gps"</string> - <!-- no translation found for def_backup_transport (6764822064303377157) --> - <skip /> -</resources> diff --git a/packages/SettingsProvider/res/values-it/strings.xml b/packages/SettingsProvider/res/values-it/strings.xml index 29e462f..f88a654 100644 --- a/packages/SettingsProvider/res/values-it/strings.xml +++ b/packages/SettingsProvider/res/values-it/strings.xml @@ -15,5 +15,5 @@ --> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label">"Archiviazione impostazioni"</string> + <string name="app_label" msgid="4567566098528588863">"Archiviazione impostazioni"</string> </resources> diff --git a/packages/SettingsProvider/res/values-nl/defaults.xml b/packages/SettingsProvider/res/values-nl/defaults.xml deleted file mode 100644 index 625235a..0000000 --- a/packages/SettingsProvider/res/values-nl/defaults.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- 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. ---> -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="def_airplane_mode_radios">"mobiel,bluetooth,wifi"</string> - <string name="def_location_providers_allowed">"gps"</string> - <!-- no translation found for def_backup_transport (6764822064303377157) --> - <skip /> -</resources> diff --git a/packages/SettingsProvider/res/values-nl/strings.xml b/packages/SettingsProvider/res/values-nl/strings.xml index b37b535..7a0e416 100644 --- a/packages/SettingsProvider/res/values-nl/strings.xml +++ b/packages/SettingsProvider/res/values-nl/strings.xml @@ -15,5 +15,5 @@ --> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label">"Opslagruimte voor instellingen"</string> + <string name="app_label" msgid="4567566098528588863">"Opslagruimte voor instellingen"</string> </resources> diff --git a/packages/SettingsProvider/res/values-pl/defaults.xml b/packages/SettingsProvider/res/values-pl/defaults.xml deleted file mode 100644 index b60832e..0000000 --- a/packages/SettingsProvider/res/values-pl/defaults.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- 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. ---> -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="def_airplane_mode_radios">"komórka,bluetooth,wifi"</string> - <string name="def_location_providers_allowed">"gps"</string> - <!-- no translation found for def_backup_transport (6764822064303377157) --> - <skip /> -</resources> diff --git a/packages/SettingsProvider/res/values-pl/strings.xml b/packages/SettingsProvider/res/values-pl/strings.xml index 4ab1e91..ccff82e3 100644 --- a/packages/SettingsProvider/res/values-pl/strings.xml +++ b/packages/SettingsProvider/res/values-pl/strings.xml @@ -15,5 +15,5 @@ --> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label">"Pamięć ustawień"</string> + <string name="app_label" msgid="4567566098528588863">"Pamięć ustawień"</string> </resources> diff --git a/packages/SettingsProvider/res/values-zh-rTW/strings.xml b/packages/SettingsProvider/res/values-zh-rTW/strings.xml index b24144a..0700a76 100644 --- a/packages/SettingsProvider/res/values-zh-rTW/strings.xml +++ b/packages/SettingsProvider/res/values-zh-rTW/strings.xml @@ -15,5 +15,5 @@ --> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label">"設定儲存空間"</string> + <string name="app_label" msgid="4567566098528588863">"設定儲存空間"</string> </resources> diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index f8adaa1..f60ea57 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -21,7 +21,7 @@ <integer name="def_screen_off_timeout">60000</integer> <bool name="def_airplane_mode_on">false</bool> <!-- Comma-separated list of bluetooth, wifi, and cell. --> - <string name="def_airplane_mode_radios">cell,bluetooth,wifi</string> + <string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,wifi</string> <bool name="def_auto_time">true</bool> <bool name="def_accelerometer_rotation">true</bool> <!-- Default screen brightness, from 0 to 255. 102 is 40%. --> @@ -35,7 +35,7 @@ Network location is off by default because it requires user opt-in via Setup Wizard or Settings. --> - <string name="def_location_providers_allowed">gps</string> + <string name="def_location_providers_allowed" translatable="false">gps</string> <!-- 0 == mobile, 1 == wifi. --> <integer name="def_network_preference">1</integer> <bool name="def_usb_mass_storage_enabled">true</bool> @@ -43,5 +43,5 @@ <bool name="def_networks_available_notification_on">true</bool> <bool name="def_backup_enabled">false</bool> - <string name="def_backup_transport"></string> + <string name="def_backup_transport" translatable="false"></string> </resources> diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java index e52ba80..1b99d32 100755 --- a/packages/TtsService/src/android/tts/TtsService.java +++ b/packages/TtsService/src/android/tts/TtsService.java @@ -109,7 +109,9 @@ public class TtsService extends Service implements OnCompletionListener { mFilename = file; } } - + // If the speech queue is locked for more than 5 seconds, something has gone + // very wrong with processSpeechQueue. + private static final int SPEECHQUEUELOCK_TIMEOUT = 5000; private static final int MAX_SPEECH_ITEM_CHAR_LENGTH = 4000; private static final int MAX_FILENAME_LENGTH = 250; // TODO use the TTS stream type when available @@ -192,7 +194,7 @@ public class TtsService extends Service implements OnCompletionListener { private boolean isDefaultEnforced() { return (android.provider.Settings.Secure.getInt(mResolver, android.provider.Settings.Secure.TTS_USE_DEFAULTS, - TextToSpeech.Engine.FALLBACK_TTS_USE_DEFAULTS) + TextToSpeech.Engine.USE_DEFAULTS) == 1 ); } @@ -200,7 +202,7 @@ public class TtsService extends Service implements OnCompletionListener { private int getDefaultRate() { return android.provider.Settings.Secure.getInt(mResolver, android.provider.Settings.Secure.TTS_DEFAULT_RATE, - TextToSpeech.Engine.FALLBACK_TTS_DEFAULT_RATE); + TextToSpeech.Engine.DEFAULT_RATE); } @@ -344,7 +346,7 @@ public class TtsService extends Service implements OnCompletionListener { */ private int speak(String callingApp, String text, int queueMode, ArrayList<String> params) { Log.v("TtsService", "TTS service received " + text); - if (queueMode == TextToSpeech.TTS_QUEUE_FLUSH) { + if (queueMode == TextToSpeech.QUEUE_FLUSH) { stop(callingApp); } else if (queueMode == 2) { stopAll(callingApp); @@ -353,7 +355,7 @@ public class TtsService extends Service implements OnCompletionListener { if (!mIsSpeaking) { processSpeechQueue(); } - return TextToSpeech.TTS_SUCCESS; + return TextToSpeech.SUCCESS; } /** @@ -370,7 +372,7 @@ public class TtsService extends Service implements OnCompletionListener { */ private int playEarcon(String callingApp, String earcon, int queueMode, ArrayList<String> params) { - if (queueMode == TextToSpeech.TTS_QUEUE_FLUSH) { + if (queueMode == TextToSpeech.QUEUE_FLUSH) { stop(callingApp); } else if (queueMode == 2) { stopAll(callingApp); @@ -379,19 +381,18 @@ public class TtsService extends Service implements OnCompletionListener { if (!mIsSpeaking) { processSpeechQueue(); } - return TextToSpeech.TTS_SUCCESS; + return TextToSpeech.SUCCESS; } /** * Stops all speech output and removes any utterances still in the queue for the calling app. */ private int stop(String callingApp) { - int result = TextToSpeech.TTS_ERROR; + int result = TextToSpeech.ERROR; boolean speechQueueAvailable = false; try{ - // If the queue is locked for more than 1 second, - // something has gone very wrong with processSpeechQueue. - speechQueueAvailable = speechQueueLock.tryLock(1000, TimeUnit.MILLISECONDS); + speechQueueAvailable = + speechQueueLock.tryLock(SPEECHQUEUELOCK_TIMEOUT, TimeUnit.MILLISECONDS); if (speechQueueAvailable) { Log.i("TtsService", "Stopping"); for (int i = mSpeechQueue.size() - 1; i > -1; i--){ @@ -413,7 +414,7 @@ public class TtsService extends Service implements OnCompletionListener { mIsSpeaking = false; mCurrentSpeechItem = null; } else { - result = TextToSpeech.TTS_SUCCESS; + result = TextToSpeech.SUCCESS; } Log.i("TtsService", "Stopped"); } @@ -436,12 +437,11 @@ public class TtsService extends Service implements OnCompletionListener { * Stops all speech output and removes any utterances still in the queue globally. */ private int stopAll(String callingApp) { - int result = TextToSpeech.TTS_ERROR; + int result = TextToSpeech.ERROR; boolean speechQueueAvailable = false; try{ - // If the queue is locked for more than 1 second, - // something has gone very wrong with processSpeechQueue. - speechQueueAvailable = speechQueueLock.tryLock(1000, TimeUnit.MILLISECONDS); + speechQueueAvailable = + speechQueueLock.tryLock(SPEECHQUEUELOCK_TIMEOUT, TimeUnit.MILLISECONDS); if (speechQueueAvailable) { for (int i = mSpeechQueue.size() - 1; i > -1; i--){ if (mSpeechQueue.get(i).mType != SpeechItem.TEXT_TO_FILE){ @@ -463,7 +463,7 @@ public class TtsService extends Service implements OnCompletionListener { mIsSpeaking = false; mCurrentSpeechItem = null; } else { - result = TextToSpeech.TTS_SUCCESS; + result = TextToSpeech.SUCCESS; } Log.i("TtsService", "Stopped all"); } @@ -487,7 +487,7 @@ public class TtsService extends Service implements OnCompletionListener { if (params != null){ for (int i = 0; i < params.size() - 1; i = i + 2){ String param = params.get(i); - if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_UTTERANCE_ID)){ + if (param.equals(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID)){ utteranceId = params.get(i+1); } } @@ -500,14 +500,14 @@ public class TtsService extends Service implements OnCompletionListener { private int playSilence(String callingApp, long duration, int queueMode, ArrayList<String> params) { - if (queueMode == TextToSpeech.TTS_QUEUE_FLUSH) { + if (queueMode == TextToSpeech.QUEUE_FLUSH) { stop(callingApp); } mSpeechQueue.add(new SpeechItem(callingApp, duration, params)); if (!mIsSpeaking) { processSpeechQueue(); } - return TextToSpeech.TTS_SUCCESS; + return TextToSpeech.SUCCESS; } private void silence(final SpeechItem speechItem) { @@ -517,7 +517,7 @@ public class TtsService extends Service implements OnCompletionListener { if (speechItem.mParams != null){ for (int i = 0; i < speechItem.mParams.size() - 1; i = i + 2){ String param = speechItem.mParams.get(i); - if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_UTTERANCE_ID)){ + if (param.equals(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID)){ utteranceId = speechItem.mParams.get(i+1); } } @@ -562,17 +562,17 @@ public class TtsService extends Service implements OnCompletionListener { for (int i = 0; i < speechItem.mParams.size() - 1; i = i + 2){ String param = speechItem.mParams.get(i); if (param != null) { - if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_RATE)) { + if (param.equals(TextToSpeech.Engine.KEY_PARAM_RATE)) { speechRate = speechItem.mParams.get(i+1); - } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_LANGUAGE)){ + } else if (param.equals(TextToSpeech.Engine.KEY_PARAM_LANGUAGE)){ language = speechItem.mParams.get(i+1); - } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_COUNTRY)){ + } else if (param.equals(TextToSpeech.Engine.KEY_PARAM_COUNTRY)){ country = speechItem.mParams.get(i+1); - } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_VARIANT)){ + } else if (param.equals(TextToSpeech.Engine.KEY_PARAM_VARIANT)){ variant = speechItem.mParams.get(i+1); - } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_UTTERANCE_ID)){ + } else if (param.equals(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID)){ utteranceId = speechItem.mParams.get(i+1); - } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_STREAM)) { + } else if (param.equals(TextToSpeech.Engine.KEY_PARAM_STREAM)) { try { streamType = Integer.parseInt(speechItem.mParams.get(i + 1)); @@ -638,15 +638,15 @@ public class TtsService extends Service implements OnCompletionListener { for (int i = 0; i < speechItem.mParams.size() - 1; i = i + 2){ String param = speechItem.mParams.get(i); if (param != null) { - if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_RATE)) { + if (param.equals(TextToSpeech.Engine.KEY_PARAM_RATE)) { speechRate = speechItem.mParams.get(i+1); - } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_LANGUAGE)){ + } else if (param.equals(TextToSpeech.Engine.KEY_PARAM_LANGUAGE)){ language = speechItem.mParams.get(i+1); - } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_COUNTRY)){ + } else if (param.equals(TextToSpeech.Engine.KEY_PARAM_COUNTRY)){ country = speechItem.mParams.get(i+1); - } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_VARIANT)){ + } else if (param.equals(TextToSpeech.Engine.KEY_PARAM_VARIANT)){ variant = speechItem.mParams.get(i+1); - } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_UTTERANCE_ID)){ + } else if (param.equals(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID)){ utteranceId = speechItem.mParams.get(i+1); } } @@ -698,7 +698,7 @@ public class TtsService extends Service implements OnCompletionListener { } private void broadcastTtsQueueProcessingCompleted(){ - Intent i = new Intent(Intent.ACTION_TTS_QUEUE_PROCESSING_COMPLETED); + Intent i = new Intent(TextToSpeech.ACTION_TTS_QUEUE_PROCESSING_COMPLETED); sendBroadcast(i); } @@ -752,8 +752,10 @@ public class TtsService extends Service implements OnCompletionListener { private void processSpeechQueue() { boolean speechQueueAvailable = false; try { - speechQueueAvailable = speechQueueLock.tryLock(); + speechQueueAvailable = + speechQueueLock.tryLock(SPEECHQUEUELOCK_TIMEOUT, TimeUnit.MILLISECONDS); if (!speechQueueAvailable) { + Log.e("TtsService", "processSpeechQueue - Speech queue is unavailable."); return; } if (mSpeechQueue.size() < 1) { @@ -822,6 +824,9 @@ public class TtsService extends Service implements OnCompletionListener { if (mSpeechQueue.size() > 0) { mSpeechQueue.remove(0); } + } catch (InterruptedException e) { + Log.e("TtsService", "TTS processSpeechQueue: tryLock interrupted"); + e.printStackTrace(); } finally { // This check is needed because finally will always run; even if the // method returns somewhere in the try block. @@ -838,7 +843,7 @@ public class TtsService extends Service implements OnCompletionListener { } for (int i = 0; i < paramList.size() - 1; i = i + 2) { String param = paramList.get(i); - if ((param != null) && (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_STREAM))) { + if ((param != null) && (param.equals(TextToSpeech.Engine.KEY_PARAM_STREAM))) { try { streamType = Integer.parseInt(paramList.get(i + 1)); } catch (NumberFormatException e) { @@ -905,18 +910,18 @@ public class TtsService extends Service implements OnCompletionListener { if (cb != null) { mCallbacks.register(cb); mCallbacksMap.put(packageName, cb); - return TextToSpeech.TTS_SUCCESS; + return TextToSpeech.SUCCESS; } - return TextToSpeech.TTS_ERROR; + return TextToSpeech.ERROR; } public int unregisterCallback(String packageName, ITtsCallback cb) { if (cb != null) { mCallbacksMap.remove(packageName); mCallbacks.unregister(cb); - return TextToSpeech.TTS_SUCCESS; + return TextToSpeech.SUCCESS; } - return TextToSpeech.TTS_ERROR; + return TextToSpeech.ERROR; } /** diff --git a/packages/VpnServices/src/com/android/server/vpn/AndroidServiceProxy.java b/packages/VpnServices/src/com/android/server/vpn/AndroidServiceProxy.java deleted file mode 100644 index e4c070f..0000000 --- a/packages/VpnServices/src/com/android/server/vpn/AndroidServiceProxy.java +++ /dev/null @@ -1,261 +0,0 @@ -/* - * 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 com.android.server.vpn; - -import android.net.LocalSocket; -import android.net.LocalSocketAddress; -import android.net.vpn.VpnManager; -import android.os.SystemProperties; -import android.util.Log; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * Proxy to start, stop and interact with an Android service defined in init.rc. - * The android service is expected to accept connection through Unix domain - * socket. When the proxy successfully starts the service, it will establish a - * socket connection with the service. The socket serves two purposes: (1) send - * commands to the service; (2) for the proxy to know whether the service is - * alive. - * - * After the service receives commands from the proxy, it should return either - * 0 if the service will close the socket (and the proxy will re-establish - * another connection immediately after), or 1 if the socket is remained alive. - */ -public class AndroidServiceProxy extends ProcessProxy { - private static final int WAITING_TIME = 15; // sec - - private static final String SVC_STATE_CMD_PREFIX = "init.svc."; - private static final String SVC_START_CMD = "ctl.start"; - private static final String SVC_STOP_CMD = "ctl.stop"; - private static final String SVC_STATE_RUNNING = "running"; - private static final String SVC_STATE_STOPPED = "stopped"; - - private static final int END_OF_ARGUMENTS = 255; - - private static final int STOP_SERVICE = -1; - private static final int AUTH_ERROR_CODE = 51; - - private String mServiceName; - private String mSocketName; - private LocalSocket mKeepaliveSocket; - private boolean mControlSocketInUse; - private Integer mSocketResult = null; - private String mTag; - - /** - * Creates a proxy with the service name. - * @param serviceName the service name - */ - public AndroidServiceProxy(String serviceName) { - mServiceName = serviceName; - mSocketName = serviceName; - mTag = "SProxy_" + serviceName; - } - - @Override - public String getName() { - return "Service " + mServiceName; - } - - @Override - public synchronized void stop() { - if (isRunning()) { - try { - setResultAndCloseControlSocket(STOP_SERVICE); - } catch (IOException e) { - // should not occur - throw new RuntimeException(e); - } - } - Log.d(mTag, "----- Stop: " + mServiceName); - SystemProperties.set(SVC_STOP_CMD, mServiceName); - } - - /** - * Sends a command with arguments to the service through the control socket. - */ - public synchronized void sendCommand(String ...args) throws IOException { - OutputStream out = getControlSocketOutput(); - for (String arg : args) outputString(out, arg); - out.write(END_OF_ARGUMENTS); - out.flush(); - checkSocketResult(); - } - - /** - * {@inheritDoc} - * The method returns when the service exits. - */ - @Override - protected void performTask() throws IOException { - String svc = mServiceName; - Log.d(mTag, "----- Stop the daemon just in case: " + mServiceName); - SystemProperties.set(SVC_STOP_CMD, mServiceName); - if (!blockUntil(SVC_STATE_STOPPED, 5)) { - throw new IOException("cannot start service anew: " + svc - + ", it is still running"); - } - - Log.d(mTag, "+++++ Start: " + svc); - SystemProperties.set(SVC_START_CMD, svc); - - boolean success = blockUntil(SVC_STATE_RUNNING, WAITING_TIME); - - if (success) { - Log.d(mTag, "----- Running: " + svc + ", create keepalive socket"); - LocalSocket s = mKeepaliveSocket = createServiceSocket(); - setState(ProcessState.RUNNING); - - if (s == null) { - // no socket connection, stop hosting the service - stop(); - return; - } - try { - for (;;) { - InputStream in = s.getInputStream(); - int data = in.read(); - if (data >= 0) { - Log.d(mTag, "got data from control socket: " + data); - - setSocketResult(data); - } else { - // service is gone - if (mControlSocketInUse) setSocketResult(-1); - break; - } - } - Log.d(mTag, "control connection closed"); - } catch (IOException e) { - if (e instanceof VpnConnectingError) { - throw e; - } else { - Log.d(mTag, "control socket broken: " + e.getMessage()); - } - } - - // Wait 5 seconds for the service to exit - success = blockUntil(SVC_STATE_STOPPED, 5); - Log.d(mTag, "stopping " + svc + ", success? " + success); - } else { - setState(ProcessState.STOPPED); - throw new IOException("cannot start service: " + svc); - } - } - - private LocalSocket createServiceSocket() throws IOException { - LocalSocket s = new LocalSocket(); - LocalSocketAddress a = new LocalSocketAddress(mSocketName, - LocalSocketAddress.Namespace.RESERVED); - - // try a few times in case the service has not listen()ed - IOException excp = null; - for (int i = 0; i < 10; i++) { - try { - s.connect(a); - return s; - } catch (IOException e) { - Log.d(mTag, "service not yet listen()ing; try again"); - excp = e; - sleep(500); - } - } - throw excp; - } - - private OutputStream getControlSocketOutput() throws IOException { - if (mKeepaliveSocket != null) { - mControlSocketInUse = true; - mSocketResult = null; - return mKeepaliveSocket.getOutputStream(); - } else { - throw new IOException("no control socket available"); - } - } - - private void checkSocketResult() throws IOException { - try { - // will be notified when the result comes back from service - if (mSocketResult == null) wait(); - } catch (InterruptedException e) { - Log.d(mTag, "checkSocketResult(): " + e); - } finally { - mControlSocketInUse = false; - if ((mSocketResult == null) || (mSocketResult < 0)) { - throw new IOException("socket error, result from service: " - + mSocketResult); - } - } - } - - private synchronized void setSocketResult(int result) - throws VpnConnectingError { - if (mControlSocketInUse) { - mSocketResult = result; - notifyAll(); - } else if (result > 0) { - // error from daemon - throw new VpnConnectingError((result == AUTH_ERROR_CODE) - ? VpnManager.VPN_ERROR_AUTH - : VpnManager.VPN_ERROR_CONNECTION_FAILED); - } - } - - private void setResultAndCloseControlSocket(int result) - throws VpnConnectingError { - setSocketResult(result); - try { - mKeepaliveSocket.shutdownInput(); - mKeepaliveSocket.shutdownOutput(); - mKeepaliveSocket.close(); - } catch (IOException e) { - Log.e(mTag, "close keepalive socket", e); - } finally { - mKeepaliveSocket = null; - } - } - - /** - * Waits for the process to be in the expected state. The method returns - * false if after the specified duration (in seconds), the process is still - * not in the expected state. - */ - private boolean blockUntil(String expectedState, int waitTime) { - String cmd = SVC_STATE_CMD_PREFIX + mServiceName; - int sleepTime = 200; // ms - int n = waitTime * 1000 / sleepTime; - for (int i = 0; i < n; i++) { - if (expectedState.equals(SystemProperties.get(cmd))) { - Log.d(mTag, mServiceName + " is " + expectedState + " after " - + (i * sleepTime) + " msec"); - break; - } - sleep(sleepTime); - } - return expectedState.equals(SystemProperties.get(cmd)); - } - - private void outputString(OutputStream out, String s) throws IOException { - byte[] bytes = s.getBytes(); - out.write(bytes.length); - out.write(bytes); - out.flush(); - } -} diff --git a/packages/VpnServices/src/com/android/server/vpn/DaemonProxy.java b/packages/VpnServices/src/com/android/server/vpn/DaemonProxy.java new file mode 100644 index 0000000..289ee45 --- /dev/null +++ b/packages/VpnServices/src/com/android/server/vpn/DaemonProxy.java @@ -0,0 +1,199 @@ +/* + * 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 com.android.server.vpn; + +import android.net.LocalSocket; +import android.net.LocalSocketAddress; +import android.net.vpn.VpnManager; +import android.os.SystemProperties; +import android.util.Log; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Serializable; + +/** + * Proxy to start, stop and interact with a VPN daemon. + * The daemon is expected to accept connection through Unix domain socket. + * When the proxy successfully starts the daemon, it will establish a socket + * connection with the daemon, to both send commands to the daemon and receive + * response and connecting error code from the daemon. + */ +class DaemonProxy implements Serializable { + private static final long serialVersionUID = 1L; + private static final boolean DBG = true; + + private static final int WAITING_TIME = 15; // sec + + private static final String SVC_STATE_CMD_PREFIX = "init.svc."; + private static final String SVC_START_CMD = "ctl.start"; + private static final String SVC_STOP_CMD = "ctl.stop"; + private static final String SVC_STATE_RUNNING = "running"; + private static final String SVC_STATE_STOPPED = "stopped"; + + private static final int END_OF_ARGUMENTS = 255; + + private String mName; + private String mTag; + private transient LocalSocket mControlSocket; + + /** + * Creates a proxy of the specified daemon. + * @param daemonName name of the daemon + */ + DaemonProxy(String daemonName) { + mName = daemonName; + mTag = "SProxy_" + daemonName; + } + + String getName() { + return mName; + } + + void start() throws IOException { + String svc = mName; + + Log.i(mTag, "Start VPN daemon: " + svc); + SystemProperties.set(SVC_START_CMD, svc); + + if (!blockUntil(SVC_STATE_RUNNING, WAITING_TIME)) { + throw new IOException("cannot start service: " + svc); + } else { + mControlSocket = createServiceSocket(); + } + } + + void sendCommand(String ...args) throws IOException { + OutputStream out = getControlSocketOutput(); + for (String arg : args) outputString(out, arg); + out.write(END_OF_ARGUMENTS); + out.flush(); + + int result = getResultFromSocket(true); + if (result != args.length) { + throw new IOException("socket error, result from service: " + + result); + } + } + + // returns 0 if nothing is in the receive buffer + int getResultFromSocket() throws IOException { + return getResultFromSocket(false); + } + + void closeControlSocket() { + if (mControlSocket == null) return; + try { + mControlSocket.close(); + } catch (IOException e) { + Log.w(mTag, "close control socket", e); + } finally { + mControlSocket = null; + } + } + + void stop() { + String svc = mName; + Log.i(mTag, "Stop VPN daemon: " + svc); + SystemProperties.set(SVC_STOP_CMD, svc); + boolean success = blockUntil(SVC_STATE_STOPPED, 5); + if (DBG) Log.d(mTag, "stopping " + svc + ", success? " + success); + } + + boolean isStopped() { + String cmd = SVC_STATE_CMD_PREFIX + mName; + return SVC_STATE_STOPPED.equals(SystemProperties.get(cmd)); + } + + private int getResultFromSocket(boolean blocking) throws IOException { + LocalSocket s = mControlSocket; + if (s == null) return 0; + InputStream in = s.getInputStream(); + if (!blocking && in.available() == 0) return 0; + + int data = in.read(); + Log.i(mTag, "got data from control socket: " + data); + + return data; + } + + private LocalSocket createServiceSocket() throws IOException { + LocalSocket s = new LocalSocket(); + LocalSocketAddress a = new LocalSocketAddress(mName, + LocalSocketAddress.Namespace.RESERVED); + + // try a few times in case the service has not listen()ed + IOException excp = null; + for (int i = 0; i < 10; i++) { + try { + s.connect(a); + return s; + } catch (IOException e) { + if (DBG) Log.d(mTag, "service not yet listen()ing; try again"); + excp = e; + sleep(500); + } + } + throw excp; + } + + private OutputStream getControlSocketOutput() throws IOException { + if (mControlSocket != null) { + return mControlSocket.getOutputStream(); + } else { + throw new IOException("no control socket available"); + } + } + + /** + * Waits for the process to be in the expected state. The method returns + * false if after the specified duration (in seconds), the process is still + * not in the expected state. + */ + private boolean blockUntil(String expectedState, int waitTime) { + String cmd = SVC_STATE_CMD_PREFIX + mName; + int sleepTime = 200; // ms + int n = waitTime * 1000 / sleepTime; + for (int i = 0; i < n; i++) { + if (expectedState.equals(SystemProperties.get(cmd))) { + if (DBG) { + Log.d(mTag, mName + " is " + expectedState + " after " + + (i * sleepTime) + " msec"); + } + break; + } + sleep(sleepTime); + } + return expectedState.equals(SystemProperties.get(cmd)); + } + + private void outputString(OutputStream out, String s) throws IOException { + byte[] bytes = s.getBytes(); + out.write(bytes.length); + out.write(bytes); + out.flush(); + } + + private void sleep(int msec) { + try { + Thread.currentThread().sleep(msec); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } +} diff --git a/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecPskService.java b/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecPskService.java index 7b3ddf8..7910f4a 100644 --- a/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecPskService.java +++ b/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecPskService.java @@ -25,7 +25,7 @@ import java.io.IOException; * connection. */ class L2tpIpsecPskService extends VpnService<L2tpIpsecPskProfile> { - private static final String IPSEC_DAEMON = "racoon"; + private static final String IPSEC = "racoon"; @Override protected void connect(String serverIp, String username, String password) @@ -33,9 +33,9 @@ class L2tpIpsecPskService extends VpnService<L2tpIpsecPskProfile> { L2tpIpsecPskProfile p = getProfile(); // IPSEC - AndroidServiceProxy ipsecService = startService(IPSEC_DAEMON); - ipsecService.sendCommand(serverIp, L2tpService.L2TP_PORT, - p.getPresharedKey()); + DaemonProxy ipsec = startDaemon(IPSEC); + ipsec.sendCommand(serverIp, L2tpService.L2TP_PORT, p.getPresharedKey()); + ipsec.closeControlSocket(); sleep(2000); // 2 seconds @@ -45,4 +45,10 @@ class L2tpIpsecPskService extends VpnService<L2tpIpsecPskProfile> { (p.isSecretEnabled() ? p.getSecretString() : null), username, password); } + + @Override + protected void stopPreviouslyRunDaemons() { + stopDaemon(IPSEC); + stopDaemon(MtpdHelper.MTPD); + } } diff --git a/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecService.java b/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecService.java index e2d4ff4..13b4952 100644 --- a/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecService.java +++ b/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecService.java @@ -25,15 +25,16 @@ import java.io.IOException; * The service that manages the certificate based L2TP-over-IPSec VPN connection. */ class L2tpIpsecService extends VpnService<L2tpIpsecProfile> { - private static final String IPSEC_DAEMON = "racoon"; + private static final String IPSEC = "racoon"; @Override protected void connect(String serverIp, String username, String password) throws IOException { // IPSEC - AndroidServiceProxy ipsecService = startService(IPSEC_DAEMON); - ipsecService.sendCommand(serverIp, L2tpService.L2TP_PORT, + DaemonProxy ipsec = startDaemon(IPSEC); + ipsec.sendCommand(serverIp, L2tpService.L2TP_PORT, getUserkeyPath(), getUserCertPath(), getCaCertPath()); + ipsec.closeControlSocket(); sleep(2000); // 2 seconds @@ -45,6 +46,12 @@ class L2tpIpsecService extends VpnService<L2tpIpsecProfile> { username, password); } + @Override + protected void stopPreviouslyRunDaemons() { + stopDaemon(IPSEC); + stopDaemon(MtpdHelper.MTPD); + } + private String getCaCertPath() { return CertTool.getInstance().getCaCertificate( getProfile().getCaCertificate()); diff --git a/packages/VpnServices/src/com/android/server/vpn/L2tpService.java b/packages/VpnServices/src/com/android/server/vpn/L2tpService.java index 9273f35..d658a36 100644 --- a/packages/VpnServices/src/com/android/server/vpn/L2tpService.java +++ b/packages/VpnServices/src/com/android/server/vpn/L2tpService.java @@ -35,4 +35,9 @@ class L2tpService extends VpnService<L2tpProfile> { (p.isSecretEnabled() ? p.getSecretString() : null), username, password); } + + @Override + protected void stopPreviouslyRunDaemons() { + stopDaemon(MtpdHelper.MTPD); + } } diff --git a/packages/VpnServices/src/com/android/server/vpn/MtpdHelper.java b/packages/VpnServices/src/com/android/server/vpn/MtpdHelper.java index 5fac799..9078d9b 100644 --- a/packages/VpnServices/src/com/android/server/vpn/MtpdHelper.java +++ b/packages/VpnServices/src/com/android/server/vpn/MtpdHelper.java @@ -24,26 +24,33 @@ import java.util.Arrays; * A helper class for sending commands to the MTP daemon (mtpd). */ class MtpdHelper { - private static final String MTPD_SERVICE = "mtpd"; + static final String MTPD = "mtpd"; private static final String VPN_LINKNAME = "vpn"; private static final String PPP_ARGS_SEPARATOR = ""; static void sendCommand(VpnService<?> vpnService, String protocol, String serverIp, String port, String secret, String username, String password) throws IOException { + sendCommand(vpnService, protocol, serverIp, port, secret, username, + password, false); + } + + static void sendCommand(VpnService<?> vpnService, String protocol, + String serverIp, String port, String secret, String username, + String password, boolean encryption) throws IOException { ArrayList<String> args = new ArrayList<String>(); args.addAll(Arrays.asList(protocol, serverIp, port)); if (secret != null) args.add(secret); args.add(PPP_ARGS_SEPARATOR); - addPppArguments(vpnService, args, serverIp, username, password); + addPppArguments(args, serverIp, username, password, encryption); - AndroidServiceProxy mtpd = vpnService.startService(MTPD_SERVICE); + DaemonProxy mtpd = vpnService.startDaemon(MTPD); mtpd.sendCommand(args.toArray(new String[args.size()])); } - private static void addPppArguments(VpnService<?> vpnService, - ArrayList<String> args, String serverIp, String username, - String password) throws IOException { + private static void addPppArguments(ArrayList<String> args, String serverIp, + String username, String password, boolean encryption) + throws IOException { args.addAll(Arrays.asList( "linkname", VPN_LINKNAME, "name", username, @@ -52,6 +59,9 @@ class MtpdHelper { "idle", "1800", "mtu", "1400", "mru", "1400")); + if (encryption) { + args.add("+mppe"); + } } private MtpdHelper() { diff --git a/packages/VpnServices/src/com/android/server/vpn/NormalProcessProxy.java b/packages/VpnServices/src/com/android/server/vpn/NormalProcessProxy.java deleted file mode 100644 index f0bbc34..0000000 --- a/packages/VpnServices/src/com/android/server/vpn/NormalProcessProxy.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * 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 com.android.server.vpn; - -import android.util.Log; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.io.IOException; - -/** - * Proxy to perform a command with arguments. - */ -public class NormalProcessProxy extends ProcessProxy { - private Process mProcess; - private String[] mArgs; - private String mTag; - - /** - * Creates a proxy with the arguments. - * @param args the argument list with the first one being the command - */ - public NormalProcessProxy(String ...args) { - if ((args == null) || (args.length == 0)) { - throw new IllegalArgumentException(); - } - mArgs = args; - mTag = "PProxy_" + getName(); - } - - @Override - public String getName() { - return mArgs[0]; - } - - @Override - public synchronized void stop() { - if (isStopped()) return; - getHostThread().interrupt(); - // TODO: not sure how to reliably kill a process - mProcess.destroy(); - setState(ProcessState.STOPPING); - } - - @Override - protected void performTask() throws IOException, InterruptedException { - String[] args = mArgs; - Log.d(mTag, "+++++ Execute: " + getEntireCommand()); - ProcessBuilder pb = new ProcessBuilder(args); - setState(ProcessState.RUNNING); - Process p = mProcess = pb.start(); - BufferedReader reader = new BufferedReader(new InputStreamReader( - p.getInputStream())); - while (true) { - String line = reader.readLine(); - if ((line == null) || isStopping()) break; - Log.d(mTag, line); - } - - Log.d(mTag, "----- p.waitFor(): " + getName()); - p.waitFor(); - Log.d(mTag, "----- Done: " + getName()); - } - - private CharSequence getEntireCommand() { - String[] args = mArgs; - StringBuilder sb = new StringBuilder(args[0]); - for (int i = 1; i < args.length; i++) sb.append(' ').append(args[i]); - return sb; - } -} diff --git a/packages/VpnServices/src/com/android/server/vpn/PptpService.java b/packages/VpnServices/src/com/android/server/vpn/PptpService.java index 01362a5..d903d1b 100644 --- a/packages/VpnServices/src/com/android/server/vpn/PptpService.java +++ b/packages/VpnServices/src/com/android/server/vpn/PptpService.java @@ -26,11 +26,17 @@ import java.io.IOException; class PptpService extends VpnService<PptpProfile> { static final String PPTP_DAEMON = "pptp"; static final String PPTP_PORT = "1723"; + @Override protected void connect(String serverIp, String username, String password) throws IOException { + PptpProfile p = getProfile(); MtpdHelper.sendCommand(this, PPTP_DAEMON, serverIp, PPTP_PORT, null, - username, password); + username, password, p.isEncryptionEnabled()); } + @Override + protected void stopPreviouslyRunDaemons() { + stopDaemon(MtpdHelper.MTPD); + } } diff --git a/packages/VpnServices/src/com/android/server/vpn/ProcessProxy.java b/packages/VpnServices/src/com/android/server/vpn/ProcessProxy.java deleted file mode 100644 index 50fbf4b..0000000 --- a/packages/VpnServices/src/com/android/server/vpn/ProcessProxy.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * 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 com.android.server.vpn; - -import android.os.ConditionVariable; - -import java.io.IOException; - -/** - * A proxy class that spawns a process to accomplish a certain task. - */ -public abstract class ProcessProxy { - /** - * Defines the interface to call back when the process is finished or an - * error occurs during execution. - */ - public static interface Callback { - /** - * Called when the process is finished. - * @param proxy the proxy that hosts the process - */ - void done(ProcessProxy proxy); - - /** - * Called when some error occurs. - * @param proxy the proxy that hosts the process - */ - void error(ProcessProxy proxy, Throwable error); - } - - protected enum ProcessState { - STOPPED, STARTING, RUNNING, STOPPING, ERROR - } - - private ProcessState mState = ProcessState.STOPPED; - private ConditionVariable mLock = new ConditionVariable(); - private Thread mThread; - - /** - * Returns the name of the process. - */ - public abstract String getName(); - - /** - * Starts the process with a callback. - * @param callback the callback to get notified when the process is finished - * or an error occurs during execution - * @throws IOException when the process is already running or failed to - * start - */ - public synchronized void start(final Callback callback) throws IOException { - if (!isStopped()) { - throw new IOException("Process is already running: " + this); - } - mLock.close(); - setState(ProcessState.STARTING); - Thread thread = new Thread(new Runnable() { - public void run() { - try { - performTask(); - setState(ProcessState.STOPPED); - mLock.open(); - if (callback != null) callback.done(ProcessProxy.this); - } catch (Throwable e) { - setState(ProcessState.ERROR); - if (callback != null) callback.error(ProcessProxy.this, e); - } finally { - mThread = null; - } - } - }); - thread.setPriority(Thread.MIN_PRIORITY); - thread.start(); - mThread = thread; - if (!waitUntilRunning()) { - throw new IOException("Failed to start the process: " + this); - } - } - - /** - * Starts the process. - * @throws IOException when the process is already running or failed to - * start - */ - public synchronized void start() throws IOException { - start(null); - if (!waitUntilDone()) { - throw new IOException("Failed to complete the process: " + this); - } - } - - /** - * Returns the thread that hosts the process. - */ - public Thread getHostThread() { - return mThread; - } - - /** - * Blocks the current thread until the hosted process is finished. - * - * @return true if the process is finished normally; false if an error - * occurs - */ - public boolean waitUntilDone() { - while (!mLock.block(1000)) { - if (isStopped() || isInError()) break; - } - return isStopped(); - } - - /** - * Blocks the current thread until the hosted process is running. - * - * @return true if the process is running normally; false if the process - * is in another state - */ - private boolean waitUntilRunning() { - for (;;) { - if (!isStarting()) break; - } - return isRunning(); - } - - /** - * Stops and destroys the process. - */ - public abstract void stop(); - - /** - * Checks whether the process is finished. - * @return true if the process is stopped - */ - public boolean isStopped() { - return (mState == ProcessState.STOPPED); - } - - /** - * Checks whether the process is being stopped. - * @return true if the process is being stopped - */ - public boolean isStopping() { - return (mState == ProcessState.STOPPING); - } - - /** - * Checks whether the process is being started. - * @return true if the process is being started - */ - public boolean isStarting() { - return (mState == ProcessState.STARTING); - } - - /** - * Checks whether the process is running. - * @return true if the process is running - */ - public boolean isRunning() { - return (mState == ProcessState.RUNNING); - } - - /** - * Checks whether some error has occurred and the process is stopped. - * @return true if some error has occurred and the process is stopped - */ - public boolean isInError() { - return (mState == ProcessState.ERROR); - } - - /** - * Performs the actual task. Subclasses must make sure that the method - * is blocked until the task is done or an error occurs. - */ - protected abstract void performTask() - throws IOException, InterruptedException; - - /** - * Sets the process state. - * @param state the new state to be in - */ - protected void setState(ProcessState state) { - mState = state; - } - - /** - * Makes the current thread sleep for the specified time. - * @param msec time to sleep in miliseconds - */ - protected void sleep(int msec) { - try { - Thread.currentThread().sleep(msec); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } -} diff --git a/packages/VpnServices/src/com/android/server/vpn/VpnService.java b/packages/VpnServices/src/com/android/server/vpn/VpnService.java index 87bd780..b107c7d 100644 --- a/packages/VpnServices/src/com/android/server/vpn/VpnService.java +++ b/packages/VpnServices/src/com/android/server/vpn/VpnService.java @@ -28,7 +28,11 @@ import android.text.TextUtils; import android.util.Log; import java.io.IOException; +import java.io.Serializable; +import java.net.DatagramSocket; +import java.net.Socket; import java.net.InetAddress; +import java.net.NetworkInterface; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; @@ -36,7 +40,9 @@ import java.util.List; /** * The service base class for managing a type of VPN connection. */ -abstract class VpnService<E extends VpnProfile> { +abstract class VpnService<E extends VpnProfile> implements Serializable { + protected static final long serialVersionUID = 1L; + private static final boolean DBG = true; private static final int NOTIFICATION_ID = 1; private static final String DNS1 = "net.dns1"; @@ -50,29 +56,34 @@ abstract class VpnService<E extends VpnProfile> { private static final String REMOTE_IP = "net.ipremote"; private static final String DNS_DOMAIN_SUFFICES = "net.dns.search"; + private static final int CHALLENGE_ERROR_CODE = 5; + private static final int REMOTE_HUNG_UP_ERROR_CODE = 7; + private static final int AUTH_ERROR_CODE = 51; + private final String TAG = VpnService.class.getSimpleName(); + // FIXME: profile is only needed in connecting phase, so we can just save + // the profile name and service class name for recovery E mProfile; - VpnServiceBinder mContext; + transient VpnServiceBinder mContext; private VpnState mState = VpnState.IDLE; - private boolean mInError; - private VpnConnectingError mError; + private Throwable mError; // connection settings private String mOriginalDns1; private String mOriginalDns2; - private String mVpnDns1 = ""; - private String mVpnDns2 = ""; private String mOriginalDomainSuffices; + private String mLocalIp; + private String mLocalIf; private long mStartTime; // VPN connection start time - // for helping managing multiple Android services - private ServiceHelper mServiceHelper = new ServiceHelper(); + // for helping managing multiple daemons + private DaemonHelper mDaemonHelper = new DaemonHelper(); // for helping showing, updating notification - private NotificationHelper mNotification = new NotificationHelper(); + private transient NotificationHelper mNotification; /** * Establishes a VPN connection with the specified username and password. @@ -80,19 +91,21 @@ abstract class VpnService<E extends VpnProfile> { protected abstract void connect(String serverIp, String username, String password) throws IOException; + protected abstract void stopPreviouslyRunDaemons(); + /** - * Tears down the VPN connection. The base class simply terminates all the - * Android services. A subclass may need to do some clean-up before that. + * Starts a VPN daemon. */ - protected void disconnect() { + protected DaemonProxy startDaemon(String daemonName) + throws IOException { + return mDaemonHelper.startDaemon(daemonName); } /** - * Starts an Android service defined in init.rc. + * Stops a VPN daemon. */ - protected AndroidServiceProxy startService(String serviceName) - throws IOException { - return mServiceHelper.startService(serviceName); + protected void stopDaemon(String daemonName) { + new DaemonProxy(daemonName).stop(); } /** @@ -109,31 +122,23 @@ abstract class VpnService<E extends VpnProfile> { return InetAddress.getByName(hostName).getHostAddress(); } - /** - * Sets the system property. The method is blocked until the value is - * settled in. - * @param name the name of the property - * @param value the value of the property - * @throws IOException if it fails to set the property within 2 seconds - */ - protected void setSystemProperty(String name, String value) - throws IOException { - SystemProperties.set(name, value); - for (int i = 0; i < 5; i++) { - String v = SystemProperties.get(name); - if (v.equals(value)) { - return; - } else { - Log.d(TAG, "sys_prop: wait for " + name + " to settle in"); - sleep(400); - } - } - throw new IOException("Failed to set system property: " + name); + void setContext(VpnServiceBinder context, E profile) { + mProfile = profile; + recover(context); } - void setContext(VpnServiceBinder context, E profile) { + void recover(VpnServiceBinder context) { mContext = context; - mProfile = profile; + mNotification = new NotificationHelper(); + + if (VpnState.CONNECTED.equals(mState)) { + Log.i("VpnService", " recovered: " + mProfile.getName()); + new Thread(new Runnable() { + public void run() { + enterConnectivityLoop(); + } + }).start(); + } } VpnState getState() { @@ -145,189 +150,161 @@ abstract class VpnService<E extends VpnProfile> { mState = VpnState.CONNECTING; broadcastConnectivity(VpnState.CONNECTING); + stopPreviouslyRunDaemons(); String serverIp = getIp(getProfile().getServerName()); - + saveLocalIpAndInterface(serverIp); onBeforeConnect(); connect(serverIp, username, password); waitUntilConnectedOrTimedout(); return true; } catch (Throwable e) { - Log.e(TAG, "onConnect()", e); - mError = newConnectingError(e); - onError(); + onError(e); return false; } } - synchronized void onDisconnect(boolean cleanUpServices) { + synchronized void onDisconnect() { try { - Log.d(TAG, " disconnecting VPN..."); + Log.i(TAG, "disconnecting VPN..."); mState = VpnState.DISCONNECTING; broadcastConnectivity(VpnState.DISCONNECTING); mNotification.showDisconnect(); - // subclass implementation - if (cleanUpServices) disconnect(); - - mServiceHelper.stop(); + mDaemonHelper.stopAll(); } catch (Throwable e) { Log.e(TAG, "onDisconnect()", e); + } finally { onFinalCleanUp(); } } - synchronized void onError() { + private void onError(Throwable error) { // error may occur during or after connection setup // and it may be due to one or all services gone - mInError = true; - switch (mState) { - case CONNECTED: - onDisconnect(true); - break; - - case CONNECTING: - onDisconnect(false); - break; + if (mError != null) { + Log.w(TAG, " multiple errors occur, record the last one: " + + error); } + Log.e(TAG, "onError()", error); + mError = error; + onDisconnect(); + } + + private void onError(int errorCode) { + onError(new VpnConnectingError(errorCode)); } - private void onBeforeConnect() { + + private void onBeforeConnect() throws IOException { mNotification.disableNotification(); - SystemProperties.set(VPN_DNS1, "-"); - SystemProperties.set(VPN_DNS2, "-"); + SystemProperties.set(VPN_DNS1, ""); + SystemProperties.set(VPN_DNS2, ""); SystemProperties.set(VPN_STATUS, VPN_IS_DOWN); - Log.d(TAG, " VPN UP: " + SystemProperties.get(VPN_STATUS)); + if (DBG) { + Log.d(TAG, " VPN UP: " + SystemProperties.get(VPN_STATUS)); + } } - private void waitUntilConnectedOrTimedout() { - // Run this in the background thread to not block UI - new Thread(new Runnable() { - public void run() { - sleep(2000); // 2 seconds - for (int i = 0; i < 60; i++) { - if (VPN_IS_UP.equals(SystemProperties.get(VPN_STATUS))) { - onConnected(); - return; - } else if (mState != VpnState.CONNECTING) { - break; - } - sleep(500); // 0.5 second - } + private void waitUntilConnectedOrTimedout() throws IOException { + sleep(2000); // 2 seconds + for (int i = 0; i < 60; i++) { + if (mState != VpnState.CONNECTING) { + break; + } else if (VPN_IS_UP.equals( + SystemProperties.get(VPN_STATUS))) { + onConnected(); + return; + } else if (mDaemonHelper.anySocketError()) { + return; + } + sleep(500); // 0.5 second + } - synchronized (VpnService.this) { - if (mState == VpnState.CONNECTING) { - Log.d(TAG, " connecting timed out !!"); - mError = newConnectingError( - new IOException("Connecting timed out")); - onError(); - } - } + synchronized (VpnService.this) { + if (mState == VpnState.CONNECTING) { + onError(new IOException("Connecting timed out")); } - }).start(); + } } - private synchronized void onConnected() { - Log.d(TAG, "onConnected()"); + private synchronized void onConnected() throws IOException { + if (DBG) Log.d(TAG, "onConnected()"); - saveVpnDnsProperties(); + mDaemonHelper.closeSockets(); + saveOriginalDns(); saveAndSetDomainSuffices(); - startConnectivityMonitor(); mState = VpnState.CONNECTED; + mStartTime = System.currentTimeMillis(); + + // set DNS after saving the states in case the process gets killed + // before states are saved + saveSelf(); + setVpnDns(); broadcastConnectivity(VpnState.CONNECTED); + + enterConnectivityLoop(); + } + + private void saveSelf() throws IOException { + mContext.saveStates(); } private synchronized void onFinalCleanUp() { - Log.d(TAG, "onFinalCleanUp()"); + if (DBG) Log.d(TAG, "onFinalCleanUp()"); if (mState == VpnState.IDLE) return; // keep the notification when error occurs - if (!mInError) mNotification.disableNotification(); + if (!anyError()) mNotification.disableNotification(); - restoreOriginalDnsProperties(); + restoreOriginalDns(); restoreOriginalDomainSuffices(); mState = VpnState.IDLE; broadcastConnectivity(VpnState.IDLE); // stop the service itself + mContext.removeStates(); mContext.stopSelf(); } - private VpnConnectingError newConnectingError(Throwable e) { - return new VpnConnectingError( - (e instanceof UnknownHostException) - ? VpnManager.VPN_ERROR_UNKNOWN_SERVER - : VpnManager.VPN_ERROR_CONNECTION_FAILED); - } - - private synchronized void onOneServiceGone() { - switch (mState) { - case IDLE: - case DISCONNECTING: - break; - - default: - onError(); - } + private boolean anyError() { + return (mError != null); } - private synchronized void onAllServicesGone() { - switch (mState) { - case IDLE: - break; - - case DISCONNECTING: - // daemons are gone; now clean up everything - onFinalCleanUp(); - break; - - default: - onError(); - } - } - - private void restoreOriginalDnsProperties() { + private void restoreOriginalDns() { // restore only if they are not overridden - if (mVpnDns1.equals(SystemProperties.get(DNS1))) { - Log.d(TAG, String.format("restore original dns prop: %s --> %s", + String vpnDns1 = SystemProperties.get(VPN_DNS1); + if (vpnDns1.equals(SystemProperties.get(DNS1))) { + Log.i(TAG, String.format("restore original dns prop: %s --> %s", SystemProperties.get(DNS1), mOriginalDns1)); - Log.d(TAG, String.format("restore original dns prop: %s --> %s", + Log.i(TAG, String.format("restore original dns prop: %s --> %s", SystemProperties.get(DNS2), mOriginalDns2)); SystemProperties.set(DNS1, mOriginalDns1); SystemProperties.set(DNS2, mOriginalDns2); } } - private void saveVpnDnsProperties() { - mOriginalDns1 = mOriginalDns2 = ""; - for (int i = 0; i < 5; i++) { - mVpnDns1 = SystemProperties.get(VPN_DNS1); - mVpnDns2 = SystemProperties.get(VPN_DNS2); - if (mOriginalDns1.equals(mVpnDns1)) { - Log.d(TAG, "wait for vpn dns to settle in..." + i); - sleep(200); - } else { - mOriginalDns1 = SystemProperties.get(DNS1); - mOriginalDns2 = SystemProperties.get(DNS2); - SystemProperties.set(DNS1, mVpnDns1); - SystemProperties.set(DNS2, mVpnDns2); - Log.d(TAG, String.format("save original dns prop: %s, %s", - mOriginalDns1, mOriginalDns2)); - Log.d(TAG, String.format("set vpn dns prop: %s, %s", - mVpnDns1, mVpnDns2)); - return; - } - } - Log.d(TAG, "saveVpnDnsProperties(): DNS not updated??"); - mOriginalDns1 = mVpnDns1 = SystemProperties.get(DNS1); - mOriginalDns2 = mVpnDns2 = SystemProperties.get(DNS2); + private void saveOriginalDns() { + mOriginalDns1 = SystemProperties.get(DNS1); + mOriginalDns2 = SystemProperties.get(DNS2); + Log.i(TAG, String.format("save original dns prop: %s, %s", + mOriginalDns1, mOriginalDns2)); + } + + private void setVpnDns() { + String vpnDns1 = SystemProperties.get(VPN_DNS1); + String vpnDns2 = SystemProperties.get(VPN_DNS2); + SystemProperties.set(DNS1, vpnDns1); + SystemProperties.set(DNS2, vpnDns2); + Log.i(TAG, String.format("set vpn dns prop: %s, %s", + vpnDns1, vpnDns2)); } private void saveAndSetDomainSuffices() { mOriginalDomainSuffices = SystemProperties.get(DNS_DOMAIN_SUFFICES); - Log.d(TAG, "save original dns search: " + mOriginalDomainSuffices); + Log.i(TAG, "save original suffices: " + mOriginalDomainSuffices); String list = mProfile.getDomainSuffices(); if (!TextUtils.isEmpty(list)) { SystemProperties.set(DNS_DOMAIN_SUFFICES, list); @@ -335,112 +312,174 @@ abstract class VpnService<E extends VpnProfile> { } private void restoreOriginalDomainSuffices() { - Log.d(TAG, "restore original dns search --> " + mOriginalDomainSuffices); + Log.i(TAG, "restore original suffices --> " + mOriginalDomainSuffices); SystemProperties.set(DNS_DOMAIN_SUFFICES, mOriginalDomainSuffices); } private void broadcastConnectivity(VpnState s) { VpnManager m = new VpnManager(mContext); - if ((s == VpnState.IDLE) && (mError != null)) { - m.broadcastConnectivity(mProfile.getName(), s, - mError.getErrorCode()); + Throwable err = mError; + if ((s == VpnState.IDLE) && (err != null)) { + if (err instanceof UnknownHostException) { + m.broadcastConnectivity(mProfile.getName(), s, + VpnManager.VPN_ERROR_UNKNOWN_SERVER); + } else if (err instanceof VpnConnectingError) { + m.broadcastConnectivity(mProfile.getName(), s, + ((VpnConnectingError) err).getErrorCode()); + } else { + m.broadcastConnectivity(mProfile.getName(), s, + VpnManager.VPN_ERROR_CONNECTION_FAILED); + } } else { m.broadcastConnectivity(mProfile.getName(), s); } } - private void startConnectivityMonitor() { - mStartTime = System.currentTimeMillis(); - - new Thread(new Runnable() { - public void run() { - Log.d(TAG, " +++++ connectivity monitor running"); - try { - for (;;) { - synchronized (VpnService.this) { - if (mState != VpnState.CONNECTED) break; - mNotification.update(); - checkConnectivity(); - VpnService.this.wait(1000); // 1 second - } + private void enterConnectivityLoop() { + Log.i(TAG, "VPN connectivity monitor running"); + try { + for (;;) { + synchronized (VpnService.this) { + if (mState != VpnState.CONNECTED || !checkConnectivity()) { + break; } - } catch (InterruptedException e) { - Log.e(TAG, "connectivity monitor", e); + mNotification.update(); + checkDns(); + VpnService.this.wait(1000); // 1 second } - Log.d(TAG, " ----- connectivity monitor stopped"); } - }).start(); + } catch (InterruptedException e) { + onError(e); + } + Log.i(TAG, "VPN connectivity monitor stopped"); } - private void checkConnectivity() { - checkDnsProperties(); + private void saveLocalIpAndInterface(String serverIp) throws IOException { + DatagramSocket s = new DatagramSocket(); + int port = 80; // arbitrary + s.connect(InetAddress.getByName(serverIp), port); + InetAddress localIp = s.getLocalAddress(); + mLocalIp = localIp.getHostAddress(); + NetworkInterface localIf = NetworkInterface.getByInetAddress(localIp); + mLocalIf = (localIf == null) ? null : localIf.getName(); + if (TextUtils.isEmpty(mLocalIf)) { + throw new IOException("Local interface is empty!"); + } + if (DBG) { + Log.d(TAG, " Local IP: " + mLocalIp + ", if: " + mLocalIf); + } } - private void checkDnsProperties() { + // returns false if vpn connectivity is broken + private boolean checkConnectivity() { + if (mDaemonHelper.anyDaemonStopped() || isLocalIpChanged()) { + onDisconnect(); + return false; + } else { + return true; + } + } + + private void checkDns() { String dns1 = SystemProperties.get(DNS1); - if (!mVpnDns1.equals(dns1)) { - Log.w(TAG, " dns being overridden by: " + dns1); - onError(); + String vpnDns1 = SystemProperties.get(VPN_DNS1); + if (!dns1.equals(vpnDns1) && dns1.equals(mOriginalDns1)) { + // dhcp expires? + setVpnDns(); } } - protected void sleep(int ms) { + private boolean isLocalIpChanged() { try { - Thread.currentThread().sleep(ms); - } catch (InterruptedException e) { + InetAddress localIp = InetAddress.getByName(mLocalIp); + NetworkInterface localIf = + NetworkInterface.getByInetAddress(localIp); + if (localIf == null || !mLocalIf.equals(localIf.getName())) { + Log.w(TAG, " local If changed from " + mLocalIf + + " to " + localIf); + return true; + } else { + return false; + } + } catch (IOException e) { + Log.w(TAG, "isLocalIpChanged()", e); + return true; } } - private InetAddress toInetAddress(int addr) throws IOException { - byte[] aa = new byte[4]; - for (int i= 0; i < aa.length; i++) { - aa[i] = (byte) (addr & 0x0FF); - addr >>= 8; + protected void sleep(int ms) { + try { + Thread.currentThread().sleep(ms); + } catch (InterruptedException e) { } - return InetAddress.getByAddress(aa); } - private class ServiceHelper implements ProcessProxy.Callback { - private List<AndroidServiceProxy> mServiceList = - new ArrayList<AndroidServiceProxy>(); + private class DaemonHelper implements Serializable { + private List<DaemonProxy> mDaemonList = + new ArrayList<DaemonProxy>(); - // starts an Android service - AndroidServiceProxy startService(String serviceName) + synchronized DaemonProxy startDaemon(String daemonName) throws IOException { - AndroidServiceProxy service = new AndroidServiceProxy(serviceName); - mServiceList.add(service); - service.start(this); - return service; + DaemonProxy daemon = new DaemonProxy(daemonName); + mDaemonList.add(daemon); + daemon.start(); + return daemon; } - // stops all the Android services - void stop() { - if (mServiceList.isEmpty()) { + synchronized void stopAll() { + if (mDaemonList.isEmpty()) { onFinalCleanUp(); } else { - for (AndroidServiceProxy s : mServiceList) s.stop(); + for (DaemonProxy s : mDaemonList) s.stop(); } } - //@Override - public void done(ProcessProxy p) { - Log.d(TAG, "service done: " + p.getName()); - commonCallback((AndroidServiceProxy) p); + synchronized void closeSockets() { + for (DaemonProxy s : mDaemonList) s.closeControlSocket(); } - //@Override - public void error(ProcessProxy p, Throwable e) { - Log.e(TAG, "service error: " + p.getName(), e); - if (e instanceof VpnConnectingError) { - mError = (VpnConnectingError) e; + synchronized boolean anyDaemonStopped() { + for (DaemonProxy s : mDaemonList) { + if (s.isStopped()) { + Log.w(TAG, " VPN daemon gone: " + s.getName()); + return true; + } + } + return false; + } + + private int getResultFromSocket(DaemonProxy s) { + try { + return s.getResultFromSocket(); + } catch (IOException e) { + return -1; } - commonCallback((AndroidServiceProxy) p); } - private void commonCallback(AndroidServiceProxy service) { - mServiceList.remove(service); - onOneServiceGone(); - if (mServiceList.isEmpty()) onAllServicesGone(); + synchronized boolean anySocketError() { + for (DaemonProxy s : mDaemonList) { + switch (getResultFromSocket(s)) { + case 0: + continue; + + case AUTH_ERROR_CODE: + onError(VpnManager.VPN_ERROR_AUTH); + return true; + + case CHALLENGE_ERROR_CODE: + onError(VpnManager.VPN_ERROR_CHALLENGE); + return true; + + case REMOTE_HUNG_UP_ERROR_CODE: + onError(VpnManager.VPN_ERROR_REMOTE_HUNG_UP); + return true; + + default: + onError(VpnManager.VPN_ERROR_CONNECTION_FAILED); + return true; + } + } + return false; } } diff --git a/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java b/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java index 32b8e51..4892a7b 100644 --- a/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java +++ b/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java @@ -27,15 +27,25 @@ import android.net.vpn.VpnManager; import android.net.vpn.VpnProfile; import android.net.vpn.VpnState; import android.os.IBinder; +import android.util.Log; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; /** * The service class for managing a VPN connection. It implements the * {@link IVpnService} binder interface. */ public class VpnServiceBinder extends Service { - private final String TAG = VpnServiceBinder.class.getSimpleName(); + private static final String TAG = VpnServiceBinder.class.getSimpleName(); + private static final boolean DBG = true; + + private static final String STATES_FILE_PATH = "/data/misc/vpn/.states"; // The actual implementation is delegated to the VpnService class. private VpnService<? extends VpnProfile> mService; @@ -46,7 +56,7 @@ public class VpnServiceBinder extends Service { } public void disconnect() { - if (mService != null) mService.onDisconnect(true); + VpnServiceBinder.this.disconnect(); } public void checkStatus(VpnProfile p) { @@ -54,21 +64,61 @@ public class VpnServiceBinder extends Service { } }; - public void onStart (Intent intent, int startId) { + @Override + public void onCreate() { + super.onCreate(); + checkSavedStates(); + } + + + @Override + public void onStart(Intent intent, int startId) { super.onStart(intent, startId); - setForeground(true); - android.util.Log.d("VpnServiceBinder", "becomes a foreground service"); } + @Override public IBinder onBind(Intent intent) { return mBinder; } - private synchronized boolean connect( - VpnProfile p, String username, String password) { + void saveStates() throws IOException { + if (DBG) Log.d("VpnServiceBinder", " saving states"); + ObjectOutputStream oos = + new ObjectOutputStream(new FileOutputStream(STATES_FILE_PATH)); + oos.writeObject(mService); + oos.close(); + } + + void removeStates() { + try { + new File(STATES_FILE_PATH).delete(); + } catch (Throwable e) { + if (DBG) Log.d("VpnServiceBinder", " remove states: " + e); + } + } + + private synchronized boolean connect(final VpnProfile p, + final String username, final String password) { if (mService != null) return false; - mService = createService(p); - return mService.onConnect(username, password); + final VpnService s = mService = createService(p); + + new Thread(new Runnable() { + public void run() { + s.onConnect(username, password); + } + }).start(); + return true; + } + + private synchronized void disconnect() { + if (mService == null) return; + final VpnService s = mService; + + new Thread(new Runnable() { + public void run() { + s.onDisconnect(); + } + }).start(); } private synchronized void checkStatus(VpnProfile p) { @@ -80,6 +130,21 @@ public class VpnServiceBinder extends Service { } } + private void checkSavedStates() { + try { + ObjectInputStream ois = new ObjectInputStream(new FileInputStream( + STATES_FILE_PATH)); + mService = (VpnService<? extends VpnProfile>) ois.readObject(); + mService.recover(this); + ois.close(); + } catch (FileNotFoundException e) { + // do nothing + } catch (Throwable e) { + Log.i("VpnServiceBinder", "recovery error, remove states: " + e); + removeStates(); + } + } + private VpnService<? extends VpnProfile> createService(VpnProfile p) { switch (p.getType()) { case L2TP: diff --git a/services/java/com/android/server/AccessibilityManagerService.java b/services/java/com/android/server/AccessibilityManagerService.java index c205fc0..55007ba 100644 --- a/services/java/com/android/server/AccessibilityManagerService.java +++ b/services/java/com/android/server/AccessibilityManagerService.java @@ -323,15 +323,22 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub */ private void notifyAccessibilityServicesDelayedLocked(AccessibilityEvent event, boolean isDefault) { - for (int i = 0, count = mServices.size(); i < count; i++) { - Service service = mServices.get(i); + try { + for (int i = 0, count = mServices.size(); i < count; i++) { + Service service = mServices.get(i); - if (service.mIsDefault == isDefault) { - if (canDispathEventLocked(service, event, mHandledFeedbackTypes)) { - mHandledFeedbackTypes |= service.mFeedbackType; - notifyAccessibilityServiceDelayedLocked(service, event); + if (service.mIsDefault == isDefault) { + if (canDispathEventLocked(service, event, mHandledFeedbackTypes)) { + mHandledFeedbackTypes |= service.mFeedbackType; + notifyAccessibilityServiceDelayedLocked(service, event); + } } } + } catch (IndexOutOfBoundsException oobe) { + // An out of bounds exception can happen if services are going away + // as the for loop is running. If that happens, just bail because + // there are no more services to notify. + return; } } @@ -368,6 +375,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub * @param event The event. */ private void tryRecycleLocked(AccessibilityEvent event) { + if (event == null) { + return; + } int eventType = event.getEventType(); List<Service> services = mServices; @@ -378,7 +388,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return; } } - event.recycle(); } diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java index 38fb7c9..aac7124 100644 --- a/services/java/com/android/server/NotificationManagerService.java +++ b/services/java/com/android/server/NotificationManagerService.java @@ -90,7 +90,7 @@ class NotificationManagerService extends INotificationManager.Stub private NotificationRecord mSoundNotification; private AsyncPlayer mSound; private boolean mSystemReady; - private int mDisabledNotifications = StatusBarManager.DISABLE_NOTIFICATION_ALERTS; + private int mDisabledNotifications; private NotificationRecord mVibrateNotification; private Vibrator mVibrator = new Vibrator(); @@ -368,6 +368,15 @@ class NotificationManagerService extends INotificationManager.Stub mStatusBarService = statusBar; statusBar.setNotificationCallbacks(mNotificationCallbacks); + // Don't start allowing notifications until the setup wizard has run once. + // After that, including subsequent boots, init with notifications turned on. + // This works on the first boot because the setup wizard will toggle this + // flag at least once and we'll go back to 0 after that. + if (0 == Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.DEVICE_PROVISIONED, 0)) { + mDisabledNotifications = StatusBarManager.DISABLE_NOTIFICATION_ALERTS; + } + // register for battery changed notifications IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); @@ -1049,6 +1058,8 @@ class NotificationManagerService extends INotificationManager.Stub pw.println(" mSoundNotification=" + mSoundNotification); pw.println(" mSound=" + mSound); pw.println(" mVibrateNotification=" + mVibrateNotification); + pw.println(" mDisabledNotifications=0x" + Integer.toHexString(mDisabledNotifications)); + pw.println(" mSystemReady=" + mSystemReady); } } } diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index ee53274..bd79d1d 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -60,7 +60,6 @@ import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Bundle; -import android.os.Debug; import android.os.HandlerThread; import android.os.Parcel; import android.os.RemoteException; @@ -495,7 +494,7 @@ class PackageManagerService extends IPackageManager.Stub { mDrmAppInstallObserver = new AppDirObserver( mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false); mDrmAppInstallObserver.startWatching(); - scanDirLI(mDrmAppPrivateInstallDir, 0, scanMode); + scanDirLI(mDrmAppPrivateInstallDir, 0, scanMode | SCAN_FORWARD_LOCKED); EventLog.writeEvent(LOG_BOOT_PROGRESS_PMS_SCAN_END, SystemClock.uptimeMillis()); @@ -1764,7 +1763,12 @@ class PackageManagerService extends IPackageManager.Stub { int i; for (i=0; i<files.length; i++) { File file = new File(dir, files[i]); - PackageParser.Package pkg = scanPackageLI(file, file, file, + File resFile = file; + // Pick up the resource path from settings for fwd locked apps + if ((scanMode & SCAN_FORWARD_LOCKED) != 0) { + resFile = null; + } + PackageParser.Package pkg = scanPackageLI(file, file, resFile, flags|PackageParser.PARSE_MUST_BE_APK, scanMode); } } @@ -1826,6 +1830,11 @@ class PackageManagerService extends IPackageManager.Stub { ps = mSettings.peekPackageLP(pkg.packageName); updatedPkg = mSettings.mDisabledSysPackages.get(pkg.packageName); } + // Verify certificates first + if (!collectCertificatesLI(pp, ps, pkg, scanFile, parseFlags)) { + Log.i(TAG, "Failed verifying certificates for package:" + pkg.packageName); + return null; + } if (updatedPkg != null) { // An updated system app will not have the PARSE_IS_SYSTEM flag set initially parseFlags |= PackageParser.PARSE_IS_SYSTEM; @@ -1843,23 +1852,30 @@ class PackageManagerService extends IPackageManager.Stub { return null; } else { // Delete the older apk pointed to by ps + // At this point, its safely assumed that package installation for + // apps in system partition will go through. If not there won't be a working + // version of the app + synchronized (mPackages) { + // Just remove the loaded entries from package lists. + mPackages.remove(ps.name); + } deletePackageResourcesLI(ps.name, ps.codePathString, ps.resourcePathString); mSettings.enableSystemPackageLP(ps.name); } } } } - if (!collectCertificatesLI(pp, ps, pkg, scanFile, parseFlags)) { - Log.i(TAG, "Failed verifying certificates for package:" + pkg.packageName); - return null; - } // The apk is forward locked (not public) if its code and resources // are kept in different files. if (ps != null && !ps.codePath.equals(ps.resourcePath)) { scanMode |= SCAN_FORWARD_LOCKED; } + File resFile = destResourceFile; + if ((scanMode & SCAN_FORWARD_LOCKED) != 0) { + resFile = getFwdLockedResource(ps.name); + } // Note that we invoke the following method only if we are about to unpack an application - return scanPackageLI(scanFile, destCodeFile, destResourceFile, + return scanPackageLI(scanFile, destCodeFile, resFile, pkg, parseFlags, scanMode | SCAN_UPDATE_SIGNATURE); } @@ -2132,7 +2148,7 @@ class PackageManagerService extends IPackageManager.Stub { pkg.applicationInfo.packageName, pkg.applicationInfo.processName, pkg.applicationInfo.uid); - pkg.applicationInfo.publicSourceDir = pkgSetting.resourcePathString; + pkg.applicationInfo.publicSourceDir = destResourceFile.toString(); File dataPath; if (mPlatformPackage == pkg) { @@ -2259,15 +2275,26 @@ class PackageManagerService extends IPackageManager.Stub { pkg.applicationInfo.flags |= ApplicationInfo.FLAG_FACTORY_TEST; } + // We don't expect installation to fail beyond this point, if ((scanMode&SCAN_MONITOR) != 0) { pkg.mPath = destCodeFile.getAbsolutePath(); mAppDirs.put(pkg.mPath, pkg); } + // Request the ActivityManager to kill the process(only for existing packages) + // so that we do not end up in a confused state while the user is still using the older + // version of the application while the new one gets installed. + IActivityManager am = ActivityManagerNative.getDefault(); + if ((am != null) && ((parseFlags & PackageManager.INSTALL_REPLACE_EXISTING ) != 0)) { + try { + am.killApplicationWithUid(pkg.applicationInfo.packageName, + pkg.applicationInfo.uid); + } catch (RemoteException e) { + } + } synchronized (mPackages) { - // We don't expect installation to fail beyond this point // Add the new setting to mSettings - mSettings.insertPackageSettingLP(pkgSetting, pkg.packageName, suid); + mSettings.insertPackageSettingLP(pkgSetting, pkg, destCodeFile, destResourceFile); // Add the new setting to mPackages mPackages.put(pkg.applicationInfo.packageName, pkg); int N = pkg.providers.size(); @@ -2955,7 +2982,8 @@ class PackageManagerService extends IPackageManager.Stub { } if ((addedPermission || replace) && !ps.permissionsFixed && - (ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) { + ((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) || + ((ps.pkgFlags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0)){ // This is the first that we have heard about this package, so the // permissions we have now selected are fixed until explicitly // changed. @@ -3789,6 +3817,11 @@ class PackageManagerService extends IPackageManager.Stub { } } + private File getFwdLockedResource(String pkgName) { + final String publicZipFileName = pkgName + ".zip"; + return new File(mAppInstallDir, publicZipFileName); + } + private PackageInstalledInfo installPackageLI(Uri pPackageURI, int pFlags, boolean newInstall, String installerPackageName) { File tmpPackageFile = null; @@ -3868,8 +3901,7 @@ class PackageManagerService extends IPackageManager.Stub { final String destFilePath = destPackageFile.getAbsolutePath(); File destResourceFile; if ((pFlags&PackageManager.INSTALL_FORWARD_LOCK) != 0) { - final String publicZipFileName = pkgName + ".zip"; - destResourceFile = new File(mAppInstallDir, publicZipFileName); + destResourceFile = getFwdLockedResource(pkgName); forwardLocked = true; } else { destResourceFile = destPackageFile; @@ -4156,7 +4188,9 @@ class PackageManagerService extends IPackageManager.Stub { private void removePackageDataLI(PackageParser.Package p, PackageRemovedInfo outInfo, int flags) { String packageName = p.packageName; - outInfo.removedPackage = packageName; + if (outInfo != null) { + outInfo.removedPackage = packageName; + } removePackageLI(p, true); // Retrieve object to delete permissions for shared user later on PackageSetting deletedPs; @@ -4178,7 +4212,9 @@ class PackageManagerService extends IPackageManager.Stub { dataDir.delete(); } synchronized (mPackages) { - outInfo.removedUid = mSettings.removePackageLP(packageName); + if (outInfo != null) { + outInfo.removedUid = mSettings.removePackageLP(packageName); + } } } synchronized (mPackages) { @@ -4253,7 +4289,7 @@ class PackageManagerService extends IPackageManager.Stub { } return true; } - + private void deletePackageResourcesLI(String packageName, String sourceDir, String publicSourceDir) { File sourceFile = new File(sourceDir); @@ -4283,7 +4319,9 @@ class PackageManagerService extends IPackageManager.Stub { Log.w(TAG, "Package " + p.packageName + " has no applicationInfo."); return false; } - outInfo.uid = applicationInfo.uid; + if (outInfo != null) { + outInfo.uid = applicationInfo.uid; + } // Delete package data from internal structures and also remove data if flag is set removePackageDataLI(p, outInfo, flags); @@ -4902,26 +4940,40 @@ class PackageManagerService extends IPackageManager.Stub { if (ps.pkg != null) { pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir); pw.print(" targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion); - pw.print(" densities="); pw.println(ps.pkg.supportsDensityList); - ArrayList<String> screens = new ArrayList<String>(); + pw.print(" supportsScreens=["); + boolean first = true; if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) { - screens.add("medium"); + if (!first) pw.print(", "); + first = false; + pw.print("medium"); } if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) { - screens.add("large"); + if (!first) pw.print(", "); + first = false; + pw.print("large"); } if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) { - screens.add("small,"); + if (!first) pw.print(", "); + first = false; + pw.print("small"); } if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) { - screens.add("resizeable,"); + if (!first) pw.print(", "); + first = false; + pw.print("resizeable"); + } + if ((ps.pkg.applicationInfo.flags & + ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) { + if (!first) pw.print(", "); + first = false; + pw.print("anyDensity"); } - pw.print(" supportsScreens="); pw.println(screens); } + pw.println("]"); pw.print(" timeStamp="); pw.println(ps.getTimeStampStr()); pw.print(" signatures="); pw.println(ps.signatures); pw.print(" permissionsFixed="); pw.print(ps.permissionsFixed); @@ -5446,7 +5498,7 @@ class PackageManagerService extends IPackageManager.Stub { String resourcePathString; private long timeStamp; private String timeStampString = "0"; - final int versionCode; + int versionCode; PackageSignatures signatures = new PackageSignatures(); @@ -5684,10 +5736,6 @@ class PackageManagerService extends IPackageManager.Stub { final String name = pkg.packageName; PackageSetting p = getPackageLP(name, sharedUser, codePath, resourcePath, pkg.mVersionCode, pkgFlags, create, add); - - if (p != null) { - p.pkg = pkg; - } return p; } @@ -5835,22 +5883,18 @@ class PackageManagerService extends IPackageManager.Stub { if (p != null) { if (!p.codePath.equals(codePath)) { // Check to see if its a disabled system app - PackageSetting ps = mDisabledSysPackages.get(name); - if((ps != null) && ((ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0)) { + if((p != null) && ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0)) { // This is an updated system app with versions in both system // and data partition. Just let the most recent version // take precedence. - return p; + Log.w(TAG, "Trying to update system app code path from " + + p.codePathString + " to " + codePath.toString()); } else { // Let the app continue with previous uid if code path changes. reportSettingsProblem(Log.WARN, "Package " + name + " codePath changed from " + p.codePath + " to " + codePath + "; Retaining data and using new code from " + codePath); - p.codePath = codePath; - p.resourcePath = resourcePath; - p.codePathString = codePath.toString(); - p.resourcePathString = resourcePath.toString(); } } else if (p.sharedUser != sharedUser) { reportSettingsProblem(Log.WARN, @@ -5874,8 +5918,29 @@ class PackageManagerService extends IPackageManager.Stub { if (sharedUser != null) { p.userId = sharedUser.userId; } else if (MULTIPLE_APPLICATION_UIDS) { - // Assign new user id - p.userId = newUserIdLP(p); + // Clone the setting here for disabled system packages + PackageSetting dis = mDisabledSysPackages.get(name); + if (dis != null) { + // For disabled packages a new setting is created + // from the existing user id. This still has to be + // added to list of user id's + // Copy signatures from previous setting + if (dis.signatures.mSignatures != null) { + p.signatures.mSignatures = dis.signatures.mSignatures.clone(); + } + p.userId = dis.userId; + // Clone permissions + p.grantedPermissions = new HashSet<String>(dis.grantedPermissions); + p.loadedPermissions = new HashSet<String>(dis.loadedPermissions); + // Clone component info + p.disabledComponents = new HashSet<String>(dis.disabledComponents); + p.enabledComponents = new HashSet<String>(dis.enabledComponents); + // Add new setting to list of user ids + addUserIdLP(p.userId, p, name); + } else { + // Assign new user id + p.userId = newUserIdLP(p); + } } else { p.userId = FIRST_APPLICATION_UID; } @@ -5887,15 +5952,39 @@ class PackageManagerService extends IPackageManager.Stub { if (add) { // Finish adding new package by adding it and updating shared // user preferences - insertPackageSettingLP(p, name, sharedUser); + addPackageSettingLP(p, name, sharedUser); } } return p; } - + + private void insertPackageSettingLP(PackageSetting p, PackageParser.Package pkg, + File codePath, File resourcePath) { + p.pkg = pkg; + // Update code path if needed + if (!codePath.toString().equalsIgnoreCase(p.codePathString)) { + Log.w(TAG, "Code path for pkg : " + p.pkg.packageName + + " changing form " + p.codePathString + " to " + codePath); + p.codePath = codePath; + p.codePathString = codePath.toString(); + } + //Update resource path if needed + if (!resourcePath.toString().equalsIgnoreCase(p.resourcePathString)) { + Log.w(TAG, "Resource path for pkg : " + p.pkg.packageName + + " changing form " + p.resourcePathString + " to " + resourcePath); + p.resourcePath = resourcePath; + p.resourcePathString = resourcePath.toString(); + } + // Update version code if needed + if (pkg.mVersionCode != p.versionCode) { + p.versionCode = pkg.mVersionCode; + } + addPackageSettingLP(p, pkg.packageName, p.sharedUser); + } + // Utility method that adds a PackageSetting to mPackages and // completes updating the shared user attributes - private void insertPackageSettingLP(PackageSetting p, String name, + private void addPackageSettingLP(PackageSetting p, String name, SharedUserSetting sharedUser) { mPackages.put(name, p); if (sharedUser != null) { @@ -5988,7 +6077,7 @@ class PackageManagerService extends IPackageManager.Stub { } if (mUserIds.get(index) != null) { reportSettingsProblem(Log.ERROR, - "Adding duplicate shared id: " + uid + "Adding duplicate user id: " + uid + " name=" + name); return false; } diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java index b4754b6..394ed3a 100644 --- a/services/java/com/android/server/WifiService.java +++ b/services/java/com/android/server/WifiService.java @@ -1075,6 +1075,17 @@ public class WifiService extends IWifiManager.Stub { break setVariables; } + if ((config.phase2 != null) && !WifiNative.setNetworkVariableCommand( + netId, + WifiConfiguration.phase2VarName, + config.phase2)) { + if (DBG) { + Log.d(TAG, config.SSID + ": failed to set phase2: "+ + config.phase2); + } + break setVariables; + } + if ((config.identity != null) && !WifiNative.setNetworkVariableCommand( netId, WifiConfiguration.identityVarName, diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index 0be8417..5a02c4d 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -6837,6 +6837,10 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo pw.print(mOrientationChanging); pw.print(" mAppFreezing="); pw.println(mAppFreezing); } + if (mHScale != 1 || mVScale != 1) { + pw.print(prefix); pw.print("mHScale="); pw.print(mHScale); + pw.print(" mVScale="); pw.println(mVScale); + } } @Override @@ -8175,7 +8179,9 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo // This has changed the visibility of windows, so perform // a new layout to get them all up-to-date. mLayoutNeeded = true; - moveInputMethodWindowsIfNeededLocked(true); + if (!moveInputMethodWindowsIfNeededLocked(true)) { + assignLayersLocked(); + } performLayoutLockedInner(); updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES); diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index d9c40ec..51ee41a 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -184,8 +184,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen static final int LOG_BOOT_PROGRESS_ENABLE_SCREEN = 3050; // The flags that are set for all calls we make to the package manager. - static final int STOCK_PM_FLAGS = PackageManager.GET_SHARED_LIBRARY_FILES - | PackageManager.GET_SUPPORTS_DENSITIES; + static final int STOCK_PM_FLAGS = PackageManager.GET_SHARED_LIBRARY_FILES; private static final String SYSTEM_SECURE = "ro.secure"; @@ -724,6 +723,11 @@ public final class ActivityManagerService extends ActivityManagerNative implemen Configuration mConfiguration = new Configuration(); /** + * Hardware-reported OpenGLES version. + */ + final int GL_ES_VERSION; + + /** * List of initialization arguments to pass to all processes when binding applications to them. * For example, references to the commonly used services. */ @@ -1396,6 +1400,9 @@ public final class ActivityManagerService extends ActivityManagerNative implemen mUsageStatsService = new UsageStatsService( new File( systemDir, "usagestats").toString()); + GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version", + ConfigurationInfo.GL_ES_VERSION_UNDEFINED); + mConfiguration.makeDefault(); mProcessStats.init(); @@ -4729,6 +4736,57 @@ public final class ActivityManagerService extends ActivityManagerNative implemen Binder.restoreCallingIdentity(callingId); } } + + /* + * The pkg name and uid have to be specified. + * @see android.app.IActivityManager#killApplicationWithUid(java.lang.String, int) + */ + public void killApplicationWithUid(String pkg, int uid) { + if (pkg == null) { + return; + } + // Make sure the uid is valid. + if (uid < 0) { + Log.w(TAG, "Invalid uid specified for pkg : " + pkg); + return; + } + int callerUid = Binder.getCallingUid(); + // Only the system server can kill an application + if (callerUid == Process.SYSTEM_UID) { + uninstallPackageLocked(pkg, uid, false); + } else { + throw new SecurityException(callerUid + " cannot kill pkg: " + + pkg); + } + } + + public void closeSystemDialogs(String reason) { + Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); + if (reason != null) { + intent.putExtra("reason", reason); + } + + final int uid = Binder.getCallingUid(); + final long origId = Binder.clearCallingIdentity(); + synchronized (this) { + int i = mWatchers.beginBroadcast(); + while (i > 0) { + i--; + IActivityWatcher w = mWatchers.getBroadcastItem(i); + if (w != null) { + try { + w.closingSystemDialogs(reason); + } catch (RemoteException e) { + } + } + } + mWatchers.finishBroadcast(); + + broadcastIntentLocked(null, null, intent, null, + null, 0, null, null, null, false, false, -1, uid); + } + Binder.restoreCallingIdentity(origId); + } private void restartPackageLocked(final String packageName, int uid) { uninstallPackageLocked(packageName, uid, false); @@ -11847,6 +11905,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen && mConfiguration.keyboard != Configuration.KEYBOARD_NOKEYS) { config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD; } + config.reqGlEsVersion = GL_ES_VERSION; } return config; } diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java index 890f930..82539fb 100644 --- a/telephony/java/android/telephony/SmsManager.java +++ b/telephony/java/android/telephony/SmsManager.java @@ -40,7 +40,6 @@ import java.util.List; /** * Manages SMS operations such as sending data, text, and pdu SMS messages. * Get this object by calling the static method SmsManager.getDefault(). - * @hide */ public final class SmsManager { private static SmsManager sInstance; @@ -202,6 +201,8 @@ public final class SmsManager { /** * Send a raw SMS PDU. + * A PDU is a protocol data unit. It contains the message and the + * associated meta information. * * @param smsc the SMSC to send the message through, or NULL for the * default SMSC @@ -219,8 +220,6 @@ public final class SmsManager { * @param deliveryIntent if not NULL this <code>PendingIntent</code> is * broadcast when the message is delivered to the recipient. The * raw pdu of the status report is in the extended data ("pdu"). - * - * @hide */ private void sendRawPdu(byte[] smsc, byte[] pdu, PendingIntent sentIntent, PendingIntent deliveryIntent) { @@ -252,6 +251,8 @@ public final class SmsManager { /** * Copy a raw SMS PDU to the ICC. + * ICC (Integrated Circuit Card) is the card of the device. + * For example, this can be the SIM or USIM for GSM. * * @param smsc the SMSC for this message, or NULL for the default SMSC * @param pdu the raw PDU to store @@ -278,6 +279,8 @@ public final class SmsManager { /** * Delete the specified message from the ICC. + * ICC (Integrated Circuit Card) is the card of the device. + * For example, this can be the SIM or USIM for GSM. * * @param messageIndex is the record index of the message on ICC * @return true for success @@ -304,6 +307,8 @@ public final class SmsManager { /** * Update the specified message on the ICC. + * ICC (Integrated Circuit Card) is the card of the device. + * For example, this can be the SIM or USIM for GSM. * * @param messageIndex record index of message to update * @param newStatus new message status (STATUS_ON_ICC_READ, @@ -331,6 +336,8 @@ public final class SmsManager { /** * Retrieves all messages currently stored on ICC. + * ICC (Integrated Circuit Card) is the card of the device. + * For example, this can be the SIM or USIM for GSM. * * @return <code>ArrayList</code> of <code>SmsMessage</code> objects * @@ -359,12 +366,12 @@ public final class SmsManager { * <code>getAllMessagesFromIcc</code> * @return <code>ArrayList</code> of <code>SmsMessage</code> objects. */ - private ArrayList<SmsMessage> createMessageListFromRawRecords(List records) { + private ArrayList<SmsMessage> createMessageListFromRawRecords(List<SmsRawData> records) { ArrayList<SmsMessage> messages = new ArrayList<SmsMessage>(); if (records != null) { int count = records.size(); for (int i = 0; i < count; i++) { - SmsRawData data = (SmsRawData)records.get(i); + SmsRawData data = records.get(i); // List contains all records, including "free" records (null) if (data != null) { SmsMessage sms = SmsMessage.createFromEfRecord(i+1, data.getBytes()); diff --git a/telephony/java/android/telephony/SmsMessage.java b/telephony/java/android/telephony/SmsMessage.java index 775b034..0617dad 100644 --- a/telephony/java/android/telephony/SmsMessage.java +++ b/telephony/java/android/telephony/SmsMessage.java @@ -28,13 +28,13 @@ import com.android.internal.telephony.SmsMessageBase.TextEncodingDetails; import java.lang.Math; import java.util.ArrayList; +import java.util.Arrays; import static android.telephony.TelephonyManager.PHONE_TYPE_CDMA; /** * A Short Message Service message. - * @hide */ public class SmsMessage { private static final boolean LOCAL_DEBUG = true; @@ -49,18 +49,6 @@ public class SmsMessage { UNKNOWN, CLASS_0, CLASS_1, CLASS_2, CLASS_3; } - /** - * TODO(cleanup): given that we now have more than one possible - * 7bit encoding, this result starts to look rather vague and - * maybe confusing... If this is just an indication of code unit - * size, maybe that is no problem. Otherwise, should we try to - * create an aggregate collection of GSM and CDMA encodings? CDMA - * contains a superset of the encodings we use (it does not - * support 8-bit GSM, but we also do not use that encoding - * currently)... We could get rid of these and directly reference - * the CDMA encoding definitions... - */ - /** User data text encoding code unit size */ public static final int ENCODING_UNKNOWN = 0; public static final int ENCODING_7BIT = 1; @@ -71,24 +59,9 @@ public class SmsMessage { public static final int MAX_USER_DATA_BYTES = 140; /** - * TODO(cleanup): It would be more flexible and less fragile to - * rewrite this (meaning get rid of the following constant) such - * that an actual UDH is taken into consideration (meaning its - * length is measured), allowing for messages that actually - * contain other UDH fields... Hence it is actually a shame to - * extend the API with this constant. If necessary, maybe define - * the size of such a header and let the math for calculating - * max_octets/septets be done elsewhere. And, while I am griping, - * if we use the word septet, we should use the word octet in - * corresponding places, not byte... - */ - - /** * The maximum number of payload bytes per message if a user data header * is present. This assumes the header only contains the * CONCATENATED_8_BIT_REFERENCE element. - * - * @hide pending API Council approval to extend the public API */ public static final int MAX_USER_DATA_BYTES_WITH_HEADER = 134; @@ -103,17 +76,26 @@ public class SmsMessage { public static final int MAX_USER_DATA_SEPTETS_WITH_HEADER = 153; /** Contains actual SmsMessage. Only public for debugging and for framework layer. - * {@hide} - */ + * + * @hide + */ public SmsMessageBase mWrappedSmsMessage; - public static class SubmitPdu extends SubmitPduBase { + public static class SubmitPdu { - //Constructor - public SubmitPdu() { + public byte[] encodedScAddress; // Null if not applicable. + public byte[] encodedMessage; + + public String toString() { + return "SubmitPdu: encodedScAddress = " + + Arrays.toString(encodedScAddress) + + ", encodedMessage = " + + Arrays.toString(encodedMessage); } - /* {@hide} */ + /** + * @hide + */ protected SubmitPdu(SubmitPduBase spb) { this.encodedMessage = spb.encodedMessage; this.encodedScAddress = spb.encodedScAddress; @@ -121,7 +103,11 @@ public class SmsMessage { } - // Constructor + /** + * Constructor + * + * @hide + */ public SmsMessage() { this(getSmsFacility()); } @@ -278,8 +264,8 @@ public class SmsMessage { public static int[] calculateLength(CharSequence msgBody, boolean use7bitOnly) { int activePhone = TelephonyManager.getDefault().getPhoneType(); TextEncodingDetails ted = (PHONE_TYPE_CDMA == activePhone) ? - com.android.internal.telephony.gsm.SmsMessage.calculateLength(msgBody, use7bitOnly) : - com.android.internal.telephony.cdma.SmsMessage.calculateLength(msgBody, use7bitOnly); + com.android.internal.telephony.cdma.SmsMessage.calculateLength(msgBody, use7bitOnly) : + com.android.internal.telephony.gsm.SmsMessage.calculateLength(msgBody, use7bitOnly); int ret[] = new int[4]; ret[0] = ted.msgCount; ret[1] = ted.codeUnitCount; @@ -295,12 +281,14 @@ public class SmsMessage { * @param text text, must not be null. * @return an <code>ArrayList</code> of strings that, in order, * comprise the original msg text + * + * @hide */ public static ArrayList<String> fragmentText(String text) { int activePhone = TelephonyManager.getDefault().getPhoneType(); TextEncodingDetails ted = (PHONE_TYPE_CDMA == activePhone) ? - com.android.internal.telephony.gsm.SmsMessage.calculateLength(text, false) : - com.android.internal.telephony.cdma.SmsMessage.calculateLength(text, false); + com.android.internal.telephony.cdma.SmsMessage.calculateLength(text, false) : + com.android.internal.telephony.gsm.SmsMessage.calculateLength(text, false); // TODO(cleanup): The code here could be rolled into the logic // below cleanly if these MAX_* constants were defined more @@ -321,11 +309,8 @@ public class SmsMessage { while (pos < textLen) { int nextPos = 0; // Counts code units. if (ted.codeUnitSize == ENCODING_7BIT) { - if (PHONE_TYPE_CDMA == activePhone) { - nextPos = pos + Math.min(limit, textLen - pos); - } else { - nextPos = GsmAlphabet.findGsmSeptetLimitIndex(text, pos, limit); - } + // For multi-segment messages, CDMA 7bit equals GSM 7bit encoding (EMS mode). + nextPos = GsmAlphabet.findGsmSeptetLimitIndex(text, pos, limit); } else { // Assume unicode. nextPos = pos + Math.min(limit / 2, textLen - pos); } @@ -346,10 +331,11 @@ public class SmsMessage { * current encoding. * * @param messageBody the message to encode - * @param use7bitOnly if true, characters that are not part of the GSM - * alphabet are counted as a single space char. If false, a - * messageBody containing non-GSM alphabet characters is calculated - * for 16-bit encoding. + * @param use7bitOnly if true, characters that are not part of the radio + * specific (GSM / CDMA) alphabet encoding are converted to as a + * single space characters. If false, a messageBody containing + * non-GSM or non-CDMA alphabet characters are encoded using + * 16-bit encoding. * @return an int[4] with int[0] being the number of SMS's required, int[1] * the number of code units used, and int[2] is the number of code * units remaining until the next message. int[3] is the encoding @@ -691,6 +677,8 @@ public class SmsMessage { /** This method returns the reference to a specific * SmsMessage object, which is used for accessing its static methods. * @return Specific SmsMessage. + * + * @hide */ private static final SmsMessageBase getSmsFacility(){ int activePhone = TelephonyManager.getDefault().getPhoneType(); diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index ba5c6e7..ed9af66 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -256,7 +256,7 @@ public class TelephonyManager { * No phone module * */ - public static final int PHONE_TYPE_NONE = 0; + public static final int PHONE_TYPE_NONE = RILConstants.NO_PHONE; /** * GSM phone diff --git a/telephony/java/android/telephony/gsm/SmsManager.java b/telephony/java/android/telephony/gsm/SmsManager.java index cdd707e..241c485 100644 --- a/telephony/java/android/telephony/gsm/SmsManager.java +++ b/telephony/java/android/telephony/gsm/SmsManager.java @@ -43,6 +43,7 @@ import java.util.ArrayList; return sInstance; } + @Deprecated private SmsManager() { mSmsMgrProxy = android.telephony.SmsManager.getDefault(); } diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java index 7834018..0763e63 100644 --- a/telephony/java/com/android/internal/telephony/RILConstants.java +++ b/telephony/java/com/android/internal/telephony/RILConstants.java @@ -68,8 +68,9 @@ public interface RILConstants { int CDMA_CELL_BROADCAST_SMS_DISABLED = 1; int CDMA_CELL_BROADCAST_SMS_ENABLED = 0; - int CDMA_PHONE = 0; + int NO_PHONE = 0; int GSM_PHONE = 1; + int CDMA_PHONE = 2; int CDM_TTY_MODE_DISABLED = 0; int CDM_TTY_MODE_ENABLED = 1; @@ -85,14 +86,6 @@ cat include/telephony/ril.h | \ >>java/android/com.android.internal.telephony/gsm/RILConstants.java */ - - int RIL_SIM_ABSENT = 0; - int RIL_SIM_NOT_READY = 1; - int RIL_SIM_READY = 2; - int RIL_SIM_PIN = 3; - int RIL_SIM_PUK = 4; - int RIL_SIM_NETWORK_PERSONALIZATION = 5; - /** * No restriction at all including voice/SMS/USSD/SS/AV64 * and packet data. diff --git a/telephony/java/com/android/internal/telephony/SmsMessageBase.java b/telephony/java/com/android/internal/telephony/SmsMessageBase.java index 3c7dd45..8b9ccb4 100644 --- a/telephony/java/com/android/internal/telephony/SmsMessageBase.java +++ b/telephony/java/com/android/internal/telephony/SmsMessageBase.java @@ -118,6 +118,7 @@ public abstract class SmsMessageBase { public int codeUnitSize; } + // TODO(): This class is duplicated in SmsMessage.java. Refactor accordingly. public static abstract class SubmitPduBase { public byte[] encodedScAddress; // Null if not applicable. public byte[] encodedMessage; diff --git a/test-runner/android/test/IsolatedContext.java b/test-runner/android/test/IsolatedContext.java index 2866666..859b2e5 100644 --- a/test-runner/android/test/IsolatedContext.java +++ b/test-runner/android/test/IsolatedContext.java @@ -13,6 +13,7 @@ import android.content.pm.PackageManager; import android.net.Uri; import java.util.List; +import java.io.File; /** * A mock context which prevents its users from talking to the rest of the device while @@ -82,4 +83,8 @@ public class IsolatedContext extends ContextWrapper { return null; } + @Override + public File getFilesDir() { + return new File("/dev/null"); + } } diff --git a/test-runner/android/test/mock/MockContext.java b/test-runner/android/test/mock/MockContext.java index b83a44d..9fb1e61 100644 --- a/test-runner/android/test/mock/MockContext.java +++ b/test-runner/android/test/mock/MockContext.java @@ -110,6 +110,7 @@ public class MockContext extends Context { throw new UnsupportedOperationException(); } + /** @hide */ @Override public File getSharedPrefsFile(String name) { throw new UnsupportedOperationException(); diff --git a/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java b/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java index 4c5fefc..e48a57b 100644 --- a/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java +++ b/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java @@ -23,14 +23,11 @@ import android.app.ISearchManager; import android.app.SearchManager; import android.content.ComponentName; import android.content.Context; -import android.os.Bundle; -import android.os.RemoteException; import android.os.ServiceManager; import android.server.search.SearchableInfo; import android.test.ActivityInstrumentationTestCase2; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; -import android.util.AndroidRuntimeException; /** * To launch this test from the command line: @@ -98,22 +95,6 @@ public class SearchManagerTest extends ActivityInstrumentationTestCase2<LocalAct ServiceManager.getService(Context.SEARCH_SERVICE)); } - // Checks that the search UI is visible. - private void assertSearchVisible() { - SearchManager searchManager = (SearchManager) - mContext.getSystemService(Context.SEARCH_SERVICE); - assertTrue("SearchManager thinks search UI isn't visible when it should be", - searchManager.isVisible()); - } - - // Checks that the search UI is not visible. - private void assertSearchNotVisible() { - SearchManager searchManager = (SearchManager) - mContext.getSystemService(Context.SEARCH_SERVICE); - assertFalse("SearchManager thinks search UI is visible when it shouldn't be", - searchManager.isVisible()); - } - /** * The goal of this test is to confirm that we can obtain * a search manager interface. @@ -157,57 +138,34 @@ public class SearchManagerTest extends ActivityInstrumentationTestCase2<LocalAct } /** - * Tests that rapid calls to start-stop-start doesn't cause problems. - */ - @MediumTest - public void testSearchManagerFastInvocations() throws Exception { - SearchManager searchManager = (SearchManager) - mContext.getSystemService(Context.SEARCH_SERVICE); - assertNotNull(searchManager); - assertSearchNotVisible(); - - searchManager.startSearch(null, false, SEARCHABLE_ACTIVITY, null, false); - assertSearchVisible(); - searchManager.stopSearch(); - searchManager.startSearch(null, false, SEARCHABLE_ACTIVITY, null, false); - searchManager.stopSearch(); - assertSearchNotVisible(); - } - - /** - * Tests that startSearch() is idempotent. + * Tests that startSearch() can be called multiple times without stopSearch() + * in between. */ @MediumTest public void testStartSearchIdempotent() throws Exception { SearchManager searchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); assertNotNull(searchManager); - assertSearchNotVisible(); searchManager.startSearch(null, false, SEARCHABLE_ACTIVITY, null, false); searchManager.startSearch(null, false, SEARCHABLE_ACTIVITY, null, false); - assertSearchVisible(); searchManager.stopSearch(); - assertSearchNotVisible(); } /** - * Tests that stopSearch() is idempotent and can be called when the search UI is not visible. + * Tests that stopSearch() can be called when the search UI is not visible and can be + * called multiple times without startSearch() in between. */ @MediumTest public void testStopSearchIdempotent() throws Exception { SearchManager searchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); assertNotNull(searchManager); - assertSearchNotVisible(); searchManager.stopSearch(); - assertSearchNotVisible(); searchManager.startSearch(null, false, SEARCHABLE_ACTIVITY, null, false); - assertSearchVisible(); searchManager.stopSearch(); searchManager.stopSearch(); - assertSearchNotVisible(); } /** @@ -219,28 +177,19 @@ public class SearchManagerTest extends ActivityInstrumentationTestCase2<LocalAct SearchManager searchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); assertNotNull(searchManager); - assertSearchNotVisible(); // These tests should simply run to completion w/o exceptions searchManager.startSearch(null, false, SEARCHABLE_ACTIVITY, null, false); - assertSearchVisible(); searchManager.stopSearch(); - assertSearchNotVisible(); searchManager.startSearch("", false, SEARCHABLE_ACTIVITY, null, false); - assertSearchVisible(); searchManager.stopSearch(); - assertSearchNotVisible(); searchManager.startSearch("test search string", false, SEARCHABLE_ACTIVITY, null, false); - assertSearchVisible(); searchManager.stopSearch(); - assertSearchNotVisible(); searchManager.startSearch("test search string", true, SEARCHABLE_ACTIVITY, null, false); - assertSearchVisible(); searchManager.stopSearch(); - assertSearchNotVisible(); } } diff --git a/tests/AndroidTests/src/com/android/unit_tests/VpnTest.java b/tests/AndroidTests/src/com/android/unit_tests/VpnTest.java index 7dc1314..67fcd61 100755 --- a/tests/AndroidTests/src/com/android/unit_tests/VpnTest.java +++ b/tests/AndroidTests/src/com/android/unit_tests/VpnTest.java @@ -16,10 +16,22 @@ package com.android.unit_tests; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.net.vpn.L2tpProfile; import android.net.vpn.L2tpIpsecProfile; +import android.net.vpn.L2tpIpsecPskProfile; +import android.net.vpn.PptpProfile; +import android.net.vpn.VpnManager; +import android.net.vpn.VpnProfile; +import android.net.vpn.VpnState; import android.net.vpn.VpnType; +import android.os.ConditionVariable; +import android.os.Parcel; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; +import android.text.TextUtils; /** * Unit test class to test VPN api @@ -29,6 +41,12 @@ import android.test.suitebuilder.annotation.SmallTest; * -w com.android.unit_tests/android.test.InstrumentationTestRunner */ public class VpnTest extends AndroidTestCase { + private static final String NAME = "a name"; + private static final String SERVER_NAME = "a server name"; + private static final String ID = "some id"; + private static final String SUFFICES = "some suffices"; + private static final String ROUTES = "some routes"; + private static final String SAVED_NAME = "some name"; @Override public void setUp() { @@ -39,8 +57,102 @@ public class VpnTest extends AndroidTestCase { } @SmallTest + public void testVpnType() { + testVpnType(VpnType.L2TP); + testVpnType(VpnType.L2TP_IPSEC); + testVpnType(VpnType.L2TP_IPSEC_PSK); + testVpnType(VpnType.PPTP); + } + + @SmallTest + public void testVpnProfile() { + VpnState state = VpnState.CONNECTING; + testVpnProfile(createTestProfile(state), state); + } + + @SmallTest public void testGetType() { - L2tpIpsecProfile li = new L2tpIpsecProfile(); - assertTrue(VpnType.L2TP_IPSEC== li.getType()); + assertEquals(VpnType.L2TP, new L2tpProfile().getType()); + assertEquals(VpnType.L2TP_IPSEC, new L2tpIpsecProfile().getType()); + assertEquals(VpnType.L2TP_IPSEC_PSK, + new L2tpIpsecPskProfile().getType()); + assertEquals(VpnType.PPTP, new PptpProfile().getType()); + } + + @SmallTest + public void testVpnTypes() { + assertTrue(VpnManager.getSupportedVpnTypes().length > 0); + } + + @SmallTest + public void testGetTypeFromManager() { + VpnManager m = new VpnManager(getContext()); + VpnType[] types = VpnManager.getSupportedVpnTypes(); + for (VpnType t : types) { + assertEquals(t, m.createVpnProfile(t).getType()); + } + } + + @SmallTest + public void testParcelable() { + VpnProfile p = createTestProfile(VpnState.CONNECTED); + Parcel parcel = Parcel.obtain(); + p.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + + // VpnState is transient and not saved in the parcel + testVpnProfile(VpnProfile.CREATOR.createFromParcel(parcel), null); + } + + @SmallTest + public void testReceiver() { + final String profileName = "whatever"; + final VpnState state = VpnState.DISCONNECTING; + final ConditionVariable cv = new ConditionVariable(); + cv.close(); + BroadcastReceiver r = new BroadcastReceiver() { + public void onReceive(Context c, Intent i) { + assertEquals(profileName, + i.getStringExtra(VpnManager.BROADCAST_PROFILE_NAME)); + assertEquals(state, i.getSerializableExtra( + VpnManager.BROADCAST_CONNECTION_STATE)); + cv.open(); + } + }; + + VpnManager m = new VpnManager(getContext()); + m.registerConnectivityReceiver(r); + m.broadcastConnectivity(profileName, state); + + // fail it if onReceive() doesn't get executed in 5 sec + assertTrue(cv.block(5000)); + } + + private void testVpnType(VpnType type) { + assertFalse(TextUtils.isEmpty(type.getDisplayName())); + assertNotNull(type.getDescription()); + assertNotNull(type.getProfileClass()); + } + + private VpnProfile createTestProfile(VpnState state) { + VpnProfile p = new L2tpProfile(); + p.setName(NAME); + p.setServerName(SERVER_NAME); + p.setId(ID); + p.setDomainSuffices(SUFFICES); + p.setRouteList(ROUTES); + p.setSavedUsername(SAVED_NAME); + p.setState(state); + return p; + } + + private void testVpnProfile(VpnProfile p, VpnState state) { + assertEquals(NAME, p.getName()); + assertEquals(SERVER_NAME, p.getServerName()); + assertEquals(ID, p.getId()); + assertEquals(SUFFICES, p.getDomainSuffices()); + assertEquals(ROUTES, p.getRouteList()); + assertEquals(SAVED_NAME, p.getSavedUsername()); + if (state != null) assertEquals(state, p.getState()); } } diff --git a/tests/CoreTests/android/AndroidManifest.xml b/tests/CoreTests/android/AndroidManifest.xml index 4809f844..98cc9e5 100644 --- a/tests/CoreTests/android/AndroidManifest.xml +++ b/tests/CoreTests/android/AndroidManifest.xml @@ -30,6 +30,7 @@ <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application> <uses-library android:name="android.test.runner" /> diff --git a/tests/CoreTests/android/core/CryptoTest.java b/tests/CoreTests/android/core/CryptoTest.java index f00d49f..e6e50ec 100644 --- a/tests/CoreTests/android/core/CryptoTest.java +++ b/tests/CoreTests/android/core/CryptoTest.java @@ -22,7 +22,6 @@ import junit.framework.TestCase; import org.apache.harmony.xnet.provider.jsse.OpenSSLMessageDigest; import org.bouncycastle.crypto.Digest; import org.bouncycastle.crypto.ExtendedDigest; -import org.bouncycastle.crypto.digests.MD2Digest; import org.bouncycastle.crypto.digests.MD4Digest; import org.bouncycastle.crypto.digests.MD5Digest; import org.bouncycastle.crypto.digests.SHA1Digest; @@ -93,16 +92,6 @@ public class CryptoTest extends TestCase { // Assert.assertTrue("New hash should be faster", newTime < oldTime); } - - /** - * Tests the MD2 implementation. - */ - @LargeTest - public void testMD2() { - Digest oldDigest = new MD2Digest(); - Digest newDigest = OpenSSLMessageDigest.getInstance("MD2"); - doTestMessageDigest(oldDigest, newDigest); - } /** * Tests the MD4 implementation. diff --git a/tests/CoreTests/android/database/MatrixCursorTest.java b/tests/CoreTests/android/database/MatrixCursorTest.java index fb8a12f..cddc6c4 100644 --- a/tests/CoreTests/android/database/MatrixCursorTest.java +++ b/tests/CoreTests/android/database/MatrixCursorTest.java @@ -32,6 +32,12 @@ public class MatrixCursorTest extends TestCase { cursor.newRow().add(null); cursor.moveToNext(); assertTrue(cursor.isNull(0)); + assertNull(cursor.getString(0)); + assertEquals(0, cursor.getShort(0)); + assertEquals(0, cursor.getInt(0)); + assertEquals(0L, cursor.getLong(0)); + assertEquals(0.0f, cursor.getFloat(0)); + assertEquals(0.0d, cursor.getDouble(0)); } public void testMatrixCursor() { diff --git a/tests/DpiTest/res/drawable-hdpi/npatch240dpi.9.png b/tests/DpiTest/res/drawable-hdpi/npatch240dpi.9.png Binary files differnew file mode 100644 index 0000000..a362b0f --- /dev/null +++ b/tests/DpiTest/res/drawable-hdpi/npatch240dpi.9.png diff --git a/tests/DpiTest/res/drawable-hdpi/reslogo240dpi.png b/tests/DpiTest/res/drawable-hdpi/reslogo240dpi.png Binary files differnew file mode 100644 index 0000000..4d717a8 --- /dev/null +++ b/tests/DpiTest/res/drawable-hdpi/reslogo240dpi.png diff --git a/tests/DpiTest/res/drawable-hdpi/smlnpatch240dpi.9.png b/tests/DpiTest/res/drawable-hdpi/smlnpatch240dpi.9.png Binary files differnew file mode 100644 index 0000000..84bdcb0 --- /dev/null +++ b/tests/DpiTest/res/drawable-hdpi/smlnpatch240dpi.9.png diff --git a/tests/DpiTest/res/drawable-hdpi/stylogo240dpi.png b/tests/DpiTest/res/drawable-hdpi/stylogo240dpi.png Binary files differnew file mode 100644 index 0000000..4d717a8 --- /dev/null +++ b/tests/DpiTest/res/drawable-hdpi/stylogo240dpi.png diff --git a/tests/DpiTest/res/drawable-ldpi/npatch120dpi.9.png b/tests/DpiTest/res/drawable-ldpi/npatch120dpi.9.png Binary files differnew file mode 100644 index 0000000..0d8115b --- /dev/null +++ b/tests/DpiTest/res/drawable-ldpi/npatch120dpi.9.png diff --git a/tests/DpiTest/res/drawable-ldpi/reslogo120dpi.png b/tests/DpiTest/res/drawable-ldpi/reslogo120dpi.png Binary files differnew file mode 100644 index 0000000..46bbd5b --- /dev/null +++ b/tests/DpiTest/res/drawable-ldpi/reslogo120dpi.png diff --git a/tests/DpiTest/res/drawable-ldpi/smlnpatch120dpi.9.png b/tests/DpiTest/res/drawable-ldpi/smlnpatch120dpi.9.png Binary files differnew file mode 100644 index 0000000..de8d607 --- /dev/null +++ b/tests/DpiTest/res/drawable-ldpi/smlnpatch120dpi.9.png diff --git a/tests/DpiTest/res/drawable-ldpi/stylogo120dpi.png b/tests/DpiTest/res/drawable-ldpi/stylogo120dpi.png Binary files differnew file mode 100644 index 0000000..46bbd5b --- /dev/null +++ b/tests/DpiTest/res/drawable-ldpi/stylogo120dpi.png diff --git a/tests/DpiTest/res/drawable/npatch160dpi.9.png b/tests/DpiTest/res/drawable/npatch160dpi.9.png Binary files differnew file mode 100644 index 0000000..44d89a9 --- /dev/null +++ b/tests/DpiTest/res/drawable/npatch160dpi.9.png diff --git a/tests/DpiTest/res/drawable/reslogo160dpi.png b/tests/DpiTest/res/drawable/reslogo160dpi.png Binary files differnew file mode 100644 index 0000000..c23b2ce --- /dev/null +++ b/tests/DpiTest/res/drawable/reslogo160dpi.png diff --git a/tests/DpiTest/res/drawable/smlnpatch160dpi.9.png b/tests/DpiTest/res/drawable/smlnpatch160dpi.9.png Binary files differnew file mode 100644 index 0000000..76c4ae8 --- /dev/null +++ b/tests/DpiTest/res/drawable/smlnpatch160dpi.9.png diff --git a/tests/DpiTest/res/drawable/stylogo160dpi.png b/tests/DpiTest/res/drawable/stylogo160dpi.png Binary files differnew file mode 100644 index 0000000..c23b2ce --- /dev/null +++ b/tests/DpiTest/res/drawable/stylogo160dpi.png diff --git a/tests/DpiTest/res/layout/image_views.xml b/tests/DpiTest/res/layout/image_views.xml new file mode 100644 index 0000000..6a91497 --- /dev/null +++ b/tests/DpiTest/res/layout/image_views.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/reslogo120dpi" /> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/reslogo160dpi" /> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/reslogo240dpi" /> + +</LinearLayout> diff --git a/packages/SettingsProvider/res/values-zh-rTW/defaults.xml b/tests/DpiTest/res/layout/styled_image_views.xml index fdbba88..86c63bf 100644 --- a/packages/SettingsProvider/res/values-zh-rTW/defaults.xml +++ b/tests/DpiTest/res/layout/styled_image_views.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8"?> +<?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2009 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,10 +13,14 @@ See the License for the specific language governing permissions and limitations under the License. --> -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="def_airplane_mode_radios">"手機,藍牙,wifi"</string> - <string name="def_location_providers_allowed">"gps"</string> - <!-- no translation found for def_backup_transport (6764822064303377157) --> - <skip /> -</resources> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + <ImageView style="@style/ImageView120dpi" /> + <ImageView style="@style/ImageView160dpi" /> + <ImageView style="@style/ImageView240dpi" /> + +</LinearLayout> diff --git a/tests/DpiTest/res/values/styles.xml b/tests/DpiTest/res/values/styles.xml new file mode 100644 index 0000000..bb4b13c --- /dev/null +++ b/tests/DpiTest/res/values/styles.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> + +<resources> + <style name="ImageView120dpi"> + <item name="android:src">@drawable/stylogo120dpi</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + </style> + + <style name="ImageView160dpi"> + <item name="android:src">@drawable/stylogo160dpi</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + </style> + + <style name="ImageView240dpi"> + <item name="android:src">@drawable/stylogo240dpi</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + </style> +</resources> diff --git a/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java b/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java index 49fff57..ae53b76 100644 --- a/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java +++ b/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java @@ -28,12 +28,14 @@ import android.graphics.drawable.Drawable; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.ScrollView; +import android.view.LayoutInflater; import android.view.View; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.CompatibilityInfo; import android.util.DisplayMetrics; +import android.util.Log; public class DpiTestActivity extends Activity { public DpiTestActivity() { @@ -52,14 +54,13 @@ public class DpiTestActivity extends Activity { // be doing it. Application app = ActivityThread.currentActivityThread().getApplication(); ApplicationInfo ai = app.getPackageManager().getApplicationInfo( - "com.google.android.test.dpi", - PackageManager.GET_SUPPORTS_DENSITIES); + "com.google.android.test.dpi", 0); if (noCompat) { ai.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS | ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS | ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS - | ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS; - ai.supportsDensities = new int[] { ApplicationInfo.ANY_DENSITY }; + | ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS + | ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES; app.getResources().setCompatibilityInfo(new CompatibilityInfo(ai)); } } catch (PackageManager.NameNotFoundException e) { @@ -71,6 +72,9 @@ public class DpiTestActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + final LayoutInflater li = (LayoutInflater)getSystemService( + LAYOUT_INFLATER_SERVICE); + this.setTitle(R.string.act_title); LinearLayout root = new LinearLayout(this); root.setOrientation(LinearLayout.VERTICAL); @@ -96,6 +100,14 @@ public class DpiTestActivity extends Activity { addLabelToRoot(root, "Prescaled resource drawable"); addChildToRoot(root, layout); + layout = (LinearLayout)li.inflate(R.layout.image_views, null); + addLabelToRoot(root, "Inflated layout"); + addChildToRoot(root, layout); + + layout = (LinearLayout)li.inflate(R.layout.styled_image_views, null); + addLabelToRoot(root, "Inflated styled layout"); + addChildToRoot(root, layout); + layout = new LinearLayout(this); addCanvasBitmap(layout, R.drawable.logo120dpi, true); addCanvasBitmap(layout, R.drawable.logo160dpi, true); @@ -117,6 +129,13 @@ public class DpiTestActivity extends Activity { addLabelToRoot(root, "No-dpi resource drawable"); addChildToRoot(root, layout); + layout = new LinearLayout(this); + addNinePatchResourceDrawable(layout, R.drawable.smlnpatch120dpi); + addNinePatchResourceDrawable(layout, R.drawable.smlnpatch160dpi); + addNinePatchResourceDrawable(layout, R.drawable.smlnpatch240dpi); + addLabelToRoot(root, "Prescaled 9-patch resource drawable"); + addChildToRoot(root, layout); + setContentView(scrollWrap(root)); } @@ -145,8 +164,8 @@ public class DpiTestActivity extends Activity { View view = new View(this); - final BitmapDrawable d = new BitmapDrawable(bitmap); - if (!scale) d.setDensityScale(getResources().getDisplayMetrics()); + final BitmapDrawable d = new BitmapDrawable(getResources(), bitmap); + if (!scale) d.setTargetDensity(getResources().getDisplayMetrics()); view.setBackgroundDrawable(d); view.setLayoutParams(new LinearLayout.LayoutParams(d.getIntrinsicWidth(), @@ -176,6 +195,19 @@ public class DpiTestActivity extends Activity { layout.addView(view); } + private void addNinePatchResourceDrawable(LinearLayout layout, int resource) { + View view = new View(this); + + final Drawable d = getResources().getDrawable(resource); + view.setBackgroundDrawable(d); + + Log.i("foo", "9-patch #" + Integer.toHexString(resource) + + " w=" + d.getIntrinsicWidth() + " h=" + d.getIntrinsicHeight()); + view.setLayoutParams(new LinearLayout.LayoutParams( + d.getIntrinsicWidth()*2, d.getIntrinsicHeight()*2)); + layout.addView(view); + } + private Bitmap loadAndPrintDpi(int id, boolean scale) { Bitmap bitmap; if (scale) { diff --git a/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewCallbacks.java b/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewCallbacks.java index 93cb84a..515ddba 100644 --- a/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewCallbacks.java +++ b/tests/FrameworkTest/tests/src/android/widget/AutoCompleteTextViewCallbacks.java @@ -27,8 +27,10 @@ public class AutoCompleteTextViewCallbacks super("com.android.frameworktest", AutoCompleteTextViewSimple.class); } - /** Test that the initial popup of the suggestions does not select anything */ - @MediumTest + /** Test that the initial popup of the suggestions does not select anything. + * + * TODO: test currently fails. Add back MediumTest annotation when fixed. + */ public void testPopupNoSelection() { AutoCompleteTextViewSimple theActivity = getActivity(); AutoCompleteTextView textView = theActivity.getTextView(); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeTypedArray.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeTypedArray.java index 48998db..10421de 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeTypedArray.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeTypedArray.java @@ -39,7 +39,7 @@ import java.util.Map; * TODO: describe. */ public final class BridgeTypedArray extends TypedArray { - + @SuppressWarnings("hiding") private BridgeResources mResources; private BridgeContext mContext; @@ -47,7 +47,7 @@ public final class BridgeTypedArray extends TypedArray { private IResourceValue[] mData; private String[] mNames; private final boolean mPlatformFile; - + public BridgeTypedArray(BridgeResources resources, BridgeContext context, int len, boolean platformFile) { super(null, null, null, 0); @@ -58,12 +58,12 @@ public final class BridgeTypedArray extends TypedArray { mNames = new String[len]; } - /** A bridge-specific method that sets a value in the type array */ + /** A bridge-specific method that sets a value in the type array */ public void bridgeSetValue(int index, String name, IResourceValue value) { mData[index] = value; mNames[index] = name; } - + /** * Seals the array after all calls to {@link #bridgeSetValue(int, String, IResourceValue)} have * been done. @@ -79,11 +79,11 @@ public final class BridgeTypedArray extends TypedArray { count++; } } - + // allocate the table with an extra to store the size mIndices = new int[count+1]; mIndices[0] = count; - + // fill the array with the indices. int index = 1; for (int i = 0 ; i < mData.length ; i++) { @@ -100,7 +100,7 @@ public final class BridgeTypedArray extends TypedArray { public int length() { return mData.length; } - + /** * Return the Resources object this array was loaded from. */ @@ -108,13 +108,13 @@ public final class BridgeTypedArray extends TypedArray { public Resources getResources() { return mResources; } - + /** * Retrieve the styled string value for the attribute at <var>index</var>. - * + * * @param index Index of attribute to retrieve. - * - * @return CharSequence holding string data. May be styled. Returns + * + * @return CharSequence holding string data. May be styled. Returns * null if the attribute is not defined. */ @Override @@ -129,9 +129,9 @@ public final class BridgeTypedArray extends TypedArray { /** * Retrieve the string value for the attribute at <var>index</var>. - * + * * @param index Index of attribute to retrieve. - * + * * @return String holding string data. Any styling information is * removed. Returns null if the attribute is not defined. */ @@ -140,16 +140,16 @@ public final class BridgeTypedArray extends TypedArray { if (mData[index] != null) { return mData[index].getValue(); } - + return null; } /** * Retrieve the boolean value for the attribute at <var>index</var>. - * + * * @param index Index of attribute to retrieve. * @param defValue Value to return if the attribute is not defined. - * + * * @return Attribute boolean value, or defValue if not defined. */ @Override @@ -162,16 +162,16 @@ public final class BridgeTypedArray extends TypedArray { if (s != null) { return XmlUtils.convertValueToBoolean(s, defValue); } - + return defValue; } /** * Retrieve the integer value for the attribute at <var>index</var>. - * + * * @param index Index of attribute to retrieve. * @param defValue Value to return if the attribute is not defined. - * + * * @return Attribute int value, or defValue if not defined. */ @Override @@ -181,7 +181,7 @@ public final class BridgeTypedArray extends TypedArray { } String s = mData[index].getValue(); - + try { return (s == null) ? defValue : XmlUtils.convertValueToInt(s, defValue); } catch (NumberFormatException e) { @@ -192,11 +192,11 @@ public final class BridgeTypedArray extends TypedArray { // Check for possible constants and try to find them. // Get the map of attribute-constant -> IntegerValue Map<String, Integer> map = Bridge.getEnumValues(mNames[index]); - + if (map != null) { // accumulator to store the value of the 1+ constants. int result = 0; - + // split the value in case this is a mix of several flags. String[] keywords = s.split("\\|"); for (String keyword : keywords) { @@ -217,9 +217,9 @@ public final class BridgeTypedArray extends TypedArray { /** * Retrieve the float value for the attribute at <var>index</var>. - * + * * @param index Index of attribute to retrieve. - * + * * @return Attribute float value, or defValue if not defined.. */ @Override @@ -237,23 +237,23 @@ public final class BridgeTypedArray extends TypedArray { mContext.getLogger().warning(String.format( "Unable to convert \"%s\" into a float in attribute \"%2$s\"", s, mNames[index])); - + // we'll return the default value below. } } return defValue; } - + /** * Retrieve the color value for the attribute at <var>index</var>. If * the attribute references a color resource holding a complex * {@link android.content.res.ColorStateList}, then the default color from * the set is returned. - * + * * @param index Index of attribute to retrieve. * @param defValue Value to return if the attribute is not defined or * not a resource. - * + * * @return Attribute color value, or defValue if not defined. */ @Override @@ -261,7 +261,7 @@ public final class BridgeTypedArray extends TypedArray { if (mData[index] == null) { return defValue; } - + String s = mData[index].getValue(); try { return ResourceHelper.getColor(s); @@ -280,9 +280,9 @@ public final class BridgeTypedArray extends TypedArray { * Retrieve the ColorStateList for the attribute at <var>index</var>. * The value may be either a single solid color or a reference to * a color or complex {@link android.content.res.ColorStateList} description. - * + * * @param index Index of attribute to retrieve. - * + * * @return ColorStateList for the attribute, or null if not defined. */ @Override @@ -296,14 +296,14 @@ public final class BridgeTypedArray extends TypedArray { if (value == null) { return null; } - + try { int color = ResourceHelper.getColor(value); return ColorStateList.valueOf(color); } catch (NumberFormatException e) { // if it's not a color value, we'll attempt to read the xml based color below. } - + // let the framework inflate the ColorStateList from the XML file. try { File f = new File(value); @@ -311,7 +311,7 @@ public final class BridgeTypedArray extends TypedArray { KXmlParser parser = new KXmlParser(); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); parser.setInput(new FileReader(f)); - + ColorStateList colorStateList = ColorStateList.createFromXml( mContext.getResources(), // FIXME: we need to know if this resource is platform or not @@ -325,22 +325,22 @@ public final class BridgeTypedArray extends TypedArray { // return null below. } - + // looks like were unable to resolve the color value. mContext.getLogger().warning(String.format( "Unable to resolve color value \"%1$s\" in attribute \"%2$s\"", value, mNames[index])); - + return null; } - + /** * Retrieve the integer value for the attribute at <var>index</var>. - * + * * @param index Index of attribute to retrieve. * @param defValue Value to return if the attribute is not defined or * not a resource. - * + * * @return Attribute integer value, or defValue if not defined. */ @Override @@ -362,23 +362,23 @@ public final class BridgeTypedArray extends TypedArray { // The default value is returned below. } } - + return defValue; } /** - * Retrieve a dimensional unit attribute at <var>index</var>. Unit - * conversions are based on the current {@link DisplayMetrics} - * associated with the resources this {@link TypedArray} object - * came from. - * + * Retrieve a dimensional unit attribute at <var>index</var>. Unit + * conversions are based on the current {@link DisplayMetrics} + * associated with the resources this {@link TypedArray} object + * came from. + * * @param index Index of attribute to retrieve. * @param defValue Value to return if the attribute is not defined or * not a resource. - * - * @return Attribute dimension value multiplied by the appropriate + * + * @return Attribute dimension value multiplied by the appropriate * metric, or defValue if not defined. - * + * * @see #getDimensionPixelOffset * @see #getDimensionPixelSize */ @@ -397,11 +397,11 @@ public final class BridgeTypedArray extends TypedArray { } else if (s.equals(BridgeConstants.WRAP_CONTENT)) { return LayoutParams.WRAP_CONTENT; } - + if (ResourceHelper.stringToFloat(s, mValue)) { return mValue.getDimension(mResources.mMetrics); } - + // looks like we were unable to resolve the dimension value mContext.getLogger().warning(String.format( "Unable to resolve dimension value \"%1$s\" in attribute \"%2$s\"", @@ -416,14 +416,14 @@ public final class BridgeTypedArray extends TypedArray { * {@link #getDimension}, except the returned value is converted to * integer pixels for you. An offset conversion involves simply * truncating the base value to an integer. - * + * * @param index Index of attribute to retrieve. * @param defValue Value to return if the attribute is not defined or * not a resource. - * - * @return Attribute dimension value multiplied by the appropriate + * + * @return Attribute dimension value multiplied by the appropriate * metric and truncated to integer pixels, or defValue if not defined. - * + * * @see #getDimension * @see #getDimensionPixelSize */ @@ -439,14 +439,14 @@ public final class BridgeTypedArray extends TypedArray { * integer pixels for use as a size. A size conversion involves * rounding the base value, and ensuring that a non-zero base value * is at least one pixel in size. - * + * * @param index Index of attribute to retrieve. * @param defValue Value to return if the attribute is not defined or * not a resource. - * - * @return Attribute dimension value multiplied by the appropriate + * + * @return Attribute dimension value multiplied by the appropriate * metric and truncated to integer pixels, or defValue if not defined. - * + * * @see #getDimension * @see #getDimensionPixelOffset */ @@ -465,7 +465,7 @@ public final class BridgeTypedArray extends TypedArray { } else if (s.equals(BridgeConstants.WRAP_CONTENT)) { return LayoutParams.WRAP_CONTENT; } - + // FIXME huh? float f = getDimension(index, defValue); @@ -483,11 +483,11 @@ public final class BridgeTypedArray extends TypedArray { * {@link android.view.ViewGroup}'s layout_width and layout_height * attributes. This is only here for performance reasons; applications * should use {@link #getDimensionPixelSize}. - * + * * @param index Index of the attribute to retrieve. * @param name Textual name of attribute for error reporting. - * - * @return Attribute dimension value multiplied by the appropriate + * + * @return Attribute dimension value multiplied by the appropriate * metric and truncated to integer pixels. */ @Override @@ -495,20 +495,25 @@ public final class BridgeTypedArray extends TypedArray { return getDimensionPixelSize(index, 0); } + @Override + public int getLayoutDimension(int index, int defValue) { + return getDimensionPixelSize(index, defValue); + } + /** * Retrieve a fractional unit attribute at <var>index</var>. - * - * @param index Index of attribute to retrieve. - * @param base The base value of this fraction. In other words, a + * + * @param index Index of attribute to retrieve. + * @param base The base value of this fraction. In other words, a * standard fraction is multiplied by this value. - * @param pbase The parent base value of this fraction. In other + * @param pbase The parent base value of this fraction. In other * words, a parent fraction (nn%p) is multiplied by this * value. * @param defValue Value to return if the attribute is not defined or * not a resource. - * - * @return Attribute fractional value multiplied by the appropriate - * base value, or defValue if not defined. + * + * @return Attribute fractional value multiplied by the appropriate + * base value, or defValue if not defined. */ @Override public float getFraction(int index, int base, int pbase, float defValue) { @@ -520,7 +525,7 @@ public final class BridgeTypedArray extends TypedArray { if (value == null) { return defValue; } - + if (ResourceHelper.stringToFloat(value, mValue)) { return mValue.getFraction(base, pbase); } @@ -529,29 +534,29 @@ public final class BridgeTypedArray extends TypedArray { mContext.getLogger().warning(String.format( "Unable to resolve fraction value \"%1$s\" in attribute \"%2$s\"", value, mNames[index])); - + return defValue; } /** * Retrieve the resource identifier for the attribute at - * <var>index</var>. Note that attribute resource as resolved when - * the overall {@link TypedArray} object is retrieved. As a - * result, this function will return the resource identifier of the - * final resource value that was found, <em>not</em> necessarily the - * original resource that was specified by the attribute. - * + * <var>index</var>. Note that attribute resource as resolved when + * the overall {@link TypedArray} object is retrieved. As a + * result, this function will return the resource identifier of the + * final resource value that was found, <em>not</em> necessarily the + * original resource that was specified by the attribute. + * * @param index Index of attribute to retrieve. * @param defValue Value to return if the attribute is not defined or * not a resource. - * + * * @return Attribute resource identifier, or defValue if not defined. */ @Override public int getResourceId(int index, int defValue) { // get the IResource for this index IResourceValue resValue = mData[index]; - + // no data, return the default value. if (resValue == null) { return defValue; @@ -562,7 +567,7 @@ public final class BridgeTypedArray extends TypedArray { // get the id that will represent this style. return mContext.getDynamicIdByStyle((IStyleResourceValue)resValue); } - + // if the attribute was a reference to an id, and not a declaration of an id (@+id), then // the xml attribute value was "resolved" which leads us to a IResourceValue with // getType() returning "id" and getName() returning the id name @@ -583,7 +588,7 @@ public final class BridgeTypedArray extends TypedArray { if (value == null) { return defValue; } - + // if the value is just an integer, return it. try { int i = Integer.parseInt(value); @@ -601,14 +606,14 @@ public final class BridgeTypedArray extends TypedArray { // fact in the android.R and com.android.internal.R classes. // The field mPlatformFile will indicate that all IDs are to be looked up in the android R // classes exclusively. - + // if this is a reference to an id, find it. if (value.startsWith("@id/") || value.startsWith("@+") || value.startsWith("@android:id/")) { - + int pos = value.indexOf('/'); String idName = value.substring(pos + 1); - + // if this is a framework id if (mPlatformFile || value.startsWith("@android") || value.startsWith("@+android")) { // look for idName in the android R classes @@ -621,7 +626,7 @@ public final class BridgeTypedArray extends TypedArray { // not a direct id valid reference? resolve it Integer idValue = null; - + if (resValue.isFramework()) { idValue = Bridge.getResourceValue(resValue.getType(), resValue.getName()); } else { @@ -632,7 +637,7 @@ public final class BridgeTypedArray extends TypedArray { if (idValue != null) { return idValue.intValue(); } - + mContext.getLogger().warning(String.format( "Unable to resolve id \"%1$s\" for attribute \"%2$s\"", value, mNames[index])); return defValue; @@ -643,9 +648,9 @@ public final class BridgeTypedArray extends TypedArray { * gets the resource ID of the selected attribute, and uses * {@link Resources#getDrawable Resources.getDrawable} of the owning * Resources object to retrieve its Drawable. - * + * * @param index Index of attribute to retrieve. - * + * * @return Drawable for the attribute, or null if not defined. */ @Override @@ -658,13 +663,13 @@ public final class BridgeTypedArray extends TypedArray { if (value == null || BridgeConstants.REFERENCE_NULL.equals(value)) { return null; } - + Drawable d = ResourceHelper.getDrawable(value, mContext, mData[index].isFramework()); - + if (d != null) { return d; } - + // looks like we were unable to resolve the drawable mContext.getLogger().warning(String.format( "Unable to resolve drawable \"%1$s\" in attribute \"%2$s\"", value, mNames[index])); @@ -678,9 +683,9 @@ public final class BridgeTypedArray extends TypedArray { * This gets the resource ID of the selected attribute, and uses * {@link Resources#getTextArray Resources.getTextArray} of the owning * Resources object to retrieve its String[]. - * + * * @param index Index of attribute to retrieve. - * + * * @return CharSequence[] for the attribute, or null if not defined. */ @Override @@ -693,7 +698,7 @@ public final class BridgeTypedArray extends TypedArray { if (value != null) { return new CharSequence[] { value }; } - + mContext.getLogger().warning(String.format( String.format("Unknown value for getTextArray(%d) => %s", //DEBUG index, mData[index].getName()))); @@ -703,44 +708,44 @@ public final class BridgeTypedArray extends TypedArray { /** * Retrieve the raw TypedValue for the attribute at <var>index</var>. - * + * * @param index Index of attribute to retrieve. * @param outValue TypedValue object in which to place the attribute's * data. - * - * @return Returns true if the value was retrieved, else false. + * + * @return Returns true if the value was retrieved, else false. */ @Override public boolean getValue(int index, TypedValue outValue) { if (mData[index] == null) { return false; } - + String s = mData[index].getValue(); - + return ResourceHelper.stringToFloat(s, outValue); } /** * Determines whether there is an attribute at <var>index</var>. - * + * * @param index Index of attribute to retrieve. - * + * * @return True if the attribute has a value, false otherwise. */ @Override public boolean hasValue(int index) { return mData[index] != null; } - + /** - * Retrieve the raw TypedValue for the attribute at <var>index</var> - * and return a temporary object holding its data. This object is only - * valid until the next call on to {@link TypedArray}. - * + * Retrieve the raw TypedValue for the attribute at <var>index</var> + * and return a temporary object holding its data. This object is only + * valid until the next call on to {@link TypedArray}. + * * @param index Index of attribute to retrieve. - * - * @return Returns a TypedValue object if the attribute is defined, + * + * @return Returns a TypedValue object if the attribute is defined, * containing its data; otherwise returns null. (You will not * receive a TypedValue whose type is TYPE_NULL.) */ @@ -749,7 +754,7 @@ public final class BridgeTypedArray extends TypedArray { if (getValue(index, mValue)) { return mValue; } - + return null; } diff --git a/vpn/java/android/net/vpn/PptpProfile.java b/vpn/java/android/net/vpn/PptpProfile.java index c68bb71..b4b7be5 100644 --- a/vpn/java/android/net/vpn/PptpProfile.java +++ b/vpn/java/android/net/vpn/PptpProfile.java @@ -16,15 +16,41 @@ package android.net.vpn; +import android.os.Parcel; + /** * The profile for PPTP type of VPN. * {@hide} */ public class PptpProfile extends VpnProfile { private static final long serialVersionUID = 1L; + private boolean mEncryption = true; @Override public VpnType getType() { return VpnType.PPTP; } + + /** + * Enables/disables the encryption for PPTP tunnel. + */ + public void setEncryptionEnabled(boolean enabled) { + mEncryption = enabled; + } + + public boolean isEncryptionEnabled() { + return mEncryption; + } + + @Override + protected void readFromParcel(Parcel in) { + super.readFromParcel(in); + mEncryption = in.readInt() > 0; + } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + super.writeToParcel(parcel, flags); + parcel.writeInt(mEncryption ? 1 : 0); + } } diff --git a/vpn/java/android/net/vpn/VpnManager.java b/vpn/java/android/net/vpn/VpnManager.java index 0bf2346..e448e5a 100644 --- a/vpn/java/android/net/vpn/VpnManager.java +++ b/vpn/java/android/net/vpn/VpnManager.java @@ -50,6 +50,10 @@ public class VpnManager { public static final int VPN_ERROR_CONNECTION_FAILED = 2; /** Error code to indicate the server is not known. */ public static final int VPN_ERROR_UNKNOWN_SERVER = 3; + /** Error code to indicate an error from challenge response. */ + public static final int VPN_ERROR_CHALLENGE = 4; + /** Error code to indicate an error of remote server hanging up. */ + public static final int VPN_ERROR_REMOTE_HUNG_UP = 5; private static final int VPN_ERROR_NO_ERROR = 0; public static final String PROFILES_PATH = "/data/misc/vpn/profiles"; diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index eda2f2d..f85aadd 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -45,6 +45,8 @@ public class WifiConfiguration implements Parcelable { /** {@hide} */ public static final String eapVarName = "eap"; /** {@hide} */ + public static final String phase2VarName = "phase2"; + /** {@hide} */ public static final String identityVarName = "identity"; /** {@hide} */ public static final String anonymousIdentityVarName = "anonymous_identity"; @@ -273,6 +275,11 @@ public class WifiConfiguration implements Parcelable { */ public String eap; /** + * The phase2 authenication could be PAP, MSCHAP, MSCHAP2, GTC. + * {@hide} + */ + public String phase2; + /** * The identity of the user in string, * which is used for the authentication. * {@hide} @@ -314,6 +321,7 @@ public class WifiConfiguration implements Parcelable { for (int i = 0; i < wepKeys.length; i++) wepKeys[i] = null; eap = null; + phase2 = null; identity = null; anonymousIdentity = null; password = null; @@ -399,6 +407,10 @@ public class WifiConfiguration implements Parcelable { if (this.eap != null) { sbuf.append(eap); } + sbuf.append('\n').append(" phase2: "); + if (this.phase2 != null) { + sbuf.append(phase2); + } sbuf.append('\n').append(" Identity: "); if (this.identity != null) { sbuf.append(identity); @@ -486,6 +498,7 @@ public class WifiConfiguration implements Parcelable { writeBitSet(dest, allowedPairwiseCiphers); writeBitSet(dest, allowedGroupCiphers); dest.writeString(eap); + dest.writeString(phase2); dest.writeString(identity); dest.writeString(anonymousIdentity); dest.writeString(password); @@ -516,6 +529,7 @@ public class WifiConfiguration implements Parcelable { config.allowedPairwiseCiphers = readBitSet(in); config.allowedGroupCiphers = readBitSet(in); config.eap = in.readString(); + config.phase2 = in.readString(); config.identity = in.readString(); config.anonymousIdentity = in.readString(); config.password = in.readString(); diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 1f73bec..74f4284 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -870,7 +870,10 @@ public class WifiManager { * Create a new MulticastLock * * @param tag a tag for the MulticastLock to identify it in debugging - * messages. + * messages. This string is never shown to the user under + * normal conditions, but should be descriptive enough to + * identify your application and the specific MulticastLock + * within it, if it holds multiple MulticastLocks. * * @return a new, unacquired MulticastLock with the given tag. * @@ -886,26 +889,36 @@ public class WifiManager { * addressed to this device. Acquring a MulticastLock will * cause the stack to receive packets addressed to multicast * addresses. Processing these extra packets can cause a noticable - * battery drain and should be disabled when not needed + * battery drain and should be disabled when not needed. */ public class MulticastLock { private String mTag; private final IBinder mBinder; + private int mRefCount; + private boolean mRefCounted; private boolean mHeld; private MulticastLock(String tag) { mTag = tag; mBinder = new Binder(); + mRefCount = 0; + mRefCounted = true; mHeld = false; } /** * Locks Wifi Multicast on until {@link #release} is called. * - * The first call to {@code acquire} will lock the Multicast on - * but subsequent calls will be ignored. Only one call to - * {@link #release} will be required, regardless of the number of - * times that {@code acquire} is called. + * If this MulticastLock is reference-counted each call to + * {@code acquire} will increment the reference count, and the + * wifi interface will receive multicast packets as long as the + * reference count is above zero. + * + * If this MulticastLock is not reference-counted, the first call to + * {@code acquire} will turn on the multicast packets, but subsequent + * calls will be ignored. Only one call to {@link #release} will + * be required, regardless of the number of times that {@code acquire} + * is called. * * Note that other applications may also lock Wifi Multicast on. * Only they can relinquish their lock. @@ -915,7 +928,7 @@ public class WifiManager { */ public void acquire() { synchronized (mBinder) { - if (!mHeld) { + if (mRefCounted ? (++mRefCount > 0) : (!mHeld)) { try { mService.acquireMulticastLock(mBinder, mTag); synchronized (WifiManager.this) { @@ -926,9 +939,9 @@ public class WifiManager { } mActiveLockCount++; } - mHeld = true; } catch (RemoteException ignore) { } + mHeld = true; } } } @@ -937,6 +950,18 @@ public class WifiManager { * Unlocks Wifi Multicast, restoring the filter of packets * not addressed specifically to this device and saving power. * + * If this MulticastLock is reference-counted, each call to + * {@code release} will decrement the reference count, and the + * multicast packets will only stop being received when the reference + * count reaches zero. If the reference count goes below zero (that + * is, if {@code release} is called a greater number of times than + * {@link #acquire}), an exception is thrown. + * + * If this MulticastLock is not reference-counted, the first call to + * {@code release} (after the radio was multicast locked using + * {@linke #acquire}) will unlock the multicast, and subsequent calls + * will be ignored. + * * Note that if any other Wifi Multicast Locks are still outstanding * this {@code release} call will not have an immediate effect. Only * when all applications have released all their Multicast Locks will @@ -947,20 +972,43 @@ public class WifiManager { */ public void release() { synchronized (mBinder) { - if (mHeld) { + if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { try { mService.releaseMulticastLock(); synchronized (WifiManager.this) { mActiveLockCount--; } - mHeld = false; } catch (RemoteException ignore) { } + mHeld = false; + } + if (mRefCount < 0) { + throw new RuntimeException("MulticastLock under-locked " + + mTag); } } } /** + * Controls whether this is a reference-counted or non-reference- + * counted MulticastLock. + * + * Reference-counted MulticastLocks keep track of the number of calls + * to {@link #acquire} and {@link #release}, and only stop the + * reception of multicast packets when every call to {@link #acquire} + * has been balanced with a call to {@link #release}. Non-reference- + * counted MulticastLocks allow the reception of multicast packets + * whenever {@link #acquire} is called and stop accepting multicast + * packets whenever {@link #release} is called. + * + * @param refCounted true if this MulticastLock should keep a reference + * count + */ + public void setReferenceCounted(boolean refCounted) { + mRefCounted = refCounted; + } + + /** * Checks whether this MulticastLock is currently held. * * @return true if this MulticastLock is held, false otherwise @@ -972,17 +1020,23 @@ public class WifiManager { } public String toString() { - String s1, s2; + String s1, s2, s3; synchronized (mBinder) { s1 = Integer.toHexString(System.identityHashCode(this)); s2 = mHeld ? "held; " : ""; - return "MulticastLock{ " + s1 + "; " + s2 + " }"; + if (mRefCounted) { + s3 = "refcounted: refcount = " + mRefCount; + } else { + s3 = "not refcounted"; + } + return "MulticastLock{ " + s1 + "; " + s2 + s3 + " }"; } } @Override protected void finalize() throws Throwable { super.finalize(); + setReferenceCounted(false); release(); } } |