Merge "Sensor documentation fixes." into lmp-docs
diff --git a/Android.mk b/Android.mk
index b77c2ed..75e32c1 100644
--- a/Android.mk
+++ b/Android.mk
@@ -732,6 +732,7 @@
-samplegroup Content \
-samplegroup Input \
-samplegroup Media \
+ -samplegroup Notification \
-samplegroup RenderScript \
-samplegroup Security \
-samplegroup Sensors \
diff --git a/api/current.txt b/api/current.txt
index fe0c209..969cc5a 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2612,7 +2612,7 @@
field public static final int CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS = 8; // 0x8
field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.accessibilityservice.AccessibilityServiceInfo> CREATOR;
field public static final int DEFAULT = 1; // 0x1
field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
field public static final int FEEDBACK_AUDIBLE = 4; // 0x4
@@ -2658,7 +2658,7 @@
ctor public Account(android.os.Parcel);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.accounts.Account> CREATOR;
field public final java.lang.String name;
field public final java.lang.String type;
}
@@ -2675,7 +2675,7 @@
method public void onRequestContinued();
method public void onResult(android.os.Bundle);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.accounts.AccountAuthenticatorResponse> CREATOR;
}
public class AccountManager {
@@ -2767,7 +2767,7 @@
method public int describeContents();
method public static android.accounts.AuthenticatorDescription newKey(java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.accounts.AuthenticatorDescription> CREATOR;
field public final int accountPreferencesId;
field public final boolean customTokens;
field public final int iconId;
@@ -3525,7 +3525,7 @@
method public int describeContents();
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.ActivityManager.MemoryInfo> CREATOR;
field public long availMem;
field public boolean lowMemory;
field public long threshold;
@@ -3538,7 +3538,7 @@
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
field public static final int CRASHED = 1; // 0x1
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.ActivityManager.ProcessErrorStateInfo> CREATOR;
field public static final int NOT_RESPONDING = 2; // 0x2
field public static final int NO_ERROR = 0; // 0x0
field public int condition;
@@ -3557,7 +3557,7 @@
method public int describeContents();
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.ActivityManager.RecentTaskInfo> CREATOR;
field public int affiliatedTaskId;
field public android.content.Intent baseIntent;
field public java.lang.CharSequence description;
@@ -3573,7 +3573,7 @@
method public int describeContents();
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.ActivityManager.RunningAppProcessInfo> CREATOR;
field public static final int IMPORTANCE_BACKGROUND = 400; // 0x190
field public static final int IMPORTANCE_EMPTY = 500; // 0x1f4
field public static final int IMPORTANCE_FOREGROUND = 100; // 0x64
@@ -3601,7 +3601,7 @@
method public int describeContents();
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.ActivityManager.RunningServiceInfo> CREATOR;
field public static final int FLAG_FOREGROUND = 2; // 0x2
field public static final int FLAG_PERSISTENT_PROCESS = 8; // 0x8
field public static final int FLAG_STARTED = 1; // 0x1
@@ -3627,7 +3627,7 @@
method public int describeContents();
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.ActivityManager.RunningTaskInfo> CREATOR;
field public android.content.ComponentName baseActivity;
field public java.lang.CharSequence description;
field public int id;
@@ -3649,7 +3649,7 @@
method public int getPrimaryColor();
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.ActivityManager.TaskDescription> CREATOR;
}
public class ActivityOptions {
@@ -3692,7 +3692,7 @@
method public android.app.PendingIntent getShowIntent();
method public long getTriggerTime();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.AlarmManager.AlarmClockInfo> CREATOR;
}
public class AlertDialog extends android.app.Dialog implements android.content.DialogInterface {
@@ -3829,7 +3829,7 @@
method public static android.content.ComponentName getErrorReportReceiver(android.content.Context, java.lang.String, int);
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.ApplicationErrorReport> CREATOR;
field public static final int TYPE_ANR = 2; // 0x2
field public static final int TYPE_BATTERY = 3; // 0x3
field public static final int TYPE_CRASH = 1; // 0x1
@@ -4210,7 +4210,7 @@
public static class Fragment.SavedState implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.ClassLoaderCreator CREATOR;
+ field public static final android.os.Parcelable.ClassLoaderCreator<android.app.Fragment.SavedState> CREATOR;
}
public deprecated class FragmentBreadCrumbs extends android.view.ViewGroup implements android.app.FragmentManager.OnBackStackChangedListener {
@@ -4557,7 +4557,7 @@
field public static final java.lang.String CATEGORY_SYSTEM = "sys";
field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
field public static final int COLOR_DEFAULT = 0; // 0x0
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.Notification> CREATOR;
field public static final int DEFAULT_ALL = -1; // 0xffffffff
field public static final int DEFAULT_LIGHTS = 4; // 0x4
field public static final int DEFAULT_SOUND = 1; // 0x1
@@ -4642,7 +4642,7 @@
method public android.os.Bundle getExtras();
method public android.app.RemoteInput[] getRemoteInputs();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.Notification.Action> CREATOR;
field public android.app.PendingIntent actionIntent;
field public int icon;
field public java.lang.CharSequence title;
@@ -4845,7 +4845,7 @@
method public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent.OnFinished, android.os.Handler, java.lang.String) throws android.app.PendingIntent.CanceledException;
method public static void writePendingIntentOrNullToParcel(android.app.PendingIntent, android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.PendingIntent> CREATOR;
field public static final int FLAG_CANCEL_CURRENT = 268435456; // 0x10000000
field public static final int FLAG_NO_CREATE = 536870912; // 0x20000000
field public static final int FLAG_ONE_SHOT = 1073741824; // 0x40000000
@@ -4908,7 +4908,7 @@
method public java.lang.String getResultKey();
method public static android.os.Bundle getResultsFromIntent(android.content.Intent);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.RemoteInput> CREATOR;
field public static final java.lang.String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
field public static final java.lang.String RESULTS_CLIP_LABEL = "android.remoteinput.results";
}
@@ -5023,7 +5023,7 @@
method public boolean shouldRewriteQueryFromData();
method public boolean shouldRewriteQueryFromText();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.SearchableInfo> CREATOR;
}
public abstract class Service extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 {
@@ -5169,7 +5169,7 @@
method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
method public android.graphics.drawable.Drawable loadThumbnail(android.content.pm.PackageManager);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.WallpaperInfo> CREATOR;
}
public class WallpaperManager {
@@ -5224,7 +5224,7 @@
method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
method public boolean usesPolicy(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.admin.DeviceAdminInfo> CREATOR;
field public static final int USES_ENCRYPTED_STORAGE = 7; // 0x7
field public static final int USES_POLICY_DISABLE_CAMERA = 8; // 0x8
field public static final int USES_POLICY_DISABLE_KEYGUARD_FEATURES = 9; // 0x9
@@ -5516,7 +5516,7 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final int BACKOFF_POLICY_EXPONENTIAL = 1; // 0x1
field public static final int BACKOFF_POLICY_LINEAR = 0; // 0x0
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.job.JobInfo> CREATOR;
field public static final long DEFAULT_INITIAL_BACKOFF_MILLIS = 30000L; // 0x7530L
field public static final long MAX_BACKOFF_DELAY_MILLIS = 18000000L; // 0x112a880L
field public static final int NETWORK_TYPE_ANY = 1; // 0x1
@@ -5544,7 +5544,7 @@
method public int getJobId();
method public boolean isOverrideDeadlineExpired();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.job.JobParameters> CREATOR;
}
public abstract class JobScheduler {
@@ -5580,7 +5580,7 @@
method public long getLastTimeStamp();
method public long getTotalTimeActive();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.usage.ConfigurationStats> CREATOR;
}
public final class UsageEvents implements android.os.Parcelable {
@@ -5588,7 +5588,7 @@
method public boolean getNextEvent(android.app.usage.UsageEvents.Event);
method public boolean hasNextEvent();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.usage.UsageEvents> CREATOR;
}
public static final class UsageEvents.Event {
@@ -5614,7 +5614,7 @@
method public java.lang.String getPackageName();
method public long getTotalTimeInForeground();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.app.usage.UsageStats> CREATOR;
}
public final class UsageStatsManager {
@@ -5731,7 +5731,7 @@
method public final java.lang.String loadLabel(android.content.pm.PackageManager);
method public final android.graphics.drawable.Drawable loadPreviewImage(android.content.Context, int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.appwidget.AppWidgetProviderInfo> CREATOR;
field public static final int RESIZE_BOTH = 3; // 0x3
field public static final int RESIZE_HORIZONTAL = 1; // 0x1
field public static final int RESIZE_NONE = 0; // 0x0
@@ -6072,7 +6072,7 @@
method public int getMajorDeviceClass();
method public boolean hasService(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothClass> CREATOR;
}
public static class BluetoothClass.Device {
@@ -6185,7 +6185,7 @@
field public static final int BOND_BONDED = 12; // 0xc
field public static final int BOND_BONDING = 11; // 0xb
field public static final int BOND_NONE = 10; // 0xa
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothDevice> CREATOR;
field public static final int DEVICE_TYPE_CLASSIC = 1; // 0x1
field public static final int DEVICE_TYPE_DUAL = 3; // 0x3
field public static final int DEVICE_TYPE_LE = 2; // 0x2
@@ -6303,7 +6303,7 @@
field public static final int WRITE_TYPE_DEFAULT = 2; // 0x2
field public static final int WRITE_TYPE_NO_RESPONSE = 1; // 0x1
field public static final int WRITE_TYPE_SIGNED = 4; // 0x4
- field protected java.util.List mDescriptors;
+ field protected java.util.List<android.bluetooth.BluetoothGattDescriptor> mDescriptors;
}
public class BluetoothGattDescriptor {
@@ -6366,8 +6366,8 @@
method public java.util.UUID getUuid();
field public static final int SERVICE_TYPE_PRIMARY = 0; // 0x0
field public static final int SERVICE_TYPE_SECONDARY = 1; // 0x1
- field protected java.util.List mCharacteristics;
- field protected java.util.List mIncludedServices;
+ field protected java.util.List<android.bluetooth.BluetoothGattCharacteristic> mCharacteristics;
+ field protected java.util.List<android.bluetooth.BluetoothGattService> mIncludedServices;
}
public final class BluetoothHeadset implements android.bluetooth.BluetoothProfile {
@@ -6425,7 +6425,7 @@
method public java.lang.String getName();
method public int getRole();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothHealthAppConfiguration> CREATOR;
}
public abstract class BluetoothHealthCallback {
@@ -6502,7 +6502,7 @@
method public java.util.Map<android.os.ParcelUuid, byte[]> getServiceData();
method public java.util.List<android.os.ParcelUuid> getServiceUuids();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.bluetooth.le.AdvertiseData> CREATOR;
}
public static final class AdvertiseData.Builder {
@@ -6529,7 +6529,7 @@
field public static final int ADVERTISE_TX_POWER_LOW = 1; // 0x1
field public static final int ADVERTISE_TX_POWER_MEDIUM = 2; // 0x2
field public static final int ADVERTISE_TX_POWER_ULTRA_LOW = 0; // 0x0
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.bluetooth.le.AdvertiseSettings> CREATOR;
}
public static final class AdvertiseSettings.Builder {
@@ -6579,7 +6579,7 @@
method public android.os.ParcelUuid getServiceUuidMask();
method public boolean matches(android.bluetooth.le.ScanResult);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.bluetooth.le.ScanFilter> CREATOR;
}
public static final class ScanFilter.Builder {
@@ -6615,7 +6615,7 @@
method public android.bluetooth.le.ScanRecord getScanRecord();
method public long getTimestampNanos();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.bluetooth.le.ScanResult> CREATOR;
}
public final class ScanSettings implements android.os.Parcelable {
@@ -6626,7 +6626,7 @@
method public int getScanResultType();
method public void writeToParcel(android.os.Parcel, int);
field public static final int CALLBACK_TYPE_ALL_MATCHES = 1; // 0x1
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.bluetooth.le.ScanSettings> CREATOR;
field public static final int SCAN_MODE_BALANCED = 1; // 0x1
field public static final int SCAN_MODE_LOW_LATENCY = 2; // 0x2
field public static final int SCAN_MODE_LOW_POWER = 0; // 0x0
@@ -6751,7 +6751,7 @@
method public static android.content.ClipData newRawUri(java.lang.CharSequence, android.net.Uri);
method public static android.content.ClipData newUri(android.content.ContentResolver, java.lang.CharSequence, android.net.Uri);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.ClipData> CREATOR;
}
public static class ClipData.Item {
@@ -6781,7 +6781,7 @@
method public int getMimeTypeCount();
method public boolean hasMimeType(java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.ClipDescription> CREATOR;
field public static final java.lang.String MIMETYPE_TEXT_HTML = "text/html";
field public static final java.lang.String MIMETYPE_TEXT_INTENT = "text/vnd.android.intent";
field public static final java.lang.String MIMETYPE_TEXT_PLAIN = "text/plain";
@@ -6838,7 +6838,7 @@
method public static android.content.ComponentName unflattenFromString(java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
method public static void writeToParcel(android.content.ComponentName, android.os.Parcel);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.ComponentName> CREATOR;
}
public abstract class ContentProvider implements android.content.ComponentCallbacks2 {
@@ -6922,7 +6922,7 @@
method public java.lang.String[] resolveSelectionArgsBackReferences(android.content.ContentProviderResult[], int);
method public android.content.ContentValues resolveValueBackReferences(android.content.ContentProviderResult[], int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.ContentProviderOperation> CREATOR;
}
public static class ContentProviderOperation.Builder {
@@ -6943,7 +6943,7 @@
ctor public ContentProviderResult(android.os.Parcel);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.ContentProviderResult> CREATOR;
field public final java.lang.Integer count;
field public final android.net.Uri uri;
}
@@ -7078,7 +7078,7 @@
method public int size();
method public java.util.Set<java.util.Map.Entry<java.lang.String, java.lang.Object>> valueSet();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.ContentValues> CREATOR;
field public static final java.lang.String TAG = "ContentValues";
}
@@ -7693,7 +7693,7 @@
field public static final java.lang.String CATEGORY_TAB = "android.intent.category.TAB";
field public static final java.lang.String CATEGORY_TEST = "android.intent.category.TEST";
field public static final java.lang.String CATEGORY_UNIT_TEST = "android.intent.category.UNIT_TEST";
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.Intent> CREATOR;
field public static final java.lang.String EXTRA_ALARM_COUNT = "android.intent.extra.ALARM_COUNT";
field public static final java.lang.String EXTRA_ALLOW_MULTIPLE = "android.intent.extra.ALLOW_MULTIPLE";
field public static final deprecated java.lang.String EXTRA_ALLOW_REPLACE = "android.intent.extra.ALLOW_REPLACE";
@@ -7799,7 +7799,7 @@
method public int describeContents();
method public static android.content.Intent.ShortcutIconResource fromContext(android.content.Context, int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.Intent.ShortcutIconResource> CREATOR;
field public java.lang.String packageName;
field public java.lang.String resourceName;
}
@@ -7858,7 +7858,7 @@
method public final java.util.Iterator<java.lang.String> typesIterator();
method public final void writeToParcel(android.os.Parcel, int);
method public void writeToXml(org.xmlpull.v1.XmlSerializer) throws java.io.IOException;
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.IntentFilter> CREATOR;
field public static final int MATCH_ADJUSTMENT_MASK = 65535; // 0xffff
field public static final int MATCH_ADJUSTMENT_NORMAL = 32768; // 0x8000
field public static final int MATCH_CATEGORY_EMPTY = 1048576; // 0x100000
@@ -7900,7 +7900,7 @@
method public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender.OnFinished, android.os.Handler, java.lang.String) throws android.content.IntentSender.SendIntentException;
method public static void writeIntentSenderOrNullToParcel(android.content.IntentSender, android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.IntentSender> CREATOR;
}
public static abstract interface IntentSender.OnFinished {
@@ -7977,7 +7977,7 @@
ctor public PeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle, long);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.PeriodicSync> CREATOR;
field public final android.accounts.Account account;
field public final java.lang.String authority;
field public final android.os.Bundle extras;
@@ -8018,7 +8018,7 @@
method public void setTitle(java.lang.String);
method public void setType(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.RestrictionEntry> CREATOR;
field public static final int TYPE_BOOLEAN = 1; // 0x1
field public static final int TYPE_CHOICE = 2; // 0x2
field public static final int TYPE_INTEGER = 5; // 0x5
@@ -8126,7 +8126,7 @@
method public static android.content.SyncAdapterType newKey(java.lang.String, java.lang.String);
method public boolean supportsUploading();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.SyncAdapterType> CREATOR;
field public final java.lang.String accountType;
field public final java.lang.String authority;
field public final boolean isKey;
@@ -8148,7 +8148,7 @@
public class SyncRequest implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.SyncRequest> CREATOR;
}
public static class SyncRequest.Builder {
@@ -8177,7 +8177,7 @@
method public java.lang.String toDebugString();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.content.SyncResult ALREADY_IN_PROGRESS;
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.SyncResult> CREATOR;
field public boolean databaseError;
field public long delayUntil;
field public boolean fullSyncRequested;
@@ -8195,7 +8195,7 @@
method public void clear();
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.SyncStats> CREATOR;
field public long numAuthExceptions;
field public long numConflictDetectedExceptions;
field public long numDeletes;
@@ -8225,7 +8225,7 @@
method public boolean isReadPermission();
method public boolean isWritePermission();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.UriPermission> CREATOR;
field public static final long INVALID_TIME = -9223372036854775808L; // 0x8000000000000000L
}
@@ -8254,7 +8254,7 @@
field public static final int CONFIG_SMALLEST_SCREEN_SIZE = 2048; // 0x800
field public static final int CONFIG_TOUCHSCREEN = 8; // 0x8
field public static final int CONFIG_UI_MODE = 512; // 0x200
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.ActivityInfo> CREATOR;
field public static final int DOCUMENT_LAUNCH_ALWAYS = 2; // 0x2
field public static final int DOCUMENT_LAUNCH_INTO_EXISTING = 1; // 0x1
field public static final int DOCUMENT_LAUNCH_NEVER = 3; // 0x3
@@ -8320,7 +8320,7 @@
method public int describeContents();
method public void dump(android.util.Printer, java.lang.String);
method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.ApplicationInfo> CREATOR;
field public static final int FLAG_ALLOW_BACKUP = 32768; // 0x8000
field public static final int FLAG_ALLOW_CLEAR_USER_DATA = 64; // 0x40
field public static final int FLAG_ALLOW_TASK_REPARENTING = 32; // 0x20
@@ -8400,7 +8400,7 @@
method public int describeContents();
method public java.lang.String getGlEsVersion();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.ConfigurationInfo> CREATOR;
field public static final int GL_ES_VERSION_UNDEFINED = 0; // 0x0
field public static final int INPUT_FEATURE_FIVE_WAY_NAV = 2; // 0x2
field public static final int INPUT_FEATURE_HARD_KEYBOARD = 1; // 0x1
@@ -8416,7 +8416,7 @@
ctor public FeatureGroupInfo(android.content.pm.FeatureGroupInfo);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.FeatureGroupInfo> CREATOR;
field public android.content.pm.FeatureInfo[] features;
}
@@ -8426,7 +8426,7 @@
method public int describeContents();
method public java.lang.String getGlEsVersion();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.FeatureInfo> CREATOR;
field public static final int FLAG_REQUIRED = 1; // 0x1
field public static final int GL_ES_VERSION_UNDEFINED = 0; // 0x0
field public int flags;
@@ -8438,7 +8438,7 @@
ctor public InstrumentationInfo();
ctor public InstrumentationInfo(android.content.pm.InstrumentationInfo);
method public int describeContents();
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.InstrumentationInfo> CREATOR;
field public java.lang.String dataDir;
field public boolean functionalTest;
field public boolean handleProfiling;
@@ -8460,7 +8460,7 @@
method public java.lang.String getSourcePackage();
method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.LabeledIntent> CREATOR;
}
public class LauncherActivityInfo {
@@ -8499,7 +8499,7 @@
ctor public PackageInfo();
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.PackageInfo> CREATOR;
field public static final int INSTALL_LOCATION_AUTO = 0; // 0x0
field public static final int INSTALL_LOCATION_INTERNAL_ONLY = 1; // 0x1
field public static final int INSTALL_LOCATION_PREFER_EXTERNAL = 2; // 0x2
@@ -8592,7 +8592,7 @@
method public int getSessionId();
method public boolean isActive();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.PackageInstaller.SessionInfo> CREATOR;
}
public static class PackageInstaller.SessionParams implements android.os.Parcelable {
@@ -8606,7 +8606,7 @@
method public void setReferrerUri(android.net.Uri);
method public void setSize(long);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.PackageInstaller.SessionParams> CREATOR;
field public static final int MODE_FULL_INSTALL = 1; // 0x1
field public static final int MODE_INHERIT_EXISTING = 2; // 0x2
}
@@ -8839,7 +8839,7 @@
ctor public PackageStats(android.content.pm.PackageStats);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.PackageStats> CREATOR;
field public long cacheSize;
field public long codeSize;
field public long dataSize;
@@ -8856,7 +8856,7 @@
ctor public PathPermission(android.os.Parcel);
method public java.lang.String getReadPermission();
method public java.lang.String getWritePermission();
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.PathPermission> CREATOR;
}
public class PermissionGroupInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
@@ -8864,7 +8864,7 @@
ctor public PermissionGroupInfo(android.content.pm.PermissionGroupInfo);
method public int describeContents();
method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.PermissionGroupInfo> CREATOR;
field public static final int FLAG_PERSONAL_INFO = 1; // 0x1
field public int descriptionRes;
field public int flags;
@@ -8877,7 +8877,7 @@
ctor public PermissionInfo(android.content.pm.PermissionInfo);
method public int describeContents();
method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.PermissionInfo> CREATOR;
field public static final int FLAG_COSTS_MONEY = 1; // 0x1
field public static final int PROTECTION_DANGEROUS = 1; // 0x1
field public static final int PROTECTION_FLAG_APPOP = 64; // 0x40
@@ -8900,7 +8900,7 @@
ctor public ProviderInfo(android.content.pm.ProviderInfo);
method public int describeContents();
method public void dump(android.util.Printer, java.lang.String);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.ProviderInfo> CREATOR;
field public static final int FLAG_SINGLE_USER = 1073741824; // 0x40000000
field public java.lang.String authority;
field public int flags;
@@ -8923,7 +8923,7 @@
method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.ResolveInfo> CREATOR;
field public android.content.pm.ActivityInfo activityInfo;
field public android.content.IntentFilter filter;
field public int icon;
@@ -8949,7 +8949,7 @@
ctor public ServiceInfo(android.content.pm.ServiceInfo);
method public int describeContents();
method public void dump(android.util.Printer, java.lang.String);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.ServiceInfo> CREATOR;
field public static final int FLAG_ISOLATED_PROCESS = 2; // 0x2
field public static final int FLAG_SINGLE_USER = 1073741824; // 0x40000000
field public static final int FLAG_STOP_WITH_TASK = 1; // 0x1
@@ -8966,7 +8966,7 @@
method public char[] toChars(char[], int[]);
method public java.lang.String toCharsString();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.pm.Signature> CREATOR;
}
}
@@ -8987,7 +8987,7 @@
method public android.os.ParcelFileDescriptor getParcelFileDescriptor();
method public long getStartOffset();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.res.AssetFileDescriptor> CREATOR;
field public static final long UNKNOWN_LENGTH = -1L; // 0xffffffffffffffffL
}
@@ -9039,7 +9039,7 @@
method public static android.content.res.ColorStateList valueOf(int);
method public android.content.res.ColorStateList withAlpha(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.res.ColorStateList> CREATOR;
}
public final class Configuration implements java.lang.Comparable android.os.Parcelable {
@@ -9059,7 +9059,7 @@
method public void setToDefaults();
method public int updateFrom(android.content.res.Configuration);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.res.Configuration> CREATOR;
field public static final int DENSITY_DPI_UNDEFINED = 0; // 0x0
field public static final int HARDKEYBOARDHIDDEN_NO = 1; // 0x1
field public static final int HARDKEYBOARDHIDDEN_UNDEFINED = 0; // 0x0
@@ -9141,7 +9141,7 @@
public class ObbInfo implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.content.res.ObbInfo> CREATOR;
field public static final int OBB_OVERLAY = 1; // 0x1
field public java.lang.String filename;
field public int flags;
@@ -9317,7 +9317,7 @@
field protected deprecated java.lang.Long mCurrentRowID;
field protected int mPos;
field protected deprecated int mRowIdColumnIndex;
- field protected deprecated java.util.HashMap mUpdatedRows;
+ field protected deprecated java.util.HashMap<java.lang.Long, java.util.Map<java.lang.String, java.lang.Object>> mUpdatedRows;
}
protected static class AbstractCursor.SelfContentObserver extends android.database.ContentObserver {
@@ -9481,7 +9481,7 @@
method public boolean setNumColumns(int);
method public void setStartPosition(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.database.CursorWindow> CREATOR;
}
public class CursorWrapper implements android.database.Cursor {
@@ -9670,7 +9670,7 @@
method public void registerObserver(T);
method public void unregisterAll();
method public void unregisterObserver(T);
- field protected final java.util.ArrayList mObservers;
+ field protected final java.util.ArrayList<T> mObservers;
}
public class SQLException extends java.lang.RuntimeException {
@@ -10199,7 +10199,7 @@
method public android.graphics.Path toPath(int, int, int, int);
method public android.graphics.Path toPath(android.graphics.Path, int, int, int, int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.gesture.Gesture> CREATOR;
}
public final class GestureLibraries {
@@ -10431,7 +10431,7 @@
method public final void setPremultiplied(boolean);
method public void setWidth(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.graphics.Bitmap> CREATOR;
field public static final int DENSITY_NONE = 0; // 0x0
}
@@ -11235,7 +11235,7 @@
method public void readFromParcel(android.os.Parcel);
method public void set(int, int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.graphics.Point> CREATOR;
field public int x;
field public int y;
}
@@ -11254,7 +11254,7 @@
method public final void set(float, float);
method public final void set(android.graphics.PointF);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.graphics.PointF> CREATOR;
field public float x;
field public float y;
}
@@ -11338,7 +11338,7 @@
method public void union(int, int);
method public final int width();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.graphics.Rect> CREATOR;
field public int bottom;
field public int left;
field public int right;
@@ -11380,7 +11380,7 @@
method public void union(float, float);
method public final float width();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.graphics.RectF> CREATOR;
field public float bottom;
field public float left;
field public float right;
@@ -11420,7 +11420,7 @@
method public void translate(int, int, android.graphics.Region);
method public final boolean union(android.graphics.Rect);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.graphics.Region> CREATOR;
}
public static final class Region.Op extends java.lang.Enum {
@@ -12550,70 +12550,70 @@
method public T get(android.hardware.camera2.CameraCharacteristics.Key<T>);
method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys();
method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys();
- field public static final android.hardware.camera2.CameraCharacteristics.Key COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key CONTROL_AE_AVAILABLE_ANTIBANDING_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key CONTROL_AE_AVAILABLE_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key CONTROL_AE_COMPENSATION_RANGE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key CONTROL_AE_COMPENSATION_STEP;
- field public static final android.hardware.camera2.CameraCharacteristics.Key CONTROL_AF_AVAILABLE_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key CONTROL_AVAILABLE_EFFECTS;
- field public static final android.hardware.camera2.CameraCharacteristics.Key CONTROL_AVAILABLE_SCENE_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key CONTROL_AWB_AVAILABLE_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key CONTROL_MAX_REGIONS_AE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key CONTROL_MAX_REGIONS_AF;
- field public static final android.hardware.camera2.CameraCharacteristics.Key CONTROL_MAX_REGIONS_AWB;
- field public static final android.hardware.camera2.CameraCharacteristics.Key EDGE_AVAILABLE_EDGE_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key FLASH_INFO_AVAILABLE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key INFO_SUPPORTED_HARDWARE_LEVEL;
- field public static final android.hardware.camera2.CameraCharacteristics.Key JPEG_AVAILABLE_THUMBNAIL_SIZES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key LENS_FACING;
- field public static final android.hardware.camera2.CameraCharacteristics.Key LENS_INFO_AVAILABLE_APERTURES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key LENS_INFO_AVAILABLE_FILTER_DENSITIES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key LENS_INFO_AVAILABLE_FOCAL_LENGTHS;
- field public static final android.hardware.camera2.CameraCharacteristics.Key LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key LENS_INFO_FOCUS_DISTANCE_CALIBRATION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key LENS_INFO_HYPERFOCAL_DISTANCE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key LENS_INFO_MINIMUM_FOCUS_DISTANCE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key REQUEST_AVAILABLE_CAPABILITIES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key REQUEST_MAX_NUM_OUTPUT_PROC;
- field public static final android.hardware.camera2.CameraCharacteristics.Key REQUEST_MAX_NUM_OUTPUT_PROC_STALLING;
- field public static final android.hardware.camera2.CameraCharacteristics.Key REQUEST_MAX_NUM_OUTPUT_RAW;
- field public static final android.hardware.camera2.CameraCharacteristics.Key REQUEST_PARTIAL_RESULT_COUNT;
- field public static final android.hardware.camera2.CameraCharacteristics.Key REQUEST_PIPELINE_MAX_DEPTH;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SCALER_AVAILABLE_MAX_DIGITAL_ZOOM;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SCALER_CROPPING_TYPE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SCALER_STREAM_CONFIGURATION_MAP;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_AVAILABLE_TEST_PATTERN_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_BLACK_LEVEL_PATTERN;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_CALIBRATION_TRANSFORM1;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_CALIBRATION_TRANSFORM2;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_COLOR_TRANSFORM1;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_COLOR_TRANSFORM2;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_FORWARD_MATRIX1;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_FORWARD_MATRIX2;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_INFO_ACTIVE_ARRAY_SIZE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_INFO_COLOR_FILTER_ARRANGEMENT;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_INFO_EXPOSURE_TIME_RANGE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_INFO_MAX_FRAME_DURATION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_INFO_PHYSICAL_SIZE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_INFO_PIXEL_ARRAY_SIZE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_INFO_SENSITIVITY_RANGE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_INFO_TIMESTAMP_SOURCE;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_INFO_WHITE_LEVEL;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_MAX_ANALOG_SENSITIVITY;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_ORIENTATION;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_REFERENCE_ILLUMINANT1;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SENSOR_REFERENCE_ILLUMINANT2;
- field public static final android.hardware.camera2.CameraCharacteristics.Key STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key STATISTICS_INFO_MAX_FACE_COUNT;
- field public static final android.hardware.camera2.CameraCharacteristics.Key SYNC_MAX_LATENCY;
- field public static final android.hardware.camera2.CameraCharacteristics.Key TONEMAP_AVAILABLE_TONE_MAP_MODES;
- field public static final android.hardware.camera2.CameraCharacteristics.Key TONEMAP_MAX_CURVE_POINTS;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_ANTIBANDING_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AE_AVAILABLE_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>[]> CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_COMPENSATION_RANGE;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Rational> CONTROL_AE_COMPENSATION_STEP;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AF_AVAILABLE_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_EFFECTS;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_SCENE_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AWB_AVAILABLE_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AE;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AF;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> CONTROL_MAX_REGIONS_AWB;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> EDGE_AVAILABLE_EDGE_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> FLASH_INFO_AVAILABLE;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> INFO_SUPPORTED_HARDWARE_LEVEL;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Size[]> JPEG_AVAILABLE_THUMBNAIL_SIZES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_FACING;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_APERTURES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_FILTER_DENSITIES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<float[]> LENS_INFO_AVAILABLE_FOCAL_LENGTHS;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> LENS_INFO_FOCUS_DISTANCE_CALIBRATION;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> LENS_INFO_HYPERFOCAL_DISTANCE;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> LENS_INFO_MINIMUM_FOCUS_DISTANCE;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> REQUEST_AVAILABLE_CAPABILITIES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_PROC;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_PROC_STALLING;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_MAX_NUM_OUTPUT_RAW;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> REQUEST_PARTIAL_RESULT_COUNT;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Byte> REQUEST_PIPELINE_MAX_DEPTH;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Float> SCALER_AVAILABLE_MAX_DIGITAL_ZOOM;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SCALER_CROPPING_TYPE;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.StreamConfigurationMap> SCALER_STREAM_CONFIGURATION_MAP;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> SENSOR_AVAILABLE_TEST_PATTERN_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.BlackLevelPattern> SENSOR_BLACK_LEVEL_PATTERN;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM1;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_CALIBRATION_TRANSFORM2;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM1;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_COLOR_TRANSFORM2;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX1;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.ColorSpaceTransform> SENSOR_FORWARD_MATRIX2;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.graphics.Rect> SENSOR_INFO_ACTIVE_ARRAY_SIZE;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_COLOR_FILTER_ARRANGEMENT;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Long>> SENSOR_INFO_EXPOSURE_TIME_RANGE;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Long> SENSOR_INFO_MAX_FRAME_DURATION;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.SizeF> SENSOR_INFO_PHYSICAL_SIZE;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Size> SENSOR_INFO_PIXEL_ARRAY_SIZE;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Range<java.lang.Integer>> SENSOR_INFO_SENSITIVITY_RANGE;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_TIMESTAMP_SOURCE;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_INFO_WHITE_LEVEL;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_MAX_ANALOG_SENSITIVITY;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_ORIENTATION;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SENSOR_REFERENCE_ILLUMINANT1;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Byte> SENSOR_REFERENCE_ILLUMINANT2;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<boolean[]> STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> STATISTICS_INFO_MAX_FACE_COUNT;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> SYNC_MAX_LATENCY;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> TONEMAP_AVAILABLE_TONE_MAP_MODES;
+ field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> TONEMAP_MAX_CURVE_POINTS;
}
public static final class CameraCharacteristics.Key {
@@ -12856,56 +12856,56 @@
method public T get(android.hardware.camera2.CaptureRequest.Key<T>);
method public java.lang.Object getTag();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.hardware.camera2.CaptureRequest.Key BLACK_LEVEL_LOCK;
- field public static final android.hardware.camera2.CaptureRequest.Key COLOR_CORRECTION_ABERRATION_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key COLOR_CORRECTION_GAINS;
- field public static final android.hardware.camera2.CaptureRequest.Key COLOR_CORRECTION_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key COLOR_CORRECTION_TRANSFORM;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_AE_ANTIBANDING_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_AE_EXPOSURE_COMPENSATION;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_AE_LOCK;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_AE_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_AE_PRECAPTURE_TRIGGER;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_AE_REGIONS;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_AE_TARGET_FPS_RANGE;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_AF_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_AF_REGIONS;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_AF_TRIGGER;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_AWB_LOCK;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_AWB_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_AWB_REGIONS;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_CAPTURE_INTENT;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_EFFECT_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_SCENE_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key CONTROL_VIDEO_STABILIZATION_MODE;
- field public static final android.os.Parcelable.Creator CREATOR;
- field public static final android.hardware.camera2.CaptureRequest.Key EDGE_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key FLASH_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key HOT_PIXEL_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key JPEG_GPS_LOCATION;
- field public static final android.hardware.camera2.CaptureRequest.Key JPEG_ORIENTATION;
- field public static final android.hardware.camera2.CaptureRequest.Key JPEG_QUALITY;
- field public static final android.hardware.camera2.CaptureRequest.Key JPEG_THUMBNAIL_QUALITY;
- field public static final android.hardware.camera2.CaptureRequest.Key JPEG_THUMBNAIL_SIZE;
- field public static final android.hardware.camera2.CaptureRequest.Key LENS_APERTURE;
- field public static final android.hardware.camera2.CaptureRequest.Key LENS_FILTER_DENSITY;
- field public static final android.hardware.camera2.CaptureRequest.Key LENS_FOCAL_LENGTH;
- field public static final android.hardware.camera2.CaptureRequest.Key LENS_FOCUS_DISTANCE;
- field public static final android.hardware.camera2.CaptureRequest.Key LENS_OPTICAL_STABILIZATION_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key NOISE_REDUCTION_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key SCALER_CROP_REGION;
- field public static final android.hardware.camera2.CaptureRequest.Key SENSOR_EXPOSURE_TIME;
- field public static final android.hardware.camera2.CaptureRequest.Key SENSOR_FRAME_DURATION;
- field public static final android.hardware.camera2.CaptureRequest.Key SENSOR_SENSITIVITY;
- field public static final android.hardware.camera2.CaptureRequest.Key SENSOR_TEST_PATTERN_DATA;
- field public static final android.hardware.camera2.CaptureRequest.Key SENSOR_TEST_PATTERN_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key SHADING_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key STATISTICS_FACE_DETECT_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key STATISTICS_HOT_PIXEL_MAP_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key STATISTICS_LENS_SHADING_MAP_MODE;
- field public static final android.hardware.camera2.CaptureRequest.Key TONEMAP_CURVE;
- field public static final android.hardware.camera2.CaptureRequest.Key TONEMAP_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> BLACK_LEVEL_LOCK;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> COLOR_CORRECTION_ABERRATION_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> COLOR_CORRECTION_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_ANTIBANDING_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_EXPOSURE_COMPENSATION;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_AE_LOCK;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AE_PRECAPTURE_TRIGGER;
+ field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS;
+ field public static final android.hardware.camera2.CaptureRequest.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_TARGET_FPS_RANGE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AF_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AF_TRIGGER;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_AWB_LOCK;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AWB_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_CAPTURE_INTENT;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_EFFECT_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_SCENE_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_VIDEO_STABILIZATION_MODE;
+ field public static final android.os.Parcelable.Creator<android.hardware.camera2.CaptureRequest> CREATOR;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> EDGE_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> FLASH_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> HOT_PIXEL_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<android.location.Location> JPEG_GPS_LOCATION;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> JPEG_ORIENTATION;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Byte> JPEG_QUALITY;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Byte> JPEG_THUMBNAIL_QUALITY;
+ field public static final android.hardware.camera2.CaptureRequest.Key<android.util.Size> JPEG_THUMBNAIL_SIZE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_APERTURE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FILTER_DENSITY;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FOCAL_LENGTH;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Float> LENS_FOCUS_DISTANCE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> LENS_OPTICAL_STABILIZATION_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> NOISE_REDUCTION_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<android.graphics.Rect> SCALER_CROP_REGION;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Long> SENSOR_EXPOSURE_TIME;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Long> SENSOR_FRAME_DURATION;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SENSOR_SENSITIVITY;
+ field public static final android.hardware.camera2.CaptureRequest.Key<int[]> SENSOR_TEST_PATTERN_DATA;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SENSOR_TEST_PATTERN_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> SHADING_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_FACE_DETECT_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> STATISTICS_HOT_PIXEL_MAP_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE;
+ field public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> TONEMAP_MODE;
}
public static final class CaptureRequest.Builder {
@@ -12928,71 +12928,71 @@
method public long getFrameNumber();
method public android.hardware.camera2.CaptureRequest getRequest();
method public int getSequenceId();
- field public static final android.hardware.camera2.CaptureResult.Key BLACK_LEVEL_LOCK;
- field public static final android.hardware.camera2.CaptureResult.Key COLOR_CORRECTION_ABERRATION_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key COLOR_CORRECTION_GAINS;
- field public static final android.hardware.camera2.CaptureResult.Key COLOR_CORRECTION_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key COLOR_CORRECTION_TRANSFORM;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AE_ANTIBANDING_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AE_EXPOSURE_COMPENSATION;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AE_LOCK;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AE_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AE_PRECAPTURE_TRIGGER;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AE_REGIONS;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AE_STATE;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AE_TARGET_FPS_RANGE;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AF_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AF_REGIONS;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AF_STATE;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AF_TRIGGER;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AWB_LOCK;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AWB_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AWB_REGIONS;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_AWB_STATE;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_CAPTURE_INTENT;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_EFFECT_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_SCENE_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key CONTROL_VIDEO_STABILIZATION_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key EDGE_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key FLASH_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key FLASH_STATE;
- field public static final android.hardware.camera2.CaptureResult.Key HOT_PIXEL_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key JPEG_GPS_LOCATION;
- field public static final android.hardware.camera2.CaptureResult.Key JPEG_ORIENTATION;
- field public static final android.hardware.camera2.CaptureResult.Key JPEG_QUALITY;
- field public static final android.hardware.camera2.CaptureResult.Key JPEG_THUMBNAIL_QUALITY;
- field public static final android.hardware.camera2.CaptureResult.Key JPEG_THUMBNAIL_SIZE;
- field public static final android.hardware.camera2.CaptureResult.Key LENS_APERTURE;
- field public static final android.hardware.camera2.CaptureResult.Key LENS_FILTER_DENSITY;
- field public static final android.hardware.camera2.CaptureResult.Key LENS_FOCAL_LENGTH;
- field public static final android.hardware.camera2.CaptureResult.Key LENS_FOCUS_DISTANCE;
- field public static final android.hardware.camera2.CaptureResult.Key LENS_FOCUS_RANGE;
- field public static final android.hardware.camera2.CaptureResult.Key LENS_OPTICAL_STABILIZATION_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key LENS_STATE;
- field public static final android.hardware.camera2.CaptureResult.Key NOISE_REDUCTION_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key REQUEST_PIPELINE_DEPTH;
- field public static final android.hardware.camera2.CaptureResult.Key SCALER_CROP_REGION;
- field public static final android.hardware.camera2.CaptureResult.Key SENSOR_EXPOSURE_TIME;
- field public static final android.hardware.camera2.CaptureResult.Key SENSOR_FRAME_DURATION;
- field public static final android.hardware.camera2.CaptureResult.Key SENSOR_GREEN_SPLIT;
- field public static final android.hardware.camera2.CaptureResult.Key SENSOR_NEUTRAL_COLOR_POINT;
- field public static final android.hardware.camera2.CaptureResult.Key SENSOR_NOISE_PROFILE;
- field public static final android.hardware.camera2.CaptureResult.Key SENSOR_ROLLING_SHUTTER_SKEW;
- field public static final android.hardware.camera2.CaptureResult.Key SENSOR_SENSITIVITY;
- field public static final android.hardware.camera2.CaptureResult.Key SENSOR_TEST_PATTERN_DATA;
- field public static final android.hardware.camera2.CaptureResult.Key SENSOR_TEST_PATTERN_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key SENSOR_TIMESTAMP;
- field public static final android.hardware.camera2.CaptureResult.Key SHADING_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key STATISTICS_FACES;
- field public static final android.hardware.camera2.CaptureResult.Key STATISTICS_FACE_DETECT_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key STATISTICS_HOT_PIXEL_MAP;
- field public static final android.hardware.camera2.CaptureResult.Key STATISTICS_HOT_PIXEL_MAP_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key STATISTICS_LENS_SHADING_CORRECTION_MAP;
- field public static final android.hardware.camera2.CaptureResult.Key STATISTICS_LENS_SHADING_MAP_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key STATISTICS_SCENE_FLICKER;
- field public static final android.hardware.camera2.CaptureResult.Key TONEMAP_CURVE;
- field public static final android.hardware.camera2.CaptureResult.Key TONEMAP_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> BLACK_LEVEL_LOCK;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> COLOR_CORRECTION_ABERRATION_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.RggbChannelVector> COLOR_CORRECTION_GAINS;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> COLOR_CORRECTION_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.ColorSpaceTransform> COLOR_CORRECTION_TRANSFORM;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_ANTIBANDING_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_EXPOSURE_COMPENSATION;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_AE_LOCK;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_PRECAPTURE_TRIGGER;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AE_REGIONS;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AE_STATE;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.util.Range<java.lang.Integer>> CONTROL_AE_TARGET_FPS_RANGE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AF_REGIONS;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_STATE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AF_TRIGGER;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_AWB_LOCK;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AWB_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AWB_STATE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_CAPTURE_INTENT;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_EFFECT_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_SCENE_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_VIDEO_STABILIZATION_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> EDGE_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> FLASH_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> FLASH_STATE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> HOT_PIXEL_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.location.Location> JPEG_GPS_LOCATION;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> JPEG_ORIENTATION;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> JPEG_QUALITY;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> JPEG_THUMBNAIL_QUALITY;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.util.Size> JPEG_THUMBNAIL_SIZE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_APERTURE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FILTER_DENSITY;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCAL_LENGTH;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> LENS_FOCUS_DISTANCE;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Float, java.lang.Float>> LENS_FOCUS_RANGE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_OPTICAL_STABILIZATION_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_STATE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> NOISE_REDUCTION_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> REQUEST_PIPELINE_DEPTH;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.graphics.Rect> SCALER_CROP_REGION;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_EXPOSURE_TIME;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_FRAME_DURATION;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> SENSOR_GREEN_SPLIT;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.util.Rational[]> SENSOR_NEUTRAL_COLOR_POINT;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.util.Pair<java.lang.Double, java.lang.Double>[]> SENSOR_NOISE_PROFILE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_ROLLING_SHUTTER_SKEW;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_SENSITIVITY;
+ field public static final android.hardware.camera2.CaptureResult.Key<int[]> SENSOR_TEST_PATTERN_DATA;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SENSOR_TEST_PATTERN_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Long> SENSOR_TIMESTAMP;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> SHADING_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.Face[]> STATISTICS_FACES;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_FACE_DETECT_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.graphics.Point[]> STATISTICS_HOT_PIXEL_MAP;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> STATISTICS_HOT_PIXEL_MAP_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.LensShadingMap> STATISTICS_LENS_SHADING_CORRECTION_MAP;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_SCENE_FLICKER;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE;
+ field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_MODE;
}
public static final class CaptureResult.Key {
@@ -13195,7 +13195,7 @@
method public java.lang.String getUri();
method public java.lang.String getVersion();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.hardware.usb.UsbAccessory> CREATOR;
}
public class UsbConfiguration implements android.os.Parcelable {
@@ -13208,7 +13208,7 @@
method public boolean isRemoteWakeup();
method public boolean isSelfPowered();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.hardware.usb.UsbConfiguration> CREATOR;
}
public final class UsbConstants {
@@ -13267,7 +13267,7 @@
method public java.lang.String getSerialNumber();
method public int getVendorId();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.hardware.usb.UsbDevice> CREATOR;
}
public class UsbDeviceConnection {
@@ -13296,7 +13296,7 @@
method public int getMaxPacketSize();
method public int getType();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.hardware.usb.UsbEndpoint> CREATOR;
}
public class UsbInterface implements android.os.Parcelable {
@@ -13310,7 +13310,7 @@
method public int getInterfaceSubclass();
method public java.lang.String getName();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.hardware.usb.UsbInterface> CREATOR;
}
public class UsbManager {
@@ -13667,7 +13667,7 @@
method public void setThoroughfare(java.lang.String);
method public void setUrl(java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.location.Address> CREATOR;
}
public class Criteria implements android.os.Parcelable {
@@ -13700,7 +13700,7 @@
field public static final int ACCURACY_HIGH = 3; // 0x3
field public static final int ACCURACY_LOW = 1; // 0x1
field public static final int ACCURACY_MEDIUM = 2; // 0x2
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.location.Criteria> CREATOR;
field public static final int NO_REQUIREMENT = 0; // 0x0
field public static final int POWER_HIGH = 3; // 0x3
field public static final int POWER_LOW = 1; // 0x1
@@ -13786,7 +13786,7 @@
method public void setSpeed(float);
method public void setTime(long);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.location.Location> CREATOR;
field public static final int FORMAT_DEGREES = 0; // 0x0
field public static final int FORMAT_MINUTES = 1; // 0x1
field public static final int FORMAT_SECONDS = 2; // 0x2
@@ -13896,7 +13896,7 @@
field public static final int CONTENT_TYPE_SONIFICATION = 4; // 0x4
field public static final int CONTENT_TYPE_SPEECH = 1; // 0x1
field public static final int CONTENT_TYPE_UNKNOWN = 0; // 0x0
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.media.AudioAttributes> CREATOR;
field public static final int FLAG_AUDIBILITY_ENFORCED = 1; // 0x1
field public static final int FLAG_HW_AV_SYNC = 16; // 0x10
field public static final int USAGE_ALARM = 4; // 0x4
@@ -14767,7 +14767,7 @@
method public java.lang.CharSequence getSubtitle();
method public java.lang.CharSequence getTitle();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.media.MediaDescription> CREATOR;
}
public static class MediaDescription.Builder {
@@ -14967,7 +14967,7 @@
method public java.util.Set<java.lang.String> keySet();
method public int size();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.media.MediaMetadata> CREATOR;
field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
@@ -15468,7 +15468,7 @@
method public static android.media.Rating newThumbRating(boolean);
method public static android.media.Rating newUnratedRating(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.media.Rating> CREATOR;
field public static final int RATING_3_STARS = 3; // 0x3
field public static final int RATING_4_STARS = 4; // 0x4
field public static final int RATING_5_STARS = 5; // 0x5
@@ -16118,7 +16118,7 @@
method public boolean isBrowsable();
method public boolean isPlayable();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.media.browse.MediaBrowser.MediaItem> CREATOR;
field public static final int FLAG_BROWSABLE = 1; // 0x1
field public static final int FLAG_PLAYABLE = 2; // 0x2
}
@@ -16320,14 +16320,14 @@
method public android.media.MediaDescription getDescription();
method public long getQueueId();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.media.session.MediaSession.QueueItem> CREATOR;
field public static final int UNKNOWN_ID = -1; // 0xffffffff
}
public static final class MediaSession.Token implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.media.session.MediaSession.Token> CREATOR;
}
public final class MediaSessionManager {
@@ -16366,7 +16366,7 @@
field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L
field public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096L; // 0x1000L
field public static final long ACTION_STOP = 1L; // 0x1L
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.media.session.PlaybackState> CREATOR;
field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
field public static final int STATE_BUFFERING = 6; // 0x6
field public static final int STATE_CONNECTING = 8; // 0x8
@@ -16403,7 +16403,7 @@
method public int getIcon();
method public java.lang.CharSequence getName();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.media.session.PlaybackState.CustomAction> CREATOR;
}
public static final class PlaybackState.CustomAction.Builder {
@@ -16566,7 +16566,7 @@
method public android.graphics.drawable.Drawable loadIcon(android.content.Context);
method public java.lang.CharSequence loadLabel(android.content.Context);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.media.tv.TvInputInfo> CREATOR;
field public static final java.lang.String EXTRA_INPUT_ID = "android.media.tv.extra.INPUT_ID";
field public static final int TYPE_COMPONENT = 1004; // 0x3ec
field public static final int TYPE_COMPOSITE = 1001; // 0x3e9
@@ -16664,7 +16664,7 @@
method public final int getVideoHeight();
method public final int getVideoWidth();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.media.tv.TvTrackInfo> CREATOR;
field public static final int TYPE_AUDIO = 0; // 0x0
field public static final int TYPE_SUBTITLE = 2; // 0x2
field public static final int TYPE_VIDEO = 1; // 0x1
@@ -16936,7 +16936,7 @@
method public int getPrefixLength();
method public byte[] getRawAddress();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.IpPrefix> CREATOR;
}
public class LinkAddress implements android.os.Parcelable {
@@ -16946,7 +16946,7 @@
method public int getPrefixLength();
method public int getScope();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.LinkAddress> CREATOR;
}
public final class LinkProperties implements android.os.Parcelable {
@@ -16958,7 +16958,7 @@
method public java.util.List<android.net.LinkAddress> getLinkAddresses();
method public java.util.List<android.net.RouteInfo> getRoutes();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.LinkProperties> CREATOR;
}
public class LocalServerSocket {
@@ -17037,7 +17037,7 @@
method public javax.net.SocketFactory getSocketFactory();
method public java.net.URLConnection openConnection(java.net.URL) throws java.io.IOException;
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.Network> CREATOR;
}
public final class NetworkCapabilities implements android.os.Parcelable {
@@ -17048,7 +17048,7 @@
method public boolean hasCapability(int);
method public boolean hasTransport(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.NetworkCapabilities> CREATOR;
field public static final int NET_CAPABILITY_CBS = 5; // 0x5
field public static final int NET_CAPABILITY_DUN = 2; // 0x2
field public static final int NET_CAPABILITY_EIMS = 10; // 0xa
@@ -17122,7 +17122,7 @@
public class NetworkRequest implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.NetworkRequest> CREATOR;
}
public static class NetworkRequest.Builder {
@@ -17159,7 +17159,7 @@
method public android.net.Uri getPacFileUrl();
method public int getPort();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.ProxyInfo> CREATOR;
}
public abstract class PskKeyManager {
@@ -17183,7 +17183,7 @@
method public boolean isDefaultRoute();
method public boolean matches(java.net.InetAddress);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.RouteInfo> CREATOR;
}
public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory {
@@ -17282,7 +17282,7 @@
method public abstract java.lang.String toString();
method public static android.net.Uri withAppendedPath(android.net.Uri, java.lang.String);
method public static void writeToParcel(android.os.Parcel, android.net.Uri);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.Uri> CREATOR;
field public static final android.net.Uri EMPTY;
}
@@ -17556,7 +17556,7 @@
method public void setServiceName(java.lang.String);
method public void setServiceType(java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.nsd.NsdServiceInfo> CREATOR;
}
}
@@ -17721,7 +17721,7 @@
method public java.lang.String getUriString();
method public java.lang.String getUserName();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.sip.SipProfile> CREATOR;
}
public static class SipProfile.Builder {
@@ -17920,7 +17920,7 @@
method public void setPhase2Method(int);
method public void setSubjectMatch(java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.wifi.WifiEnterpriseConfig> CREATOR;
}
public static final class WifiEnterpriseConfig.Eap {
@@ -18056,7 +18056,7 @@
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public java.lang.String BSSID;
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.wifi.WpsInfo> CREATOR;
field public static final int DISPLAY = 1; // 0x1
field public static final int INVALID = 4; // 0x4
field public static final int KEYPAD = 2; // 0x2
@@ -18075,7 +18075,7 @@
ctor public WifiP2pConfig(android.net.wifi.p2p.WifiP2pConfig);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pConfig> CREATOR;
field public java.lang.String deviceAddress;
field public int groupOwnerIntent;
field public android.net.wifi.WpsInfo wps;
@@ -18093,7 +18093,7 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final int AVAILABLE = 3; // 0x3
field public static final int CONNECTED = 0; // 0x0
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pDevice> CREATOR;
field public static final int FAILED = 2; // 0x2
field public static final int INVITED = 1; // 0x1
field public static final int UNAVAILABLE = 4; // 0x4
@@ -18111,7 +18111,7 @@
method public android.net.wifi.p2p.WifiP2pDevice get(java.lang.String);
method public java.util.Collection<android.net.wifi.p2p.WifiP2pDevice> getDeviceList();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pDeviceList> CREATOR;
}
public class WifiP2pGroup implements android.os.Parcelable {
@@ -18125,7 +18125,7 @@
method public java.lang.String getPassphrase();
method public boolean isGroupOwner();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pGroup> CREATOR;
}
public class WifiP2pInfo implements android.os.Parcelable {
@@ -18133,7 +18133,7 @@
ctor public WifiP2pInfo(android.net.wifi.p2p.WifiP2pInfo);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pInfo> CREATOR;
field public boolean groupFormed;
field public java.net.InetAddress groupOwnerAddress;
field public boolean isGroupOwner;
@@ -18280,7 +18280,7 @@
method public android.nfc.NdefRecord[] getRecords();
method public byte[] toByteArray();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.nfc.NdefMessage> CREATOR;
}
public final class NdefRecord implements android.os.Parcelable {
@@ -18301,7 +18301,7 @@
method public java.lang.String toMimeType();
method public android.net.Uri toUri();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.nfc.NdefRecord> CREATOR;
field public static final byte[] RTD_ALTERNATIVE_CARRIER;
field public static final byte[] RTD_HANDOVER_CARRIER;
field public static final byte[] RTD_HANDOVER_REQUEST;
@@ -18385,7 +18385,7 @@
method public byte[] getId();
method public java.lang.String[] getTechList();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.nfc.Tag> CREATOR;
}
public class TagLostException extends java.io.IOException {
@@ -21469,7 +21469,7 @@
method public void readFromParcel(android.os.Parcel);
method public void setClassLoader(java.lang.ClassLoader);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.os.Bundle> CREATOR;
field public static final android.os.Bundle EMPTY;
}
@@ -21597,7 +21597,7 @@
method public int getTotalSwappablePss();
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.os.Debug.MemoryInfo> CREATOR;
field public int dalvikPrivateDirty;
field public int dalvikPss;
field public int dalvikSharedDirty;
@@ -21638,7 +21638,7 @@
method public java.lang.String getText(int);
method public long getTimeMillis();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.os.DropBoxManager.Entry> CREATOR;
}
public class Environment {
@@ -21824,7 +21824,7 @@
method public void setData(android.os.Bundle);
method public void setTarget(android.os.Handler);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.os.Message> CREATOR;
field public int arg1;
field public int arg2;
field public java.lang.Object obj;
@@ -21851,7 +21851,7 @@
method public void send(android.os.Message) throws android.os.RemoteException;
method public static void writeMessengerOrNullToParcel(android.os.Messenger, android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.os.Messenger> CREATOR;
}
public class NetworkOnMainThreadException extends java.lang.RuntimeException {
@@ -21970,7 +21970,7 @@
method public final void writeTypedArray(T[], int);
method public final void writeTypedList(java.util.List<T>);
method public final void writeValue(java.lang.Object);
- field public static final android.os.Parcelable.Creator STRING_CREATOR;
+ field public static final android.os.Parcelable.Creator<java.lang.String> STRING_CREATOR;
}
public class ParcelFileDescriptor implements java.io.Closeable android.os.Parcelable {
@@ -21998,7 +21998,7 @@
method public static android.os.ParcelFileDescriptor open(java.io.File, int, android.os.Handler, android.os.ParcelFileDescriptor.OnCloseListener) throws java.io.IOException;
method public static int parseMode(java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.os.ParcelFileDescriptor> CREATOR;
field public static final int MODE_APPEND = 33554432; // 0x2000000
field public static final int MODE_CREATE = 134217728; // 0x8000000
field public static final int MODE_READ_ONLY = 268435456; // 0x10000000
@@ -22036,7 +22036,7 @@
method public static android.os.ParcelUuid fromString(java.lang.String);
method public java.util.UUID getUuid();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.os.ParcelUuid> CREATOR;
}
public abstract interface Parcelable {
@@ -22063,7 +22063,7 @@
method public final int getType();
method public boolean match(java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.os.PatternMatcher> CREATOR;
field public static final int PATTERN_LITERAL = 0; // 0x0
field public static final int PATTERN_PREFIX = 1; // 0x1
field public static final int PATTERN_SIMPLE_GLOB = 2; // 0x2
@@ -22078,7 +22078,7 @@
method public android.os.PersistableBundle getPersistableBundle(java.lang.String);
method public void putPersistableBundle(java.lang.String, android.os.PersistableBundle);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.os.PersistableBundle> CREATOR;
field public static final android.os.PersistableBundle EMPTY;
}
@@ -22182,7 +22182,7 @@
method protected void onReceiveResult(int, android.os.Bundle);
method public void send(int, android.os.Bundle);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.os.ResultReceiver> CREATOR;
}
public class StatFs {
@@ -22294,7 +22294,7 @@
method public static android.os.UserHandle readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
method public static void writeToParcel(android.os.UserHandle, android.os.Parcel);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.os.UserHandle> CREATOR;
}
public class UserManager {
@@ -22361,7 +22361,7 @@
method public boolean remove(android.os.WorkSource);
method public void set(android.os.WorkSource);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.os.WorkSource> CREATOR;
}
}
@@ -22566,7 +22566,7 @@
public static class Preference.BaseSavedState extends android.view.AbsSavedState {
ctor public Preference.BaseSavedState(android.os.Parcel);
ctor public Preference.BaseSavedState(android.os.Parcelable);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.preference.Preference.BaseSavedState> CREATOR;
}
public static abstract interface Preference.OnPreferenceChangeListener {
@@ -22626,7 +22626,7 @@
method public java.lang.CharSequence getTitle(android.content.res.Resources);
method public void readFromParcel(android.os.Parcel);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.preference.PreferenceActivity.Header> CREATOR;
field public java.lang.CharSequence breadCrumbShortTitle;
field public int breadCrumbShortTitleRes;
field public java.lang.CharSequence breadCrumbTitle;
@@ -22778,7 +22778,7 @@
method public int getStart();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.print.PageRange ALL_PAGES;
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.print.PageRange> CREATOR;
}
public final class PrintAttributes implements android.os.Parcelable {
@@ -22790,7 +22790,7 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final int COLOR_MODE_COLOR = 2; // 0x2
field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.print.PrintAttributes> CREATOR;
}
public static final class PrintAttributes.Builder {
@@ -22944,7 +22944,7 @@
field public static final int CONTENT_TYPE_DOCUMENT = 0; // 0x0
field public static final int CONTENT_TYPE_PHOTO = 1; // 0x1
field public static final int CONTENT_TYPE_UNKNOWN = -1; // 0xffffffff
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.print.PrintDocumentInfo> CREATOR;
field public static final int PAGE_COUNT_UNKNOWN = -1; // 0xffffffff
}
@@ -22971,7 +22971,7 @@
public final class PrintJobId implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.print.PrintJobId> CREATOR;
}
public final class PrintJobInfo implements android.os.Parcelable {
@@ -22985,7 +22985,7 @@
method public android.print.PrinterId getPrinterId();
method public int getState();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.print.PrintJobInfo> CREATOR;
field public static final int STATE_BLOCKED = 4; // 0x4
field public static final int STATE_CANCELED = 7; // 0x7
field public static final int STATE_COMPLETED = 5; // 0x5
@@ -23018,7 +23018,7 @@
method public android.print.PrintAttributes.Margins getMinMargins();
method public java.util.List<android.print.PrintAttributes.Resolution> getResolutions();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.print.PrinterCapabilitiesInfo> CREATOR;
}
public static final class PrinterCapabilitiesInfo.Builder {
@@ -23034,7 +23034,7 @@
method public int describeContents();
method public java.lang.String getLocalId();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.print.PrinterId> CREATOR;
}
public final class PrinterInfo implements android.os.Parcelable {
@@ -23045,7 +23045,7 @@
method public java.lang.String getName();
method public int getStatus();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.print.PrinterInfo> CREATOR;
field public static final int STATUS_BUSY = 2; // 0x2
field public static final int STATUS_IDLE = 1; // 0x1
field public static final int STATUS_UNAVAILABLE = 3; // 0x3
@@ -26951,7 +26951,7 @@
method public java.lang.String[] getOrderedKeys();
method public boolean getRanking(java.lang.String, android.service.notification.NotificationListenerService.Ranking);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.service.notification.NotificationListenerService.RankingMap> CREATOR;
}
public class StatusBarNotification implements android.os.Parcelable {
@@ -26971,7 +26971,7 @@
method public boolean isClearable();
method public boolean isOngoing();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.service.notification.StatusBarNotification> CREATOR;
}
}
@@ -27387,7 +27387,7 @@
method public int getQuality();
method public boolean isNetworkConnectionRequired();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.speech.tts.Voice> CREATOR;
field public static final int LATENCY_HIGH = 400; // 0x190
field public static final int LATENCY_LOW = 200; // 0xc8
field public static final int LATENCY_NORMAL = 300; // 0x12c
@@ -28068,7 +28068,7 @@
method public int getNetworkId();
method public int getSystemId();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.CellIdentityCdma> CREATOR;
}
public final class CellIdentityGsm implements android.os.Parcelable {
@@ -28079,7 +28079,7 @@
method public int getMnc();
method public deprecated int getPsc();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.CellIdentityGsm> CREATOR;
}
public final class CellIdentityLte implements android.os.Parcelable {
@@ -28090,7 +28090,7 @@
method public int getPci();
method public int getTac();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.CellIdentityLte> CREATOR;
}
public final class CellIdentityWcdma implements android.os.Parcelable {
@@ -28101,7 +28101,7 @@
method public int getMnc();
method public int getPsc();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.CellIdentityWcdma> CREATOR;
}
public abstract class CellInfo implements android.os.Parcelable {
@@ -28109,35 +28109,35 @@
method public long getTimeStamp();
method public boolean isRegistered();
method public abstract void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.CellInfo> CREATOR;
}
public final class CellInfoCdma extends android.telephony.CellInfo implements android.os.Parcelable {
method public android.telephony.CellIdentityCdma getCellIdentity();
method public android.telephony.CellSignalStrengthCdma getCellSignalStrength();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.CellInfoCdma> CREATOR;
}
public final class CellInfoGsm extends android.telephony.CellInfo implements android.os.Parcelable {
method public android.telephony.CellIdentityGsm getCellIdentity();
method public android.telephony.CellSignalStrengthGsm getCellSignalStrength();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.CellInfoGsm> CREATOR;
}
public final class CellInfoLte extends android.telephony.CellInfo implements android.os.Parcelable {
method public android.telephony.CellIdentityLte getCellIdentity();
method public android.telephony.CellSignalStrengthLte getCellSignalStrength();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.CellInfoLte> CREATOR;
}
public final class CellInfoWcdma extends android.telephony.CellInfo implements android.os.Parcelable {
method public android.telephony.CellIdentityWcdma getCellIdentity();
method public android.telephony.CellSignalStrengthWcdma getCellSignalStrength();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.CellInfoWcdma> CREATOR;
}
public abstract class CellLocation {
@@ -28169,7 +28169,7 @@
method public int getLevel();
method public int hashCode();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.CellSignalStrengthCdma> CREATOR;
}
public final class CellSignalStrengthGsm extends android.telephony.CellSignalStrength implements android.os.Parcelable {
@@ -28180,7 +28180,7 @@
method public int getLevel();
method public int hashCode();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.CellSignalStrengthGsm> CREATOR;
}
public final class CellSignalStrengthLte extends android.telephony.CellSignalStrength implements android.os.Parcelable {
@@ -28192,7 +28192,7 @@
method public int getTimingAdvance();
method public int hashCode();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.CellSignalStrengthLte> CREATOR;
}
public final class CellSignalStrengthWcdma extends android.telephony.CellSignalStrength implements android.os.Parcelable {
@@ -28203,7 +28203,7 @@
method public int getLevel();
method public int hashCode();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.CellSignalStrengthWcdma> CREATOR;
}
public class IccOpenLogicalChannelResponse implements android.os.Parcelable {
@@ -28212,7 +28212,7 @@
method public byte[] getSelectResponse();
method public int getStatus();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.IccOpenLogicalChannelResponse> CREATOR;
field public static final int INVALID_CHANNEL = -1; // 0xffffffff
field public static final int STATUS_MISSING_RESOURCE = 2; // 0x2
field public static final int STATUS_NO_ERROR = 1; // 0x1
@@ -28234,7 +28234,7 @@
method public deprecated void setCid(int);
method public deprecated void setRssi(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.NeighboringCellInfo> CREATOR;
field public static final int UNKNOWN_CID = -1; // 0xffffffff
field public static final int UNKNOWN_RSSI = 99; // 0x63
}
@@ -28341,7 +28341,7 @@
method public void setStateOff();
method public void setStateOutOfService();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.ServiceState> CREATOR;
field public static final int STATE_EMERGENCY_ONLY = 2; // 0x2
field public static final int STATE_IN_SERVICE = 0; // 0x0
field public static final int STATE_OUT_OF_SERVICE = 1; // 0x1
@@ -29806,7 +29806,7 @@
field public static final int CAP_MODE_CHARACTERS = 4096; // 0x1000
field public static final int CAP_MODE_SENTENCES = 16384; // 0x4000
field public static final int CAP_MODE_WORDS = 8192; // 0x2000
- field public static final android.os.Parcelable.Creator CHAR_SEQUENCE_CREATOR;
+ field public static final android.os.Parcelable.Creator<java.lang.CharSequence> CHAR_SEQUENCE_CREATOR;
}
public static abstract interface TextUtils.EllipsizeCallback {
@@ -30530,7 +30530,7 @@
method public void updateDrawState(android.text.TextPaint);
method public void writeToParcel(android.os.Parcel, int);
field public static final java.lang.String ACTION_SUGGESTION_PICKED = "android.text.style.SUGGESTION_PICKED";
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.text.style.SuggestionSpan> CREATOR;
field public static final int FLAG_AUTO_CORRECTION = 4; // 0x4
field public static final int FLAG_EASY_CORRECT = 1; // 0x1
field public static final int FLAG_MISSPELLED = 2; // 0x2
@@ -31110,7 +31110,7 @@
public class TransitionValues {
ctor public TransitionValues();
- field public final java.util.Map values;
+ field public final java.util.Map<java.lang.String, java.lang.Object> values;
field public android.view.View view;
}
@@ -31818,7 +31818,7 @@
method public int describeContents();
method public final android.os.Parcelable getSuperState();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.AbsSavedState> CREATOR;
field public static final android.view.AbsSavedState EMPTY_STATE;
}
@@ -31951,7 +31951,7 @@
field public static final int ACTION_DRAG_LOCATION = 2; // 0x2
field public static final int ACTION_DRAG_STARTED = 1; // 0x1
field public static final int ACTION_DROP = 3; // 0x3
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.DragEvent> CREATOR;
}
public class FocusFinder {
@@ -32088,7 +32088,7 @@
method public boolean isVirtual();
method public boolean supportsSource(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.InputDevice> CREATOR;
field public static final int KEYBOARD_TYPE_ALPHABETIC = 2; // 0x2
field public static final int KEYBOARD_TYPE_NONE = 0; // 0x0
field public static final int KEYBOARD_TYPE_NON_ALPHABETIC = 1; // 0x1
@@ -32142,7 +32142,7 @@
method public abstract long getEventTime();
method public abstract int getSource();
method public boolean isFromSource(int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.InputEvent> CREATOR;
}
public final class InputQueue {
@@ -32174,7 +32174,7 @@
field public static final deprecated int BUILT_IN_KEYBOARD = 0; // 0x0
field public static final int COMBINING_ACCENT = -2147483648; // 0x80000000
field public static final int COMBINING_ACCENT_MASK = 2147483647; // 0x7fffffff
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.KeyCharacterMap> CREATOR;
field public static final int FULL = 4; // 0x4
field public static final char HEX_INPUT = 61184; // 0xef00 '\uef00'
field public static final int MODIFIER_BEHAVIOR_CHORDED = 0; // 0x0
@@ -32266,7 +32266,7 @@
field public static final int ACTION_DOWN = 0; // 0x0
field public static final int ACTION_MULTIPLE = 2; // 0x2
field public static final int ACTION_UP = 1; // 0x1
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.KeyEvent> CREATOR;
field public static final int FLAG_CANCELED = 32; // 0x20
field public static final int FLAG_CANCELED_LONG_PRESS = 256; // 0x100
field public static final int FLAG_EDITOR_ACTION = 16; // 0x10
@@ -32866,7 +32866,7 @@
field public static final int BUTTON_PRIMARY = 1; // 0x1
field public static final int BUTTON_SECONDARY = 2; // 0x2
field public static final int BUTTON_TERTIARY = 4; // 0x4
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.MotionEvent> CREATOR;
field public static final int EDGE_BOTTOM = 2; // 0x2
field public static final int EDGE_LEFT = 4; // 0x4
field public static final int EDGE_RIGHT = 8; // 0x8
@@ -32992,7 +32992,7 @@
method public deprecated void unlockCanvas(android.graphics.Canvas);
method public void unlockCanvasAndPost(android.graphics.Canvas);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.Surface> CREATOR;
field public static final int ROTATION_0 = 0; // 0x0
field public static final int ROTATION_180 = 2; // 0x2
field public static final int ROTATION_270 = 3; // 0x3
@@ -33586,7 +33586,7 @@
field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
- field public static final android.util.Property ALPHA;
+ field public static final android.util.Property<android.view.View, java.lang.Float> ALPHA;
field public static final int DRAWING_CACHE_QUALITY_AUTO = 0; // 0x0
field public static final int DRAWING_CACHE_QUALITY_HIGH = 1048576; // 0x100000
field public static final int DRAWING_CACHE_QUALITY_LOW = 524288; // 0x80000
@@ -33652,11 +33652,11 @@
field protected static final int[] PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
field protected static final int[] PRESSED_STATE_SET;
field protected static final int[] PRESSED_WINDOW_FOCUSED_STATE_SET;
- field public static final android.util.Property ROTATION;
- field public static final android.util.Property ROTATION_X;
- field public static final android.util.Property ROTATION_Y;
- field public static final android.util.Property SCALE_X;
- field public static final android.util.Property SCALE_Y;
+ field public static final android.util.Property<android.view.View, java.lang.Float> ROTATION;
+ field public static final android.util.Property<android.view.View, java.lang.Float> ROTATION_X;
+ field public static final android.util.Property<android.view.View, java.lang.Float> ROTATION_Y;
+ field public static final android.util.Property<android.view.View, java.lang.Float> SCALE_X;
+ field public static final android.util.Property<android.view.View, java.lang.Float> SCALE_Y;
field public static final int SCREEN_STATE_OFF = 0; // 0x0
field public static final int SCREEN_STATE_ON = 1; // 0x1
field public static final int SCROLLBARS_INSIDE_INSET = 16777216; // 0x1000000
@@ -33697,15 +33697,15 @@
field public static final int TEXT_DIRECTION_LOCALE = 5; // 0x5
field public static final int TEXT_DIRECTION_LTR = 3; // 0x3
field public static final int TEXT_DIRECTION_RTL = 4; // 0x4
- field public static final android.util.Property TRANSLATION_X;
- field public static final android.util.Property TRANSLATION_Y;
- field public static final android.util.Property TRANSLATION_Z;
+ field public static final android.util.Property<android.view.View, java.lang.Float> TRANSLATION_X;
+ field public static final android.util.Property<android.view.View, java.lang.Float> TRANSLATION_Y;
+ field public static final android.util.Property<android.view.View, java.lang.Float> TRANSLATION_Z;
field protected static final java.lang.String VIEW_LOG_TAG = "View";
field public static final int VISIBLE = 0; // 0x0
field protected static final int[] WINDOW_FOCUSED_STATE_SET;
- field public static final android.util.Property X;
- field public static final android.util.Property Y;
- field public static final android.util.Property Z;
+ field public static final android.util.Property<android.view.View, java.lang.Float> X;
+ field public static final android.util.Property<android.view.View, java.lang.Float> Y;
+ field public static final android.util.Property<android.view.View, java.lang.Float> Z;
}
public static class View.AccessibilityDelegate {
@@ -33724,7 +33724,7 @@
public static class View.BaseSavedState extends android.view.AbsSavedState {
ctor public View.BaseSavedState(android.os.Parcel);
ctor public View.BaseSavedState(android.os.Parcelable);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.View.BaseSavedState> CREATOR;
}
public static class View.DragShadowBuilder {
@@ -34421,7 +34421,7 @@
public final class WindowAnimationFrameStats extends android.view.FrameStats implements android.os.Parcelable {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.WindowAnimationFrameStats> CREATOR;
}
public final class WindowContentFrameStats extends android.view.FrameStats implements android.os.Parcelable {
@@ -34429,7 +34429,7 @@
method public long getFramePostedTimeNano(int);
method public long getFrameReadyTimeNano(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.WindowContentFrameStats> CREATOR;
}
public class WindowId implements android.os.Parcelable {
@@ -34438,7 +34438,7 @@
method public void registerFocusObserver(android.view.WindowId.FocusObserver);
method public void unregisterFocusObserver(android.view.WindowId.FocusObserver);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.WindowId> CREATOR;
}
public static abstract class WindowId.FocusObserver {
@@ -34503,7 +34503,7 @@
field public static final float BRIGHTNESS_OVERRIDE_FULL = 1.0f;
field public static final float BRIGHTNESS_OVERRIDE_NONE = -1.0f;
field public static final float BRIGHTNESS_OVERRIDE_OFF = 0.0f;
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.WindowManager.LayoutParams> CREATOR;
field public static final int DIM_AMOUNT_CHANGED = 32; // 0x20
field public static final int FIRST_APPLICATION_WINDOW = 1; // 0x1
field public static final int FIRST_SUB_WINDOW = 1000; // 0x3e8
@@ -34649,7 +34649,7 @@
field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.accessibility.AccessibilityEvent> CREATOR;
field public static final int INVALID_POSITION = -1; // 0xffffffff
field public static final deprecated int MAX_TEXT_LENGTH = 500; // 0x1f4
field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
@@ -34841,7 +34841,7 @@
field public static final int ACTION_SELECT = 4; // 0x4
field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.accessibility.AccessibilityNodeInfo> CREATOR;
field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
field public static final int FOCUS_INPUT = 1; // 0x1
field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
@@ -34988,7 +34988,7 @@
method public static android.view.accessibility.AccessibilityWindowInfo obtain(android.view.accessibility.AccessibilityWindowInfo);
method public void recycle();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.accessibility.AccessibilityWindowInfo> CREATOR;
field public static final int TYPE_APPLICATION = 1; // 0x1
field public static final int TYPE_INPUT_METHOD = 2; // 0x2
field public static final int TYPE_SYSTEM = 3; // 0x3
@@ -35350,7 +35350,7 @@
method public int getPosition();
method public java.lang.CharSequence getText();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.inputmethod.CompletionInfo> CREATOR;
}
public final class CorrectionInfo implements android.os.Parcelable {
@@ -35360,7 +35360,7 @@
method public int getOffset();
method public java.lang.CharSequence getOldText();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.inputmethod.CorrectionInfo> CREATOR;
}
public final class CursorAnchorInfo implements android.os.Parcelable {
@@ -35379,7 +35379,7 @@
method public int getSelectionEnd();
method public int getSelectionStart();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.inputmethod.CursorAnchorInfo> CREATOR;
field public static final int FLAG_HAS_INVISIBLE_REGION = 2; // 0x2
field public static final int FLAG_HAS_VISIBLE_REGION = 1; // 0x1
field public static final int FLAG_IS_RTL = 4; // 0x4
@@ -35402,7 +35402,7 @@
method public void dump(android.util.Printer, java.lang.String);
method public final void makeCompatible(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.inputmethod.EditorInfo> CREATOR;
field public static final int IME_ACTION_DONE = 6; // 0x6
field public static final int IME_ACTION_GO = 2; // 0x2
field public static final int IME_ACTION_NEXT = 5; // 0x5
@@ -35440,7 +35440,7 @@
ctor public ExtractedText();
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.inputmethod.ExtractedText> CREATOR;
field public static final int FLAG_SELECTING = 2; // 0x2
field public static final int FLAG_SINGLE_LINE = 1; // 0x1
field public int flags;
@@ -35456,7 +35456,7 @@
ctor public ExtractedTextRequest();
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.inputmethod.ExtractedTextRequest> CREATOR;
field public int flags;
field public int hintMaxChars;
field public int hintMaxLines;
@@ -35472,7 +35472,7 @@
method public int getPid();
method public int getUid();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.inputmethod.InputBinding> CREATOR;
}
public abstract interface InputConnection {
@@ -35570,7 +35570,7 @@
method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.inputmethod.InputMethodInfo> CREATOR;
}
public final class InputMethodManager {
@@ -35657,7 +35657,7 @@
method public boolean isAuxiliary();
method public boolean overridesImplicitlyEnabledSubtype();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.inputmethod.InputMethodSubtype> CREATOR;
}
public static class InputMethodSubtype.InputMethodSubtypeBuilder {
@@ -35687,7 +35687,7 @@
method public int getSuggestionsCount();
method public android.view.textservice.SuggestionsInfo getSuggestionsInfoAt(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.textservice.SentenceSuggestionsInfo> CREATOR;
}
public final class SpellCheckerInfo implements android.os.Parcelable {
@@ -35702,7 +35702,7 @@
method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
method public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.textservice.SpellCheckerInfo> CREATOR;
}
public class SpellCheckerSession {
@@ -35731,7 +35731,7 @@
method public java.lang.String getLocale();
method public int getNameResId();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.textservice.SpellCheckerSubtype> CREATOR;
}
public final class SuggestionsInfo implements android.os.Parcelable {
@@ -35746,7 +35746,7 @@
method public int getSuggestionsCount();
method public void setCookieAndSequence(int, int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.textservice.SuggestionsInfo> CREATOR;
field public static final int RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS = 4; // 0x4
field public static final int RESULT_ATTR_IN_THE_DICTIONARY = 1; // 0x1
field public static final int RESULT_ATTR_LOOKS_LIKE_TYPO = 2; // 0x2
@@ -35763,7 +35763,7 @@
method public int getSequence();
method public java.lang.String getText();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.view.textservice.TextInfo> CREATOR;
}
public final class TextServicesManager {
@@ -38039,7 +38039,7 @@
method public void showNext(int);
method public void showPrevious(int);
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.widget.RemoteViews> CREATOR;
}
public static class RemoteViews.ActionException extends java.lang.RuntimeException {
@@ -38737,7 +38737,7 @@
}
public static class TextView.SavedState extends android.view.View.BaseSavedState {
- field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final android.os.Parcelable.Creator<android.widget.TextView.SavedState> CREATOR;
}
public class TimePicker extends android.widget.FrameLayout {
@@ -40463,7 +40463,7 @@
method public static java.lang.Boolean valueOf(boolean);
field public static final java.lang.Boolean FALSE;
field public static final java.lang.Boolean TRUE;
- field public static final java.lang.Class TYPE;
+ field public static final java.lang.Class<java.lang.Boolean> TYPE;
}
public final class Byte extends java.lang.Number implements java.lang.Comparable {
@@ -40485,7 +40485,7 @@
field public static final byte MAX_VALUE = 127; // 0x7f
field public static final byte MIN_VALUE = -128; // 0xffffff80
field public static final int SIZE = 8; // 0x8
- field public static final java.lang.Class TYPE;
+ field public static final java.lang.Class<java.lang.Byte> TYPE;
}
public abstract interface CharSequence {
@@ -40641,7 +40641,7 @@
field public static final byte START_PUNCTUATION = 21; // 0x15
field public static final byte SURROGATE = 19; // 0x13
field public static final byte TITLECASE_LETTER = 3; // 0x3
- field public static final java.lang.Class TYPE;
+ field public static final java.lang.Class<java.lang.Character> TYPE;
field public static final byte UNASSIGNED = 0; // 0x0
field public static final byte UPPERCASE_LETTER = 1; // 0x1
}
@@ -41037,7 +41037,7 @@
field public static final double NaN = (0.0/0.0);
field public static final double POSITIVE_INFINITY = (1.0/0.0);
field public static final int SIZE = 64; // 0x40
- field public static final java.lang.Class TYPE;
+ field public static final java.lang.Class<java.lang.Double> TYPE;
}
public abstract class Enum implements java.lang.Comparable java.io.Serializable {
@@ -41111,7 +41111,7 @@
field public static final float NaN = (0.0f/0.0f);
field public static final float POSITIVE_INFINITY = (1.0f/0.0f);
field public static final int SIZE = 32; // 0x20
- field public static final java.lang.Class TYPE;
+ field public static final java.lang.Class<java.lang.Float> TYPE;
}
public class IllegalAccessError extends java.lang.IncompatibleClassChangeError {
@@ -41209,7 +41209,7 @@
field public static final int MAX_VALUE = 2147483647; // 0x7fffffff
field public static final int MIN_VALUE = -2147483648; // 0x80000000
field public static final int SIZE = 32; // 0x20
- field public static final java.lang.Class TYPE;
+ field public static final java.lang.Class<java.lang.Integer> TYPE;
}
public class InternalError extends java.lang.VirtualMachineError {
@@ -41268,7 +41268,7 @@
field public static final long MAX_VALUE = 9223372036854775807L; // 0x7fffffffffffffffL
field public static final long MIN_VALUE = -9223372036854775808L; // 0x8000000000000000L
field public static final int SIZE = 64; // 0x40
- field public static final java.lang.Class TYPE;
+ field public static final java.lang.Class<java.lang.Long> TYPE;
}
public final class Math {
@@ -41576,7 +41576,7 @@
field public static final short MAX_VALUE = 32767; // 0x7fff
field public static final short MIN_VALUE = -32768; // 0xffff8000
field public static final int SIZE = 16; // 0x10
- field public static final java.lang.Class TYPE;
+ field public static final java.lang.Class<java.lang.Short> TYPE;
}
public class StackOverflowError extends java.lang.VirtualMachineError {
@@ -41730,7 +41730,7 @@
method public static java.lang.String valueOf(long);
method public static java.lang.String valueOf(java.lang.Object);
method public static java.lang.String valueOf(boolean);
- field public static final java.util.Comparator CASE_INSENSITIVE_ORDER;
+ field public static final java.util.Comparator<java.lang.String> CASE_INSENSITIVE_ORDER;
}
public final class StringBuffer extends java.lang.AbstractStringBuilder implements java.lang.Appendable java.lang.CharSequence java.io.Serializable {
@@ -42017,7 +42017,7 @@
}
public final class Void {
- field public static final java.lang.Class TYPE;
+ field public static final java.lang.Class<java.lang.Void> TYPE;
}
}
@@ -48502,9 +48502,9 @@
method public java.util.ResourceBundle newBundle(java.lang.String, java.util.Locale, java.lang.String, java.lang.ClassLoader, boolean) throws java.io.IOException, java.lang.IllegalAccessException, java.lang.InstantiationException;
method public java.lang.String toBundleName(java.lang.String, java.util.Locale);
method public final java.lang.String toResourceName(java.lang.String, java.lang.String);
- field public static final java.util.List FORMAT_CLASS;
- field public static final java.util.List FORMAT_DEFAULT;
- field public static final java.util.List FORMAT_PROPERTIES;
+ field public static final java.util.List<java.lang.String> FORMAT_CLASS;
+ field public static final java.util.List<java.lang.String> FORMAT_DEFAULT;
+ field public static final java.util.List<java.lang.String> FORMAT_PROPERTIES;
field public static final long TTL_DONT_CACHE = -1L; // 0xffffffffffffffffL
field public static final long TTL_NO_EXPIRATION_CONTROL = -2L; // 0xfffffffffffffffeL
}
@@ -50094,7 +50094,7 @@
method public java.lang.Object remove(java.lang.Object);
method public int size();
method public java.util.Collection<java.lang.Object> values();
- field protected java.util.Map map;
+ field protected java.util.Map<java.lang.Object, java.lang.Object> map;
}
public static class Attributes.Name {
@@ -53915,9 +53915,9 @@
method public void startTest(junit.framework.Test);
method public synchronized void stop();
method public synchronized boolean wasSuccessful();
- field protected java.util.Vector fErrors;
- field protected java.util.Vector fFailures;
- field protected java.util.Vector fListeners;
+ field protected java.util.Vector<junit.framework.TestFailure> fErrors;
+ field protected java.util.Vector<junit.framework.TestFailure> fFailures;
+ field protected java.util.Vector<junit.framework.TestListener> fListeners;
field protected int fRunTests;
}
@@ -56128,10 +56128,10 @@
method public void shutdown();
field protected org.apache.http.impl.conn.IdleConnectionHandler idleConnHandler;
field protected volatile boolean isShutDown;
- field protected java.util.Set issuedConnections;
+ field protected java.util.Set<org.apache.http.impl.conn.tsccm.BasicPoolEntryRef> issuedConnections;
field protected int numConnections;
field protected final java.util.concurrent.locks.Lock poolLock;
- field protected java.lang.ref.ReferenceQueue refQueue;
+ field protected java.lang.ref.ReferenceQueue<java.lang.Object> refQueue;
}
public class BasicPoolEntry extends org.apache.http.impl.conn.AbstractPoolEntry {
@@ -56170,11 +56170,11 @@
method protected org.apache.http.impl.conn.tsccm.WaitingThread newWaitingThread(java.util.concurrent.locks.Condition, org.apache.http.impl.conn.tsccm.RouteSpecificPool);
method protected void notifyWaitingThread(org.apache.http.impl.conn.tsccm.RouteSpecificPool);
method public org.apache.http.impl.conn.tsccm.PoolEntryRequest requestPoolEntry(org.apache.http.conn.routing.HttpRoute, java.lang.Object);
- field protected java.util.Queue freeConnections;
+ field protected java.util.Queue<org.apache.http.impl.conn.tsccm.BasicPoolEntry> freeConnections;
field protected final int maxTotalConnections;
field protected final org.apache.http.conn.ClientConnectionOperator operator;
- field protected final java.util.Map routeToPool;
- field protected java.util.Queue waitingThreads;
+ field protected final java.util.Map<org.apache.http.conn.routing.HttpRoute, org.apache.http.impl.conn.tsccm.RouteSpecificPool> routeToPool;
+ field protected java.util.Queue<org.apache.http.impl.conn.tsccm.WaitingThread> waitingThreads;
}
public abstract interface PoolEntryRequest {
@@ -56191,7 +56191,7 @@
method public void run();
method public void shutdown();
field protected final org.apache.http.impl.conn.tsccm.RefQueueHandler refHandler;
- field protected final java.lang.ref.ReferenceQueue refQueue;
+ field protected final java.lang.ref.ReferenceQueue<?> refQueue;
field protected volatile java.lang.Thread workerThread;
}
@@ -56211,11 +56211,11 @@
method public org.apache.http.impl.conn.tsccm.WaitingThread nextThread();
method public void queueThread(org.apache.http.impl.conn.tsccm.WaitingThread);
method public void removeThread(org.apache.http.impl.conn.tsccm.WaitingThread);
- field protected final java.util.LinkedList freeEntries;
+ field protected final java.util.LinkedList<org.apache.http.impl.conn.tsccm.BasicPoolEntry> freeEntries;
field protected final int maxEntries;
field protected int numEntries;
field protected final org.apache.http.conn.routing.HttpRoute route;
- field protected final java.util.Queue waitingThreads;
+ field protected final java.util.Queue<org.apache.http.impl.conn.tsccm.WaitingThread> waitingThreads;
}
public class ThreadSafeClientConnManager implements org.apache.http.conn.ClientConnectionManager {
@@ -58507,7 +58507,7 @@
method public void setValidating(boolean);
field public static final java.lang.String PROPERTY_NAME = "org.xmlpull.v1.XmlPullParserFactory";
field protected java.lang.String classNamesLocation;
- field protected java.util.HashMap features;
+ field protected java.util.HashMap<java.lang.String, java.lang.Boolean> features;
field protected java.util.ArrayList parserClasses;
field protected java.util.ArrayList serializerClasses;
}
diff --git a/core/java/android/content/pm/Signature.java b/core/java/android/content/pm/Signature.java
index 7edf4b9..fdc54ae 100644
--- a/core/java/android/content/pm/Signature.java
+++ b/core/java/android/content/pm/Signature.java
@@ -22,12 +22,14 @@
import com.android.internal.util.ArrayUtils;
import java.io.ByteArrayInputStream;
+import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
import java.util.Arrays;
/**
@@ -252,4 +254,53 @@
return (a.length == b.length) && ArrayUtils.containsAll(a, b)
&& ArrayUtils.containsAll(b, a);
}
+
+ /**
+ * Test if given {@link Signature} sets are effectively equal. In rare
+ * cases, certificates can have slightly malformed encoding which causes
+ * exact-byte checks to fail.
+ * <p>
+ * To identify effective equality, we bounce the certificates through an
+ * decode/encode pass before doing the exact-byte check. To reduce attack
+ * surface area, we only allow a byte size delta of a few bytes.
+ *
+ * @throws CertificateException if the before/after length differs
+ * substantially, usually a signal of something fishy going on.
+ * @hide
+ */
+ public static boolean areEffectiveMatch(Signature[] a, Signature[] b)
+ throws CertificateException {
+ final CertificateFactory cf = CertificateFactory.getInstance("X.509");
+
+ final Signature[] aPrime = new Signature[a.length];
+ for (int i = 0; i < a.length; i++) {
+ aPrime[i] = bounce(cf, a[i]);
+ }
+ final Signature[] bPrime = new Signature[b.length];
+ for (int i = 0; i < b.length; i++) {
+ bPrime[i] = bounce(cf, b[i]);
+ }
+
+ return areExactMatch(aPrime, bPrime);
+ }
+
+ /**
+ * Bounce the given {@link Signature} through a decode/encode cycle.
+ *
+ * @throws CertificateException if the before/after length differs
+ * substantially, usually a signal of something fishy going on.
+ * @hide
+ */
+ public static Signature bounce(CertificateFactory cf, Signature s) throws CertificateException {
+ final InputStream is = new ByteArrayInputStream(s.mSignature);
+ final X509Certificate cert = (X509Certificate) cf.generateCertificate(is);
+ final Signature sPrime = new Signature(cert.getEncoded());
+
+ if (Math.abs(sPrime.mSignature.length - s.mSignature.length) > 2) {
+ throw new CertificateException("Bounced cert length looks fishy; before "
+ + s.mSignature.length + ", after " + sPrime.mSignature.length);
+ }
+
+ return sPrime;
+ }
}
diff --git a/core/java/android/widget/Toolbar.java b/core/java/android/widget/Toolbar.java
index 1ce19ce..384e461 100644
--- a/core/java/android/widget/Toolbar.java
+++ b/core/java/android/widget/Toolbar.java
@@ -1746,6 +1746,17 @@
}
/**
+ * Accessor to enable LayoutLib to get ActionMenuPresenter directly.
+ */
+ ActionMenuPresenter getOuterActionMenuPresenter() {
+ return mOuterActionMenuPresenter;
+ }
+
+ Context getPopupContext() {
+ return mPopupContext;
+ }
+
+ /**
* Interface responsible for receiving menu item click events if the items themselves
* do not have individual item click listeners.
*/
diff --git a/core/tests/coretests/src/android/content/pm/SignatureTest.java b/core/tests/coretests/src/android/content/pm/SignatureTest.java
new file mode 100644
index 0000000..89d5997
--- /dev/null
+++ b/core/tests/coretests/src/android/content/pm/SignatureTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm;
+
+import junit.framework.TestCase;
+
+public class SignatureTest extends TestCase {
+
+ /** Cert A with valid syntax */
+ private static final Signature A = new Signature("308201D33082013CA0030201020219373565373461363A31336534333439623635343A2D38303030300D06092A864886F70D01010505003017311530130603550403130C6269736F6E416E64726F6964301E170D3133303432343232323134345A170D3338303432353232323134345A3017311530130603550403130C6269736F6E416E64726F696430819F300D06092A864886F70D010101050003818D00308189028181009214CE08563B77FF3128D3A303254287301263A842D19D5D4EAF024EBEDF864F3802C215B2F3EA85432F3EFF1DB8F591B0854FA7C1C6E4A8A85132FA762CC2D12A8EBD34D8B15C241A91716577F03BB3D2AFFC24367AB1E5E03C387891E34E646E47FAD75B178C1FD077B9199B3ABA6D48E2464801F6592E98245124046E51A90203010001A317301530130603551D25040C300A06082B06010505070303300D06092A864886F70D0101050500038181000B71581EDDC20E8C18C1C140BEE72501A97E04CA12030C51D4C38767B6A9FB5155CF4858C565EF77E5E2C22687C1AAB04BBA2B81C9A73CFB8DE118B624094AAE43D8FC2D585D90839DAFA5033AF7B8C0DE27E6ADAE44C40508CE493E9C80F1F5DA9EC87ECA1844BAB12C83CC8EB5937E1BE36A42CD22086A826E00FB763CD577");
+ /** Cert A with malformed syntax */
+ private static final Signature M = new Signature("308201D43082013CA0030201020219373565373461363A31336534333439623635343A2D38303030300D06092A864886F70D01010505003017311530130603550403130C6269736F6E416E64726F6964301E170D3133303432343232323134345A170D3338303432353232323134345A3017311530130603550403130C6269736F6E416E64726F696430819F300D06092A864886F70D010101050003818D00308189028181009214CE08563B77FF3128D3A303254287301263A842D19D5D4EAF024EBEDF864F3802C215B2F3EA85432F3EFF1DB8F591B0854FA7C1C6E4A8A85132FA762CC2D12A8EBD34D8B15C241A91716577F03BB3D2AFFC24367AB1E5E03C387891E34E646E47FAD75B178C1FD077B9199B3ABA6D48E2464801F6592E98245124046E51A90203010001A317301530130603551D25040C300A06082B06010505070303300D06092A864886F70D010105050003820081000B71581EDDC20E8C18C1C140BEE72501A97E04CA12030C51D4C38767B6A9FB5155CF4858C565EF77E5E2C22687C1AAB04BBA2B81C9A73CFB8DE118B624094AAE43D8FC2D585D90839DAFA5033AF7B8C0DE27E6ADAE44C40508CE493E9C80F1F5DA9EC87ECA1844BAB12C83CC8EB5937E1BE36A42CD22086A826E00FB763CD577");
+ /** Cert B with valid syntax */
+ private static final Signature B = new Signature("308204a830820390a003020102020900a1573d0f45bea193300d06092a864886f70d0101050500308194310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e20566965773110300e060355040a1307416e64726f69643110300e060355040b1307416e64726f69643110300e06035504031307416e64726f69643122302006092a864886f70d0109011613616e64726f696440616e64726f69642e636f6d301e170d3131303931393138343232355a170d3339303230343138343232355a308194310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e20566965773110300e060355040a1307416e64726f69643110300e060355040b1307416e64726f69643110300e06035504031307416e64726f69643122302006092a864886f70d0109011613616e64726f696440616e64726f69642e636f6d30820120300d06092a864886f70d01010105000382010d00308201080282010100de1b51336afc909d8bcca5920fcdc8940578ec5c253898930e985481cfdea75ba6fc54b1f7bb492a03d98db471ab4200103a8314e60ee25fef6c8b83bc1b2b45b084874cffef148fa2001bb25c672b6beba50b7ac026b546da762ea223829a22b80ef286131f059d2c9b4ca71d54e515a8a3fd6bf5f12a2493dfc2619b337b032a7cf8bbd34b833f2b93aeab3d325549a93272093943bb59dfc0197ae4861ff514e019b73f5cf10023ad1a032adb4b9bbaeb4debecb4941d6a02381f1165e1ac884c1fca9525c5854dce2ad8ec839b8ce78442c16367efc07778a337d3ca2cdf9792ac722b95d67c345f1c00976ec372f02bfcbef0262cc512a6845e71cfea0d020103a381fc3081f9301d0603551d0e0416041478a0fc4517fb70ff52210df33c8d32290a44b2bb3081c90603551d230481c13081be801478a0fc4517fb70ff52210df33c8d32290a44b2bba1819aa48197308194310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e20566965773110300e060355040a1307416e64726f69643110300e060355040b1307416e64726f69643110300e06035504031307416e64726f69643122302006092a864886f70d0109011613616e64726f696440616e64726f69642e636f6d820900a1573d0f45bea193300c0603551d13040530030101ff300d06092a864886f70d01010505000382010100977302dfbf668d7c61841c9c78d2563bcda1b199e95e6275a799939981416909722713531157f3cdcfea94eea7bb79ca3ca972bd8058a36ad1919291df42d7190678d4ea47a4b9552c9dfb260e6d0d9129b44615cd641c1080580e8a990dd768c6ab500c3b964e185874e4105109d94c5bd8c405deb3cf0f7960a563bfab58169a956372167a7e2674a04c4f80015d8f7869a7a4139aecbbdca2abc294144ee01e4109f0e47a518363cf6e9bf41f7560e94bdd4a5d085234796b05c7a1389adfd489feec2a107955129d7991daa49afb3d327dc0dc4fe959789372b093a89c8dbfa41554f771c18015a6cb242a17e04d19d55d3b4664eae12caf2a11cd2b836e");
+
+ public void testExactlyEqual() throws Exception {
+ assertTrue(Signature.areExactMatch(asArray(A), asArray(A)));
+ assertTrue(Signature.areExactMatch(asArray(M), asArray(M)));
+
+ assertFalse(Signature.areExactMatch(asArray(A), asArray(B)));
+ assertFalse(Signature.areExactMatch(asArray(A), asArray(M)));
+ assertFalse(Signature.areExactMatch(asArray(M), asArray(A)));
+
+ assertTrue(Signature.areExactMatch(asArray(A, M), asArray(M, A)));
+ }
+
+ public void testEffectiveMatch() throws Exception {
+ assertTrue(Signature.areEffectiveMatch(asArray(A), asArray(A)));
+ assertTrue(Signature.areEffectiveMatch(asArray(M), asArray(M)));
+
+ assertFalse(Signature.areEffectiveMatch(asArray(A), asArray(B)));
+ assertTrue(Signature.areEffectiveMatch(asArray(A), asArray(M)));
+ assertTrue(Signature.areEffectiveMatch(asArray(M), asArray(A)));
+
+ assertTrue(Signature.areEffectiveMatch(asArray(A, M), asArray(M, A)));
+ assertTrue(Signature.areEffectiveMatch(asArray(A, B), asArray(M, B)));
+ assertFalse(Signature.areEffectiveMatch(asArray(A, M), asArray(A, B)));
+ }
+
+ private static Signature[] asArray(Signature... s) {
+ return s;
+ }
+}
diff --git a/docs/html-intl/intl/zh-cn/about/versions/android-5.0.jd b/docs/html-intl/intl/zh-cn/about/versions/android-5.0.jd
new file mode 100644
index 0000000..9c3dd5c
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/about/versions/android-5.0.jd
@@ -0,0 +1,631 @@
+page.title=Android 5.0 API
+excludeFromSuggestions=true
+sdk.platform.version=5.0
+sdk.platform.apiLevel=21
+@jd:body
+
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>在本文档中 <a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle"> <span class="more">展开</span><span class="less" style="display:none">合拢</span></a></h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#ApiLevel">更新目标 API 级别</a></li>
+ <li><a href="#Behaviors">重要的行为变更</a>
+ <ol>
+ <li><a href="#ART">如果您尚未针对新的 Android 运行时 (ART) 测试您的应用…</a></li>
+ <li><a href="#BehaviorNotifications">如果您的应用实施通知…</a></li>
+ <li><a href="#BehaviorMediaControl">如果您的应用使用 RemoteControlClient…</a></li>
+<li><a href="#BehaviorGetRecentTasks">如果您的应用使用 getRecentTasks()…</a></li>
+<li><a href="#64BitSupport">如果您使用的是 Android 原生开发工具包 (NDK)…</a></li>
+<li><a href="#BindService">如果您的应用绑定到某项服务…</a></li>
+<li><a href="#BehaviorWebView">如果您的应用使用 WebView…</a></li>
+ </ol>
+ </li>
+ <li><a href="#UI">界面</a>
+ <ol>
+ <li><a href="#MaterialDesign">Material Design 设计支持</a></li>
+ <li><a href="#Recents">“最近用过”屏幕中的并行文档和活动</a></li>
+ <li><a href="#WebView">WebView 更新</a></li>
+ <li><a href="#ScreenCapture">屏幕截图和共享</a></li>
+ </ol>
+ </li>
+ <li><a href="#Notifications">通知</a>
+ <ol>
+ <li><a href="#LockscreenNotifications">锁定屏幕通知</a></li>
+ <li><a href="#NotificationsMetadata">通知元数据</a></li>
+ </ol>
+ </li>
+ <li><a href="#Graphics">图形</a>
+ <ol>
+ <li><a href="#OpenGLES-3-1">支持 OpenGL ES 3.1</a></li>
+ <li><a href="#AndroidExtensionPack">Android 扩展程序包</a></li>
+ </ol>
+ </li>
+ <li><a href="#Media">媒体</a>
+ <ol>
+ <li><a href="#Camera-v2">提供高级摄像头功能的摄像头 API</a></li>
+ <li><a href="#AudioPlayback">音频播放</a></li>
+ <li><a href="#MediaPlaybackControl">媒体播放控件</a></li>
+ <li><a href="#MediaBrowsing">媒体浏览</a></li>
+ </ol>
+ </li>
+ <li><a href="#Storage">存储</a>
+ <ol>
+ <li><a href="#DirectorySelection">目录选择</a></li>
+ </ol>
+ </li>
+ <li><a href="#Wireless">无线和连接</a>
+ <ol>
+ <li><a href="#Multinetwork">多个网络连接</a></li>
+ <li><a href="#BluetoothBroadcasting">蓝牙广播</a></li>
+ <li><a href="#NFCEnhancements">NFC 增强功能</a></li>
+ </ol>
+ </li>
+ <li><a href="#Power">Project Volta</a>
+ <ol>
+ <li><a href="#JobScheduler">安排作业</a></li>
+ <li><a href="#PowerMeasurementTools">用于查询耗电信息的开发者工具</a>
+ </ol>
+ </li>
+ <li><a href="#Enterprise">Android 在办公和教育中的应用</a>
+ <ol>
+ <li><a href="#ManagedProvisioning">托管配置</a></li>
+ <li><a href="#DeviceOwner">设备所有者</a></li>
+ <li><a href="#ScreenPinning">固定屏幕</a></li>
+ </ol>
+ </li>
+ <li><a href="#System">系统</a>
+ <ol>
+ <li><a href="#AppUsageStatistics">应用使用情况统计信息</a></li>
+ </ol>
+ </li>
+ <li><a href="#Printing">打印框架</a>
+ <ol>
+ <li><a href="#PDFRender">使用位图来呈现 PDF 文件</a></li>
+ </ol>
+ </li>
+ <li><a href="#TestingA11y">测试和辅助功能</a>
+ <ol>
+ <li><a href="#TestingA11yImprovements">测试和辅助功能改进</a></li>
+ </ol>
+ </li>
+ <li><a href="#IME">IME</a>
+ <ol>
+ <li><a href="#Switching">更轻松地切换输入语言</a></li>
+ </ol>
+ </li>
+ <li><a href="#Manifest">清单声明</a>
+ <ol>
+ <li><a href="#ManifestFeatures">应声明的必需功能</a></li>
+ <li><a href="#Permissions">用户权限</a></li>
+ </ol>
+ </li>
+</ol>
+
+<h2>API 区别</h2>
+<ol>
+<li><a href="{@docRoot}sdk/api_diff/21/changes.html">API 级别 20 对比 21 »</a> </li>
+<li><a href="{@docRoot}sdk/api_diff/preview-21/changes.html">L Developer Preview 对比级别 21 »</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>API 级别:{@sdkPlatformApiLevel}</p>
+
+<p>Android 5.0 (<a href="{@docRoot}reference/android/os/Build.VERSION_CODES.html#LOLLIPOP">LOLLIPOP</a>) 为用户和应用开发者提供了新的功能。本文档介绍了最值得注意的新 API。</p>
+
+<p>有关新平台功能的扼要介绍,另请参阅 <a href="{@docRoot}about/versions/lollipop.html">Android Lollipop 集锦</a>。</p>
+
+
+<h3 id="Start">开始开发</h3>
+
+<p>要构建 Android 5.0 版应用,您必须先<a href="{@docRoot}sdk/index.html">下载 Android SDK</a>,然后使用 <a href="{@docRoot}tools/help/sdk-manager.html">SDK 管理器</a>下载 Android 5.0 SDK 平台和系统映像。</p>
+
+
+
+<h3 id="ApiLevel">更新您的目标 API 级别</h3>
+
+<p>要进一步针对运行 Android {@sdkPlatformVersion} 的设备优化您的应用,请将 <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> 设置为 <code>"{@sdkPlatformApiLevel}"</code>,在 Android {@sdkPlatformVersion} 系统映像上安装该应用并予以测试,然后将更改后的新版应用发布出去。</p>
+
+<p>您既可以使用 {@sdkPlatformVersion} API,也可以支持旧版本,方法是在代码中构建条件,确保先检查系统 API 级别再执行 <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> 不支持的 API。要详细了解有关保持向后兼容的信息,请参阅<a href="{@docRoot}training/basics/supporting-devices/platforms.html">支持不同平台版本</a>。</p>
+
+<p>要详细了解有关各个 API 级别运行方式的信息,请参阅<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">什么是 API 级别?</a></p>
+
+<h2 id="Behaviors">重要的行为变更</h2>
+
+<p>请注意,如果您之前发布了 Android 版应用,那么您的应用可能会受到 Android 5.0 变化的影响。</p>
+
+<h3 id="ART">如果您尚未针对新的 Android 运行时 (ART) 测试您的应用…</h3>
+
+<p>第 4.4 版引入了一个全新的实验性功能,即 Android 运行时 (ART)。在第 4.4 版中,ART 是可选的,默认运行时仍为 Dalvik。对于 Android 5.0,默认运行时现在是 ART。</p>
+
+<p>有关 ART 新功能的概述,请参阅 <a href="https://source.android.com/devices/tech/dalvik/art.html">ART 简介</a>。主要包括下面的一些新功能:</p>
+
+<ul>
+ <li>预先 (AOT) 编译</li>
+ <li>经过改进的垃圾回收 (GC)</li>
+ <li>经过改进的调试支持</li>
+</ul>
+
+<p>大多数 Android 应用应该不用做出任何更改即可直接在 ART 下运行。不过,Dalvik 上运行的部分技术在 ART 上无法运行。要了解最重要的问题,请参阅<a href="{@docRoot}guide/practices/verifying-apps-art.html">在 Android 运行时 (ART) 上验证应用行为</a>。请特别注意以下情况:</p>
+
+<ul>
+ <li>您的应用使用 Java 原生接口 (JNI) 运行 C/C++ 代码。</li>
+ <li>您使用的开发工具可生成非标准代码(例如某些混淆代码)。</li>
+ <li>您使用的技术与垃圾回收压缩不兼容。(虽然 ART 当前没有实施垃圾回收压缩,但在 Android 开放源代码项目中,垃圾回收压缩正处于开发阶段)。</li>
+</ul>
+
+<h3 id="BehaviorNotifications">如果您的应用实施通知…</h3>
+
+<p>请确保您的通知能够反映出 Android 5.0 的这些变化。要详细了解如何设计适用于 Android 5.0 及更高版本的通知,请参阅<a href="{@docRoot}design/patterns/notifications.html">通知设计指南</a>。
+</p>
+
+<h4 id="NotificationsMaterialDesignStyle">Material Design 设计样式</h4>
+<p>通知是在白色(或颜色非常浅的)背景上绘制的深色文本,以便与新的 Material Design 设计小部件协调一致。请确保所有通知在新的配色方案下都能够正常显示。如果通知无法正常显示,请予以修复:</p>
+
+<ul>
+ <li>使用 {@link android.app.Notification.Builder#setColor(int) setColor()} 在图标图片后面的圆圈中设置一种强调色彩。 </li>
+ <li>更新或移除有颜色的资源。系统会忽略操作图标和主通知图标中的所有非 Alpha 通道。您应当假定这些图标仅包含 Alpha 通道。系统会用白色来绘制通知图标,而用深灰色来绘制操作图标。</li>
+</ul>
+
+<h4 id="NotificationsSoundVibration">声音和振动</h4>
+<p>如果您当前在使用 {@link android.media.Ringtone}、{@link android.media.MediaPlayer} 或 {@link android.os.Vibrator} 类为通知添加声音和振动,请移除该代码,这样系统才能以优先模式正常呈现通知。<em></em>若要添加声音和振动,请改用 {@link android.app.Notification.Builder} 方法。</p>
+
+<p>将设备设置为 {@link android.media.AudioManager#RINGER_MODE_SILENT RINGER_MODE_SILENT} 会导致它进入新的优先模式。如果将设备设置为 {@link android.media.AudioManager#RINGER_MODE_NORMAL RINGER_MODE_NORMAL} 或 {@link android.media.AudioManager#RINGER_MODE_NORMAL RINGER_MODE_VIBRATE},则会使其退出优先模式。</p>
+
+<p>以前,Android 将 {@link android.media.AudioManager#STREAM_MUSIC STREAM_MUSIC} 用作主音量流,以此来控制平板电脑设备的音量。在 Android 5.0 中,手机和平板电脑设备的主音量流现已统一,均由 {@link android.media.AudioManager#STREAM_RING STREAM_RING} 或 {@link android.media.AudioManager#STREAM_NOTIFICATION STREAM_NOTIFICATION} 控制。</p>
+
+<h4 id="NotificationsLockscreenVisibility">通知在锁定屏幕上的公开程度</h4>
+<p>在 Android 5.0 中,通知现在默认显示在用户的锁定屏幕上。用户可以选择不公开敏感信息,这样的话系统会自动修改通知显示文本。要自定义这种经过修改的通知,请使用 {@link android.app.Notification.Builder#setPublicVersion(android.app.Notification) setPublicVersion()}。</p>
+<p>如果通知不包含个人信息,或者您希望在通知中显示媒体播放控件,请调用 {@link android.app.Notification.Builder#setVisibility(int) setVisibility()} 方法,并将通知的公开程度的级别设置为 {@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC}。
+</p>
+
+<h4 id="NotificationsMediaPlayback">媒体播放</h4>
+<p>如果您要实施可呈现媒体播放状态或传输控件的通知,请考虑使用新的 {@link android.app.Notification.MediaStyle} 模板,而不是自定义 {@link android.widget.RemoteViews.RemoteView} 对象。无论您选择使用哪种方法,请务必将通知的公开程度设置为 {@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC},以便用户可以在锁定屏幕中使用您的控件。请注意,从 Android 5.0 开始,系统不再在锁定屏幕中显示 {@link android.media.RemoteControlClient} 对象。有关详情,请参阅<a href="#BehaviorMediaControl">如果您的应用使用 RemoteControlClient</a>。</p>
+
+<h4 id="NotificationsHeadsup">提醒通知</h4>
+<p>现在,当设备处于活动状态(即设备未锁定且屏幕亮起)时,通知可以显示在小型浮动窗口中(也称为提醒通知)。此类通知采用的显示形式与紧凑型通知采用的形式类似,不同的是提醒通知还会显示操作按钮。用户无需退出当前应用,即可根据提醒通知执行操作或关闭提醒通知。</p>
+
+<p>可以触发提醒通知的情景示例包括:</p>
+
+<ul>
+ <li>用户在全屏模式下执行操作(应用使用 {@link android.app.Notification#fullScreenIntent})</li>
+ <li>通知的优先级较高,并且使用铃声或振动</li>
+</ul>
+
+<p>如果您的应用在上述任意一种情景下实施通知,请确保提醒通知能够正常呈现。</p>
+
+<h3 id="BehaviorMediaControl">如果您的应用使用 RemoteControlClient…</h3>
+<p>{@link android.media.RemoteControlClient} 类现已被弃用。请尽快改用全新的 {@link android.media.session.MediaSession} API。</p>
+
+<p>对于 {@link android.media.session.MediaSession} 或 {@link android.media.RemoteControlClient},Android 5.0 中的锁定屏幕不会显示传输控件。相反,您的应用可以通过通知在锁定屏幕中提供媒体播放控件。这样,您的应用就能够更好地控制媒体按钮的展现方式,同时还能让用户无论在设备处于锁定还是解锁状态下都可以执行同样的操作。</p>
+
+<p>为此,Android 5.0 引入了一个新的 {@link android.app.Notification.MediaStyle} 模板。{@link android.app.Notification.MediaStyle} 将您通过 {@link android.app.Notification.Builder#addAction(int, java.lang.CharSequence, android.app.PendingIntent) Notification.Builder.addAction()} 添加的通知操作转换到在您应用的媒体播放通知中内嵌的紧凑型按钮中。将会话令牌传递到 {@link android.app.Notification.MediaStyle#setMediaSession(android.media.session.MediaSession.Token) setSession()} 方法,指示系统此通知控制正在进行的媒体会话。</p>
+
+<p>请务必将通知的公开程度设置为 {@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC},将通知标为安全通知,以便在任何锁定屏幕(安全屏幕或其他屏幕)上显示。有关详情,请参阅<a href="#LockscreenNotifications">在锁定屏幕上显示通知</a>。</p>
+
+<p>如果您的应用是在 Android <a href="{@docRoot}tv/index.html">TV</a> 或 <a href="{@docRoot}wear/index.html">Wear</a> 平台上运行,请通过实施 {@link android.media.session.MediaSession} 类来显示媒体播放控件。如果您的应用需要在 Android 设备上接收媒体按钮事件,您还应当实施 {@link android.media.session.MediaSession}。</p>
+
+<h3 id="BehaviorGetRecentTasks">如果您的应用使用 getRecentTasks()…</h3>
+
+<p><em></em>由于 Android 5.0 中引入了并行文档和活动任务这一新功能(请参阅下文中的<a href="#Recents">“最近用过”屏幕中的并行文档和活动</a>),{@link android.app.ActivityManager#getRecentTasks ActivityManager.getRecentTasks()} 方法现已被弃用,以更好地保护用户隐私。为了实现向后兼容性,此方法仍会返回它的一小部分数据,包括调用应用自身的任务,同时还可能包括其他一些非敏感任务(例如“首页”)。如果您的应用在使用此方法检索它自身的任务,请改用 {@link android.app.ActivityManager#getAppTasks() getAppTasks()} 检索该信息。</p>
+
+<h3 id="64BitSupport">如果您使用的是 Android 原生开发工具包 (NDK)…</h3>
+
+<p>Android 5.0 支持 64 位系统。64 位增强功能增加了寻址空间并提高了性能,同时仍能全面支持现有的 32 位应用。64 位支持还提高了 OpenSSL 的加密性能。另外,此版本还引入了新的原生媒体 NDK API 以及原生 OpenGL ES (GLES) 3.1 支持。</p>
+
+<p>要利用 Android 5.0 中提供的 64 位支持,请从 <a href="{@docRoot}tools/sdk/ndk/index.html">Android NDK 页面</a>下载并安装 NDK 10c 版。要详细了解 NDK 的重要变化和错误修复,请参阅 10c 版<a href="{@docRoot}tools/sdk/ndk/index.html#Revisions">版本说明</a>。</p>
+
+<h3 id="BindService">如果您的应用绑定到某项服务…</h3>
+
+<p>{@link android.content.Context#bindService(android.content.Intent, android.content.ServiceConnection, int) Context.bindService()} 方法现在要求获取显式 {@link android.content.Intent};如果获取的是隐式 intent,则会引发异常。为了确保您的应用是安全的,请在启动或绑定 {@link android.app.Service} 时使用显式 intent,并且不要为此服务声明 intent 过滤器。</p>
+
+<h3 id="BehaviorWebView">如果您的应用使用 WebView…</h3>
+
+<p>Android 5.0 会更改您应用的默认行为。</p>
+<ul>
+<li><strong>如果您的应用的目标 API 级别不低于 21</strong>:
+ <ul>
+ <li>默认情况下,系统会屏蔽<a href="https://developer.mozilla.org/en-US/docs/Security/MixedContent" class="external-link">混合内容</a>和第三方 Cookie。要让系统不屏蔽混合内容和第三方 Cookie,请分别使用 {@link android.webkit.WebSettings#setMixedContentMode(int) setMixedContentMode()} 和 {@link android.webkit.CookieManager#setAcceptThirdPartyCookies(android.webkit.WebView, boolean) setAcceptThirdPartyCookies()} 方法。</li>
+ <li>系统现在可以智能选择要绘制的 HTML 文档部分。这一新的默认行为有助于降低内存占用量并提高性能。如果您要一次性呈现整个文档,请调用 {@link android.webkit.WebView#enableSlowWholeDocumentDraw()} 停用此优化行为。</li>
+ </ul>
+</li>
+<li><strong>如果您的应用的目标 API 级别低于 21</strong>:系统不会屏蔽混合内容和第三方 Cookie,并且始终会一次性呈现整个文档。</li>
+</ul>
+
+<h2 id="UI">界面</h2>
+
+<h3 id="MaterialDesign">Material Design 设计支持</h3>
+
+<p><em></em>即将发布的版本新增了对 Android 新 Material Design 设计样式的支持。您可以借助 Material Design 设计样式创建应用,使其呈现动态的视觉效果并为用户提供自然的界面元素过渡效果。此支持包括:</p>
+
+<ul>
+
+ <li>素材主题背景</li>
+ <li>视图阴影</li>
+ <li>{@link android.support.v7.widget.RecyclerView} 小部件</li>
+ <li>可绘制的动画和样式效果</li>
+ <li>Material Design 设计动画和活动过渡效果</li>
+ <li>基于视图状态的视图属性动画生成器</li>
+ <li>可自定义的界面小部件和应用栏(含您可以控制的调色板)</li>
+ <li>基于 XML 矢量图形的动画和非动画图形内容</li>
+</ul>
+
+<p>要详细了解如何向您的应用添加 Material Design 设计功能,请参阅 <a href="{@docRoot}training/material/index.html">Material Design 设计</a>。</p>
+
+<h3 id="Recents">“最近用过”屏幕中的并行文档和活动</h3>
+
+<p>在以前的版本中,对于用户最近与之互动的每个应用,<a href="{@docRoot}guide/components/recents.html">“最近用过”屏幕</a>都只能显示一个任务。现在,您的应用可以视需要针对其他并行活动或文档打开多个任务。通过此功能,用户可以在“最近用过”屏幕中快速切换各个活动和文档,并能在所有应用之间获得一致的切换体验,从而实现多任务处理。此类并行任务示例可能包括:网络浏览器应用中打开的标签页、效率类应用中的文档、游戏中的并行对局或信息应用中的聊天。您的应用可以通过 {@link android.app.ActivityManager.AppTask} 类管理任务。</p>
+
+<p>要插入逻辑中断,以便系统能够将您的活动视为一个新任务,请在通过 {@link android.app.Activity#startActivity(android.content.Intent) startActivity()} 启动活动时使用 {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}。您还可以在清单中将 <a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a> 元素的 {@code documentLaunchMode} 属性设置为 {@code "intoExisting"} 或 {@code "always"},从而实现该行为。</p>
+
+<p>为了避免“最近用过”屏幕过于混乱,您可以设置应用能够在该屏幕中显示的任务数上限。为此,请设置 <a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a> 的 {@link android.R.attr#maxRecents android:maxRecents} 属性。目前可以指定的上限为,每个用户 50 个任务(对于 RAM 较小的设备,则为每个用户 25 个任务)。</a></p>
+
+<p>您可以将“最近用过”屏幕中的任务设置为在重新启动过程中保持不变。要控制这一持续行为,请使用 <a href="{@docRoot}reference/android/R.attr.html#persistableMode">android:persistableMode</a> 属性。您也可以通过调用 {@link android.app.Activity#setTaskDescription(android.app.ActivityManager.TaskDescription) setTaskDescription()} 方法,来更改“最近用过”屏幕中活动的视觉属性,如活动的颜色、标签和图标。</p>
+
+<h3 id="WebView">WebView 更新</h3>
+<p>Android 5.0 将 {@link android.webkit.WebView} 实施更新为 Chromium M37,不仅提高了安全性和稳定性,还修复了多项错误。Android 5.0 上运行的 {@link android.webkit.WebView} 的默认用户代理字符串已更新为采用 37.0.0.0 作为版本号。</p>
+
+<p>此版本引入了 {@link android.webkit.PermissionRequest} 类,该类允许您的应用 <a href="https://developer.mozilla.org/en-US/docs/NavigatorUserMedia.getUserMedia" class="external-link">getUserMedia()</a> 之类的 Web API 向 {@link android.webkit.WebView} 授予对受保护资源(例如摄像头和麦克风)的访问权限。您的应用必须拥有对这些资源的相应 Android 权限,才能向 {@link android.webkit.WebView} 授予权限。</p>
+
+<p>借助新的 <code><a href="{@docRoot}reference/android/webkit/WebChromeClient.html#onShowFileChooser(android.webkit.WebView, android.webkit.ValueCallback<android.net.Uri[]>, android.webkit.WebChromeClient.FileChooserParams)">onShowFileChooser()</a></code> 方法,您现在不但可以在 {@link android.webkit.WebView} 中使用输入表单字段,而且可以启动文件选择器从 Android 设备中选择图片和文件。</p>
+
+<p>另外,此版本还支持 <a href="http://webaudio.github.io/web-audio-api/" class="external-link">WebAudio</a>、<a href="https://www.khronos.org/webgl/" class="external-link">WebGL</a> 和 <a href="http://www.webrtc.org/" class="external-link">WebRTC</a> 等开放标准。要详细了解此版本中的新增功能,请参阅 <a href="https://developer.chrome.com/multidevice/webview/overview" class="external-link">Android 版 WebView</a>。</p>
+
+<h3 id="ScreenCapture">屏幕截图和共享</h3>
+<p>通过 Android 5.0,您可以使用新的 {@link android.media.projection} API 向您的应用添加屏幕截图和屏幕共享功能。例如,如果您希望在视频会议应用中启用屏幕共享,则会发现此功能非常实用。</p>
+
+<p>通过新的 {@link android.media.projection.MediaProjection#createVirtualDisplay(java.lang.String, int, int, int, int, android.view.Surface, android.hardware.display.VirtualDisplay.Callback, android.os.Handler) createVirtualDisplay()} 方法,您的应用可以将主屏幕内容(默认显示屏)捕获到 {@link android.view.Surface} 对象中,然后通过网络发送该对象。该 API 仅允许捕获非安全的屏幕内容,不允许捕获系统音频。要开始屏幕截图,您的应用必须先使用通过 {@link android.media.projection.MediaProjectionManager#createScreenCaptureIntent()} 方法获取的 {@link android.content.Intent} 启动屏幕截图对话框,来请求用户向其授予相应权限。</p>
+
+<p>有关新 API 的使用示例,请参阅示例项目中的 {@code MediaProjectionDemo} 类。</p>
+
+<h2 id="Notifications">通知</h2>
+
+<h3 id="LockscreenNotifications">锁定屏幕通知</h3>
+<p>Android 5.0 中的锁定屏幕能够呈现通知。<em></em>用户可以通过“设置”来选择是否允许在安全的锁定屏幕上显示敏感的通知内容。</p>
+
+<p>您的应用可以控制其通知在安全的锁定屏幕上显示时的具体公开程度。要控制公开程度的级别,请调用 {@link android.app.Notification.Builder#setVisibility(int) setVisibility()} 并指定下列值之一:</p>
+
+<ul>
+<li>{@link android.app.Notification#VISIBILITY_PRIVATE VISIBILITY_PRIVATE}:显示基本信息(例如通知图标),但隐藏通知的全部内容。</li>
+<li>{@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC}:显示通知的全部内容。</li>
+<li>{@link android.app.Notification#VISIBILITY_SECRET VISIBILITY_SECRET}:不显示任何内容,甚至连通知图标也不显示。</li>
+</ul>
+
+<p>如果公开程度级别为 {@link android.app.Notification#VISIBILITY_PRIVATE VISIBILITY_PRIVATE},您还可以提供隐藏了个人详细信息的通知内容修改版本。例如,短信应用的通知可能会显示“您有 3 条新短信”,但隐藏短信内容和发送者。要提供此备用通知,请先使用 {@link android.app.Notification.Builder} 创建替代通知。当创建不公开的通知对象时,请通过 {@link android.app.Notification.Builder#setPublicVersion(android.app.Notification) setPublicVersion()} 方法为其附加替代通知。</p>
+
+<h3 id="NotificationsMetadata">通知元数据</h3>
+<p>Android 5.0 使用与您的应用通知关联的元数据更智能地对通知进行排序。要设置元数据,请在构建通知时调用 {@link android.app.Notification.Builder} 中的以下方法:</p>
+
+<ul>
+<li>{@link android.app.Notification.Builder#setCategory(java.lang.String) setCategory()}:告诉系统当设备处于“优先”<em></em>模式时如何处理您的应用通知(例如,当通知表示来电、即时消息或警报时)。
+<li>{@link android.app.Notification.Builder#setPriority(int) setPriority()}:将通知标记为重要性高于或低于普通通知。如果还带有声音或振动,则优先级字段设置为 {@link android.app.Notification#PRIORITY_MAX PRIORITY_MAX} 或 {@link android.app.Notification#PRIORITY_HIGH PRIORITY_HIGH} 的通知将出现在一个小的浮动窗口中。</li>
+<li>{@link android.app.Notification.Builder#addPerson(java.lang.String) addPerson()}:允许您向通知添加一个或多个相关的人员。利用此方法,您的应用可指示系统将来自指定人员的通知归成一组,或者将来自这些人员的通知归类为重要性高于普通通知。</li>
+</ul>
+
+<h2 id="Graphics">显卡</h2>
+
+<h3 id="OpenGLES-3-1">支持 OpenGL ES 3.1</h3>
+<p>Android 5.0 针对 OpenGL ES 3.1 添加了 Java 接口和原生支持。OpenGL ES 3.1 中提供的主要新功能包括:</p>
+
+<ul>
+<li>对着色器进行计算
+<li>单独的着色器对象
+<li>间接绘图命令
+<li>多样本和模版纹理
+<li>对着色语言的改进
+<li>用于高级混合模式和调试的扩展
+<li>对 OpenGL ES 2.0 和 3.0 的向后兼容性
+</ul>
+
+<p>Android 上 OpenGL ES 3.1 的 Java 接口是通过 {@link android.opengl.GLES31} 提供的。当使用 OpenGL ES 3.1 时,请务必在您的清单文件中使用 <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> 标记和 {@code android:glEsVersion} 属性声明它。例如:</p>
+
+<pre>
+<manifest>
+ <uses-feature android:glEsVersion="0x00030001" />
+ ...
+</manifest>
+</pre>
+
+<p>有关使用 OpenGL ES 的更多信息,包括如何在运行时检查设备支持的 OpenGL ES 版本,请参阅 <a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL ES API 指南</a>。</p>
+
+<h3 id="AndroidExtensionPack">Android 扩展程序包</h3>
+
+<p>除了 OpenGL ES 3.1 之外,本版本还提供了一个扩展程序包,该程序包具有适用于高级显卡功能的 Java 接口和原生支持。Android 将这些扩展程序视为一个程序包。(如果存在 {@code ANDROID_extension_pack_es31a} 扩展程序,则您的应用可以假定该程序包中的所有扩展都存在,并可通过单个 {@code #extension} 语句启用着色语言功能。)</p>
+
+<p>该扩展程序包支持:</p>
+
+<ul>
+<li>对着色器存储缓冲区、图片和原子的有保证片段着色器支持(片段着色器支持在 OpenGL ES 3.1 中是可选的。)</li>
+<li>曲面细分和几何着色器</li>
+<li>ASTC (LDR) 纹理压缩格式</li>
+<li>按样本插值和着色</li>
+<li>为帧缓冲区中的每个颜色附件使用不同的混合模式</li>
+</ul>
+
+<p>该扩展程序包的 Java 接口是通过 {@link android.opengl.GLES31Ext} 提供的。在您的应用清单中,您可以声明您的应用必须仅安装在支持该扩展程序包的设备上。例如:</p>
+
+<pre>
+<manifest>
+ <uses-feature android:name=“android.hardware.opengles.aep”
+ android:required="true" />
+ ...
+</manifest>
+</pre>
+
+<h2 id="Media">媒体</h2>
+
+<h3 id="Camera-v2">用于高级摄像头功能的摄像头 API</h3>
+
+<p>Android 5.0 引入了新的 <a href="{@docRoot}reference/android/hardware/camera2/package-summary.html">android.hardware.camera2</a> API 来帮助执行精细的照片拍摄和图片处理。您现在可以通过 {@link android.hardware.camera2.CameraManager#getCameraIdList() getCameraIdList()} 以编程方式访问可供系统使用的摄像头设备,并通过 {@link android.hardware.camera2.CameraManager#openCamera(java.lang.String, android.hardware.camera2.CameraDevice.StateCallback, android.os.Handler) openCamera()} 连接到特定设备。要开始拍摄图片,请创建一个 {@link android.hardware.camera2.CameraCaptureSession} 并指定 {@link android.view.Surface} 对象来发送所拍摄的图片。您可以将 {@link android.hardware.camera2.CameraCaptureSession} 配置为单拍或连拍。</p>
+
+<p>要想在拍摄了新图片时收到通知,请实施 {@link android.hardware.camera2.CameraCaptureSession.CaptureCallback} 监听器并将其设置在您的拍摄请求中。现在,当系统完成图片拍摄请求时,您的 {@link android.hardware.camera2.CameraCaptureSession.CaptureCallback} 监听器将收到对 {@link android.hardware.camera2.CameraCaptureSession.CaptureCallback#onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult) onCaptureCompleted()} 的调用,在 {@link android.hardware.camera2.CaptureResult} 中向您提供图片拍摄元数据。</p>
+
+<p>{@link android.hardware.camera2.CameraCharacteristics} 类允许您的应用检测设备上有哪些摄像头功能可用。对象的 {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL INFO_SUPPORTED_HARDWARE_LEVEL} 属性表示摄像头的功能级别。</p>
+
+<ul>
+ <li>所有设备都至少支持 {@link android.hardware.camera2.CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY} 硬件级别,该级别的功能大致等同于已弃用的 {@link android.hardware.Camera} API 的功能。</li>
+ <li>支持 {@link android.hardware.camera2.CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL INFO_SUPPORTED_HARDWARE_LEVEL_FULL} 硬件级别的设备不仅能让用户手动控制拍摄和后期处理,而且能够以高帧速率拍摄高分辨率图片。</li>
+</ul>
+
+<p>要了解如何使用更新后的<a href="{@docRoot}reference/android/hardware/camera2/package-summary.html">摄像头</a> API,请参考本版本中的 {@code Camera2Basic} 和 {@code Camera2Video} 实施样本。</p>
+
+<h3 id="AudioPlayback">音频播放</h3>
+<p>此版本对 {@link android.media.AudioTrack} 进行了以下更改:</p>
+<ul>
+ <li>您的应用现在能够以浮点格式 ({@link android.media.AudioFormat#ENCODING_PCM_FLOAT ENCODING_PCM_FLOAT}) 提供音频数据。这允许更大的动态范围、更一致的精度以及更大的动态余量。浮点算法在中间计算期间尤其有用。播放端点为音频数据使用整数格式,并且具有较低的位深度。(在 Android 5.0 中,内部管线的某些部分尚未采用浮点格式。)
+ <li>您的应用现在可以将音频数据提供为 {@link java.nio.ByteBuffer},所用格式与 {@link android.media.MediaCodec} 提供的格式相同。
+ <li>{@link android.media.AudioTrack#WRITE_NON_BLOCKING WRITE_NON_BLOCKING} 选项可以简化某些应用的缓冲和多线程处理。
+</ul>
+
+<h3 id="MediaPlaybackControl">媒体播放控件</h3>
+<p>使用新的通知和媒体 API,可确保系统界面能够了解您的媒体播放并提取和显示专辑封面。而借助新的 {@link android.media.session.MediaSession} 和 {@link android.media.session.MediaController} 类,您现在则可更轻松地跨界面和服务控制媒体播放。</p>
+
+<p>新的 {@link android.media.session.MediaSession} 类替代了被弃用的 {@link android.media.RemoteControlClient} 类,并且提供了一组用于处理传输控件和媒体按钮的回调方法。如果您的应用提供媒体播放并且在 Android <a href="{@docRoot}tv/index.html">TV</a> 或 <a href="{@docRoot}wear/index.html">Wear</a> 平台上运行,请使用 {@link android.media.session.MediaSession} 类和相同的回调方法来处理您的传输控件。</p>
+
+<p>您现在可以通过新的 {@link android.media.session.MediaController} 类构建您自己的媒体控制器应用。此类提供了一种线程安全方法,可让您通过自己的应用界面流程来监控媒体播放。在创建控制器时,请指定一个 {@link android.media.session.MediaSession.Token} 对象,以便您的应用可以与给定的 {@link android.media.session.MediaSession} 进行互动。通过使用 {@link android.media.session.MediaController.TransportControls} 方法,您可以发送诸如 {@link android.media.session.MediaController.TransportControls#play() play()}、{@link android.media.session.MediaController.TransportControls#stop() stop()}、{@link android.media.session.MediaController.TransportControls#skipToNext() skipToNext()} 和 {@link android.media.session.MediaController.TransportControls#setRating(android.media.Rating) setRating()} 之类的命令来控制该会话中的媒体播放。创建好控制器之后,您还可以注册一个 {@link android.media.session.MediaController.Callback} 对象来监听该会话中的元数据和状态更改。</p>
+
+<p>此外,您还可以通过新的 {@link android.app.Notification.MediaStyle} 类创建允许将播放控件关联到媒体会话的丰富通知。</p>
+
+<h3 id="MediaBrowsing">媒体浏览</h3>
+<p>Android 5.0 通过新的 <a href="{@docRoot}reference/android/media/browse/package-summary.html">android.media.browse</a> API 引入了允许应用浏览其他应用的媒体内容库的功能。要公开您的应用中的媒体内容,请扩展 {@link android.service.media.MediaBrowserService} 类。您的 {@link android.service.media.MediaBrowserService} 实施应当提供对 {@link android.media.session.MediaSession.Token} 的访问权限,以便应用可以播放通过您的服务提供的媒体内容。</p>
+<p>要与媒体浏览器服务进行互动,请使用 {@link android.media.browse.MediaBrowser} 类。在创建 {@link android.media.browse.MediaBrowser} 实例时,请为 {@link android.media.session.MediaSession} 指定组件名称。然后,您的应用可以使用该浏览器实例连接到关联的服务,并获取 {@link android.media.session.MediaSession.Token} 对象来播放通过该服务公开的内容。</p>
+
+<h2 id="Storage">存储</h2>
+
+<h3 id="DirectorySelection">目录选择</h3>
+
+<p>Android 5.0 对<a href="{@docRoot}guide/topics/providers/document-provider.html">存储访问框架</a>进行了扩展,允许用户选择整个目录子树,并向应用授予对其中包含的所有文档的读/写访问权限(无需请求用户逐项确认)。</p>
+
+<p>要选择目录子树,请构建并发送 {@link android.content.Intent#ACTION_OPEN_DOCUMENT_TREE OPEN_DOCUMENT_TREE} intent。系统将显示支持子树选择的所有 {@link android.provider.DocumentsProvider} 实例,允许用户进行浏览并选择目录。返回的 URI 表示对所选子树的访问权限。然后,您可以使用 {@link android.provider.DocumentsContract#buildChildDocumentsUriUsingTree(android.net.Uri, java.lang.String) buildChildDocumentsUriUsingTree()} 和 {@link android.provider.DocumentsContract#buildDocumentUriUsingTree(android.net.Uri, java.lang.String) buildDocumentUriUsingTree()} 以及 {@link android.content.ContentResolver#query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String) query()} 来深入了解此子树。</p>
+
+<p>新的 {@link android.provider.DocumentsContract#createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String) createDocument()} 方法允许您在子树下的任何位置创建新的文档或目录。要管理现有文档,请使用 {@link android.provider.DocumentsContract#renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String) renameDocument()} 和 {@link android.provider.DocumentsProvider#deleteDocument(java.lang.String) deleteDocument()}。在发出这些调用之前,请检查 {@link android.provider.DocumentsContract.Document#COLUMN_FLAGS COLUMN_FLAGS} 以验证服务提供方是否支持这些调用。</p>
+
+<p>如果您在实施 {@link android.provider.DocumentsProvider} 并希望支持子树选择,请实施 {@link android.provider.DocumentsProvider#isChildDocument(java.lang.String, java.lang.String) isChildDocument()} 并在您的 {@link android.provider.DocumentsContract.Root#COLUMN_FLAGS COLUMN_FLAGS} 中添加 {@link android.provider.DocumentsContract.Root#FLAG_SUPPORTS_IS_CHILD FLAG_SUPPORTS_IS_CHILD}。</p>
+
+<p>Android 5.0 还在共享的存储空间内引入了程序包专用的新目录,您的应用可将要添加到 {@link android.provider.MediaStore} 中的媒体文件放置在这些目录中。新的 {@link android.content.Context#getExternalMediaDirs()} 将返回这些目录在所有共享的存储设备上的路径。与 {@link android.content.Context#getExternalFilesDir(java.lang.String) getExternalFilesDir()} 类似,您的应用不需要额外的权限即可访问所返回的路径。平台将定期扫描这些目录中的新媒体,但您也可使用 {@link android.media.MediaScannerConnection} 对新内容进行显式扫描。</p>
+
+<h2 id="Wireless">无线和连接</h2>
+
+<h3 id="Multinetwork">多个网络连接</h3>
+<p>Android 5.0 提供了新的多网络 API,它们允许您的应用动态扫描具有特定功能的可用网络,然后与这些网络建立连接。如果您的应用需要一个专用网络(例如 SUPL、MMS 或运营商计费的网络),或者如果您希望使用某种特定类型的传输协议来发送数据,则此功能非常有用。</p>
+
+<p>要从您的应用动态选择并连接到某个网络,请执行以下步骤:</p>
+
+<ol>
+ <li>创建一个 {@link android.net.ConnectivityManager}。</li>
+ <li>使用 {@link android.net.NetworkRequest.Builder} 类创建一个 {@link android.net.NetworkRequest} 对象并指定您的应用感兴趣的网络功能和传输类型。</li>
+<li>要扫描合适的网络,请调用 {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) requestNetwork()} 或 {@link android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()},并传入 {@link android.net.NetworkRequest} 对象和一个 {@link android.net.ConnectivityManager.NetworkCallback} 实施。如果希望在检测到合适的网络后主动切换到该网络,请使用 {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) requestNetwork()} 方法;如果希望仅接收网络扫描结果通知而不主动切换,请使用 {@link android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} 方法。</li>
+</ol>
+
+<p>当系统检测到合适的网络时,它将连接到该网络并调用 {@link android.net.ConnectivityManager.NetworkCallback#onAvailable(android.net.Network) onAvailable()} 回调。您可以在回调中使用 {@link android.net.Network} 对象来获取关于该网络的更多信息,或者指示通信使用选定的网络。</p>
+
+<h3 id="BluetoothBroadcasting">低功耗蓝牙</h3>
+<p>Android 4.3 中作为重头戏引入了对<a href="{@docRoot}guide/topics/connectivity/bluetooth-le.html">低功耗蓝牙</a>(“低功耗蓝牙”<em></em>)的平台支持。在 Android 5.0 中,Android 设备现在可以用作低功耗蓝牙<em>外围设备</em>。应用可以使用此功能使附近的设备知道它的存在。例如,您可以构建相应的应用来允许设备用作计步器或健康检测器并与另一低功耗蓝牙设备交换其数据。</p>
+<p>新的 {@link android.bluetooth.le} API 允许您的应用对公告进行广播,扫描响应,以及与附近的低功能蓝牙设备建立连接。要使用新的公告和扫描功能,请在您的清单中添加 {@link android.Manifest.permission#BLUETOOTH_ADMIN BLUETOOTH_ADMIN} 权限。当用户从 Play 商店更新或下载您的应用时,会要求他们向您的应用授予以下权限:“蓝牙连接信息:允许应用控制蓝牙,包括向附近的蓝牙设备进行广播以及获取关于这些设备的信息。”</p>
+
+<p>要开始低功耗蓝牙公告以便其他设备可以发现您的应用,请调用 {@link android.bluetooth.le.BluetoothLeAdvertiser#startAdvertising(android.bluetooth.le.AdvertiseSettings, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseCallback) startAdvertising()} 并传入 {@link android.bluetooth.le.AdvertiseCallback} 类的一个实施。回调对象将收到关于公告操作成功或失败的报告。</p>
+
+<p> Android 5.0 引入了 {@link android.bluetooth.le.ScanFilter} 类,以便您的应用可以仅扫描它感兴趣的特定类型的设备。要开始扫描低功耗蓝牙设备,请调用 {@link android.bluetooth.le.BluetoothLeScanner#startScan(android.bluetooth.le.ScanCallback) startScan()} 并传入一个过滤器列表。在该方法调用中,您还必须提供 {@link android.bluetooth.le.ScanCallback} 的一个实施以便在发现低功耗蓝牙公告时进行报告。 </p>
+
+<h3 id="NFCEnhancements">NFC 增强功能</h3>
+<p>Android 5.0 添加了以下增强功能以实现更广泛和更灵活的 NFC 使用:</p>
+
+<ul>
+<li>“分享”<em></em>菜单中现在提供了 Android Beam。</li>
+<li>您的应用可以通过调用 {@link android.nfc.NfcAdapter#invokeBeam(android.app.Activity) invokeBeam()} 在用户的设备上调用 Android Beam 来分享数据。这不需要用户对着另一个具有 NFC 功能的设备手动点按设备即可完成数据传输。</li>
+<li>您可以使用新的 {@link android.nfc.NdefRecord#createTextRecord(java.lang.String, java.lang.String) createTextRecord()} 方法来创建包含 UTF-8 文本数据的 NDEF 记录。</li>
+<li>如果您在开发支付应用,则您现在能够通过调用 <code><a href="{@docRoot}reference/android/nfc/cardemulation/CardEmulation.html#registerAidsForService(android.content.ComponentName, java.lang.String, java.util.List<java.lang.String>)">registerAidsForService()</a></code> 动态注册 NFC 应用 ID (AID)。您还可以使用 {@link android.nfc.cardemulation.CardEmulation#setPreferredService(android.app.Activity, android.content.ComponentName) setPreferredService()} 设置当某个特定的活动处于前台时应当使用的首选卡仿真服务。</li>
+</ul>
+
+<h2 id="Power">Project Volta</h2>
+
+<p>除了新功能之前,Android 5.0 还重点对电池寿命进行了改进。可以使用新的 API 和工具来了解并优化您的应用的功耗。</p>
+
+<h3 id="JobScheduler">调度作业</h3>
+<p>Android 5.0 提供了一个新的 {@link android.app.job.JobScheduler} API,它允许您通过为系统定义要在以后的某个时间或在指定的条件下(例如,当设备在充电时)异步运行的作业来优化电池寿命。作业调度在下列情况下非常有用:</p>
+<ul>
+ <li>应用具有您可以推迟的非面向用户的工作。</li>
+ <li>应用具有当插入设备时您希望优先执行的工作。</li>
+ <li>应用具有需要访问网络或 Wi-Fi 连接的任务。</li>
+ <li>应用具有您希望作为一个批次定期运行的许多任务。</li>
+
+</ul>
+
+<p>工作单元由一个 {@link android.app.job.JobInfo} 对象进行封装。此对象指定了调度条件。</p>
+
+<p>使用 {@link android.app.job.JobInfo.Builder} 类配置调度的任务应当如何运行。您可以将任务调度为在特定的条件下运行,例如:</p>
+
+<ul>
+ <li>当设备充电时启动</li>
+ <li>当设备连接到不限流量网络时启动</li>
+ <li>当设备空闲时启动</li>
+ <li>在特定的截止期限之前或以最小的延迟完成</li>
+</ul>
+
+<p>例如,您可以添加如下代码以在不限流量网络上运行您的任务:</p>
+
+<pre>
+JobInfo uploadTask = new JobInfo.Builder(mJobId,
+ mServiceComponent /* JobService component */)
+ .setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED)
+ .build();
+JobScheduler jobScheduler =
+ (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
+jobScheduler.schedule(uploadTask);
+</pre>
+
+<p>如果设备具有稳定的电源(也就是说,它已插入了 2 分钟以上并且电池处于<a href="{@docRoot}reference/android/content/Intent.html#ACTION_BATTERY_OKAY">健康水平</a>),则系统将运行任何已就绪可运行的已调度作业,即使作业的截止期限尚未到期也是如此。</p>
+
+<p>要查看有关如何使用 {@link android.app.job.JobScheduler} API 的示例,请参考本版本中的 {@code JobSchedulerSample} 实施样本。</p>
+
+<h3 id="PowerMeasurementTools">用于查询耗电量信息的开发者工具</h3>
+
+<p>新的 {@code dumpsys batterystats} 命令将生成关于设备上耗电量信息的有趣统计数据,该数据按唯一用户 ID (UID) 进行组织。该统计信息包括:</p>
+
+<ul>
+<li>与电池相关的事件的历史记录
+<li>设备的全局统计信息
+<li>每个 UID 和系统组件的大致用电量
+<li>每个数据包的每个手机应用毫秒数
+<li>系统 UID 汇总统计信息
+<li>应用 UID 汇总统计信息
+</ul>
+
+<p>可使用 {@code --help} 选项了解用于对输出进行自定义的各种选项。例如,要输出自设备上次充电后给定应用包的耗电量统计信息,请运行以下命令:
+<pre>
+$ adb shell dumpsys batterystats --charged <package-name>
+</pre>
+
+<p>您可以对 {@code dumpsys} 命令的输出使用 <a href="https://github.com/google/battery-historian" class="external-link">Battery Historian</a> 工具从日志中生成与电量相关的事件的 HTML 可视形式。此信息使您可以更轻松地了解和诊断任何与电池相关的问题。</p>
+
+<h2 id="Enterprise">办公场所和教育环境中的 Android</h2>
+<h3 id="ManagedProvisioning">托管配置</h3>
+
+<p>Android 5.0 提供了用于在企业环境内运行应用的新功能。如果用户具有现有的个人帐户,则<a href="{@docRoot}guide/topics/admin/device-admin.html">设备管理员</a>可以启动托管配置流程来向设备添加一个共存但单独的“托管配置文件”<em></em>。与托管配置文件关联的应用将与非托管应用一起出现在用户的启动器、“最近用过”屏幕以及通知中。</p>
+
+<p>要启动托管配置流程,请在 {@link android.content.Intent} 中发送 {@link android.app.admin.DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE ACTION_PROVISION_MANAGED_PROFILE}。如果调用成功,则系统将触发 {@link android.app.admin.DeviceAdminReceiver#onProfileProvisioningComplete(android.content.Context, android.content.Intent) onProfileProvisioningComplete()} 回调。然后,您可以调用 {@link android.app.admin.DevicePolicyManager#setProfileEnabled(android.content.ComponentName) setProfileEnabled()} 来启用此托管配置文件。</p>
+
+<p>默认情况下,在托管配置文件中只会启用一小部分应用。您可以通过调用 {@link android.app.admin.DevicePolicyManager#enableSystemApp(android.content.ComponentName, android.content.Intent) enableSystemApp()} 在托管配置文件中安装额外的应用。</p>
+
+<p>如果您在开发启动器应用,则可以使用新的 {@link android.content.pm.LauncherApps} 类来获取当前用户的可启动活动的列表以及任何关联的托管配置文件。您的启动器可以通过向图标绘图添加一个工作标记,使托管应用更加惹人注目。要检索带标记的图标,请调用 {@link android.content.pm.PackageManager#getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle) getUserBadgedIcon()}。</p>
+
+<p>要查看如何使用此新功能,请参考本版本中的 {@code BasicManagedProfile} 实施样本。</p>
+
+<h3 id="DeviceOwner">设备所有者</h3>
+<p>Android 5.0 引入了部署设备所有者应用的功能。“设备所有者”<em></em>是一类特殊的<a href="{@docRoot}guide/topics/admin/device-admin.html">设备管理员</a>,具有在设备上创建和移除辅助用户以及配置全局设置的额外能力。您的设备所有者应用可以使用 {@link android.app.admin.DevicePolicyManager} 类中的方法来对托管设备上的配置、安全性和应用进行精细控制。一个设备在任一时刻只能有一个处于活动状态的设备所有者。</p>
+
+<p>要部署并激活设备所有者,您必须在设备处于未配置状态时执行从编程应用到设备的 NFC 数据传输。此数据传输发送的信息与<a href="#ManagedProvisioning">托管配置</a>中描述的配置 intent 中的信息相同。</p>
+
+<h3 id="ScreenPinning">屏幕固定</h3>
+
+<p>Android 5.0 引入了一个新的屏幕固定 API,它允许您暂时防止用户离开您的任务或被通知打扰。例如,如果您在开发一个教育应用以在 Android 或单用途或资讯服务应用上支持高风险评估需求,则可以使用此功能。一旦您的应用激活了屏幕固定,则用户将无法看到通知、访问其他应用或者返回到主屏幕,直到您的应用退出该模式。</p>
+
+<p>有两种方法用来激活屏幕固定:</p>
+
+<ul>
+<li><strong>手动</strong>:用户可以在“设置”>“安全性”>“屏幕固定”<em></em>中启用屏幕固定,并通过在“最近用过”屏幕上点触屏幕固定图标来选择他们要固定的任务。</li> <li><strong>以编程方式</strong>:要以编程方式激活屏幕固定,请在您的应用中调用 {@link android.app.Activity#startLockTask() startLockTask()}。如果请求方应用不是设备所有者,则会提示用户确认。设备所有者应用可以调用 {@link android.app.admin.DevicePolicyManager#setLockTaskPackages(android.content.ComponentName, java.lang.String[]) setLockTaskPackages()} 方法来使应用成为可固定的,不需要经历用户确认步骤。</li>
+</ul>
+
+<p>当任务锁定处于活动状态时,会发生以下行为:</p>
+
+<ul>
+<li>状态栏为空,并且用户通知和状态信息被隐藏。</li>
+<li>首页和“最近的应用”按钮被隐藏。</li>
+<li>其他应用无法启动新活动。</li>
+<li>当前应用可以启动新活动,只要这样做不会创建新任务即可。</li>
+<li>当屏幕固定是由设备所有者调用的时,用户将保持锁定到您的应用,直到该应用调用 {@link android.app.Activity#stopLockTask() stopLockTask()}。</li>
+<li>如果屏幕固定是由设备所有者之外另一应用或者是由用户直接调用的活动时,用户可以通过同时按住“返回”和“最近”按钮退出。</li>
+
+</ul>
+
+<h2 id="Printing">打印框架</h2>
+
+<h3 id="PDFRender">使用位图来呈现 PDF 文件</h3>
+<p>您现在可以使用新的 {@link android.graphics.pdf.PdfRenderer} 类将 PDF 文档页呈现为位图图片以便打印。您必须指定系统将可打印内容写入其中的一个可查找的(也就是说,可以随机访问内容){@link android.os.ParcelFileDescriptor}。您的应用可以通过 {@link android.graphics.pdf.PdfRenderer#openPage(int) openPage()} 获取页面进行呈现,然后调用 {@link android.graphics.pdf.PdfRenderer.Page#render(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Matrix, int) render()} 将已打开的 {@link android.graphics.pdf.PdfRenderer.Page} 转变为位图。如果您只希望将文档的一部分转变为位图图片(例如,要实施<a href="http://en.wikipedia.org/wiki/Tiled_rendering" class="external-link">平铺渲染</a>以放大文档),则还可以设置其他参数。</p>
+
+<p>有关如何使用新 API 的示例,请参阅 {@code PdfRendererBasic} 样本。</p>
+
+<h2 id="System">系统</h2>
+<h3 id="AppUsageStatistics">应用使用情况统计信息</h3>
+<p>您现在可以通过新的 {@link android.app.usage} API 访问 Android 设备上的应用使用情况历史记录。此 API 提供了比被弃用的 {@link android.app.ActivityManager#getRecentTasks(int, int) getRecentTasks()} 方法更详细的使用情况信息。要使用此 API,必须先在您的清单中声明 {@code "android.permission.PACKAGE_USAGE_STATS"} 权限。用户还必须通过“设置”>“安全性”>“应用”<em></em>使用“使用情况访问”启用对此应用的访问权限。</p>
+
+<p>系统将以每个应用为单位收集使用情况数据,并按每天、每周、每月和每年时间间隔对数据进行汇总。系统保留此数据的最大持续时间如下所述:</p>
+
+<ul>
+ <li>每天数据:7 天</li>
+ <li>每周数据:4 周</li>
+ <li>每月数据:6 个月</li>
+ <li>每年数据:2 年</li>
+</ul>
+
+<p>对于每个应用,系统将记录以下数据:</p>
+<ul>
+<li>上次使用应用的时间</li>
+<li>应用在该时间间隔内(按天、周、月或年)处于前台的总时间长度</li>
+<li>组件(由程序包和活动名称予以标识)在一天中移动到前台或后台时的时间戳捕获</li>
+<li>设备配置更改时(例如当设备配置因为旋转而更改时)的时间戳捕获</li>
+</ul>
+
+<h2 id="TestingA11y">测试和辅助功能 </h2>
+
+<h3 id="TestingA11yImprovements">测试和辅助功能改进</h3>
+<p>Android 5.0 对测试和辅助功能增加了以下支持:</p>
+
+<ul>
+<li>新的 {@link android.app.UiAutomation#getWindowAnimationFrameStats() getWindowAnimationFrameStats()} 和 {@link android.app.UiAutomation#getWindowContentFrameStats(int) getWindowContentFrameStats()} 方法将捕获窗口动画和内容的帧统计信息。这些方法允许您编写仪器测试来评估某个应用是否在以足够的刷新频率来呈现帧以提供流畅的用户体验。</li>
+
+<li>新的 {@link android.app.UiAutomation#executeShellCommand(java.lang.String) executeShellCommand()} 方法允许您通过仪器测试执行 shell 命令。命令执行类似于从连接到设备的主机运行 {@code adb shell},允许您使用基于 shell 的工具,例如 {@code dumpsys}、{@code am} {@code content} 和 {@code pm}。</li>
+
+<li>使用辅助功能 API(例如 <a href="{@docRoot}tools/help/uiautomator/index.html">{@code UiAutomator}</a>)的辅助服务和测试工具现在可以检索有视力的用户可以与之进行互动的屏幕上窗口的属性的详细信息。要检索 {@link android.view.accessibility.AccessibilityWindowInfo} 对象的列表,请调用新的 {@link android.accessibilityservice.AccessibilityService#getWindows() getWindows()} 方法。</li>
+
+<li>新的 {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction} 类允许您定义可以对 {@link android.view.accessibility.AccessibilityNodeInfo} 执行的标准或自定义操作。新的 {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction} 类替换了以前在 {@link android.view.accessibility.AccessibilityNodeInfo} 中提供的与操作相关的 API。</li>
+
+<li>Android 5.0 对您的应用中的文本到语音合成提供了更细粒度的控制。新的 {@link android.speech.tts.Voice} 类允许您的应用使用与特定区域设置、质量和延迟评级以及特定于文本到语音引擎的参数关联的语音配置文件。</li>
+</ul>
+
+<h2 id="IME">IME</h2>
+
+<h3 id="Switching">更轻松地在输入语言之间切换</h3>
+
+<p>从 Android 5.0 开始,用户可以更轻松地在该平台支持的所有<a href="{@docRoot}guide/topics/text/creating-input-method.html">输入法编辑器 (IME)</a> 之间进行切换。执行指定的切换操作(通常是触摸软键盘上的一个地球图标)将循环经过所有此类 IME。此行为更改是由 {@link android.view.inputmethod.InputMethodManager#shouldOfferSwitchingToNextInputMethod(android.os.IBinder) shouldOfferSwitchingToNextInputMethod()} 方法实施的。</p>
+
+<p>此外,框架现在还将检查下一个 IME 究竟是否包括切换机制(并因此检查该 IME 是否支持切换到它之后的 IME)。具有切换机制的 IME 不会切换到没有切换机制的 IME。此行为更改是由 {@link android.view.inputmethod.InputMethodManager#switchToNextInputMethod(android.os.IBinder, boolean) switchToNextInputMethod()} 方法实施的。
+
+<p>要查看有关如何使用更新的 IME 切换 API 的示例,请参考本版本中更新的软键盘实施样本。要详细了解如何实施 IME 切换,请参阅<a href="{@docRoot}guide/topics/text/creating-input-method.html">创建输入法</a>。
+</p>
+
+<h2 id="Manifest">清单声明</h2>
+
+<h3 id="ManifestFeatures">声明必需的功能</h3>
+<p><a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> 元素中现在支持下列值,因此,您可以确保您的应用仅安装在提供了您的应用所需功能的设备上。</p>
+
+<ul>
+<li>{@link android.content.pm.PackageManager#FEATURE_AUDIO_OUTPUT}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_CAPABILITY_RAW}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_LEVEL_FULL}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_GAMEPAD}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_LIVE_TV}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_MANAGED_USERS}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_LEANBACK}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_OPENGLES_EXTENSION_PACK}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_SECURELY_REMOVES_USERS}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_SENSOR_AMBIENT_TEMPERATURE}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_SENSOR_HEART_RATE_ECG}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_SENSOR_RELATIVE_HUMIDITY}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_VERIFIED_BOOT}</li>
+<li>{@link android.content.pm.PackageManager#FEATURE_WEBVIEW}</li>
+</ul>
+
+<h3 id="Permissions">用户权限</h3>
+
+<p><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">{@code <uses-permission>}</a> 元素中现在支持以下权限来声明您的应用访问特定 API 时所需的权限。</p>
+
+<ul>
+<li>{@link android.Manifest.permission#BIND_DREAM_SERVICE}:当针对 API 级别 21 和更高级别时,<a href="{@docRoot}about/versions/android-4.2.html#Daydream">Daydream</a> 服务需要此权限来确保只有系统可以绑定到它。</li>
+</ul>
\ No newline at end of file
diff --git a/docs/html-intl/intl/zh-cn/about/versions/lollipop.jd b/docs/html-intl/intl/zh-cn/about/versions/lollipop.jd
new file mode 100644
index 0000000..3403630
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/about/versions/lollipop.jd
@@ -0,0 +1,253 @@
+page.title=Android Lollipop
+@jd:body
+
+
+
+
+
+
+
+
+ <div style="padding:0px 0px 0px 20px;float:right;margin:0 -10px 0 0">
+ <img src="{@docRoot}images/home/l-hero_2x.png" srcset="{@docRoot}images/home/l-hero.png 1x, {@docRoot}images/home/l-hero_2x.png 2x" width="460" height="300" >
+ </div>
+
+ <div class="landing-docs" style="float:right;clear:both;margin:68px 0 2em 3em;">
+ <div class="col-4 normal-links highlights" style="font-size:12px;">
+ <h3 id="thisd" >面向开发者的主要功能</h3>
+ <ul style="list-style-type:none;">
+ <li><a href="#Material">Material Design 设计</a></li>
+ <li><a href="#Perf">注重性能</a></li>
+ <li><a href="#Notifications">通知</a></li>
+ <li><a href="#TV">以大屏幕呈现</a></li>
+ <li><a href="#Documents">以文档为中心</a></li>
+ <li><a href="#Connectivity">连接性能再上一级</a></li>
+ <li><a href="#Graphics">高性能图形</a></li>
+ <li><a href="#Audio">音频处理功能更强</a></li>
+ <li><a href="#Camera">摄像头和视频处理进一步完善</a></li>
+ <li><a href="#Work">Android 在办公中的应用</a></li>
+ <li><a href="#ScreenCapture">屏幕截图和共享</a></li>
+ <li><a href="#Sensors">新型传感器</a></li>
+ <li><a href="#WebView">Chromium WebView</a></li>
+ <li><a href="#Accessibility">辅助功能和输入</a></li>
+ <li><a href="#Battery">构建低电耗应用</a></li>
+ </ul>
+ </div>
+</div>
+
+
+
+
+
+
+
+<p>欢迎使用 Android 5.0 Lollipop,这是迄今为止规模最大最为雄心勃勃的 Android 版本!</p>
+
+<p>此版本为用户推出了各种崭新的新功能,为开发者则提供了数千个新的 API。不仅如此,它将 Android 的疆土扩展得更远,小到手机、平板电脑和穿戴式设备,大到电视和汽车,都可以是它活跃的领地。</p>
+
+<p>要深入了解面向开发者的新 API,请参阅 <a href="{@docRoot}about/versions/android-5.0.html">Android 5.0 API 概述</a>。有关适合消费者阅读的更多 Android 5.0 内容,请访问 <a href="http://www.android.com/versions/lollipop-5-0/">www.android.com</a>。</p>
+
+
+
+<h2 id="Material">Material design 设计</h2>
+
+<p>Android 5.0 将 <a href="http://www.google.com/design/spec">Material design 设计</a>引入 Android 系统,它自带一个扩展的界面工具包,可以让您轻松地将新的设计图案集成到自己的应用中。 </p>
+
+
+
+<p>在新的 <strong>3D 视图</strong>中,您可以设置 z 轴让元素从视图层面上“站”起来,甚至可以随着元素的移动投下<strong>实时阴影</strong>。</p>
+
+
+<p>内置的 <strong>Activity Transitions</strong> API 可以通过优美的动画天衣无缝地让用户从一种状态切换到另一种状态。素材主题为您的活动提供了各种过渡方式,包括在各个活动中使用<strong>共享的可视化元素</strong>功能。</p>
+
+
+
+<div style="width:290px;margin-right:35px;float:left">
+ <div class="framed-nexus5-port-span-5">
+ <video class="play-on-hover" autoplay="">
+ <source src="/design/material/videos/ContactsAnim.mp4">
+ <source src="/design/videos/ContactsAnim.webm">
+ <source src="/design/videos/ContactsAnim.ogv">
+ </video>
+ </div>
+ <div style="font-size:10pt;margin-left:20px;margin-bottom:30px">
+ <em>要重播影片,请单击设备屏幕</em>
+ </div>
+</div>
+
+
+<p>您可以对按钮、复选框以及应用中的其他触摸控件加上涟漪动画。
+
+<p>您还可以在 XML 文件中定义可动的矢量图,让它们展现出各种不同的动画效果。矢量图在自由缩放的同时不会失真,非常适合用作应用中的纯色图标。</p>
+
+<p><strong>RenderThread</strong> 则是新推出的由系统管理的渲染线程,即使主界面线程出现延迟,它也能保持动画运行流畅。 </p>
+
+
+<h2 id="Perf">注重性能</h2>
+
+<p>Android 5.0 为用户带来更快、更流畅、更强大的计算体验。</p>
+
+<p>Android 现在完全运行在全新构建的 <strong>ART 运行时</strong>上,支持混合使用预先编译 (AOT)、即时编译 (JIT) 和编译好的代码。它可以在 ARM、x86 和 MIPS 架构上正常运行,并且完全兼容 64 位。</p>
+
+<p>ART 改进了应用性能和响应能力。它采用高效的垃圾回收方式,减少了垃圾回收事件的次数和暂停时间,贴合搭配垂直同步窗口,因此您的应用不会出现掉帧现象。ART 还会动态移动内存,针对前台使用情况优化内存。 </p>
+
+<p>Android 5.0 引入了对 <strong>64 位架构</strong>(已应用于 Nexus 9 的 NVIDIA Tegra K1)的平台支持,经过优化后提供更大的寻址空间,提升了针对特定的计算工作负载的性能。以 Java 编写的应用可自动作为 64 位应用运行,无需任何修改。如果您的应用使用原生代码,也不用担心。我们扩展了 NDK,可支持适用于 ARM v8、x86-64 和 MIPS-64 的新 ABI。</p>
+
+<p>Android 一如既往注重实现更流畅的性能,并在 5.0 中改进了声音/视频同步方式。音频和图形管道都经过调校,时间戳更为精准,因此视频应用和游戏都能显示流畅的同步内容。</p>
+
+
+<h2 id="Notifications">通知</h2>
+
+<p>在 Android 5.0 中,用户可以更加方便地查看、使用和配置通知。 </p>
+
+<img src="{@docRoot}images/versions/notification-headsup.png" style="float:right; margin:0 0 40px 60px" width="300" height="224" />
+
+<p>用户可以根据需在<strong>锁屏上</strong>显示不同的通知详细信息,例如,他们可以选择在安全锁屏上完全不显示通知,也可以选择显示部分或全部通知。 </p>
+
+<p>像来电这样的重要通知警报会显示在<strong>浮动通知</strong>中,这是一个浮在上方显示的小窗口,方便用户无需退出当前应用就能响应或关闭通知。</p>
+
+<p>您现在可以在通知中通过<strong>新的元数据</strong>来收集相关的联系人(用于评级)、类别和优先级。</p>
+
+<p>内置新的媒体通知模板可以设置多达 6 个控制按钮(包括“翘拇指”之类的自定义控件),以通知方式实现一致的媒体控制,再也用不着 RemoteViews 了!</p>
+
+
+
+<h2 id="TV">以大屏幕呈现</h2>
+
+<p><a href="http://developer.android.com/tv/index.html">Android TV</a> 打造了一个完整的电视平台,让您的应用在大屏幕上驰骋。它以简洁的主屏幕体验为核心,提供个性化推荐和语音搜索功能,方便客户轻松发现内容。</p>
+
+<p>有了 Android TV,您现在可以为应用或游戏内容<strong>营造宏大且引人入胜的氛围</strong>,并支持与游戏控制器和其他输入设备互动。Android 还在 <a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 支持库</a>中提供了 <strong>Leanback 界面框架</strong>,帮助您构建在 10 英尺处观看的电视界面,给用户一种恍若看电影的感觉。</p>
+
+<p><strong>Android TV 输入框架</strong> (TIF) 能够让电视应用处理来自 HDMI 输入、电视调谐器和 IPTV 接收器等等的视频流。它还通过 TV 输入框架发布的元数据支持直播电视搜索和推荐功能,并且内置 HDMI-CEC 控制服务,可以让用户通过单独一个遥控器操控多个设备。 </p>
+
+<p>TV 输入框架能够让您广泛使用大量直播电视输入来源,并将它们汇总在同一个界面中供用户浏览、查看和欣赏内容。如果您为内容构建电视输入服务,用户就能更便利地在电视设备上观看这些内容。</p>
+
+
+
+<img src="{@docRoot}images/versions/recents_screen_2x.png" srcset="{@docRoot}images/versions/recents_screen.png 1x, {@docRoot}images/versions/recents_screen_2x.png 2x" style="float:right; margin:0 0 40px 60px" width="300" height="521" />
+
+<h2 id="Documents">以文档为中心</h2>
+
+<p>Android 5.0 引入了重新设计的“概览”空间(以前称为“最近事项”),在多任务处理上更为强大,用途更加广泛。</p>
+
+<p>新的 API 让应用中的活动化身成为独立的文档,与其他最近活动的屏幕并排显示,</p>
+
+<p>这样您可以充分利用并行文档,让用户即时访问您的更多内容或服务。例如,您可以使用并行文档展现工作提效应用中的文件、游戏中的玩家比赛,或者即时消息应用的聊天。 </p>
+
+
+
+<h2 id="Connectivity">连接性能更上一级</h2>
+
+<p>Android 5.0 新开放的 API 可以让应用与<strong>低功耗蓝牙</strong> (BLE) 的扫描(內围模式)和广告(外围模式)实现并行操作。</p>
+
+<p>新的<strong>多重联网</strong>功能允许应用查询可用网络来查找可用功能,例如它们是 Wi-Fi 网络、蜂窝网络还是不限流量网络,以及它们是否提供了特定的网络功能。然后,应用可以请求联网,并在连接断开或出现其他的网络变动时做出响应。</p>
+
+<p><strong>NFC</strong> API 现在允许应用动态注册 NFC 应用 ID (AID)。它们还可以根据活动状态下的服务设置首选的卡仿真服务并创建 NDEF 记录(采用 UTF-8 文本数据)。</p>
+
+
+
+<h2 id="Graphics">高性能图形</h2>
+
+<p>现已支持 <strong><a href="http://www.khronos.org/opengles/3_X/">Khronos OpenGL ES 3.1</a></strong>,因此您可以在受支持的设备上为游戏和其他应用采用最高性能的 2D 和 3D 图形功能。 </p>
+
+<p>OpenGL ES 3.1 增加了计算着色器、模版纹理、加速的视觉效果、优质 ETC2/EAC 纹理压缩、高级纹理渲染、标准化纹理尺寸以及渲染缓冲区格式等功能。</p>
+
+
+<div class="figure" style="width:350px; margin:0 0 0 60px">
+<img src="{@docRoot}images/versions/rivalknights.png" style="float:right;" width="350" height="525" />
+<p class="img-caption">Gameloft 开发的《骑士对决》采用了 AEP 中的 ASTC(自适应可伸缩纹理压缩)和 ES 3.1 中的计算着色器,不仅打造出 HDR(高动态范围)泛光效果,而且图形细节更加清楚。</p>
+</div>
+
+<p>Android 5.0 还引入了 <strong>Android 扩展程序包</strong> (AEP),这是一组 OpenGL ES 扩展程序,可让您使用镶嵌图案着色器、几何图形着色器、ASTC 纹理压缩、按样本插入和着色以及其他高级渲染功能。有了 AEP,您就可以通过一系列 GPU 运用高性能图形。</p>
+
+
+<h2 id="Audio">音频处理功能更强</h2>
+
+<p>采用全新的音频捕捉设计,提供<strong>低延迟音频输入</strong>功能。在此设计中,快速音频捕捉线程只要不是读取则永远不会阻塞,高速客户端采用本地取样频率、通道数和位深度;普通客户端具备重新采样、上/下行通道混合以及上/下位深度的特点。</p>
+
+<p>借助多通道<strong>音频流混合</strong>,专业音频应用可以混音多达八个通道,包括 5.1 和 7.1 通道在内。</p>
+
+<p>应用现在可以公开自己的媒体内容,并<strong>浏览其他应用的媒体</strong>,然后请求播放。内容通过具有查询功能的界面公开,不需要驻留在设备上。</p>
+
+<p>应用可以通过与特定区域设置、质量和延迟评级关联的语音配置文件精准控制<strong>从文本到语音的合成</strong>。新的 API 还增强了对合成错误检查、网络合成、语言搜索和网络回退的支持。</p>
+
+<p>Android 现在支持标准 <strong>USB 音频</strong>外设,因此用户可以连接 USB 耳机、扬声器、麦克风和其他高性能数字外设。Android 5.0 更是支持 <strong>Opus</strong> 音频编解码器。</p>
+
+<p>在媒体播放控制领域内新开放的 <strong>{@link android.media.session.MediaSession}</strong> API,能够在不同屏幕和不同控制器之间保持一致的媒体控制。</p>
+
+
+<h2 id="Camera">摄像头和视频处理进一步完善</h2>
+
+<p>Android 5.0 引入了<strong>全新的摄像头 API</strong>,支持您以 YUV 和 Bayer RAW 等原始格式拍照,并针对每个独立帧控制曝光时间、ISO 感光度和帧持续时间。新的完全同步的摄像头管道允许您在受支持的设备上以每秒 30 帧的速率捕获未压缩的全分辨率 YUV 图片。</p>
+
+<p>除了图片之外,您还可以通过摄像头捕获元数据,例如噪声模型和光学信息。</p>
+
+<p>视频如果是通过网络发送视频流,则现在可以利用 H.265 <strong>高效视频编码 (HEVC)</strong> 实现视频数据的最佳编码和解码。 </p>
+
+<p>Android 5.0 还新支持<strong>多媒体隧道</strong>,以便针对超高清 (4K) 内容提供最佳体验,并且能够将压缩的音频和视频数据一起播放。 </p>
+
+
+
+<div class="figure" style="width:320px; margin:1em 0 0 20px;padding-left:2em;">
+<img style="float:right; margin:0 1em 1em 2em" src="{@docRoot}images/android-5.0/managed_apps_launcher@2x.png" srcset="{@docRoot}images/android-5.0/managed_apps_launcher@2x.png 2x" alt="" width="300" />
+<p class="img-caption">用户可以通过一致的方式查看其个人应用和工作应用,这些应用带有标记,可以轻松识别。</p>
+</div>
+
+
+<h2 id="Work">工作场所中的 Android</h2>
+
+<p>为了在企业环境中实现自带设备办公,开发者可以借助全新的<a href="{@docRoot}about/versions/android-5.0.html#Enterprise">托管配置流程</a>在设备上创建安全的工作配置文件。在启动器中,应用如果带有工作标记,则表示该应用及其数据是由 IT 管理员在工作配置文件内管理的。</p>
+
+<p>针对个人配置文件和工作配置文件的通知都显示在一个统一视图中。每个配置文件的数据始终彼此分开,即使当两个配置文件使用同一应用时也是如此。</p>
+
+<p>对于公司自有的设备,IT 管理员可以通过<a href="{@docRoot}about/versions/android-5.0.html#DeviceOwner">设备所有者</a>着手处理新设备并予以配置。雇主可以针对已安装并可配置全局设备设置的设备所有者应用发放这些设备。</p>
+
+
+
+<h2 id="ScreenCapture">屏幕截图和共享</h2>
+
+<p>Android 5.0 允许您在应用中使用屏幕捕获和屏幕共享功能。 </p>
+
+<p>只要拥有用户权限,您就可以从显示屏捕获非安全视频,并可以选择通过网络发送。</p>
+
+
+<h2 id="Sensors">新型传感器</h2>
+
+<p>在 Android 5.0 中,新的<strong>倾斜检测</strong>传感器能够帮助改善受支持设备上对活动的识别情况,<strong>心率传感器</strong>则可报告触摸设备的人员的心率。 </p>
+
+<p>新的<strong>互动复合传感器</strong>现在可用来检测特殊互动,例如“唤醒”<em></em>手势、<em></em>“拾取”手势和<em></em>“扫视”手势。</p>
+
+
+
+<h2 id="WebView">Chromium WebView</h2>
+
+<div style="float:right;margin:1em 2em 1em 2em;">
+ <img src="/images/kk-chromium-icon.png" alt="" height="160" style="margin-bottom:0em;">
+</div>
+
+<p>Android 5.0 的初始版本包括一个适用于 {@link android.webkit.WebView} 的 Chromium 版本,该版本基于 Chromium M37 版本,增加了对 <strong>WebRTC</strong>、<strong>WebAudio</strong> 和 <strong>WebGL</strong> 的支持。 </p>
+
+<p>Chromium M37 还包括对所有 <strong>Web 组件</strong>规范的原生支持:定制元素、Shadow DOM、HTML 导入以及模板。也就是说,您可以在 WebView 中使用 <a href="http://polymer-project.org/">Polymer</a> 及其<a href="https://www.polymer-project.org/docs/elements/material.html">Material design 设计元素</a>,无需 polyfills。</p>
+
+<p>虽然自 Android 4.4 以来 WebView 已基于 Chromium ,但现在可以从 Google Play 更新 Chromium 层。</p>
+
+<p>当有新的 Chromium 版本可用时,用户可以从 Google Play 进行更新以确保获得针对 WebView 的最新增强功能和错误修复,以便为在 Android 5.0 和更高版本上使用 WebView 的应用提供最新的 Web API 和错误修复。</p>
+
+
+
+<h2 id="Accessibility">辅助功能和输入</h2>
+
+<p>新的辅助功能 API 可以检索屏幕(普通用户可见并可与之互动)上窗口的属性的详细信息,并且可以为界面元素定义标准或定制的输入操作。</p>
+
+<p>新的输入法编辑器 (IME) API 支持从输入法更快地直接切换到其他 IME。</p>
+
+
+
+<h2 id="Battery">可构建低电耗应用</h2>
+
+<p>新的<strong>作业调度</strong> API 支持您将系统作业推迟到后期或特定情况(例如,设备在充电或已连接到 Wi-Fi),从而最大延长电池寿命。</p>
+
+<p>新的 <code>dumpsys batterystats</code> 命令会生成<strong>耗电量统计信息</strong>,方便您了解整个系统的用电情况以及应用对设备电池的影响。您可以查看电源事件的历史记录、每个 UID 和系统组件的大致用电量,等等。</p>
+
+<img src="{@docRoot}images/versions/battery_historian.png" srcset="{@docRoot}images/versions/battery_historian@2x.png 2x" alt="" width="760" height="462" />
+<p class="img-caption">Battery Historian 是一个新工具,可以将 <code>dumpsys batterystats</code> 的统计信息转成直观的信息,方便就电池进行调试。该工具位于 <a href="https://github.com/google/battery-historian">https://github.com/google/battery-historian</a>。</p>
diff --git a/docs/html-intl/intl/zh-cn/design/style/writing.jd b/docs/html-intl/intl/zh-cn/design/style/writing.jd
new file mode 100644
index 0000000..7944c24
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/design/style/writing.jd
@@ -0,0 +1,311 @@
+page.title=写作风格
+page.type=设计
+
+@jd:body
+
+ <h2 id="voa">Android 的语言风格</h2>
+
+ <p>撰写应用中显示的文本时,应力求简明、简易和友好。</p>
+
+ <h4 id="concise">简明</h4>
+
+ <ul>
+ <li>仅告知用户最必要的信息。</li>
+ <li>避免冗余的表述,例如标题重复陈述信息框中的正文内容。</li>
+ <li>尽可能缩短文本长度。</li>
+ </ul>
+
+ <p><em>避免使用啰嗦、生硬的文字</em></p>
+
+ <div class="layout-content-row">
+ <div class="layout-content-col span-6 layout-with-list-item-margins">
+
+ <div class="do-dont-label bad">错误做法</div>
+
+ <table class="ui-table good"><tbody><tr><td>
+ 如需更详细的说明,请参考手机随附的文档。
+ </td></tr></tbody></table>
+
+ </div>
+ <div class="layout-content-col span-6">
+
+ <div class="do-dont-label good">正确做法</div>
+
+ <table class="ui-table good"><tbody><tr><td>
+ 请阅读手机随附的说明。
+ </td></tr></tbody></table>
+
+ </div>
+ </div>
+
+ <p><em>请勿提供无关信息</em></p>
+
+ <div class="layout-content-row">
+ <div class="layout-content-col span-6 layout-with-list-item-margins">
+
+ <div class="do-dont-label bad">从“设置向导”屏幕</div>
+
+ <table class="ui-table bad">
+ <thead>
+ <tr>
+ <th>
+ 登录…
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ 你的手机需要与 Google 服务器通信<br />
+ 然后才能登录到你的帐户。<br />
+ 此过程最多可能需要 5 分钟。
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
+ </div>
+ <div class="layout-content-col span-6">
+
+ <div class="do-dont-label good">从“设置向导”屏幕</div>
+
+ <table class="ui-table good">
+ <thead>
+ <tr>
+ <th>
+ 登录…
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ 你的手机正在连接 Google。<br />
+ 此过程最多可能需要 5 分钟。
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
+ </div>
+ </div>
+
+ <h4 id="simple">简易</h4>
+
+ <ul>
+ <li>使用简短字词、主动动词和常用名词。</li>
+ <li>最重要的内容放在最前面。用句首的几个字词来传达全句最重要的信息。</li>
+ <li>不要费力解释细枝末节,大部分用户并不关心这些。</li>
+ </ul>
+
+ <p><em>关注用户的兴趣点,而不是技术细节</em></p>
+
+ <div class="layout-content-row">
+ <div class="layout-content-col span-6 layout-with-list-item-margins">
+
+ <div class="do-dont-label bad">错误做法</div>
+
+ <table class="ui-table good"><tbody><tr><td>
+ 手动控制 GPS,以防止其他应用使用它
+ </td></tr></tbody></table>
+
+ </div>
+ <div class="layout-content-col span-6">
+
+ <div class="do-dont-label good">正确做法</div>
+
+ <table class="ui-table good"><tbody><tr><td>
+ 若想省电,请将“位置信息模式”切换为“耗电量低”
+ </td></tr></tbody></table>
+
+ </div>
+ </div>
+
+ <p><em>将重要信息放在最前面</em></p>
+
+ <div class="layout-content-row">
+ <div class="layout-content-col span-6 layout-with-list-item-margins">
+
+ <div class="do-dont-label bad">错误做法</div>
+
+ <table class="ui-table good"><tbody><tr><td>
+ 其他 77 人为此 +1 了,包括张三
+ </td></tr></tbody></table>
+
+ </div>
+ <div class="layout-content-col span-6">
+
+ <div class="do-dont-label good">正确做法</div>
+
+ <table class="ui-table good"><tbody><tr><td>
+ 张三及其他 76 人为此 +1 了
+ </td></tr></tbody></table>
+
+ </div>
+ </div>
+
+ <p><em>将用户目标放在最前面</em></p>
+
+ <div class="layout-content-row">
+ <div class="layout-content-col span-6 layout-with-list-item-margins">
+
+ <div class="do-dont-label bad">错误做法</div>
+
+ <table class="ui-table good"><tbody><tr><td>
+ 触摸“下一步”,以完成 Wi-Fi 连接设置
+ </td></tr></tbody></table>
+
+ </div>
+ <div class="layout-content-col span-6">
+
+ <div class="do-dont-label good">正确做法</div>
+
+ <table class="ui-table good"><tbody><tr><td>
+ 要完成 Wi-Fi 连接设置,请触摸“下一步”
+ </td></tr></tbody></table>
+
+ </div>
+ </div>
+
+
+ <h4 id="friendly">友好</h4>
+
+ <ul>
+ <li>使用缩写词。</li>
+ <li>使用“您”或“你”直接与读者对话。</li>
+ <li>语气应轻松自然,但要避免使用俚语。</li>
+
+ </ul>
+
+ <p><em>避免使用令人困惑或令人厌烦的表达</em></p>
+ <div class="layout-content-row">
+ <div class="layout-content-col span-6 layout-with-list-item-margins">
+ <div class="do-dont-label bad">错误做法</div>
+ <table class="ui-table bad">
+ <thead>
+ <tr>
+ <th>
+ 抱歉!
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ “MyAppActivity”活动<br />
+ (在应用“MyApp”中)无响应
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
+ </div>
+ <div class="layout-content-col span-6">
+ <div class="do-dont-label good">正确做法</div>
+ <table class="ui-table good">
+ <thead>
+ <tr>
+ <th>
+ MyApp 无响应
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ 是否将其关闭?
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+
+ <h4>应避免使用的字词</h4>
+
+ <div style="padding:5px 2.1em">
+ <table>
+ <tr>
+ <td class="do-dont-label bad" style="width:40%">不使用</td>
+ <td class="do-dont-label good" style="width:40%">使用</td>
+ </tr>
+ <tr>
+ <td>一、二、三、四…</td>
+ <td>1、2、3、4…</td>
+ </tr>
+ <tr>
+ <td>应用程序</td>
+ <td>应用</td>
+ </tr>
+ <tr>
+ <td>cannot、could not、do not、did not、will not、you will</td>
+ <td><em></em>缩写词:can’t、couldn’t、don’t、didn’t、won’t、you’ll 等等</td>
+ </tr>
+ <tr>
+ <td>okay、ok</td>
+ <td>OK</td>
+ </tr>
+ <tr>
+ <td>请、抱歉、谢谢</td>
+ <td><em>故作礼貌可能会令用户生厌,特别是在提示“出错”的消息中。<br />
+ 例外情况:在日语中,必须使用“请”。所以,祈使动词均应据此进行本地化(打开 -> 请打开)。
+ </em></td>
+ </tr>
+ <tr>
+ <td>there is、there are、it is<br />
+ <em>以及其他“无主语”表述(语法上称为虚指)</em></td>
+ <td><em>使用名词作为主语</em></td>
+ </tr>
+ <tr>
+ <td>abort、kill、terminate</td>
+ <td>stop、cancel、end、exit</td>
+ </tr>
+ <tr>
+ <td>fail、failed 等“否定用法”<em></em></td>
+ <td><em>一般情况下,请使用肯定用语<br />
+ (例如,使用“do”而非“don’t”,除非在“不再显示…”、“无法连接”等情况下。)</em></td>
+ </tr>
+ <tr>
+ <td>me、I、my、mine</td>
+ <td>you、your、yours</td>
+ </tr>
+ <tr>
+ <td>确定吗?警告!</td>
+ <td><em>应告诉用户后果,例如,“你的所有照片和媒体内容都将丢失”</em></td>
+ </tr>
+ </table>
+
+ </div>
+
+ <h2 id="formatting_text">设置文本格式</h2>
+
+ <h4 id="capitalization">大写</h4>
+
+ <ul>
+ <li>所有界面字符串都使用句子样式的大写:“Words to live by”。</li>
+ <li>大写以下各项中的所有重要字词:
+ <ul>
+ <li>应用名称(Calendar、Google Drive)</li>
+ <li>正式功能的名称(Android Beam、Face Unlock)</li>
+ <li>专有名词(Statue of Liberty、San Francisco Giants)</li>
+ </ul>
+ </li>
+ <li>避免滥用大写。对于不属于正式功能名称中的字词,请不要使用大写:
+ <ul>
+ <li>Sim card lock、Home screen;而非 Sim Card Lock、Home Screen。</li>
+ </ul>
+ </li>
+ </ul>
+
+
+ <h4 id="punctuation">标点符号</h4>
+ <ul>
+ <li><strong>句号。</strong> 只使用单个句子或短语时(如在问候语、标签或通知中),句尾无需加句号。但如果结合使用两句或更多句,则每一句的句尾都需加句号。</li>
+ <li><strong>省略号。</strong> 省略号 (…)(MacOS 中的 Option-; 和 HTML 中的 &hellip;)用于表示:
+ <ul>
+ <li>未完成的状态,例如操作正在进行(“正在下载…”)或文本未完全显示。</li>
+ <li>需要用户在随后显示的界面中做出重要选择的菜单项(例如“打印…”或“共享…”)。例外情况:如果命令的措辞已经表明需要进一步的界面操作(但有限制范围),则无需使用省略号,例如<strong>在网页中查找</strong>或<strong>选择日期</strong>。</li>
+ </ul>
+ </li>
+ </ul>
diff --git a/docs/html-intl/intl/zh-cn/distribute/essentials/index.jd b/docs/html-intl/intl/zh-cn/distribute/essentials/index.jd
new file mode 100644
index 0000000..26a61dc
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/distribute/essentials/index.jd
@@ -0,0 +1,34 @@
+page.title=Essentials for a Successful App
+meta.tags="landing, quality"
+page.tags="guidelines", "tablet", "quality"
+section.landing=true
+nonavpage=true
+
+@jd:body
+
+<p>
+ A focus on quality should be part of your entire app delivery process: from
+ initial concept through app and UI design, coding and testing and onto a
+ process of monitoring feedback and making improvement after launch.
+</p>
+
+<div class="dynamic-grid">
+<div class="resource-widget resource-flow-layout landing col-16"
+ data-query="collection:distribute/essentials/zhcn"
+ data-cardSizes="6x6"
+ data-maxResults="6">
+</div>
+
+<h3>Related resources</h3>
+
+<div class="resource-widget resource-flow-layout col-16"
+ data-query="type:blog+tag:quality"
+ data-cardSizes="6x3"
+ data-maxResults="3">
+</div>
+<div class="resource-widget resource-flow-layout col-16"
+ data-query="type:youtube+tag:appquality"
+ data-cardSizes="6x3"
+ data-maxResults="3">
+</div>
+</div>
\ No newline at end of file
diff --git a/docs/html-intl/intl/zh-cn/distribute/essentials/quality/core.jd b/docs/html-intl/intl/zh-cn/distribute/essentials/quality/core.jd
new file mode 100644
index 0000000..61598fd
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/distribute/essentials/quality/core.jd
@@ -0,0 +1,998 @@
+page.title=应用的核心质量
+page.image=/distribute/images/core-quality-guidelines.jpg
+page.type="分发"
+page.metaDescription=应用程序质量的好坏将直接影响到你的应用程序的长期成功 - 这包括安装,用户评分和评论,参与和用户保留方面。
+@jd:body
+
+ <div id="qv-wrapper"><div id="qv">
+ <h2>质量标准</h2>
+ <ol>
+ <li><a href="#ux">设计和互动</a></li>
+ <li><a href="#fn">功能</a></li>
+ <li><a href="#ps">性能和稳定性</a></li>
+ <li><a href="#listing">Google Play</a></li>
+
+ </ol>
+
+ <h2>测试</h2>
+ <ol>
+ <li><a href="#test-environment">设置测试环境</a></li>
+ <li><a href="#tests">测试流程</a></li>
+ </ol>
+
+ <h2>你还应阅读以下内容:</h2>
+ <ol>
+ <li><a href="{@docRoot}distribute/essentials/quality/tablets.html">平板电脑应用的质量</a></li>
+ <li><a href="{@docRoot}distribute/essentials/optimizing-your-app.html">优化你的应用</a></li>
+ </ol>
+
+
+ </div>
+ </div>
+
+ <div class="top-right-float">
+ <img src="{@docRoot}images/gp-core-quality.png" style="margin-left:20px" />
+ </div>
+
+ <p>
+ Android 用户期望获得高品质的应用。你的应用要获得长期成功(体现在安装量、用户评分和评论、参与度和用户留存等方面),应用质量起着直接的作用。
+ </p>
+
+ <p>
+ 本文介绍一组简明的核心应用质量标准及相关的测试,旨在帮助你评估应用质量的基本要素。所有 Android 应用均应满足这些标准。
+ </p>
+
+ <p>
+ 你在发布应用之前,请根据这些标准对应用进行测试,确保应用能在众多设备上正常运行,满足 Android 的导航和设计标准,并为在 Google Play 商店开展推广做好准备。当然你的测试范围远不止这里所介绍的内容,不过本文的目的是说明所有应用都应具备的基本质量特征,因此你可以在测试计划中纳入这些内容。
+ </p>
+
+ <p>
+ 如果你要为平板电脑和/或 Google Play for Education 创建应用,还应考虑<a href="{@docRoot}distribute/essentials/quality/tablets.html">平板电脑应用的质量</a>指南和 <a href="{@docRoot}distribute/essentials/gpfe-guidelines.html">Education 指南</a>中规定的其他质量标准。
+ </p>
+
+ <div class="headerLine">
+ <h2 id="ux">
+ 视觉设计和用户互动
+ </h2>
+
+
+ </div>
+
+ <p>
+ 遵循这些标准能够确保你的应用具备标准的 Android 视觉设计和互动模式(如果适用),从而提供一致、直观的用户体验。
+ </p>
+
+ <table>
+ <tr>
+ <th style="width:2px">
+ 领域
+ </th>
+ <th style="width:54px">
+ ID
+ </th>
+
+
+ <th>
+ 说明
+ </th>
+ <th style="width:54px">
+ 测试
+ </th>
+ </tr>
+ <tr id="UX-B1">
+ <td>标准设计</td>
+ <td>
+ UX-B1
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 应用遵循 <a href="{@docRoot}design/index.html">Android 设计</a>指南,采用常见的<a href="{@docRoot}design/patterns/index.html">界面模式和图标</a>:
+ </p>
+
+ <ol style="margin-bottom:.5em;list-style-type:lower-alpha">
+ <li>应用不会重新定义系统图标的预期功能(例如“返回”按钮)。
+ </li>
+
+ <li>如果系统图标触发的是标准界面行为,则应用不会使用完全不同的图标替换该系统图标。
+ </li>
+
+ <li>如果应用提供标准系统图标的自定义版本,那么该图标要与系统图标十分相似并能够触发标准系统行为。
+ </li>
+
+ <li>应用不会重新定义或滥用 Android 界面模式,例如有误导性或令用户困惑的图标或行为。
+ </li>
+ </ol>
+ </td>
+ <td>
+ <a href="#core">CR 全部</a>
+ </td>
+ </tr>
+
+ <tr>
+ <td rowspan="3">
+ 导航
+ </td>
+ <td id="UX-N1">
+ UX-N1
+ </td>
+ <td>
+ <p>
+ 应用支持标准的系统<a href="{@docRoot}design/patterns/navigation.html">“返回”按钮导航</a>,不会在屏幕上使用任何自定义的“返回按钮”提示。
+ </p>
+ </td>
+ <td>
+ <a href="#core">CR-3</a>
+ </td>
+ </tr>
+
+ <tr>
+ <td id="UX-N2">
+ UX-N2
+ </td>
+ <td>
+ <p>
+ 所有对话框均可以使用“返回”按钮关闭。
+ </p>
+ </td>
+ <td>
+ <a href="#core">CR-3</a>
+ </td>
+ </tr>
+
+ <tr id="UX-N3">
+ <td>
+ UX-N3
+ </td>
+ <td>
+ 在任何位置按下“主屏幕”按钮即可转到设备的主屏幕。
+ </td>
+ <td>
+ <a href="#core">CR-1</a>
+ </td>
+ </tr>
+
+ <tr id="UX-S1">
+ <td rowspan="2">
+ 通知
+ </td>
+ <td>
+ UX-S1
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 通知遵循 Android 设计<a href="{@docRoot}design/patterns/notifications.html">指南</a>。尤其是:</p>
+
+ <ol style="margin-bottom:.5em;list-style-type:lower-alpha">
+ <li>如果可能,将多个通知放入一个通知对象中。
+ </li>
+
+ <li>只有与进行中的活动(例如音乐播放或通话)相关时,通知才会持续保留。
+ </li>
+
+ <li>通知中不包含广告或与应用核心功能无关的内容,除非用户选择接受这样的通知。
+ </li>
+ </ol>
+ </td>
+ <td>
+ <a href="#core">CR-11</a>
+ </td>
+ </tr>
+
+ <tr id="UX-S2">
+ <td>
+ UX-S2
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 应用只为实现以下目的才使用通知:
+ </p>
+
+ <ol style="margin-bottom:.5em;list-style-type:lower-alpha">
+ <li>说明与用户个人相关的上下文更改(例如收到消息)</li>
+
+ <li>展示与进行中的活动(例如音乐播放或通话)相关的信息/控件。
+ </li>
+ </ol>
+ </td>
+ <td>
+ <a href="#core">CR-11</a>
+ </td>
+ </tr>
+ </table>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/corequalityguidelines/visualdesign" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,6x3,6x3" data-maxresults="6">
+ </div>
+
+ <div class="headerLine">
+ <h2 id="fn">
+ 功能
+ </h2>
+
+
+ </div>
+
+ <p>
+ 遵循这些标准能够确保你的应用使用合适的权限级别,提供预期的功能行为。
+ </p>
+
+ <table>
+ <tr>
+ <th style="width:2px">
+ 领域
+ </th>
+ <th style="width:54px">
+ ID
+ </th>
+ <th>
+ 说明
+ </th>
+ <th style="width:54px">
+ 测试
+ </th>
+ </tr>
+
+ <tr id="FN-P1">
+ <td rowspan="2">
+ 权限
+ </td>
+ <td>
+ FN-P1
+ </td>
+ <td>
+ 应用只请求为支持核心功能而需要的绝对最低级别权限。<em></em>
+ </td>
+ <td rowspan="2">
+ <a href="#core">CR-11</a>
+ </td>
+ </tr>
+
+ <tr id="FN-P2">
+ <td>
+ FN-P2
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 除非与应用的核心功能相关,否则应用不请求访问敏感数据(例如通讯录或系统日志)或访问用户付费服务(例如拨号或短信)的权限。
+ </p>
+ </td>
+ </tr>
+
+ <tr id="FN-L1">
+ <td>
+ 安装位置
+ </td>
+ <td>
+ FN-L1
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 应用安装在 SD 卡上(如果应用支持)时可以正常工作。
+ </p>
+
+ <p style="margin-bottom:.25em">
+ 建议大多数的大型应用(大于 10MB)支持安装到 SD 卡。请参阅<a href="{@docRoot}guide/topics/data/install-location.html">应用安装位置</a>开发者指南,了解哪些类型的应用应该支持安装到 SD 卡。
+ </p>
+ </td>
+ <td>
+ <a href="#SD-1">SD-1</a>
+ </td>
+ </tr>
+
+ <tr id="FN-A1">
+ <td rowspan="4">
+ 音频
+ </td>
+ <td>
+ FN-A1
+ </td>
+ <td>
+ 音频不会在屏幕关闭时播放,除非这是应用的核心功能(例如应用是音乐播放器)。
+ </td>
+ <td>
+ <a href="#core">CR-7</a>
+ </td>
+ </tr>
+
+ <tr id="FN-A2">
+ <td>
+ FN-A2
+ </td>
+ <td>
+ 音频不会在<a href="http://android-developers.blogspot.com/2011/11/making-android-games-that-play-nice.html">锁定屏幕后播放</a>,除非这是应用的核心功能。
+ </td>
+ <td>
+ <a href="#core">CR-8</a>
+ </td>
+ </tr>
+
+ <tr id="FN-A3">
+ <td>
+ FN-A3
+ </td>
+ <td>
+ 音频不会在主屏幕上或其他应用运行时播放,除非这是应用的核心功能。
+ </td>
+ <td>
+ <a href="#core">CR-1,<br />
+ CR-2</a>
+ </td>
+ </tr>
+
+ <tr id="FN-A4">
+ <td>
+ FN-A4
+ </td>
+ <td>
+ 音频会在应用返回前台时恢复,或者提示用户播放已处于暂停状态。
+ </td>
+ <td>
+ <a href="#core">CR-1, CR-8</a>
+ </td>
+ </tr>
+
+ <tr id="FN-U1">
+ <td rowspan="3">
+ 界面和图形
+ </td>
+ <td>
+ FN-U1
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 应用既支持横向模式也支持纵向模式(如果可能)。
+ </p>
+
+ <p style="margin-bottom:.25em">
+ 不同的显示方向下,所展现的功能特性和操作应大致相同。对内容或视图做出细微更改是可接受的。
+ </p>
+ </td>
+ <td>
+ <a href="#core">CR-5</a>
+ </td>
+ </tr>
+
+ <tr id="FN-U2">
+ <td>
+ FN-U2
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 在两种显示方向下,应用都占用整个屏幕,不会因为显示方向更改而出现黑边。
+ </p>
+
+ <p style="margin-bottom:.25em">
+ 为补偿屏幕图形的细微差异而使用少许黑边是可接受的。
+ </p>
+ </td>
+ <td>
+ <a href="#core">CR-5</a>
+ </td>
+ </tr>
+
+ <tr id="FN-U3">
+ <td>
+ FN-U3
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 应用能正确处理显示方向之间的快速转换,而不会出现渲染问题。
+ </p>
+ </td>
+ <td>
+ <a href="#core">CR-5</a>
+ </td>
+ </tr>
+
+ <tr id="FN-S1">
+ <td rowspan="2">
+ 用户/应用状态
+ </td>
+ <td>
+ FN-S1
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 应用转入后台时,不应再有任何服务处于运行状态,除非该服务与应用核心功能相关。
+ </p>
+
+ <p style="margin-bottom:.25em">
+ 例如,应用不得为了以下目的而让服务保持运行状态:为了接收通知而连接网络、保持蓝牙连接状态或为了让 GPS 保持开启状态。
+ </p>
+ </td>
+ <td>
+ <a href="#core">CR-6</a>
+ </td>
+ </tr>
+
+ <tr id="FN-S2">
+ <td>
+ FN-S2
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 应用能够正确保留和恢复用户或应用状态。
+ </p>
+
+ <p style="margin-bottom:.25em">
+ 应用在离开前台时能够保留用户或应用状态,并防止因返回导航或其他状态更改导致的意外数据丢失。返回前台时,应用必须恢复保留的状态和其他任何重要的待处理事务,例如对可修改字段的更改、游戏进程、菜单、视频以及应用或游戏的其他部分。
+ </p>
+
+ <ol style="margin-bottom:.25em;list-style-type:lower-alpha">
+ <li>当应用从“最近使用的应用”切换器恢复时,它能够让用户返回到上次使用的准确状态。
+ </li>
+
+ <li>当在设备从休眠(锁定)中被唤醒后,应用能够恢复并让用户准确返回到上次使用的状态。
+ </li>
+
+ <li>当应用从主屏幕或“所有应用”重新启动时,应用会尽可能恢复为与之前状态最接近的状态。
+ </li>
+
+ <li>在“返回”按键上,应用允许用户保存会因返回导航而丢失的任何应用或用户状态。
+ </li>
+ </ol>
+ </td>
+ <td>
+ <a href="#core">CR-1, CR-3, CR-5</a>
+ </td>
+ </tr>
+ </table>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/corequalityguidelines/functionality" data-sortorder="-timestamp" data-cardsizes="6x3" data-maxresults="6">
+ </div>
+
+ <div class="headerLine">
+ <h2 id="ps">
+ 性能和稳定性
+ </h2>
+
+
+ </div>
+
+ <p>
+ 遵循这些标准能够确保应用提供用户期望的性能、稳定性和响应速度。
+ </p>
+
+ <table>
+ <tr>
+ <th style="width:2px">
+ 领域
+ </th>
+ <th style="width:54px">
+ ID
+ </th>
+ <th>
+ 说明
+ </th>
+ <th style="width:54px">
+ 测试
+ </th>
+ </tr>
+
+ <tr id="PS-S1">
+ <td>
+ 稳定性
+ </td>
+ <td>
+ PS-S1
+ </td>
+ <td>
+ 应用不会在适配设备上崩溃、强制关闭、冻结或不正常运行。
+ </td>
+ <td>
+ <a href="#core">CR 全部</a>、<a href="#SD-1">SD-1</a>、<a href="#HA-1">HA-1</a>
+ </td>
+ </tr>
+
+ <tr id="PS-P1">
+ <td rowspan="2">
+ 性能
+ </td>
+ <td>
+ PS-P1
+ </td>
+ <td>
+ 应用加载迅速,如果加载时间超过 2 秒则在屏幕上向用户提供反馈(进度指示器或类似提示)。
+ </td>
+ <td>
+ <a href="#core">CR 全部</a>、<a href="#SD-1">SD-1</a>
+ </td>
+ </tr>
+
+ <tr id="PS-P2">
+ <td>
+ PS-P2
+ </td>
+ <td>
+ 启用 StrictMode 之后(请参阅下文的 <a href="#strictmode">StrictMode 测试</a>),在应用运行期间(包括玩游戏、动画和界面转换期间以及应用的其他部分)指示灯不会呈红色闪烁(StrictMode 的性能警告)。
+ </td>
+ <td>
+ <a href="#PM-1">PM-1</a>
+ </td>
+ </tr>
+
+ <tr id="PS-M1">
+ <td>
+ 媒体
+ </td>
+ <td>
+ PS-M1
+ </td>
+ <td>
+ 音乐和视频播放流畅,应用正常使用和加载期间没有中断、卡壳或其他异常声音。
+ </td>
+ <td>
+ <a href="#core">CR 全部</a>、<a href="#SD-1">SD-1</a>、<a href="#HA-1">HA-1</a>
+ </td>
+ </tr>
+
+ <tr id="PS-V1">
+ <td rowspan="2">
+ 视觉质量
+ </td>
+ <td>
+ PS-V1
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 应用显示的图形、文本、图片和其他界面元素没有明显的失真、模糊或像素化。
+ </p>
+
+ <ol style="margin-bottom:.5em;list-style-type:lower-alpha">
+ <li>应用为所有适配的屏幕尺寸和外形规格提供高品质的图形,包括<a href="{@docRoot}distribute/essentials/quality/tablet.html">平板电脑等大屏幕设备</a>。
+ </li>
+
+ <li>菜单边缘、按钮和其他界面元素没有明显的走样。
+ </li>
+ </ol>
+ </td>
+ <td rowspan="2">
+ <a href="#core">CR-all</a>
+ </td>
+ </tr>
+
+ <tr id="PS-V2">
+ <td>
+ PS-V2
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 应用以可接受的方式显示文本和文本块。
+ </p>
+
+ <ol style="margin-bottom:.5em;list-style-type:lower-alpha">
+ <li>所用构图在所有支持的外形规格上都适用,包括平板电脑等大屏幕设备。
+ </li>
+
+ <li>没有明显的字母或词语丢失。
+ </li>
+
+ <li>按钮或图标中没有明显的不当文本换行。
+ </li>
+
+ <li>文本与周围元素之间有充分的空间。
+ </li>
+ </ol>
+ </td>
+ </tr>
+ </table>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/core/performance" data-sortorder="-timestamp" data-cardsizes="6x3" data-maxresults="6">
+ </div>
+
+ <div class="headerLine">
+ <h2 id="listing">Google Play</h2>
+
+
+ </div>
+
+ <p>
+ 遵循这些标准能够确保你的应用做好在 Google Play 上发布的准备。
+ </p>
+
+ <table>
+ <tr>
+ <th style="width:2px">
+ 领域
+ </th>
+ <th style="width:54px">
+ ID
+ </th>
+ <th>
+ 说明
+ </th>
+ <th style="width:54px">
+ 测试
+ </th>
+ </tr>
+
+ <tr id="GP-P1">
+ <td rowspan="2">
+ 政策
+ </td>
+ <td>
+ GP-P1
+ </td>
+ <td>
+ 应用严格遵守 <a href="http://play.google.com/about/developer-content-policy.html">Google Play 开发者内容政策</a>的条款,不提供不当内容,不使用其他方的知识产权或品牌等。
+ </td>
+ <td>
+ <a href="#gp">GP 全部</a>
+ </td>
+ </tr>
+
+ <tr id="GP-P2">
+ <td>
+ GP-P2
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 根据<a href="http://support.google.com/googleplay/android-developer/bin/answer.py?hl=zh-CN&answer=188189">内容分级指南</a>合理设置应用的心智成熟度。
+ </p>
+
+ <p style="margin-bottom:.25em">
+ 尤其要注意的是,对于需要请求相应权限以使用设备位置的应用,其心智成熟度不能设置为“所有人”。
+ </p>
+ </td>
+ <td>
+ <a href="#gp">GP-1</a>
+ </td>
+ </tr>
+
+ <tr id="GP-D1">
+ <td rowspan="3">
+ 应用详细信息页
+ </td>
+ <td>
+ GP-D1
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 应用置顶大图遵循此<a href="http://android-developers.blogspot.com/2011/10/android-market-featured-image.html">博文</a>中介绍的指南。请确保:
+ </p>
+
+ <ol style="margin-bottom:.5em;list-style-type:lower-alpha">
+ <li>应用商品详情包括高品质的置顶大图。
+ </li>
+
+ <li>置顶大图不包含设备图片、屏幕截图,也不包含缩小后以及在应用适配的最小尺寸屏幕上显示时难以辨认的小文字。
+ </li>
+
+ <li>置顶大图不能看起来像广告。
+ </li>
+ </ol>
+ </td>
+ <td>
+ <a href="#gp">GP-1、GP-2</a>
+ </td>
+ </tr>
+
+ <tr id="GP-D2">
+ <td>
+ GP-D2
+ </td>
+ <td>
+ 应用屏幕截图和视频不显示或引用非 Android 设备。
+ </td>
+ <td rowspan="2">
+ <a href="#gp">GP-1</a>
+ </td>
+ </tr>
+
+ <tr id="GP-D3">
+ <td>
+ GP-D3
+ </td>
+ <td>
+ 应用屏幕截图或视频不以误导性方式展示应用的内容和体验。
+ </td>
+ </tr>
+
+ <tr id="GP-X1">
+ <td>
+ 用户支持
+ </td>
+ <td>
+ GP-X1
+ </td>
+ <td>
+ 对于 Google Play 页面的“评论”标签中常见的用户报告的错误,如果错误可重现而且在多种不同的设备上发生,则应予以解决。
+ 如果错误只在少数设备上出现,但是这些设备十分受欢迎或者是新设备,则你仍要予以解决。
+ </td>
+ <td>
+ <a href="#gp">GP-1</a>
+ </td>
+ </tr>
+ </table>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/core/play/zhcn" data-sortorder="-timestamp" data-cardsizes="6x3,6x3,6x3,6x3,6x3,6x3" data-maxresults="6">
+ </div>
+
+ <div class="headerLine">
+ <h2 id="test-environment">
+ 设置测试环境
+ </h2>
+
+
+ </div>
+
+ <p>
+ 要掌控应用的质量,请设置合适的硬件或模拟器环境以进行测试。
+ </p>
+
+ <p>
+ 理想的测试环境应包括少量实际硬件设备,并且这些设备能够代表目前消费者可用的主要外形规格和硬件/软件组合。你不需要测试市场上的每种设备,只需关注少量代表性的设备,甚至是仅针对每种外形规格选用一两个设备即可。<em></em>
+ </p>
+
+ <p>
+ 如果你不能获得实际硬件设备来进行测试,则应该<a href="{@docRoot}tools/devices/index.html">设置模拟设备 (AVD)</a> 以代表最常见的外形规格和硬件/软件组合。
+ </p>
+
+ <p>
+ 如果你不局限于基本测试,则可以向测试环境中添加更多设备、更多外形规格,或新的硬件/软件组合。你也可以增加测试次数、提高复杂性和质量标准。
+ </p>
+
+ <div class="headerLine">
+ <h2 id="tests">
+ 测试流程
+ </h2>
+
+
+ </div>
+
+ <p>
+ 这里的这些测试流程有助于你发现应用中的各类质量问题。你可以在你的测试计划中组合各项测试或综合运用各组测试。请参阅上文介绍的内容,了解与特定测试相关联的具体标准。
+ </p>
+
+ <table>
+ <tr>
+ <th style="width:2px">
+ 类型
+
+
+ </th>
+ <th style="width:54px">
+ 测试
+ </th>
+ <th>
+ 说明
+ </th>
+ </tr>
+
+ <tr>
+ <td rowspan="12" id="core">
+ 核心套件
+ </td>
+ <td>
+ CR-0
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 浏览应用的各个部分:所有屏幕、对话框、设置和所有用户流程。
+ </p>
+
+ <ol style="margin-bottom:.5em;list-style-type:lower-alpha">
+ <li>如果应用运行修改或创建内容、播放游戏或媒体,请务必进入这些流程以创建或修改内容。
+ </li>
+
+ <li>在使用应用期间,让网络连接、电池功能、GPS 或位置可用性以及系统加载等发生短暂变化。
+ </li>
+ </ol>
+ </td>
+ </tr>
+
+ <tr id="tg2">
+ <td id="core2">
+ CR-1
+ </td>
+ <td>
+ 在每个应用屏幕上,按下设备的“主屏幕”键,然后从“所有应用”屏幕重新启动应用。
+ </td>
+ </tr>
+
+ <tr id="CR-2">
+ <td>
+ CR-2
+ </td>
+ <td>
+ 从每个应用屏幕,使用“最近使用的应用”切换器切换到其他正在运行的应用,然后返回正在测试的应用。
+ </td>
+ </tr>
+
+ <tr id="CR-3">
+ <td>
+ CR-3
+ </td>
+ <td>
+ 从每个应用屏幕(和对话框),按下“返回”按钮。
+ </td>
+ </tr>
+
+ <tr id="CR-5">
+ <td>
+ CR-5
+ </td>
+ <td>
+ 从每个应用屏幕,旋转设备,在横屏和竖屏之间切换至少三次。
+ </td>
+ </tr>
+
+ <tr id="CR-6">
+ <td>
+ CR-6
+ </td>
+ <td>
+ 切换到其他应用,以将测试应用转至后台。转到“设置”,检查测试应用在后台时是否有服务在运行。在 Android 4.0 及更高版本中,转到“应用”屏幕并找到“正在运行”标签中的应用。在早期版本中,使用“管理应用”查看运行中的服务。
+ </td>
+ </tr>
+
+ <tr id="CR-7">
+ <td>
+ CR-7
+ </td>
+ <td>
+ 按下电源按钮,让设备进入休眠状态,然后再次按下电源按钮唤醒屏幕。
+ </td>
+ </tr>
+
+ <tr id="CR-8">
+ <td>
+ CR-8
+ </td>
+ <td>
+ 将设备设置为按下电源按钮后锁定。按下电源按钮让设备进入休眠状态,然后再次按下电源按钮唤醒屏幕,然后解锁设备。
+ </td>
+ </tr>
+
+ <tr id="CR-9">
+ <td><!-- Hardware features -->
+ CR-9
+ </td>
+ <td>
+ 对于带有滑动键盘的设备,将键盘滑进并滑出至少一次。对于带有键盘底座的设备,将设备连接到键盘底座。
+ </td>
+ </td></tr>
+
+ <tr id="CR-10">
+ <td>
+ CR-10
+ </td>
+ <td>
+ 对于具有外部显示端口的设备,请插入外部显示器。
+ </td>
+ </tr>
+
+ <tr id="CR-11">
+ <td>
+ CR-11
+ </td>
+ <td>
+ 在通知抽屉中触发并查看应用能够显示的所有通知类型。如果适用(Android 4.1 及更高版本)展开通知并触碰提供的所有操作。
+ </td>
+ </tr>
+
+ <tr id="CR-12">
+ <td>
+ CR-12
+ </td>
+ <td>
+ 转到“设置”>“应用信息”检查应用请求的权限</td>
+ </tr>
+
+ <tr id="tg3">
+ <td>
+ 在 SD 卡上安装
+ </td>
+ <td>
+ SD-1
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 对安装到<a href="{@docRoot}guide/topics/data/install-location.html">设备 SD 卡</a>的应用(如果应用支持的话)重复核心套件测试。<em></em>
+ </p>
+
+ <p style="margin-bottom:.25em">
+ 要将应用移动到 SD 卡,你可以使用“设置”>“应用信息”>“移动到 SD 卡”。
+ </p>
+ </td>
+ </tr>
+
+ <tr id="tg32">
+ <td>
+ 硬件加速
+ </td>
+ <td>
+ HA-1
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 启用硬件加速并重复核心套件测试。<em></em>
+ </p>
+
+ <p style="margin-bottom:.25em">
+ 要强制启动硬件加速(在设备支持的位置),请将 <code>hardware-accelerated="true"</code> 添加到AndroidManifest.xml中的 <code><application></code> 并重新编译。
+ </p>
+ </td>
+ </tr>
+
+ <tr id="tg33">
+ <td>
+ 性能监控
+ </td>
+ <td>
+ PM-1
+ </td>
+ <td>
+ <p style="margin-bottom:.5em">
+ 在启用 StrictMode 分析(<a href="#strictmode">如下所述</a>)的情况下重复核心套件测试。<em></em>
+ </p>
+
+ <p style="margin-bottom:.25em">
+ 密切关注垃圾回收及其对用户体验的影响。
+ </p>
+ </td>
+ </tr>
+
+ <tr id="gp">
+ <td rowspan="3">Google Play</td>
+ <td>
+ GP-1
+ </td>
+ <td>
+ 登录到<a href="https://play.google.com/apps/publish/">开发者控制台</a>查看你的开发者个人资料、应用说明、屏幕截图、置顶大图、心智成熟度设置以及用户反馈。
+ </td>
+ </tr>
+
+ <tr id="GP-2">
+ <td>
+ GP-2
+ </td>
+ <td>
+ 下载置顶大图和屏幕截图,将其缩小以匹配设备上的显示屏尺寸以及你定位的外形规格。
+ </td>
+ </tr>
+
+ <tr id="GP-3">
+ <td>
+ GP-3
+ </td>
+ <td>
+ 查看所有图形资源、媒体、文本、代码库,以及应用内其他打包的内容或下载的扩展文件。
+ </td>
+ </tr>
+
+ <tr id="GP-4">
+ <td>
+ 付款
+ </td>
+ <td>
+ GP-4
+ </td>
+ <td>
+ 浏览应用的所有屏幕,并进入所有应用内购买流程。
+ </td>
+ </tr>
+ </table>
+
+ <h3 id="strictmode">
+ 使用 StrictMode 进行测试
+ </h3>
+
+ <p>
+ 对于性能测试,我们建议在应用内启用 <code><a href="{@docRoot}reference/android/os/StrictMode.html">StrictMode</a></code>,通过它捕获主线程上和其他线程上可能影响性能、网络访问、文件读/写等的操作。
+ </p>
+
+ <p>
+ 你可以使用 <code><a href="{@docRoot}reference/android/os/StrictMode.ThreadPolicy.Builder.html">StrictMode.ThreadPolicy.Builder</a></code> 设置每个线程的监控政策,并使用 <code><a href="{@docRoot}reference/android/os/StrictMode.ThreadPolicy.Builder.html#detectAll()">detectAll()</a></code> 在 <code>ThreadPolicy</code> 中启用所有受支持的监控。
+ </p>
+
+ <p>
+ 请务必使用 <code><a href="{@docRoot}reference/android/os/StrictMode.ThreadPolicy.Builder.html#penaltyFlashScreen()">penaltyFlashScreen()</a></code> 针对 <code>ThreadPolicy</code> 为违反策略的行为启用<strong>可视通知</strong>。
+ </p>
diff --git a/docs/html-intl/intl/zh-cn/distribute/essentials/quality/tablets.jd b/docs/html-intl/intl/zh-cn/distribute/essentials/quality/tablets.jd
new file mode 100644
index 0000000..4b6eb50
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/distribute/essentials/quality/tablets.jd
@@ -0,0 +1,582 @@
+page.title=平板电脑应用的质量
+page.metaDescription=平板电脑是一个快速增长的Android的安装基础,提供了新的机会,为你的应用程序提供了新的机会。
+page.image=/distribute/images/tablet-guidelines-color.jpg
+Xnonavpage=true
+page.type="배포"
+
+@jd:body
+
+ <div id="qv-wrapper"><div id="qv">
+ <h2>检查清单</h2>
+ <ol>
+ <li><a href="#core-app-quality">1. 测试平板电脑应用的基本质量</a></li>
+ <li><a href="#optimize-layouts">2. 优化布局</a></li>
+ <li><a href="#use-extra-space">3. 利用多出来的屏幕区域</a></li>
+ <li><a href="#use-tablet-icons">4. 使用专为平板电脑设计的图形资源</a></li>
+ <li><a href="#adjust-font-sizes">5. 调整字体和触控目标</a></li>
+ <li><a href="#adjust-widgets">6. 调整主屏幕小部件</a></li>
+ <li><a href="#offer-full-feature-set">7. 提供全套功能</a></li>
+ <li><a href="#android-versions">8. 确定合适的 Android 版本</a></li>
+ <li><a href="#hardware-requirements">9. 准确声明硬件功能依赖关系</a></li>
+ <li><a href="#support-screens">10. 声明对平板电脑屏幕的支持</a></li>
+ <li><a href="#google-play">11. 展示你的平板电脑界面</a></li>
+ <li><a href="#google-play-best-practices">12. 遵循在 Google Play 中发布应用的最佳做法</a></li>
+
+ </ol>
+ <h2>测试</h2>
+ <ol>
+ <li><a href="#test-environment">设置测试环境</a></li>
+ </ol>
+ </div></div>
+
+ <div class="todp-right-float" style="padding-right:0;margin-bottom:1em">
+ <img src="{@docRoot}distribute/images/tablet-guidelines-color.jpg" style="width:480px" />
+ </div>
+
+ <p>
+ 现在越来越多的平板电脑选择安装 Android 系统,这就为开发者提供了<a href="{@docRoot}distribute/stories/tablets.html">与用户互动和获利</a>的新机会。本文档中介绍的相关指南旨在帮助你通过引人入胜的功能、精心设计的直观界面满足平板电脑用户的预期。
+ </p>
+
+ <p>
+ 虽然这些指南按照编号排列,但你从哪一项开始着手都没问题。对于每条指南,你都应根据你的应用酌情考虑是否采用其中的建议。不过,为了给客户提供最好的产品,建议你尽可能遵循这些指南。
+ </p>
+
+ <p>
+ 本文档中提供了相关资源的链接,这些资源可帮助你了解文中给出的各条建议。
+ </p>
+
+ <div class="headerLine"><h2 id="core-app-quality">1. 测试平板电脑应用的基本质量</h2></div>
+
+ <p>为了打造上佳的平板电脑应用体验,首先要根据应用适配的设备类型和尺寸,确保你的应用满足相应的“应用核心质量标准”<em></em>。有关完整信息,请参阅<a href="{@docRoot}distribute/essentials/quality/core.html">应用核心质量指南</a>。
+ </p>
+
+ <p>
+ 在发布应用前,还应确保你的应用通过了基本的技术检查并符合相关发布标准,例如:
+ </p>
+
+ <ul>
+ <li><a href="#android-versions">面向相应的Android版本</a></li>
+ <li><a href="#hardware-requirements">正确描述所依托的硬件功能</a></li>
+ <li><a href="#support-screens">声明对相应屏幕的支持</a></li>
+ <li><a href="#use-extra-space">利用可用的屏幕空间</a></li>
+ <li><a href="#google-play">上传屏幕截图到Google Play</a></li>
+ </ul>
+
+ <p>如果你的应用已上传至 Google Play 开发者控制台,你可以浏览<a href="#google-play-optimization-tips">“优化提示”页</a>,了解以上各项检查的结果。</p>
+
+
+ <div class="headerLine">
+ <h2 id="optimize-layouts">2. 针对大屏幕优化布局</h2></div>
+
+ <p>
+ 借助于 Android,开发在屏幕尺寸各异、外形规格不同的各类设备上都能良好运行的应用不再是难事。这种广泛的兼容性对你极其有利,因为你只需设计一个可广泛分发到所有适配设备的应用即可。不过,要让用户在各种屏幕配置下(特别是在平板电脑上)都能获得最佳体验,你需要针对各种适用的屏幕配置,优化应用的布局及其他界面组件。在平板电脑上,优化界面可让你充分利用多出来的可用屏幕空间,例如用来提供新功能、展示新内容或以其他方式提升用户体验,以加深与用户的互动。
+ </p>
+
+ <p>
+ 如果你的应用是针对手机开发的,而现在你准备将其分发到平板电脑,则可以先对布局、字体和间距稍作调整。在某些情况下,例如对于 7 英寸平板电脑或画面较大的游戏,你可能只需做这些调整就能让应用实现出色的视觉效果。而在另外一些情况下,例如对于大屏幕的平板电脑,你就需要重新设计界面的各个组成部分,将拉伸变形的的界面替换为高效的多窗格界面、更便捷的导航控件以及其他内容。
+ </p>
+
+
+ <div style="width:500px;margin:1.5em">
+ <img src="{@docRoot}images/training/app-navigation-multiple-sizes-multipane-bad.png" style="padding:4px;margin-bottom:0em" />
+ <p class="img-caption"><span style="font-weight:500">舍弃拉伸变形的界面</span>:在平板电脑上,单窗格布局会导致空白过多以及内容行过长。请利用内边距减少界面元素的宽度并考虑采用多窗格布局。</p>
+ </div>
+
+ <p>下面是一些建议:</p>
+
+
+ <ul>
+ <li>根据需要,针对 <code>large</code> 和 <code>xlarge</code> 屏幕提供自定义布局。你还可以提供会根据屏幕的<a href="{@docRoot}guide/practices/screens_support.html#NewQualifiers">最短尺寸</a>或<a href="{@docRoot}guide/practices/screens_support.html#NewQualifiers">最小可用宽度和高度</a>加载的布局。
+ </li>
+
+ <li>至少要针对大屏幕自定义字体大小、外边距和间距等规格,以提高空间利用率和内容易读性。
+ </li>
+
+ <li>调整界面控件的位置,以便用户在手持平板电脑时能轻易触碰到这些控件,例如在横屏时将控件放于两侧。
+ </li>
+
+ <li>通常情况下,平板电脑上界面元素的内边距应比手机上的大一些。建议遵守 <a href="{@docRoot}design/style/metrics-grids.html#48dp-rhythm">48dp 定律</a>(以及 16dp 格栅)。
+ </li>
+
+ <li>为文本内容设置合理的内边距,使其不会直接沿屏幕边缘对齐。内容与屏幕边缘间至少保留 <code>16dp</code> 的内边距。
+ </li>
+ </ul>
+
+ <p>尤其需要注意的是,不要让你的布局在屏幕上出现拉伸变形的情况:</p>
+
+ <ul>
+ <li>文本行的长度不应过长:经过优化后,每行最多 100 个字符,最好在 50 至 75 个字符之间。</li>
+ <li><code>ListView</code>和菜单不应使用全屏宽度。</li>
+ <li>使用内边距管理屏幕上元素的宽度,或切换为适用于平板电脑的多窗格界面(参见下一节)。</li>
+ </ul>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/optimize" data-sortorder="-timestamp" data-cardsizes="6x3" data-maxresults="6"></div>
+
+
+ <div class="headerLine"><h2 id="use-extra-space">3. 充分利用多出来的屏幕区域</h2></div>
+
+ <div style="width:340px;float:right;margin:1.5em;margin-bottom:0;margin-top:0">
+ <img src="{@docRoot}images/training/app-navigation-multiple-sizes-multipane-good.png" style="padding:4px;margin-bottom:0em" />
+ <p class="img-caption"><span style="font-weight:500">多窗格布局</span>能在平板电脑屏幕上实现更好的视觉平衡效果,同时令实用性和可读性得到增强。</p>
+ </div>
+
+ <p>平板电脑屏幕可为你的应用提供更多的屏幕空间(横向模式下更是如此)。尤其是 10 英寸的平板电脑多出来的区域更大,但即使是 7 英寸的平板电脑,也提供了更多空间供你展示内容、吸引用户。</p>
+
+ <p>为在平板电脑上运行的应用设计界面时,请确保能够充分利用平板电脑上多出来的屏幕区域。下面是一些建议:</p>
+
+ <ul>
+ <li>看看是否有可能加入更多内容,或换种方式呈现现有内容。</li>
+ <li>在平板电脑屏幕上使用<a href="{@docRoot}design/patterns/multi-pane-layouts.html">多窗格布局</a>,将单一视图合并成复合视图。这样一来,你可以更有效地利用多出来的屏幕区域,让用户能更轻松地浏览你的应用。</li>
+ <li>确定在屏幕方向改变时如何重新排列复合视图的各个版块。</li>
+
+ <div style="width:490px;margin:1.5em auto 1.5em 0">
+ <div>
+ <img src="{@docRoot}images/ui-ex-single-panes.png" align="middle" style="width:490px;padding:4px;margin-bottom:0em" />
+ <img src="{@docRoot}images/ui-ex-multi-pane.png" style="width:490px;padding:4px;margin-bottom:0em" />
+ <p class="image-caption" style="padding:.5em"><span style="font-weight:500">复合视图</span>将手机界面的多个单一视图(如上图)合并成适用于平板电脑的更高效、内容更丰富的界面(如下图)。<em></em><em></em></p>
+ </div>
+ </div>
+
+ <li>如果单屏是用 <code><a href="{@docRoot}reference/android/app/Activity.html">Activity</a></code> 子类实现的,请考虑用 <code><a href="{@docRoot}reference/android/app/Fragment.html">Fragment</a></code> 子类实现各个内容版块。这样一来,你可以在不同外形规格的设备上以及内容相同的屏幕间最大程度地重复使用代码。</li>
+ <li>确定要在哪些屏幕尺寸上使用多窗格界面,然后在相应的屏幕尺寸单元(例如 <code>large</code>/<code>xlarge</code>)中提供合适的布局,或最小屏幕宽度(例如 <code>sw600dp</code>/<code>sw720</code>)。</li>
+ </ul>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/extrascreen" data-sortorder="-timestamp" data-cardsizes="6x3,6x3,6x3" data-maxresults="6"></div>
+
+ <div class="headerLine"><h2 id="use-tablet-icons">4. 使用专为平板电脑屏幕设计的图形资源</h2></div>
+
+ <div><img src="{@docRoot}design/media/devices_displays_density@2x.png" /></div>
+
+ <p>为确保应用呈现最佳的视觉效果,请根据平板电脑普遍支持的屏幕密度,提供相应图标和位图。具体而言,你应按<a href="{@docRoot}design/style/iconography.html">图标</a>指南为操作栏、通知和启动器设计图标,并提供多种密度的图标,这样这些图标在所有屏幕上都会以合适的尺寸显示,而不会出现模糊或缩放等情况。</p>
+
+ <p class="table-caption"><strong>表 1</strong>:不同图标类型的原始资源尺寸。<table>
+ <tr>
+ <th>密度</th>
+ <th>启动器</th>
+ <th>操作栏</th>
+ <th>小图标/上下文图标</th>
+ <th>通知</th>
+ </tr>
+ <tr>
+ <td><code>mdpi</code></td>
+ <td>48x48 像素</td>
+ <td>32x32 像素</td>
+ <td>16x16 像素</td>
+ <td>24x24 像素</td>
+ </tr>
+ <tr>
+ <td><code>hdpi</code></td>
+ <td>72x72 像素</td>
+ <td>48x48 像素</td>
+ <td>24x24 像素</td>
+ <td>36x36 像素</td>
+ </tr>
+ <tr>
+ <td><code>tvdpi</code></td>
+ <td><em>(使用 hdpi)</em></td>
+ <td><em>(使用 hdpi)</em></td>
+ <td><em>(使用 hdpi)</em></td>
+ <td><em>(使用 hdpi)</em></td>
+ </tr>
+ <tr>
+ <td><code>xhdpi</code></td>
+ <td>96x96 像素</td>
+ <td>64x64 像素</td>
+ <td>32x32 像素</td>
+ <td>48x48 像素</td>
+ </tr>
+ <tr>
+ <td><code>xxhdpi</code></td>
+ <td>144x144 像素</td>
+ <td>96x96 像素</td>
+ <td>48x48 像素</td>
+ <td>72x72 像素</td>
+ </tr>
+
+ </table>
+
+ <p>
+ 作为最低要求,要为以下常用的平板电脑屏幕密度中的<strong>至少一种</strong>密度,提供适用版本的图标和位图资源:
+ </p>
+ <ul>
+ <li><code>hdpi</code></li>
+ <li><code>xhdpi</code></li>
+ <li><code>xxhdpi</code></li>
+ </ul>
+
+ <p>其他提示:</p>
+
+ <ul>
+ <li>在设计图标时请使用矢量图形,这样图标在缩放时就不会损失细节或出现边缘模糊的情况。</li>
+ <li>使用针对特定密度的<a href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">资源限定符</a>,以便能为各种屏幕密度加载对应尺寸的图标。</li>
+ <li>平板电脑及其他大屏设备通常需要使用启动器图标,其密度比设备实际密度要大。因此,你提供的启用器图标应尽可能采用最高密度。例如,如果平板电脑的屏幕密度是 <code>xhdpi</code>,那么需要使用 <code>xxhdpi</code> 版本的启动器图标。</li>
+ </ul>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/assets" data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6"></div>
+
+ <div class="headerLine"><h2 id="adjust-font-sizes">5. 调整字体大小和触控目标</h2></div>
+
+ <p>要确保用户在平板电脑上能够轻松使用你的应用,请花些时间针对你要适配的各种屏幕配置调整平板电脑界面中的字体大小和触控目标。你可以通过<a href="{@docRoot}guide/topics/ui/themes.html">可设置样式的属性</a>或<a href="{@docRoot}guide/topics/resources/more-resources.html#Dimension">尺寸资源</a>调整字体大小,也可以通过布局和位图绘制工具调整触控目标,如上所述。</p>
+
+ <p>下面是一些注意事项:</p>
+ <ul>
+ <li>对于各种平板电脑屏幕尺寸和密度,显示的文字不应过大或过小。请确保标签的尺寸与其对应的界面元素大小相宜,并且不得在标签、标题及其他元素中使用不恰当的换行符。</li>
+ <li>建议将屏幕元素触控目标的尺寸设为 48dp(最小 32dp),但可能需要对平板电脑的界面做一些调整。请参阅<a href="{@docRoot}design/style/metrics-grids.html">度量单位和网格</a>,了解适用于大多数用户的实施策略。为了满足部分用户对辅助功能的需求,可能需要使用较大的触控目标尺寸。</li>
+ <li>如果可能,对于较小的图标,请使用 <code><a href="{@docRoot}reference/android/view/TouchDelegate.html">TouchDelegate</a></code> 将可触控区域扩展到 48dp 以上,或者将该图标放到透明按钮的中心位置。</li>
+ </ul>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/fonts" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,6x3,6x3" data-maxresults="6"></div>
+
+ <div class="headerLine"><h2 id="adjust-widgets">6. 调整主屏幕小部件的尺寸</h2></div>
+
+ <p>如果你的应用中包含主屏幕小部件,需要注意以下几点,以确保用户在平板电脑屏幕上获得良好体验:</p>
+
+ <ul>
+ <li>按照平板电脑的屏幕合理设置小部件的默认高度和宽度,以及最小和最大的伸缩高度和宽度。
+ </li>
+ <li>小部件应可拉伸到 420dp 或更高,占用主屏幕的 5 行或以上(如果是垂直或方形小部件),或者占用 5 列或以上(如果是水平或方形小部件)。</li>
+ <li>确保正确渲染 9-patch 图片。</li>
+ <li>使用默认的系统边距。</li>
+ <li>如果可能,将应用的 <code>targetSdkVersion</code> 设置为 14 或更高。</li>
+ </ul>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/widgets" data-sortorder="-timestamp" data-cardsizes="6x3" data-maxresults="6"></div>
+
+
+ <div class="headerLine"><h2 id="offer-full-feature-set">7. 提供适用于平板电脑用户的全套功能</h2></div>
+
+ <div class="centered-full-image" style="width:600px;margin:1.5em"><img src="{@docRoot}images/gp-tablets-full-feature-set.png" alt="平板电脑功能集" /></div>
+
+ <p>让你的平板电脑用户能够体验应用的最佳功能。下面是一些建议:</p>
+
+ <ul>
+ <li>在设计应用时,应至少确保其在平板电脑上的功能与在手机上的一样。
+ </li>
+
+ <li>在特殊情况下,例如硬件不支持或用户使用场景受到限制,则可以去掉或替换应用的某些功能。例如:
+ <ul>
+ <li>如果手机使用电话功能,但当前的平板电脑无法使用此功能,那么你可以去掉或替换相关功能。
+ </li>
+
+ <li>许多平板电脑都装有 GPS 传感器,但大多数用户在跑步时通常不会带着平板电脑。如果手机应用中提供的某项功能可让用户在跑步时通过手机记录 GPS 路线,就无需在平板电脑上也提供这项功能,因为这么做并没有什么吸引力。
+ </li>
+ </ul>
+ </li>
+
+ <li>如果你要从平板电脑界面上去掉某功能,请确保用户无法通过其他方式使用这项功能;或确保该功能可以“优雅降级”,以便为用户提供替代功能(另请参见下面关于硬件功能的部分)。
+ </li>
+ </ul>
+
+ <div class="headerLine"><h2 id="android-versions">8. 确定合适的 Android 版本</h2></div>
+
+ <p>
+ 为确保你的应用适配尽可能多的平板电脑,你必须让应用定位到支持平板电脑的 Android 版本。对平板电脑的支持是从 <a href="{@docRoot}about/versions/android-3.0.html">Android 3.0</a>(API 级别 11)开始的;对平板电脑、手机及其他设备的统一界面框架支持是从 <a href="{@docRoot}about/versions/android-4.0.html">Android 4.0</a> 开始的
+ </p>
+
+ <p>
+ 你可以在清单文件的 <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code><uses-sdk></code></a> 元素中设置应用定位的 Android 版本。在大多数情况下,你只要将该元素的 <code>targetSdkVersion</code> 属性设置为可用的最高 API 级别,即可正确定位合适的 Android 版本。
+ </p>
+
+ <p style="margin-bottom:.5em">
+ 作为最低要求,请检查 <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code><uses-sdk></code></a> 元素以确保:
+ </p>
+
+ <ol style="list-style-type:lower-alpha;margin-top:0em">
+ <li>
+ 使用 11 或更高值声明 <code>targetSdkVersion</code>(建议使用 14 或更高值);或
+ </li>
+
+ <li>
+ 使用 11 或更高值声明 <code>minSdkVersion</code>。
+ </li>
+
+ <li>如果声明 <code>maxSdkVersion</code> 属性,其值必须为 11 或更高。请注意,一般情况下不建议使用 <code>maxSdkVersion</code>。<em></em>
+ </li>
+ </ol>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/versions" data-sortorder="-timestamp" data-cardsizes="6x3" data-maxresults="6"></div>
+
+ <div class="headerLine"><h2 id="hardware-requirements">9. 准确声明硬件功能依赖关系</h2></div>
+
+ <p>
+ 通常情况下,手机和平板电脑对传感器、相机、电话及其他功能提供的硬件支持会稍有不同。例如,许多平板电脑可以在“WLAN”配置下使用却不支持电话功能。
+ </p>
+
+ <p>
+ 因此,你可以向你的所有手机和平板电脑用户分发一个 APK,但要确保你的应用不会要求调用平板电脑通常不提供的硬件功能。否则,请在应用清单中将硬件功能声明为“未要求”,如下所述。<em></em>
+ </p>
+
+ <ul>
+ <li>在应用清单中,找到所有 <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><code><uses-feature></code></a> 元素。尤其要注意的是,需要找到可能无法在某些平板电脑上使用的硬件功能,例如:
+
+ <ul>
+ <li><code>android.hardware.telephony</code></li>
+ <li><code>android.hardware.camera</code>(指后置摄像头),或</li>
+ <li><code>android.hardware.camera.front</code></li>
+ </ul></li>
+
+ <li>通过加入 <code>android:required=”false”</code> 属性将 <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html"><code><uses-feature></code></a> 元素声明为“未要求”。<em></em>
+
+ <p>
+ 例如,以下示例就准确声明了 <code>android.hardware.telephony</code> 的依赖关系。这样一来,你仍能广泛分发应用,甚至能分发到不提供电话功能的设备上:
+ </p>
+
+ <pre><uses-feature android:name="android.hardware.telephony" android:required="false" /></pre></li>
+
+ <li>与此类似,还请检查清单,找出<a href="{@docRoot}guide/topics/manifest/uses-feature-element.html#permissions">表明硬件功能要求</a>不适用于平板电脑的 <a href="{@docRoot}guide/topics/manifest/permission-element.html"><code><permission></code></a> 元素。如果你找到这样的权限,请务必为功能明确声明对应的 <code><uses-feature></code> 元素并加入 <code>android:required=”false”</code> 属性。</li>
+ </ul>
+
+
+ <p>
+ 将硬件功能声明为“未要求”后,请务必在各种设备上测试你的应用。<em></em>即使应用所需的硬件功能无法使用,应用功能也应该正常运行;如果可以,应用应该提供“优雅降级”和替代功能。
+ </p>
+
+ <p>
+ 例如,如果应用通常使用 GPS 设置地理位置,但设备不支持 GPS,那么此应用可以让用户手动设置地理位置。应用可以在运行时检查设备硬件功能并根据需要执行相应处理。
+ </p>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/hardware" data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6"></div>
+
+ <div class="headerLine"><h2 id="support-screens">10. 声明对平板电脑屏幕的支持</h2></div>
+
+ <p>为确保能将应用分发到各式平板电脑上,你应在应用的清单文件中声明对各种平板电脑屏幕尺寸的支持,如下所示:</p>
+
+ <ul>
+ <li>如果声明 <a href="{@docRoot}guide/topics/manifest/supports-screens-element.html"><code><supports-screens></code></a> 元素,就不要指定 <code>android:largeScreens="false"</code> 或 <code>android:xlargeScreens="false"</code>。</li>
+ <li>如果应用定位的 <code>minSdkVersion</code> 值小于 13,必须使用 <code>android:largeScreens="true"</code> 和 <code>android:xlargeScreens="true"</code> 声明 <a href="{@docRoot}guide/topics/manifest/supports-screens-element.html"><code><supports-screens></code></a> 元素。</li>
+ </ul>
+
+ <p>如果应用在清单中声明了 <a href="{@docRoot}guide/topics/manifest/compatible-screens-element.html"><code><compatible-screens></code></a> 元素,该元素应包含相关属性,用以列举应用适配的平板电脑屏幕的尺寸和密度组合。<em></em>请注意,如果可能,你应避免在应用中使用 <a href="{@docRoot}guide/topics/manifest/compatible-screens-element.html"><code><compatible-screens></code></a> 元素。</p>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/tabletscreens" data-sortorder="-timestamp" data-cardsizes="9x3,6x3,6x3" data-maxresults="6"></div>
+
+
+ <div class="headerLine"><h2 id="google-play">11. 在 Google Play 中展示你的平板电脑界面</h2></div>
+
+ <p>
+ 为你的平板电脑应用创建了经过优化、内容丰富的界面后,请务必告知你的客户!下面是一些重要的方法,可帮助你向 Google Play 上的用户推广你的平板电脑应用。
+ </p>
+
+ <div><img class="border-img" src="{@docRoot}images/gp-tablet-quality-4.jpg" /></div>
+
+
+ <h4>
+ 上传平板电脑界面的屏幕截图
+ </h4>
+
+ <p>
+ 平板电脑用户需要了解你的应用在平板电脑设备上(而非手机上)的效果。如果你开发了一款平板电脑应用,请务必将平板电脑界面的屏幕截图上传至 Google Play 开发者控制台。下面是一些相关指南:
+ </p>
+
+ <ul style="margin-top:0">
+ <li>展示应用的核心功能,而不要展示启动或登录页面。用户会在应用的哪个位置花费最多时间,就在屏幕截图中展示这个位置。
+ </li>
+
+ <li>添加在 7 英寸和 10 英寸平板电脑上拍摄的屏幕截图。
+ </li>
+
+ <li>如果可能,添加横屏和竖屏拍摄的屏幕截图。
+ </li>
+
+ <li>如果可能,使用屏幕截图功能。避免在屏幕截图中展示实际的设备硬件。</li>
+
+ <li>建议对横屏和竖屏拍摄的平板电脑屏幕截图都使用 <strong>1280 x 720</strong> 或更高的分辨率。
+ </li>
+
+ <li>最好为 7 英寸的平板电脑界面上传 8 张屏幕截图,同时再为 10 英寸的平板电脑界面上传 8 张屏幕截图。
+ </li>
+ </ul>
+
+ <h4>
+ 更新应用说明和版本说明
+ </h4>
+
+ <ul>
+ <li>在应用说明中,请务必着重介绍你的应用已针对平板电脑优化过界面,能为平板电脑用户提供卓越功能。添加一些详细信息,介绍平板电脑界面的工作原理及其独特优势。
+ </li>
+
+ <li>在应用的版本说明和更新信息中加入有关平板电脑支持的信息。
+ </li>
+ </ul>
+
+ <h4>
+ 更新你的推广视频
+ </h4>
+
+ <p>
+ 许多用户通过观看推广视频来了解应用,确定自己是否喜欢此应用。你可以根据用户的这一兴趣特点,在推广视频中着重介绍应用的平板电脑界面,以吸引平板电脑用户。下面是一些相关提示和指南:
+ </p>
+
+ <ul>
+ <li>添加一张或多张你的应用在平板电脑上运行时的截图。为了最有效地吸引平板电脑用户,建议你将平板电脑界面与手机界面的推广事宜尽量等同视之。
+ </li>
+
+ <li>尽早在视频中展示你的平板电脑界面。不要想当然地以为平板电脑用户会耐心看完手机界面上的功能演示。最好在前 10 秒内或者在介绍手机界面的同时就展示平板电脑界面,以立即吸引用户的注意力。
+ </li>
+
+ <li>为了让用户了解你是在展示平板电脑界面,请加入几张应用在手持平板电脑设备上运行时的截图。
+ </li>
+
+ <li>在视频的讲解或旁白中,着重介绍应用的平板电脑界面。
+ </li>
+ </ul>
+
+ <h4>
+ 在推广活动中突显你的平板电脑界面
+ </h4>
+
+ <p>
+ 确保平板电脑用户可以通过你的推广活动、网站、社交信息、广告及其他地方了解你的平板电脑界面。下面是一些建议:
+ </p>
+
+ <ul>
+ <li>安排营销或宣传活动,着重介绍你的应用在平板电脑上的使用情况。</li>
+
+ <li>在推广活动中展示你的平板电脑应用最突出的优势,使用 <a href="{@docRoot}distribute/tools/promote/device-art.html">Device Art Generator</a> 快速生成一张应用在 7 英寸或 10 英寸平板电脑上运行时的高品质推广图片,屏幕方向自定,有无下拉阴影和屏幕反光均可。这项操作非常简单,只需截图、拖放即可。
+ </li>
+
+ <li>进行在线推广时加入 Google Play 徽章,让用户可以直接转入商店查看你应用的商品详情。你可以使用<a href="{@docRoot}distribute/tools/promote/badges.html">徽章生成器</a>生成各种语言的徽章。
+ </li>
+ </ul>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/showcase/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,9x3,9x3" data-maxresults="6"></div>
+
+ <div class="headerLine">
+ <h2 id="google-play-best-practices">
+ 12. 遵循在 Google Play 中发布应用的最佳做法</h2>
+
+
+ </div>
+
+ <p>
+ 下面是一些在 Google Play 中成功发布的平板电脑应用的最佳做法。
+ </p>
+
+ <div>
+ <img class="border-img" src="{@docRoot}images/gp-tablet-quality-5.jpg" />
+ </div>
+
+ <h4 id="google-play-optimization-tips">
+ 检查应用的优化提示
+ </h4>
+
+ <p>Google Play 开发者控制台现在提供”优化提示“页,可让你快速了解你的应用是否很好地遵循了有关平板电脑应用分发和质量的基本指南。要访问此页面,请登录到开发者控制台,通过“所有应用”加载相应应用,然后点击左侧导航栏中的“优化提示”。</p>
+
+ <div class="sidebox-wrapper">
+ <div class="sidebox">
+ <h2>如何发送反馈意见</h2>
+
+ <p>请使用下面的链接发送反馈意见或申请人工审核你的“优化提示”。</p>
+
+ <p>在发送反馈意见之前,请务必先仔细阅读平板电脑应用质量指南的相关部分。</p>
+
+ <p><strong><a href="https://support.google.com/googleplay/android-developer/contact/tabletq" target="_googleplay" style="white-space:nowrap">平板电脑专用联系表单 »</a></strong></p>
+ </div>
+ </div>
+
+ <p>开发者控制台通过运行一系列检查来验证你的应用是否符合基本质量标准,然后为其创建“优化提示”页。如果发现任何问题,开发者控制台会在“优化提示”页上列出“待优化事项”来提醒你。</p>
+
+ <p>如果你为应用开发了平板电脑版本,请务必访问“优化提示”页,了解你应用的基本检查结果。如果此页中列出问题,建议你在应用中进行解决,并上传一个新的二进制文件以供分发(如果需要)。</p>
+
+ <p>如果你认为“优化提示”页列出的“待优化事项”不适用于你的应用或会影响你的应用在平板电脑上的运行质量,请使用<a href="https://support.google.com/googleplay/android-developer/contact/tabletq" target="_googleplay" style="white-space:nowrap">平板电脑专用联系表单 »</a> 通知我们。我们会审核你的应用并视情况更新你的“优化提示”页。</p>
+
+
+ <h4>确认应用的适配设备</h4>
+
+ <p>
+ 将应用上传至<a href="https://play.google.com/apps/publish/">开发者控制台</a>后,请检查 APK 的“受支持设备”列表,确保未遗漏任何应用要适配的平板电脑设备。
+ </p>
+
+ <h4>用一个 APK 进行分发</h4>
+
+ <p>
+ 建议你针对所有屏幕尺寸(手机和平板电脑)用一个 APK 发布你的应用,并使用一份 Google Play 商品详情。这种做法有以下几大优点:
+ </p>
+
+ <ul style="margin-top:.25em">
+ <li>便于用户通过搜索、浏览或推广信息找到你的应用。
+ </li>
+
+ <li>便于用户在更换新设备后自动恢复你的应用。
+ </li>
+
+ <li>你的应用在所有设备上的评分和下载统计信息会得到汇总统计。
+ </li>
+
+ <li>再用一份商品详情发布平板电脑应用可能会降低你品牌的评分。
+ </li>
+ </ul>
+
+ <p>
+ 如果需要,你也可以选择使用<a href="{@docRoot}google/play/publishing/multiple-apks.html">多 APK 支持</a>提供你的应用,不过在大多数情况下,强烈建议你使用一个 APK 覆盖所有设备。
+ </p>
+
+ <h3 class="rel-resources clearfloat">相关资源</h3>
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/googleplay" data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6"></div>
+
+
+ <div class="headerLine">
+ <h2 id="test-environment">
+ 为平板电脑创建测试环境
+ </h2>
+
+
+ </div>
+
+ <p>
+ 使用合适的硬件或模拟器环境进行测试,既评估你的平板电脑应用的核心质量,也评估应用在平板电脑上的质量。
+ </p>
+
+ <p>
+ 要测试应用对核心质量标准的遵循情况,可以使用<a href="{@docRoot}distribute/essentials/quality/core.html#test-environment">建议的测试环境</a>,要测试应用在平板电脑上的质量,还需要在建议环境的基础上加入中等大小的平板电脑以及具有更多或更少硬件/软件功能的平板电脑。
+ </p>
+
+ <p class="table-caption"><strong>表 1</strong>:下表列出了两种类型的设备,及其采用的平台版本、屏幕配置和硬件功能配置。典型的平板电脑测试环境可以包含其中的一类或两类设备。</p>
+
+ <table>
+ <tr>
+ <th>类型</th>
+ <th>尺寸</th>
+ <th>密度</th>
+ <th>版本</th>
+ <th>AVD 主题</th>
+ </tr>
+
+ <tr>
+ <td>7 英寸平板电脑</td>
+ <td><span style="white-space:nowrap"><code>large</code> 或</span><br /><code>-sw600</code></td>
+ <td><code>hdpi</code>、<br /><code>tvdpi</code></td>
+ <td>Android 4.0 及更高版本(API 级别 14 及更高)</td>
+ <td>WXGA800-7in</td>
+ </tr>
+ <tr>
+ <td><span style="white-space:nowrap">10 英寸</span>平板电脑</td>
+ <td><span style="white-space:nowrap"><code>xlarge</code> 或</span><br /><code>-sw800</code></td>
+ <td><code>mdpi</code>、<br /><code>hdpi</code>、<br /><code>xhdpi</code></td>
+ <td>Android 3.2 及更高版本(API 级别 13 及更高)</td>
+ <td>WXGA800</td>
+ </tr>
+ </table>
+
+ <div class="headerLine"><h2 id="related-resources">相关资源</h2></div>
+
+ <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6"></div>
+ </p></div>
diff --git a/docs/html-intl/intl/zh-cn/distribute/resources.jd b/docs/html-intl/intl/zh-cn/distribute/resources.jd
new file mode 100644
index 0000000..71bd466
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/distribute/resources.jd
@@ -0,0 +1,56 @@
+page.title=你的语言的资源
+page.viewport_width=970
+section.landing=true
+header.hide=1
+nonavpage=true
+page.metaDescription=我们翻译了以下一些网站资源,希望能帮助你开始设计、开发和发布你的Android应用程序到全球。
+
+@jd:body
+
+ <div class="jd-descr" itemprop="articleBody">
+ <div class="resource-widget resource-carousel-layout col-16"
+ style="height:420px;margin-top:0px;padding-top:0"
+ data-query="collection:overview/carousel/zhcn"
+ data-sortOdrder="-timestamp"
+ data-maxResults="4"></div>
+
+<div class="dynamic-grid">
+
+<h2>你的语言的资源</h2>
+<p style="margin-bottom:2em;">我们翻译了以下一些网站资源,希望能帮助你开始设计、开发和发布你的Android应用程序到全球。</p>
+
+<h3 style="font-size:18px;font-weight:bold">检查清单</h3>
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:overview/zhcn/1"
+ data-sortOrder=""
+ data-cardSizes="6x6,6x6,6x2x3"
+ data-maxResults="5"></div>
+
+<h3 style="font-size:18px;font-weight:bold">Google Play 应用内结算</h3>
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:overview/zhcn/2"
+ data-sortOrder=""
+ data-cardSizes="6x6,6x6,6x2x3"
+ data-maxResults="5"></div>
+
+<h3 style="font-size:18px;font-weight:bold">工具</h3>
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:overview/zhcn/3"
+ data-sortOrder=""
+ data-cardSizes="6x2x3,6x6,6x6"
+ data-maxResults="5"></div>
+
+<h3 style="font-size:18px;font-weight:bold">培训</h3>
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:overview/zhcn/4"
+ data-sortOrder=""
+ data-cardSizes="6x6,12x2x3"
+ data-maxResults="5"></div>
+
+
+</div>
+
diff --git a/docs/html-intl/intl/zh-cn/distribute/tools/index.jd b/docs/html-intl/intl/zh-cn/distribute/tools/index.jd
new file mode 100644
index 0000000..cf16d07
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/distribute/tools/index.jd
@@ -0,0 +1,56 @@
+page.title=工具与参考
+section.landing=true
+nonavpage=true
+
+@jd:body
+
+<p>
+此页面的资源将帮助你发布你的应用和游戏,获取用户,并从中获利。
+</p>
+
+<div class="dynamic-grid">
+
+<h3 style="font-size:18px;font-weight:bold">发布与推出</h3>
+ <div class="resource-widget resource-flow-layout landing col-16"
+ data-query="collection:distribute/tools/checklists/zhcn"
+ data-cardSizes="9x6"
+ data-maxResults="2">
+ </div>
+
+<h3 style="font-size:18px;font-weight:bold">宣传工具</h3>
+ <div class="resource-widget resource-flow-layout landing col-16"
+ data-query="collection:distribute/tools/promote/zhcn"
+ data-cardSizes="6x6"
+ data-maxResults="3">
+ </div>
+
+<h3 style="font-size:18px;font-weight:bold">开发者支持</h3>
+ <div class="resource-widget resource-flow-layout landing col-16"
+ data-query="collection:distribute/tools/support/zhcn"
+ data-cardSizes="6x6"
+ data-maxResults="3">
+ </div>
+
+<h3 style="font-size:18px;font-weight:bold">开发者消息</h3>
+ <div class="resource-widget resource-flow-layout landing col-16"
+ data-query="collection:distribute/tools/news"
+ data-cardSizes="9x6"
+ data-maxResults="2">
+ </div>
+
+<h3 style="font-size:18px;font-weight:bold">更多</h3>
+ <div class="resource-widget resource-flow-layout landing col-16"
+ data-query="collection:distribute/tools/more/zhcn"
+ data-cardSizes="6x6"
+ data-maxResults="3">
+ </div>
+
+<!-- <h3>Related Resources</h3>
+ <div class="resource-widget resource-stack-layout col-16"
+ data-query="tag:developersupport"
+ data-sortOrder="-timestamp"
+ data-numStacks="3"
+ data-maxResults="6">
+ </div> -->
+
+</div>
diff --git a/docs/html-intl/intl/zh-cn/distribute/tools/launch-checklist.jd b/docs/html-intl/intl/zh-cn/distribute/tools/launch-checklist.jd
new file mode 100644
index 0000000..f641dbe
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/distribute/tools/launch-checklist.jd
@@ -0,0 +1,709 @@
+page.title=发布检查清单
+page.metaDescription=向用户发布应用的完整过程的基本概述。在开发的早期阅读这份清单将有助于你做出规划并在Google Play成功发布应用。
+page.image=/distribute/images/launch-checklist.jpg
+
+@jd:body
+
+ <div id="qv-wrapper">
+ <div id="qv" style="width:280px">
+ <h2>检查清单</h2>
+ <ol>
+ <li><a href="#understand-publishing">1. 了解发布流程</a></li>
+ <li><a href="#understand-policies">2. 了解 Google Play 政策</a></li>
+ <li><a href="#test-quality">3. 测试应用的核心质量</a></li>
+ <li><a href="#determine-rating">4. 确定内容分级</a></li>
+ <li><a href="#determine-country">5. 确定分发国家/地区</a></li>
+ <li><a href="#confirm-size">6. 确认总大小</a></li>
+ <li><a href="#confirm-platform">7. 确认平台和屏幕范围</a></li>
+ <li><a href="#decide-price">8. 决定免费或付费</a></li>
+ <li><a href="#consider-billing">9. 使用应用内结算</a></li>
+ <li><a href="#set-prices">10. 设置商品价格</a></li>
+ <li><a href="#start-localization">11. 开始本地化</a></li>
+ <li><a href="#prepare-graphics">12. 准备宣传图片、屏幕截图和视频</a></li>
+ <li><a href="#build-upload">13. 构建发布版 APK</a></li>
+ <li><a href="#plan-beta">14. 计划 Beta 版的发布</a></li>
+ <li><a href="#complete-details">15. 填写商品详情</a></li>
+ <li><a href="#use-badges">16. 使用 Google Play 徽章和链接</a></li>
+ <li><a href="#final-checks">17. 最终检查和发布</a></li>
+ <li><a href="#support-users">18. 在发布后为用户提供支持</a></li>
+ </ol>
+ </div>
+</div>
+
+<div class="top-right-float" style="width:194px"><img src="{@docRoot}distribute/images/launch-checklist.jpg" /></div>
+
+<p>
+ 在 Google Play 上发布应用以将其分发给用户之前,你需要准备好要发布的应用、进行测试并准备相关宣传材料。
+</p>
+
+<p>
+ 本页面旨在帮助你了解发布流程,以及在 Google Play 上成功发布商品所需的准备工作,另外还总结了一些需要你在通过 Google Play 发布应用之前完成的任务,例如创建已签名的发布版应用包 (APK)、了解应用的要求以及为各个应用创建商品页和图形资源。
+</p>
+
+<p>
+ 准备和发布任务已按先后顺序列出,这是为了让你对任务执行顺序有个大致了解。不过,你可以按适合自己的顺序来执行这些任务,也可以根据具体情况跳过某些步骤。
+</p>
+
+<p>
+ 在完成发布之前的各项工作时,你可以使用各种支持资源。每一步中都提供了相关链接。
+</p>
+
+<div class="headerLine">
+ <h2 id="understand-publishing">
+ 1. 了解发布流程
+ </h2>
+
+
+</div>
+
+<p>
+ 在开始执行此检查清单中的各个步骤之前,你应抽时间查看和了解整个发布工作流程,并熟悉该流程的工作原理。特别要注意的是,你或你的开发小组需要按照所有 Android 应用通用的流程准备应用以进行发布。<a href="/tools/publishing/publishing_overview.html">发布工作流程文档</a>中详细说明了发布的工作原理以及如何准备 APK 以进行发布。
+</p>
+
+<p>
+ 当你基本熟悉发布流程后,请继续阅读以了解在 Google Play 上发布应用时应注意哪些问题。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/understanding/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="understand-policies">
+ 2. 了解 Google Play 政策和协议
+ </h2>
+
+
+</div>
+
+<p>
+ 请务必了解并遵守你在注册时接受的 Google Play 计划政策。Google Play 要求强制执行这些政策,违反任何一条都可能导致你的应用被暂停。如果屡次违规,你的开发者帐户将被终止。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/policies/zhcn" data-sortorder="-timestamp" data-cardsizes="6x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="test-quality">
+ 3. 测试质量
+ </h2>
+
+
+</div>
+
+<p>
+ 在 Google Play 上发布应用之前,请务必确保这些应用在所有目标设备上都符合适用于所有 Android 应用的基本质量要求。你可以设置测试环境,然后测试应用是否符合一系列<strong>适用于所有应用的质量标准</strong>,以此来检查应用的质量。有关完整信息,请参阅<a href="/distribute/essentials/quality/core.html">应用核心质量指南</a>。
+</p>
+
+<p>
+ 如果你的应用适用于平板电脑,请确保其能为你的平板电脑用户提供引人入胜的丰富体验。请参阅<a href="/distribute/essentials/quality/tablets.html">平板电脑应用的质量</a>指南,了解如何针对平板电脑优化应用的相关建议。
+</p>
+
+<p>
+ 如果你要将应用发布到 Google Play for Education,则需确保这些应用适合中小学课堂且能提供非凡的教育价值。请参阅<a href="/distribute/essentials/gpfe-guidelines.html">教育指南</a>,了解教育类应用应具备哪些特征。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/quality/zhcn" data-sortorder="-timestamp" data-cardsizes="6x3,6x3,6x3,9x3,9x3,9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="determine-rating">
+ 4. 确定应用的内容分级
+ </h2>
+
+
+</div>
+
+<p>
+ Google Play 要求你为应用设置内容分级,以便 Google Play 用户了解应用的心智成熟度级别。发布应用之前,你应先确认自己要使用哪一分级。有以下四种内容分级可供选择:
+</p>
+
+<ul>
+ <li>
+ <p>所有人</p>
+ </li>
+
+ <li>
+ <p>心智成熟度-低</p>
+ </li>
+
+ <li>
+ <p>心智成熟度-中</p>
+ </li>
+
+ <li>
+ <p>心智成熟度-高</p>
+ </li>
+</ul>
+
+<p>
+ Android 用户可以在其 Android 设备上设置要浏览的心智成熟度级别,Google Play 会根据该设置对应用进行过滤。因此,你选择的内容分级会影响应用对用户的分发情况。你可以在开发者控制台中为应用指定(或更改)内容分级,无需在应用二进制文件中进行任何更改。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/rating/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,6x3,6x3,9x3,9x3,9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="determine-country">
+ 5. 确定分发国家/地区
+ </h2>
+
+
+</div>
+
+<p>
+ 借助 Google Play,你可以控制将应用分发到哪些国家和地区。为了尽可能扩大覆盖面和潜在客户群,你通常会希望将应用分发到所有适用的国家和地区。不过,由于业务需求、应用要求或发布时的依赖关系,你可能需要从分发范围中排除一个或多个国家/地区。
+</p>
+
+<p>
+ 请务必尽早确定目标国家/地区,因为这可能会影响:
+</p>
+
+<ul>
+ <li>
+ <p>是否需要对应用中的资源进行本地化。
+ </p>
+ </li>
+
+ <li>
+ <p>是否需要对开发者控制台中的应用说明进行本地化。
+ </p>
+ </li>
+
+ <li>
+ <p>某些国家/地区是否对应用有相应的法律要求。
+ </p>
+ </li>
+
+ <li>
+ <p>时区支持、本地价格等。
+ </p>
+ </li>
+</ul>
+
+<p>
+ 确定目标国家/地区后,你应该评估应用及其 Google Play 商品详情是否需要本地化,然后在预订的发布日期之前就开始本地化工作。
+</p>
+
+<p>
+ 请参阅<a href="/distribute/tools/localization-checklist.html">本地化检查清单</a>,了解本地化流程中的关键步骤和注意事项。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/country/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="confirm-size">
+ 6. 确认应用的总大小
+ </h2>
+
+
+</div>
+
+<p>
+ 应用的总大小会对应用的设计以及在 Google Play 上的发布产生影响。目前,在 Google Play 上发布的 APK 最大不得超过 <strong>50MB</strong>。如果你的应用超过该上限或要提供辅助下载,则可以使用 <a href="/google/play/expansion-files.html">APK 扩展文件</a>。Google Play 会将扩展文件免费托管在其服务器基础架构上,并自动处理这些文件下载到设备的过程。
+</p>
+
+<ul>
+ <li>
+ <p>在 Google Play 上发布的 APK 最大不得超过 50MB。
+ </p>
+ </li>
+
+ <li>
+ <p>对于每个 APK,你最多可以使用两 (2) 个 APK 扩展文件,每个都不得超过 2GB。
+ </p>
+ </li>
+</ul>
+
+<p>
+ 在分发大型应用时,使用 APK 扩展文件是一种经济高效的简便方法。不过,使用 APK 扩展文件需要你在应用二进制文件中稍作更改,因此你需要在创建发布版 APK 之前完成这些更改。
+</p>
+
+<p>
+ 为了尽可能精简应用的二进制文件,请务必在构建发布版 APK 时运行 <a href="/tools/help/proguard.html">Proguard</a> 工具或类似的代码混淆工具。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/size/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="confirm-platform">
+ 7. 确认应用的平台和屏幕兼容性范围
+ </h2>
+
+
+</div>
+
+<p>发布应用之前,请务必确保你的应用可在目标 Android 平台版本和设备屏幕尺寸上正常运行。
+</p>
+
+<p>
+ 从应用兼容性角度来看,Android 平台版本由 <a href="/guide/topics/manifest/uses-sdk-element.html#ApiLevels">API 级别</a>定义。你应该使用 <a href="/guide/topics/manifest/uses-sdk-element.html"><minSdkVersion></a> 确认你的应用兼容的最低版本,因为这将影响已发布的应用在 Android 设备上的分发情况。
+</p>
+
+<p>
+ 对于屏幕尺寸,你应该确认应用可在支持的各种屏幕尺寸和像素密度上正常运行且拥有精美外观。你还应按照<a href="/guide/practices/screens_support.html">支持跨屏</a>中给出的建议,为多种屏幕尺寸提供相应的支持。如果你无法提供跨屏支持,请使用 <a href="/guide/topics/manifest/supports-screens-element.html"><supports-screens></a> 声明应用支持的最小屏幕尺寸。Google Play 会据此对你的应用做出限制,只将其提供给屏幕尺寸大于或等于已声明尺寸的设备。
+</p>
+
+<p>
+ 要更好地了解目前 Android 平台版本和屏幕尺寸在所有 Android 设备上的普及情况,请参阅<a href="/about/dashboards/index.html">设备信息中心</a>图表。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/platform" data-sortorder="-timestamp" data-cardsizes="6x3,6x3,6x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="decide-price">
+ 8. 决定你的应用是免费还是付费
+ </h2>
+
+
+</div>
+
+<div class="figure">
+ <img src="{@docRoot}images/gp-launch-checklist-1.png" />
+</div>
+
+<p>
+ 在 Google Play 上,你可以发布免费下载的应用和付费下载的应用。免费应用可供 Google Play 中的所有 Android 用户下载。付费应用仅供其所在国家/地区支持付费下载且已在 Google Play 中注册了付款方式(例如信用卡或运营商直接代扣)的用户下载。
+</p>
+
+<p>
+ 决定你的应用是否免费非常重要,因为在 Google Play 上,<strong>免费应用必须始终免费</strong>。
+</p>
+
+<ul>
+ <li>
+ <p>将应用发布为免费应用后,你无法再将其改成付费应用。不过,你仍能通过 Google Play 的<a href="/google/play/billing/index.html">应用内结算</a>服务销售<a href="/google/play/billing/billing_overview.html#products">应用内商品</a>和<a href="/google/play/billing/billing_subscriptions.html">订阅</a>。
+ </p>
+ </li>
+
+ <li>
+ <p>如果你将应用发布为付费应用,则可以随时将其改成免费应用(<strong>但之后无法再将其改回为付费应用</strong>)。<em></em>你也可以销售应用内商品和订阅。
+ </p>
+ </li>
+</ul>
+
+<p>
+ 如果你的应用是付费应用或者你要销售应用内商品,你需要先<a href="https://developers.google.com/wallet/digital/training/getting-started/merchant-setup">设置 Google 电子钱包商家帐户</a>,然后才能发布应用。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/price/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="consider-billing">
+ 9. 考虑使用应用内结算
+ </h2>
+
+
+</div>
+
+<p>
+ 借助 Google Play <a href="/google/play/billing/index.html">应用内结算</a>,你可以在应用中销售数字内容。你可以使用该服务销售众多内容,包括可下载内容(例如媒体文件或照片)和虚拟内容(例如游戏关卡或魔药)。借助应用内结算服务,你可以在应用内销售一次性购买的商品,还可以销售订阅。这有助于你在应用安装后的整个生命周期内都能获利。
+</p>
+
+<p>
+ 如果你希望找到更多方法以通过应用获利并建立与用户的互动,则应考虑使用“应用内结算”或“Instant Buy”服务。这些服务深受用户和开发者的欢迎。要使用“应用内结算”和“Instant Buy”,你需要对应用的二进制文件进行更改。因此,你需要先完成更改并测试实施情况,然后才能创建发布版 APK。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/purchasemethod/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="set-prices">
+ 10. 设置商品价格
+ </h2>
+
+
+</div>
+
+<p>
+ 如果你的应用是付费应用或者你要销售应用内商品或实体商品,Google Play 可让你针对全球市场的用户为商品设置以不同货币为单位的价格。你可以分别使用不同货币设置价格,以便根据市场情况和汇率灵活调整你的价格。
+</p>
+
+<p>
+ 发布应用之前,请想好如何为你的商品定价及以不同货币为单位的价格各是多少。之后,你可以通过开发者控制台设置以所有可用货币为单位的各种价格。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/setprice/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,9x3,9x3,9x3,9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="start-localization">
+ 11. 开始本地化
+ </h2>
+
+
+</div>
+
+<p>
+ 确定目标国家/地区后,你最好评估一下你的本地化需求,确保你的应用已国际化,并在预订的发布日期之前就开始本地化工作。
+</p>
+
+<p>
+ 除了应用设计外,你至少还应考虑本地化工作中的三个方面:
+</p>
+
+<ul>
+ <li>
+ <p>本地化应用中的字符串、图片及其他资源。
+ </p>
+ </li>
+
+ <li>
+ <p>本地化应用在 Google Play 商店中的商品详情。
+ </p>
+ </li>
+
+ <li>
+ <p>本地化应用的商品详情中随附的图形资源、屏幕截图和视频。
+ </p>
+ </li>
+</ul>
+
+<p>
+ 请参阅<a href="/distribute/tools/localization-checklist.html">本地化检查清单</a>,了解本地化流程中的关键步骤和注意事项。
+</p>
+
+<p>
+ 要本地化你的商品详情,请先创建并完成应用标题、说明和宣传文字。将所有这些信息收集起来,然后发送给相关人员进行本地化。在应用更新时,你也可以选择翻译“最近更改”的文本。之后,你可以在开发者控制台中添加本地化的商品详情,或者选择让 Google Play 将你的商品详情自动翻译成你支持的语言。
+</p>
+
+<p>
+ 要让你的应用详情吸引全球的用户,关键是创建本地化版本的宣传图片、屏幕截图和视频。例如,应用的置顶大图中可能包含文字,这些文字应翻译成相应语言以获得最佳效果。你可以为每种目标语言创建相应版本的宣传图片,并将它们上传到开发者控制台。如果你提供宣传视频,则可以创建本地化版本的视频,然后添加指向各目标语言版本的视频的链接。
+</p>
+
+<p>
+ 完成翻译后,根据需要将翻译放入应用的资源中并测试能否正常加载。在上传资源和配置商品详情时,请保存应用的翻译版商品详情以供日后使用。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/localization/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="prepare-graphics">
+ 12. 准备宣传图片、屏幕截图和视频
+ </h2>
+
+
+</div>
+
+<p>
+ 在 Google Play 上发布应用时,你可以提供各种高品质的图形资源,用来宣传你的应用或品牌。应用发布后,这些资源将显示在你的商品详情页、搜索结果及其他位置上。这些图形资源是商品详情页成功与否的关键,它们能吸引用户的注意力并让用户参与互动。因此,你应考虑聘请专业人士为你制作这些资源。屏幕截图和视频也相当重要,因为它们将展示应用的外观、使用或操作方式及其独特之处。
+</p>
+
+<p>
+ 所有的图形资源均应精心设计以便足够醒目,并以多彩、有趣的方式突显你的应用或品牌。这些资源应该采用相同的徽标和图标,以便用户在下载应用后可以在“所有应用”启动器中找到你的应用。你的图形资源还应与你发布的所有应用的图形资源(也会显示在商品详情页上供用户查看)相互配套。
+</p>
+
+<p>
+ 为了帮你将应用更有效地推广给全球用户,Google Play 允许你创建本地化版本的宣传图片、屏幕截图和视频并上传到开发者控制台中。当用户访问你应用的商品详情时,Google Play 会向其展示你针对该用户所用语言提供的宣传图片、屏幕截图和视频。
+</p>
+
+<p>
+ 要本地化你的宣传图片,你可以翻译所有嵌入的文本、使用不同的图像或展示方式,或者改变你的营销方式,以尽可能满足使用特定语言的用户的需求。例如,如果你的置顶大图或宣传图片中包含嵌入的商品名称或宣传口号,则可以将名称或口号翻译成相应语言,然后添加到本地化版本的宣传图片中。
+</p>
+
+<p>
+ 由于本地化的图形资源和视频非常重要,因此你应在预订的发布日期之前就开始创建并进行本地化。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/graphics/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="build-upload">
+ 13. 构建并上传发布版 APK
+ </h2>
+
+
+</div>
+
+<p>
+ 当确定你的应用符合界面、兼容性和质量要求后,你可以构建应用的发布版本。之后,你可以将发布版 APK 上传到开发者控制台并分发给用户。
+</p>
+
+<p>
+ 所有应用的发布版 APK 准备流程都一样,无论应用采用哪种分发方式。一般情况下,该流程包括基本的代码清理和优化、构建和使用发布密钥签名以及最后的测试这几部分。
+</p>
+
+<p>
+ 如需了解如何创建发布版应用的完整详情,请参阅<a href="/tools/publishing/preparing.html">准备发布</a>。
+</p>
+
+<p>
+ 准备好发布版 APK 后,你可以将其上传到开发者控制台。如果需要,你可以在发布之前将 APK 替换为较新的版本。
+</p>
+<!--<h3 class="rel-resources clearfloat">Related resources</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/build/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6"></div>-->
+
+<div class="headerLine">
+ <h2 id="plan-beta">
+ 14. 计划 Beta 版的发布
+ </h2>
+
+
+</div>
+
+<div class="sidebox-wrapper" style="float:right">
+ <div class="sidebox">
+ <h2>
+ 简单的 Beta 测试
+ </h2>
+
+ <p>
+ Google Play 允许你在世界范围内设立 Alpha 版和 Beta 版测试者小组。下次登录到开发者控制台时请别忘记了解这一强大的功能。
+ </p>
+ </div>
+</div>
+
+<p>
+ 在发布应用之前收集用户的真实反馈是很有必要的,特别是发布新应用时,应该收集更多反馈。我们强烈建议你向主要目标市场的用户分发应用的预览版本,并让这些用户能够方便地向你提供反馈和报告错误。
+</p>
+
+<p>
+ Google Play 可以帮助你为应用设置 Beta 测试计划。登录到开发者控制台并上传你的 APK 之后,你可以设立用户小组,以便进行应用的 Alpha 版和 Beta 版测试。你可以先进行小范围的 Alpha 版测试,然后推进到更大范围的 Beta 版测试。用户被添加到小组之后,他们可以访问你应用的商品详情并安装应用。
+ <strong>Alpha 或 Beta 版本的用户不能留下评论或评分</strong>,因此你在 Google Play 上的<strong>评分不会受到不利影响</strong>。你需要安排具体途径以便用户提供测试反馈,例如 Google 论坛或 Google+。
+</p>
+
+<p>
+ 收到的反馈可以帮助你调整界面、翻译和商品详情,以确保为用户提供优质体验。
+</p>
+<!-- Related resources
+
+<table>
+ <tr>
+ <td>Beta-testing and Staged Rollouts
+See how you can facilitate testing with Google Play.</td>
+ </tr>
+</table> -->
+
+<div class="headerLine">
+ <h2 id="complete-details">
+ 15. 填写应用的商品详情
+ </h2>
+
+
+</div>
+
+<p>
+ 在 Google Play 上,应用的商品信息会在用户的 Android 设备或网络上的以下页面中显示给用户:应用的商品详情页;用户为详细了解应用而访问的页面;用户决定购买或下载应用的页面上。
+</p>
+
+<p>
+ 为了让你宣传应用以及在商品详情页上与用户互动,Google Play 提供了许多方式,包括多彩的图片、屏幕截图和视频,本地化的说明、发布详情以及指向你其他应用的链接。当你准备发布应用时,请确保充分利用商品详情页提供的所有资源,让你的应用尽可能地引人入胜。
+</p>
+
+<p>
+ 你应在预订的发布日期之前就开始规划商品页,准备本地化的说明以及高品质的图形资源、屏幕截图和视频等。
+</p>
+
+<p>
+ 当临近预订的发布日期时,你应该熟悉开发者控制台中与商品详情配置页相关的所有字段、选项和资源。收集此页面上的信息和资源时,请将它们输入或上传到开发者控制台中,直到完成该页面,可以进行发布。
+</p>
+
+<p>
+ 在开发者控制台中为应用设置地理位置定位后,请记得针对所有支持的目标语言添加本地化的商品详情、宣传图片等。
+</p>
+
+<p>
+ 如果你的应用适用于平板电脑,请确保至少加入一张应用在平板电脑上运行时的屏幕截图,并在应用说明、版本备注、宣传活动及其他位置注重介绍你的应用支持平板电脑。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/productdetails/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="use-badges">
+ 16. 在宣传活动中使用 Google Play 徽章和链接
+ </h2>
+
+
+</div>
+
+<p>
+ Google Play 徽章是官方品牌标识,你可以使用该徽章向 Android 用户推广你的应用。使用 <a href="/distribute/tools/promote/badges.html">Google Play 徽章生成器</a>可快速创建徽章,让用户从网页、广告、评论等链接到你的商品。你还可以使用特殊的<a href="/distribute/tools/promote/linking.html">链接格式</a>,将用户直接链接到你的商品详情页、商品列表或搜索结果页。
+</p>
+
+<p>
+ 为了帮你的应用在发布后获得用户关注,强烈建议你通过宣传活动来支持应用的发布,这些宣传活动应通过尽可能多的渠道、向尽可能多的国家/地区介绍你的商品。例如,你可以通过广告展示、社交网络或博客、视频及其他媒体、采访和评论,或者任何其他可用渠道推广应用的发布。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/badges/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="final-checks">
+ 17. 最终检查和发布</h2>
+
+
+</div>
+
+<p>
+ 如果你认为已做好发布准备,请登录到开发者控制台,花些时间做最后几项检查。
+</p>
+
+<p>
+ 请确保:
+</p>
+
+<ul>
+ <li>
+ <p>你的开发者资料准确无误且已与相应的 Google 电子钱包商家帐户相关联(如果你要销售商品)。
+ </p>
+ </li>
+
+ <li>
+ <p>你上传的应用版本准确无误。
+ </p>
+ </li>
+
+ <li>
+ <p>商品详情的各个方面都已准备完善,包括所有图形资源、屏幕截图、视频、本地化的说明等。
+ </p>
+ </li>
+
+ <li>
+ <p>你已将应用设置为免费应用或付费应用。
+ </p>
+ </li>
+
+ <li>
+ <p>你已设置目标国家/地区(以及运营商),并已确定以买家货币为单位的商品价格(如果适用)
+ </p>
+ </li>
+
+ <li>
+ <p>“兼容设备”显示你的应用当前覆盖的是你要定位的设备。如果不是,你应与开发小组联系以了解应用的要求和过滤规则。
+ </p>
+ </li>
+
+ <li>
+ <p>你已提供指向你网站的正确链接以及正确的支持电子邮件地址。
+ </p>
+ </li>
+
+ <li>
+ <p>你的应用未违反任何内容政策指南。
+ </p>
+ </li>
+
+ <li>
+ <p>你已确认你的应用符合 Google Play 上的 Android 内容指南及美国出口法。
+ </p>
+ </li>
+</ul>
+
+<p>
+ 你的应用现在随时可以发布了!
+</p>
+
+<p>
+ 如果你要发布更新,请务必阅读<a href="http://support.google.com/googleplay/android-developer/bin/answer.py?hl=zh-CN&answer=113476&topic=2365760&ctx=topic">发布更新的相关要求</a>。
+</p>
+
+<p>
+ 当一切就绪后,请点击开发者控制台中的<strong>发布</strong>按钮。几个小时内,你的应用就会提供给广大用户,你的商品页将显示在 Google Play 上,供用户浏览、搜索或从宣传资料中链接到该页面。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/finalchecks/zhcn" data-sortorder="-timestamp" data-cardsizes="6x3,6x3,6x3,9x3,9x3,9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="support-users">
+ 18. 在发布后为用户提供支持
+ </h2>
+
+
+</div>
+
+<p>
+ 发布应用或应用更新后,请务必为你的客户提供相关支持。及时周到的支持可让用户获得更好的体验,你的商品也就能获得更高的评分和更多的好评。如果你积极响应用户的需求和反馈,他们可能会与你的应用进行更多互动,还会向其他人推荐你的应用。如果你运用多种方式开展宣传活动,这种效果在应用发布后会更加明显。
+</p>
+
+<p>
+ 你可以通过多种方式与用户保持联系并为其提供支持。其中最常见的就是在商品详情页上提供你的支持电子邮件地址。<em></em>除此之外,你还可以提供其他支持方式,例如论坛、邮寄名单或 Google+ 信息页。Google Play 小组会为用户提供下载、安装和付款方面的支持,但其他方面的问题则由你自行解决。由你向用户提供支持的示例包括:功能请求、应用的使用问题以及兼容性设置问题。
+</p>
+
+<p>
+ 发布应用后,你应:
+</p>
+
+<ul>
+ <li>
+ <p>经常查看你应用的商品详情页上的评分和评论。注意反复出现的主题,这可能表示存在错误或其他问题。
+ </p>
+ </li>
+
+ <li>
+ <p>关注新发布的 Android 平台版本,因为你应用的兼容性设置可能需要更新。
+ </p>
+ </li>
+
+ <li>
+ <p>在你的网站上放置一个指向支持资源的链接,并设置其他支持方式,例如论坛。
+ </p>
+ </li>
+
+ <li>
+ <p>在商品详情页上提供相应的支持电子邮件地址并回复用户发来的电子邮件。
+ </p>
+ </li>
+
+ <li>
+ <p>除了 Google Play 提供的自动退款窗口外,请诚心制定你的退款政策,因为满意的用户将来更有可能购买你的商品。
+ </p>
+ </li>
+
+ <li>
+ <p>确认并解决你应用中出现的问题。保持公开透明并主动在商品详情页上列出已知问题是明智有益之举。
+ </p>
+ </li>
+
+ <li>
+ <p>尽可能经常发布更新,但不要牺牲质量,也不能过于频繁以免干扰用户。
+ </p>
+ </li>
+
+ <li>
+ <p>每次更新时,请务必总结一下变更内容。你可以在开发者控制台中输入此信息。用户会查看这些信息并认为你是在努力提高应用的质量。
+ </p>
+ </li>
+</ul>
+
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/afterlaunch/zhcn" data-sortorder="-timestamp" data-cardsizes="9x3,9x3,9x3,9x3,9x3,9x3" data-maxresults="6"></div>
diff --git a/docs/html-intl/intl/zh-cn/distribute/tools/localization-checklist.jd b/docs/html-intl/intl/zh-cn/distribute/tools/localization-checklist.jd
new file mode 100644
index 0000000..b2ba2ff
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/distribute/tools/localization-checklist.jd
@@ -0,0 +1,698 @@
+page.title=本地化检查清单
+page.metaDescription=把握 Android 和 Google Play 所提供的全世界观众的优势。阅读此清单以获得如何将产品送到世界各地的市场的概述。
+page.image=/distribute/images/localization-checklist.jpg
+page.type="배포"
+
+@jd:body
+
+ <div id="qv-wrapper">
+ <div id="qv" style="width:280px">
+ <h2>检查清单</h2>
+ <ol>
+ <li><a href="#identify-languages">1. 确定目标语言和语言区域</a></li>
+ <li><a href="#design">2. 本地化设计</a></li>
+ <li><a href="#manage-strings">3. 管理字符串本地化</a></li>
+ <li><a href="#translate-strings">4. 翻译界面字符串和其他资源</a></li>
+ <li><a href="#test">5. 测试已本地化的应用</a></li>
+ <li><a href="#prepare-launch">6. 准备国际化发布</a></li>
+ <li><a href="#support-users">7. 在发布之后为国际用户提供支持</a></li>
+ </ol>
+ </div>
+</div>
+
+<div class="top-right-float" style="width:194px">
+ <img src="{@docRoot}distribute/images/localization-checklist.jpg">
+</div>
+<p>
+ Android 和 Google Play 让你可以面向全球的用户提供应用,其中日本、韩国、印度、巴西和俄罗斯等国家/地区的目标用户群正在迅速扩展。有鉴于此,我们强烈建议你本地化你的应用,因为这样可以最大程度地增加应用的分发范围,获得全球各地用户的评分。
+</p>
+
+<p>
+ 本地化涉及到很多任务,贯穿应用开发的整个周期,因此务必要提前做出规划。本文旨在帮助你了解本地化的主要方面,以便你做好准备,通过 Google Play 向全球成功发布自己的应用。
+</p>
+
+<div class="headerLine">
+ <h2 id="identify-languages" style="margin-bottom:0px">
+ 1. 确定目标语言和语言区域
+ </h2>
+
+
+</div>
+
+<p>
+ 确定要向哪些国家/地区发布你的应用并了解这些国家/地区所用的语言,是准备本地化的过程中基本且重要的一步。对于具有巨大市场商机、但英语或其他国际性语言并不普及的国家/地区来讲,将应用本地化尤为重要。
+</p>
+
+<p>
+ 对于国际用户,你可以从以下这三个主要方面来管理自己的应用:国家/地区、语言区域和语言。其中,语言是本地化的主要考虑因素(语言区域也很重要,因为日期的格式、时间、货币及其他类似信息也都存在差异)。用户可以控制其 Android 设备上使用的语言和语言区域,反过来这些因素也会影响应用的显示方式。
+
+</p>
+
+<p>
+ 通常来说,你首先要根据整体市场规模和商机、应用类别、竞争格局、本地定价和金融状况等因素来确定要定位的国家/地区,然后再基于你的国家/地区定位,确定应用要支持的语言。
+</p>
+
+<p>
+ 随后,你可以决定是针对目标国家/地区的部分语言还是全部语言进行本地化。合理的做法是,先针对一种主要的地区性语言进行本地化,然后随着用户群的扩大增添更多语言。
+</p>
+
+<p>
+ 确定目标语言之后,你就可以安排开发、翻译、测试和市场营销工作重点围绕这些市场展开。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query=
+"collection:distribute/toolsreference/localizationchecklist/identifylocales/zhcn"
+data-sortorder="-timestamp" data-cardsizes="9x3," data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="design" style="margin-bottom:0px">
+ 2. 本地化设计
+ </h2>
+
+
+</div>
+
+<p> 确定本地化的目标语言之后,请评估在应用中支持这些语言需要完成哪些工作并提早做出规划。要考虑的事项包括每种语言的词汇扩展、脚本要求、字符间距、换行限制、支持文字“从左到右”和“从右到左”,以及其他可能遇到的问题。
+</p>
+
+<h4>
+ <strong>设计一套灵活的布局</strong>
+</h4>
+
+<p>
+ 在创建布局时,确保包含文字的界面元素拥有充足的空间。最好在满足你的语言的基础上多出部分空间(通常留出 30% 的空间)以适应其他语言。
+</p>
+
+<p>
+ 另外,元素应能够横向或纵向扩展,以便可以适应不同宽度和高度的界面字符串或输入文本。任何目标语言的字符串都不应与边框或屏幕边缘重叠。
+</p>
+
+<p>
+ 如果界面设计得当,通常你就可以针对所有支持的语言使用一套布局。有关详情,请参阅<a href="{@docRoot}training/basics/fragments/fragment-ui.html">构建灵活的界面</a>。
+</p>
+
+<h4>
+ <strong>根据需要使用备用布局</strong>
+</h4>
+
+<p>
+ 如果你的界面不能很好地适应某种目标语言,那么你可以单独为该语言创建一套<a href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">备用布局</a>。Android 可让你很轻松地针对特定语言、语言区域、屏幕尺寸等,声明要加载的多种布局和其他资源,只需使用相应的资源限定符做出标记即可。虽然备用布局可提供相应的灵活性,但使用它会导致随着时间推移,应用的维护难度增加。因此一般来说,建议你最好使用一套更灵活的布局。
+</p>
+
+<h4>
+ <strong>支持 RTL 布局和文本</strong>
+</h4>
+
+<p>
+ 如果你要发布应用的国家/地区使用从右到左 (RTL) 的文字阅读方向,则你应该考虑尽可能地支持 RTL 布局以及相应的文本显示和编辑。
+</p>
+
+<p>
+ Android 4.1 引入了对双向文字的有限支持,支持应用以从左到右 (LTR) 和从右到左 (RTL) 的方向显示和编辑文本。Android 4.2 增加了<a href="http://android-developers.blogspot.fr/2013/03/native-rtl-support-in-android-42.html">对 RTL 布局的完整原生支持</a>(包括布局镜像),因此你可以为所有用户提供一致的优质体验。
+</p>
+
+<p>
+ Android 4.2 用户至少可以轻松添加基本的 RTL 布局镜像,这对满足 RTL 用户需求大有帮助。
+</p>
+
+<h4>
+ <strong>针对日期、时间、数字和货币采用系统提供的格式</strong>
+</h4>
+
+<p>
+ 如果你的应用需要指定因语言区域不同而不同的日期、时间、数字、货币和其他实体,请务必使用系统提供的格式,而不要使用应用专有的格式。请注意,并非所有的语言区域都使用相同的千位分隔符、小数点或百分比符号。
+</p>
+
+<p>
+ Android 提供了多种实用工具,用于在不同的语言区域中设置格式、进行转换:例如适用于日期的 <a href="{@docRoot}reference/android/text/format/DateUtils.html">DateUtils</a> 和 <a href="{@docRoot}reference/java/text/DateFormat.html">DateFormat</a>;适用于数字和货币的 <a href="{@docRoot}reference/java/lang/String.html#format(java.lang.String, java.lang.Object...)">String.format()</a> 或 <a href="{@docRoot}reference/java/text/DecimalFormat.html">DecimalFormat</a>;适用于电话号码的 <a href="{@docRoot}reference/android/telephony/PhoneNumberUtils.html">PhoneNumberUtils</a> 等。
+</p>
+
+<p>
+ 假定用户的语言区域并据此强制设置格式,会导致在用户更改语言区域时引发问题。强烈建议你使用系统提供的格式和各种实用工具。
+</p>
+
+<h4>
+ <strong>包括一套完整的默认资源</strong>
+</h4>
+
+<p>
+ 提供一整套默认资源可以确保无论是何种语言或语言区域,你的应用都能正常运行。应用的默认资源是指没有使用任何语言或语言区域限定符标记的资源,例如 res/drawable/ 和 res/values/ 中存储的资源。<em></em>如果你的应用试图加载目前的语言或默认资源集中没有的资源,则会崩溃。
+</p>
+
+<p>
+ 无论你在应用中使用的默认语言是什么,请务必在默认的资源目录中存储相关的布局、图形内容和字符串,且不使用语言或语言区域限定符。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query=
+"collection:distribute/tools/loc/designforloc" data-sortorder="-timestamp"
+data-cardsizes="9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="manage-strings" style="margin-bottom:0px">
+ 3. 管理字符串的本地化</h2>
+
+
+</div>
+
+<p>
+ 妥善管理应用的界面字符串非常重要,这样你才能为用户提供优质的体验,并让本地化工作事半功倍。
+</p>
+
+<h4>
+ <strong>将所有字符串放入 strings.xml 中</strong>
+</h4>
+
+<p>
+ 在构建应用时,请注意不要硬编码任何字符串,而是在默认的 strings.xml 文件中将所有字符串声明为资源,这样便于更新和进行本地化。<em></em>strings.xml 文件中的字符串可以抽取出来、进行翻译,然后再集成回应用(使用相应的限定符),无需对编译后的代码进行任何更改。
+</p>
+
+<p>
+ 如果你生成带有文字的图片,也请将这些字符串放入 strings.xml,并在翻译之后重新生成图片。
+</p>
+
+<h4>
+ <strong>遵循针对界面字符串的 Android 指南</strong>
+</h4>
+
+<p>
+ 在设计和开发界面时,请务必密切注意你与用户交流的方式。<em></em>一般而言,使用友好而不失简洁、<a href="{@docRoot}design/style/writing.html">简明而且精炼的风格</a>,并且整个界面应采用一致的风格。</p>
+
+<p>
+ 请务必阅读并遵循<a href="{@docRoot}design/style/writing.html">写作风格和字词选择</a>方面的 Android 设计建议。这样做能够让你的应用更加美观,并且有助于用户快速理解你的界面。
+</p>
+
+<p>
+ 另外,请尽可能使用 Android 标准术语,例如对于界面元素,使用“操作栏”、“选项菜单”、“系统栏”、“通知”等。确保 Android 术语的正确性和一致性可让翻译工作更容易进行,从而为用户带来更好的最终产品。
+</p>
+
+<h4>
+ <strong>为声明的字符串提供充分的上下文</strong>
+</h4>
+
+<p>
+ 在 strings.xml 文件中声明字符串时,确保清楚说明使用该字符串的上下文。此信息对翻译人员来说十分重要,有助于提高翻译质量,也有助于你始终有效地管理字符串。
+</p>
+
+<p>
+ 下面是一个例子:
+</p>
+
+<pre class="prettyprint"><span class="com"><!-- 用于提交表单的操作。此文本显示在可容纳 30 个字符的按钮上--></span><span class="pln"><br /></span><span class="tag"><string</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"login_submit_button"</span><span class="tag">></span><span class="pln">Sign in</span><span class="tag"></string></span></pre>
+<p>
+ 你需要提供的上下文信息包括:
+</p>
+
+<ul>
+ <li>
+ <p>
+ 字符串有何用途?它在何时/哪里呈现给用户?
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 它在布局中的什么位置?例如,如果它是按钮,那么翻译的灵活性就不如文本框。
+ </p>
+ </li>
+</ul>
+
+<h4>
+ <strong>标记不应翻译的信息部分</strong>
+</h4>
+
+<p>
+ 有时候字符串中包含不应被翻译为其他语言的文本。常见的示例包括代码、某个值的占位符、特殊符号或名称。在准备翻译字符串时,请查找并标记应该保留原样而不用翻译的文本,这样翻译人员就不会更改这些内容。
+</p>
+
+<p>
+ 要标记不应翻译的文本,请使用 <code><xliff:g></code> 占位符标记。以下示例标记可确保文本“%1$s”在翻译过程中不会被更改(否则这条消息会被破坏):
+</p>
+
+<pre class="prettyprint"><span class="tag"><string</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"countdown"</span><span class="tag">></span><span class="pln"><br /> </span><span class="tag"><xliff:g</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"time"</span><span class="pln"> </span><span class="atn">example</span><span class="pun">=</span><span class="atv">"5 days></span><span class="pln">%1$s</span><span class="tag"></xliff:g></span><span class="pln">until holiday<br /></span><span class="tag"></string></span></pre>
+<p>
+ 在声明占位符标记时,请务必添加说明此占位符用途的 ID 属性。如果你的应用稍后会替换占位符值,请务必提供示例属性来说明预期用途。
+</p>
+
+<p>
+ 以下是其他一些占位符标记的示例;
+</p>
+
+<pre>
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+<!-- 特殊 Unicode 符号的占位符示例 -->
+
+<string name="star_rating">Check out our 5
+
+ <xliff:g id="star">\u2605</xliff:g>
+
+</string>
+
+<!-- 网址的占位符示例 -->
+
+<string name="app_homeurl">
+
+ Visit us at <xliff:g id="application_homepage">http://my/app/home.html</xliff:g>
+
+</string>
+
+<!-- 名称的占位符示例 -->
+
+<string name="prod_name">
+
+ Learn more at <xliff:g id="prod_gamegroup">Game Group</xliff:g>
+
+</string>
+
+<!-- 实值的占位符示例 -->
+
+<string name="promo_message">
+
+ Please use the "<xliff:g id="promotion_code">ABCDEFG</xliff:g>” to get a discount.
+
+</string>
+
+...
+
+</resources>
+</pre>
+
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query=
+"collection:distribute/toolsreference/localizationchecklist/managestrings/zhcn"
+data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="translate-strings" style="margin-bottom:0px">
+ 4. 翻译界面字符串和其他资源
+ </h2>
+
+
+</div>
+
+<p>
+ 将应用的界面字符串和资源翻译为目标语言是本地化过程中的关键阶段,需要给予最多关注并做出规划。
+</p>
+
+<p>
+ 我们建议你与专业翻译人员合作(请参阅<a href="{@docRoot}distribute/tools/localization-checklist.html#gp-trans">聘请专业翻译公司</a>),以确保获得高品质的翻译,提升应用的价值。你也可以选择机器翻译,但用户体验不如人工翻译。
+</p>
+
+<h4>
+ <strong>准备翻译</strong>
+</h4>
+
+<p>
+ 翻译工作的质量在一定程度上取决于你为翻译提供的源资料,因此请确保你的 strings.xml 文件条理清晰、注释完善,而且完全准确。
+</p>
+
+<p>
+ 以下是一些在翻译之前准备字符串的方法:
+</p>
+
+<ul>
+ <li>
+ <p>
+ 确保字符串格式的正确性和一致性。
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 遵循上文<a href="{@docRoot}distribute/tools/localization-checklist.html#manage-strings">管理字符串的本地化</a>中列出的有关字符串的建议。
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 清理 strings.xml 文件,删除不用的字符串。
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 在文件中加入注释,以标识所有者、来源和文件版本,以及针对翻译人员的特别说明。
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 提供现有翻译(如果有的话),用 zip 文件或其他文件包发送给翻译人员。
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 标识需要翻译的图形内容或其他资源,并将它们加入给翻译人员的文件包中。
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 此外,考虑翻译你的应用在 Google Play 商店的商品详情(应用标题和说明、发行说明等)以及其他国际化营销资料。
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 创建术语表,用来解释你的产品、市场或所用重要技术中出现的关键术语的含义和用途。将列表添加到给翻译人员的文件包中。
+ </p>
+ </li>
+</ul>
+
+<h4>
+ <strong>发送字符串进行翻译</strong>
+</h4>
+
+<p>
+ 在开发阶段的初期,你就可以与专业的翻译供应商联系,商定费用和周转时间,而且你的费用应该包含多次反复工作的费用。你可以寻找在线翻译供应商或直接使用 Google Play 开发者控制台提供的翻译服务(请参阅<a href="{@docRoot}distribute/tools/localization-checklist.html#gp-trans">聘请专业翻译公司</a>)。
+</p>
+
+<p>
+ 翻译完成后,请进行初步检查。查看所有文件是否均已翻译,是否存在潜在编码问题,并确保声明格式未被破坏。
+</p>
+
+<p>
+ 如果一切正常,请小心地将已本地化的目录和文件移回应用的资源中。请务必使用正确的语言和语言区域限定符标记目录,以便以后能够正确加载这些目录。
+</p>
+
+<p>
+ 在将翻译合并到你的应用之后,请开始<a href="{@docRoot}distribute/tools/localization-checklist.html#test">测试已本地化的应用</a>。
+</p>
+
+<h4 id="gp-trans">
+ <strong>通过 Google Play 聘请专业翻译公司</strong>
+</h4>
+
+<p>
+ Google Play 应用翻译服务可以帮助你为应用快速寻找和购买翻译服务。在开发者控制台中,你可以浏览已由 Google 认证的第三方供应商列表,这些供应商能够以有竞争力的价格为你提供高品质的翻译。你可以上传要翻译的字符串,选择翻译的目标语言,并根据时间和价格选择翻译供应商。
+</p>
+
+<p>
+ 购买翻译之后,你会收到来自供应商的电子邮件。这是你与供应商之间的直接业务往来,你需要直接与供应商合作,管理翻译流程并解决所有支持问题。
+</p>
+
+<div>
+ <img src="{@docRoot}images/gp-localization-trans-0.png" class="border-img">
+</div>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query=
+"collection:distribute/toolsreference/localizationchecklist/translatestrings"
+data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="test" style="margin-bottom:0px">
+ 5. 测试已本地化的应用
+ </h2>
+
+
+</div>
+
+<p>
+ 收到翻译的字符串和资源并放入应用之后,你需要对应用进行测试,确保应用能够向国际用户发布。
+</p>
+
+<p>
+ 人工测试可以帮助你发现布局和字符串中的本地化问题,这些问题可能影响用户满意度,最终影响应用的用户评分。
+</p>
+
+<h4>
+ <strong>设置测试环境</strong>
+</h4>
+
+<p>
+ 要测试已本地化的应用,你需要根据你的目标市场和适配设备,设置包含多种设备(或虚拟设备)和屏幕尺寸的测试环境。请注意,不同地区可用的设备可能不同。如果可能,请将你的测试设备设置为用户能够使用的实际设备。
+</p>
+
+<h4>
+ <strong>查找常见的本地化问题</strong>
+</h4>
+
+<p>
+ 在每台测试设备上,在“设置”中设定语言或语言区域。安装并启动应用,然后浏览所有界面流程、对话框和用户互动。在需要输入内容的部分输入文本。要查找的内容包括:
+</p>
+
+<ul>
+ <li>
+ <p>
+ 截断的文本,或者与界面元素或屏幕边缘重叠的文本
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 不合理的换行
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 错误的字词中断或标点符号错误
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 错误的字母顺序排序
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 错误的布局方向或文字方向
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 未翻译的文本。如果显示的是默认字符串而不是翻译过的字符串,那么你可能忽略了这些字符串的翻译或是使用了错误的语言限定符标记了资源目录。
+ </p>
+ </li>
+</ul>
+
+<p>
+ 如果翻译后的字符串变得过于臃肿,不能适应布局,建议你尝试简化默认文本、简化译文文本或调整默认布局。如果问题仍然不能解决,请为该语言创建自定义布局。
+</p>
+
+<h4>
+ <strong>测试默认资源</strong>
+</h4>
+
+<p>
+ 使用所有目标语言和语言区域测试应用之后,请务必使用不支持的语言和语言区域再次测试。<em></em>这有助于确保你的应用包括完整的默认字符串和资源,可供所有用户使用,不论用户设置了哪种首选语言。
+</p>
+
+<h4>
+ <strong>邀请母语使用者进行复查</strong>
+</h4>
+
+<p>
+ 在测试过程中或之后,建议你邀请相应的母语使用者对本地化的应用进行复查。一种方法是让目标地区的用户进行 Beta 版测试,Google Play 可以帮助你开展这项工作。<!-- --></p>
+
+
+<div class="headerLine">
+ <h2 id="prepare-launch" style="margin-bottom:0px">
+ 6. 准备国际化发布
+ </h2>
+
+
+</div>
+
+<p>
+ 翻译应用是本地化过程中的关键部分,但是要让你的产品吸引用户、获得关注,你应该做好在目标国家/地区发布应用的准备,并针对国际用户制定更广泛的发布和营销计划。
+</p>
+
+<h4>
+ <strong>本地化你的 Google Play 商品详情</strong>
+</h4>
+
+<div class="sidebox-wrapper" style="float:right">
+ <div class="sidebox">
+ <h2>
+ 本地化你的 Google Play 商品详情
+ </h2>
+
+ <p>
+ Google Play 商店的商品详情是国际用户对你应用的第一印象。你应该向所有用户重点介绍应用的优势!在开发者控制台中本地化商品详情时,需要本地化的内容包括:</p>
+
+ <ul>
+ <li>应用标题和说明
+ </li>
+
+ <li>应用在手机和平板电脑上的屏幕截图
+ </li>
+
+ <li>宣传图片和视频
+ </li>
+ </ul>
+ </div>
+</div>
+
+<p>
+ 如果你想让应用在国际市场中取得成功,则务必要本地化你的 Google Play 商品详情。你可以在开发者控制台中管理已本地化的商品详情。
+</p>
+
+<p>
+ 在发布之前,请决定你的应用标题、说明、宣传文字、营销主题和计划以及其他文字和图片。请提早发送你的商品详情文字和图片进行翻译,确保这些内容在 Beta 版测试开始时就准备就绪。收到译文后,你可以通过开发者控制台添加译文。
+</p>
+
+<div class="sidebox-wrapper" style="float:right">
+ <div class="sidebox">
+ <h2>
+ Google Play 中的商品详情翻译
+ </h2>
+
+ <p>
+ 你可以使用 Google Play 上的应用翻译服务翻译你的商品详情。准备包含商品详情信息的 XML 文件,并像上传 strings.xml 文件一样上传此文件(请参阅<a href="{@docRoot}distribute/tools/localization-checklist.html#gp-trans">聘请专业翻译公司</a>)
+ </p>
+ </div>
+</div>
+
+<p>
+ 另外,你已经创建了优秀的本地化应用,那么就应该让用户知晓。截取各个语言版本的界面在手机和平板电脑(7 英寸和 10 英寸)上的截图。你可以将所有目标语言版本的屏幕截图上传到开发者控制台。这对于使用其他语言浏览你的应用商品详情的用户来说有很重要的参考价值。
+</p>
+
+<p>
+ 你还有必要准备本地化版本的宣传图片和视频。例如,你应用的置顶大图可能包括应该翻译的文字,翻译之后能达到最佳效果,或者你可能希望在某个国家/地区呈现与众不同的视觉效果。你可以为每种目标语言创建相应版本的宣传图片,并将它们上传到开发者控制台。如果你提供宣传视频,则可以创建本地化版本的视频,然后添加指向各目标语言版本的视频的链接。
+</p>
+
+<h4>
+ <strong>在主要国家/地区计划 Beta 版的发布</strong>
+</h4>
+
+<div class="sidebox-wrapper" style="float:right">
+ <div class="sidebox">
+ <h2>
+ 简单的 Beta 测试
+ </h2>
+
+ <p>
+ 现在,Google Play 允许你在世界范围内设立 Alpha 版和 Beta 版测试者小组。下次登录到开发者控制台时请别忘记了解这一强大的功能。
+ </p>
+ </div>
+</div>
+
+<p>
+ 在发布应用之前收集用户的真实反馈是很有必要的做法,特别是使用新的语言、在新的国家或地区发布应用时,应该收集更多反馈。在这种情况下,我们强烈建议你向主要目标市场的用户发布应用的预览版本,以便这些用户能够方便地向你提供反馈和报告错误。
+</p>
+
+<p>
+ Google Play 可以帮助你为应用设置 Beta 测试计划。登录到开发者控制台并上传你的 APK 之后,你可以设立用户小组,以便进行应用的 Alpha 版和 Beta 版测试。你可以先进行小范围的 Alpha 版测试,然后推进到更大范围的 Beta 版测试。
+</p>
+
+<p>
+ 用户被添加到小组之后,他们可以访问你应用的商品详情并安装应用。<strong>Alpha 或 Beta 版本的用户不能留下评论或评分</strong>,因此你在 Google Play 上的<strong>评分不会受到不利影响</strong>,不过这意味着你需要为测试者设置一种机制以便他们提供反馈:不妨创建一个 <a href="http://www.google.com/+/business/">Google+</a> 页面或 <a href="https://groups.google.com/forum/#!overview">Google 网上论坛</a>。
+</p>
+
+<p>
+ 收到的反馈可以帮助你调整界面、翻译和商品详情,以确保为用户提供优质体验。
+</p>
+
+<h4>
+ <strong>计划国际化营销</strong>
+</h4>
+
+<p>
+ 为了在更多国家/地区获得最高的关注度,请考虑制定国际化营销或广告计划。计划的覆盖范围取决于你能支持的预算,但一般来说,在发布时和发布后针对特定国家/地区开展营销是经济、高效的措施。
+</p>
+
+<h4>
+ <strong>创建本地化的 Google Play 徽章</strong>
+</h4>
+
+<p>
+ 如果你正在准备国际化营销,请务必加入<a href="{@docRoot}distribute/tools/promote/badges.html">本地化的 Google Play 徽章</a>,让用户知道你是在 Google Play 上发布应用的。你可以使用徽章生成器快速构建本地化的徽章,然后用到你的网站或营销材料中。你还可以获得高分辨率的资源。
+</p>
+
+<h4>
+ <strong>创建本地化的 Device Art</strong>
+</h4>
+
+<p>
+ 如果你有应用在 Android 设备上运行的产品截图,请确保这些截图拥有精美外观,能够反映应用在 Android 设备上的最新状态。为帮助你准备高品质的营销材料,请使用 <a href="{@docRoot}distribute/tools/promote/device-art.html">Device Art Generator</a>,只需拖放即可快速获得在 Nexus 设备上的屏幕截图。
+</p>
+
+<h4>
+ <strong>查看你的优化提示</strong>
+</h4>
+
+<p>
+ 在准备发布时,请务必登录到开发者控制台,查看为你的应用提供的“优化提示”。通过优化提示,你可以了解本地化的商品详情是否有所遗漏,还可以获得其他有用的提示,帮助你实现成功的本地化发布。
+</p>
+
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query=
+"collection:distribute/toolsreference/localizationchecklist/preplaunch/zhcn"
+data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3"
+data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="support-users" style="margin-bottom:0px">
+ 7. 在发布后为国际用户提供支持
+ </h2>
+
+
+</div>
+
+<p>
+ 在国际范围内发布应用之后,你应该准备好为各种语言和时区的用户提供支持。能为国际用户提供什么样的支持取决于你的预算,不过你至少要在发布后认真查看应用获得的评分、评论和下载统计信息。
+</p>
+
+<p>
+ 以下是一些建议:
+</p>
+
+<ul>
+ <li>
+ <p>
+ 使用开发者控制台中的应用统计信息比较不同语言和国家/地区的下载量、安装量、卸载量和评分。如果某些语言或国家/地区的下载量和评分相对落后,请考虑采取一些措施来改善你的产品或改变营销方法。
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 定期查看评论。Google Play 会为你翻译所有用户评论,因此你可以及时了解国际用户对应用的评价,以及用户喜欢的功能和困扰他们的问题。通过查看评论,你可以发现可能影响特定国家/地区用户的技术问题,然后进行修正并更新你的应用。
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 尽可能回复评论。使用用户的语言或通用语言与用户互动是一种很好的做法。如果不可行,你可以尝试使用翻译工具,不过效果可能会打折扣。如果你应用的某种语言版本十分受欢迎,请考虑由该语言的母语使用者帮助你为用户提供支持。
+ </p>
+ </li>
+
+ <li>
+ <p>
+ 确保提供链接,让用户能够转到你网站上的所有支持资源。考虑建立按语言分组的用户小组、Google+ 社区或其他支持论坛。
+ </p>
+ </li>
+</ul>
+
+<p>
+ 按照这里介绍的做法本地化你的应用、向国际用户宣传和营销你的应用,并为用户提供持续的支持,你的应用就能吸引很多新用户并始终赢得他们的青睐。
+</p>
+
+<p>
+ 请务必阅读<a href="{@docRoot}distribute/tools/launch-checklist.html">发布检查清单</a>,以详细了解如何在 Google Play 上计划、构建和发布你的应用。
+</p>
+<h3 class="rel-resources clearfloat">相关资源</h3>
+
+<div class="resource-widget resource-flow-layout col-13"
+ data-query="collection:distribute/toolsreference/localizationchecklist/supportlaunch/zhcn"
+ data-sortOrder="-timestamp"
+ data-cardSizes="9x3,9x3,6x3,9x3,9x3,9x3"
+ data-maxResults="6"></div>
diff --git a/docs/html-intl/intl/zh-cn/distribute/tools/promote/badges.jd b/docs/html-intl/intl/zh-cn/distribute/tools/promote/badges.jd
new file mode 100644
index 0000000..1c82161
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/distribute/tools/promote/badges.jd
@@ -0,0 +1,278 @@
+page.title=Google Play 徽章生成器
+page.image=/images/gp-badges-set.png
+page.metaDescription=点击几下就可以为你的应用程序构建徽章,或者下载为各种语言本地化的高分辨率徽章资产。
+
+@jd:body
+
+ <p itemprop="description">借助 Google Play 徽章,你可以在在线广告、宣传材料或任何提供应用链接的地方使用 Google 的官方品牌标识,向大众推广你的应用。</p>
+
+ <p>请在下面的表单中输入你应用的应用包名称或发布者名称,选择徽章样式,点击“制作我的徽章”,然后将 HTML 代码粘贴至你的网页内容中。<em></em></p>
+
+ <p>如果你要为应用创建宣传网页,则还应使用 <a href="{@docRoot}distribute/tools/promote/device-art.html">Device Art Generator</a>,以方便快捷地将应用截图嵌入到设备效果图中。</p>
+
+ <p>有关 Google Play 徽章及其他品牌资源的使用指南,请参阅<a href="{@docRoot}distribute/tools/promote/brand.html#brand-google_play">品牌指南</a>。</p>
+
+ <style type="text/css">form.button-form {
+ margin-top: 2em;
+}
+/* the label and input elements are blocks that float left in order to keep the left edgets of the input aligned, and IE 6/7 do not fully support 22inline-block 22 */
+label.block {
+ display: block;
+ float: left;
+ width: 100px;
+ padding-right: 10px;
+}
+input.text {
+ display: block;
+ float: left;
+ width: 250px;
+}
+div.button-row {
+ white-space: nowrap;
+ min-height: 80px;
+}
+div.button-row input {
+ vertical-align: middle;
+ margin: 0 5px 0 0;
+}
+#jd-content div.button-row img {
+ margin: 0;
+ vertical-align: middle;
+}
+</style>
+
+ <script type="text/javascript">
+
+ // locales for which we have the 'app' badge
+ var APP_LANGS = ['it','pt-br','pt-pt','nl','ko','ja','fr','es','es-419','en','de'];
+
+ // variables for creating 'try it out' demo button
+ var imagePath = "/images/brand/"
+ var linkStart = "<a href=\"https://play.google.com/store/";
+ var imageStart = "\">\n"
+ + " <img alt=\"";
+ // leaves opening for the alt text value
+ var imageSrc = "\"\n src=\"" + imagePath;
+ // leaves opening for the image file name
+ var imageEnd = ".png\" />\n</a>";
+
+ // variables for creating code snippet
+ var linkStartCode = "<a href=\"https://play.google.com/store/";
+ var imageStartCode = "\">\n"
+ + " <img alt=\"";
+ // leaves opening for the alt text value
+ var imageSrcCode = "\"\n src=\"" + imagePath;
+ // leaves opening for the image file name
+ var imageEndCode = ".png\" />\n</a>";
+
+ /** Generate the HTML snippet and demo based on form values */
+ function buildButton(form) {
+ var lang = $('#locale option:selected').val();
+ var selectedValue = lang + $('form input[type=radio]:checked').val();
+ var altText = selectedValue.indexOf("generic") != -1 ? "Get it on Google Play" : "Android app on Google Play";
+
+ if (form["package"].value != "com.example.android") {
+ $("#preview").show();
+ var packageName = escapeHTML(form["package"].value);
+ $("#snippet").show().html(linkStartCode + "apps/details?id=" + packageName
+ + imageStartCode + altText + imageSrcCode
+ + selectedValue + imageEndCode);
+ $("#button-preview").html(linkStart + "apps/details?id=" + packageName
+ + imageStart + altText + imageSrc
+ + selectedValue + imageEnd);
+
+ // Send the event to Analytics
+ ga('send', 'event', 'Distribute', 'Create Google Play Badge', 'Package ' + selectedValue);
+ } else if (form["publisher"].value != "Example, Inc.") {
+ $("#preview").show();
+ var publisherName = escapeHTML(form["publisher"].value);
+ $("#snippet").show().html(linkStartCode + "search?q=pub:" + publisherName
+ + imageStartCode + altText + imageSrcCode
+ + selectedValue + imageEndCode);
+ $("#button-preview").html(linkStart + "search?q=pub:" + publisherName
+ + imageStart + altText + imageSrc
+ + selectedValue + imageEnd);
+
+ // Send the event to Analytics
+ ga('send', 'event', 'Distribute', 'Create Google Play Badge', 'Publisher ' + selectedValue);
+ } else {
+ alert("Please enter your package name or publisher name");
+ }
+ return false;
+ }
+
+ /** Listen for Enter key */
+ function onTextEntered(event, form, me) {
+ // 13 = enter
+ if (event.keyCode == 13) {
+ buildButton(form);
+ }
+ }
+
+ /** When input is focused, remove example text and disable other input */
+ function onInputFocus(object, example) {
+ if (object.value == example) {
+ $(object).val('').css({'color' : '#000'});
+ }
+ $('input[type="text"]:not(input[name='+object.name+'])',
+ object.parentNode).attr('disabled','true');
+ $('#'+object.name+'-clear').show();
+ }
+
+ /** When input is blured, restore example text if appropriate and enable other input */
+ function onInputBlur(object, example) {
+ if (object.value.length < 1) {
+ $(object).attr('value',example).css({'color':'#ccc'});
+ $('input[type="text"]', object.parentNode).removeAttr('disabled');
+ $('#'+object.name+'-clear').hide();
+ }
+ }
+
+ /** Clear the form to start over */
+ function clearLabel(id, example) {
+ $("#preview").hide();
+ $('#'+id+'').html('').attr('value',example).css({'color':'#ccc'});
+ $('input[type="text"]', $('#'+id+'').parent()).removeAttr('disabled');
+ $('#'+id+'-clear').hide();
+ return false;
+ }
+
+ /** Switch the badge urls for selected language */
+ function changeBadgeLang() {
+ var lang = $('#locale option:selected').val();
+
+ // check if we have the 'app' badge for this lang and show notice if not
+ $("div.button-row.error").remove(); // remove any existing instance of error message
+ if ($.inArray(lang,APP_LANGS) == -1) {
+ $("div.button-row.app").hide();
+ $("div.button-row.app").after('<div class="button-row error"><p class="note" style="margin:1em 0 -1em">'
+ + 'Sorry, we currently don\'t have the '
+ + '<em>Android app on Google Play</em> badge translated for '
+ + $("select#locale option[value="+lang+"]").attr("title")
+ + '.<br>Please check back later or instead use the <em>Get it on Google Play</em> badge below.'
+ + '</p></div>');
+ } else {
+ $("div.button-row.app").show(); // show the 'app' badge row
+ }
+
+ $('.button-row img').each(function() {
+ var id = $(this).parent().attr('for');
+ var imgName = lang + $('input#'+id).attr('value') + '.png';
+ var lastSlash = $(this).attr('src').lastIndexOf('/');
+ var imgPath = $(this).attr('src').substring(0, lastSlash+1);
+ $(this).attr('src', imgPath + imgName);
+ });
+ }
+
+ /** When the doc is ready, find the inputs and color the input grey if the value is the example
+ text. This is necessary to handle back-navigation, which can auto-fill the form with previous
+ values (and text should not be grey) */
+ $(document).ready(function() {
+ $(".button-form input.text").each(function(index) {
+ if ($(this).val() == $(this).attr("default")) {
+ $(this).css("color","#ccc");
+ } else {
+ /* This is necessary to handle back-navigation to the page after form was filled */
+ $('input[type="text"]:not(input[name='+this.name+'])',
+ this.parentNode).attr('disabled','true');
+ $('#'+this.name+'-clear').show();
+ }
+ });
+ });
+
+ </script>
+
+ <form class="button-form">
+ <label class="block" for="locale">语言:</label>
+ <select id="locale" style="display:block;float:left;margin:0" onchange="changeBadgeLang()">
+ <option title="南非荷兰语" value="af">Afrikaans</option>
+ <option title="阿拉伯语" value="ar">العربية</option>
+ <option title="白俄罗斯语" value="be">Беларуская</option>
+ <option title="保加利亚语" value="bg">Български</option>
+ <option title="加泰罗尼亚语" value="ca">Català</option>
+ <option title="中文(中国)" value="zh-cn">中文(中国)</option>
+ <option title="中文(香港)" value="zh-hk">中文(香港)</option>
+ <option title="中文(台湾)" value="zh-tw">中文(台灣)</option>
+ <option title="克罗地亚语" value="hr">Hrvatski</option>
+ <option title="捷克语" value="cs">Česky</option>
+ <option title="丹麦语" value="da">Dansk</option>
+ <option title="荷兰语" value="nl">Nederlands</option>
+ <option title="爱沙尼亚语" value="et">Eesti</option>
+ <option title="波斯语" value="fa">فارسی</option>
+ <option title="菲律宾语" value="fil">Tagalog</option>
+ <option title="芬兰语" value="fi">Suomi</option>
+ <option title="法语" value="fr">Français</option>
+ <option title="德语" value="de">Deutsch</option>
+ <option title="希腊语" value="el">Ελληνικά</option>
+ <option title="英语" value="en" selected="">English</option>
+ <!--
+ <option title="希伯来语" value="iw-he">עברית</option>
+ -->
+ <option title="匈牙利语" value="hu">Magyar</option>
+ <option title="印度尼西亚语" value="id-in">Bahasa Indonesia</option>
+ <option title="意大利语" value="it">Italiano</option>
+ <option title="日语" value="ja">日本語</option>
+ <option title="韩语" value="ko">한국어</option>
+ <option title="拉脱维亚语" value="lv">Latviešu</option>
+ <option title="立陶宛语" value="lt">Lietuviškai</option>
+ <option title="马来语" value="ms">Bahasa Melayu</option>
+ <option title="挪威语" value="no">Norsk (bokmål)</option>
+ <option title="波兰语" value="pl">Polski</option>
+ <option title="葡萄牙语(巴西)" value="pt-br">Português (Brasil)</option>
+ <option title="葡萄牙语(葡萄牙)" value="pt-pt">Português (Portugal)</option>
+ <option title="罗马尼亚语" value="ro">Română</option>
+ <option title="俄语" value="ru">Русский</option>
+ <option title="塞尔维亚语" value="sr">Српски / srpski</option>
+ <option title="斯洛伐克语" value="sk">Slovenčina</option>
+ <option title="斯洛文尼亚语" value="sl">Slovenščina</option>
+ <option title="西班牙语(西班牙)" value="es">Español (España)</option>
+ <option title="西班牙语(拉丁美洲)" value="es-419">Español (Latinoamérica)</option>
+ <option title="瑞典语" value="sv">Svenska</option>
+ <option title="斯瓦希里语" value="sw">Kiswahili</option>
+ <option title="泰语" value="th">ไทย</option>
+ <option title="土耳其语" value="tr">Türkçe</option>
+ <option title="乌克兰语" value="uk">Українська</option>
+ <option title="越南语" value="vi">Tiếng Việt</option>
+ <option title="祖鲁语" value="zu">isiZulu</option>
+ </select>
+ <p style="clear:both;margin:0"> </p>
+ <label class="block" for="package" style="clear:left"> 应用包名称:
+</label>
+ <input class="text" type="text" id="package" name="package" value="com.example.android" default="com.example.android" onfocus="onInputFocus(this, 'com.example.android')" onblur="onInputBlur(this, 'com.example.android')" onkeyup="return onTextEntered(event, this.parentNode, this)" />
+ <a id="package-clear" href="#" onclick="return clearLabel('package','com.example.android');">清除</a>
+ <p style="clear:both;margin:0"> <em>或</em></p>
+ <label class="block" style="margin-top:5px" for="publisher"> 发布者名称:
+</label>
+ <input class="text" type="text" id="publisher" name="publisher" value="Example, Inc." default="Example, Inc." onfocus="onInputFocus(this, 'Example, Inc.')" onblur="onInputBlur(this, 'Example, Inc.')" onkeyup="return onTextEntered(event, this.parentNode, this)" />
+ <a id="publisher-clear" href="#" onclick="return clearLabel('publisher','Example, Inc.');">清除</a>
+ <br /><br />
+
+
+ <div class="button-row app">
+ <input type="radio" name="buttonStyle" value="_app_rgb_wo_45" id="ws" />
+ <label for="ws"><img src="{@docRoot}images/brand/en_app_rgb_wo_45.png" alt="即刻获取 Android 应用 Google Play(小图标)" /></label>
+
+ <input type="radio" name="buttonStyle" value="_app_rgb_wo_60" id="wm" />
+ <label for="wm"><img src="{@docRoot}images/brand/en_app_rgb_wo_60.png" alt="即刻获取 Android 应用 Google Play(大图标)" /></label>
+ </div>
+
+ <div class="button-row">
+ <input type="radio" name="buttonStyle" value="_generic_rgb_wo_45" id="ns" checked="" />
+ <label for="ns"><img src="{@docRoot}images/brand/en_generic_rgb_wo_45.png" alt="即刻获取 Google Play(小图标)" /></label>
+
+ <input type="radio" name="buttonStyle" value="_generic_rgb_wo_60" id="nm" />
+ <label for="nm"><img src="{@docRoot}images/brand/en_generic_rgb_wo_60.png" alt="即刻获取 Google Play(大图标)" /></label>
+ </div>
+
+ <input class="button" type="button" value="制作我的徽章" style="padding:10px" onclick="return buildButton(this.parentNode);" />
+ <br />
+ </form>
+
+ <div id="preview">
+ <p>请复制以下 HTML 代码并将其粘贴到你的网站上:</p>
+ <textarea id="snippet" cols="100" rows="5" style="font-family:monospace;background-color:#efefef;padding:5px;margin-bottom:1em" onclick="this.select()"></textarea>
+
+ <p>试试以下内容:</p>
+ <div id="button-preview" style="margin-top:1em"></div>
+ </div>
+
diff --git a/docs/html-intl/intl/zh-cn/distribute/tools/promote/brand.jd b/docs/html-intl/intl/zh-cn/distribute/tools/promote/brand.jd
new file mode 100644
index 0000000..065673e
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/distribute/tools/promote/brand.jd
@@ -0,0 +1,148 @@
+page.title=品牌指南
+page.image=/assets/images/resource-card-default-android.jpg
+page.metaDescription=关于Android 和 Goolge Play 品牌的指南和下载。
+
+@jd:body
+
+ <p>我们建议你在 Android 应用的宣传资料中使用 Android 和 Google Play 品牌。只要你遵循相关指南,就可以使用本页中的图标和其他资源。</p>
+
+ <p>对 Android 或 Google Play 品牌的使用必须经过 Android 合作伙伴营销小组的审核。请使用 <a href="https://docs.google.com/forms/d/1YE5gZpAAcFKjYcUddCsK1Bv9a9Y-luaLVnkazVlaJ2w/viewform">Android 和 Google Play 品牌权限咨询表单</a>提交你的营销资料以供审核。</p>
+
+ <h2 id="brand-android">Android</h2>
+
+ <p>以下是关于 Android 品牌和相关资源的指南。</p>
+
+
+ <h4 style="clear:right">在文本中使用 Android</h4>
+
+ <div style="float:right;clear:right;width:200px;margin:0 0 20px 30px">
+ <img alt="" src="{@docRoot}images/brand/mediaplayer.png" />
+ </div>
+ <ul>
+ <li>Android™ 首次出现在广告素材中时应标注商标符号。</li>
+ <li>Android 应始终采用大写形式,且一律不得使用复数或所有格形式。</li>
+ <li>“Android”不能在应用或配套产品(包括手机、平板电脑、电视、扬声器、耳机、手表及其他设备)的名称中使用。不过,你可以使用“for Android”。
+ <ul>
+ <li><span style="color:red">不正确</span>:“Android MediaPlayer”</li>
+ <li><span style="color:green">正确</span>:“MediaPlayer for Android”</li>
+ </ul>
+ <p>如果与你的徽标一起使用,则“for Android”不应超过徽标大小的 90%。这种用法第一次出现时,后面应标注 TM 符号,即“for Android™”。</p>
+ </li>
+ <li>如果后跟一个合适的通称,Android 可以用作描述词(即用“Android”表达“Android 平台”的意思)。
+ <ul>
+ <li><span style="color:red">不正确</span>:“Android MediaPlayer”或“Android XYZ 应用”</li>
+ <li><span style="color:green">正确</span>:“Android 功能”或“Android 应用”</li>
+ </ul>
+ </li>
+ </ul>
+
+ <p>每次使用 Android 名称时,你的资料中都应注明以下归属信息:</p>
+ <blockquote><em>Android 是 Google Inc. 的商标。</em></blockquote>
+
+
+ <h4>Android 机器人</h4>
+
+ <div style="float:right;width:200px;margin-left:30px">
+ <img alt="" src="{@docRoot}images/brand/Android_Robot_100.png" style="margin-left:50px" />
+ <p style="text-align:center">
+ <a href="{@docRoot}images/brand/Android_Robot_100.png">100x118</a> |
+ <a href="{@docRoot}images/brand/Android_Robot_200.png">200x237</a><br />
+ <a href="{@docRoot}downloads/brand/Android_Robot_outlined.ai">Illustrator 文件 (.ai)</a></p>
+ </div>
+
+ <p>你可以在营销资料中随意使用、复制和修改 Android 机器人。对于印刷版本,Android 机器人的颜色值为 PMS 376C;对于在线版本,请使用十六进制颜色 <span style="color:#a4c639">#A4C639</span>。</p>
+
+ <p>在使用 Android 机器人或其变体形式时,请遵循<a href="http://creativecommons.org/licenses/by/3.0/">知识共享署名 3.0 </a>许可的条款使用正确的归属信息:</p>
+
+ <blockquote><em>Android 机器人是在 Google 原创及共享成果的基础上再创作或修改而成,须遵照知识共享署名 3.0 许可所述条款付诸应用。</em></blockquote>
+
+ <p>你不得通过将 Android 机器人徽标或其变体形式加入自己的公司徽标或商家名称,来提出商标申请。我们希望确保 Android 机器人可供所有人使用。</p>
+
+
+ <h4 style="clear:right">Android 徽标</h4>
+
+ <div style="float:right;width:210px;margin-left:30px">
+ <img alt="" src="{@docRoot}images/brand/android_logo_no.png" />
+ </div>
+
+ <p>不得使用 Android 徽标。</p>
+
+ <p>不得使用 Android 徽标专用的字体。</p>
+
+ <h2 id="brand-google_play">Google Play</h2>
+
+
+ <p>以下是关于 Google Play 品牌和相关资源的指南。</p>
+
+ <h4>在文本中使用 Google Play</h4>
+
+ <p>在文本中,请务必为首次出现或位于显著位置的 Google Play™ 加上 TM 符号。</p>
+
+ <p>在提及移动设备体验时,除非相应文本中是很明显的说明性内容,否则请使用“Google Play”。例如,营销资料的标题可以是“从 Google Play™ 下载我们的游戏”,但是说明性内容可以是“使用 Google Play™ 商店应用下载我们的游戏”。
+
+ <p>每次使用 Google Play 名称或图标时,你的资料中都应注明以下归属信息:</p>
+
+ <blockquote><em>Google Play 是 Google Inc. 的商标。</em></blockquote>
+
+
+ <div style="float:right;width:96px;margin-left:30px">
+ <img src="{@docRoot}images/brand/Google_Play_Store_96.png" alt="" />
+ <p style="text-align:center">
+ <a href="{@docRoot}images/brand/Google_Play_Store_48.png">48x48</a> |
+ <a href="{@docRoot}images/brand/Google_Play_Store_96.png">96x96</a><br />
+ <a href="{@docRoot}images/brand/Google_Play_Store_600.png">600x576</a>
+ </p>
+ </div>
+
+ <h4>Google Play 商店图标</h4>
+
+ <p>你可以使用 Google Play 商店图标,但不得修改它。</p>
+
+ <p>如上文所述,在文案中提及 Google Play 商店应用时,请使用全称:“Google Play 商店”。但直接标注 Google Play 商店图标时,可以只使用“Play 商店”,以便与设备上显示的图标标签一致。</p>
+
+
+ <h4>Google Play 徽章</h4>
+
+ <div style="float:right;clear:right;width:172px;margin-left:30px">
+ <img src="{@docRoot}images/brand/en_app_rgb_wo_60.png" alt="" />
+ <p style="text-align:center">
+ <a href="{@docRoot}images/brand/en_app_rgb_wo_45.png">129x45</a> |
+ <a href="{@docRoot}images/brand/en_app_rgb_wo_60.png">172x60</a></p>
+ </div>
+
+ <div style="float:right;clear:right;width:172px;margin-left:30px">
+ <img src="{@docRoot}images/brand/en_generic_rgb_wo_60.png" alt="" />
+ <p style="text-align:center">
+ <a href="{@docRoot}images/brand/en_generic_rgb_wo_45.png">129x45</a> |
+ <a href="{@docRoot}images/brand/en_generic_rgb_wo_60.png">172x60</a></p>
+ </div>
+
+ <p>你可以在网站和宣传资料中使用“即刻获取 Google Play”和“即刻获取 Android 应用 Google Play”徽标作为徽章,以指向你在 Google Play 上的商品。你也可以使用其他 Google Play 徽章格式,以及用于音乐、图书、杂志、电影和电视节目的徽章。要申请这些徽章,请使用 <a href="https://docs.google.com/forms/d/1YE5gZpAAcFKjYcUddCsK1Bv9a9Y-luaLVnkazVlaJ2w/viewform">Android 和 Google Play 品牌权限咨询表单</a>。</p>
+
+ <ul>
+ <li>请不要修改徽章图片的颜色、比例、间距或其他任何方面。
+ </li>
+ <li>当与其他应用市场的徽标一起使用时,Google Play 徽标尺寸不应小于这些徽标的尺寸。</li>
+ <li>在线使用时,徽章应链接至以下内容之一:
+ <ul>
+ <li>由你发布的商品的列表,例如:<br />
+ <span style="margin-left:1em">http://play.google.com/store/search?q=publisherName<em></em></span>
+ </li>
+ <li>Google Play 中相应应用的商品详情页,例如:<br />
+ <span style="margin-left:1em">http://play.google.com/store/apps/details?id=packageName<em></em></span>
+ </li>
+ </ul>
+ </li>
+ </ul>
+
+ <p>要快速创建链接至你在 Google Play 上的应用的徽章,请使用 <a href="{@docRoot}distribute/tools/promote/badges.html">Google Play 徽章生成器</a>(支持 40 多种语言)。</p>
+
+ <p>要创建自定义尺寸的徽章,请下载<a href="{@docRoot}distribute/tools/promote/badge-files.html">支持 40 多种语言的 Google Play 徽章</a>的 Adobe® Illustrator® (.ai) 文件。</p>
+
+ <p>要详细了解如何链接至 Google Play 中的商品详情页,请参阅<a href="{@docRoot}distribute/tools/promote/linking.html">链接至你的商品</a>。</p>
+
+ <h2 id="Marketing_Review">营销审核和品牌咨询</h2>
+
+ <p>请使用 <a href="https://docs.google.com/forms/d/1YE5gZpAAcFKjYcUddCsK1Bv9a9Y-luaLVnkazVlaJ2w/viewform">Android 和 Google Play 品牌权限咨询表单</a>提交相关的营销审核或品牌咨询。一般情况下,我们至少需要一周时间才能做出回复。</p>
+
+ </p>
diff --git a/docs/html-intl/intl/zh-cn/distribute/tools/promote/device-art.jd b/docs/html-intl/intl/zh-cn/distribute/tools/promote/device-art.jd
new file mode 100644
index 0000000..b6517b3
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/distribute/tools/promote/device-art.jd
@@ -0,0 +1,675 @@
+page.title=Device Art Generator
+page.image=/images/device-art-ex-crop.jpg
+page.metaDescription=为了更好看的宣传图片和改善视觉语境,拖放你的应用程序的屏幕截图到真实设备的图稿。
+
+@jd:body
+
+<p>你可以使用 Device Art Generator 方便快捷地将应用截图嵌入到真实设备的效果图中。这样,当用户在你的网站上或其他宣传材料中看到你的应用截图时,就能更加直观地了解应用的内容环境</p>
+
+ <p class="note"><strong>注意</strong>:请勿将此处生成的图片用作 Google Play 应用商品详情中的 1024x500 置顶大图或屏幕截图</p>
+
+
+
+<div class="supported-browser">
+
+<div class="layout-content-row">
+ <div class="layout-content-col span-3">
+ <h4>第 1 步</h4>
+ <p>将屏幕截图从桌面拖动到右侧的设备上生成效果图。</p>
+ </div>
+ <div class="layout-content-col span-10">
+ <ul class="device-list primary"></ul>
+ <a href="#" id="archive-expando">旧款设备</a>
+ <ul class="device-list archive"></ul>
+ </div>
+</div>
+
+
+
+<div class="layout-content-row">
+ <div class="layout-content-col span-3">
+ <h4>第 2 步</h4>
+ <p>你可以对此效果图进行优化,然后将其拖动到桌面上保存。</p>
+ <p id="frame-customizations">
+ <input type="checkbox" id="output-shadow" checked="checked" class="form-field-checkbutton">
+ <label for="output-shadow">阴影</label><br>
+ <input type="checkbox" id="output-glare" checked="checked" class="form-field-checkbutton">
+ <label for="output-glare">屏幕反光</label><br><br>
+ <a class="button" id="rotate-button">旋转</a>
+ </p>
+ </div>
+ <div class="layout-content-col span-10">
+ <!-- position:relative fixes an issue where dragging an image out of a inline-block container
+ produced no drag feedback image in Chrome 28. -->
+ <div id="output" style="position:relative">无输入图片。</div>
+ </div>
+</div>
+
+</div>
+
+<div class="unsupported-browser" style="display: none">
+ <p class="warning"><strong>错误</strong>:此页面需要使用<span id="unsupported-browser-reason">特定功能</span>才能打开,但你的网络浏览器不支持这些功能。要继续,请在受支持的网络浏览器(如 <strong>Google Chrome</strong>)中打开此页面。</p>
+ <a href="https://www.google.com/chrome/" class="button">下载 Google Chrome</a>
+ <br><br>
+</div>
+
+<style>
+ h4 {
+ text-transform: uppercase;
+ }
+
+ .device-list {
+ padding: 1em 0 0 0;
+ margin: 0;
+ }
+
+ .device-list li {
+ display: inline-block;
+ vertical-align: bottom;
+ margin: 0;
+ margin-right: 20px;
+ text-align: center;
+ }
+
+ .device-list li .thumb-container {
+ display: inline-block;
+ }
+
+ .device-list li .thumb-container img {
+ margin-bottom: 8px;
+ opacity: 0.6;
+
+ -webkit-transition: -webkit-transform 0.2s, opacity 0.2s;
+ -moz-transition: -moz-transform 0.2s, opacity 0.2s;
+ transition: transform 0.2s, opacity 0.2s;
+ }
+
+ .device-list li.drag-hover .thumb-container img {
+ opacity: 1;
+
+ -webkit-transform: scale(1.1);
+ -moz-transform: scale(1.1);
+ transform: scale(1.1);
+ }
+
+ .device-list li .device-details {
+ font-size: 13px;
+ line-height: 16px;
+ color: #888;
+ }
+
+ .device-list li .device-url {
+ font-weight: bold;
+ }
+
+ #archive-expando {
+ display: block;
+ font-size: 13px;
+ font-weight: bold;
+ color: #333;
+ text-transform: uppercase;
+ margin-top: 16px;
+ padding-top: 16px;
+ padding-left: 28px;
+ border-top: 1px solid transparent;
+ background: transparent url({@docRoot}assets/images/styles/disclosure_down.png)
+ no-repeat scroll 0 8px;
+ -webkit-transition: border 0.2s;
+ -moz-transition: border 0.2s;
+ transition: border 0.2s;
+ }
+
+ #archive-expando.expanded {
+ background-image: url({@docRoot}assets/images/styles/disclosure_up.png);
+ border-top: 1px solid #ccc;
+ }
+
+ .device-list.archive {
+ max-height: 0;
+ overflow: hidden;
+ opacity: 0;
+
+ -webkit-transition: max-height 0.2s, opacity 0.2s;
+ -moz-transition: max-height 0.2s, opacity 0.2s;
+ transition: max-height 0.2s, opacity 0.2s;
+ }
+
+ .device-list.archive.expanded {
+ opacity: 1;
+ max-height: 300px;
+ }
+
+ #output {
+ color: #f44;
+ font-style: italic;
+ }
+
+ #output img {
+ max-height: 500px;
+ }
+</style>
+<script>
+ // Global variables
+ var g_currentImage;
+ var g_currentDevice;
+ var g_currentObjectURL;
+ var g_currentBlob;
+
+ // Global constants
+ var MSG_INVALID_INPUT_IMAGE = 'Invalid screenshot provided. Screenshots must be PNG files '
+ + 'matching the target device\'s screen aspect ratio in either portrait or landscape.';
+ var MSG_NO_INPUT_IMAGE = '将屏幕截图(.PNG)从桌面拖动到以上所列设备。';
+ var MSG_GENERATING_IMAGE = 'Generating device art…';
+
+ var MAX_DISPLAY_HEIGHT = 126; // XOOM, to fit into 200px wide
+
+ // Device manifest.
+ var DEVICES = [
+ {
+ id: 'nexus_5',
+ title: 'Nexus 5',
+ url: 'http://www.google.com/nexus/5/',
+ physicalSize: 5,
+ physicalHeight: 5.43,
+ density: 'XXHDPI',
+ landRes: ['shadow', 'back', 'fore'],
+ landOffset: [436,306],
+ portRes: ['shadow', 'back', 'fore'],
+ portOffset: [304,436],
+ portSize: [1080,1920],
+ },
+ {
+ id: 'nexus_6',
+ title: 'Nexus 6',
+ url: 'http://www.google.com/nexus/6/',
+ physicalSize: 6,
+ physicalHeight: 6.27,
+ density: '560DPI',
+ landRes: ['shadow', 'back', 'fore'],
+ landOffset: [489,327],
+ portRes: ['shadow', 'back', 'fore'],
+ portOffset: [327,489],
+ portSize: [1440, 2560],
+ },
+ {
+ id: 'nexus_7',
+ title: 'Nexus 7',
+ url: 'http://www.google.com/nexus/7/',
+ physicalSize: 7,
+ physicalHeight: 8,
+ actualResolution: [1200,1920],
+ density: 'XHDPI',
+ landRes: ['shadow', 'back', 'fore'],
+ landOffset: [326,245],
+ portRes: ['shadow', 'back', 'fore'],
+ portOffset: [244,326],
+ portSize: [800,1280]
+ },
+ {
+ id: 'nexus_9',
+ title: 'Nexus 9',
+ url: 'http://www.google.com/nexus/9/',
+ physicalSize: 9,
+ physicalHeight: 8.98,
+ actualResolution: [1536,2048],
+ density: 'XHDPI',
+ landRes: ['shadow', 'back', 'fore'],
+ landOffset: [514,350],
+ portRes: ['shadow', 'back', 'fore'],
+ portOffset: [348,514],
+ portSize: [1536,2048],
+ },
+ {
+ id: 'nexus_10',
+ title: 'Nexus 10',
+ url: 'http://www.google.com/nexus/10/',
+ physicalSize: 10,
+ physicalHeight: 7,
+ actualResolution: [1600,2560],
+ density: 'XHDPI',
+ landRes: ['shadow', 'back', 'fore'],
+ landOffset: [227,217],
+ portRes: ['shadow', 'back', 'fore'],
+ portOffset: [217,223],
+ portSize: [800,1280],
+ archived: true
+ },
+ {
+ id: 'nexus_7_2012',
+ title: 'Nexus 7 (2012)',
+ url: 'http://www.google.com/nexus/7/',
+ physicalSize: 7,
+ physicalHeight: 7.81,
+ density: '213dpi',
+ landRes: ['shadow', 'back', 'fore'],
+ landOffset: [315,270],
+ portRes: ['shadow', 'back', 'fore'],
+ portOffset: [264,311],
+ portSize: [800,1280],
+ archived: true
+ },
+ {
+ id: 'nexus_4',
+ title: 'Nexus 4',
+ url: 'http://www.google.com/nexus/4/',
+ physicalSize: 4.7,
+ physicalHeight: 5.27,
+ density: 'XHDPI',
+ landRes: ['shadow', 'back', 'fore'],
+ landOffset: [349,214],
+ portRes: ['shadow', 'back', 'fore'],
+ portOffset: [213,350],
+ portSize: [768,1280],
+ archived: true
+ },
+ ];
+
+ DEVICES = DEVICES.sort(function(x, y) { return x.physicalSize - y.physicalSize; });
+
+ var MAX_HEIGHT = 0;
+ for (var i = 0; i < DEVICES.length; i++) {
+ MAX_HEIGHT = Math.max(MAX_HEIGHT, DEVICES[i].physicalHeight);
+ }
+
+ // Setup performed once the DOM is ready.
+ $(document).ready(function() {
+ if (!checkBrowser()) {
+ return;
+ }
+
+ polyfillCanvasToBlob();
+ setupUI();
+
+ // Set up Chrome drag-out
+ $.event.props.push("dataTransfer");
+ document.body.addEventListener('dragstart', function(e) {
+ var target = e.target;
+ if (target.classList.contains('dragout')) {
+ e.dataTransfer.setData('DownloadURL', target.dataset.downloadurl);
+ }
+ }, false);
+ });
+
+ /**
+ * Returns the device from DEVICES with the given id.
+ */
+ function getDeviceById(id) {
+ for (var i = 0; i < DEVICES.length; i++) {
+ if (DEVICES[i].id == id)
+ return DEVICES[i];
+ }
+ return;
+ }
+
+ /**
+ * Checks to make sure the browser supports this page. If not,
+ * updates the UI accordingly and returns false.
+ */
+ function checkBrowser() {
+ // Check for browser support
+ var browserSupportError = null;
+
+ // Must have <canvas>
+ var elem = document.createElement('canvas');
+ if (!elem.getContext || !elem.getContext('2d')) {
+ browserSupportError = 'HTML5 canvas.';
+ }
+
+ // Must have FileReader
+ if (!window.FileReader) {
+ browserSupportError = 'desktop file access';
+ }
+
+ if (browserSupportError) {
+ $('.supported-browser').hide();
+
+ $('#unsupported-browser-reason').html(browserSupportError);
+ $('.unsupported-browser').show();
+ return false;
+ }
+
+ return true;
+ }
+
+ function setupUI() {
+ $('#output').html(MSG_NO_INPUT_IMAGE);
+
+ $('#frame-customizations').hide();
+
+ $('#output-shadow, #output-glare').click(function() {
+ createFrame();
+ });
+
+ // Build device list.
+ $.each(DEVICES, function() {
+ var resolution = this.actualResolution || this.portSize;
+ var scaleFactorText = '';
+ if (resolution[0] != this.portSize[0]) {
+ scaleFactorText = '<br>等比例缩小至' + (100 * (this.portSize[0] / resolution[0])).toFixed(0) +
+ '% 输出';
+ } else {
+ scaleFactorText = '<br> ';
+ }
+
+ $('<li>')
+ .append($('<div>')
+ .addClass('thumb-container')
+ .append($('<img>')
+ .attr('src', '../../../../../distribute/tools/promote/device-art-resources/' + this.id + '/thumb.png')
+ .attr('height',
+ Math.floor(MAX_DISPLAY_HEIGHT * this.physicalHeight / MAX_HEIGHT))))
+ .append($('<div>')
+ .addClass('device-details')
+ .html((this.url
+ ? ('<a class="device-url" href="' + this.url + '">' + this.title + '</a>')
+ : this.title) +
+ '<br>' + this.physicalSize + '" @ ' + this.density +
+ '<br>' + (resolution[0] + 'x' + resolution[1]) + scaleFactorText))
+ .data('deviceId', this.id)
+ .appendTo(this.archived ? '.device-list.archive' : '.device-list.primary');
+ });
+
+ // Set up "older devices" expando.
+ $('#archive-expando').click(function() {
+ if ($(this).hasClass('expanded')) {
+ $(this).removeClass('expanded');
+ $('.device-list.archive').removeClass('expanded');
+ } else {
+ $(this).addClass('expanded');
+ $('.device-list.archive').addClass('expanded');
+ }
+ return false;
+ });
+
+ // Set up drag and drop.
+ $('.device-list li')
+ .live('dragover', function(evt) {
+ $(this).addClass('drag-hover');
+ evt.dataTransfer.dropEffect = 'link';
+ evt.preventDefault();
+ })
+ .live('dragleave', function(evt) {
+ $(this).removeClass('drag-hover');
+ })
+ .live('drop', function(evt) {
+ $('#output').empty().html(MSG_GENERATING_IMAGE);
+ $(this).removeClass('drag-hover');
+ g_currentDevice = getDeviceById($(this).closest('li').data('deviceId'));
+ evt.preventDefault();
+ loadImageFromFileList(evt.dataTransfer.files, function(data) {
+ if (data == null) {
+ $('#output').html(MSG_INVALID_INPUT_IMAGE);
+ return;
+ }
+ loadImageFromUri(data.uri, function(img) {
+ g_currentFilename = data.name;
+ g_currentImage = img;
+ createFrame();
+ // Send the event to Analytics
+ ga('send', 'event', 'Distribute', 'Create Device Art', g_currentDevice.title);
+ });
+ });
+ });
+
+ // Set up rotate button.
+ $('#rotate-button').click(function() {
+ if (!g_currentImage) {
+ return;
+ }
+
+ var w = g_currentImage.naturalHeight;
+ var h = g_currentImage.naturalWidth;
+ var canvas = $('<canvas>')
+ .attr('width', w)
+ .attr('height', h)
+ .get(0);
+
+ var ctx = canvas.getContext('2d');
+ ctx.rotate(-Math.PI / 2);
+ ctx.translate(-h, 0);
+ ctx.drawImage(g_currentImage, 0, 0);
+
+ loadImageFromUri(canvas.toDataURL('image/png'), function(img) {
+ g_currentImage = img;
+ createFrame();
+ });
+ });
+ }
+
+ /**
+ * Generates the frame from the current selections (g_currentImage and g_currentDevice).
+ */
+ function createFrame() {
+ var port;
+
+ var aspect1 = g_currentImage.naturalWidth / g_currentImage.naturalHeight;
+ var aspect2 = g_currentDevice.portSize[0] / g_currentDevice.portSize[1];
+
+ if (aspect1 == aspect2) {
+ port = true;
+ } else if (aspect1 == 1 / aspect2) {
+ port = false;
+ } else {
+ alert('The screenshot must have an aspect ratio of ' +
+ aspect2.toFixed(3) + ' or ' + (1 / aspect2).toFixed(3) +
+ ' (ideally ' + g_currentDevice.portSize[0] + 'x' + g_currentDevice.portSize[1] +
+ ' or ' + g_currentDevice.portSize[1] + 'x' + g_currentDevice.portSize[0] + ').');
+ $('#output').html(MSG_INVALID_INPUT_IMAGE);
+ return;
+ }
+
+ // Load image resources
+ var res = port ? g_currentDevice.portRes : g_currentDevice.landRes;
+ var resList = {};
+ for (var i = 0; i < res.length; i++) {
+ resList[res[i]] = '../../../../../distribute/tools/promote/device-art-resources/' + g_currentDevice.id + '/' +
+ (port ? 'port_' : 'land_') + res[i] + '.png'
+ }
+
+ var resourceImages = {};
+ loadImageResources(resList, function(r) {
+ resourceImages = r;
+ continueWithResources_();
+ });
+
+ function continueWithResources_() {
+ var width = resourceImages['back'].naturalWidth;
+ var height = resourceImages['back'].naturalHeight;
+ var offset = port ? g_currentDevice.portOffset : g_currentDevice.landOffset;
+ var size = port
+ ? g_currentDevice.portSize
+ : [g_currentDevice.portSize[1], g_currentDevice.portSize[0]];
+
+ var canvas = document.createElement('canvas');
+ canvas.width = width;
+ canvas.height = height;
+
+ var ctx = canvas.getContext('2d');
+ if (resourceImages['shadow'] && $('#output-shadow').is(':checked')) {
+ ctx.drawImage(resourceImages['shadow'], 0, 0);
+ }
+ ctx.drawImage(resourceImages['back'], 0, 0);
+ ctx.fillStyle = '#000';
+ ctx.fillRect(offset[0], offset[1], size[0], size[1]);
+ ctx.drawImage(g_currentImage, offset[0], offset[1], size[0], size[1]);
+ if (resourceImages['fore'] && $('#output-glare').is(':checked')) {
+ ctx.drawImage(resourceImages['fore'], 0, 0);
+ }
+
+ window.URL = window.URL || window.webkitURL;
+ if (canvas.toBlob && window.URL.createObjectURL) {
+ if (g_currentObjectURL) {
+ window.URL.revokeObjectURL(g_currentObjectURL);
+ g_currentObjectURL = null;
+ }
+ if (g_currentBlob) {
+ if (g_currentBlob.close) {
+ g_currentBlob.close();
+ }
+ g_currentBlob = null;
+ }
+
+ canvas.toBlob(function(blob) {
+ if (!blob) {
+ continueWithFinalUrl_(canvas.toDataURL('image/png'));
+ return;
+ }
+ g_currentBlob = blob;
+ g_currentObjectURL = window.URL.createObjectURL(blob);
+ continueWithFinalUrl_(g_currentObjectURL);
+ }, 'image/png');
+ } else {
+ continueWithFinalUrl_(canvas.toDataURL('image/png'));
+ }
+ }
+
+ function continueWithFinalUrl_(imageUrl) {
+ var filename = g_currentFilename
+ ? g_currentFilename.replace(/^(.+?)(\.\w+)?$/, '$1_framed.png')
+ : 'framed_screenshot.png';
+
+ var $link = $('<a>')
+ .attr('download', filename)
+ .attr('href', imageUrl)
+ .append($('<img>')
+ .addClass('dragout')
+ .attr('src', imageUrl)
+ .attr('draggable', true)
+ .attr('data-downloadurl', ['image/png', filename, imageUrl].join(':')))
+ .appendTo($('#output').empty());
+
+ $('#frame-customizations').show();
+ }
+ }
+
+ /**
+ * Loads an image from a data URI. The callback will be called with the <img> once
+ * it loads.
+ */
+ function loadImageFromUri(uri, callback) {
+ callback = callback || function(){};
+
+ var img = document.createElement('img');
+ img.src = uri;
+ img.onload = function() {
+ callback(img);
+ };
+ img.onerror = function() {
+ callback(null);
+ }
+ }
+
+ /**
+ * Loads a set of images (organized by ID). Once all images are loaded, the callback
+ * is triggered with a dictionary of <img>'s, organized by ID.
+ */
+ function loadImageResources(images, callback) {
+ var imageResources = {};
+
+ var checkForCompletion_ = function() {
+ for (var id in images) {
+ if (!(id in imageResources))
+ return;
+ }
+ (callback || function(){})(imageResources);
+ callback = null;
+ };
+
+ for (var id in images) {
+ var img = document.createElement('img');
+ img.src = images[id];
+ (function(img, id) {
+ img.onload = function() {
+ imageResources[id] = img;
+ checkForCompletion_();
+ };
+ img.onerror = function() {
+ imageResources[id] = null;
+ checkForCompletion_();
+ }
+ })(img, id);
+ }
+ }
+
+ /**
+ * Loads the first valid image from a FileList (e.g. drag + drop source), as a data URI. This
+ * method will throw an alert() in case of errors and call back with null.
+ *
+ * @param {FileList} fileList The FileList to load.
+ * @param {Function} callback The callback to fire once image loading is done (or fails).
+ * @return Returns an object containing 'uri' representing the loaded image. There will also be
+ * a 'name' field indicating the file name, if one is available.
+ */
+ function loadImageFromFileList(fileList, callback) {
+ fileList = fileList || [];
+
+ var file = null;
+ for (var i = 0; i < fileList.length; i++) {
+ if (fileList[i].type.toLowerCase().match(/^image\/(png|jpeg|jpg)/)) {
+ file = fileList[i];
+ break;
+ }
+ }
+
+ if (!file) {
+ alert('Please use a valid screenshot file (PNG or JPEG format).');
+ callback(null);
+ return;
+ }
+
+ var fileReader = new FileReader();
+
+ // Closure to capture the file information.
+ fileReader.onload = function(e) {
+ callback({
+ uri: e.target.result,
+ name: file.name
+ });
+ };
+ fileReader.onerror = function(e) {
+ switch(e.target.error.code) {
+ case e.target.error.NOT_FOUND_ERR:
+ alert('File not found.');
+ break;
+ case e.target.error.NOT_READABLE_ERR:
+ alert('File is not readable.');
+ break;
+ case e.target.error.ABORT_ERR:
+ break; // noop
+ default:
+ alert('An error occurred reading this file.');
+ }
+ callback(null);
+ };
+ fileReader.onabort = function(e) {
+ alert('File read cancelled.');
+ callback(null);
+ };
+
+ fileReader.readAsDataURL(file);
+ }
+
+ /**
+ * Adds a simple version of Canvas.toBlob if toBlob isn't available.
+ */
+ function polyfillCanvasToBlob() {
+ if (!HTMLCanvasElement.prototype.toBlob && window.Blob) {
+ HTMLCanvasElement.prototype.toBlob = function(callback, mimeType, quality) {
+ if (typeof callback != 'function') {
+ throw new TypeError('Function expected');
+ }
+ var dataURL = this.toDataURL(mimeType, quality);
+ mimeType = dataURL.split(';')[0].split(':')[1];
+ var bs = window.atob(dataURL.split(',')[1]);
+ if (dataURL == 'data:,' || !bs.length) {
+ callback(null);
+ return;
+ }
+ for (var ui8arr = new Uint8Array(bs.length), i = 0; i < bs.length; ++i) {
+ ui8arr[i] = bs.charCodeAt(i);
+ }
+ callback(new Blob([ui8arr.buffer /* req'd for Safari */ || ui8arr], {type: mimeType}));
+ };
+ }
+ }
+</script>
diff --git a/docs/html-intl/intl/zh-cn/distribute/tools/promote/linking.jd b/docs/html-intl/intl/zh-cn/distribute/tools/promote/linking.jd
new file mode 100644
index 0000000..c7cf7cf
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/distribute/tools/promote/linking.jd
@@ -0,0 +1,186 @@
+page.title=链接到你的商品
+page.image=/images/gp-linking-ex-crop.png
+page.metaDescription=了解如何构建链接,把用户从浏览或搜索带到你在 Google Play 的应用程序。
+
+@jd:body
+
+ <div class="sidebox-wrapper">
+ <div class="sidebox">
+ <a href="badges.html">
+ <img alt="即刻获取 Google Play" src="{@docRoot}images/brand/en_app_rgb_wo_45.png" />
+ </a>
+ <p>如需获得内含 Google Play 品牌图标的链接,请访问<a href="badges.html">徽章</a>页面。</p>
+ </div>
+ </div>
+
+ <p>Google Play 提供多种链接格式,可让你按自己需要的方式将用户从 Android 应用、网页、广告、评论、文章、社交媒体帖子等链接到你的商品。</p>
+
+ <p>这些链接格式可让你:</p>
+ <ul>
+ <li>链接到特定应用的<a href="#OpeningDetails">商品详情页</a></li>
+ <li>链接到<a href="#OpeningPublisher">你所有应用的列表</a>,或</li>
+ <li>链接到你选择的<a href="#PerformingSearch">搜索结果</a></li>
+ <li>链接到 Google Play 上的某个<a href="#OpeningCollection">合集</a></li>
+ </ul>
+
+ <p>如果你从 Android 应用上提供链接,还可以控制此链接是启动 Play 商店应用还是启动浏览器,后者会将用户转至 Google Play 网站。</p>
+
+ <h2 id="OpeningDetails">链接到商品详情页</h2>
+
+ <p>如果提供下面这种格式的深层链接,你可以将用户直接指向特定应用的商品详情页。在商品详情页上,用户可以查看应用的说明、屏幕截图以及评论等,还可以安装该应用。</p>
+
+ <p>要创建此链接,你需要提供完全符合要求的“程序包名称”(可在相应应用的<a href="{@docRoot}guide/topics/manifest/manifest-element.html#package">AndroidManifest.xml</a>中找到)。<em></em>此外,程序包名称还会显示在开发者控制台中。</p>
+
+ <dl>
+ <dt><strong>从网站上:</strong></dt>
+ <dd>
+ <pre>http://play.google.com/store/apps/details?id=<package_name></pre>
+ </dd>
+ <dt><strong>从 Android 应用上:</strong></dt>
+ <dd>
+ <pre>market://details?id=<package_name></pre>
+ </dd>
+ </dl>
+
+ <p>示例如下:</p>
+
+ <p style="margin-left:1em"><code><a href="http://play.google.com/store/apps/details?id=com.google.android.apps.maps">http://play.google.com/store/apps/details?id=com.google.android.apps.maps</a></code></p>
+
+ <p>要详细了解如何在 Android 应用中发送链接,请参阅<a href="#android-app">从 Android 应用提供链接</a>。</p>
+
+
+
+ <h2 id="OpeningPublisher">链接到商品列表</h2>
+
+ <p>如果提供下面这种格式的链接,你可以将用户指向你所发布应用的列表。通过商品列表,用户可以查看特定发布者提供的所有应用,以及各个应用的评分、编辑徽章和“安装”按钮。</p>
+
+ <p>要创建此链接,你需要提供“发布者名称”(可在开发者控制台中找到)。<em></em></p>
+
+ <dl>
+ <dt><strong>从网站上:</strong></dt>
+ <dd>
+ <pre>http://play.google.com/store/search?q=pub:<publisher_name></pre>
+ </dd>
+ <dt><strong>从 Android 应用上:</strong></dt>
+ <dd>
+ <pre>market://search?q=pub:<publisher_name></pre>
+ </dd>
+ </dl>
+
+ <p>示例如下:</p>
+
+ <p style="margin-left:1em"><code><a href="http://play.google.com/store/search?q=pub:Google Inc.">http://play.google.com/store/search?q=pub:Google Inc.</a></code></p>
+
+ <p>要详细了解如何在 Android 应用中发送链接,请参阅<a href="#android-app">从 Android 应用提供链接</a>。</p>
+
+
+ <h2 id="PerformingSearch">链接到搜索结果</h2>
+
+ <p>如果提供下面这种格式的链接,你可以将用户指向 Google Play 上的搜索查询结果页。搜索结果页会显示与此次查询相匹配的应用的列表(可能还会显示其他内容),以及各个应用的评分、徽章和“安装”按钮。</p>
+
+ <p>要创建此链接,你只需提供一个搜索查询字符串。如果你希望此次查询搜索 Google Play 应用商品详情以外的地方,则可以去掉该链接网址中的 <code>&c=apps</code> 部分。</p>
+
+ <dl>
+ <dt><strong>从网站上:</strong></dt>
+ <dd>
+ <pre>http://play.google.com/store/search?q=<search_query>&c=apps</pre>
+ </dd>
+ <dt><strong>从 Android 应用上:</strong></dt>
+ <dd>
+ <pre>market://search?q=<seach_query>&c=apps</pre>
+ </dd>
+ </dl>
+
+ <p>示例如下:</p>
+
+ <p style="margin-left:1em"><code><a href="http://play.google.com/store/search?q=maps&c=apps">http://play.google.com/store/search?q=maps&c=apps</a></code></p>
+
+ <p>要详细了解如何在 Android 应用中发送链接,请参阅<a href="#android-app">从 Android 应用提供链接</a>。</p>
+
+
+
+ <h2 id="OpeningCollection">链接到某个合集</h2>
+
+ <p>如果你的应用获得推荐或显示在某个 Google Play 排行榜或合集中,你可以提供下面这种格式的链接,将用户直接指向相应合集。该合集会按照一定顺序排列显示其中的应用,并会显示各个应用的评分、简短说明和“安装”按钮。</p>
+
+ <dl>
+ <dt><strong>从网站上:</strong></dt>
+ <dd>
+ <pre>http://play.google.com/store/apps/collection/<collection_name></pre>
+ </dd>
+ <dt><strong>从 Android 应用上:</strong></dt>
+ <dd>
+ <pre>market://apps/collection/<collection_name></pre>
+ </dd>
+ </dl>
+
+ <p>示例如下:</p>
+
+ <p style="margin-left:1em"><code><a href="http://play.google.com/store/apps/collection/editors_choice">http://play.google.com/store/apps/collection/editors_choice</a></code></p>
+
+ <p>要详细了解如何在 Android 应用中发送链接,请参阅<a href="#android-app">从 Android 应用提供链接</a>。</p>
+
+ <p class="table-caption"><strong>表 1:</strong> Google Play 上的合集</p>
+
+ <table>
+ <tr>
+ <th>合集</th><th>collection_name</th>
+ </tr>
+ <tr><td>店员推荐(精选)</td><td>featured</td></tr>
+ <tr><td>编辑精选</td><td>editors_choice</td></tr>
+ <tr><td>热门付费</td><td>topselling_paid</td></tr>
+ <tr><td>热门免费</td><td>topselling_free</td></tr>
+ <tr><td>热门免费新品</td><td>topselling_new_free</td></tr>
+ <tr><td>热门付费新品</td><td>topselling_new_paid</td></tr>
+ <tr><td>创收最高</td><td>topgrossing</td></tr>
+ <tr><td>上升最快</td><td>movers_shakers</td></tr>
+ <tr><td>最畅销游戏</td><td>topselling_paid_game</td></tr>
+ </table>
+
+
+ <h2 id="android-app">从 Android 应用提供链接</h2>
+
+ <p>用户在 Android 设备上可以访问两种常规格式的链接。这两种格式在设备上触发的行为略有不同:</p>
+
+ <ul>
+ <li><code>market://</code> 启动 Play 商店应用以加载目标网页。</li>
+ <li><code>http://</code> 让用户选择是启用 Play 商店应用还是浏览器来处理请求。如果选择浏览器处理请求,它会在 Google Play 网站上加载目标网页。</li>
+ </ul>
+
+ <p>一般情况下,你应对网页上的链接使用 <code>http://</code> 格式;对 Android 应用中的链接使用 <code>market://</code>。</p>
+
+ <p>如果你希望用户从 Android 应用链接到你的商品,请创建一个可打开 Google Play 网址的 <code><a href="{@docRoot}reference/android/content/Intent.html">Intent</a></code>,如下例所示。</p>
+
+ <pre>
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setData(Uri.parse("market://details?id=com.example.android"));
+ startActivity(intent);
+ </pre>
+
+
+ <h2 id="UriSummary">网址格式总结</h2>
+
+ <p>下表总结了 Google Play 当前支持的 URI(在网页上和在 Android 应用中),如前几部分所述。</p>
+
+ <table>
+ <tr>
+ <th>结果</th>
+ <th>网页链接</th>
+ <th>Android 应用链接</th>
+ </tr>
+ <tr>
+ <td style="width:72px"><span style="white-space:nowrap;">显示特定应用的商品详情页</span></td>
+ <td><code>http://play.google.com/store/apps/details?id=<package_name></code>
+ <td><code>market://details?id=<package_name></code></td>
+ </td></tr>
+ <tr>
+ <td>显示特定发布者的应用</td>
+ <td><nobr><code>http://play.google.com/store/search?q=pub:<publisher_name></code></nobr></td>
+ <td><nobr><code>market://search?q=pub:<publisher_name></code></nobr></td>
+ </tr>
+ <tr>
+ <td>使用常规字符串查询搜索应用</td>
+ <td><code>http://play.google.com/store/search?q=<query></code></td>
+ <td><code>market://search?q=<query></code></td>
+ </tr>
+ </table>
diff --git a/docs/html-intl/intl/zh-cn/google/play/billing/api.jd b/docs/html-intl/intl/zh-cn/google/play/billing/api.jd
new file mode 100644
index 0000000..fbdbac6
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/google/play/billing/api.jd
@@ -0,0 +1,117 @@
+page.title=应用内结算 API
+parent.title=In-app Billing
+parent.link=index.html
+@jd:body
+
+ <div id="qv-wrapper">
+ <div id="qv">
+
+ <h2>主题</h2>
+ <ol>
+ <li><a href="#producttypes">商品类型</a>
+ <ol>
+ <li><a href="#managed">托管的应用内商品</a><li>
+ <li><a href="#subs">订阅</a><li>
+ </li></li></li></li></ol>
+ </li>
+ <li><a href="#purchase">购买商品</a></li>
+ <li><a href="#consume">消耗应用内商品</a>
+ <ol>
+ <li><a href="#consumetypes">非消耗型和消耗型应用内商品</a><li>
+ <li><a href="#managingconsumables">管理消耗型商品购买流程</a><li>
+ </li></li></li></li></ol>
+ </li>
+ <li><a href="#caching">本地缓存</a></li>
+ </ol>
+
+ <h2>参考</h2>
+ <ol>
+ <li><a href="{@docRoot}google/play/billing/billing_reference.html">应用内结算参考 (V3)</a></li>
+ </ol>
+
+ <h2>另请参见</h2>
+ <ol>
+ <li><a href="{@docRoot}training/in-app-billing/index.html">销售应用内商品</a></li>
+ </ol>
+ </div>
+ </div>
+
+ <p>借助应用内结算 API 第 3 版,您可以更轻松地将应用内结算功能集成到自己的应用中。此版本包括下列功能:经过改进的同步购买流程、可让您轻松跟踪消耗型商品所有权的 API 以及在本地缓存应用内购买数据。</p>
+
+ <h2 id="producttypes">商品类型</h2>
+ <p>您可以使用 Google Play 开发者控制台来定义您的商品,包括商品类型、SKU、价格和说明等等。有关详情,请参阅<a href="{@docRoot}google/play/billing/billing_admin.html">管理应用内结算</a>。API 第 3 版支持两种商品类型,即托管的应用内商品和订阅。</p>
+ <h3 id="managed">托管的应用内商品</h3>
+ <p>托管的应用内商品是指由 Google Play 跟踪和管理其所有权信息的商品。当用户购买托管的应用内商品时,Google Play 会针对每位用户分别存储各商品的购买信息。这使得您日后可随时向 Google Play 进行查询,恢复特定用户购买的商品的状态。这类信息会永久保存在 Google Play 服务器上,即使用户卸载应用或更换设备也是如此。</p>
+ <p>如果您使用的是 API 第 3 版,还可以在应用内消耗托管的商品。通常情况下,您可以对那些可供多次购买的商品(例如游戏中使用的货币、燃料或魔法药)实施消耗。托管的商品在被购买后,必须先向 Google Play 发送消耗请求进行消耗,然后才能供用户再次购买。要详细了解应用内商品的消耗,请参阅<a href="#consume">消耗商品</a></p>
+
+ <h3 id="subs">订阅</h3>
+ <p>订阅是应用内结算中提供的一种商品类型,可让您通过按月或按年结算的方式在应用内向用户销售内容、服务或功能。您可以在各类应用或游戏中销售对几乎所有类型的数字内容的订阅。要了解订阅的工作原理,请参阅<a href="{@docRoot}google/play/billing/billing_subscriptions.html">应用内结算订阅</a>。</p>
+ <p>使用 API 第 3 版,您可以使用与应用内商品相同的购买流程来购买订阅和检索订阅购买信息。有关代码示例,请参阅<a href="{@docRoot}google/play/billing/billing_integrate.html#Subs">实施订阅</a>。</p>
+ <p class="caution"><strong>重要提示</strong>:与应用内商品不同,订阅无法消耗。</p>
+
+ <h2 id="purchase">购买商品</h2>
+
+ <div class="figure" style="width:430px">
+ <img src="{@docRoot}images/in-app-billing/v3/iab_v3_purchase_flow.png" id="figure1" height="530" />
+ <p class="img-caption">
+ <strong>图 1. </strong> 购买请求的基本顺序。
+ </p>
+ </div>
+
+ <p>API 第 3 版中的典型购买流程如下所示:
+ <ol>
+ <li>您的应用向 Google Play 发送 <code>isBillingSupported</code> 请求,以确定您当前使用的应用内结算 API 目标版本是否受支持。</li>
+ <li>当您的应用启动或用户登录时,最好向 Google Play 进行查询,确定该用户拥有哪些商品。要查询用户的应用内购买,请发送 <code>getPurchases</code> 请求。如果该请求成功,Google Play 会返回一个 <code>Bundle</code>,其中包含所购商品的商品 ID 列表、各项购买详情的列表以及购买签名的列表。</li>
+ <li>通常情况下,您需要通知用户商品是否可供购买。要查询您在 Google Play 中定义的应用内商品的详细信息,应用可以发送 <code>getSkuDetails</code> 请求。您必须在该查询请求中指定商品 ID 列表。如果该请求成功,Google Play 会返回一个包含产品详情(包括商品的价格、标题、说明和购买类型)的 <code>Bundle</code>。
+ </li>
+ <li>如果该用户还未拥有应用内商品,您可以提示购买。为了发起购买请求,您的应用会发送 <code>getBuyIntent</code> 请求,指定要购买商品的商品 ID 以及其他参数。当您在开发者控制台中创建新的应用内商品时,应记录其商品 ID。
+ <ol type="a">
+ <li>Google Play 返回的 <code>Bundle</code> 中包含 <code>PendingIntent</code>,您的应用可用它来启动购买结帐界面。</li>
+ <li>您的应用通过调用 <code>startIntentSenderForResult</code> 方法来启动 PendingIntent。</li>
+ <li>当结帐流程结束后(即用户成功购买商品或取消购买),Google Play 会向您的 <code>onActivityResult</code> 方法发送响应 <code>Intent</code>。<code>onActivityResult</code> 的结果代码中有一个代码将用于表明用户是完成了购买还是取消了购买。响应 <code>Intent</code> 中会包含所购商品的相关信息,其中包括 Google Play 为了唯一标识此次购买交易而生成的 <code>purchaseToken</code> 字符串。<code>Intent</code> 中还包含使用您的私人开发者密钥签署的购买签名。</li>
+ </ol>
+ </li>
+ </ol>
+ </p>
+ <p>要详细了解 API 第 3 版的调用和服务器响应,请参阅<a href="{@docRoot}google/play/billing/billing_reference.html">应用内结算参考</a>。</p>
+
+ <h2 id="consume">消耗应用内商品</h2>
+ <p>您可以使用消耗机制来跟踪用户对应用内商品的所有权。</p>
+ <p>在第 3 版中,所有应用内商品都是托管的。也就是说,用户对所购应用内商品的所有权由 Google Play 进行维护,您的应用可以在需要时查询用户的购买信息。当用户成功购买应用内商品后,该次购买就会记录在 Google Play 中。应用内商品一经售出,就会被视为“被拥有”。处于“被拥有”状态的应用内商品无法再通过 Google Play 购买。您必须对“被拥有”的应用内商品发送消耗请求,然后 Google Play 才能再次将其设成可购买状态。消耗应用内商品会将商品切换回“未被拥有”状态并删除之前的购买数据。</p>
+ <div class="figure" style="width:420px">
+ <img src="{@docRoot}images/in-app-billing/v3/iab_v3_consumption_flow.png" id="figure2" height="300" />
+ <p class="img-caption">
+ <strong>图 2. </strong> 消耗请求的基本顺序。
+ </p>
+ </div>
+ <p>为了检索用户所拥有商品的列表,您的应用会向 Google Play 发送 <code>getPurchases</code> 调用。您的应用可以通过发送 <code>consumePurchase</code> 调用提出消耗请求。在请求参数中,您必须指定应用内商品独一无二的 <code>purchaseToken</code> 字符串,此字符串是在商品售出时由 Google Play 指定的。Google Play 会返回一个状态代码,指明此次消耗是否已成功记录。</p>
+
+ <h3 id="consumetypes">非消耗型和消耗型应用内商品</h3>
+ <p>您需要决定您的应用内商品是非消耗型商品还是消耗型商品。</p>
+ <dl>
+ <dt>非消耗型商品</dt>
+ <dd>通常情况下,对于在应用内购买一次就能永久使用的应用内商品,您无需实施消耗。这些商品在购买后将永久与用户的 Google 帐户相关联。高级版升级和关卡包就属于非消耗型应用内商品。</dd>
+ <dt>消耗型商品</dt>
+ <dd>相反,对于可多次购买的商品,您可以实施消耗。通常情况下,这类商品提供某些临时效果。例如,用户在游戏中的角色可以从自己的存货中获得生命值或额外的金币。在您的应用中分配所购商品的收益或效果称之为“配置”应用内商品。<em></em>您负责控制和跟踪如何向用户配置应用内商品。
+ <p class="note"><strong>重要提示</strong>:您必须先向 Google Play 发送消耗请求,在收到表明此次消耗已成功记录的响应之后,您才能在应用中配置消耗型应用内商品。</p>
+ </dd>
+ </dl>
+ <h3 id="managingconsumables">在应用中管理消耗型商品购买</h3>
+ <p>下面是购买消耗型应用内商品的基本流程:</p>
+ <ol>
+ <li>调用 <code>getBuyIntent</code> 启动购买流程。</li>
+ <li>从 Google Play 接收指示购买是否成功完成的响应 <code>Bundle</code>。</li>
+ <li>如果购买成功,通过调用 <code>consumePurchase</code> 消耗此次购买。</li>
+ <li>从 Google Play 接收指示消耗是否成功完成的响应代码。</li>
+ <li>如果消耗成功,在应用中配置商品。</li>
+ </ol>
+ <p>之后,当用户启动或登录到您的应用时,您应检查该用户是否拥有任何尚未消耗的消耗型应用内商品。如果有,请务必消耗并配置这些商品。如果您在应用中实施消耗型应用内商品,则可以采用以下推荐的应用启动流程:</p>
+ <ol>
+ <li>发送 <code>getPurchases</code> 请求,查询该用户拥有的应用内商品。</li>
+ <li>如果有消耗型应用内商品,通过调用 <code>consumePurchase</code> 消耗这些商品。必须执行这步操作,因为应用虽可能已完成该消耗型商品的购买订单,但在其发送消耗请求之前仍有可能停止运行或断开连接。</li>
+ <li>从 Google Play 接收指示消耗是否成功完成的响应代码。</li>
+ <li>如果消耗成功,在应用中配置商品。</li>
+ </ol>
+
+ <h2 id="caching">本地缓存</h2>
+ <p>目前,由于 Google Play 客户端在设备上本地缓存应用内结算信息,因此您可以使用 API 第 3 版更频繁地查询此类信息,例如通过调用 <code>getPurchases</code> 进行查询。与旧版本的 API 不同,API 第 3 版的很多调用都是在缓存中进行查找,而不用通过网络连接到 Google Play,这样就显著加快了 API 的响应速度。</p>
diff --git a/docs/html-intl/intl/zh-cn/google/play/billing/billing_admin.jd b/docs/html-intl/intl/zh-cn/google/play/billing/billing_admin.jd
new file mode 100644
index 0000000..989c0e7
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/google/play/billing/billing_admin.jd
@@ -0,0 +1,364 @@
+page.title=管理应用内结算
+parent.title=In-app Billing
+parent.link=index.html
+@jd:body
+
+ <div id="qv-wrapper">
+ <div id="qv">
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#billing-list-setup">创建商品列表</a></li>
+ <li><a href="#billing-purchase-type">选择商品类型</a></li>
+ <li><a href="#billing-testing-setup">设置测试帐户</a></li>
+ <li><a href="#billing-refunds">处理退款</a></li>
+ <li><a href="#billing-refunds">使用订单号</a></li>
+ <li><a href="#billing-support">获取相关支持</a></li>
+ </ol>
+
+
+ <h2>另请参见</h2>
+ <ol>
+ <li><a href="{@docRoot}google/play/billing/billing_overview.html">应用内结算概述</a></li>
+ </ol>
+ </div>
+ </div>
+
+ <p>如果您使用应用内结算,您就无需处理任何财务交易。不过,您仍需执行一些管理任务,包括在 Google Play 开发者控制台上创建和维护您的商品列表、注册测试帐户以及在需要时处理退款。</p>
+
+ <p>您必须有 Google Play 发布商帐户才能注册测试帐户。而且,您必须有 Google 电子钱包商家帐户才能创建商品列表以及向用户发放退款。如果您已有 Google Play 发布商帐户,则可以使用您的现有帐户,无需注册新帐户就能使用应用内结算。</p>
+
+ <p>如果您没有发布商帐户,可以在 <a href="http://play.google.com/apps/publish">Google Play 开发者控制台</a>中以 Google Play 开发者的身份注册设置一个发布商帐户。如果您没有 Google 电子钱包商家帐户,也可以通过开发者控制台注册一个。</p>
+
+ <h2 id="billing-list-setup">创建商品列表</h2>
+
+ <p>Google Play 开发者控制台为您发布的每个应用都提供一份商品列表。您可以使用 Google Play 的应用内结算功能销售商品,但前提是该商品已在应用的商品列表中列出。每个应用都有自己的商品列表,您不能在某个应用中销售其他应用的商品列表中列出的商品。</p>
+
+ <p>您可以点击开发者帐户中列出的应用内的<strong>应用内商品</strong>链接,访问该应用的商品列表(参见图 1)。只有当您拥有 Google 电子钱包商家帐户且该应用的清单中包含 <code>com.android.vending.BILLING</code> 权限时,<strong>应用内商品</strong>链接才会显示。</p>
+
+ <p>商品列表列出了您在应用内销售的商品(应用内商品、订阅内容或两者的组合)。对于每件商品,商品列表中都会包含商品 ID、商品说明和价格等信息。商品列表只存储应用内所售商品的相关元数据,而不会存储任何数字内容。应用内销售的数字内容的存储和发送是由您负责的。</p>
+
+ <div style="margin:1em">
+ <img src="{@docRoot}images/in-app-billing/billing_product_list.png" id="figure1" style="border:1px solid #ddd;padding-bottom:.5em" xheight="548" />
+ <p class="img-caption" style="padding-left:.5em">
+ <strong>图 1. </strong> 您可以点击“应用”主导航面板中的<strong>应用内商品</strong>链接,访问应用的商品列表。
+ </p>
+ </div>
+
+ <p>您可以为所有已发布的应用或者 Alpha 或 Beta 渠道中的所有应用(这些应用上传并保存到开发者控制台)创建商品列表。不过,您必须有 Google 电子钱包商家帐户且该应用的清单中必须包含 <code>com.android.vending.BILLING</code> 权限。如果应用的清单中未包含此权限,您只能在商品列表中修改现有商品但不能向该列表添加新商品。要详细了解此权限,请参阅<a href="{@docRoot}google/play/billing/billing_integrate.html#billing-permission">更新您应用的清单</a>。</p>
+
+ <p class="note"><strong>注意</strong>:过去,您可以通过上传未发布的“草稿”版本来测试应用,但现在系统已不再支持此功能。因此,您必须将应用发布到 Alpha 或 Beta 分发渠道,才能进行测试。有关详情,请参阅<a href="{@docRoot}google/play/billing/billing_testing.html#draft_apps">草稿应用不再受支持</a>。
+
+ <p>此外,一个应用包只能有一个商品列表。如果您为某个应用创建商品列表且使用<a href="{@docRoot}google/play/publishing/multiple-apks.html">多 APK 功能</a>为该应用分发多个 APK,那么此商品列表将应用到与该应用商品详情相关联的所有 APK 版本。如果您使用的是多 APK 功能,则无法为各个 APK 创建单独的商品列表。</p>
+
+ <p>您可以通过两种方式向商品列表添加商品:通过应用内商品界面逐一添加商品(参见图 2);通过导入逗号分隔值 (CSV) 文件中的商品批量添加商品。如果您的应用只有几件应用内商品或您只是向商品列表添加几件测试商品,那么逐一添加商品这种方法就非常实用。如果您的应用有大量应用内商品,使用 CSV 文件的方法就较为实用。</p>
+
+ <p class="note"><strong>注意</strong>:目前系统尚不支持批量上传包含订阅内容的商品列表。</p>
+
+ <h3 id="billing-form-add">向商品列表逐一添加商品</h3>
+
+ <p>要通过应用内商品界面向商品列表添加一件商品,请按以下步骤操作:</p>
+
+ <ol>
+ <li><a href="http://play.google.com/apps/publish">登录</a>到您的发布商帐户。</li>
+ <li>在<strong>所有应用</strong>面板中,点击相应的应用名称,然后选择<strong>应用内商品</strong>。</li>
+ <li>点击<strong>添加新商品</strong>(参见图 2),提供所售商品的详细信息,然后点击<strong>保存</strong>或<strong>发布</strong>。</li>
+ </ol>
+
+ <div style="margin:1em">
+ <img src="{@docRoot}images/in-app-billing/billing_add.png" height="300" id="figure2" style="border:1px solid #ddd;padding-bottom:.5em" />
+ <p class="img-caption" style="padding-left:.5em">
+ <strong>图 2. </strong> 通过“添加新商品”页面,您可以向应用的商品列表添加商品。
+ </p>
+ </div>
+
+ <p>对于商品列表中的每件商品,您都必须输入以下信息:</p>
+ <ul>
+ <li><strong>应用内商品 ID</strong>
+ <p>每件商品的 ID 在应用的命名空间中都是独一无二的。商品 ID 必须以小写字母或数字开头,且只能由小写字母 (a-z)、数字 (0-9)、下划线 (_) 和点 (.) 组成。商品 ID“android.test”是系统预留的 ID,所有以“android.test”开头的商品 ID 都是如此。</p>
+ <p>此外,商品的商品 ID 创建后就无法再修改,而且您不能重复使用任何商品 ID。</p>
+ </li>
+ <li><strong>商品类型</strong>
+ <p>商品类型可以是<strong>按用户帐户管理的商品</strong>、<strong>不受管理的商品</strong>或<strong>订阅内容</strong>。商品类型设置后就无法再更改。有关详情,请参阅下文中的<a href="#billing-purchase-type">选择商品类型</a>。</p>
+ </li>
+ <li><strong>发布状态</strong>
+ <p>商品的发布状态可以是<strong>已发布</strong>或<strong>未发布</strong>。为了让用户在结帐时可以看到所购商品,该商品的发布状态必须设置为<strong>已发布</strong>且该商品所属的应用必须已发布到 Google Play 上。</p>
+ <p class="note"><strong>注意</strong>:这种情况并不适用于测试帐户。也就是说,对于测试帐户来说,即使应用未发布而商品已发布,测试帐户中的用户是可以看到该商品的。有关详情,请参阅<a href="{@docRoot}google/play/billing/billing_testing.html#billing-testing-real">测试应用内结算</a>。</p>
+ </li>
+ <li><strong>语言和翻译</strong>
+ <p>您可以使用“添加翻译”按钮,为您的应用内商品提供经过本地化的标题和说明。如果您希望 Google Play 根据您的默认语言为您翻译标题和说明,只需点击您要提供的语言即可。如果您想自行翻译成特定语言,也是可以的。默认情况下,应用内商品会沿用其所属应用的默认语言。</p>
+ </li>
+ <li><strong>标题</strong>
+ <p>标题是对商品的简短描述,例如“沉睡药水”。每个标题在应用的命名空间中必须是独一无二的,且每件商品都必须有标题。标题在用户结帐时必须显示。为了获得最佳的显示效果,标题不应超过 25 个字符;不过,标题最长可达 55 个字符。</p>
+ </li>
+ <li><strong>说明</strong>
+ <p>说明是对商品的详细描述,例如“立即让服用者陷入沉睡,但对愤怒的精灵无效”。每件商品都必须有一段说明,最长可达 80 个字符。</p>
+ </li>
+ <li><strong>价格</strong>
+ <p>您必须提供一个以您本地货币为单位的默认价格。您也可以提供以其他货币为单位的价格,但前提是此货币所属的国家/地区是您的应用要定位的目标国家/地区。您可以在 Google Play 开发者控制台中的“修改应用”页面上指定目标国家/地区。</p>
+ <p>要指定以其他货币为单位的价格,您可以手动输入与每种货币对应的价格,也可以点击<strong>自动填充</strong>,让 Google Play 一次性将您的本地货币换算成目标货币(参见图 3)。</p>
+ <p>请注意,订阅型商品发布后就无法再更改其价格。</p>
+ </li>
+ </ul>
+
+ <div style="margin:1em">
+ <img src="{@docRoot}images/in-app-billing/billing_list_form_2.png" id="figure3" style="border:1px solid #ddd;padding-bottom:.5em" xheight="1226" />
+ <p class="img-caption" style="padding-left:.5em">
+ <strong>图 3. </strong> 为应用内商品指定其他货币。
+ </p>
+ </div>
+
+ <p>要详细了解商品 ID 和商品列表,请参阅<a href="http://support.google.com/googleplay/android-developer/bin/answer.py?hl=zh-CN&answer=1072599">创建应用内商品 ID</a>。要详细了解定价,请参阅<a href="http://support.google.com/googleplay/android-developer/bin/answer.py?hl=zh-CN&answer=1153485">应用内结算定价</a>。</p>
+
+ <p class="note"><strong>注意</strong>:请务必规划好您的商品 ID 命名空间。商品 ID 保存后就无法再重复使用或更改。</p>
+
+ <h3 id="billing-bulk-add">向商品列表批量添加商品</h3>
+
+ <p>要使用 CSV 文件向商品列表批量添加商品,您需要先创建 CSV 文件。您在 CSV 文件中指定的数据值与您通过应用内商品界面手动指定的数据值相同(请参阅<a href="#billing-form-add">向商品列表逐一添加商品</a>)。
+
+ <p>如果您通过 CSV 文件导入和导出应用内商品,请记得提供含税价格。如果您使用自动填充,请提供不含税的默认价格,系统会自动填充含税的价格。如果您不使用自动填充,您提供的价格必须是含税价格。</p>
+
+ <p class="note"><strong>注意</strong>:目前系统尚不支持批量上传包含订阅内容的商品列表。</p>
+
+ CSV 文件使用逗号 (,) 和分号 (;) 来分隔数据值。逗号用来分隔主要数据值,分号用来分隔次要数据值。例如,CSV 文件的语法如下所示:</p>
+
+ <p>"<em>product_id</em>","<em>publish_state</em>","<em>purchase_type</em>","<em>autotranslate</em>
+ ","<em>locale</em>; <em>title</em>; <em>description</em>","<em>autofill</em>","<em>country</em>;
+ <em>price</em>"
+ </p>
+
+ <p>相关说明和使用详情如下所示。</p>
+
+ <ul>
+ <li><em>product_id</em>
+ <p>等同于应用内商品界面中的“应用内商品 ID”设置。如果您指定的“product_id”在商品列表中已经存在,且您选择在导入 CSV 文件时覆盖商品列表,则 CSV 文件中指定的值就会覆盖现有商品的数据。<em></em>覆盖功能不会删除商品列表中已列出但不包含在 CSV 文件中的商品。</p>
+ </li>
+ <li><em>publish_state</em>
+ <p>等同于应用内商品界面中的“发布状态”设置。值可以是 <code>published</code> 或 <code>unpublished</code>。</p>
+ </li>
+ <li><em>purchase_type</em>
+ <p>等同于应用内商品界面中的“商品类型”设置。值可以是 <code>managed_by_android</code>(等同于应用内商品界面中的<strong>按用户帐户管理的商品</strong>)或 <code>managed_by_publisher</code>(等同于应用内商品界面中的<strong>不受管理的商品</strong>)。</p>
+ </li>
+ <li><em>autotranslate</em>
+ <p>等同于选中应用内商品界面中的<strong>使用自动翻译填充字段</strong>复选框。值可以是 <code>true</code> 或 <code>false</code>。</p>
+ </li>
+ <li><em>locale</em>
+ <p>等同于应用内商品界面中的“语言”设置。您必须有一个默认语言区域项。默认语言区域必须是语言区域列表中的第一项,且必须包含“title”和“description”。<em></em><em></em>如果除默认语言外您还想提供翻译版本的“title”和“description”,则必须使用下面的语法规则:<em></em><em></em></p>
+ <p>如果“autotranslate”为 <code>true</code>,您必须按照以下格式指定默认语言区域、默认标题、默认说明及其他语言区域:<em></em></p>
+ <p>"true,"<em>default_locale</em>; <em>default_locale_title</em>;
+ <em>default_locale_description</em>; <em>locale_2</em>; <em>locale_3</em>, ..."</p>
+ <p>如果“autotranslate”为 <code>false</code>,您必须按照以下格式指定默认语言区域、默认标题、默认说明以及翻译后的标题和说明:<em></em></p>
+ <p>"false,"<em>default_locale</em>; <em>default_locale_title</em>;
+ <em>default_locale_description</em>; <em>locale_2</em>; <em>locale_2_title</em>;
+ <em>local_2_description</em>; <em>locale_3</em>; <em>locale_3_title</em>;
+ <em>locale_3_description</em>; ..."</p>
+ <p>请参见表 1,了解您可以在<em></em>“locale”字段中使用的语言代码的列表。</p>
+ </li>
+ <li><em>title</em>
+ <p>等同于应用内商品界面中的“标题”设置。如果“title”包含分号,必须使用反斜杠进行转义(例如“\;”)。<em></em>如果标题本身包含反斜杠,也应使用反斜杠进行转义(例如“\\”)。</p>
+ </li>
+ <li><em>description</em>
+ <p>等同于应用内商品界面中的“说明”。如果“description”包含分号,则必须使用反斜杠进行转义(例如“\;”)。<em></em>如果说明本身包含反斜杠,也应使用反斜杠进行转义(例如“\\”)。</p>
+ </li>
+ <li><em>autofill</em>
+ <p>等同于点击应用内商品界面中的<strong>自动填充</strong>。值可以是 <code>true</code> 或 <code>false</code>。用于指定“country”和“price”的语法视您使用的“autofill”设置而定。<em></em><em></em><em></em></p>
+ <p>如果“autofill”设为 <code>true</code>,您只需指定采用本地货币的默认价格且必须使用以下语法:<em></em></p>
+ <p>"true","<em>default_price_in_home_currency</em>"
+ <p><em></em>如果“autofill”设为 <code>false</code>,您需要为每种货币指定“country”和“price”且必须使用以下语法:<em></em><em></em></p>
+ <p>"false", "<em>home_country</em>; <em>default_price_in_home_currency</em>; <em>country_2</em>;
+ <em>country_2_price</em>; <em>country_3</em>; <em>country_3_price</em>; ..."</p>
+ </p></li>
+ <li><em>country</em>
+ <p>您为其指定价格的国家/地区。您只能列出您的应用所定位的国家/地区。国家/地区代码是按照 <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO 3166-2</a> 的定义,由两个大写字母组成的 ISO 国家/地区代码(例如“US”)。</p>
+ </li>
+ <li><em>price</em>
+ <p>等同于应用内商品界面中的“价格”。此价格必须使用微单位指定。要将货币值换算成微单位,请用实际值乘以 1,000,000。例如,如果您要以 1.99 元销售某件应用内商品,则需要在“price”字段中输入 1990000。<em></em></p>
+ </li>
+ </ul>
+
+ <p class="table-caption" id="language-table"><strong>表 1. </strong> 您可以在“locale”字段中使用的语言代码。<em></em></p>
+
+ <table>
+
+ <tr>
+ <th>语言</th>
+ <th>代码</th>
+ <th>语言</th>
+ <th>代码</th>
+ </tr>
+ <tr>
+ <td>中文</td>
+ <td>zh_TW</td>
+ <td>意大利语</td>
+ <td>it_IT</td>
+ </tr>
+ <tr>
+ <td>捷克语</td>
+ <td>cs_CZ</td>
+ <td>日语</td>
+ <td>ja_JP</td>
+ </tr>
+ <tr>
+ <td>丹麦语</td>
+ <td>da_DK</td>
+ <td>韩语</td>
+ <td>ko_KR</td>
+ </tr>
+ <tr>
+ <td>荷兰语</td>
+ <td>nl_NL</td>
+ <td>挪威语</td>
+ <td>no_NO</td>
+ </tr>
+ <tr>
+ <td>英语</td>
+ <td>en_US</td>
+ <td>波兰语</td>
+ <td>pl_PL</td>
+ </tr>
+ <tr>
+ <td>法语</td>
+ <td>fr_FR</td>
+ <td>葡萄牙语</td>
+ <td>pt_PT</td>
+ </tr>
+ <tr>
+ <td>芬兰语</td>
+ <td>fi_FI</td>
+ <td>俄语</td>
+ <td>ru_RU</td>
+ </tr>
+ <tr>
+ <td>德语</td>
+ <td>de_DE</td>
+ <td>西班牙语</td>
+ <td>es_ES</td>
+ </tr>
+ <tr>
+ <td>希伯来语</td>
+ <td>iw_IL</td>
+ <td>瑞典语</td>
+ <td>sv_SE</td>
+ </tr>
+ <tr>
+ <td>印地语</td>
+ <td>hi_IN</td>
+ <td>--</td>
+ <td>--</td>
+ </tr>
+ </table>
+
+ <p>要导入您在 CSV 文件中指定的商品,请执行以下操作:</p>
+
+ <ol>
+ <li><a href="http://play.google.com/apps/publish">登录</a>到您的发布商帐户。</li>
+ <li>在<strong>所有应用</strong>面板中,点击相应的应用名称,然后选择<strong>应用内商品</strong>。</li>
+ <li>在“应用内商品列表”页面上,点击<strong>导入/导出</strong> > <strong>从 CSV 文件中导入应用内商品</strong>,然后选择 CSV 文件。
+ <p>CSV 文件必须位于您的本地计算机上或连接到您计算机的本地磁盘上。</p>
+ </li>
+ <li>如果您想覆盖商品列表中的现有商品,请选中<strong>覆盖</strong>复选框。
+ <p>只有当 CSV 文件中的“product_id”值与商品列表中现有商品的应用内商品 ID 一致时,此选项才会覆盖现有商品的值。<em></em>覆盖功能不会删除商品列表中已列出但不包含在 CSV 文件中的商品。</p>
+ </li>
+ </ol>
+
+ <p>您还可以点击“应用内商品列表”页面上的<strong>导出为 CSV</strong>,将现有商品列表导出为 CSV 文件。如果您已将商品手动添加到商品列表,但现在想开始通过 CSV 文件管理该商品列表,此功能就非常有用。</p>
+
+ <h3 id="billing-purchase-type">选择商品类型</h3>
+
+ <p>商品的商品类型用来控制 Google Play 如何管理该商品的购买流程。商品类型有以下三种:“按用户帐户管理的商品”、“不受管理的商品”和“订阅内容”。但请注意,不同版本的应用内结算服务支持的商品类型不同,因此务必根据您的应用所用的应用内结算版本,选择合适的商品类型。</p>
+
+ <p>有关详情,请参阅<a href="{@docRoot}google/play/billing/api.html#producttype">应用内结算第 3 版</a>或<a href="{@docRoot}google/play/billing/v2/api.html#producttype">应用内结算第 2 版</a>的相关文档。
+
+ <h2 id="billing-refunds">处理退款</h2>
+
+ <p>应用内结算不允许用户向 Google Play 发送退款申请。应用内购买的退款事宜必须直接发送给您(应用开发者)。然后,您可以通过您的 Google 电子钱包商家帐户处理这笔退款。当您处理退款时,Google Play 会收到 Google 电子钱包发来的退款通知,并且 Google Play 会向您的应用发送退款消息。有关详情,请参阅<a href="{@docRoot}google/play/billing/v2/api.html#billing-action-notify">处理 IN_APP_NOTIFY 消息</a>和<a href="http://support.google.com/googleplay/android-developer/bin/answer.py?hl=zh-CN&answer=1153485">应用内结算定价</a>。</p>
+
+ <p class="caution"><strong>重要提示</strong>:您不能使用 Google Wallet API 发放退款或取消应用内结算交易,而是必须通过您的 Google 电子钱包商家帐户手动执行此类操作。不过,您可以使用 Google Wallet API 检索订单信息。</p>
+
+ <h2 id="orderId">使用订单号</h2>
+
+ <p>当用户购买应用内商品时,Google 电子钱包会为此次交易分配一个永久有效且独一无二的订单号。Google Play 在购买流程结束时会向您提供该订单号,作为 <code>PURCHASE_STATE_CHANGED</code> Intent 中的 <code>orderId</code> 字段的值。</p>
+
+ <p>在您的应用中,您可以使用该订单号作为此次应用内购买交易的通用标识符。购买后,您可以利用该订单号在对帐报表中跟踪此次交易,以及在提供客户支持时使用该订单号。</p>
+
+ <p>订单号是完全由数字构成的字符串,格式由 Google 电子钱包指定和管理。</p>
+
+ <p>对于发生在 2012 年 12 月 5 日及以后的交易,Google 电子钱包会分配一个商家订单号(而非 Google 订单号)并将该商家订单号报告为 <code>orderID</code> 的值。示例如下:</p>
+
+ <pre>"orderId" : "12999556515565155651.5565135565155651"</pre>
+
+ <p>对于发生在 2012 年 12 月 5 日之前的交易,Google Checkout 分配的是 Google 订单号并已将该编号报告为 <code>orderID</code> 的值。下面是使用 Google 订单号的 <code>orderID</code> 的示例:</p>
+
+ <pre>"orderId" : "556515565155651"</pre>
+
+ <h2 id="billing-testing-setup">设置测试帐户</h2>
+
+ <p>通过 Google Play 开发者控制台,您可以设置一个或多个测试帐户。测试帐户是您在开发者控制台上注册为测试帐户的常规 Google 帐户。测试帐户已获得授权,可从您已上传到 Google Play 开发者控制台但尚未发布的应用中进行应用内购买。</p>
+
+ <p>您可以使用任意 Google 帐户作为测试帐户。如果您想让多位用户在应用上测试应用内结算但又不想让他们获得您的发布商帐户的登录凭据,测试帐户就非常有用。如果您想拥有并控制测试帐户,可以自行创建帐户,然后将凭据分发给您的开发者或测试者。</p>
+
+ <p>测试帐户有三条限制:</p>
+
+ <ul>
+ <li>测试帐户用户只能在已上传到您的发布商帐户的应用(该应用可以是尚未发布的)中提出购买请求。</li>
+ <li>测试帐户只能用来购买应用的商品列表中已列出(并已发布)的商品。</li>
+ <li>测试帐户用户无法访问您的发布商帐户,也不能向您的发布商帐户上传应用。</li>
+ </ul>
+
+ <p>要向您的发布商帐户添加测试帐户,请按以下步骤操作:</p>
+
+ <ol>
+ <li><a href="http://play.google.com/apps/publish">登录</a>到您的发布商帐户。</li>
+ <li>点击<strong>设置</strong>图标。</li>
+ <li>找到“许可测试”面板。</li>
+ <li>添加您要注册为测试帐户的电子邮件地址,各帐户之间用英文逗号分隔。</li>
+ <li>点击<strong>保存</strong>,保存您的个人资料更改。</li>
+ </ol>
+
+ <h3 id="license_key">获取应用的许可密钥</h3>
+
+ <p>Google Play 开发者控制台为每个应用都提供一个公用的许可密钥。要获取应用的密钥,请按以下步骤操作:</p>
+ <ol>
+ <li>打开<strong>所有应用</strong>面板。</li>
+ <li>点击相应的应用名称,然后选择<strong>服务和 API</strong>。</li>
+ <li>向下滚动到<strong>此应用的许可密钥</strong>字段,找到应用的密钥,如下图所示。</li>
+ </ol>
+ <p>过去,开发者控制台为每个开发者帐户都提供一个公钥。为了将应用迁移到按应用分配的新公钥,开发者控制台将应用专用密钥设置为之前的开发者密钥。这样做可确保依赖于(之前的)开发者密钥的应用能与新公钥兼容。</p>
+
+ <div style="margin:1em">
+ <img src="{@docRoot}images/in-app-billing/billing_app_key.png" id="figure4" style="border:1px solid #ddd;padding-bottom:.5em" xheight="510" />
+ <p class="img-caption" style="padding-left:.5em">
+ <strong>图 4. </strong> 您可以在<strong>服务和 API</strong> 面板中找到各个应用的许可密钥。
+ </p>
+ </div>
+
+ <h2 id="billing-support">获取相关支持</h2>
+
+ <p>如果您在实施应用内结算时有疑问或遇到问题,请与下表列出的支持资源联系(参见表 2)。将您的问题发布到正确的论坛上,可以更快获得所需支持。</p>
+
+ <p class="table-caption" id="support-table"><strong>表 2. </strong> 适用于 Google Play 应用内结算的开发者支持资源</p>
+
+ <table>
+
+ <tr>
+ <th>支持类型</th>
+ <th>资源</th>
+ <th>主题范围</th>
+ </tr>
+ <tr>
+ <td rowspan="2">开发与测试问题</td>
+ <td>Google 网上论坛:<a href="http://groups.google.com/group/android-developers">android-developers</a> </td>
+ <td rowspan="2">应用内结算集成问题、有关用户体验的提示、对响应的处理、混淆代码、进程间通信 (IPC)、测试环境设置。</td>
+ </tr>
+ <tr>
+ <td>堆栈溢出:<a href="http://stackoverflow.com/questions/tagged/android">http://stackoverflow.com/questions/tagged/
+ android</a></td>
+ </tr>
+ <tr>
+ <td>结算问题跟踪器</td>
+ <td><a href="http://code.google.com/p/marketbilling/issues/">结算项目问题跟踪器</a></td>
+ <td>与应用内结算示例代码直接相关的错误和问题报告。</td>
+ </tr>
+ </table>
+
+ <p>要了解如何向上述所列论坛发帖的一般信息,请参阅“资源”标签中的<a href="{@docRoot}resources/community-groups.html">开发者论坛</a>一文。</p>
+
diff --git a/docs/html-intl/intl/zh-cn/google/play/billing/billing_best_practices.jd b/docs/html-intl/intl/zh-cn/google/play/billing/billing_best_practices.jd
new file mode 100644
index 0000000..4aff17d
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/google/play/billing/billing_best_practices.jd
@@ -0,0 +1,81 @@
+page.title=安全性和设计
+parent.title=In-app Billing
+parent.link=index.html
+@jd:body
+
+ <div id="qv-wrapper">
+ <div id="qv">
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#billing-security">安全性方面的最佳做法</a>
+ <ol>
+ <li><a href="#unlocked">保护未锁定的内容</a></li>
+ <li><a href="#obfuscate">混淆你的代码</a></li>
+ <li><a href="#sample">修改示例代码</a></li>
+ <li><a href="#nonce">使用安全随机数</a></li>
+ <li><a href="#payload">设置开发者有效内容字符串</a></li>
+ <li><a href="#trademark">报告商标和版权侵权</a></li>
+ <li><a href="#revocable">实施可撤消的方案</a></li>
+ <li><a href="#key">保护你的公钥</a></li>
+ </ol>
+ </li>
+ </ol>
+ <h2>另请参见</h2>
+ <ol>
+ <li><a href="{@docRoot}google/play/billing/billing_overview.html">应用内结算概述</a></li>
+ </ol>
+ </div>
+ </div>
+
+ <p>在设计应用内结算的实施时,请务必遵循本文中介绍的安全性和设计指南。这些指南是推荐的最佳做法,适用于所有使用 Google Play 应用内结算服务的开发者。</p>
+
+ <h2>安全性方面的最佳做法</h2>
+
+ <h3 id="sign">在服务器上执行签名验证任务</h3>
+ <p>如果可能的话,你应该在远程服务器上(而不是设备上)执行签名验证。在服务器上实施验证过程,可有效防止攻击者通过对 .apk 文件进行反向工程来破坏验证过程。如果你将安全性流程放置到远程服务器上,请确保设备服务器的握手过程是安全的。</p>
+
+ <h3 id="unlocked">保护你的未锁定内容</h3>
+ <p>为防止恶意用户重新分发你未锁定的内容,请不要将这种内容放入你的 .apk 文件中,而是执行以下操作之一:</p>
+ <ul>
+ <li>使用实时服务发送内容,例如内容 Feed。通过实时服务发送内容可保持内容始终是最新的。</li>
+ <li>使用远程服务器发送内容。</li>
+ </ul>
+ <p>当你通过远程服务器或实时服务发送内容时,你可以将未锁定内容存储在设备内存中或设备的 SD 卡上。如果你将内容存储在 SD 卡上,请务必将内容加密并使用设备专有的密钥。</p>
+
+ <h3 id="obfuscate">混淆你的代码</h3>
+ <p>你应混淆应用内结算代码,让攻击者难以对你的安全协议和其他应用组件进行反向工程。我们建议你至少对代码运行 <a href="{@docRoot}tools/help/proguard.html">Proguard</a> 等代码混淆工具。</p>
+ <p>除了运行代码混淆程序以外,我们还建议你使用以下技术混淆你的应用内结算代码。</p>
+ <ul>
+ <li>将方法内嵌入其他方法中。</li>
+ <li>创建动态字符串,而不是将其定义为常量。</li>
+ <li>使用 Java 反射来调用方法。</li>
+ </ul>
+ <p>使用这些技术有助于缩小你应用的受攻击范围,并最大程度帮助你抵御会对应用内结算实施造成损害的攻击。</p>
+ <div class="note">
+ <p><strong>注意</strong>:如果你使用 Proguard 来对代码进行混淆处理,则必须将以下内容行添加到 Proguard 配置文件中:</p>
+ <p><code>-keep class com.android.vending.billing.**</code></p>
+ </div>
+
+ <h3 id="sample">修改所有示例应用代码</h3>
+ <p>应用内结算示例是可供任何人下载的公开发布应用。这意味着如果你直接使用发布的示例代码,则对攻击者而言比较容易对你的应用进行反向工程。请紧记示例应用只能作为示例使用。如果你使用示例应用中的任何一部分,则必须在发布之前或将其作为生产应用的一部分前对其进行修改。</p>
+ <p>尤其要注意的是,攻击者会寻找应用内已知的进入点和离开点,因此请务必修改与示例应用完全相同的代码部分。</p>
+
+ <h3 id="nonce">使用安全随机数</h3>
+ <p>随机数必须是不可预测的,也不能重复使用。在生成随机数时,请务必使用采用加密保护的随机数字生成器(例如 <code><a href="{@docRoot}reference/java/security/SecureRandom.html">SecureRandom</a></code>),这样可以减少重放攻击。</p>
+ <p>此外,如果你在服务器上执行随机数验证,请务必在服务器上生成随机数。</p>
+
+ <h3 id="payload">在提交购买请求时设置开发者有效内容字符串</h3>
+ <p>使用应用内结算 API 第 3 版,你可以在向 Google Play 发送购买请求时包括一个“开发者有效内容”字符串令牌。通常情况下,这样做是为了提交可唯一标识此购买请求的字符串令牌。如果你指定字符串值,那么 Google Play 会返回购买响应以及该字符串。随后,在你针对此购买进行查询时,Google Play 会返回此字符串以及购买详情。</p>
+ <p>提交字符串令牌可以帮助应用识别进行了购买的用户,以便你稍后验证该用户进行的购买是否合法。对于消耗型商品,你可以使用随机生成的字符串;但是对于非消耗型商品,则应该使用可唯一标识用户的字符串。</p>
+ <p>当你获得 Google Play 的响应时,请确保开发者有效内容字符串匹配你之前与购买请求一起发送的令牌。作为进一步的安全预防措施,你应该在自己的安全服务器上执行验证。</p>
+
+
+ <h3 id="trademark">针对商标和版权侵权采取行动</h3>
+ <p>如果你看到自己的内容在 Google Play 上被重新分发,请立即、果断地采取行动。发出<a href="http://support.google.com/googleplay/android-developer/bin/answer.py?hl=zh-CN&answer=141511">商标侵权通知</a>或<a href="http://www.google.com/android_dmca.html">版权侵权通知</a>。</p>
+
+ <h3 id="revocable">针对未锁定内容实施可撤消方案</h3>
+ <p>如果你使用远程服务器发送或管理内容,请确保当用户访问内容时,应用能够验证未锁定内容的购买状态。这样你可以根据需要撤消使用,并最大限度地减少盗版。</p>
+
+ <h3 id="key">保护你的 Google Play 公钥</h3>
+ <p>为保护你的公钥安全并防止被恶意用户和黑客攻击,请不要将其作为文字字符串嵌入任何代码中。而是在运行时以拼凑方式构建字符串或者使用位操作处理(例如,XOR 搭配其他字符串)以隐藏真实密钥。公钥本身不是秘密信息,但是你一定不希望黑客或恶意用户能轻易将公钥替换为其他钥匙。</p>
+
diff --git a/docs/html-intl/intl/zh-cn/google/play/billing/billing_overview.jd b/docs/html-intl/intl/zh-cn/google/play/billing/billing_overview.jd
new file mode 100644
index 0000000..aceadcb
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/google/play/billing/billing_overview.jd
@@ -0,0 +1,93 @@
+page.title=应用内结算概述
+parent.title=In-app Billing
+parent.link=index.html
+@jd:body
+
+ <div id="qv-wrapper">
+ <div id="qv">
+ <h2>概述</h2>
+ <ul>
+ <li>使用应用内结算销售数字商品,包括一次性商品和定期订阅。</li>
+ <li>在 Google Play 上发布的所有应用均可使用该服务。您只需有 Google Play 开发者控制台帐户和 Google 电子钱包商家帐户即可。</li>
+ <li>结帐流程由 Google Play 自动处理,其界面与应用购买流程的界面相同。</li>
+ </ul>
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#api">应用内结算 API</a></li>
+ <li><a href="#products">应用内商品</a>
+ <ol>
+ <li><a href="#prodtypes">商品类型</a>
+ </li></ol>
+ </li>
+ <li><a href="#console">Google Play 开发者控制台</a></li>
+ <li><a href="#checkout">Google Play 购买流程</a></li>
+ <li><a href="#samples">示例应用</a></li>
+ <li><a href="#migration">迁移注意事项</a></li>
+ </ol>
+ <h2>相关示例</h2>
+ <ol>
+ <li><a href="{@docRoot}training/in-app-billing/preparing-iab-app.html#GetSample">示例应用(第 3 版)</a></li>
+ </ol>
+ </div>
+ </div>
+
+ <p>本文将介绍您需了解的应用内结算基本组件和功能,以便您将应用内结算功能添加到应用中。</p>
+
+ <p class="note"><b>注意</b>:请务必遵守目标国家/地区(您要在这些国家/地区分发应用)的适用法律。例如,在欧盟国家,<a href="http://ec.europa.eu/justice/consumer-marketing/unfair-trade/unfair-practices/">不公平商业行为指令</a>的相关法律禁止直接规劝儿童购买广告产品或者劝说其父母或其他成年人为儿童购买广告产品。请参阅<a href="http://ec.europa.eu/consumers/enforcement/docs/common_position_on_online_games_en.pdf">欧盟消费者保护机构的立场</a>,详细了解此主题及其他主题。
+ </p>
+
+ <h2 id="api">应用内结算 API</h2>
+ <p>您的应用会通过相应 API (由设备上安装的 Google Play 应用提供)来访问应用内结算服务。然后,Google Play 应用会在您的应用和 Google Play 服务器之间传送结算请求和响应。实际上,您的应用从不直接与 Google Play 服务器通信,而是通过进程间通信 (IPC) 向 Google Play 应用发送结算请求并接收 Google Play 应用发来的响应。此外,您的应用也不管理其与 Google Play 服务器之间的任何网络连接。</p>
+ <p>应用内结算只能在您通过 Google Play 发布的应用中实施。要完成应用内购买请求,Google Play 应用必须能够通过网络访问 Google Play 服务器。</p>
+
+ <p>应用内结算第 3 版是最新版本,依然具有非常广泛的兼容性,可用于各种 Android 设备。运行 Android 2.2 或更高版本且安装了最新版本的 Google Play 商店的设备(<a href="{@docRoot}about/dashboards/index.html">绝大多数</a>有效设备)都支持使用应用内结算第 3 版。</p>
+
+ <h4>第 3 版的功能</h4>
+ <ul>
+ <li>通过简化的 API 发送请求。此 API 可让您轻松地向 Google Play 请求商品详情、订购应用内商品以及根据用户对商品的所有权快速恢复商品</li>
+ <li>订单信息会在购买完成时同步传送到设备上</li>
+ <li>所有购买都是“托管的”(也就是说,Google Play 负责记录用户对应用内商品的所有权)。对于同一件应用内商品,用户无论何时都只能拥有该商品的一个副本而不能拥有多个副本</li>
+ <li>您可以消耗所购商品。当消耗后,该商品将切换回“未被拥有”状态,且可被用户从 Google Play 中再次购买</li>
+ <li>支持<a href="{@docRoot}google/play/billing/billing_subscriptions.html">订阅</a></li>
+ </ul>
+ <p>要详细了解应用内结算的其他版本,请参阅<a href="{@docRoot}google/play/billing/versions.html">版本说明</a>。</p>
+
+ <h2 id="products">应用内商品</h2>
+ <p>应用内商品是您在应用内向用户出售的数字商品,包括游戏代币、旨在改善用户体验的应用功能升级以及应用中的新增内容。</p>
+ <p>应用内结算只能用于销售数字内容,而不能用于销售实体商品、个人服务或任何需要进行实物交付的商品/服务。与明码标价的应用不同,一旦用户购买了应用内商品,系统便不会提供退款窗口。</p>
+ <p>Google Play 不提供任何形式的内容交付,您需要自行交付在应用内销售的数字内容。应用内商品始终与一个且仅与一个应用明确关联。也就是说,在一个应用中不能购买为另一个应用发布的应用内商品,即使这两个应用来自相同的开发者也是如此。</p>
+
+ <h3 id="prodtypes">商品类型</h3>
+ <p>应用内结算支持多种商品类型,因此您可灵活选择如何通过您的应用获利。无论是哪种商品,您均能通过 Google Play 开发者控制台进行定义。</p>
+ <p>您可以为应用内结算应用指定以下两类商品:“托管的应用内商品”和“订阅”。<em></em><em></em>Google Play 会按用户帐户来处理和跟踪您应用中的应用内商品和订阅的所有权。<a href="{@docRoot}google/play/billing/api.html#producttypes">详细了解应用内结算第 3 版支持的商品类型</a>。</p>
+
+ <h2 id="console">Google Play 开发者控制台</h2>
+ <p>在开发者控制台上,您不仅能发布应用内结算应用,还能管理您应用中出售的各种应用内商品。</p>
+ <p>对于与您的应用相关联的数字商品(包括一次性商品和定期订阅),您可以为其创建商品列表。对于每件商品,您都可以定义下列信息:唯一商品 ID(也称为 SKU)、商品类型、定价、说明以及 Google Play 应如何处理和用户对该商品的购买。</p>
+ <p>您还可以创建测试帐户,授权这些帐户测试尚未发布的应用。</p>
+ <p>要了解如何使用开发者控制台配置您的应用内商品和商品列表,请参阅<a href="{@docRoot}google/play/billing/billing_admin.html">管理应用内结算</a>。</p>
+
+ <h2 id="checkout">Google Play 购买流程</h2>
+ <p>Google Play 使用的结帐后端服务与用于应用购买的服务相同,因此您的用户将获得一致且熟悉的购买流程使用体验。</p>
+ <p class="note"><strong>重要提示</strong>:您必须有 Google 电子钱包商家帐户才能在 Google Play 上使用应用内结算服务。</p>
+ <p>购买开始时,您的应用需要针对相应的应用内商品发送结算请求。然后,Google Play 会处理此次交易的所有结帐详情,包括请求和验证付款方式以及处理财务交易。</p>
+ <p>当结帐流程完成后,Google Play 会向您的应用发送购买详情,例如订单号、订单日期和时间以及所付价格。您的应用从不需要处理任何财务交易,这些事宜完全 Google Play 负责。</p>
+
+ <h2 id="samples">示例应用</h2>
+ <p>为了帮您将应用内结算集成到您的应用中,Android SDK 提供了一个示例应用,向您演示如何在应用内销售应用内商品和订阅。</p>
+
+ <p><a href="{@docRoot}training/in-app-billing/preparing-iab-app.html#GetSample">API 第 3 版的 TrivialDrive 示例</a>演示了如何使用应用内结算 API 第 3 版在赛车游戏中实施应用内商品和订阅购买。该应用不仅演示了如何发送应用内结算请求以及处理来自 Google Play 的同步响应,还演示了如何通过此 API 记录商品的消耗情况。第 3 版示例包括多种工具类,非常便于处理应用内结算操作和执行自动签名验证。</p>
+
+ <p class="caution"><strong>建议</strong>:请务必在发布应用前混淆其中的代码。有关详情,请参阅<a href="{@docRoot}google/play/billing/billing_best_practices.html">安全性和设计</a>。</p>
+
+ <h2 id="migration">迁移注意事项</h2>
+ <p>应用内结算 API 第 2 版已弃用,将于 2015 年 1 月关闭。如果您现有的应用内结算实施使用的是 API 第 2 版或更低版本,则您必须迁移到<a href="{@docRoot}google/play/billing/api.html">应用内结算第 3 版</a>。</p>
+
+ <p>如果您在发布的应用中销售应用内商品,请注意以下事项:</p>
+ <ul>
+ <li>您之前在开发者控制台中定义的托管商品和订阅仍能使用第 3 版。</li>
+ <li>对于您已经为现有应用定义的非托管商品,如果您使用 API 第 3 版针对这些商品提出购买请求,这些商品将被视为托管商品。您无需在开发者控制台中为这些商品创建新的商品条目,且能使用相同的商品 ID 来购买这些商品。如果您使用 API 第 2 版或更低版本提出购买请求,这些商品仍会被视为非托管商品。
+ </li></ul>
+
+
+
diff --git a/docs/html-intl/intl/zh-cn/google/play/billing/billing_testing.jd b/docs/html-intl/intl/zh-cn/google/play/billing/billing_testing.jd
new file mode 100644
index 0000000..2dcc7a4
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/google/play/billing/billing_testing.jd
@@ -0,0 +1,190 @@
+page.title=测试应用内结算
+parent.title=In-app Billing
+parent.link=index.html
+@jd:body
+
+ <div id="qv-wrapper">
+ <div id="qv">
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#testing-purchases">测试应用内购买</a></li>
+ <li><a href="#billing-testing-static">使用静态回复进行测试</a></li>
+ <li><a href="#billing-testing-real">设置测试购买</a></li>
+ <li><a href="#draft_apps">草稿应用不再受支持</a></li>
+ </ol>
+ <h2>另请参见</h2>
+ <ol>
+ <li><a href="{@docRoot}google/play/billing/billing_overview.html">应用内结算概述</a></li>
+ <ol>
+ </ol></ol></div>
+ </div>
+
+ <p>Google Play 开发者控制台提供了一些帮助你测试应用内结算实施情况的工具:</p>
+
+ <ul>
+ <li>测试购买,让拥有测试帐户的用户真正购买你发布的应用内商品,但不向这些用户帐户实际收取费用。</li>
+ <li>来自 Google Play 的静态结算回复,用于在开发初期进行测试
+ </li></ul>
+
+ <p>要测试应用的应用内结算,必须将该应用安装在 Android 设备上。你不能使用 Android 模拟器测试应用内结算。用于测试的设备必须运行标准的 Android 1.6 或更高版本的平台(API 级别 4 或更高级别),并且要安装最新版本的 Google Play 应用。如果设备运行的不是最新的 Google Play 应用,你的应用将不能向 Google Play 发送应用内结算请求。有关如何设置设备以便用于开发 Android 应用的一般信息,请参阅<a href="{@docRoot}tools/device.html">使用硬件设备</a>。</p>
+
+ <h2 id="testing-purchases">测试应用内购买</h2>
+
+ <p>应用内结算实施就绪后,你可以通过两种方法测试应用内 SKU 的购买:</p>
+
+ <ul>
+ <li><strong>测试购买</strong>:让你选择的许可测试用户在应用发布之前购买应用内商品,但不向这些用户收取费用;</li>
+ <li><strong>真正购买</strong>:让普通用户真正购买你的应用内商品,并根据用户的付款方式实际收取费用。在这种情况下,你可以利用 Google Play 的 Alpha 和 Beta 测试用户小组管理哪些用户可以使用你的实施进行真正的购买。</li>
+ </ul>
+
+ <p>下面的各个部分介绍了有关如何使用这些方法进行测试和验证的详情。</p>
+
+ <h3 id="test-purchases">测试购买(应用内结算沙盒)</h3>
+
+ <p>测试购买提供了一种安全、方便的方法,让你在开发过程中或准备发布期间,对你的应用内结算实施情况进行大规模的测试。测试期间,经过授权的用户帐户可在你的应用尚未发布时通过 Google Play 购买应用内商品,不过这些用户帐户不用实际支付费用。</p>
+
+ <p>获得测试访问权限之后,这些用户可以侧载你的应用,并测试商品的完整销售、购买和订单完成流程。测试购买会产生真实的订单,Google Play 会采用与处理其他订单相同的方式对其进行处理。购买完成后,Google Play 不会让这些订单进入财务流程,从而确保不会向用户帐户实际收取费用,并在 14 天后自动取消已完成的订单。</p>
+
+ <h4 id="setup">设置测试购买</h4>
+
+ <p>设置测试购买很简单,你可以选择任何用户帐户作为测试帐户,而测试帐户中的任何用户都可以通过可用的付款方式进行测试购买(当然用户不需要通过付款方式支付任何费用)。</p>
+
+ <p>首先,上传并发布你希望测试者能够购买的应用内商品。你可以在开发者控制台中上传和发布应用内商品。请注意,你可以在发布 APK 之前上传并发布应用内商品。</p>
+
+ <p>然后,为获得授权的用户创建许可测试帐户。在开发者控制台中,转到<strong>设置</strong> > <strong>帐户详情</strong>,然后在“许可测试”部分将相应地址添加到<strong>可用于测试的 Gmail 帐户</strong>字段。有关详情,请参阅<a href="#billing-testing-test">设置测试购买</a>。</p>
+
+ <p>在你将用户添加为许可测试帐户并保存更改之后,这些用户在 15 分钟内即可开始购买你的应用内商品。随后你可以向测试者发布你的应用并提供收集反馈的方法。</p>
+
+ <p class="note"><strong>注意</strong>:要进行测试购买,许可测试帐户必须设置在用户的 Android 设备上。如果设备上有多个帐户,则必须使用下载应用时所用的帐户进行购买。如果没有帐户下载过应用,则使用第一个帐户进行购买。用户可以通过展开购买对话框来确认执行购买的帐户。</p>
+
+ <h4 id="tp-account">测试购买和开发者帐户</h4>
+ <p>经过授权的许可测试帐户在 Google Play 中与你的开发者帐户相关联,而不是与特定 APK 或程序包名称相关联。被标识为测试帐户的帐户可以购买你帐户的任何应用内商品而不用支付费用。</p>
+
+ <h4 id="purchase-flow">购买流程的详情</h4>
+ <p>在测试购买期间,用户可以测试应用中实际的销售、购买和订单完成流程。购买时,应用内商品与普通商品一样显示,并包含实际价格。不过,Google Play 会在购买对话框中心处显示通知,说明这是测试购买,以便辨识。
+ </p>
+
+ <h4 id="cancelling">取消已完成的测试购买</h4>
+ <p>Google Play 会累积每个用户已完成的测试购买,但不会将相关信息传递到财务流程。经过一段时间后,Google Play 会自动取消这些购买以进行清理。</p>
+
+ <p>在某些情况下,你可能希望手动取消测试购买以便继续进行测试。要取消购买,你可以:</p>
+
+ <ul>
+ <li>等待交易到期:Google Play 会在购买日期的 14 天后清除已完成的测试购买。</li>
+ <li>手动取消购买:你可以转到 Google 电子钱包 Merchant Center,找到相应交易,将其取消。通过查找订单编号即可找到交易。</li>
+ </ul>
+
+ <h4 id="requirements">使用测试购买的要求</h4>
+ <p>如果你打算使用测试购买,请注意以下要求和限制:</p>
+ <ul>
+ <li>只有许可测试帐户可以进行测试购买,而且应用要使用应用内结算 API 第 3 版。</li>
+ <li>只有应用内商品可以进行测试购买,应用内订阅则不可以。</li>
+ </ul>
+
+ <h3 id="transations">使用真实交易进行测试</h3>
+ <p>在准备发布使用应用内结算的应用时,你可以先利用 Google Play Alpha/Beta 发布选项进行来验证和负荷测试你的应用内结算实施情况,然后再向所有用户发布应用。</p>
+
+ <p>Alpha/Beta 测试小组内的真实用户(由你选择)可以通过 Google Play 安装你的应用并测试应用内商品。他们可以通过其在 Google Play 中的常规付款方式进行真正的购买,而他们的帐户中会产生实际费用。请注意,如果你的 Alpha 和 Beta 发布小组中包括测试许可帐户,这些用户将只能进行测试购买。</p>
+
+
+ <h2 id="billing-testing-static">使用静态回复进行测试</h2>
+
+ <p>我们建议你先使用来自 Google Play 的静态回复测试应用内结算的实施情况。这样一来,你可以确认应用能否正确处理主要 Google Play 回复,以及你的应用能否正确验证签名。即使应用尚未发布,你也可以执行此测试。</p>
+
+ <p>要使用静态回复测试你的实施,请使用具有预留的商品 ID 的特定商品发送应用内结算请求。每个预留的商品 ID 均会从 Google Play 返回特定的静态回复。当你使用预留的商品 ID 发送应用内结算请求时不会发生资金转移。此外,当你使用预留的商品 ID 发送结算请求时不能指定付款方式。图 1 显示了商品 ID 为“android.test.purchased”的预留商品的结帐流程。</p>
+
+ <img src="{@docRoot}images/billing_test_flow.png" height="381" id="figure1" />
+ <p class="img-caption">
+ <strong>图 1. </strong>特定的预留商品“android.test.purchased”的电子钱包流程
+ </p>
+
+ <p>你不需要在应用的商品列表中列出预留的商品。Google Play 已经知道预留的商品 ID。此外,你不需要将应用上传到开发者控制台,就可以使用预留的商品 ID 执行静态回复测试。你只需在设备上安装你的应用,登录到设备,然后使用预留的商品 ID 发送结算请求。</p>
+
+ <p class="note"><strong>注意</strong>:过去,你可以通过上传未发布的“草稿”版本来测试应用,但现在系统已不再支持此功能。不过,现在你可以在将应用上传到 Google Play 商店之前就使用静态回复测试应用。有关详情,请参阅<a href="#draft_apps">草稿应用不再受支持</a>。
+
+ <p>用于测试静态应用内结算回复的预留商品 ID 有四种:</p>
+
+ <ul>
+ <li><strong>android.test.purchased</strong>
+ <p>当你使用此商品 ID 发送应用内结算请求时,Google Play 会假定你成功购买了商品而做出回复。回复内容包括一个 JSON 字符串,其中包含虚拟的购买信息(例如虚拟的订单 ID)。在某些情况下,JSON 字符串是经过签名的,并且回复中也包括签名,因此你可以利用这些回复测试你的签名验证实施情况。</p>
+ </li>
+ <li><strong>android.test.canceled</strong>
+ <p>当你使用此商品 ID 发送应用内结算请求时,Google Play 会假定购买已被取消而做出回复。如果订购流程出现问题(例如信用卡无效,或你在用户付款之前取消了订单),就会发生这种情况。</p>
+ </li>
+ <li><strong>android.test.refunded</strong>
+ <p>当你使用此商品 ID 发送应用内结算请求时,Google Play 会假定购买已退款而做出回复。退款不能通过 Google Play 的应用内结算服务发起,而是必须由你(商家)发起。在你通过 Google 电子钱包商家帐户处理退款请求之后,Google Play 会向你的应用发送一条退款信息。只有当 Google Play 收到来自 Google 电子钱包的退款已执行的通知时,Google Play 才会发送此消息。有关退款的更多详情,请参阅<a href="{@docRoot}google/play/billing/v2/api.html#billing-action-notify">处理 IN_APP_NOTIFY 信息</a>和<a href="http://support.google.com/googleplay/android-developer/bin/answer.py?hl=zh-CN&answer=1153485">应用内结算定价</a>。</p>
+ </li>
+ <li><strong>android.test.item_unavailable</strong>
+ <p>当你使用此商品 ID 发送应用内结算请求时,Google Play 会假定所购商品在你应用的商品列表中不存在而做出回复。</p>
+ </li>
+ </ul>
+
+ <p>在某些情况下,预留的商品可能会返回经过签名的静态回复,这样你可以测试应用中的签名验证。只有当运行应用的用户拥有<a href="{@docRoot}distribute/googleplay/start.html">开发者帐户</a>或<a href="{@docRoot}google/play/billing/billing_admin.html#billing-testing-setup">测试帐户</a>时,预留的商品才返回经过签名的回复。
+
+ <p>要使用预留的商品 ID 发送应用内结算请求,你只需构建一个常规的 <code>REQUEST_PURCHASE</code> 请求即可,不过请使用上文介绍的一个预留商品 ID,而不要使用你的应用商品列表中的真实商品 ID。</p>
+
+ <p>要使用预留的商品 ID 测试应用,请按以下步骤操作:</p>
+
+ <ol>
+ <li><strong>在 Android 设备上安装你的应用。</strong>
+ <p>你不能使用模拟器测试应用内结算,而是必须在设备上安装应用才能测试应用内结算。</p>
+ <p>要了解如何在设备上安装应用,请参阅<a href="{@docRoot}tools/building/building-cmdline.html#RunningOnDevice">在设备上运行</a>。</p>
+ </li>
+ <li><strong>使用你的开发者帐户登录到设备。</strong>
+ <p>如果你只是使用预留的商品 ID 进行测试,则不需要使用测试帐户。</p>
+ </li>
+ <li><strong>确保你的设备运行的是受支持的 Google Play 应用版本或 MyApps 应用版本。</strong>
+ <p>如果你的设备运行的是 Android 3.0,则应用内结算要求使用版本为 5.0.12(或更高版本)的 MyApps 应用。如果你的设备运行的是其他版本的 Android,则应用内结算要求使用版本为 2.3.4(或更高版本)的 Google Play 应用。要了解如何查看 Google Play 应用的版本,请参阅<a href="http://market.android.com/support/bin/answer.py?answer=190860">更新 Google Play</a>。</p>
+ </li>
+ <li><strong>运行应用并购买预留的商品 ID。</strong></li>
+ </ol>
+
+ <p class="note"><strong>注意</strong>:使用预留的商品 ID 发送应用内结算请求会覆盖常用的 Google Play 生产系统。当你针对某个预留的商品 ID 发送应用内结算请求时,服务的质量会比不上生产环境。</p>
+
+ <h2 id="billing-testing-test">设置测试真实购买</h2>
+
+ <p>完成静态回复测试,并确认应用中的签名验证正常工作之后,你就可以通过执行实际的应用内购买,来测试应用内结算的实施情况。测试真实的应用内购买能让你测试端到端的应用内结算体验,包括从 Google Play 进行实际购买,以及用户在你的应用中体验的实际结帐流程。</p>
+
+ <p class="note"><strong>注意</strong>:你可以将应用发布到 <a href="{@docRoot}distribute/googleplay/developer-console.html#alpha-beta">Alpha 发布渠道</a>来进行端到端的测试。也就是说,这样做你可以将应用发布到 Google Play 商店,但限制为仅向你指定的测试者提供该应用。</p>
+
+ <p>要通过实际的应用内购买测试你的应用内结算实施情况,请在 Google Play 开发者控制台注册至少一个测试帐户。你不能使用自己的开发者帐户测试完整的应用内购买流程,因为 Google 电子钱包不允许你购买自己的商品。如果你之前没有设置过测试帐户,请参阅<a href="{@docRoot}google/play/billing/billing_admin.html#billing-testing-setup">设置测试帐户</a>。</p>
+
+ <p>此外,测试帐户只能购买你的商品列表中已经发布的商品。虽然你可以不发布应用,但必须发布商品。</p>
+
+ <p>要通过实际购买测试你的应用内结算实施情况,请按以下步骤操作:</p>
+
+ <ol>
+ <li><strong>通过开发者控制台将你的应用上传到 <a href="{@docRoot}distribute/googleplay/developer-console.html#alpha-beta">Alpha 发布渠道</a>。</strong>
+
+ <p class="note"><strong>注意</strong>:过去,你可以通过上传未发布的“草稿”版本来测试应用,但现在系统已不再支持此功能。现在你必须将应用发布到 Alpha 或 Beta 发布渠道,才能进行测试。有关详情,请参阅<a href="#draft_apps">草稿应用不再受支持</a>。
+
+ </p></li>
+ <li><strong>将商品添加到应用的商品列表。</strong>
+ <p>请务必发布商品(应用可以保持未发布状态)。要了解如何操作,请参阅<a href="{@docRoot}google/play/billing/billing_admin.html#billing-catalog">创建商品列表</a>。</p>
+ </li>
+ <li><strong>在 Android 设备上安装你的应用。</strong>
+ <p>你不能使用模拟器测试应用内结算,而是必须在设备上安装应用才能测试应用内结算。</p>
+ <p>要了解如何在设备上安装应用,请参阅<a href="{@docRoot}tools/building/building-cmdline.html#RunningOnDevice">在设备上运行</a>。</p>
+ </li>
+ <li><strong>确保你的设备运行的是受支持的 Google Play 应用版本或 MyApps 应用版本。</strong>
+ <p>如果你的设备运行的是 Android 3.0,则应用内结算要求使用版本为 5.0.12(或更高版本)的 MyApps 应用。如果你的设备运行的是其他版本的 Android,则应用内结算要求使用版本为 2.3.4(或更高版本)的 Google Play 应用。要了解如何查看 Google Play 应用的版本,请参阅<a href="http://market.android.com/support/bin/answer.py?answer=190860">更新 Google Play</a>。</p>
+ </li>
+ <li><strong>在应用中进行应用内购买。</strong></li>
+ </ol>
+
+ <p class="note"><strong>注意</strong>:在设备上更改主要帐户的唯一方法是恢复出厂设置,请确保先使用你的主要帐户在设备上登录。</p>
+
+ <p>完成对应用内结算实施情况的测试之后,你就可以在 Google Play 上发布应用了。你可以按照常规步骤<a href="{@docRoot}tools/publishing/preparing.html">准备</a>、<a href="{@docRoot}tools/publishing/app-signing.html">登录</a>以及<a href="{@docRoot}distribute/tools/launch-checklist.html">在 Google Play 上发布</a>。
+ </p>
+
+ <h2 id="draft_apps">草稿应用不再受支持</h2>
+
+ <p>过去,你可以发布应用的“草稿”版本进行测试,但现在系统已不再支持此功能。现在你可以通过两种方法在 Google Play 商店中测试预览版应用的功能运行情况:</p>
+
+ <ul>
+
+ <li>你可以将应用发布到 <a href="{@docRoot}distribute/googleplay/developer-console.html#alpha-beta">Alpha 或 Beta 发布渠道</a>。这样,应用将进入 Google Play 商店,但只提供给你添加到“白名单”中的测试者。</li>
+
+ <li>在少数情况下,你可以使用未发布的应用测试 Google Play 的功能。例如,你可以使用<a href="{@docRoot}google/play/billing/billing_testing.html#billing-testing-static">静态回复</a>和特殊的预留商品 ID(始终返回特定结果,例如“已购买”或“已退款”)来测试未发布应用的应用内结算支持。</li>
+
+ </ul>
\ No newline at end of file
diff --git a/docs/html-intl/intl/zh-cn/google/play/billing/index.jd b/docs/html-intl/intl/zh-cn/google/play/billing/index.jd
new file mode 100644
index 0000000..2ddd264
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/google/play/billing/index.jd
@@ -0,0 +1,47 @@
+page.title=Google Play 应用内结算
+page.metaDescription=应用内计费可让你以一次性的购买或订阅方式去销售数码内容。
+page.image=/images/play_dev.jpg
+
+@jd:body
+
+ <p>应用内结算是一项 Google Play 服务,可让你在自己的应用内销售数字内容。你可以使用该服务销售很多内容,包括媒体文件或照片等可下载的内容、游戏关卡或药水等虚拟内容、高级服务及功能,等等。你可以使用应用内结算销售下面这两类商品:</p>
+
+ <div class="sidebox-wrapper">
+ <div class="sidebox">
+ <h2><strong>应用内结算的新变化</strong></h2>
+ <ul>
+ <li><strong>IAB 第 2 版关闭</strong> - 应用内结算 API 第 2 版已弃用,将于 2015 年 1 月关闭。如果你的应用仍在使用应用内结算第 2 版,请尽快迁移到 API 第 3 版。</li>
+ <li><strong>季节性订阅</strong> - 你现在可以设置定期的<a href="billing_subscriptions.html#user-billing">季节性订阅</a>,即订阅在每年的同一天开始并在同一天结束(例如,每年 9 月 1 日开始、次年 4 月 10 日结束的体育订阅)。</li>
+ <li><strong>推迟订阅结算</strong> - 你可以将订阅者的下一个结算日<a href="billing_subscriptions.html#deferred-billing">推迟</a>到你选择的日期。用户在推迟期内仍能访问相关内容,但不用缴费。</li>
+ <li><strong>Google Play Developer API</strong> - 利用 <a href="{@docRoot}google/play/billing/gp-purchase-status-api.html">Google Play Developer API</a>,你可以执行各种发布和应用管理任务。该 API 中包含之前称为“Purchase Status API”的功能。<em></em> </li>
+ <li><strong>撤消订阅/退还订阅费</strong> - 你可以使用 Google Play Developer API <a href="billing_subscriptions.html#refunds">撤消用户的订阅并退还其订阅费</a>。如果你这样做,用户的订阅将立即结束,且系统会退还其最近的订阅付款。</li>
+ <li><strong>应用内结算第 3 版</strong> - <a href="{@docRoot}google/play/billing/api.html">最新版本</a>的应用内结算采用更易实施的同步 API,可让你更有效地管理应用内商品和订阅。</li>
+ </ul>
+ </div>
+ </div>
+
+ <ul>
+ <li>标准应用内商品(一次性结算);或</li>
+ <li>订阅(定期自动结算)</li>
+ </ul>
+
+ <p>如果你使用应用内结算服务来销售商品,那么无论你销售的是应用内商品还是订阅,Google Play 都会负责处理所有结帐详情,因此你的应用从不需要直接处理任何财务交易。Google Play 使用的结帐后端服务与用于应用购买的服务相同,因此你的用户将获得一致且熟悉的购买流程使用体验。</p>
+
+ <p>你通过 Google Play 发布的所有应用都可以实施应用内结算。只要你有 Google Play 开发者控制台帐户和 Google 电子钱包商家帐户(无需创建任何特殊帐户或进行任何注册),即可实施该服务。</p>
+
+ <p>为了帮你将应用内结算集成到你的应用中,Android SDK 提供了一个示例应用,向你演示如何在应用内销售标准的应用内商品和订阅。</p>
+
+ <p>要开始使用应用内结算,请先阅读下面介绍的文档或参加<a href="{@docRoot}training/in-app-billing/index.html">销售应用内商品</a>培训课程。</p>
+
+ <dl>
+ <dt><strong><a href="{@docRoot}google/play/billing/billing_overview.html">概述</a></strong></dt>
+ <dd>请阅读本文,了解应用内结算的基本概念。</dd>
+ <dt><strong><a href="{@docRoot}google/play/billing/api.html">API 第 3 版</a></strong></dt>
+ <dd>请阅读这部分中的文档,了解应用内结算最新版本概述以及实施详情和 API 参考。</dd>
+ <dt><strong><a href="{@docRoot}google/play/billing/billing_best_practices.html">安全性和设计</a></strong></dt>
+ <dd>请参阅这些最佳做法,以帮助确保你的应用内结算实施安全稳妥、设计合理。</dd>
+ <dt><strong><a href="{@docRoot}google/play/billing/billing_testing.html">测试应用内结算</a></strong></dt>
+ <dd>了解应用内结算测试工具的工作原理,以及如何测试应用内结算实施。</dd>
+ <dt><strong><a href="{@docRoot}google/play/billing/billing_admin.html">管理应用内结算</a></strong></dt>
+ <dd>了解如何设置商品列表、注册测试帐户以及处理退款。</dd>
+ </dl>
diff --git a/docs/html-intl/intl/zh-cn/index.jd b/docs/html-intl/intl/zh-cn/index.jd
new file mode 100644
index 0000000..590332f
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/index.jd
@@ -0,0 +1,107 @@
+fullpage=true
+page.viewport_width=970
+excludeFromSuggestions=true
+page.metaDescription=The official site for Android developers. Provides the Android SDK and documentation for app developers and designers.
+page.customHeadTag=<meta name="google-site-verification" content="sa-bIAI6GKvct3f61-WpRguHq-aNjtF7xJjMTSi79as" />
+
+@jd:body
+
+
+
+
+
+<div class="home-new-carousel-1">
+ <div class="fullscreen-carousel-content">
+ <div class="vcenter">
+ <div class="wrap clearfix">
+
+ <div class="static resource-flow-layout wrap col-16">
+ <div class="resource resource-card resource-card-18x6">
+
+ <div class="landing-section-header">
+ <div class="col-10"><img src="{@docRoot}images/home/l-hero_2x.png"
+ srcset="{@docRoot}images/home/l-hero.png 1x, {@docRoot}images/home/l-hero_2x.png 2x"
+ width="510" style="margin:20px 30px 0 30px"></div>
+ <div class="col-5" style=" margin-top:70px ">
+ <h3 stye="font-weight:300;">Android 5.0 Lollipop</h3>
+ <p>在 Android 5.0 的版本更新中,我们添加了多种可用于你的应用程序的新功能,比如锁屏通知,一个全新的相机API,OpenGL ES 3.1,以及新的 Material Design 界面等等。</p>
+ <a href="{@docRoot}about/versions/lollipop.html" class="landing-button landing-primary">了解详情</a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <h2> </h2>
+
+ <div style="margin-top:20px" class="resource-widget resource-flow-layout wrap col-16
+ no-section" data-query="collection:index/primary/zhcn" data-resourcestyle="card"
+ data-sortorder="-timestamp" data-maxresults="3" data-cardsizes="6x2,6x2,6x2"></div>
+
+ </div> <!-- end .wrap -->
+ </div> <!-- end .vcenter -->
+ </div> <!-- end .fullscreen-carousel-content -->
+</div> <!-- end .fullscreen-carousel -->
+
+
+
+
+<div class="actions-bar" style="margin-top:20px">
+ <div class="wrap">
+ <div class="actions">
+ <div><a href="/sdk/index.html">下载 SDK</a></div>
+ <div><a href="/samples/index.html">浏览示例</a></div>
+ <div><a href="//www.youtube.com/user/androiddevelopers">观看视频</a></div>
+ <div><a href="/distribute/googleplay/developer-console.html">管理应用</a></div>
+ </div><!-- end .actions -->
+ </div><!-- end .wrap -->
+</div><!-- end .actions-bar -->
+
+
+
+<div class="landing-rest-of-page">
+ <div class="landing-section">
+ <div class="wrap">
+ <div class="landing-section-header">
+
+ <div class="landing-h1" style="margin-top:0px">专为跨屏世界打造</div>
+ <div class="landing-subhead" style="margin-top:20px">
+ 全球数亿手持设备安装的都是 Android 系统。<br />
+ 现在 Android 系统还支持以下这些备受期待的新设备。
+ </div>
+ </div>
+ <div class="landing-body" style="margin-top:50px">
+ <div class="landing-breakout cols">
+ <div class="col-3-wide">
+ <img src="{@docRoot}images/home/wear-wordmark.png" />
+ <img src="{@docRoot}images/home/wear.png" />
+ <p class="landing-small">
+ 让用户随时随地获得需要的信息。
+ </p>
+ <p class="landing-small">
+ <a href="/wear/index.html">了解 Android Wear</a>
+ </p>
+ </div>
+ <div class="col-3-wide">
+ <img src="{@docRoot}images/home/tv-wordmark.png" />
+ <img src="{@docRoot}images/home/tv.png" />
+ <p class="landing-small">
+ 针对大屏幕打造应用,使你的内容引人入胜。
+ </p>
+ <p class="landing-small">
+ <a href="/tv/index.html">了解 Android TV</a>
+
+ </p>
+ </div>
+ <div class="col-3-wide">
+ <img src="{@docRoot}images/home/auto-wordmark.png" />
+ <img src="{@docRoot}images/home/auto.png" />
+ <p class="landing-small">
+ 将你的音乐应用扩展到车载娱乐系统。
+ </p>
+ <p class="landing-small">
+ <a href="/auto/index.html">了解 Android Auto</a>
+ </p>
+ </div>
+ </div>
+ </div>
+ </div> <!-- end .wrap -->
+ </div> <!-- end .landing-section -->
\ No newline at end of file
diff --git a/docs/html-intl/intl/zh-cn/resources.jd b/docs/html-intl/intl/zh-cn/resources.jd
new file mode 100644
index 0000000..ac63901
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/resources.jd
@@ -0,0 +1,51 @@
+page.title=中文资源
+page.viewport_width=970
+page.type=guide
+section.landing=true
+header.hide=1
+nonavpage=true
+page.metaDescription=我们翻译了以下一些网站资源,希望能帮助你开始设计、开发和在全球发布你的Android应用。
+
+@jd:body
+
+
+<div class="dynamic-grid">
+
+<h2>你的语言的资源</h2>
+<p style="margin-bottom:2em;">我们翻译了以下一些网站资源,希望能帮助你开始设计、开发和发布你的Android应用程序到全球。</p>
+
+<h3 style="font-size:18px;font-weight:bold">检查清单</h3>
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:overview/zhcn/1"
+ data-sortOrder=""
+ data-cardSizes="6x6,6x6,6x2x3"
+ data-maxResults="5"></div>
+
+<h3 style="font-size:18px;font-weight:bold">Google Play 应用内结算</h3>
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:overview/zhcn/2"
+ data-sortOrder=""
+ data-cardSizes="6x6,6x6,6x2x3"
+ data-maxResults="5"></div>
+
+<h3 style="font-size:18px;font-weight:bold">工具</h3>
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:overview/zhcn/3"
+ data-sortOrder=""
+ data-cardSizes="6x2x3,6x6,6x6"
+ data-maxResults="5"></div>
+
+<h3 style="font-size:18px;font-weight:bold">培训</h3>
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:overview/zhcn/4"
+ data-sortOrder=""
+ data-cardSizes="6x6,12x2x3"
+ data-maxResults="5"></div>
+
+
+</div>
+
diff --git a/docs/html-intl/intl/zh-cn/tools/help/proguard.jd b/docs/html-intl/intl/zh-cn/tools/help/proguard.jd
new file mode 100644
index 0000000..0e8cc7a
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/tools/help/proguard.jd
@@ -0,0 +1,133 @@
+page.title=ProGuard
+parent.title=Tools
+parent.link=index.html
+page.type=工具
+@jd:body
+
+ <div id="qv-wrapper">
+ <div id="qv">
+ <h2>本文内容</h2>
+
+ <ol>
+ <li><a href="#enabling">启用 ProGuard</a></li>
+
+ <li><a href="#configuring">配置 ProGuard</a></li>
+
+ <li>
+ <a href="#decoding">解码混淆后的堆栈跟踪信息</a>
+
+ <ol>
+ <li><a href="#considerations">调试已发布应用时应注意的事项</a></li>
+ </ol>
+ </li>
+ </ol>
+
+ <h2>另请参见</h2>
+
+ <ol>
+ <li>
+ <a href="http://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/introduction.html">ProGuard 手册 »</a>
+ </li>
+ <li>
+ <a href="http://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/retrace/introduction.html">ProGuard ReTrace 手册 »</a>
+ </li>
+ </ol>
+ </div>
+ </div>
+
+ <p>ProGuard 工具通过移除无用的代码以及使用语义隐晦的名称来重命名类、字段和方法,从而达到压缩、优化和混淆代码的目的。最终您将获得一个较小的 <code>.apk</code> 文件,此文件更难于进行反向工程。由于 ProGuard 会使应用更难于进行反向工程,因此当应用使用对安全性要求极高的功能时(例如,当您<a href="{@docRoot}google/play/licensing/index.html">向应用授予许可</a>时),您必须使用此工具。</p>
+
+ <p>ProGuard 已集成到 Android 构建系统,所以您无需手动调用此工具。只有当您在发布模式下构建应用时,ProGuard 才会运行,因此当您在调试模式下构建应用时,就无需处理混淆后的代码。是否运行 ProGuard 完全由您决定,但我们强烈建议您运行该工具。</p>
+
+ <p>本文介绍如何启用和配置 ProGuard,以及如何使用 <code>retrace</code> 工具解码混淆后的堆栈跟踪信息。</p>
+
+ <h2 id="enabling">启用 ProGuard</h2>
+
+ <p>当您创建 Android 项目时,系统会在该项目的根目录中自动生成一个 <code>proguard.cfg</code> 文件。此文件将定义 ProGuard 会如何优化和混淆代码,因此您必须了解如何根据自己的需求对其进行自定义。默认的配置文件只涵盖一般的使用情形,因此您极有可能需要根据自己的需求对其进行修改。请参阅下文<a href="#configuring">配置 ProGuard</a> 这一部分,了解如何自定义 ProGuard 配置文件。</p>
+
+ <p>要启用 ProGuard,让其作为 Ant 或 Eclipse 构建环境的一部分运行,请在 <code><project_root>/project.properties</code> 文件中设置 <code>proguard.config</code> 属性。该路径可以是绝对路径,也可以是项目根目录的相对路径。</p>
+
+ <p class="note"><strong>注意</strong>:在使用 Android Studio 时,您必须将 Proguard 添加到 <code>gradle.build</code> 文件的构建类型中。有关详情,请参阅 <a href="http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Running-ProGuard">Gradle 插件用户指南</a>。
+
+ <p>如果您将 <code>proguard.cfg</code> 文件留在默认位置(项目的根目录中),则可以按如下格式指定其位置:</p>
+ <pre class="no-pretty-print">
+ proguard.config=proguard.cfg
+ </pre>
+ <p>
+ 您也可以将此文件移到任何所需的位置,然后按如下格式指定其绝对路径:
+ </p>
+ <pre class="no-pretty-print">
+ proguard.config=/path/to/proguard.cfg
+ </pre>
+
+
+ <p>当您在发布模式下构建应用时,无论是通过运行 <code>ant release</code> 还是通过使用 Eclipse 中的“导出向导”,构建系统都会自动检查是否设置了 <code>proguard.config</code> 属性。<em></em>如果已设置该属性,ProGuard 会自动处理应用的字节码,然后再将所有内容打包到 <code>.apk</code> 文件中。在调试模式下进行构建时之所以不调用 ProGuard,是因为该工具会加大调试难度。</p>
+
+ <p>ProGuard 在运行后会输出以下文件:</p>
+
+ <dl>
+ <dt><code>dump.txt</code></dt>
+ <dd>描述 <code>.apk</code> 文件中所有类文件的内部结构</dd>
+
+ <dt><code>mapping.txt</code></dt>
+ <dd>列出原始与混淆后的类、方法和字段名称之间的对应关系。如果您从发布版本收到问题报告,则必须使用此文件,因为通过它可将混淆后的堆栈跟踪信息转换为原始的类、方法和成员名称。有关详情,请参阅<a href="#decoding">解码混淆后的堆栈跟踪信息</a>。</dd>
+
+ <dt><code>seeds.txt</code></dt>
+ <dd>列出未混淆的类和成员</dd>
+
+ <dt><code>usage.txt</code></dt>
+ <dd>列出从 <code>.apk</code> 删除的代码</dd>
+ </dl>
+
+ <p>这些文件都位于以下目录中:</p>
+
+ <ul>
+ <li><code><project_root>/bin/proguard</code>(如果您使用的是 Ant)。</li>
+
+ <li><code><project_root>/proguard</code>(如果您使用的是 Eclipse)。</li>
+ </ul>
+
+
+ <p class="caution"><strong>注意</strong>:每当您在发布模式下构建版本时,这些文件都会被 ProGuard 最新生成的文件覆盖。请在每次发布应用时为这些文件保存一份副本,以便反混淆来自发布版本的问题报告。如需详细了解为何要保存这些文件,请参阅<a href="#considerations">调试已发布应用时应注意的事项</a>。
+ </p>
+
+ <h2 id="configuring">配置 ProGuard</h2>
+
+ <p>在某些情况下,<code>proguard.cfg</code> 文件中的默认配置足以满足您的需求。不过,在很多情况下,ProGuard 很难做出正确分析,因此可能会移除它认为无用而实际上您的应用却需要的代码。部分示例如下:</p>
+
+ <ul>
+ <li>一个只在 <code>AndroidManifest.xml</code> 文件中引用的类</li>
+
+ <li>一个通过 JNI 调用的方法</li>
+
+ <li>动态引用的字段和方法</li>
+ </ul>
+
+ <p>默认的 <code>proguard.cfg</code> 文件旨在涵盖一般的使用情形,但您可能会遇到异常情况,例如 <code>ClassNotFoundException</code>(此异常情况会在 ProGuard 删除您的应用调用的整个类时发生)。</p>
+
+ <p>您可以通过在 <code>proguard.cfg</code> 文件中添加一个 <code>-keep</code> 行,来修复因 ProGuard 在删除代码而造成的错误。例如:</p>
+ <pre>
+ -keep public class <MyClass>
+ </pre>
+
+ <p>在使用 <code>-keep</code> 选项时,您既有许多选择也有不少需要注意的方面,因此我们强烈建议您阅读 <a href="http://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/introduction.html">ProGuard 手册</a>,详细了解如何自定义您的配置文件。该手册中的“Keep 选项概述”和“示例”部分尤其有用;<em></em><em></em><a href="http://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/troubleshooting.html">问题排查</a>部分则概述了在 ProGuard 删除代码后您可能会遇到的其他常见问题。</p>
+
+ <h2 id="decoding">解码混淆后的堆栈跟踪信息</h2>
+
+ <p>当混淆后的代码输出堆栈跟踪信息时,方法名称会被混淆,即便仍能进行调试,难度也会很大。幸运的是,ProGuard 在每次运行时都会输出一个 <code><project_root>/bin/proguard/mapping.txt</code> 文件,其中会显示与混淆后的名称相对应的原始的类、方法和字段名称。</p>
+
+ <p>Windows 上的 <code>retrace.bat</code> 脚本以及 Linux 或 Mac OS X 上的 <code>retrace.sh</code> 脚本可以将混淆后的堆栈跟踪信息转换成可读文件,此文件位于 <code><sdk_root>/tools/proguard/</code> 目录中。执行 <code>retrace</code> 工具的语法如下:</p>
+ <pre>retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]</pre>
+ <p>例如:</p>
+
+ <pre>retrace.bat -verbose mapping.txt obfuscated_trace.txt</pre>
+
+ <p>如果您不为“<stacktrace_file>”指定值,<code>retrace</code> 工具会从标准输入中读取。<em></em></p>
+
+ <h3 id="considerations">调试已发布应用时应注意的事项</h3>
+
+ <p>每次向用户发布应用时,都请保存所发布版本的 <code>mapping.txt</code> 文件。这样一来,如果用户遇到问题,并向您提交混淆后的堆栈跟踪信息,您就可以利用为每个发布版本保存的 <code>mapping.txt</code> 文件副本调试问题。每当您构建发布版本时,项目的 <code>mapping.txt</code> 文件都会被覆盖,因此您必须谨慎保存所需的版本。</p>
+
+ <p>例如,假设您发布了某个应用,并继续开发该应用的新功能,以便将来发布新版本。之后不久您使用 ProGuard 构建发布版本。此版本覆盖了之前的 <code>mapping.txt</code> 文件。之后,某位用户提交了问题报告,其中包含来自当前已发布的应用的堆栈跟踪信息。但您已无法调试该用户的堆栈跟踪信息,因为与该用户设备上的版本相关联的 <code>mapping.txt</code> 文件已被覆盖。除此之外,其他一些情况也可能会导致您的 <code>mapping.txt</code> 文件被覆盖。因此,如果您预计需要进行调试,请务必在每次发布应用时都保存一份副本。</p>
+
+ <p>如何保存 <code>mapping.txt</code> 文件由您自行决定。例如,您可以将其重命名以使其名称中包含版本号,也可以对其(连同源代码一起)进行版本管理。</p>
diff --git a/docs/html-intl/intl/zh-cn/tools/publishing/preparing.jd b/docs/html-intl/intl/zh-cn/tools/publishing/preparing.jd
new file mode 100644
index 0000000..46938b9
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/tools/publishing/preparing.jd
@@ -0,0 +1,186 @@
+page.title=准备发布
+page.type=工具
+
+@jd:body
+
+ <div id="qv-wrapper">
+ <div id="qv">
+ <h2>概述</h2>
+ <ul>
+ <li>了解发布应用需要哪些资源。</li>
+ <li>了解如何配置和构建应用以进行发布。</li>
+ <li>了解发布应用的最佳做法。</li>
+ </ul>
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#publishing-intro">简介</a></li>
+ <li><a href="#publishing-gather">收集材料和资源</a></li>
+ <li><a href="#publishing-configure">配置应用</a></li>
+ <li><a href="#publishing-build">构建应用</a></li>
+ <li><a href="#publishing-resources">准备外部服务器和资源</a></li>
+ <li><a href="#publishing-test">测试应用以进行发布</a></li>
+ </ol>
+ <h2>另请参见</h2>
+ <ol>
+ <li><a href="{@docRoot}tools/publishing/publishing_overview.html">发布概述</a></li>
+ <li><a href="{@docRoot}tools/publishing/app-signing.html">为应用签名</a></li>
+ <li><a href="{@docRoot}distribute/tools/launch-checklist.html">Google Play 发布检查清单</a></li>
+ </ol>
+ </div>
+ </div>
+
+ <p>在将您的 Android 应用分发给用户之前,您需要先完成准备工作。对于所有 Android 应用,准备流程都是一项必须完成的<a href="{@docRoot}tools/workflow/index.html">开发任务</a>,也是发布流程中的第一步(参见图 1)。</p>
+
+ <p>当准备应用以进行发布时,您需要配置、构建并测试应用的发布版本。配置任务相当简单,涉及完成代码清理和代码修改这两项基本任务,从而达到优化应用的目的。构建流程与调试构建流程相似,可以使用 JDK 和 Android SDK 工具完成。测试任务就是做最终检查,以确保您的应用能在实际环境下正常运行。准备好要发布的应用后,您将获得一个已签名的 <code>.apk</code> 文件。您可以直接将该文件分发给用户,也可以通过 Google Play 等应用市场进行分发。</p>
+
+ <p>本文总结了您在准备应用以进行发布时需执行的几大任务。这些任务适用于所有 Android 应用,无论这些应用采用什么方式发布或分发给用户。如果您要通过 Google Play 发布应用,则还应查看 <a href="{@docRoot}distribute/tools/launch-checklist.html">Google Play 发布检查清单</a>,以确保您要发布的应用满足 Google Play 的所有要求。</p>
+
+ <p class="note"><strong>注意</strong>:在您执行本文所述任务之前,最好确保您的应用符合针对功能、性能和稳定性的所有发布标准。</p>
+
+ <img src="{@docRoot}images/publishing/publishing_overview_prep.png" alt="显示发布流程在整个开发流程中的位置" height="190" id="figure1" />
+ <p class="img-caption">
+ <strong>图 1.</strong> 准备发布是一项必须完成的<a href="{@docRoot}tools/workflow/index.html">开发任务</a>,也是发布流程中的第一步。
+ </p>
+
+ <h2 id="publishing-intro">简介</h2>
+
+ <p>为了向用户发布应用,您需要先创建发布版应用包,以供用户在其 Android 设备上安装和运行。发布版应用包与调试 <code>.apk</code> 文件中包含的组件相同(经过编译的源代码、资源、清单文件等),使用的构建工具也相同。不过,与调试 <code>.apk</code> 文件不同的是,发布版 <code>.apk</code> 文件已使用您自己的证书签名且使用 Zipalign 工具进行了优化。</p>
+
+ <div class="figure" style="width:331px">
+ <img src="{@docRoot}images/publishing/publishing_preparing.png" alt="显示准备应用以进行发布所需执行的五项任务" height="450" />
+ <p class="img-caption">
+ <strong>图 2.</strong> 要准备应用以进行发布,您需执行五大任务。
+ </p>
+ </div>
+
+ <p>通常情况下,如果您使用 Eclipse 和 ADT 插件或 Ant 构建脚本(包含在 Android SDK 中)构建应用,可以无缝地完成签名和优化任务。例如,您可以使用 Eclipse“导出向导”一次性完成对应用的编译、签名和优化操作。如果通过命令行进行构建,您还可以配置 Ant 构建脚本来执行相同的操作。</p>
+
+ <p>要准备应用以进行发布,您通常需要执行五大任务(参见图 2)。每项大任务可能包含一项或多项小任务,视您的应用发布方式而定。例如,如果您要通过 Google Play 发布应用,则可能需要在配置应用的发布版本时向清单中添加特殊的过滤规则。同样,为了满足 Google Play 发布指南的要求,您可能需要在收集发布材料时准备几张屏幕截图并撰写相关宣传文字。</p>
+
+ <p>一般来说,在对应用进行了全面调试和测试后,您需要执行图 2 中列出的任务。Android SDK 中提供的几种工具可帮您测试和调试您的 Android 应用。有关详情,请参阅开发者指南中的<a href="{@docRoot}tools/debugging/index.html">调试</a>和<a href="{@docRoot}tools/testing/index.html">测试</a>这两部分。</p>
+
+ <h2 id="publishing-gather">收集材料和资源</h2>
+
+ <p>要开始准备应用以进行发布,您需要收集几项支持性的信息,其中至少应包含用于为应用签名的加密密钥以及应用图标。此外,您可能还需要提供最终用户许可协议。</p>
+
+ <h4 id="publishing-keys">加密密钥</h4>
+
+ <p>Android 系统要求安装的每个应用都必须使用应用开发者拥有的证书(即开发者用于存放私钥的证书)进行数字签名。Android 系统利用该证书来识别应用作者并在应用之间建立信任关系。您用于签名的的证书无需由证书机构签名;Android 系统允许您使用自签名证书为您的应用签名。如需了解有关证书的要求,请参阅<a href="{@docRoot}tools/publishing/app-signing.html#cert">获取合适的私钥</a>。</p>
+
+ <p class="caution"><strong>重要提示</strong>:您的应用必须使用在 2033 年 10 月 22 日之后才会失效的加密密钥签名。</p>
+
+ <p>如果您应用访问的服务或使用的第三方库需要基于您的私钥的附加密钥,则您还必须获得其他发布密钥。例如,如果您的应用使用 <a href="http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapView.html">MapView</a> 类(属于 <a href="http://code.google.com/android/add-ons/google-apis/maps-overview.html">Google 地图外部库</a>),您需要让您的应用注册 Google 地图服务并获取 Maps API 密钥。如需了解如何获取 Maps API 密钥,请参阅<a href="http://code.google.com/android/add-ons/google-apis/mapkey.html">获取 Maps API 密钥</a>。</p>
+
+ <h4>应用图标</h4>
+
+ <p>请确保您有应用图标而且图标遵守建议的<a href="{@docRoot}guide/practices/ui_guidelines/icon_design_launcher.html">图标指南</a>。应用的图标会显示在设备的主屏幕上和“启动器”窗口中,有助于用户识别您的应用。它还会显示在“管理应用”、“我的下载”等其他位置。此外,Google Play 等发布服务也会向用户显示您的应用图标。</p>
+
+ <p class="note"><strong>注意</strong>:如果您要在 Google Play 上发布应用,则需要创建高分辨率版本的图标。有关详情,请参阅<a href="https://www.google.com/support/androidmarket/developer/bin/answer.py?answer=1078870">应用的图形资源</a>。</p>
+
+ <h4>最终用户许可协议</h4>
+
+ <p>请考虑为您的应用准备最终用户许可协议 (EULA)。最终用户许可协议可帮助保护您的员工、公司和知识产权,因此我们建议您为自己的应用提供一份。</p>
+
+ <h4>其他材料</h4>
+
+ <p>您可能还需要准备宣传和营销材料,用来宣传您的应用。例如,如果您要在 Google Play 上发布应用,则需要准备几段宣传文字并创建几张应用截图。有关详情,请参阅<a href="https://www.google.com/support/androidmarket/developer/bin/answer.py?answer=1078870">应用的图形资源</a></p>
+
+ <h2 id="publishing-configure">配置应用以进行发布</h2>
+
+ <p>收集完所有支持材料后,您可以开始配置应用以进行发布。这部分总结了一些建议您在发布应用前对源代码、资源文件和应用清单进行的配置更改。虽然是否实施这里列出的大部分配置更改都由您决定,但这些都是良好的编码习惯。因此我们建议您实施这些更改。在某些情况下,您可能已在开发过程中实施了这些配置更改。</p>
+
+ <h4>选择合适的应用包名称</h4>
+
+ <p>请确保您选择的应用包名称适合在应用的整个生命周期中使用。将应用分发给用户后,您就无法再更改应用包名称。您可以在应用的清单文件中设置应用包名称。有关详情,请参阅介绍 <a href="{@docRoot}guide/topics/manifest/manifest-element.html#package">package</a> 属性的文档。</p>
+
+ <h4>停用日志记录和调试功能</h4>
+
+ <p>在构建应用的发布版本之前,请确保停用日志记录功能和调试选项。要停用日志记录功能,您可以移除源文件中对 <code><a href="{@docRoot}reference/android/util/Log.html">Log</a></code> 方法的调用。要停用调试功能,您可以从清单文件的 <code><application></code> 代码中移除 <code>android:debuggable</code> 属性或将 <code>android:debuggable</code> 属性设置为 <code>false</code>。此外,请移除您在项目中创建的所有日志文件或静态测试文件。</p>
+
+ <p>此外,您还应移除之前添加到代码中的所有 <code><a href="{@docRoot}reference/android/os/Debug.html">Debug</a></code> 跟踪调用,例如 <code><a href="{@docRoot}reference/android/os/Debug.html#startMethodTracing()">startMethodTracing()</a></code> 和 <code><a href="{@docRoot}reference/android/os/Debug.html#stopMethodTracing()">stopMethodTracing()</a></code> 方法调用。</p>
+
+ <p class="caution"><strong>重要提示</strong>:调试功能允许用户使用 Chrome DevTools 注入脚本和提取内容,因此如果您使用 <code><a href="{@docRoot}reference/android/webkit/WebView.html">WebView</a></code> 展示付费内容或使用 JavaScript 界面,请确保停用应用的调试功能。要停用调试功能,请使用 <code><a href="{@docRoot}reference/android/webkit/WebView.html#setWebContentsDebuggingEnabled(boolean)">WebView.setWebContentsDebuggingEnabled()</a></code> 方法。</p>
+
+ <h4>清理项目目录</h4>
+
+ <p>请清理您的项目,确保其符合 <a href="{@docRoot}tools/projects/index.html#ApplicationProjects">Android 项目</a>中所述的目录结构要求。项目中留有散乱或孤立的文件会妨碍对应用的编译,导致应用发生异常。您至少应执行下列清理任务:</p>
+
+ <ul>
+ <li>查看 <code>jni/</code>、<code>lib/</code> 和 <code>src/</code> 目录的内容。<code>jni/</code> 目录应只包含与 <a href="{@docRoot}tools/sdk/ndk/index.html">Android NDK</a> 相关联的源文件,例如 <code>.c</code>、<code>.cpp</code>、<code>.h</code> 和 <code>.mk</code> 文件。<code>lib/</code> 目录应只包含第三方库文件或专用库文件,包括预构建的共享库和静态库(例如 <code>.so</code> 文件)。<code>src/</code> 目录应只包含应用的源文件(<code>.java</code> 和 <code>.aidl</code> 文件)。<code>src/</code> 不应包含任何 <code>.jar</code> 文件。</li>
+ <li>检查项目中是否包含应用不需要的专用或专有数据文件,如果有请将其移除。例如,在项目的 <code>res/</code> 目录中查找是否包含旧的图形文件、布局文件和值文件,如果您不再使用这些文件,请将其删除。</li>
+ <li>检查 <code>lib/</code> 目录中是否包含测试库;如果您的应用不再使用这些库,请将其移除。</li>
+ <li>查看 <code>assets/</code> 目录和 <code>res/raw/</code> 目录的内容,查找其中是否包含需在应用发布前更新或移除的原始资源文件和静态文件。</li>
+ </ul>
+
+ <h4>查看并更新清单设置</h4>
+
+ <p>确认下列清单项是否已正确设置:</p>
+
+ <ul>
+ <li><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">
+ <uses-permission></a> 元素
+ <p>您应该只指定应用必需的相关权限。</p>
+ </li>
+ <li><code>android:icon</code> 和 <code>android:label</code> 属性
+ <p>您必须为这些属性(位于 <a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a> 元素中)指定值。</p>
+ </li>
+ <li><code>android:versionCode</code> 和 <code>android:versionName</code> 属性。
+ <p>我们建议您为这些属性(位于 <a href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a> 元素中)指定值。有关详情,请参阅<a href="{@docRoot}tools/publishing/versioning.html">应用的版本管理</a>。</p>
+ </li>
+ </ul>
+
+ <p>如果您要在 Google Play 上发布应用,还可以设置另外几个清单元素。例如,<code>android:minSdkVersion</code> 和 <code>android:targetSdkVersion</code> 属性(位于 <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><uses-sdk></a> 元素中)。如需详细了解这些设置以及其他 Google Play 设置,请参阅 <a href="{@docRoot}google/play/filters.html">Google Play 上的过滤器</a>。</p>
+
+ <h4>解决兼容性问题</h4>
+
+ <p>Android 提供了多种工具和技术,可让您的应用与多种设备兼容。为了让您的应用尽可能地适合更多用户,建议您执行以下操作:</p>
+
+ <ul>
+ <li><strong>添加跨屏配置支持</strong>
+ <p>确保您采取了<a href="{@docRoot}guide/practices/screens_support.html#screen-independence">支持跨屏的最佳做法</a>。通过支持跨屏配置,您创建的应用可在 Android 支持的任何屏幕尺寸的设备上正常运行且拥有精美外观。</p>
+ </li>
+ <li><strong>针对 Android 平板电脑优化应用</strong>
+ <p>如果您的应用是专为运行 Android 3.0 以上版本的设备打造的,请遵照<a href="{@docRoot}guide/practices/optimizing-for-3.0.html">针对 Android 3.0 优化应用</a>中所述的指南和最佳做法,这样您的应用就能与运行 Android 3.0 的设备兼容。</p>
+ </li>
+ <li><strong>考虑使用支持库</strong>
+ <p>如果您的应用是专为运行 Android 3.x 的设备打造的,请向您的应用项目中添加<a href="{@docRoot}tools/support-library/index.html">支持库</a>,这样您的应用就能与较低版本的 Android 系统兼容。您可以将“支持库”提供的静态支持库添加到您的 Android 应用中,以便使用低版本的平台上未提供的 API 或使用不属于框架 API 的实用程序 API。</p>
+ </li>
+ </ul>
+
+ <h4>更新服务器和服务的网址</h4>
+
+ <p>如果您的应用需要访问远程服务器或服务,请确保您使用的是该服务器或服务的生产网址或路径,而非测试网址或路径。</p>
+
+ <h4>实施许可服务(如果您要在 Google Play 上发布应用)</h4>
+
+ <p>如果您要通过 Google Play 发布付费应用,请考虑支持 Google Play 许可服务。借助这项许可服务,您可以根据当前用户的购买情况控制其对您应用的访问权限。使用 Google Play 许可服务并不是强制的,即使您通过 Google Play 发布应用也可以不使用这项服务。</p>
+
+ <p>如需详细了解 Google Play 许可服务以及如何在应用中使用该服务,请参阅<a href="{@docRoot}google/play/licensing/index.html">应用许可</a>。</p>
+
+ <h2 id="publishing-build">构建应用以进行发布</h2>
+
+ <p>配置好应用后,您可以将其构建为一个经过签名和优化的发布版 <code>.apk</code> 文件。JDK 中包含用于为 <code>.apk</code> 文件签名的工具(Keytool 和 Jarsigner);Android SDK 中包含用于编译和优化 <code>.apk</code> 文件的工具。如果您使用的是带 ADT 插件的 Eclipse 或是从命令行使用 Ant 构建脚本,则整个构建流程可以自动完成。</p>
+
+ <h3>使用 Eclipse 进行构建</h3>
+
+ <p>您可以使用 Eclipse“导出向导”构建使用私钥签名并经过优化的发布版 <code>.apk</code> 文件。如需了解如何运行“导出向导”,请参阅<a href="{@docRoot}tools/publishing/app-signing.html#ExportWizard">使用 Eclipse ADT 进行编译和签名</a>。“导出向导”会对您要发布的应用进行编译、使用私钥为应用签名并使用 Zipalign 工具对应用进行优化。如果您已通过 Eclipse 运行或调试过应用且未在应用中发现错误,“导出向导”就应该能成功运行(有关详情,请参阅<a href="{@docRoot}tools/building/building-eclipse.html">使用带 ADT 的 Eclipse 构建和运行应用</a>)。</p>
+
+ <p>“导出向导”假设您有适合为应用签名的<a href="#billing-keys">证书和私钥</a>。如果您没有合适的证书和私钥,“导出向导”将帮您生成一个(如需详细了解签名流程和签名指南,请参阅<a href="{@docRoot}tools/publishing/app-signing.html">为应用签名</a>)。</p>
+
+ <h3>使用 Ant 进行构建</h3>
+
+ <p>您可以使用 Ant 构建脚本(包含在 Android SDK 中)来构建使用私钥签名并经过优化的发布版 <code>.apk</code> 文件。如需了解具体做法,请参阅<a href="{@docRoot}tools/building/building-cmdline.html#ReleaseMode">在发布模式下进行构建</a>。这种构建方式假设您有适合为应用签名的<a href="#billing-keys">证书和密钥</a>。如果您没有合适的证书和私钥,“导出向导”将帮您生成一个(如需详细了解签名流程和签名指南,请参阅<a href="{@docRoot}tools/publishing/app-signing.html">为应用签名</a>)。</p>
+
+ <h2 id="publishing-resources">准备外部服务器和资源</h2>
+
+ <p>如果您的应用依赖于远程服务器,请确保该服务器是安全的且已经过配置,随时可投入实际使用。如果您要在应用中实施<a href="{@docRoot}google/play/billing/index.html">应用内结算</a>,而且要在远程服务器上执行签名验证步骤,则必须这样做。</p>
+
+ <p>此外,如果您的应用从远程服务器或实时服务中抓取内容(例如内容 Feed),请确保您提供的内容是最新的且随时可投入实际使用。</p>
+
+ <h2 id="publishing-test">测试应用以进行发布</h2>
+
+ <p>测试应用的发布版本有助于确保您的应用能在实际设备上和实际网络条件下正常运行。理想情况下,您至少应在一部手持设备上和一台平板电脑上测试您的应用,以确认界面元素的尺寸是否合适,以及应用的性能和能耗是否可接受。</p>
+
+ <p>在测试之前,请先参阅<a href="{@docRoot}tools/testing/what_to_test.html">测试内容</a>。这篇文章总结了您在测试 Android 应用时应注意的常见情况。当您完成测试并确定应用的发布版本能正常运行后,就可以向用户发布您的应用了。有关详情,请参阅<a href="{@docRoot}tools/publishing/publishing_overview.html#publishing-release">向用户发布应用</a>。如果您要在 Google Play 上发布应用,请参阅 <a href="{@docRoot}distribute/tools/launch-checklist.html">Google Play 发布检查清单</a>。</p>
+
+
diff --git a/docs/html-intl/intl/zh-cn/tools/publishing/publishing_overview.jd b/docs/html-intl/intl/zh-cn/tools/publishing/publishing_overview.jd
new file mode 100644
index 0000000..eb6a617
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/tools/publishing/publishing_overview.jd
@@ -0,0 +1,142 @@
+page.title=发布概述
+page.type=工具
+
+@jd:body
+
+ <div id="qv-wrapper">
+<div id="qv">
+ <h2>概述</h2>
+ <ul>
+ <li>了解如何发布 Android 应用。</li>
+ <li>了解如何准备应用以进行发布。</li>
+ <li>了解如何向用户发布应用。</li>
+ </ul>
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#publishing-prepare">准备应用以进行发布</a></li>
+ <li><a href="#publishing-release">向用户发布应用</a>
+ </li></ol>
+ <h2>另请参见</h2>
+ <ol>
+ <li><a href="{@docRoot}distribute/tools/launch-checklist.html">在 Google Play 上发布应用</a></li>
+ </ol>
+</div>
+</div>
+
+<p>发布是将您的 Android 应用提供给用户的常规流程。您在发布 Android 应用时需要执行两大任务:</p>
+
+<ul>
+ <li>准备应用以进行发布。
+ <p>在准备阶段,您需要构建应用的发布版本,以供 Android 设备用户下载和安装。</p>
+ </li>
+ <li>向用户发布应用。
+ <p>在发布阶段,您向用户宣传、销售和分发应用的发布版本。</p>
+ </li>
+</ul>
+
+<p>通常情况下,您可以通过 <a href="{@docRoot}distribute/googleplay/index.html">Google Play</a> 等应用市场发布应用。不过,您也可以通过以下方式发布应用:将应用直接发送给用户;让用户从您的网站下载应用。</p>
+
+<p>图 1 展示了发布流程在整个 Android <a href="{@docRoot}tools/workflow/index.html">应用开发流程</a>中所处的位置。一般来说,您要先在调试环境中完成对应用的测试,然后再执行发布流程。此外,在开始发布流程之前,您最好确保应用符合针对功能、性能和稳定性的所有发布标准。</p>
+
+<img src="{@docRoot}images/publishing/publishing_overview.png" alt="展示了发布流程在整个开发流程中所处的位置" height="86" id="figure1" />
+<p class="img-caption">
+ <strong>图 1. </strong> 发布是 Android <a href="{@docRoot}tools/workflow/index.html">应用开发流程</a>中的最后一个阶段。
+</p>
+
+<h2 id="publishing-prepare">准备应用以进行发布</h2>
+
+<p>发布之前的准备过程涉及多个步骤,需要您完成以下任务:</p>
+
+<ul>
+ <li>配置应用以进行发布。
+ <p>您至少需要从清单文件中移除 <code><a href="{@docRoot}reference/android/util/Log.html">Log</a></code> 调用和 <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a> 属性,还应为 <code>android:versionCode</code> 和 <code>android:versionName</code> 属性(位于 <a href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a> 元素中)提供值。此外,您还可能需要配置多项其他设置,以符合 Google Play 的发布要求,或者符合其他应用发布方式的要求。</p>
+ </li>
+ <li>构建应用的发布版本并签名。
+ <p>Android SDK 工具中随附的 Android Development Tools (ADT) 插件和 Ant 构建脚本可向您提供构建应用的发布版本并签名所需的全部信息。</p>
+ </li>
+ <li>测试应用的发布版本。
+ <p>在分发应用之前,您至少应在一部适配的手机和一台适配的平板电脑上全面测试应用的发布版本。</p>
+ </li>
+ <li>更新应用资源以进行发布。
+ <p>您需确保所有应用资源(例如多媒体文件和图形)都是最新的,且已包含在应用中或者已存储到正确的生产服务器上。</p>
+ </li>
+ <li>准备应用所依赖的远程服务器和服务。
+ <p>如果您的应用依赖于外部服务器或服务,您要确保这些服务器或服务是安全的,随时可投入实际使用。</p>
+ </li>
+</ul>
+
+<p>在准备阶段,您可能还需要执行其他一些任务。例如,您需要获取私钥来为应用签名;如果您使用 <a href="http://code.google.com/android/add-ons/google-apis/maps-overview.html">Google 地图外部库</a>,则需要获取 Maps API 发布密钥。此外,您还需要为应用创建一个图标,而且可能需要准备最终用户许可协议 (EULA) 以保护您的员工、公司和知识产权。</p>
+
+<p>当您完成发布应用所需的准备工作之后,您将得到一个已签名的 <code>.apk</code> 文件,可以将文件分发给用户。</p>
+
+<p>要了解如何准备应用以进行发布,请参阅开发者指南中的<a href="{@docRoot}tools/publishing/preparing.html">准备发布</a>。这篇文章提供了有关如何配置和构建应用的发布版本的分步说明。</p>
+
+<h2 id="publishing-release">向用户发布应用</h2>
+
+<p>您可以通过多种方式发布您的 Android 应用。通常情况下,您通过 Google Play 等应用市场发布应用,但您也可以在自己的网站上发布应用或直接将应用发送给用户。
+
+<h3 id="publishing-marketplace">通过应用市场发布应用</h3>
+
+<p>如果您希望向尽可能多的目标用户分发应用,最好通过 Google Play 等应用市场发布应用。</p>
+
+<p>Google Play 是 Android 应用的主要市场,它尤其适合向遍布全球的众多目标用户分发您的应用。不过,您也可以通过自己喜欢的其他应用市场分发您的应用,也可以在多个市场中分发。</p>
+
+
+<h4 id="publishing-market">在 Google Play 上发布应用</h4>
+
+<p>Google Play 是一个强大的应用发布平台,可帮助您向全球用户宣传、销售和分发您的 Android 应用。当通过 Google Play 发布应用时,您可以使用一系列开发者工具,分析您的销售数据、了解市场趋势以及控制向哪些用户分发应用。此外,您还能使用多种有助您增加收入的功能,如<a href="{@docRoot}google/play/billing/index.html">应用内结算</a>和<a href="{@docRoot}google/play/licensing/index.html">应用许可</a>。丰富的工具和功能,以及为数众多的最终用户社区功能,让 Google Play 成为销售和购买 Android 应用的主要平台。</p>
+
+<p>在 Google Play 上发布应用相当简单,只需三个基本步骤:</p>
+
+<ul>
+ <li>准备宣传材料。
+ <p>为了充分利用 Google Play 的营销和宣传功能,您需要为应用制作宣传材料,例如屏幕截图、视频、图形以及宣传文字。</p>
+ </li>
+ <li>配置选项并上传资源。
+ <p>利用 Google Play,您可以将应用定位到全球的用户和设备。通过配置各种 Google Play 设置,您可以选择要覆盖的国家/地区、要使用的商品详情语言以及应用在各个国家/地区的价格。此外,您还可以配置商品详情,例如应用类型、类别和内容分级。配置各种选项之后,您可以上传宣传材料和草稿版(未发布的)应用。</p>
+ </li>
+ <li>发布应用的发布版本。
+ <p>如果您确认各项发布设置均配置正确,而且您上传的应用可以公开发布,只需点击开发者控制台中的<strong>发布</strong>即可。在几分钟之内,您的应用就会发布到网络上供全球用户下载。</p>
+ </li>
+</ul>
+
+<p>如需了解完整信息,请访问 <a href="{@docRoot}distribute/googleplay/index.html">Google Play</a>。</p>
+
+
+<h3 id="publishing-email">通过电子邮件发布应用</h3>
+
+<div class="figure" style="width:246px">
+ <img src="{@docRoot}images/publishing/publishing_via_email.png" alt="此屏幕截图展示了用户在收到您发送的应用时看到的图形界面" style="width:240px" />
+ <p class="img-caption">
+ <strong>图 1. </strong> 当您通过电子邮件向用户发送应用时,用户只需点击<strong>安装</strong>即可。
+ </p>
+</div>
+
+<p>最简单快捷的应用发布方式就是通过电子邮件将应用发送给用户。为此,您需要准备好应用的发布版本,将其添加为电子邮件的附件,然后发送给用户。当用户在其 Android 设备上打开您的电子邮件时,Android 系统会识别出该 APK 并在电子邮件中显示<strong>立即安装</strong>按钮(参见图 1)。用户触摸该按钮即可安装您的应用。</p>
+
+<p class="note"><strong>注意</strong>:只有当用户将其设备配置为允许安装来自<a href="#unknown-sources">未知来源</a>的应用且通过本机的 Gmail 应用打开您的电子邮件时,才会出现图 1 所示的<strong>立即安装</strong>按钮。</p>
+
+<p>如果您只将应用发送给几位受信任的用户,那么通过电子邮件分发就非常方便。不过,这种发布方式不利于阻止盗版和未经授权的分发,也就是说,收到您应用的任何人都可以将应用转发给其他人。</p>
+
+<h2 id="publishing-website">通过网站发布应用</h2>
+
+<p>如果您不想在 Google Play 这样的市场上发布应用,则可以将应用放在您的网站或服务器(包括私人服务器或企业服务器)上供用户下载。为此,您必须先按正常流程准备好应用的发布版本,然后您只需将准备好的 APK 文件托管到网站上并向用户提供下载链接即可。
+</p>
+
+<p>当用户在其 Android 设备上访问该下载链接时,文件就会开始下载,Android 系统会在下载完成后自动将应用安装到设备上。不过,只有当用户将其“设置”配置为允许安装来自<a href="#unknown-sources">未知来源</a>的应用时,安装进程才会自动启动。</p>
+
+<p>虽然在您的网站上发布应用相对比较简单,但效率可能并不高。例如,如果您想通过自己的应用获利,则必须自行处理和跟踪所有财务交易且不能使用 Google Play 的<a href="{@docRoot}google/play/billing/index.html">应用内结算服务</a>来销售应用内商品。此外,您也不能使用<a href="{@docRoot}google/play/licensing/index.html">许可服务</a>来阻止他人未经授权安装和使用您的应用。</p>
+
+
+<h2 id="unknown-sources">用户选择安装来自未知来源的应用</h2>
+
+<div class="figure" style="width:246px;margin-top:0">
+ <img src="{@docRoot}images/publishing/publishing_unknown_sources_sm.png" alt="此屏幕截图展示了用于接受从未知来源下载和安装应用的设置" style="width:240px" />
+ <p class="img-caption">
+ <strong>图 2. </strong> 用户必须启用<strong>未知来源</strong>设置,才能安装从 Google Play 以外的位置下载的应用。
+ </p>
+</div>
+
+<p>Android 可防止用户无意中从 Google Play(受信任的市场)以外的位置下载并安装应用。只要用户未启用“设置”<strong>></strong>“安全”下的<strong>未知来源</strong>(如图 2 所示),它就会阻止此类安装。要允许安装来自其他来源的应用,用户必须在其设备上启用“未知来源”设置,且必须先更改此项配置才能将您的应用下载到设备上。<em></em></p>
+
+<p class="note">请注意,部分网络提供商不允许用户安装来自未知来源的应用。</p>
diff --git a/docs/html-intl/intl/zh-cn/training/basics/fragments/fragment-ui.jd b/docs/html-intl/intl/zh-cn/training/basics/fragments/fragment-ui.jd
new file mode 100644
index 0000000..51a4e27
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/training/basics/fragments/fragment-ui.jd
@@ -0,0 +1,139 @@
+page.title=构建灵活的界面
+trainingnavtop=true
+page.type=培训
+@jd:body
+
+ <div id="tb-wrapper">
+ <div id="tb">
+ <h2>本课程所教授的内容:</h2>
+ <ol>
+ <li><a href="#AddAtRuntime">在运行时向 Activity 添加 Fragment</a></li>
+ <li><a href="#Replace">用一个 Fragment 替换另一个 Fragment </a></li>
+ </ol>
+
+ <h2>你还应阅读以下内容:</h2>
+ <ul>
+ <li><a href="{@docRoot}guide/components/fragments.html"><code>fragment</code></a></li>
+ <li><a href="{@docRoot}guide/practices/tablets-and-handsets.html">支持平板电脑和手机</a></li>
+ </ul>
+
+ <h2>试试以下示例:</h2>
+
+ <div class="download-box">
+ <a href="http://developer.android.com/shareables/training/FragmentBasics.zip" class="button">下载示例</a>
+ <p class="filename">FragmentBasics.zip</p>
+ </div>
+
+ </div>
+ </div>
+
+
+ <p>在设计支持各种屏幕尺寸的应用时,你可以在不同的布局配置中重复使用 Fragment ,以便根据相应的屏幕空间提供更出色的用户体验。</p>
+
+ <p>例如,一次只显示一个 Fragment 可能就很适合手机这种单窗格界面,但在平板电脑上,你可能需要设置并列的 Fragment,因为平板电脑的屏幕尺寸较宽阔,可向用户显示更多信息。</p>
+
+ <img src="{@docRoot}images/training/basics/fragments-screen-mock.png" alt="" />
+ <p class="img-caption"><strong>图 1:</strong> 两个 Fragment,显示在不同尺寸屏幕上同一 Activity 的不同配置中。在较宽阔的屏幕上,两个 Fragment 可并列显示;在手机上,一次只能显示一个 Fragment,因此必须在用户导航时更换 Fragment。</p>
+
+ <p>利用 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentManager.html">FragmentManager</a></code> 类提供的方法,你可以在运行时添加、移除和替换 Activity 中的 Fragment,以便为用户提供一种动态体验。</p>
+
+
+
+ <h2 id="AddAtRuntime">在运行时向 Activity 添加 Fragment</h2>
+
+ <p>你可以在 Activity 运行时向其添加 Fragment,而不用像<a href="creating.html">上一课</a>中介绍的那样,使用 <code><fragment></code> 元素在布局文件中为 Activity 定义 Fragment。如果你打算在 Activity 运行周期内更改 Fragment,就必须这样做。</p>
+
+ <p>要执行添加或移除 Fragment 等事务,你必须使用 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentManager.html">FragmentManager</a></code> 创建一个 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentTransaction.html">FragmentTransaction</a></code>,后者可提供用于执行添加、移除、替换以及其他 Fragment 事务的 API。</p>
+
+ <p>如果 Activity 中的 Fragment 可以移除和替换,你应在调用 Activity 的 <code><a href="{@docRoot}reference/android/app/Activity.html#onCreate(android.os.Bundle)">onCreate()</a></code> 方法期间为 Activity 添加初始 Fragment(s)。</p>
+
+ <p>在处理 Fragment(特别是在运行时添加的 Fragment )时,请谨记以下重要规则:必须在布局中为 Fragment 提供 <code><a href="{@docRoot}reference/android/view/View.html">View</a></code> 容器,以便保存 Fragment 的布局。</p>
+
+ <p>下面是<a href="creating.html">上一课</a>所示布局的替代布局,这种布局一次只会显示一个 Fragment。要用一个 Fragment 替换另一个 Fragment, Activity 的布局中需要包含一个作为 Fragment 容器的空 <code><a href="{@docRoot}reference/android/widget/FrameLayout.html">FrameLayout</a></code>。</p>
+
+ <p><em></em>请注意,该文件名与上一课中布局文件的名称相同,但布局目录没有 <code>large</code> 这一限定符。因此,此布局会在设备屏幕小于“large”的情况下使用,原因是尺寸较小的屏幕不适合同时显示两个 Fragment。<em></em></p>
+
+ <p><code>res/layout/news_articles.xml:</code></p>
+ <pre>
+ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/fragment_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+ </pre>
+
+ <p>在 Activity 内部,使用 Support Library API 调用 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentActivity.html#getSupportFragmentManager()">getSupportFragmentManager()</a></code> 以获取 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentManager.html">FragmentManager</a></code>,然后调用 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentManager.html#beginTransaction()">beginTransaction()</a></code> 创建 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentTransaction.html">FragmentTransaction</a></code>,同时调用 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentTransaction.html#add(android.support.v4.app.Fragment, java.lang.String)">add()</a></code> 添加 Fragment。</p>
+
+ <p>你可以使用同一个 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentTransaction.html">FragmentTransaction</a></code> 对 Activity 执行多 Fragment 事务。当你准备好进行更改时,必须调用 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentTransaction.html#commit()">commit()</a></code>。</p>
+
+ <p>例如,下面介绍了如何为上述布局添加 Fragment :</p>
+
+ <pre>
+ import android.os.Bundle;
+ import android.support.v4.app.FragmentActivity;
+
+ public class MainActivity extends FragmentActivity {
+ &Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.news_articles);
+
+ // 确认 Activity 使用的布局版本包含
+ // fragment_container FrameLayout
+ if (findViewById(R.id.fragment_container) != null) {
+
+ // 不过,如果我们要从先前的状态还原,
+ // 则无需执行任何操作而应返回
+ // 否则就会得到重叠的 Fragment 。
+ if (savedInstanceState != null) {
+ return;
+ }
+
+ // 创建一个要放入 Activity 布局中的新 Fragment
+ HeadlinesFragment firstFragment = new HeadlinesFragment();
+
+ // 如果此 Activity 是通过 Intent 发出的特殊指令来启动的,
+ // 请将该 Intent 的 extras 以参数形式传递给该 Fragment
+ firstFragment.setArguments(getIntent().getExtras());
+
+ // 将该 Fragment 添加到“fragment_container”FrameLayout 中
+ getSupportFragmentManager().beginTransaction()
+ .add(R.id.fragment_container, firstFragment).commit();
+ }
+ }
+ }
+ </pre>
+
+ <p>由于该 Fragment 已在运行时添加到 <code><a href="{@docRoot}reference/android/widget/FrameLayout.html">FrameLayout</a></code> 容器中,而不是在 Activity 布局中通过 <code><fragment></code> 元素进行定义,因此该 Activity 可以移除和替换这个 Fragment 。</p>
+
+
+
+ <h2 id="Replace">用一个 Fragment 替换另一个 Fragment </h2>
+
+ <p>替换 Fragment 的步骤与添加 Fragment 的步骤相似,但需要调用 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentTransaction.html#replace(int, android.support.v4.app.Fragment)">replace()</a></code> 方法,而非 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentTransaction.html#add(android.support.v4.app.Fragment, java.lang.String)">add()</a></code>。</p>
+
+ <p>请注意,当你执行替换或移除 Fragment 等 Fragment 事务时,最好能让用户向后导航和“撤消”所做更改。要通过 Fragment 事务允许用户向后导航,你必须调用 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentTransaction.html#addToBackStack(java.lang.String)">addToBackStack()</a></code>,然后再执行 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentTransaction.html">FragmentTransaction</a></code>。</p>
+
+ <p class="note"><strong>注意</strong>:当你移除或替换 Fragment 并向返回堆栈添加事务时,已移除的 Fragment 会停止(而不是销毁)。如果用户向后导航,还原该 Fragment,它会重新启动。如果你没有向返回堆栈添加事务,那么该 Fragment 在移除或替换时就会被销毁<em></em>。</p>
+
+ <p>替换 Fragment 的示例:</p>
+
+ <pre>
+ // 创建 Fragment 并为其添加一个参数,用来指定应显示的文章
+ ArticleFragment newFragment = new ArticleFragment();
+ Bundle args = new Bundle();
+ args.putInt(ArticleFragment.ARG_POSITION, position);
+ newFragment.setArguments(args);
+
+ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+
+ // 将 fragment_container <code>View</code> 中的内容替换为此 Fragment ,
+ // 然后将该事务添加到返回堆栈,以便用户可以向后导航
+ transaction.replace(R.id.fragment_container, newFragment);
+ transaction.addToBackStack(null);
+
+ // 执行事务
+ transaction.commit();
+ </pre>
+
+ <p><code><a href="{@docRoot}reference/android/support/v4/app/FragmentTransaction.html#addToBackStack(java.lang.String)">addToBackStack()</a></code> 方法可接受可选的字符串参数,来为事务指定独一无二的名称。除非你打算使用 <code><a href="{@docRoot}reference/android/support/v4/app/FragmentManager.BackStackEntry.html">FragmentManager.BackStackEntry</a></code> API 执行高级 Fragment 操作,否则无需使用此名称。</p>
+
diff --git a/docs/html-intl/intl/zh-cn/training/monitoring-device-state/index.jd b/docs/html-intl/intl/zh-cn/training/monitoring-device-state/index.jd
index aa10753..308ad7b 100644
--- a/docs/html-intl/intl/zh-cn/training/monitoring-device-state/index.jd
+++ b/docs/html-intl/intl/zh-cn/training/monitoring-device-state/index.jd
@@ -1,5 +1,5 @@
page.title=优化电池使用时间
-
+page.type=培训
trainingnavtop=true
startpage=true
next.title=监控电池电量和充电状态
diff --git a/docs/html-intl/intl/zh-cn/training/multiscreen/index.jd b/docs/html-intl/intl/zh-cn/training/multiscreen/index.jd
index 3514bd6..02c687a 100644
--- a/docs/html-intl/intl/zh-cn/training/multiscreen/index.jd
+++ b/docs/html-intl/intl/zh-cn/training/multiscreen/index.jd
@@ -1,5 +1,5 @@
page.title=针对多种屏幕进行设计
-
+page.type=培训
trainingnavtop=true
startpage=true
next.title=支持各种屏幕尺寸
diff --git a/docs/html/about/dashboards/index.jd b/docs/html/about/dashboards/index.jd
index 448dcda..063084d 100644
--- a/docs/html/about/dashboards/index.jd
+++ b/docs/html/about/dashboards/index.jd
@@ -57,7 +57,7 @@
</div>
-<p style="clear:both"><em>Data collected during a 7-day period ending on November 3, 2014.
+<p style="clear:both"><em>Data collected during a 7-day period ending on December 1, 2014.
<br/>Any versions with less than 0.1% distribution are not shown.</em>
</p>
@@ -88,7 +88,7 @@
</div>
-<p style="clear:both"><em>Data collected during a 7-day period ending on November 3, 2014.
+<p style="clear:both"><em>Data collected during a 7-day period ending on December 1, 2014.
<br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p>
@@ -108,7 +108,8 @@
<img alt="" style="float:right"
-src="//chart.googleapis.com/chart?chl=GL%202.0%7CGL%203.0&chd=t%3A74.7%2C25.3&chf=bg%2Cs%2C00000000&chco=c4df9b%2C6fad0c&cht=p&chs=400x250" />
+src="//chart.googleapis.com/chart?chl=GL%202.0%7CGL%203.0&chf=bg%2Cs%2C00000000&chd=t%3A72.2%2C27.8&chco=c4df9b%2C6fad0c&cht=p&chs=400x250" />
+
<p>To declare which version of OpenGL ES your application requires, you should use the {@code
android:glEsVersion} attribute of the <a
@@ -126,17 +127,17 @@
</tr>
<tr>
<td>2.0</td>
-<td>74.7%</td>
+<td>72.2%</td>
</tr>
<tr>
<td>3.0</td>
-<td>25.3%</td>
+<td>27.8%</td>
</tr>
</table>
-<p style="clear:both"><em>Data collected during a 7-day period ending on November 3, 2014</em></p>
+<p style="clear:both"><em>Data collected during a 7-day period ending on December 1, 2014</em></p>
@@ -154,42 +155,42 @@
var VERSION_DATA =
[
{
- "chart": "//chart.googleapis.com/chart?chl=Froyo%7CGingerbread%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat&chd=t%3A0.6%2C9.8%2C8.5%2C50.9%2C30.2&chf=bg%2Cs%2C00000000&chco=c4df9b%2C6fad0c&cht=p&chs=500x250",
+ "chart": "//chart.googleapis.com/chart?chl=Froyo%7CGingerbread%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat&chf=bg%2Cs%2C00000000&chd=t%3A0.5%2C9.1%2C7.8%2C48.7%2C33.9&chco=c4df9b%2C6fad0c&cht=p&chs=500x250",
"data": [
{
"api": 8,
"name": "Froyo",
- "perc": "0.6"
+ "perc": "0.5"
},
{
"api": 10,
"name": "Gingerbread",
- "perc": "9.8"
+ "perc": "9.1"
},
{
"api": 15,
"name": "Ice Cream Sandwich",
- "perc": "8.5"
+ "perc": "7.8"
},
{
"api": 16,
"name": "Jelly Bean",
- "perc": "22.8"
+ "perc": "21.3"
},
{
"api": 17,
"name": "Jelly Bean",
- "perc": "20.8"
+ "perc": "20.4"
},
{
"api": 18,
"name": "Jelly Bean",
- "perc": "7.3"
+ "perc": "7.0"
},
{
"api": 19,
"name": "KitKat",
- "perc": "30.2"
+ "perc": "33.9"
}
]
}
@@ -203,27 +204,28 @@
"Large": {
"hdpi": "0.6",
"ldpi": "0.5",
- "mdpi": "4.5",
- "tvdpi": "1.9",
+ "mdpi": "4.6",
+ "tvdpi": "2.0",
"xhdpi": "0.6"
},
"Normal": {
- "hdpi": "36.6",
- "mdpi": "9.9",
- "xhdpi": "18.9",
- "xxhdpi": "16.0"
+ "hdpi": "36.9",
+ "mdpi": "9.4",
+ "tvdpi": "0.2",
+ "xhdpi": "18.8",
+ "xxhdpi": "16.3"
},
"Small": {
- "ldpi": "5.8"
+ "ldpi": "5.4"
},
"Xlarge": {
"hdpi": "0.3",
- "mdpi": "3.9",
- "xhdpi": "0.5"
+ "mdpi": "3.8",
+ "xhdpi": "0.6"
}
},
- "densitychart": "//chart.googleapis.com/chart?chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&chd=t%3A6.3%2C18.3%2C1.9%2C37.5%2C20.0%2C16.0&chf=bg%2Cs%2C00000000&chco=c4df9b%2C6fad0c&cht=p&chs=400x250",
- "layoutchart": "//chart.googleapis.com/chart?chl=Xlarge%7CLarge%7CNormal%7CSmall&chd=t%3A4.7%2C8.1%2C81.4%2C5.8&chf=bg%2Cs%2C00000000&chco=c4df9b%2C6fad0c&cht=p&chs=400x250"
+ "densitychart": "//chart.googleapis.com/chart?chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&chf=bg%2Cs%2C00000000&chd=t%3A5.9%2C17.8%2C2.2%2C37.8%2C20.0%2C16.3&chco=c4df9b%2C6fad0c&cht=p&chs=400x250",
+ "layoutchart": "//chart.googleapis.com/chart?chl=Xlarge%7CLarge%7CNormal%7CSmall&chf=bg%2Cs%2C00000000&chd=t%3A4.7%2C8.3%2C81.6%2C5.4&chco=c4df9b%2C6fad0c&cht=p&chs=400x250"
}
];
diff --git a/docs/html/about/versions/android-5.0.jd b/docs/html/about/versions/android-5.0.jd
index 756b75f..4caa3ad 100644
--- a/docs/html/about/versions/android-5.0.jd
+++ b/docs/html/about/versions/android-5.0.jd
@@ -141,14 +141,6 @@
the Android SDK</a>. Then use the <a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a>
to download the Android 5.0 SDK Platform and System Images.</p>
-<p style="
- padding: 10px;
- background: #eee;
- width: 445px;
- border: 1px solid #ccc;
- margin-top: 20px;
-">To test your apps on a real device, flash a Nexus 5 or Nexus 7 with the <br>
-<a href="/preview/index.html#Start"><b>ANDROID PREVIEW SYSTEM IMAGE</b></a>.</p>
<h3 id="ApiLevel">Update your target API level</h3>
diff --git a/docs/html/about/versions/lollipop.jd b/docs/html/about/versions/lollipop.jd
index 3ee0a86..458de49 100644
--- a/docs/html/about/versions/lollipop.jd
+++ b/docs/html/about/versions/lollipop.jd
@@ -57,16 +57,6 @@
-<p style="
- padding: 10px;
- background: #eee;
- width: 250px;
- border: 1px solid #ccc;
- margin-top: 20px;
-">To test your apps on a real device, flash a Nexus 5 or Nexus 7 with the <br>
-<a href="/preview/index.html#Start"><b>ANDROID PREVIEW SYSTEM IMAGE</b></a>.</p>
-
-
<h2 id="Material">Material design</h2>
<p>Android 5.0 brings <a href="http://www.google.com/design/spec">Material design</a> to Android and gives you an expanded UI toolkit for integrating the new design patterns easily in your apps. </p>
diff --git a/docs/html/auto/images/assets/icons/auto_app_in_simulator.png b/docs/html/auto/images/assets/icons/auto_app_in_simulator.png
new file mode 100644
index 0000000..085b82b
--- /dev/null
+++ b/docs/html/auto/images/assets/icons/auto_app_in_simulator.png
Binary files differ
diff --git a/docs/html/auto/images/assets/icons/gp-auto-quality.png.png b/docs/html/auto/images/assets/icons/gp-auto-quality.png.png
new file mode 100644
index 0000000..483f418
--- /dev/null
+++ b/docs/html/auto/images/assets/icons/gp-auto-quality.png.png
Binary files differ
diff --git a/docs/html/auto/images/assets/icons/media_app_playback.png b/docs/html/auto/images/assets/icons/media_app_playback.png
new file mode 100644
index 0000000..3de04bf
--- /dev/null
+++ b/docs/html/auto/images/assets/icons/media_app_playback.png
Binary files differ
diff --git a/docs/html/auto/images/assets/icons/messaging_app_notifications.png b/docs/html/auto/images/assets/icons/messaging_app_notifications.png
new file mode 100644
index 0000000..3236fdf
--- /dev/null
+++ b/docs/html/auto/images/assets/icons/messaging_app_notifications.png
Binary files differ
diff --git a/docs/html/auto/images/assets/landing/01.gif b/docs/html/auto/images/assets/landing/01.gif
new file mode 100644
index 0000000..34c9fa8
--- /dev/null
+++ b/docs/html/auto/images/assets/landing/01.gif
Binary files differ
diff --git a/docs/html/auto/images/assets/landing/02.gif b/docs/html/auto/images/assets/landing/02.gif
new file mode 100644
index 0000000..d50e06b
--- /dev/null
+++ b/docs/html/auto/images/assets/landing/02.gif
Binary files differ
diff --git a/docs/html/auto/images/assets/landing/03.gif b/docs/html/auto/images/assets/landing/03.gif
new file mode 100644
index 0000000..7992021
--- /dev/null
+++ b/docs/html/auto/images/assets/landing/03.gif
Binary files differ
diff --git a/docs/html/auto/images/assets/landing/04.png b/docs/html/auto/images/assets/landing/04.png
new file mode 100644
index 0000000..a0e75f3
--- /dev/null
+++ b/docs/html/auto/images/assets/landing/04.png
Binary files differ
diff --git a/docs/html/auto/images/assets/landing/05.png b/docs/html/auto/images/assets/landing/05.png
new file mode 100644
index 0000000..f3d2ab8
--- /dev/null
+++ b/docs/html/auto/images/assets/landing/05.png
Binary files differ
diff --git a/docs/html/auto/images/assets/landing/06.png b/docs/html/auto/images/assets/landing/06.png
new file mode 100644
index 0000000..b19a6bb
--- /dev/null
+++ b/docs/html/auto/images/assets/landing/06.png
Binary files differ
diff --git a/docs/html/auto/images/assets/landing/07.png b/docs/html/auto/images/assets/landing/07.png
new file mode 100644
index 0000000..380e8da
--- /dev/null
+++ b/docs/html/auto/images/assets/landing/07.png
Binary files differ
diff --git a/docs/html/auto/images/assets/landing/08.png b/docs/html/auto/images/assets/landing/08.png
new file mode 100644
index 0000000..9889b39
--- /dev/null
+++ b/docs/html/auto/images/assets/landing/08.png
Binary files differ
diff --git a/docs/html/auto/images/assets/landing/FrameA.png b/docs/html/auto/images/assets/landing/FrameA.png
new file mode 100644
index 0000000..2a78380
--- /dev/null
+++ b/docs/html/auto/images/assets/landing/FrameA.png
Binary files differ
diff --git a/docs/html/auto/images/assets/landing/FrameB.png b/docs/html/auto/images/assets/landing/FrameB.png
new file mode 100644
index 0000000..cb7a3c4
--- /dev/null
+++ b/docs/html/auto/images/assets/landing/FrameB.png
Binary files differ
diff --git a/docs/html/auto/images/logos/apps/TextMe.png b/docs/html/auto/images/logos/apps/TextMe.png
new file mode 100644
index 0000000..b96f81a
--- /dev/null
+++ b/docs/html/auto/images/logos/apps/TextMe.png
Binary files differ
diff --git a/docs/html/auto/images/logos/apps/kik.png b/docs/html/auto/images/logos/apps/kik.png
new file mode 100644
index 0000000..056ef7e
--- /dev/null
+++ b/docs/html/auto/images/logos/apps/kik.png
Binary files differ
diff --git a/docs/html/auto/images/logos/apps/npr.png b/docs/html/auto/images/logos/apps/npr.png
new file mode 100644
index 0000000..5234201
--- /dev/null
+++ b/docs/html/auto/images/logos/apps/npr.png
Binary files differ
diff --git a/docs/html/auto/images/logos/apps/soundcloud.png b/docs/html/auto/images/logos/apps/soundcloud.png
new file mode 100644
index 0000000..a5bdbe3
--- /dev/null
+++ b/docs/html/auto/images/logos/apps/soundcloud.png
Binary files differ
diff --git a/docs/html/auto/images/logos/apps/textplus.png b/docs/html/auto/images/logos/apps/textplus.png
new file mode 100644
index 0000000..2a640c4
--- /dev/null
+++ b/docs/html/auto/images/logos/apps/textplus.png
Binary files differ
diff --git a/docs/html/auto/images/logos/apps/whatsapp.png b/docs/html/auto/images/logos/apps/whatsapp.png
new file mode 100644
index 0000000..fb5866e
--- /dev/null
+++ b/docs/html/auto/images/logos/apps/whatsapp.png
Binary files differ
diff --git a/docs/html/auto/images/ui/gearhead_custom_UI.png b/docs/html/auto/images/ui/gearhead_custom_UI.png
new file mode 100644
index 0000000..345db12
--- /dev/null
+++ b/docs/html/auto/images/ui/gearhead_custom_UI.png
Binary files differ
diff --git a/docs/html/auto/images/ui/gearhead_custom_user_actions.png b/docs/html/auto/images/ui/gearhead_custom_user_actions.png
new file mode 100644
index 0000000..6cc0dcb
--- /dev/null
+++ b/docs/html/auto/images/ui/gearhead_custom_user_actions.png
Binary files differ
diff --git a/docs/html/auto/images/ui/gearhead_day.png b/docs/html/auto/images/ui/gearhead_day.png
new file mode 100644
index 0000000..81ead75
--- /dev/null
+++ b/docs/html/auto/images/ui/gearhead_day.png
Binary files differ
diff --git a/docs/html/auto/images/ui/gearhead_drawer_generic.png b/docs/html/auto/images/ui/gearhead_drawer_generic.png
new file mode 100644
index 0000000..d203aed
--- /dev/null
+++ b/docs/html/auto/images/ui/gearhead_drawer_generic.png
Binary files differ
diff --git a/docs/html/auto/images/ui/gearhead_drawers_customized.png b/docs/html/auto/images/ui/gearhead_drawers_customized.png
new file mode 100644
index 0000000..44915b5
--- /dev/null
+++ b/docs/html/auto/images/ui/gearhead_drawers_customized.png
Binary files differ
diff --git a/docs/html/auto/images/ui/gearhead_generic_UI.png b/docs/html/auto/images/ui/gearhead_generic_UI.png
new file mode 100644
index 0000000..beb0701
--- /dev/null
+++ b/docs/html/auto/images/ui/gearhead_generic_UI.png
Binary files differ
diff --git a/docs/html/auto/images/ui/gearhead_lens_switching.png b/docs/html/auto/images/ui/gearhead_lens_switching.png
new file mode 100644
index 0000000..9dbfe6c
--- /dev/null
+++ b/docs/html/auto/images/ui/gearhead_lens_switching.png
Binary files differ
diff --git a/docs/html/auto/images/ui/gearhead_night.png b/docs/html/auto/images/ui/gearhead_night.png
new file mode 100644
index 0000000..3f8c593
--- /dev/null
+++ b/docs/html/auto/images/ui/gearhead_night.png
Binary files differ
diff --git a/docs/html/auto/images/ui/gearhead_overview.png b/docs/html/auto/images/ui/gearhead_overview.png
new file mode 100644
index 0000000..4332ddf3
--- /dev/null
+++ b/docs/html/auto/images/ui/gearhead_overview.png
Binary files differ
diff --git a/docs/html/auto/index.jd b/docs/html/auto/index.jd
index 63ac287..d113a7d 100644
--- a/docs/html/auto/index.jd
+++ b/docs/html/auto/index.jd
@@ -65,6 +65,9 @@
</style>
+
+
+
<div class="landing-body-content">
<div class="landing-hero-container">
@@ -77,17 +80,23 @@
<div class="col-10">
<div class="landing-section-header">
<div class="landing-h1 hero">Android Auto</div>
- <div class="landing-subhead hero">Entertainment and services on your dashboard</div>
+ <div class="landing-subhead hero">Audio entertainment and
+ messaging services in the car.</div>
<div class="landing-hero-description">
- <p style="width:450px">Display and control your Android app in vehicles.
- Integrate your content with easy-to-use APIs and let Android Auto take
- care of the rest.</p>
+ <p style="width:450px">Let drivers listen to and control
+ content in your music and other audio apps. Allow drivers to
+ hear and respond to your messaging service via the
+ car's controls and screen.</p>
</div>
- <div class="landing-body">
- <a href="{@docRoot}auto/overview.html" class="landing-button landing-primary"
- style="margin-top:40px;">
- Developer Overview
+ <div class="landing-body" style="margin-top:40px;">
+ <a href="{@docRoot}training/auto/index.html"
+ class="landing-button landing-primary">
+ Get Started
+ </a>
+ <a href="https://www.youtube.com/watch?v=ctiaVxgclsg" class="video-shadowbox-button white"
+ style="margin-left:40px">
+ Watch the Intro Video
</a>
</div>
</div>
@@ -103,149 +112,110 @@
</div> <!-- end .landing-section .landing-hero -->
</div> <!-- end .landing-hero-container -->
- <div class="landing-rest-of-page">
+ <div class="landing-rest-of-page">
- <div class="landing-section landing-gray-background" id="android-in-car">
- <div class="wrap">
- <div class="landing-section-h1">
- <div class="landing-h1">Extending Android to Cars</div>
- </div>
- <div class="landing-body">
- <div class="landing-subhead">Android Auto brings the Android experience to
- cars with apps like Google Now and Maps.</div>
- <div class="cols">
- <div class="col-8">
- <div class="auto-img-container-cols">
- <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/01_b_now.png" />
- </div>
- </div>
- <div class="col-8">
- <div class="auto-img-container-cols">
- <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/01_a_maps.png" />
- </div>
+ <div class="landing-section landing-gray-background" id="android-in-car">
+ <div class="wrap">
+ <div class="landing-section-header">
+ <div class="landing-h1">Extending Android to Cars</div>
+ <div class="landing-subhead">Android Auto brings the Android
+ platform into the car with a user interface that's optimized for driving.</div>
+ </div>
+
+ <div class="landing-body">
+ <div class="cols">
+ <div class="col-8">
+ <div class="auto-img-container-cols">
+ <img class="auto-img-frame-cols" src="/auto/images/assets/landing/FrameA.png" />
+ <img class="auto-img-shot-cols" src="/auto/images/assets/landing/01.gif" />
</div>
</div>
-
- <p>When users connect their Android phones to compatible vehicles, Android Auto
- shows a standard interface that lets them start enabled apps and services.
- Android Auto locks the handheld device when connected, so drivers
- interact with Auto by using the vehicle's input controls, touch display, and voice.</p>
- </p>
+ <div class="col-8">
+ <div class="auto-img-container-cols">
+ <img class="auto-img-frame-cols" src="/auto/images/assets/landing/FrameA.png" />
+ <img class="auto-img-shot-cols" src="/auto/images/assets/landing/02.gif" />
+ </div>
+ </div>
</div>
- </div> <!-- end .wrap -->
- </div> <!-- end .landing-section -->
+ </div>
+ </div> <!-- end .wrap -->
+ </div> <!-- end .landing-section -->
-
- <div class="landing-section">
+ <div class="landing-section">
<div class="wrap">
<div class="landing-section-header">
<div class="landing-h1">Build for One Platform</div>
- <div class="landing-subhead">Create apps with the Android APIs you're familiar with
- and extend them to cars with the Auto SDK.
+ <div class="landing-subhead">Create apps with the Android APIs
+ you’re familiar with and extend them to cars.
</div>
</div>
<div class="landing-body">
-
- <div class="cols">
- <div class="col-8">
- <div class="auto-img-container-cols">
- <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/02_b_switcher.gif" />
- </div>
- </div>
- <div class="col-8">
- <div class="auto-img-container-cols">
- <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/02_a_notif.gif" />
- </div>
- </div>
- </div>
- <p>Write your apps without having
- to worry about vehicle-specific hardware differences like screen resolution, software
- interfaces, knobs, and touch controls. Your users get the same experience on any compatible
- vehicle such as a consistent app launcher and system events such as notifications.</p>
- </div>
- </div> <!-- end .wrap -->
- </div> <!-- end .landing-section -->
-
-
- <div class="landing-section landing-gray-background">
- <div class="wrap">
- <div class="landing-section-header">
- <div class="landing-h1">Minimize Distraction</div>
- <div class="landing-subhead">
- Android Auto displays different UIs for several app categories that let users focus on the road.
- </div>
- </div>
- <div class="landing-body">
<div class="cols">
<div class="col-8">
<div class="auto-img-container-cols">
- <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/03_b_voice.gif" />
+ <img class="auto-img-frame-cols" src="/auto/images/assets/landing/FrameA.png" />
+ <img class="auto-img-shot-cols" src="/auto/images/assets/landing/05.png" />
</div>
</div>
<div class="col-8">
<div class="auto-img-container-cols">
- <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/03_a_musict.png" />
+ <img class="auto-img-frame-cols" src="/auto/images/assets/landing/FrameA.png" />
+ <img class="auto-img-shot-cols" src="/auto/images/assets/landing/06.png" />
</div>
</div>
</div>
- <p>Android Auto defines the user interaction model for all
- apps and let you hook into a standard UI with touch and voice controls. The interface
- is designed to reduce driver distraction while still letting you customize and brand them to properly deliver your content.
- </p>
+ <p>Write your apps without having to worry about vehicle-specific
+ hardware differences like screen resolution, software interfaces,
+ knobs, and touch controls. Your users get the same experience on any
+ compatible vehicle such as a consistent app launcher and system
+ events such as notifications.</p>
</div>
</div> <!-- end .wrap -->
</div> <!-- end .landing-section -->
- <div class="landing-section" style="background-color:#f5f5f5">
+ <div class="landing-section" style="background-color:#f5f5f5" id="developing-for-auto">
<div class="wrap">
<div class="landing-section-header">
- <div class="landing-pre-h1">Coming soon</div>
- <div class="landing-h1">Android Auto SDK</div>
+ <div class="landing-pre-h1">Now Available</div>
+ <div class="landing-h1">Developing for Android Auto</div>
+ <div class="landing-subhead">The APIs for building Auto-enabled apps
+ are available now! When connected to compatible vehicles, apps on
+ handheld devices running Android 5.0 or higher can communicate
+ with Android Auto.</div>
</div>
<div class="landing-body">
- <p>In the coming months, we’ll be releasing the Android Auto SDK, which includes APIs
- and tools to make your existing apps compatible with Android Auto. The first version
- of the SDK will provide APIs for music, podcast, live radio, and audio
- news apps, as well as limited voice actions.</p>
-
- <div class="cols" style="margin-top:40px">
- <div class="col-3-wide">
- <p class="sdk-link-title">Updates</p>
- <p class="sdk-link-desc">
- Register to receive more information and be notified when the SDK is available.
+ <div class="cols">
+ <div class="col-8">
+ <div class="auto-img-container-cols">
+ <img class="auto-img-frame-cols" src="/auto/images/assets/landing/FrameA.png" />
+ <img class="auto-img-shot-cols" src="/auto/images/assets/landing/03.gif" />
+ </div>
+ <div class="landing-h3">Play Music on the Road from Your App</div>
+ <p class="landing-small" style="padding-left:0px; padding-top:15px;">
+ Extend audio apps such as music, radio, and audiobook players
+ into the car. Build apps that let users browse and play their
+ music in the car.<br><a href="{@docRoot}training/auto/audio/index.html">Learn how to build audio apps</a>
</p>
- <a class="sdk-link" href="https://docs.google.com/a/google.com/forms/d/1ANgYOoYLkfyZ2JRPSU34Nep5yNaU-Ha2syXJ9b4xLrA/viewform">Sign up for updates</a>
</div>
- <div class="col-3-wide">
- <p class="sdk-link-title">Google+ Community</p>
- <p class="sdk-link-desc">
- Stay involved, get updates, and exchange experiences with other developers.
+ <div class="col-8">
+ <div class="auto-img-container-cols">
+ <img class="auto-img-frame-cols" src="/auto/images/assets/landing/FrameA.png" />
+ <img class="auto-img-shot-cols" src="/auto/images/assets/landing/04.png" />
+ </div>
+ <div class="landing-h3">Keep Users Connected with In-Vehicle Messaging</div>
+ <p class="landing-small" style="padding-left:0px; padding-top:15px;">
+ Create messaging apps that receive incoming notifications,
+ read messages via text-to-speech, and let users reply by voice
+ input in the car.<br><a href="{@docRoot}training/auto/messaging/index.html">Learn how to build messaging apps</a>
</p>
- <a class="sdk-link" href="http://g.co/androidautodev">Discuss on Google+</a>
- </div>
- <div class="col-3-wide">
- <p class="sdk-link-title">Developer Overview</p>
- <p class="sdk-link-desc">
- Learn more about developing apps for Android Auto when the SDK is available.
- </p>
- <a class="sdk-link" href="{@docRoot}auto/overview.html">Learn about the platform</a>
</div>
</div>
</div>
-
</div> <!-- end .wrap -->
</div> <!-- end .landing-section -->
-
-
<div class="landing-section landing-gray-background" >
<div class="wrap">
<div class="landing-section-header">
@@ -255,15 +225,25 @@
</div>
<div class="landing-body">
<div class="cols">
-
+ <div class="col-4">
+ <img src="{@docRoot}auto/images/logos/apps/iheartradio.png"
+ width="160" height="160" class="img-logo" />
+ </div>
<div class="col-4">
<img src="{@docRoot}auto/images/logos/apps/joyride.png"
width="160" height="160" class="img-logo" />
</div>
<div class="col-4">
+ <img src="{@docRoot}auto/images/logos/apps/kik.png"
+ width="120" height="120" class="img-logo" style="margin-top:30px" />
+ </div>
+ <div class="col-4">
<img src="{@docRoot}auto/images/logos/apps/mlb.png"
width="160" height="160" class="img-logo" />
</div>
+ </div>
+
+ <div class="cols">
<div class="col-4">
<img src="{@docRoot}auto/images/logos/apps/pandora.png"
width="160" height="160" class="img-logo" />
@@ -272,43 +252,75 @@
<img src="{@docRoot}auto/images/logos/apps/pocketcasts.png"
width="160" height="160" class="img-logo" />
</div>
- </div>
- <div class="cols">
<div class="col-4">
<img src="{@docRoot}auto/images/logos/apps/songza.png"
width="160" height="160" class="img-logo" />
</div>
<div class="col-4">
+ <img src="/auto/images/logos/apps/soundcloud.png"
+ width="100" height="100" class="img-logo"
+ style="margin-top:30px" />
+ </div>
+ </div>
+
+ <div class="cols">
+ <div class="col-4">
+ <img src="/auto/images/logos/apps/spotify.png"
+ width="160" height="160" class="img-logo" />
+ </div>
+ <div class="col-4">
<img src="{@docRoot}auto/images/logos/apps/stitcher.png"
width="160" height="160" class="img-logo" />
</div>
<div class="col-4">
+ <img src="/auto/images/logos/apps/TextMe.png"
+ width="100" height="100" class="img-logo" style="margin-top:30px" />
+ </div>
+ <div class="col-4">
+ <img src="/auto/images/logos/apps/textplus.png"
+ width="120" height="24" class="img-logo" style="margin-top:70px" />
+ </div>
+ </div>
+
+ <div class="cols">
+ <div class="col-4">
<img src="{@docRoot}auto/images/logos/apps/tunein.png"
- width="160" height="160" class="img-logo" />
+ width="160" height="160" class="img-logo" style="margin-left:160px" />
</div>
<div class="col-4">
<img src="{@docRoot}auto/images/logos/apps/umano.png"
- width="160" height="160" class="img-logo" />
+ width="160" height="160" class="img-logo" style="margin-left:370px" />
</div>
</div>
+
<div class="cols" style="margin-top:40px">
<div class="col-4">
- <img src="{@docRoot}auto/images/logos/apps/iheartradio.png"
- width="160" height="160" class="img-logo" />
+ <img src="/auto/images/logos/apps/whatsapp.png"
+ width="120" height="120" class="img-logo" />
</div>
- <div class="col-12">
+ <div class="col-8">
<p><em>
- "The Android Auto APIs provide an easy way to integrate the most important features and functionality of iHeartRadio’s robust music service into a safety-minded automotive infotainment solution. The process was seamless, utilizing a flexible construct that allowed us to quickly adapt our existing product without losing any of the core experience our listeners know and love."</em></p>
+ "We were able to get messaging functionality for text
+ implemented easily on Android Auto, with minimal development
+ effort. We're excited to participate in Android Auto which
+ provides a notification interface for the car that is both
+ user-friendly and highly safety-minded."</em></p>
</div>
</div>
+
<div class="cols" style="margin-top:60px">
<div class="col-4">
- <img src="{@docRoot}auto/images/logos/apps/spotify.png"
- width="160" height="160" class="img-logo" />
+ <img src="/auto/images/logos/apps/npr.png"
+ width="100" height="128" class="img-logo" />
</div>
- <div class="col-12"><p style="margin-top:20px"><em>
- "Android Auto offers Spotify the exciting opportunity to easily enable safe access to millions of songs while driving. We were able to quickly develop for the platform using the new Android voice and media API extensions. As a result, Android users will soon be able to continue the Spotify experience in their cars, including being able to play any song, artist, album or playlist by voice.</em></p>
+ <div class="col-8"><p style="margin-top:0px"><em>
+ "Android Auto connects NPR One listeners to a personalized stream
+ of public radio news and stories to catch up on in the car. It's
+ an engaging and driver-safe user experience that was developed
+ using the media APIs provided in Android 5.0. The available
+ development tools made the integration and testing process simple
+ for launching in a short period of time."</em></p>
</div>
</div>
</div>
@@ -316,8 +328,6 @@
</div> <!-- end .landing-section -->
-
-
<div class="landing-section landing-white-background">
<div class="wrap">
<div class="landing-section-header">
@@ -456,24 +466,47 @@
</div>
</div>
</div>
- </div> <!-- end .landing-rest-of-page -->
- <div class="content-footer wrap" itemscope="" itemtype="http://schema.org/SiteNavigationElement"
- style="border-top: none;">
- <div class="layout-content-col col-16" style="padding-top:4px">
- <style>#___plusone_0 {float:right !important;}</style>
- <div class="g-plusone" data-size="medium"></div>
+
+ <div class="landing-section landing-red-background">
+ <div class="wrap">
+ <div class="landing-section-header">
+ <div class="landing-h1 landing-align-left">Get Started with Android Auto</div>
+
+ <div class="landing-subhead landing-subhead-red">
+ <p>
+ Set up your development environment and start working with the APIs.
+ We’re excited about the experiences you'll create and can't
+ wait to see what you do next.</p>
+ </div>
+ </div>
+ <div class="landing-body">
+ <a href="{@docRoot}training/auto/index.html"
+ class="landing-button landing-primary" style="margin-top: 20px;">
+ Get Started
+ </a>
+ </div>
+ </div>
</div>
+ </div>
+ <div class="content-footer wrap" itemscope="" itemtype="http://schema.org/SiteNavigationElement"
+ style="border-top: none;">
+
+ <div class="layout-content-col col-16" style="padding-top:4px">
+ <style>#___plusone_0 {float:right !important;}</style>
+ <div class="g-plusone" data-size="medium"></div>
</div>
- <div id="footer" class="wrap" style="width:940px;position:relative;top:-35px;z-index:-1">
- <div id="copyright">
+ </div>
+
+ <div id="footer" class="wrap" style="width:940px;position:relative;top:-35px;z-index:-1">
+ <div id="copyright">
Except as noted, this content is
licensed under <a href="http://creativecommons.org/licenses/by/2.5/">
Creative Commons Attribution 2.5</a>. For details and
restrictions, see the <a href="{@docRoot}license.html">Content
License</a>.
- </div>
</div>
- </div> <!-- end .landing-hero-container -->
+ </div>
+</div> <!-- end .landing-hero-container -->
<script>
$("a.landing-down-arrow").on("click", function(e) {
diff --git a/docs/html/auto/overview.jd b/docs/html/auto/overview.jd
deleted file mode 100644
index ae1efec..0000000
--- a/docs/html/auto/overview.jd
+++ /dev/null
@@ -1,411 +0,0 @@
-fullpage=true
-page.viewport_width=970
-no_footer_links=true
-excludeFromSuggestions=true
-page.metaDescription=Android Auto
-
-@jd:body
-
-<style>
-.jd-descr {
- height:auto;
-}
-#copyright {
- margin-top:-35px;
-}
-.auto-img-container {
- position:relative;
-}
-.auto-img-frame {
- z-index:2;
- position:relative;
-}
-.auto-img-shot {
- position:absolute;
- top:9px;
- left:8px;
- z-index:1;
-}
-.auto-img-container-cols {
- position:relative;
- margin-top:10px;
-}
-.auto-img-frame-cols {
- width:380px;
- z-index:2;
- position:relative;
-}
-.auto-img-shot-cols {
- width:369px;
- position:absolute;
- top:7px;
- left:6px;
- z-index:1;
-}
-.auto-col-2 {
- width:380px;
- display: inline;
- float: left;
- margin-left: 10px;
- margin-right: 10px;
-}
-.auto-img-container-single {
- width:380px;
- margin:0 auto;
- margin-top:20px;
-}
-</style>
-
-<div style="width:780px; margin:0 auto;">
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>In this document</h2>
-<ol>
- <li><a href="#design">Design</a>
- <ol>
- <li><a href="#designprinciples">Design Principles</a></li>
- <li><a href="#uioverview">UI Overview</a></li>
- </ol>
- </li>
- <li><a href="#architecture">Architecture</a></li>
- <li><a href="#ui">User Interface</a>
- <ol>
- <li><a href="#launchapp">Launch App</a></li>
- <li><a href="#useractions">User Actions</a></li>
- <li><a href="#drawertransitions">Drawer Transitions</a></li>
- <li><a href="#daynighttransitions">Day and Night Transitions</a></li>
- <li><a href="#customizeui">Customizing the UI</a></li>
- </ol>
- </li>
- <li><a href="#devprocess">Development Process</a></li>
- <li><a href="#emulator">Testing Your App</a></li>
- <li><a href="#running">Running Your App</a></li>
-</ol>
-</div>
-</div>
-
-<h1>Android Auto Developer Overview</h1>
-
-<p>Android Auto extends the Android platform into the car. When users connect
-their Android handheld device to a compatible vehicle, Android Auto provides a car-optimized
-Android experience on the vehicle's screen. Users interact with compatible apps and services
-through voice actions and the vehicle's input controls.</p>
-
-<p>The Android Auto SDK lets you easily extend your existing apps to work in the car, without
-having to worry about vehicle-specific hardware differences. You can use many Android APIs and
-services you are already familiar with. Android Auto provides an easy to use UI model and
-supports notifications and voice actions:</p>
-
-<dl>
-<dt style="margin-bottom:10px"><strong>Media UI</strong></dt>
-<dd style="margin-bottom:20px">
-Android Auto defines interaction models and car-specific UI patterns for apps. The
-first version of Android Auto supports media apps, such as music, podcast, live radio, and
-audio news apps.
-</dd>
-<dt style="margin-bottom:10px"><strong>Notifications</strong></dt>
-<dd style="margin-bottom:20px">
-The platform will integrate with existing Android APIs for notifications. Users will get
-car appropiate notifications from Android apps on the vehicle's screen.</dd>
-
-<dt style="margin-bottom:10px"><strong>Voice Actions</strong></dt>
-<dd style="margin-bottom:20px">
-Android Auto supports a set of voice actions to interact with compatible apps and services.
-Apps can respond to the voice actions they're interested in, such as playing a particular song
-or taking a note.</dd>
-
-<dt style="margin-bottom:10px"><strong>Easy Development Workflow</strong></dt>
-<dd style="margin-bottom:20px">
-To extend an existing Android app for Android Auto, you implement a set of interfaces and
-services defined in the platform. You can reuse existing functionality and many Android APIs
-you already know.</dd>
-</dl>
-
-<p>We’ll release the Android Auto SDK in the coming months, which will let you test your
-Android Auto experience on a regular Android device.</p>
-
-
-<h2 id="design">Design</h2>
-
-<p>Android Auto extends users' digital ecosystem into their cars, allowing drivers to stay
-connected to their virtual worlds while staying focused on the road ahead.</p>
-
-<p>Because driving is the primary activity in the car, any digital experiences should be designed
-to complement and augment that activity. They should never demand the user's attention.</p>
-
-<p>Designing for cars is fundamentally different than designing for phones or tablets, and
-requires rethinking how experiences unfold. Because attention is limited and not all tasks are
-possible in the car, effective apps leverage the entire set of devices that drivers have,
-leveraging the app experience on those devices, outside of the car, to set the stage for simple
-experiences while driving.</p>
-
-<p>Android Auto experiences are:</p>
-
-<p><strong>Glanceable and simple</strong>. Driving requires users' full attention. In-car software
-should not. Android Auto was designed to simplify not only the UI, but to optimize interactions
-and require less thinking, induce lower cognitive load, and ultimately, be safer. Effective apps
-provide just enough information in the minimum amount of time the user needs to glance at it and
-return their attention back to the road. Apps should also reduce the number of features to only
-those that are safe and drive-appropriate.</p>
-
-<p><strong>Predictive, yet predictable</strong>. Android Auto leverages rich, contextual awareness
-to keep the driver informed about important situations during the drive. Rich, timely help is
-combined with predictable functions. Effective apps make use of the patterns for common tasks and
-show timely information only when relevant.</p>
-
-<p><strong>Connected</strong>. By leveraging the user's personal ecosystem of apps and services,
-Android Auto promotes a continuous experience from phone to car to other devices. The user's
-music, destinations, and virtual ecosystem are always available to augment the drive. Experiences
-that leverage personal context and other devices are naturally part of Android Auto.</p>
-
-<p><strong>Naturally integrated</strong>. Android Auto blends the user's apps with the car,
-creating a truly integrated experience that leverages what is unique about each car. By using
-the screens, controls, and capabilities of the vehicle, Android Auto feels like an extension of
-the car.</p>
-
-
-
-
-<h2 id="architecture">Architecture</h2>
-
-<p>The Android Auto app shows your app's customized UI on the vehicle's screen. To communicate
-with the Android Auto app, your media app implements a set of media interfaces.</p>
-
-<div style="width:750px;margin:0 auto">
-<img src="{@docRoot}auto/images/figure01.png" alt="" />
-<p class="img-caption">
- <strong>Figure 1</strong> - Architecture of Android Auto.
-</p>
-</div>
-
-<p>The architecture consists of the following components:</p>
-
-<p><strong>Media App</strong> - Runs a media service that exposes content through browsing and
-playback APIs. The service provides content to the Android Auto app. This is your Android app.</p>
-
-<p><strong>Android Auto App</strong> - Creates the UI and handles user interactions.
-This app uses a media client to request content from the media service running in the media
-app. The client requests data from the media service and monitors service states.</p>
-
-<p><strong>Vehicle Display</strong> - Shows app content and supports user interaction via
-on-screen soft buttons and other components, such as physical buttons or steering
-wheel controls.</p>
-
-<p>Android media apps must implement binders to these APIs:</p>
-
-<ul>
-<li><strong>Browsing</strong> - Enables a media client to browse a hierarchy of a user’s
-media collection, presented as a virtual file system with containers (similar to directories)
-and items (similar to files).</li>
-<li><strong>Playback</strong> - Enables a media client to control media playback and monitor
-playback state through callbacks.</li>
-</ul>
-
-
-<h2 id="ui">User Interface</h2>
-
-<p>The Android Auto app uses a car-specific UI model to display content and user interaction
-opportunities. Android Auto provides you with a standard UI designed to minimize driver
-distraction. You do not have to test a custom UI for driver distraction, which is a
-lengthy and expensive process involving multiple legislations across the globe and different
-standards for each vehicle OEM.</p>
-
-<p>The UI defines interfaces for browsing, searching, and listening to content from
-media apps. You can customize the UI colors, action icons, background images, and more.</p>
-
-<h3 id="launchapp">Launcher</h3>
-
-<p>The launcher shows all the compatible media apps installed on the user’s
-Android device and lets users select one of them from a scrollable list:</p>
-
-<div class="auto-img-container-single">
- <div class="auto-img-container">
- <img class="auto-img-frame-cols" src="/auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="/auto/images/assets/do_01_switcher.png" />
- </div>
- <p class="img-caption" style="margin-top:0px">
- <strong>Figure 2.</strong> The launcher.
- </p>
-</div>
-
-<h3>Primary App UI</h3>
-
-<p>After the user selects a media app, the display shows the primary app UI.
-You can customize this UI to show your own icons, app name, and
-background images. Figure 3 shows an example of a customized UI:</p>
-
-<div class="cols">
-<div class="auto-col-2">
- <div class="auto-img-container-cols">
- <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/do_05_template.png" />
- </div>
-</div>
-<div class="auto-col-2">
- <div class="auto-img-container-cols">
- <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/do_02_music.png" />
- </div>
-</div>
-</div>
-<p class="img-caption">
- <strong>Figure 3.</strong> A customized UI.
-</p>
-
-
-
-<h3 id="useractions">User Actions</h3>
-
-<p>The primary app UI supports four main actions on the action bar, four auxiliary actions
-on the overflow bar, and the <em>Return</em> action. You can use standard controls and customize
-the actions and icons, as shown in Figure 4.</p>
-
-<div class="auto-img-container-single">
- <div class="auto-img-container">
- <img class="auto-img-frame-cols" src="/auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="/auto/images/assets/do_03_more.png" />
- </div>
- <p class="img-caption" style="margin-top:0px">
- <strong>Figure 4.</strong> Custom extra actions.
- </p>
-</div>
-
-<h3 id="drawertransitions">Drawer Transitions</h3>
-
-<p>For browse actions, the display shows the drawer transition as shown in Figure 5.</p>
-
-<div class="cols">
-<div class="auto-col-2">
- <div class="auto-img-container-cols">
- <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/do_06_gdrawer.png" />
- </div>
-</div>
-<div class="auto-col-2">
- <div class="auto-img-container-cols">
- <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/do_04_mdrawer.png" />
- </div>
-</div>
-</div>
-<p class="img-caption">
- <strong>Figure 5.</strong> Generic and customized drawers.
-</p>
-
-<p>After the transition from the primary app UI to the drawer UI, the drawer
-appears on the center. The customized drawer UI shows the media containers and
-media files provided by the media service in your app. You can also customize drawers
-with icons for list items.</p>
-
-
-<h3 id="daynighttransitions">Day and Night Transitions</h3>
-
-<p>All the UIs support different color schemes for day and night.
-The platform provides the state (day or night) and makes adjustments automatically.</p>
-
-<div class="cols">
-<div class="auto-col-2">
- <div class="auto-img-container-cols">
- <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/do_02_music.png" />
- </div>
-</div>
-<div class="auto-col-2">
- <div class="auto-img-container-cols">
- <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" />
- <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/do_02_music_night.png" />
- </div>
-</div>
-</div>
-<p class="img-caption">
- <strong>Figure 6.</strong> Day and night modes.
-</p>
-
-<h3 id="customizeui">Customizing UIs</h3>
-
-<p>To customize the UI, you provide the following app-specific resources and actions
-to the Android Auto media client:</p>
-
-<ul>
-<li><strong>Resources</strong> - App logo, app name, theme colors, and background images.</li>
-<li><strong>Actions</strong> - Multiple custom actions; for example: <em>Thumbs Up/Down</em>,
-<em>Favorite</em>, and <em>Bookmark</em>. These actions are app-specific.</li>
-</ul>
-
-<p>If provided, the media client automatically uses them in the UI.</p>
-
-
-<h2 id="devprocess">Development Process</h2>
-
-<p class="note"><strong>Note:</strong> When released, the Android Auto SDK will provide
-media service interfaces, an APK for handheld devices that simulates the Android Auto
-app, and other tools for Android Auto development.</p>
-
-<p>To create a media app for Android Auto, you include an Android service in your app
-that implements the media service interfaces provided by the Android Auto SDK. These
-interfaces define functionality for browsing and finding content, playing media,
-customizing the UI, and performing app-specific actions.</p>
-
-<p>The media service interfaces present the content library as a navigable tree and enable
-clients to play media, get album art, obtain theme resources for the UI, and
-invoke app-specific actions.</p>
-
-<p>You don’t have to create a new app for Android Auto: you can extend your existing
-Android app with implementations of the media service interfaces. Your service exposes
-your app’s media content, theme resources, and app-specific actions using the methods and
-data types specified by the media service interfaces. This simplifies the development
-cycle because:</p>
-
-<ul>
-<li>You do not have to maintain a separate project for Android Auto</li>
-<li>You can reuse existing functionality from your Android app</li>
-</ul>
-
-<p>The Android Auto client presents the customized UI to users and invokes the
-functionality from your service as needed. This has two additional advantages:</p>
-
-<ul>
-<li>Your app does not implement a UI for Android Auto</li>
-<li>Your app does not manage user interactions directly</li>
-</ul>
-
-<p>This also means that you do not have to worry about vehicle-specific hardware
-differences such as screen resolutions, software interfaces, knobs and touch
-controls.</p>
-
-
-<h2 id="emulator">Testing Your App on an Android Device</h2>
-
-<p>The Android Auto SDK includes an APK with a media client implementation, which is
-similar to those available in compatible vehicles. To test your app with this
-client:</p>
-
-<ol>
-<li>Get an Android device with a similar form factor to a dashboard screen (like a
-Nexus 7).</li>
-<li>Configure the device for Android development.</li>
-<li>Install the APK for the media client from the Android Auto SDK on the device.</li>
-<li>Install the APK for your app on the device.</li>
-<li>Open the media client app from the Android Auto SDK on the device.</li>
-<li>Select your app from the list of available services.</li>
-</ol>
-
-<p>The customized UI for your app appears on the client. You can navigate the content
-library and play media. If your app provides app-specific actions, these actions appear
-in the UI controls.</p>
-
-
-<h2 id="running">Running Your App on Android Auto</h2>
-
-<p>Media apps are available on the Google Play Store for compatible Android devices.
-When users connect their Android device to a compatible vehicle, the
-Android Auto media client shows a list of all the Android apps installed on the phone
-that implement the media service interfaces.</p>
-
-<p>When users select one of these apps, the Android Auto media client uses the app’s
-service to respond to user input and invoke the methods in the media service interfaces
-to build the UI, navigate the content library, and play media.</p>
-
-<div style="margin-bottom:40px"> </div>
-</div>
diff --git a/docs/html/design/auto/index.jd b/docs/html/design/auto/index.jd
index c970cac..e45bd36 100644
--- a/docs/html/design/auto/index.jd
+++ b/docs/html/design/auto/index.jd
@@ -1,35 +1,177 @@
-page.title=Android Auto
+page.title=Designing for Auto
+page.tags="design","Auto"
@jd:body
-<style>
-.auto-img-container-cols {
- position:relative;
- margin-bottom:25px;
- margin-top:25px;
-}
-.auto-img-frame-cols {
- z-index:2;
- position:relative;
-}
-.auto-img-shot-cols {
- position:absolute;
- top:5px;
- left:2px;
- z-index:1;
-}
-</style>
+<a class="notice-developers" href="{@docRoot}training/auto/index.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Building Apps for Auto</p>
+ </div>
+</a>
-<div class="auto-img-container-cols" style="float:right; margin:0 0 40px 40px;width:460px">
- <img class="auto-img-frame-cols" src="/auto/images/assets/00_frame.png">
- <img class="auto-img-shot-cols" src="/auto/images/assets/03_a_musict.png">
+<div class="sidebox-wrapper">
+<div class="sidebox">
+ <h2><strong>UI Guidelines</strong></h2>
+ <ul>
+ <li><a href="{@docRoot}shareables/auto/AndroidAuto-media-apps.pdf">
+ <strong>Auto Media Apps (PDF)</strong></a>
+ </li>
+ <li><a href="{@docRoot}shareables/auto/AndroidAuto-messaging-apps.pdf">
+ <strong>Auto Messaging Apps (PDF)</strong></a>
+ </li>
+ <li><a href="{@docRoot}shareables/auto/AndroidAuto-custom-colors.pdf">
+ <strong>Auto Color Customization (PDF)</strong></a>
+ </li>
+ </ul>
+</div>
</div>
-<p>Android Auto is <strong>coming soon</strong> and brings apps to the car,
-integrating with the vehicle's input controls and display.</p>
+<p>Android Auto provide a standardized user interface and user interaction
+model that works across vehicles. As a designer, you do not
+need to worry about vehicle-specific hardware differences. This page
+describes some of the key screens that users will encounter in the
+Auto user interface. To dive deeper into how to design for
+the Auto user interface (UI), see the Auto UI guidelines in the sidebar.</p>
-<p>The future design guidelines provide templates that define the user interaction model for all apps and let you hook into a standard UI with touch and voice controls. The templates meet international best practices for reducing driver distraction while still letting you customize and brand them to properly deliver your content.</p>
+<p class="note"><strong>Important:</strong> Google takes driver distraction
+very seriously. There are specific design requirements your app must meet to
+qualify as an Auto app on Google Play. By adhering to these
+requirements, you can reduce the effort for building and testing your app. For
+more information, see <a href="{@docRoot}distribute/essentials/quality/auto.html">Auto App Quality</a>.</p>
-<p><a href="{@docRoot}auto/index.html">Learn more about Android Auto</a>.</p>
+<br>
+
+<h2 id="overview-screen">Overview Screen</h2>
+
+<p>When users first connect their Android device to the car, they are presented
+with the Overview screen. This screen displays contextual cards based on the
+user’s location, time of day, and so on. The user can also use this screen to view
+notifications from their messaging apps and select a message to send a response
+by voice input.</p>
+
+<div class="auto-img-container-single">
+ <div class="auto-img-container">
+ <img src="{@docRoot}auto/images/ui/gearhead_overview.png" alt="Overview screen" />
+ </div>
+ <p class="img-caption" style="margin-top:0px">
+ <strong>Figure 1.</strong> The Overview screen may show contextual cards and
+new messages.
+ </p>
+</div>
+
+<h2 id="launchapp">Audio App Launcher</h2>
+
+<p>Tapping on the headphones icon in the Activity Bar lets the
+ user see all audio apps installed on the user’s handheld device and select
+ one of them from a scrollable list.</p>
+
+<div class="auto-img-container-single">
+ <div class="auto-img-container">
+ <img src="{@docRoot}auto/images/ui/gearhead_lens_switching.png" alt="Launcher" />
+ </div>
+ <p class="img-caption" style="margin-top:0px">
+ <strong>Figure 2.</strong> The audio app launcher shows available audio apps.
+ </p>
+</div>
+
+<h2>Primary App UI</h2>
+
+<p>After the user selects an audio app, the display shows the primary app UI.
+Auto presents the app in a standardized UI, but you can customize
+this UI to show your own icons, app name, and background images
+(such as the album art).</p>
+
+<div class="auto-img-container-single">
+ <div class="auto-img-container">
+ <img src="{@docRoot}auto/images/ui/gearhead_generic_UI.png" alt="Generic audio app UI" />
+ </div>
+ <p class="img-caption" style="margin-top:0px">
+ <strong>Figure 3.</strong> Generic audio app UI.
+ </p>
+</div>
+
+<div class="auto-img-container-single">
+ <div class="auto-img-container">
+ <img src="{@docRoot}auto/images/ui/gearhead_custom_UI.png" alt="Customized audio app UI" />
+ </div>
+ <p class="img-caption" style="margin-top:0px">
+ <strong>Figure 4.</strong> Example of the Google Play Music app UI.
+ </p>
+</div>
+
+<h3 id="useractions">User Actions</h3>
+
+<p>The media control card in the primary app UI supports up to four main actions,
+four auxiliary actions on the overflow bar, and the <em>Return</em> action. You can
+use standard controls and customize the actions and icons.</p>
+
+<div class="auto-img-container-single">
+ <div class="auto-img-container">
+ <img src="{@docRoot}auto/images/ui/gearhead_custom_user_actions.png" alt="Customized user actions" />
+ </div>
+ <p class="img-caption" style="margin-top:0px">
+ <strong>Figure 5.</strong> Example of user actions in the Google Play Music app.
+ </p>
+</div>
+
+<h3 id="drawerlist">Drawer List</h3>
+
+<p>For browse actions, the display shows the drawer transition. After the
+transition from the primary app UI to the list UI, the drawer appears in the
+center. The customized list UI shows the media containers and the audio files
+provided by the media service in your app. You can also customize drawers with
+icons for list items.</p>
+
+<div class="auto-img-container-single">
+ <div class="auto-img-container">
+ <img src="{@docRoot}auto/images/ui/gearhead_drawer_generic.png"
+ alt="Generic drawers" style="border:3px solid black" />
+ </div>
+ <p class="img-caption" style="margin-top:0px">
+ <strong>Figure 6.</strong> Example of the drawer layout template with generic list items.
+ </p>
+</div>
+
+<div class="auto-img-container-single">
+ <div class="auto-img-container">
+ <img src="{@docRoot}auto/images/ui/gearhead_drawers_customized.png"
+ alt="Customized drawers" style="border:3px solid black" />
+ </div>
+ <p class="img-caption" style="margin-top:0px">
+ <strong>Figure 7.</strong> Example of the the drawer layout in the Google Play Music app.
+ </p>
+</div>
+
+
+<h2 id="daynighttransitions">Day and Night Transitions</h2>
+
+<p>All the UIs support different color schemes for day and night. The platform
+provides the state (day or night) and makes adjustments automatically.</p>
+
+<div class="auto-img-container-single">
+ <div class="auto-img-container">
+ <img src="{@docRoot}auto/images/ui/gearhead_day.png" alt="Audio app in day mode" />
+ </div>
+ <p class="img-caption" style="margin-top:0px">
+ <strong>Figure 8.</strong> Example of the Google Play Music app in day mode.
+ </p>
+</div>
+
+<div class="auto-img-container-single">
+ <div class="auto-img-container">
+ <img src="{@docRoot}auto/images/ui/gearhead_night.png" alt="Audio app in night mode" />
+ </div>
+ <p class="img-caption" style="margin-top:0px">
+ <strong>Figure 9.</strong> Example of the Google Play Music app in night mode.
+ </p>
+</div>
+
+<h3 class="rel-resources clearfloat">Related resources</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query=
+"collection:design/auto/auto_ui_guidelines"
+data-sortorder="-timestamp" data-cardsizes="6x3" data-maxresults="6">
+</div>
diff --git a/docs/html/design/design_toc.cs b/docs/html/design/design_toc.cs
index 52c7c52..2cbdacd 100644
--- a/docs/html/design/design_toc.cs
+++ b/docs/html/design/design_toc.cs
@@ -23,6 +23,7 @@
<li><a href="<?cs var:toroot ?>design/wear/creative-vision.html">Creative Vision</a></li>
<li><a href="<?cs var:toroot ?>design/wear/principles.html">Design Principles</a></li>
<li><a href="<?cs var:toroot ?>design/wear/structure.html">App Structure</a></li>
+ <li><a href="<?cs var:toroot ?>design/wear/context.html">Context Awareness</a></li>
<li><a href="<?cs var:toroot ?>design/wear/patterns.html">UI Patterns</a></li>
<li><a href="<?cs var:toroot ?>design/wear/style.html">Style</a></li>
</ul>
@@ -51,7 +52,7 @@
<li><a href="<?cs var:toroot ?>design/style/color.html">Color</a></li>
<li><a href="<?cs var:toroot ?>design/style/iconography.html">Iconography</a></li>
<li><a href="<?cs var:toroot ?>design/style/branding.html">Your Branding</a></li>
- <li><a href="<?cs var:toroot ?>design/style/writing.html">Writing Style</a></li>
+ <li><a href="<?cs var:toroot ?>design/style/writing.html" zh-cn-lang="写作风格">Writing Style</a></li>
</ul>
</li>
diff --git a/docs/html/design/media/wear/ContextualExample.005.png b/docs/html/design/media/wear/ContextualExample.005.png
new file mode 100644
index 0000000..a01d941
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.005.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.005_2x.png b/docs/html/design/media/wear/ContextualExample.005_2x.png
new file mode 100644
index 0000000..caea8f3
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.005_2x.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.006.png b/docs/html/design/media/wear/ContextualExample.006.png
new file mode 100644
index 0000000..e680afb
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.006.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.006_2x.png b/docs/html/design/media/wear/ContextualExample.006_2x.png
new file mode 100644
index 0000000..ee4087e
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.006_2x.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.007.png b/docs/html/design/media/wear/ContextualExample.007.png
new file mode 100644
index 0000000..9d79e41
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.007.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.007_2x.png b/docs/html/design/media/wear/ContextualExample.007_2x.png
new file mode 100644
index 0000000..06e425b
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.007_2x.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.008.png b/docs/html/design/media/wear/ContextualExample.008.png
new file mode 100644
index 0000000..331d77e
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.008.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.008_2x.png b/docs/html/design/media/wear/ContextualExample.008_2x.png
new file mode 100644
index 0000000..a6854e8
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.008_2x.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.009.png b/docs/html/design/media/wear/ContextualExample.009.png
new file mode 100644
index 0000000..67c80ad
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.009.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.009_2x.png b/docs/html/design/media/wear/ContextualExample.009_2x.png
new file mode 100644
index 0000000..ca5248d
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.009_2x.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.010.png b/docs/html/design/media/wear/ContextualExample.010.png
new file mode 100644
index 0000000..e9c6ed8
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.010.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.010_2x.png b/docs/html/design/media/wear/ContextualExample.010_2x.png
new file mode 100644
index 0000000..ddae792
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.010_2x.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.011.png b/docs/html/design/media/wear/ContextualExample.011.png
new file mode 100644
index 0000000..ddafd65
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.011.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.011_2x.png b/docs/html/design/media/wear/ContextualExample.011_2x.png
new file mode 100644
index 0000000..46934e4
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.011_2x.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.012.png b/docs/html/design/media/wear/ContextualExample.012.png
new file mode 100644
index 0000000..05c72d3
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.012.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.012_2x.png b/docs/html/design/media/wear/ContextualExample.012_2x.png
new file mode 100644
index 0000000..c86bda5
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.012_2x.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.013.png b/docs/html/design/media/wear/ContextualExample.013.png
new file mode 100644
index 0000000..0c8d3da
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.013.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.013_2x.png b/docs/html/design/media/wear/ContextualExample.013_2x.png
new file mode 100644
index 0000000..efbbf87
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.013_2x.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.014.png b/docs/html/design/media/wear/ContextualExample.014.png
new file mode 100644
index 0000000..b8d87e8
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.014.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.014_2x.png b/docs/html/design/media/wear/ContextualExample.014_2x.png
new file mode 100644
index 0000000..a89199f
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.014_2x.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.015.png b/docs/html/design/media/wear/ContextualExample.015.png
new file mode 100644
index 0000000..aa00b1f
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.015.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.015_2x.png b/docs/html/design/media/wear/ContextualExample.015_2x.png
new file mode 100644
index 0000000..7e6421c
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.015_2x.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.016.png b/docs/html/design/media/wear/ContextualExample.016.png
new file mode 100644
index 0000000..8d50799
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.016.png
Binary files differ
diff --git a/docs/html/design/media/wear/ContextualExample.016_2x.png b/docs/html/design/media/wear/ContextualExample.016_2x.png
new file mode 100644
index 0000000..e67cdee
--- /dev/null
+++ b/docs/html/design/media/wear/ContextualExample.016_2x.png
Binary files differ
diff --git a/docs/html/design/wear/context.jd b/docs/html/design/wear/context.jd
new file mode 100644
index 0000000..688806f
--- /dev/null
+++ b/docs/html/design/wear/context.jd
@@ -0,0 +1,152 @@
+page.title=Context Awareness on Android Wear
+@jd:body
+
+<style>
+div.slide-wrapper {
+ width:780px;
+ overflow:visible;
+}
+div.slide {
+ width:370px;
+ float:left;
+ margin:0 20px 0 0;
+}
+div.slide p {
+ height:40px;
+}
+div.slide img {
+ height: 208px;
+}
+</style>
+
+
+<p>Some of the most powerful user experiences with Android Wear are based on context-aware
+notifications and actions. By using device sensors and other contextual cues, your app can reveal
+information and functionality precisely when the user needs it, at a glance.</p>
+
+<p>For example, if you’re building a social app for restaurants, you can recommend popular menu
+items when your app recognizes that the user is at a restaurant. More examples below provide basic
+ideas about what you can do with a notification and action confirmation in your Android Wear
+app.</p>
+
+
+<div class="slide-wrapper">
+
+<div class="slide">
+<h2>Pinterest</h2>
+<p>Displays a notification when one of your geo-tagged pins is within walking distance.</p>
+<img src="{@docRoot}design/media/wear/ContextualExample.005.png" alt=""
+ srcset="{@docRoot}design/media/wear/ContextualExample.005.png 1x,
+ {@docRoot}design/media/wear/ContextualExample.005_2x.png 2x" />
+</div>
+
+<div class="slide">
+<h2>Trulia</h2>
+<p>Displays property details and contact options when you are near a new home.</p>
+<img src="{@docRoot}design/media/wear/ContextualExample.006.png" alt=""
+ srcset="{@docRoot}design/media/wear/ContextualExample.006.png 1x,
+ {@docRoot}design/media/wear/ContextualExample.006_2x.png 2x" />
+</div>
+
+
+
+<div class="slide">
+<h2>Ski Conditions</h2>
+<p>Displays lift status and slope conditions when you arrive at a ski resort.</p>
+<img src="{@docRoot}design/media/wear/ContextualExample.008.png" alt=""
+ srcset="{@docRoot}design/media/wear/ContextualExample.008.png 1x,
+ {@docRoot}design/media/wear/ContextualExample.008_2x.png 2x" />
+</div>
+
+<div class="slide">
+<h2>Thermostat</h2>
+<p>Controls automatically appear when you are at home.
+</p>
+<img src="{@docRoot}design/media/wear/ContextualExample.007.png" alt=""
+ srcset="{@docRoot}design/media/wear/ContextualExample.007.png 1x,
+ {@docRoot}design/media/wear/ContextualExample.007_2x.png 2x" />
+</div>
+
+
+
+<div class="slide">
+<h2>Airport</h2>
+<p>Displays air miles while you are waiting at the gate.
+</p>
+<img src="{@docRoot}design/media/wear/ContextualExample.009.png" alt=""
+ srcset="{@docRoot}design/media/wear/ContextualExample.009.png 1x,
+ {@docRoot}design/media/wear/ContextualExample.009_2x.png 2x" />
+</div>
+
+<div class="slide">
+<h2>Hotel</h2>
+<p>Displays late check out option on the morning of your departure.
+</p>
+<img src="{@docRoot}design/media/wear/ContextualExample.010.png" alt=""
+ srcset="{@docRoot}design/media/wear/ContextualExample.010.png 1x,
+ {@docRoot}design/media/wear/ContextualExample.010_2x.png 2x" />
+</div>
+
+
+
+<div class="slide">
+<h2>Conference</h2>
+<p>Shows which of your friends are also attending the conference.
+</p>
+<img src="{@docRoot}design/media/wear/ContextualExample.011.png" alt=""
+ srcset="{@docRoot}design/media/wear/ContextualExample.011.png 1x,
+ {@docRoot}design/media/wear/ContextualExample.011_2x.png 2x" />
+</div>
+
+<div class="slide">
+<h2>Restaurant</h2>
+<p>Provides suggestions for the healthiest items on the menu when in a restaurant.
+</p>
+<img src="{@docRoot}design/media/wear/ContextualExample.012.png" alt=""
+ srcset="{@docRoot}design/media/wear/ContextualExample.012.png 1x,
+ {@docRoot}design/media/wear/ContextualExample.012_2x.png 2x" />
+</div>
+
+
+
+<div class="slide">
+<h2>Oil Change</h2>
+<p>Offers to set a reminder to change the oil again in six months while waiting at the garage.
+</p>
+<img src="{@docRoot}design/media/wear/ContextualExample.013.png" alt=""
+ srcset="{@docRoot}design/media/wear/ContextualExample.013.png 1x,
+ {@docRoot}design/media/wear/ContextualExample.013_2x.png 2x" />
+</div>
+
+<div class="slide">
+<h2>Car Sharing</h2>
+<p>Unlocks the car as you approach it.
+</p>
+<img src="{@docRoot}design/media/wear/ContextualExample.016.png" alt=""
+ srcset="{@docRoot}design/media/wear/ContextualExample.016.png 1x,
+ {@docRoot}design/media/wear/ContextualExample.016_2x.png 2x" />
+</div>
+
+
+
+<div class="slide">
+<h2>Zoo</h2>
+<p>Notifies visitors when the penguins are going to be fed.
+</p>
+<img src="{@docRoot}design/media/wear/ContextualExample.014.png" alt=""
+ srcset="{@docRoot}design/media/wear/ContextualExample.014.png 1x,
+ {@docRoot}design/media/wear/ContextualExample.014_2x.png 2x" />
+</div>
+
+<div class="slide">
+<h2>Location-based Query</h2>
+<p>Ask things like, "Are there any picnic tables free at the park?" and get answers from
+people who are there.</p>
+<img src="{@docRoot}design/media/wear/ContextualExample.015.png" alt=""
+ srcset="{@docRoot}design/media/wear/ContextualExample.015.png 1x,
+ {@docRoot}design/media/wear/ContextualExample.015_2x.png 2x" />
+</div>
+
+
+
+</div>
\ No newline at end of file
diff --git a/docs/html/distribute/essentials/essentials_toc.cs b/docs/html/distribute/essentials/essentials_toc.cs
index a1c9575..0369d4d 100644
--- a/docs/html/distribute/essentials/essentials_toc.cs
+++ b/docs/html/distribute/essentials/essentials_toc.cs
@@ -1,11 +1,11 @@
<ul id="nav">
<li class="nav-section">
- <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/essentials/quality/core.html">
+ <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/essentials/quality/core.html" zh-cn-lang="应用的核心质量">
<span class="en">Core App Quality</span></a>
</div>
</li>
<li class="nav-section">
- <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/essentials/quality/tablets.html">
+ <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/essentials/quality/tablets.html" zh-cn-lang="平板电脑应用的质量">
<span class="en">Tablet App Quality</span>
</a>
</div>
@@ -22,6 +22,12 @@
</a>
</div>
</li>
+ <li class="nav-section">
+ <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/essentials/quality/auto.html">
+ <span class="en">Auto App Quality</span>
+ </a>
+ </div>
+ </li>
<li class="nav-section">
<div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/essentials/optimizing-your-app.html">
<span class="en">Optimize Your App</span>
diff --git a/docs/html/distribute/essentials/quality/auto.jd b/docs/html/distribute/essentials/quality/auto.jd
new file mode 100644
index 0000000..757305e
--- /dev/null
+++ b/docs/html/distribute/essentials/quality/auto.jd
@@ -0,0 +1,411 @@
+
+page.title=Auto App Quality
+page.metaDescription=Auto apps integrate with the vehicle's input controls and display and minimize driver distraction to create a great experience.
+page.image=/distribute/images/gp-auto-quality.png
+@jd:body
+
+<div id="qv-wrapper"><div id="qv">
+<h2>Quality Criteria</h2>
+ <ol>
+ <li><a href="#core">Core App Quality</a></li>
+ <li><a href="#ux">Visual Design and Interaction</a></li>
+ <li><a href="#fn">Functionality</a></li>
+ <li><a href="#faq">Frequently Asked Questions</a></li>
+ </ol>
+
+ <h2>You Should Also Read</h2>
+ <ol>
+ <li><a href="{@docRoot}distribute/essentials/quality/core.html">
+ Core App Quality</a></li>
+ <li><a href="{@docRoot}distribute/essentials/optimizing-your-app.html">
+ Optimize Your App</a></li>
+ <li><a href="{@docRoot}shareables/auto/AndroidAuto-media-apps.pdf">Android Auto UX Guidelines
+ for Media Applications</a></li>
+ <li><a href="{@docRoot}shareables/auto/AndroidAuto-messaging-apps.pdf">Android Auto UX Guidelines
+ for Messaging Applications</a></li>
+ </ol>
+</div>
+</div>
+
+
+ <img src="{@docRoot}distribute/images/gp-auto-quality.png" style="width:480px;">
+
+
+<p>When designing support for Android Auto in your app, avoid driver distraction above all else.
+ Apps that work with the Auto user interface should minimize distractions faced by the driver
+ through best practices such as voice commands and very simple visual design.
+</p>
+
+<p>
+ Great auto experiences are predictive and predictable. Apps that support Android Auto
+ should show timely information to the driver only when it is relevant, and use
+ simple, predictable patterns for common tasks.
+</p>
+
+<p class="caution">
+ <strong>Important:</strong> The criteria listed in this page apply to your app's user interface
+ and behavior when running on devices connected to an Android Auto screen. Apps must meet these
+ criteria to qualify as an Android Auto app on Google Play.
+</p>
+
+
+<div class="headerLine">
+ <h2 id="core">
+ Core App Quality
+ </h2>
+
+<p>
+ In addition to the Auto-specific criteria listed below, Auto apps should meet all relevant core app
+ quality criteria for the Android platform, as detailed in the
+ <a href="{@docRoot}distribute/essentials/quality/core.html">Core App Quality</a> criteria. Test
+ your app against those criteria to ensure that they meet Android standards for navigation and
+ design. Then test your app against all Auto-specific criteria, keeping in mind
+ that, when running on a device connected to Android auto, your app must meet the requirements
+ listed in this page.
+
+
+
+<div class="headerLine">
+ <h2 id="ux">
+ Visual Design and User Interaction
+ </h2>
+
+</div>
+
+<p>
+ These criteria ensure that your app follows critical design and interaction patterns
+ to ensure a consistent, intuitive, and enjoyable user experience on Android Auto. Many elements,
+ such as the navigation drawer, card backgrounds, fonts and icon colors, are set and rendered by
+ the system. Your own app-specific design elements must meet the following criteria.
+</p>
+
+<table>
+
+<tr>
+ <th style="width:2px;">
+ Type
+ </th>
+ <th style="width:54px;">
+ Test
+ </th>
+ <th>
+ Description
+ </th>
+</tr>
+
+<tr>
+ <td rowspan="4" id="safety">
+ Driver Attention
+ </td>
+
+ <td id="AU-MV">
+ AU-MV
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App does not display on the Auto screen animated elements such as animated graphics, games, video, or
+ progress bars.
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="AU-VA">
+ AU-VA
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App does not display any form of visual or text advertising on the Auto screen. Only audio
+ ads are acceptable.
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="AU-IM">
+ AU-IM
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App elements do not display any images on the Auto screen. Exceptions include: app may display
+ a single static image for
+ content context in the background of the consumption screen, such as album art, and app may
+ display icons in the content navigation drawer.
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="AU-DS">
+ AU-DS
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App does not include any features that distract the driver.
+ </p>
+ </td>
+</tr>
+
+
+
+<tr>
+ <td rowspan="4" id="layout">
+ Layout
+ </td>
+
+<tr>
+ <td id="AU-SC">
+ AU-SC
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App does not display automatically scrolling text.
+ </p>
+ </td>
+</tr>
+
+
+<tr>
+ <td id="AU-FT">
+ AU-FT
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App displays all strings using the default Roboto fonts in two approved sizes.
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="AU-ST">
+ AU-ST
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App does not display any individual string longer than 120 characters.
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="contrast">
+ Visual Contrast
+ </td>
+
+ <td id="AU-NM">
+ AU-NM
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App supports night mode, rendering light text and controls on a dark background.
+ </p>
+ </td>
+</tr>
+
+
+<tr>
+ <td rowspan="2" id="interaction">
+ Interaction
+ </td>
+
+ <td id="AU-VC">
+ AU-VC
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App must support voice commands.
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="AU-AB">
+ AU-AB
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App-specific buttons respond to user actions with no more than a two-second delay.
+ </p>
+ </td>
+</tr>
+
+</table>
+
+
+<h3 class="rel-resources clearfloat">Related resources</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query=
+"collection:distribute/essentials/autoqualityguidelines/visualdesign"
+data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
+</div>
+
+
+
+<div class="headerLine">
+ <h2 id="fn">
+ Functionality
+ </h2>
+
+
+</div>
+
+<p>
+ These criteria ensure that your app is configured correctly and provides expected
+ functional behavior.
+</p>
+
+
+<table>
+<tr>
+ <th style="width:2px;">
+ Type
+ </th>
+ <th style="width:54px;">
+ Test
+ </th>
+ <th>
+ Description
+ </th>
+</tr>
+
+<tr>
+ <td rowspan="2" id="general">
+ General
+ </td>
+
+ <td id="AU-RL">
+ AU-RL
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ When the app is relaunched from the home screen, the app restores the app state as closely as
+ possible to the previous state.
+ </p>
+ </td>
+</tr>
+
+
+</tr>
+ <td id="AU-SS">
+ AU-SS
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ No tasks in the app take more than six steps to complete.
+ </p>
+ </td>
+</tr>
+
+
+<tr>
+ <td rowspan="2" id="media">
+ Media
+ </td>
+
+
+ <td id="AU-PA">
+ AU-PA
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App has no more than four primary actions plus one optional action overflow toggle (or five if
+ no action overflow is used). For more information, see details on the media control card in the
+ <a href="{@docRoot}shareables/auto/AndroidAuto-media-apps.pdf">Android Auto UX Guidelines
+ for Media Applications</a>.
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="AU-SA">
+ AU-SA
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App has no more than four optional secondary actions plus one action overflow toggle. For more
+ information, see details on the media control card in the
+ <a href="{@docRoot}shareables/auto/AndroidAuto-media-apps.pdf">Android Auto UX Guidelines
+ for Media Applications</a>.
+ </p>
+ </td>
+</tr>
+
+
+<tr>
+ <td rowspan="2" id="notifications">
+ Notifications
+ </td>
+
+ <td id="AU-NA">
+ AU-NA
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App does not present advertisements through notifications.
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="AU-NT">
+ AU-NT
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App displays notifications only when relevant to the driver’s needs.
+ </p>
+ <p>
+ Examples:<br />
+ Good: Notifying the user that a new message has arrived.<br />
+ Bad: Notifying the user about a new album release.
+ </p>
+ </td>
+</tr>
+
+</table>
+
+<!--
+<h3 class="rel-resources clearfloat">Related resources</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query=
+"collection:distribute/essentials/autoqualityguidelines/functionality"
+data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
+</div>
+-->
+
+<div class="headerLine">
+ <h2 id="faq">
+ Frequently Asked Questions
+ </h2>
+</div>
+
+<p style="margin-top:30px;">
+ <strong>After I submit my app, how will find out if my app does not meet all
+ the requirements for Android Auto?</strong>
+</p>
+<p>If you are planning to develop apps for Auto, you are encouraged to begin enabling and testing
+ your apps now. However, Auto-enabled apps cannot be published at this time. Join the
+ <a href="http://g.co/AndroidAutoDev" class="external-link">Auto
+ Developers Google+ community</a> for updates on when you will be able to submit
+ your Auto-enabled apps.</p>
+</p>
+
+
+<p style="margin-top:30px;">
+ <strong>My app targets more than just Android Auto. If my app does not meet the Auto
+ requirements, will my new or updated app still appear on Google Play for phones and
+ tablets?</strong>
+</p>
+<p>
+ No. When Google begins the approval process, your auto app will undergo a driver safety
+ review, and will not be
+ available for distribution until the app is approved. Because this is the same APK as
+ for phones and tablets, your Play Store updates for those devices will not be available until the
+ Auto approval process is complete.
+</p>
+
+<p class="caution">
+ <strong>Important:</strong> Due to this restriction, you should not use your production APK
+ for Auto support prototyping.
+</p>
+
diff --git a/docs/html/distribute/images/gp-auto-quality.png b/docs/html/distribute/images/gp-auto-quality.png
new file mode 100644
index 0000000..d322849
--- /dev/null
+++ b/docs/html/distribute/images/gp-auto-quality.png
Binary files differ
diff --git a/docs/html/distribute/tools/disttools_toc.cs b/docs/html/distribute/tools/disttools_toc.cs
index f4f39f0..758a297 100644
--- a/docs/html/distribute/tools/disttools_toc.cs
+++ b/docs/html/distribute/tools/disttools_toc.cs
@@ -1,32 +1,32 @@
<ul id="nav">
<li class="nav-section">
- <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/tools/launch-checklist.html">
+ <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/tools/launch-checklist.html" zh-cn-lang="发布检查清单">
<span class="en">Launch Checklist</span></a>
</div>
</li>
<li class="nav-section">
- <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/tools/localization-checklist.html">
+ <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/tools/localization-checklist.html" zh-cn-lang="本地化检查清单">
<span class="en">Localization Checklist</span></a>
</div>
</li>
<li class="nav-section">
- <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/tools/promote/device-art.html">
+ <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/tools/promote/device-art.html" zh-cn-lang="Device Art Generator">
<span class="en">Device Art Generator</span></a>
</div>
</li>
<li class="nav-section">
- <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/tools/promote/badges.html">
+ <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/tools/promote/badges.html" zh-cn-lang="Google Play 徽章生成器">
<span class="en">Google Play Badges</span></a>
</div>
</li>
<li class="nav-section">
- <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/tools/promote/linking.html">
+ <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/tools/promote/linking.html" zh-cn-lang="链接到您的商品">
<span class="en">Linking to Your Products</span></a>
</div>
</li>
<li class="nav-section">
- <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/tools/promote/brand.html">
+ <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/tools/promote/brand.html" zh-cn-lang="品牌指南">
<span class="en">Brand Guidelines</span></a>
</div>
</li>
diff --git a/docs/html/google/gcm/ccs.jd b/docs/html/google/gcm/ccs.jd
index 7db7a74..6332b8d 100644
--- a/docs/html/google/gcm/ccs.jd
+++ b/docs/html/google/gcm/ccs.jd
@@ -263,6 +263,21 @@
</message>
</pre>
+<p>Device Message Rate Exceeded:</p>
+
+<pre><message id="...">
+ <gcm xmlns="google:mobile:data">
+ {
+ "message_type":"nack",
+ "message_id":"msgId1",
+ "from":"REGID",
+ "error":"DEVICE_MESSAGE_RATE_EXCEEDED",
+ "error_description":"Downstream message rate exceeded for this registration id"
+ }
+ </gcm>
+</message>
+</pre>
+
<p>The following table lists NACK error codes. Unless otherwise
indicated, a NACKed message should not be retried. Unexpected NACK error codes
should be treated the same as {@code INTERNAL_SERVER_ERROR}.</p>
@@ -303,8 +318,7 @@
<td>{@code DEVICE_MESSAGE_RATE_EXCEEDED}</td>
<td>The rate of messages to a particular device is too high. You should reduce
the number of messages sent to this device and should not immediately retry
-sending to this device. This error code replaces {@code QUOTA_EXCEEDED},
-which has been deprecated.</td>
+sending to this device. This error code is replacing {@code QUOTA_EXCEEDED}.</td>
</tr>
<tr>
<td>{@code SERVICE_UNAVAILABLE}</td>
diff --git a/docs/html/google/gcm/client.jd b/docs/html/google/gcm/client.jd
index 70109c6..d44ee3c 100644
--- a/docs/html/google/gcm/client.jd
+++ b/docs/html/google/gcm/client.jd
@@ -452,6 +452,21 @@
editor.commit();
}</pre>
+<h4 id="reg-errors">Handle registration errors</h4>
+
+<p>As stated above, an Android app must register with GCM servers and get a registration ID
+(regID) before it can receive messages. A given regID is not guaranteed to last indefinitely,
+so the first thing your app should always do is check to make sure it has a valid regID
+(as shown in the code snippets above).</p>
+
+<p>In addition to confirming that it has a valid regID, your app should be prepared to handle
+the registration error {@code TOO_MANY_REGISTRATIONS}. This error indicates that the device
+has too many apps registered with GCM. The error only occurs in cases where there are
+extreme numbers of apps, so it should not affect the average user. The remedy is to prompt
+the user to delete some of the other GCM-enabled apps from the device to make
+room for the new one.</p>
+
+
<h3 id="sample-send">Send a message</h3>
<p>When the user clicks the app's <strong>Send</strong> button, the app sends an
upstream message using the
diff --git a/docs/html/google/google_toc.cs b/docs/html/google/google_toc.cs
index 7cce86b..0c48a0a 100644
--- a/docs/html/google/google_toc.cs
+++ b/docs/html/google/google_toc.cs
@@ -99,14 +99,14 @@
<li class="nav-section">
- <div class="nav-section-header"><a href="<?cs var:toroot ?>google/play/billing/index.html">
+ <div class="nav-section-header"><a href="<?cs var:toroot ?>google/play/billing/index.html" zh-cn-lang="应用内结算">
<span class="en">Google Play In-app Billing</span></a>
</div>
<ul>
- <li><a href="<?cs var:toroot?>google/play/billing/billing_overview.html">
+ <li><a href="<?cs var:toroot?>google/play/billing/billing_overview.html" zh-cn-lang="应用内结算概述">
<span class="en">Overview</span></a>
</li>
- <li class="nav-section"><div class="nav-section-header"><a href="<?cs var:toroot?>google/play/billing/api.html">
+ <li class="nav-section"><div class="nav-section-header"><a href="<?cs var:toroot?>google/play/billing/api.html" zh-cn-lang="应用内结算 API">
<span class="en">Version 3 API</span></a></div>
<ul>
<li><a href="<?cs var:toroot?>google/play/billing/billing_integrate.html">
@@ -129,13 +129,13 @@
<li><a href="<?cs var:toroot?>google/play/billing/billing_subscriptions.html">
<span class="en">Subscriptions</span></a>
</li>
- <li><a href="<?cs var:toroot?>google/play/billing/billing_best_practices.html">
+ <li><a href="<?cs var:toroot?>google/play/billing/billing_best_practices.html" zh-cn-lang="安全性和设计">
<span class="en">Security and Design</span></a>
</li>
- <li><a href="<?cs var:toroot?>google/play/billing/billing_testing.html">
+ <li><a href="<?cs var:toroot?>google/play/billing/billing_testing.html" zh-cn-lang="测试应用内结算">
<span class="en">Testing In-app Billing</span></a>
</li>
- <li><a href="<?cs var:toroot?>google/play/billing/billing_admin.html">
+ <li><a href="<?cs var:toroot?>google/play/billing/billing_admin.html" zh-cn-lang="管理应用内结算">
<span class="en">Administering In-app Billing</span></a>
</li>
<li><a href="<?cs var:toroot?>google/play/billing/versions.html">
diff --git a/docs/html/google/play-services/setup.jd b/docs/html/google/play-services/setup.jd
index 180730d..d886454 100644
--- a/docs/html/google/play-services/setup.jd
+++ b/docs/html/google/play-services/setup.jd
@@ -60,7 +60,8 @@
<a href="{@docRoot}sdk/installing/studio-build.html">Building Your Project with
Gradle</a> for more information about Gradle.</p></li>
<li>Add a new build rule under <code>dependencies</code> for the latest version of
-<code>play-services</code>. For example:
+ <code>play-services</code>.
+ <p>For example, for mobile modules:</p>
<pre class="no-pretty-print">
apply plugin: 'android'
...
@@ -70,7 +71,16 @@
<strong>compile 'com.google.android.gms:play-services:6.1.+'</strong>
}
</pre>
-<p>Be sure you update this version number each time Google Play services is updated.</p>
+ <p>For wearable modules:</p>
+<pre class="no-pretty-print">
+apply plugin: 'android'
+...
+
+dependencies {
+ <strong>compile 'com.google.android.gms:play-services-wearable:6.1.+'</strong>
+}
+</pre>
+ <p>Be sure you update this version number each time Google Play services is updated.</p>
</li>
<li>Save the changes and click <strong>Sync Project with Gradle Files</strong>
<img src="{@docRoot}images/tools/sync-project.png" style="vertical-align:bottom;margin:0;height:19px" />
diff --git a/docs/html/guide/components/intents-common.jd b/docs/html/guide/components/intents-common.jd
index d4b033a..adba1cd 100644
--- a/docs/html/guide/components/intents-common.jd
+++ b/docs/html/guide/components/intents-common.jd
@@ -2282,6 +2282,14 @@
<li>"search for cat videos on myvideoapp"</li>
</ul>
</div>
+<!-- Video box -->
+<a class="notice-developers-video"
+ href="https://www.youtube.com/watch?v=PS1FbB5qWEI">
+<div>
+ <h3>Video</h3>
+ <p>Voice search in your app</p>
+</div>
+</a>
<p>To support search within the context of your app, declare an intent filter in your app with
the <code>SEARCH_ACTION</code> action, as shown in the example intent filter below.</p>
diff --git a/docs/html/guide/components/intents-filters.jd b/docs/html/guide/components/intents-filters.jd
index 2f8c407..3dec216 100644
--- a/docs/html/guide/components/intents-filters.jd
+++ b/docs/html/guide/components/intents-filters.jd
@@ -139,7 +139,9 @@
intent when starting a {@link android.app.Service} and do not
declare intent filters for your services. Using an implicit intent to start a service is a
security hazard because you cannot be certain what service will respond to the intent,
-and the user cannot see which service starts.</p>
+and the user cannot see which service starts. Beginning with Android 5.0 (API level 21), the system
+throws an exception if you call {@link android.content.Context#bindService bindService()}
+with an implicit intent.</p>
@@ -424,18 +426,18 @@
android.app.Activity#startActivity startActivity()}. For example:</p>
<pre>
-Intent intent = new Intent(Intent.ACTION_SEND);
+Intent sendIntent = new Intent(Intent.ACTION_SEND);
...
// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
-// Create intent to show chooser
-Intent chooser = Intent.createChooser(intent, title);
+// Create intent to show the chooser dialog
+Intent chooser = Intent.createChooser(sendIntent, title);
-// Verify the intent will resolve to at least one activity
+// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
- startActivity(sendIntent);
+ startActivity(chooser);
}
</pre>
diff --git a/docs/html/guide/topics/graphics/hardware-accel.jd b/docs/html/guide/topics/graphics/hardware-accel.jd
index 7c957b8..3d1935a 100644
--- a/docs/html/guide/topics/graphics/hardware-accel.jd
+++ b/docs/html/guide/topics/graphics/hardware-accel.jd
@@ -327,6 +327,30 @@
<td class="value_pos">18</td>
</tr>
<tr>
+ <td class="label_pos">drawArc()</td>
+ <td class="value_pos">21</td>
+ </tr>
+ <tr>
+ <td class="label_pos">drawRoundRect()</td>
+ <td class="value_pos">21</td>
+ </tr>
+ <tr>
+ <td class="label_pos">saveLayer() with RectF dimensions</td>
+ <td class="value_pos">21</td>
+ </tr>
+ <tr>
+ <td class="label_pos">saveLayer() with float dimensions</td>
+ <td class="value_pos">21</td>
+ </tr>
+ <tr>
+ <td class="label_pos">saveLayerAlpha() with RectF dimensions</td>
+ <td class="value_pos">21</td>
+ </tr>
+ <tr>
+ <td class="label_pos">saveLayerAlpha() with float dimensions</td>
+ <td class="value_pos">21</td>
+ </tr>
+ <tr>
<td colspan="5" class="s5">Paint</td>
</tr>
<tr>
@@ -374,6 +398,26 @@
<td class="value_neg">✗</td>
</tr>
<tr>
+ <td class="label_pos">getFontFeatureSettings()</td>
+ <td class="value_pos">21</td>
+ </tr>
+ <tr>
+ <td class="label_pos">isElegantTextHeight()</td>
+ <td class="value_pos">21</td>
+ </tr>
+ <tr>
+ <td class="label_pos">isElegantTextHeight()</td>
+ <td class="value_pos">21</td>
+ </tr>
+ <tr>
+ <td class="label_pos">setFontFeatureSettings()</td>
+ <td class="value_pos">21</td>
+ </tr>
+ <tr>
+ <td class="label_pos">setLetterSpacing()</td>
+ <td class="value_pos">21</td>
+ </tr>
+ <tr>
<td colspan="5" class="s5">Xfermode</td>
</tr>
<tr>
diff --git a/docs/html/guide/topics/resources/string-resource.jd b/docs/html/guide/topics/resources/string-resource.jd
index e2326ec..cbfa82e 100644
--- a/docs/html/guide/topics/resources/string-resource.jd
+++ b/docs/html/guide/topics/resources/string-resource.jd
@@ -237,7 +237,8 @@
<p>The selection of which string to use is made solely based on grammatical <i>necessity</i>.
In English, a string for <code>zero</code> will be ignored even if the quantity is 0, because 0
isn't grammatically different from 2, or any other number except 1 ("zero books", "one book",
-"two books", and so on).
+"two books", and so on). Conversely, in Korean <i>only</i> the <code>other</code> string will
+ever be used.
<p>Don't be misled either by the fact that, say, <code>two</code> sounds like it could only apply to
the quantity 2: a language may require that 2, 12, 102 (and so on) are all treated like one
@@ -343,7 +344,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="numberOfSongsAvailable">
- <item quantity="one">One song found.</item>
+ <!--
+ As a developer, you should always supply "one" and "other"
+ strings. Your translators will know which strings are actually
+ needed for their language. Always include %d in "one" because
+ translators will need to use %d for languages where "one"
+ doesn't mean 1 (as explained above).
+ -->
+ <item quantity="one">%d song found.</item>
<item quantity="other">%d songs found.</item>
</plurals>
</resources>
@@ -353,7 +361,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="numberOfSongsAvailable">
- <item quantity="one">Znaleziono jedną piosenkę.</item>
+ <item quantity="one">Znaleziono %d piosenkę.</item>
<item quantity="few">Znaleziono %d piosenki.</item>
<item quantity="other">Znaleziono %d piosenek.</item>
</plurals>
@@ -597,4 +605,4 @@
// and bold the entire sequence.
CharSequence text = bold(italic(res.getString(R.string.hello)),
color(Color.RED, res.getString(R.string.world)));
-</pre>
\ No newline at end of file
+</pre>
diff --git a/docs/html/images/studio-avdmgr-configavd.png b/docs/html/images/studio-avdmgr-configavd.png
new file mode 100644
index 0000000..9b54896
--- /dev/null
+++ b/docs/html/images/studio-avdmgr-configavd.png
Binary files differ
diff --git a/docs/html/images/studio-avdmgr-confighardwareprof.png b/docs/html/images/studio-avdmgr-confighardwareprof.png
new file mode 100644
index 0000000..2bf1783
--- /dev/null
+++ b/docs/html/images/studio-avdmgr-confighardwareprof.png
Binary files differ
diff --git a/docs/html/images/studio-avdmgr-firstscreen.png b/docs/html/images/studio-avdmgr-firstscreen.png
new file mode 100644
index 0000000..5da5c6c
--- /dev/null
+++ b/docs/html/images/studio-avdmgr-firstscreen.png
Binary files differ
diff --git a/docs/html/images/studio-avdmgr-selecthdwr.png b/docs/html/images/studio-avdmgr-selecthdwr.png
new file mode 100644
index 0000000..015833a
--- /dev/null
+++ b/docs/html/images/studio-avdmgr-selecthdwr.png
Binary files differ
diff --git a/docs/html/images/studio-avdmgr-systemimage.png b/docs/html/images/studio-avdmgr-systemimage.png
new file mode 100644
index 0000000..3b0663f
--- /dev/null
+++ b/docs/html/images/studio-avdmgr-systemimage.png
Binary files differ
diff --git a/docs/html/images/studio-avdmgr-yrvirtualdevices-new.png b/docs/html/images/studio-avdmgr-yrvirtualdevices-new.png
new file mode 100644
index 0000000..798c77d
--- /dev/null
+++ b/docs/html/images/studio-avdmgr-yrvirtualdevices-new.png
Binary files differ
diff --git a/docs/html/images/studio-avdmgr-yrvirtualdevices.png b/docs/html/images/studio-avdmgr-yrvirtualdevices.png
new file mode 100644
index 0000000..77a44a4
--- /dev/null
+++ b/docs/html/images/studio-avdmgr-yrvirtualdevices.png
Binary files differ
diff --git a/docs/html/images/studio-memory-monitor.png b/docs/html/images/studio-memory-monitor.png
new file mode 100644
index 0000000..796daf0
--- /dev/null
+++ b/docs/html/images/studio-memory-monitor.png
Binary files differ
diff --git a/docs/html/images/tools/studio-advmgr-action-icon.png b/docs/html/images/tools/studio-advmgr-action-icon.png
new file mode 100644
index 0000000..5dfa1a9
--- /dev/null
+++ b/docs/html/images/tools/studio-advmgr-action-icon.png
Binary files differ
diff --git a/docs/html/images/tools/studio-advmgr-actions-dropdown-icon.png b/docs/html/images/tools/studio-advmgr-actions-dropdown-icon.png
new file mode 100644
index 0000000..9dbb07a
--- /dev/null
+++ b/docs/html/images/tools/studio-advmgr-actions-dropdown-icon.png
Binary files differ
diff --git a/docs/html/images/tools/studio-advmgr-actions-edit-icon.png b/docs/html/images/tools/studio-advmgr-actions-edit-icon.png
new file mode 100644
index 0000000..ea85dd5
--- /dev/null
+++ b/docs/html/images/tools/studio-advmgr-actions-edit-icon.png
Binary files differ
diff --git a/docs/html/images/ui/studio-avdmgr-icon.png b/docs/html/images/ui/studio-avdmgr-icon.png
new file mode 100644
index 0000000..c90b73e
--- /dev/null
+++ b/docs/html/images/ui/studio-avdmgr-icon.png
Binary files differ
diff --git a/docs/html/jd_collections.js b/docs/html/jd_collections.js
index a38b80b..f483e31 100644
--- a/docs/html/jd_collections.js
+++ b/docs/html/jd_collections.js
@@ -7,6 +7,14 @@
"sdk/installing/studio.html"
]
},
+ "index/primary/zhcn": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/resources.html",
+ "intl/zh-cn/distribute/tools/launch-checklist.html",
+ "intl/zh-cn/distribute/tools/localization-checklist.html"
+ ]
+ },
"distribute/edu/videos/stories": {
"title": "",
"resources": [
@@ -68,6 +76,16 @@
"distribute/essentials/quality/tablets.html",
"distribute/essentials/quality/tv.html",
"distribute/essentials/quality/wear.html",
+ "distribute/essentials/quality/auto.html",
+ "https://developers.google.com/edu/guidelines"
+ ]
+ },
+ "distribute/essentials/zhcn": {
+ "resources": [
+ "intl/zh-cn/distribute/essentials/quality/core.html",
+ "intl/zh-cn/distribute/essentials/quality/tablets.html",
+ "distribute/essentials/quality/tv.html",
+ "distribute/essentials/quality/wear.html",
"https://developers.google.com/edu/guidelines",
"distribute/essentials/optimizing-your-app.html"
]
@@ -114,6 +132,13 @@
"distribute/tools/localization-checklist.html"
]
},
+ "distribute/tools/checklists/zhcn": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/distribute/tools/launch-checklist.html",
+ "intl/zh-cn/distribute/tools/localization-checklist.html"
+ ]
+ },
"distribute/tools/promote": {
"resources": [
"distribute/tools/promote/device-art.html",
@@ -121,6 +146,13 @@
"distribute/tools/promote/linking.html"
]
},
+ "distribute/tools/promote/zhcn": {
+ "resources": [
+ "intl/zh-cn/distribute/tools/promote/device-art.html",
+ "intl/zh-cn/distribute/tools/promote/badges.html",
+ "intl/zh-cn/distribute/tools/promote/linking.html"
+ ]
+ },
"distribute/tools/support": {
"title": "Google Play",
"resources": [
@@ -129,6 +161,14 @@
"support.html"
]
},
+ "distribute/tools/support/zhcn": {
+ "title": "Google Play",
+ "resources": [
+ "https://support.google.com/googleplay/android-developer?hl=zh-Hans",
+ "https://support.google.com/googleplay/android-developer/answer/4430948?hl=zh-Hans",
+ "support.html"
+ ]
+ },
"distribute/tools/news": {
"title": "",
"resources": [
@@ -144,6 +184,14 @@
"about/dashboards/index.html"
]
},
+ "distribute/tools/more/zhcn": {
+ "title": "Google Play",
+ "resources": [
+ "intl/zh-cn/distribute/tools/promote/brand.html",
+ "distribute/tools/open-distribution.html",
+ "about/dashboards/index.html"
+ ]
+ },
"distribute/googleplay": {
"title": "Google Play",
"resources": [
@@ -348,6 +396,13 @@
"training/wearables/notifications/voice-input.html"
]
},
+ "distribute/essentials/autoqualityguidelines/visualdesign": {
+ "title": "",
+ "resources": [
+ "training/auto/messaging/index.html",
+ "training/auto/start/index.html"
+ ]
+ },
"distribute/essentials/core/performance": {
"title": "",
"resources": [
@@ -360,11 +415,22 @@
"title": "",
"resources": [
"distribute/tools/launch-checklist.html",
- "http://play.google.com/about/developer-content-policy.html",
- "https://support.google.com/googleplay/android-developer/answer/188189",
- "https://support.google.com/googleplay/android-developer/answer/1078870",
+ "http://play.google.com/about/developer-content-policy.html?hl=zh-Hans",
+ "https://support.google.com/googleplay/android-developer/answer/188189?hl=zh-Hans",
+ "https://support.google.com/googleplay/android-developer/answer/1078870?hl=zh-Hans",
"http://android-developers.blogspot.com/2011/10/android-market-featured-image.html",
- "https://support.google.com/googleplay/android-developer/answer/113477"
+ "https://support.google.com/googleplay/android-developer/answer/113477?hl=zh-Hans"
+ ]
+ },
+ "distribute/essentials/core/play/zhcn": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/distribute/tools/launch-checklist.html",
+ "http://play.google.com/about/developer-content-policy.html",
+ "https://support.google.com/googleplay/android-developer/answer/188189?hl=zh-Hans",
+ "https://support.google.com/googleplay/android-developer/answer/1078870?hl=zh-Hans",
+ "http://android-developers.blogspot.com/2011/10/android-market-featured-image.html",
+ "https://support.google.com/googleplay/android-developer/answer/113477?hl=zh-Hans"
]
},
"distribute/essentials/tabletguidelines/optimize": {
@@ -441,6 +507,15 @@
"distribute/tools/promote/device-art.html"
]
},
+ "distribute/essentials/tabletguidelines/showcase/zhcn": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/distribute/tools/launch-checklist.html",
+ "https://play.google.com/apps/publish/?hl=zh-Hans",
+ "intl/zh-cn/distribute/tools/promote/badges.html",
+ "intl/zh-cn/distribute/tools/promote/device-art.html"
+ ]
+ },
"distribute/essentials/tabletguidelines/googleplay": {
"title": "",
"resources": [
@@ -576,6 +651,12 @@
"https://support.google.com/googleplay/android-developer/answer/138294"
]
},
+ "distribute/toolsreference/localizationchecklist/identifylocales/zhcn": {
+ "title": "",
+ "resources": [
+ "https://support.google.com/googleplay/android-developer/answer/138294?hl=zh-Hans"
+ ]
+ },
"distribute/tools/loc/designforloc": {
"title": "",
"resources": [
@@ -593,6 +674,14 @@
"http://en.wikipedia.org/wiki/XLIFF"
]
},
+ "distribute/toolsreference/localizationchecklist/managestrings/zhcn": {
+ "title": "",
+ "resources": [
+ "guide/topics/resources/string-resource.html",
+ "intl/zh-cn/design/style/writing.html",
+ "http://en.wikipedia.org/wiki/XLIFF"
+ ]
+ },
"distribute/toolsreference/localizationchecklist/translatestrings": {
"title": "",
"resources": [
@@ -606,12 +695,25 @@
"distribute/tools/promote/device-art.html"
]
},
+ "distribute/toolsreference/localizationchecklist/preplaunch/zhcn": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/distribute/tools/promote/badges.html",
+ "intl/zh-cn/distribute/tools/promote/device-art.html"
+ ]
+ },
"distribute/toolsreference/localizationchecklist/supportlaunch": {
"title": "",
"resources": [
"distribute/tools/launch-checklist.html",
]
},
+ "distribute/toolsreference/localizationchecklist/supportlaunch/zhcn": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/distribute/tools/launch-checklist.html",
+ ]
+ },
"distribute/toolsreference/launchchecklist/understanding": {
"title": "",
"resources": [
@@ -729,6 +831,119 @@
"distribute/essentials/optimizing-your-app.html"
]
},
+
+
+
+ "distribute/toolsreference/launchchecklist/understanding/zhcn": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/tools/publishing/publishing_overview.html",
+ "intl/zh-cn/tools/publishing/preparing.html"
+ ]
+ },
+ "distribute/toolsreference/launchchecklist/policies/zhcn": {
+ "title": "",
+ "resources": [
+ "https://support.google.com/googleplay/android-developer/answer/4430948?hl=zh-Hans",
+ "https://support.google.com/googleplay/android-developer/topic/2364761?hl=zh-Hans",
+ "https://support.google.com/googleplay/android-developer?hl=zh-Hans"
+ ]
+ },
+ "distribute/toolsreference/launchchecklist/quality/zhcn": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/distribute/essentials/quality/core.html",
+ "intl/zh-cn/distribute/essentials/quality/tablets.html",
+ "https://developers.google.com/edu/guidelines?hl=zh-Hans"
+ ]
+ },
+
+ "distribute/toolsreference/launchchecklist/rating/zhcn": {
+ "title": "",
+ "resources": [
+ "https://support.google.com/googleplay/android-developer/answer/188189?hl=zh-Hans",
+ ]
+ },
+ "distribute/toolsreference/launchchecklist/country/zhcn": {
+ "title": "",
+ "resources": [
+ "https://support.google.com/googleplay/android-developer/answer/138294?hl=zh-Hans"
+ ]
+ },
+ "distribute/toolsreference/launchchecklist/size/zhcn": {
+ "title": "",
+ "resources": [
+ "google/play/expansion-files.html",
+ "intl/zh-cn/tools/help/proguard.html"
+ ]
+ },
+ "distribute/toolsreference/launchchecklist/price/zhcn": {
+ "title": "",
+ "resources": [
+ "https://support.google.com/googleplay/android-developer/table/3541286?hl=zh-Hans",
+ ]
+ },
+ "distribute/toolsreference/launchchecklist/purchasemethod/zhcn": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/google/play/billing/index.html",
+ "google/play/billing/billing_subscriptions.html"
+ ]
+ },
+ "distribute/toolsreference/launchchecklist/setprice/zhcn": {
+ "title": "",
+ "resources": [
+ "https://support.google.com/googleplay/android-developer/answer/1169947?hl=zh-Hans",
+ "https://support.google.com/googleplay/android-developer/answer/138412?hl=zh-Hans",
+ "https://support.google.com/googleplay/android-developer/answer/112622?hl=zh-Hans",
+ "https://support.google.com/googleplay/android-developer/answer/138000?hl=zh-Hans"
+ ]
+ },
+ "distribute/toolsreference/launchchecklist/localization/zhcn": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/distribute/tools/localization-checklist.html",
+ "guide/topics/resources/localization.html"
+ ]
+ },
+ "distribute/toolsreference/launchchecklist/graphics/zhcn": {
+ "title": "",
+ "resources": [
+ "https://support.google.com/googleplay/android-developer/answer/1078870?hl=zh-Hans",
+ "http://android-developers.blogspot.com/2011/10/android-market-featured-image.html"
+ ]
+ },
+ "distribute/toolsreference/launchchecklist/productdetails/zhcn": {
+ "title": "",
+ "resources": [
+ "https://support.google.com/googleplay/android-developer/answer/113475?hl=zh-Hans",
+ "https://support.google.com/googleplay/android-developer/answer/1078870?hl=zh-Hans"
+ ]
+ },
+ "distribute/toolsreference/launchchecklist/badges/zhcn": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/distribute/tools/promote/badges.html",
+ "intl/zh-cn/distribute/tools/promote/linking.html"
+ ]
+ },
+ "distribute/toolsreference/launchchecklist/finalchecks/zhcn": {
+ "title": "",
+ "resources": [
+ "http://play.google.com/about/developer-content-policy.html",
+ "https://support.google.com/googleplay/android-developer/answer/113476?hl=zh-Hans",
+ "support.html"
+ ]
+ },
+ "distribute/toolsreference/launchchecklist/afterlaunch/zhcn": {
+ "title": "",
+ "resources": [
+ "https://support.google.com/googleplay/android-developer/answer/113477?hl=zh-Hans",
+ "https://support.google.com/googleplay/android-developer/answer/1153479?hl=zh-Hans",
+ "https://support.google.com/payments/answer/2741495?hl=zh-Hans",
+ "distribute/essentials/optimizing-your-app.html"
+ ]
+ },
"distribute/monetize/premium": {
"title": "",
"resources": [
@@ -787,6 +1002,14 @@
"shareables/distribute/play_dev_guide_secrets_en.pdf"
]
},
+ "design/auto/auto_ui_guidelines": {
+ "title": "",
+ "resources": [
+ "shareables/auto/AndroidAuto-media-apps.pdf",
+ "shareables/auto/AndroidAuto-messaging-apps.pdf",
+ "shareables/auto/AndroidAuto-custom-colors.pdf"
+ ]
+ },
"distribute/stories/games": {
"title": "",
"resources": [
@@ -801,5 +1024,92 @@
"http://storage.googleapis.com/androiddevelopers/shareables/stories/TinyRebel_DoctorWhoLegacy_gpgs.pdf",
"http://storage.googleapis.com/androiddevelopers/shareables/stories/Senri_LeosFortune_gpgs.pdf"
]
+ },
+ "overview/zhcn/1": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/distribute/essentials/quality/core.html",
+ "intl/zh-cn/distribute/essentials/quality/tablets.html",
+ "intl/zh-cn/distribute/tools/launch-checklist.html",
+ "intl/zh-cn/tools/publishing/publishing_overview.html",
+ "intl/zh-cn/distribute/tools/localization-checklist.html"
+ ]
+ },
+ "overview/zhcn/2": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/google/play/billing/index.html",
+ "intl/zh-cn/google/play/billing/api.html",
+ "intl/zh-cn/google/play/billing/billing_admin.html",
+ "intl/zh-cn/google/play/billing/billing_testing.html",
+ "intl/zh-cn/google/play/billing/billing_best_practices.html"
+ ]
+ },
+ "overview/zhcn/3": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/distribute/tools/promote/badges.html",
+
+ "intl/zh-cn/distribute/tools/promote/device-art.html",
+ "intl/zh-cn/distribute/tools/promote/linking.html",
+ "intl/zh-cn/distribute/tools/promote/brand.html",
+ "intl/zh-cn/tools/help/proguard.html"
+ ]
+ },
+ "overview/zhcn/4": {
+ "title": "",
+ "resources": [
+ "intl/zh-cn/design/style/writing.html",
+ "intl/zh-cn/training/basics/fragments/fragment-ui.html",
+ "intl/zh-cn/training/multiscreen/index.html",
+ "intl/zh-cn/training/monitoring-device-state/index.html"
+ ]
+ },
+ "overview/carousel/zhcn": {
+ "title": "",
+ "resources": [
+ "http://www.youtube.com/watch?v=vGV7FHGzpFU",
+ "http://www.youtube.com/watch?v=aqc3ZOTzpdk",
+ "http://www.youtube.com/watch?v=jaNrJ8uyLSc"
+ ]
+ },
+ "overview/1": {
+ "title": "",
+ "resources": [
+ "distribute/essentials/quality/core.html",
+ "distribute/essentials/quality/tablets.html",
+ "distribute/tools/launch-checklist.html",
+ "tools/publishing/publishing_overview.html",
+ "distribute/tools/localization-checklist.html"
+ ]
+ },
+ "overview/2": {
+ "title": "",
+ "resources": [
+ "google/play/billing/index.html",
+ "google/play/billing/api.html",
+ "google/play/billing/billing_admin.html",
+ "google/play/billing/billing_testing.html",
+ "google/play/billing/billing_best_practices.html"
+ ]
+ },
+ "overview/3": {
+ "title": "",
+ "resources": [
+ "distribute/tools/promote/badges.html",
+ "distribute/tools/promote/device-art.html",
+ "distribute/tools/promote/linking.html",
+ "distribute/tools/promote/brand.html",
+ "tools/help/proguard.html"
+ ]
+ },
+ "overview/4": {
+ "title": "",
+ "resources": [
+ "design/style/writing.html",
+ "training/basics/fragments/fragment-ui.html",
+ "training/multiscreen/index.html",
+ "training/monitoring-device-state/index.html"
+ ]
}
-}
+}
\ No newline at end of file
diff --git a/docs/html/jd_extras.js b/docs/html/jd_extras.js
index 36f26e8..05d0f09 100644
--- a/docs/html/jd_extras.js
+++ b/docs/html/jd_extras.js
@@ -121,6 +121,18 @@
"type":"google"
},
{
+ "title": "支持向Google Play用户发布应用的地区",
+ "lang": "zh-cn",
+ "titleFriendly":"",
+ "summary": "支持向Google Play用户发布应用的国家/地区。",
+ "url":"https://support.google.com/googleplay/android-developer/answer/138294?hl=zh-Hans",
+ "group":"",
+ "keywords": [],
+ "tags": [],
+ "image":"images/play_dev.jpg",
+ "type":"google"
+ },
+ {
"title":"Google Play Content Policies",
"titleFriendly":"",
"summary":"Details on policies relating to your developer account and app distribution is governed.",
@@ -156,6 +168,17 @@
"type":"google"
},
{
+ "title":"Google Play应用政策中心",
+ "titleFriendly":"",
+ "summary":"一个方便你了解Google Play政策和指南的中心资源。",
+ "url":"https://support.google.com/googleplay/android-developer/answer/4430948?hl=zh-Hans",
+ "group":"",
+ "keywords": [],
+ "tags": [],
+ "image":"http://storage.googleapis.com/support-kms-prod/SNP_712EA2784949DDF085C46E3BE7B1DC618A09_4389397_en_v0",
+ "type":"google"
+ },
+ {
"title":"Developer Help Center",
"titleFriendly":"",
"summary":"Complete details on getting started, publishing, troubleshooting, and more.",
@@ -167,6 +190,17 @@
"type":"google"
},
{
+ "title":"开发者帮助中心",
+ "titleFriendly":"",
+ "summary":"完整资料帮助开发者新手入手,发布,故障排除,等等",
+ "url":"https://support.google.com/googleplay/android-developer?hl=zh-Hans",
+ "group":"",
+ "keywords": [],
+ "tags": [],
+ "image":"images/play_dev.jpg",
+ "type":"google"
+ },
+ {
"title":"Google for Education",
"titleFriendly":"",
"summary":"Find out more about how Google can support your work with apps and tablets.",
@@ -215,6 +249,7 @@
"type": "blog",
"titleFriendly": ""
},
+
{
"lang": "en",
"group": "",
@@ -268,6 +303,19 @@
"titleFriendly": ""
},
{
+ "lang": "zh-cn",
+ "group": "",
+ "tags": [],
+ "url": "https://support.google.com/googleplay/android-developer/answer/188189?hl=zh-Hans",
+ "timestamp": 1194884220000,
+ "image": "images/play_dev.jpg",
+ "title": "针对Google Play为你的应用内容分级",
+ "summary": "如何为你的应用内容分级。",
+ "keywords": [],
+ "type": "support",
+ "titleFriendly": ""
+ },
+ {
"lang": "en",
"group": "",
"tags": [],
@@ -293,6 +341,19 @@
"type": "support",
"titleFriendly": ""
},
+{
+ "lang": "zh-cn",
+ "group": "",
+ "tags": [],
+ "url": "https://support.google.com/googleplay/android-developer/answer/113477?hl=zh-Hans",
+ "timestamp": 1194884220000,
+ "image": "images/play_dev.jpg",
+ "title": "为用户提供支持",
+ "summary": "为用户提供支持的各种选择。",
+ "keywords": [],
+ "type": "support",
+ "titleFriendly": ""
+ },
{
"lang": "en",
"group": "",
@@ -424,6 +485,19 @@
"titleFriendly": ""
},
{
+ "lang": "zh-cn",
+ "group": "",
+ "tags": [],
+ "url": "https://play.google.com/apps/publish/?hl=zh-Hans",
+ "timestamp": 1194884220000,
+ "image": null,
+ "title": "Google Play 开发者控制台",
+ "summary": "发布应用的开发者控制台",
+ "keywords": [],
+ "type": "guide",
+ "titleFriendly": ""
+ },
+ {
"lang": "en",
"group": "",
"tags": [],
@@ -619,6 +693,19 @@
"titleFriendly": ""
},
{
+ "lang": "zh-cn",
+ "group": "",
+ "tags": [],
+ "url": "https://support.google.com/googleplay/android-developer/topic/2364761?hl=zh-Hans",
+ "timestamp": 1194884220000,
+ "image": "images/play_dev.jpg",
+ "title": "政策和最佳做法",
+ "summary": "内容政策和流程",
+ "keywords": [],
+ "type": "distribute",
+ "titleFriendly": ""
+ },
+ {
"lang": "en",
"group": "",
"tags": [],
@@ -686,6 +773,19 @@
"lang": "en",
"group": "",
"tags": [],
+ "url": "https://support.google.com/googleplay/android-developer/answer/1169947?hl=zh-Hans",
+ "timestamp": 1194884220000,
+ "image": "images/play_dev.jpg",
+ "title": "以多种货币销售应用",
+ "summary": "如何在Google Play为应用定价",
+ "keywords": [],
+ "type": "guide",
+ "titleFriendly": ""
+ },
+ {
+ "lang": "en",
+ "group": "",
+ "tags": [],
"url": "https://support.google.com/googleplay/android-developer/answer/138412",
"timestamp": 1194884220000,
"image": "images/play_dev.jpg",
@@ -695,6 +795,19 @@
"type": "guide",
"titleFriendly": ""
},
+ {
+ "lang": "zh-cn",
+ "group": "",
+ "tags": [],
+ "url": "https://support.google.com/googleplay/android-developer/answer/138412?hl=zh-Hans",
+ "timestamp": 1194884220000,
+ "image": "images/play_dev.jpg",
+ "title": "各国家/地区获许定价范围和货币",
+ "summary": "各国家/地区获许定价范围和货币列表",
+ "keywords": [],
+ "type": "guide",
+ "titleFriendly": ""
+ },
{
"lang": "en",
"group": "",
@@ -709,6 +822,19 @@
"titleFriendly": ""
},
{
+ "lang": "zh-cn",
+ "group": "",
+ "tags": [],
+ "url": "https://support.google.com/googleplay/android-developer/answer/112622?hl=zh-Hans",
+ "timestamp": 1194884220000,
+ "image": "images/play_dev.jpg",
+ "title": "交易费用",
+ "summary": "销售的应用和应用内产品的交易费。",
+ "keywords": [],
+ "type": "guide",
+ "titleFriendly": ""
+ },
+ {
"lang": "en",
"group": "",
"tags": [],
@@ -722,6 +848,19 @@
"titleFriendly": ""
},
{
+ "lang": "zh-cn",
+ "group": "",
+ "tags": [],
+ "url": "https://support.google.com/googleplay/android-developer/answer/138000?hl=zh-Hans",
+ "timestamp": 1194884220000,
+ "image": "images/play_dev.jpg",
+ "title": "税率",
+ "summary": "如何设置不同国家/地区的税率",
+ "keywords": [],
+ "type": "guide",
+ "titleFriendly": ""
+ },
+ {
"lang": "en",
"group": "",
"tags": [],
@@ -748,6 +887,19 @@
"titleFriendly": ""
},
{
+ "lang": "zh-cn",
+ "group": "",
+ "tags": [],
+ "url": "https://support.google.com/googleplay/android-developer/answer/113475?hl=zh-Hans",
+ "timestamp": 1194884220000,
+ "image": "images/play_dev.jpg",
+ "title": "类别",
+ "summary": "应用的类别列表。",
+ "keywords": [],
+ "type": "guide",
+ "titleFriendly": ""
+ },
+ {
"lang": "en",
"group": "",
"tags": [],
@@ -761,6 +913,19 @@
"titleFriendly": ""
},
{
+ "lang": "zh-cn",
+ "group": "",
+ "tags": [],
+ "url": "https://support.google.com/googleplay/android-developer/answer/113476?hl=zh-Hans",
+ "timestamp": 1194884220000,
+ "image": "images/play_dev.jpg",
+ "title": "更新应用",
+ "summary": "更新Google Play应用的要求。",
+ "keywords": [],
+ "type": "guide",
+ "titleFriendly": ""
+ },
+ {
"lang": "en",
"group": "",
"tags": [],
@@ -774,6 +939,19 @@
"titleFriendly": ""
},
{
+ "lang": "zh-cn",
+ "group": "",
+ "tags": [],
+ "url": "https://support.google.com/googleplay/android-developer/answer/1153479?hl=zh-Hans",
+ "timestamp": 1194884220000,
+ "image": null,
+ "title": "应用内结算",
+ "summary": "如何正确设置应用内商品和订阅结算。",
+ "keywords": [],
+ "type": "guide",
+ "titleFriendly": ""
+ },
+ {
"lang": "en",
"group": "",
"tags": [
@@ -1004,7 +1182,7 @@
"type": "guide",
"titleFriendly": ""
},
- {
+ {
"lang": "en",
"group": "",
"tags": [],
@@ -1018,6 +1196,19 @@
"titleFriendly": ""
},
{
+ "lang": "zh-cn",
+ "group": "",
+ "tags": [],
+ "url": "https://support.google.com/googleplay/android-developer/answer/1078870?hl=zh-Hans",
+ "timestamp": 1194884220000,
+ "image": "images/play_dev.jpg",
+ "title": "为你的应用的图片资源",
+ "summary": "如何在你的应用的商品详情页面上添加图片资源。",
+ "keywords": [],
+ "type": "guide",
+ "titleFriendly": ""
+ },
+ {
"lang": "en",
"group": "",
"tags": [],
@@ -1031,6 +1222,19 @@
"titleFriendly": ""
},
{
+ "lang": "zh-cn",
+ "group": "",
+ "tags": [],
+ "url": "https://support.google.com/payments/answer/2741495?hl=zh-Hans",
+ "timestamp": null,
+ "image": null,
+ "title": "退回訂單款項",
+ "summary": "如何退还已收取的订单款项。",
+ "keywords": [],
+ "type": "guide",
+ "titleFriendly": ""
+ },
+ {
"lang": "en",
"group": "",
"tags": [],
@@ -1057,6 +1261,19 @@
"titleFriendly": ""
},
{
+ "lang": "zh-cn",
+ "group": "",
+ "tags": ["localization", "pricing", "developer support"],
+ "url": "https://support.google.com/googleplay/android-developer/table/3541286?hl=zh-Hans",
+ "timestamp": null,
+ "image": "images/play_dev.jpg",
+ "title": "支持向Google Play用户发布应用的地区",
+ "summary": "支持向Google Play用户发布应用的国家/地区。",
+ "keywords": [],
+ "type": "distribute",
+ "titleFriendly": ""
+ },
+ {
"lang": "en",
"group": "",
"tags": ["games", "localization", "quality"],
@@ -1227,6 +1444,19 @@
"titleFriendly": ""
},
{
+ "lang": "zh-cn",
+ "group": "",
+ "tags": [],
+ "url": "https://developers.google.com/edu/guidelines?hl=zh-Hans",
+ "timestamp": null,
+ "image": "http://developer.android.com/distribute/images/edu-guidelines.jpg",
+ "title": "Education Guidelines",
+ "summary": "These guidelines and requirements help you develop great apps for students, which offer compelling content and an intuitive user experience on Android tablets.",
+ "keywords": [],
+ "type": "",
+ "titleFriendly": ""
+ },
+ {
"lang": "en",
"group": "",
"tags": [],
@@ -1407,5 +1637,44 @@
"keywords": ["distribute"],
"type": "PDF DOWNLOAD (11MB)",
"titleFriendly": ""
+ },
+ {
+ "lang": "en",
+ "group": "",
+ "tags": [],
+ "url": "shareables/auto/AndroidAuto-media-apps.pdf",
+ "timestamp": null,
+ "image": "auto/images/assets/icons/media_app_playback.png",
+ "title": "Android Auto Media Apps UI Guidelines",
+ "summary": "Guidelines for designing audio apps that work with Auto. ",
+ "keywords": ["design", "Auto", "Automotive"],
+ "type": "PDF DOWNLOAD (1.1MB)",
+ "titleFriendly": ""
+ },
+ {
+ "lang": "en",
+ "group": "",
+ "tags": [],
+ "url": "shareables/auto/AndroidAuto-messaging-apps.pdf",
+ "timestamp": null,
+ "image": "auto/images/assets/icons/messaging_app_notifications.png",
+ "title": "Android Auto Messaging Apps UI Guidelines",
+ "summary": "Guidelines for designing messaging apps that work with Auto. ",
+ "keywords": ["design", "Auto", "Automotive"],
+ "type": "PDF DOWNLOAD (628KB)",
+ "titleFriendly": ""
+ },
+ {
+ "lang": "en",
+ "group": "",
+ "tags": [],
+ "url": "shareables/auto/AndroidAuto-custom-colors.pdf",
+ "timestamp": null,
+ "image": "auto/images/assets/icons/auto_app_in_simulator.png",
+ "title": "Android Auto Color Customization UI Guidelines",
+ "summary": "Guidelines for color-customizing apps that work with Auto. ",
+ "keywords": ["design", "Auto", "Automotive"],
+ "type": "PDF DOWNLOAD (779KB)",
+ "titleFriendly": ""
}
-]);
+]);
\ No newline at end of file
diff --git a/docs/html/preview/index.html b/docs/html/preview/index.html
index ed78e4d1..4f7722c 100644
--- a/docs/html/preview/index.html
+++ b/docs/html/preview/index.html
@@ -332,47 +332,11 @@
to <code>"21"</code>, so you can upload your updated apps today.</li>
</ul>
- <p>Although the APIs for Android 5.0 are now final, the system image for end-users
- is not available yet. So the following preview system images are available for you to
- test your apps on a Nexus 5 or Nexus 7. These are non-final
- builds and their use is governed by the <a href="/preview/license.html">Android L
- Preview License Agreement</a>.</p>
-
- <table >
- <tbody><tr>
- <th scope="col">Device</th>
- <th scope="col">Download</th>
- <th scope="col">Checksum</th>
- </tr>
- <tr id="hammerhead">
- <td>Nexus 5 (GSM/LTE) <br>"hammerhead"</td>
- <td><a href="#download" onclick="onDownload(this)">hammerhead-lpx13d-preview-f7596f51.tgz</a></td>
- <td>MD5: <code>8d92596aa038203fc6c8ff40a0e8b560</code>
- <br>SHA-1: <code>f7596f518a8a429f03de5bf8152fa90e738228dd</code></td>
- </tr>
- <tr id="razor">
- <td>Nexus 7 [2013] (Wi-Fi) <br>"razor"</td>
- <td><a href="#download" onclick="onDownload(this)">razor-lpx13d-preview-ae4f461f.tgz</a></td>
- <td>MD5: <code>b2c567518d203b487cb2ac28d25b0a54</code>
- <br><nobr>SHA-1: <code>ae4f461fabae5ff92eae0c252c34bb26d877e528</code></nobr></td>
- </tr>
- </tbody></table>
- </li>
-
- <p>For details about how to flash the system image to your device, see the
- <a href="https://developers.google.com/android/nexus/images#instructions">flashing
- instructions</a>.</p>
-
- <p>If you want to uninstall the preview system image and flash your device to factory
- specifications, download the appropriate image from
+ <p>If you previously flashed your Nexus 5 or Nexus 7 with a preview system image, you should
+ now update your device to the final factory system image.
+ Download the appropriate image from
<a href="http://developers.google.com/android/nexus/images">Factory Images for Nexus
- Devices</a> and follow the instructions on that page.</p>
-
- <p class="note"><strong>Note:</strong> When the final Android 5.0 system image becomes
- available, it will be posted on the
- <a href="http://developers.google.com/android/nexus/images">Factory Images for Nexus
- Devices</a> page. To continue development (and receive future system updates),
- you should update your device with that image as soon as possible.</p>
+ Devices</a> and follow the flashing instructions on that page.</p>
</div> <!-- end .wrap -->
diff --git a/docs/html/preview/license.html b/docs/html/preview/license.html
index ffda3ab..deb16aa 100644
--- a/docs/html/preview/license.html
+++ b/docs/html/preview/license.html
@@ -87,8 +87,8 @@
<div class="jd-descr" itemprop="articleBody">
<p>
-If you are using the <a href="/preview/index.html">Android SDK
-Preview</a>, you must agree to the following terms
+If you are using the Android SDK
+Preview, you must agree to the following terms
and conditions. As described below, please note that the preview version of the
Android SDK is subject to change, and that you use it at your own risk. The
Android SDK Preview is not a stable release, and may contain errors and defects
diff --git a/docs/html/resources.jd b/docs/html/resources.jd
new file mode 100644
index 0000000..f1d342d
--- /dev/null
+++ b/docs/html/resources.jd
@@ -0,0 +1,52 @@
+page.title=Resources
+page.viewport_width=970
+page.type=guide
+section.landing=true
+header.hide=1
+nonavpage=true
+page.metaDescription=These resources will help you get started with Android and Google Play. 。
+
+@jd:body
+
+ <div class="jd-descr" itemprop="articleBody">
+
+<div class="dynamic-grid">
+
+<h2>Resources</h2>
+<p style="margin-bottom:2em;">These resources will help you get started with Android and Google Play.</p>
+
+<h3 style="font-size:18px;font-weight:bold">Checklists</h3>
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:overview/1"
+ data-sortOrder=""
+ data-cardSizes="6x6,6x6,6x2x3"
+ data-maxResults="5"></div>
+
+<h3 style="font-size:18px;font-weight:bold">Google Play In-app Billing</h3>
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:overview/2"
+ data-sortOrder=""
+ data-cardSizes="6x6,6x6,6x2x3"
+ data-maxResults="5"></div>
+
+<h3 style="font-size:18px;font-weight:bold">Tools</h3>
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:overview/3"
+ data-sortOrder=""
+ data-cardSizes="6x2x3,6x6,6x6"
+ data-maxResults="5"></div>
+
+<h3 style="font-size:18px;font-weight:bold">Training</h3>
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:overview/4"
+ data-sortOrder=""
+ data-cardSizes="6x6,12x2x3"
+ data-maxResults="5"></div>
+
+
+</div>
+
diff --git a/docs/html/samples/new/index.jd b/docs/html/samples/new/index.jd
index 330caa3..ba75072 100644
--- a/docs/html/samples/new/index.jd
+++ b/docs/html/samples/new/index.jd
@@ -12,99 +12,229 @@
</p>
-<h3 id="BasicManagedProfile">BasicManagedProfile</h3>
-<div class="figure" style="width:220px">
- <img src="{@docRoot}samples/images/BasicManagedProfile.png"
- srcset="{@docRoot}samples/images/BasicManagedProfile@2x.png 2x"
- alt="" height="375" />
- <p class="img-caption">
- <strong>Figure 1.</strong> The BasicManagedProfile sample app.
- </p>
-</div>
+<!-- NOTE TO EDITORS: add most recent samples first -->
-<p>This sample demonstrates how to create a managed profile. You can also:</p>
-<ul>
- <li>Enable or disable other apps, and set restrictions on them.</li>
- <li>Configure intents to be forwarded between the primary account and the
- managed profile.</li>
- <li>Wipe all the data associated with the managed profile.</li>
-</ul>
+<h3 id="MediaBrowserService">Media Browser Service</h3>
-<p class="note"><strong>Note:</strong> There can be only one managed profile on
- a device at a time.</p>
+<p>
+This sample is a simple audio media app that exposes its media
+library and provides metadata and playback controls through the new
+MediaBrowserService and MediaSession APIs from API 21.
+The sample is compatible with Android Auto and also provides a basic UI
+when not connected to a car.
+</p>
-<p><a href="http://github.com/googlesamples/android-BasicManagedProfile">Get it on GitHub</a></p>
+<p class="note">
+ <strong>Note:</strong> This sample is compatible with <a
+ href="http://android.com/auto">Android Auto</a>.
+</p>
-<h3 id="Camera2Basic">Camera2Basic</h3>
+<p><a href="http://github.com/googlesamples/android-MediaBrowserService">Get it on GitHub</a></p>
+
+
+<h3 id="MessagingService">Messaging Service</h3>
+
+<p>
+This sample shows a simple service that sends notifications using
+NotificationCompat. In addition to sending a notification, it also extends
+the notification with a CarExtender to make it compatible with Android Auto.
+Each unread conversation from a user is sent as a distinct notification.
+</p>
+
+<p class="note">
+ <strong>Note:</strong> This sample is compatible with <a
+ href="http://android.com/auto">Android Auto</a>.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-MessagingService">Get it on GitHub</a></p>
+
+
+<h3 id="SpeedTracker">Speed Tracker (Wear)</h3>
+
+<p>
+This sample uses the FusedLocation APIs of Google Play Services on Android Wear
+devices that have a hardware GPS built in. In those cases, this sample provides
+a simple screen that shows the current speed of the wearable device. User can
+set a speed limit and if the speed approaches that limit, it changes the color
+to yellow and if it exceeds the limit, it turns red. User can also enable
+recording of coordinates and when it pairs back with the phone, this data
+is synced with the phone component of the app and user can see a track
+made of those coordinates on a map on the phone.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-SpeedTracker">Get it on GitHub</a></p>
+
+
+<h3 id="AppRestrictionSchema">AppRestrictionSchema</h3>
+
+<p>
+This sample shows how to use app restrictions. This application has one boolean
+restriction with a key "can_say_hello" that defines whether the only feature of this
+app (press the button to show "Hello" message) is enabled or disabled. Use
+AppRestrictionEnforcer sample to toggle the restriction.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-AppRestrictionSchema">Get it on GitHub</a></p>
+
+
+<h3 id="AppRestrictionEnforcer">AppRestrictionEnforcer</h3>
+
+<p>
+This sample demonstrates how to set restrictions to other apps as a profile owner.
+Use AppRestrictionSchema sample as a app with available restrictions.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-AppRestrictionEnforcer">Get it on GitHub</a></p>
+
+
+<h3 id="DocumentCentricRelinquishIdentity">DocumentCentricRelinquishIdentity</h3>
+
+<p>
+This sample shows how to relinquish identity to activities above it in the task stack.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-DocumentCentricRelinquishIdentity">Get it on GitHub</a></p>
+
+
+<h3 id="DocumentCentricApps">DocumentCentricApps</h3>
+
+<p>
+This sample shows the basic usage of the new "Document Centric Apps" API.
+It let's you create new documents in the system overview menu and persists its
+state through reboots. If "Task per document" is checked a new task will be
+created for every new document in the overview menu.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-DocumentCentricApps">Get it on GitHub</a></p>
+
+
+<h3 id="HdrViewfinder">HdrViewfinder</h3>
+
+<p>
+This demo implements a real-time high-dynamic-range camera viewfinder, by alternating
+the sensor's exposure time between two exposure values on even and odd frames, and then
+compositing together the latest two frames whenever a new frame is captured.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-HdrViewfinder">Get it on GitHub</a></p>
+
+
+<h3 id="Interpolator">Interpolator</h3>
+
+<p>
+This sample demonstrates the use of animation interpolators and path animations for
+Material Design. It shows how an ObjectAnimator is used to animate two properties of a
+view (scale X and Y) along a path.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-Interpolator">Get it on GitHub</a></p>
+
+
+<h3 id="DrawableTinting">DrawableTinting</h3>
+
+<p>Sample that shows applying tinting and color filters to Drawables both programmatically
+and as Drawable resources in XML.</p>
+<p>Tinting is set on a nine-patch drawable through the "tint" and "tintMode" parameters.
+A color state list is referenced as the tint color, which defines colors for different
+states of a View (for example disabled/enabled, focused, pressed or selected).</p>
+<p>Programmatically, tinting is applied to a Drawable through its "setColorFilter" method,
+with a reference to a color and a PorterDuff blend mode. The color and blend mode can be
+changed from the UI to see the effect of different options.</p>
+
+<p><a href="http://github.com/googlesamples/android-DrawableTinting">Get it on GitHub</a></p>
+
+
+<h3 id="LNotifications">LNotifications</h3>
+
+<p>
+This sample demonstrates how new features for notifications introduced in Android 5.0
+are used such as Heads-Up notifications, visibility, people, category and priority
+metadata. </p>
+<p><a href="http://github.com/googlesamples/android-LNotifications">Get it on GitHub</a></p>
+
+
+<h3 id="CardView">CardView</h3>
+
+<p>
+This sample demonstrates how to use the CardView UI widget introduced in Android 5.0, using the support library for backward compatibility.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-CardView">Get it on GitHub</a></p>
+
+
+<h3 id="RecyclerView">RecyclerView</h3>
+
+<p>
+Demonstration of using RecyclerView with a LayoutManager to create a vertical ListView.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-RecyclerView">Get it on GitHub</a></p>
+
+
+<h3 id="RevealEffectBasic">RevealEffectBasic</h3>
+
+<p>
+A sample demonstrating how to perform a reveal effect for UI elements within the Material Design framework.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-RevealEffectBasic">Get it on GitHub</a></p>
+
+
+<h3 id="FloatingActionButtonBasic">FloatingActionButtonBasic</h3>
+
+<p>
+This sample shows the two sizes of Floating Action Buttons and how to interact with
+them.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-FloatingActionButtonBasic">Get it on GitHub</a></p>
+
<!--
+<h3 id="">SampleName</h3>
+
<div class="figure" style="width:220px">
<img src="" srcset="@2x.png 2x" alt="" height="375" />
<p class="img-caption">
<strong>Figure n.</strong> Single sentence summarizing the figure.
</p>
</div>
+
+<p>
+**description**
+</p>
-->
-<p>This sample demonstrates the basic use of the Camera2 API. The sample code
-demonstrates how you can display camera preview and take pictures.</p>
-<p><a href="http://github.com/googlesamples/android-Camera2Basic">Get it on GitHub</a></p>
-
-
-<h3 id="Camera2Video">Camera2Video</h3>
+<h3 id="NavigationDrawerSample">NavigationDrawerSample</h3>
<!--
<div class="figure" style="width:220px">
-<img src="" srcset="@2x.png 2x" alt="" height="375" />
- <p class="img-caption">
- <strong>Figure n.</strong> Single sentence summarizing the figure.
- </p>
-</div>
--->
-
-<p>This sample demonstrates how to record video using the Camera2 API.</p>
-
-<p><a href="http://github.com/googlesamples/android-Camera2Video">Get it on GitHub</a></p>
-
-<h3 id="ActivitySceneTransitionBasic">ActivitySceneTransitionBasic</h3>
-<div class="figure" style="width:220px">
- <img src="{@docRoot}samples/images/ActivitySceneTransitionBasic.png"
- srcset="{@docRoot}samples/images/ActivitySceneTransitionBasic@2x.png 2x"
- alt="" height="375" />
+ <img src="" srcset="@2x.png 2x" alt="" height="375" />
<p class="img-caption">
- <strong>Figure 2.</strong> The ActivitySceneTransitionBasic sample app.
- </p>
- </div>
-
-<p> This sample demonstrates how to the use {@link android.app.Activity} scene
-transitions when transitioning from one activity to another. Uses a combination
-of <code>moveImage</code> and <code>changeBounds</code> to nicely transition
-from a grid of images to an activity with a large image and detail text. </p>
-
-<p><a href="http://github.com/googlesamples/android-ActivitySceneTransition">Get it on GitHub</a></p>
-
-<h3 id="ElevationBasic">ElevationBasic</h3>
-<!--
-<div class="figure" style="width:220px">
-<img src="" srcset="@2x.png 2x" alt="" height="375" />
- <p class="img-caption">
<strong>Figure n.</strong> Single sentence summarizing the figure.
</p>
</div>
-->
<p>
-This sample demonstrates two alternative ways to move a view in the z-axis:</p>
+This sample illustrates a common usage of the Android support library's
+{@link android.support.v4.widget.DrawerLayout} widget.
+</p>
-<ul>
- <li>With a fixed elevation, using XML.</li>
- <li>Raising the elevation when the user taps on it, using
- <code>setTranslationZ()</code>.</li>
-</ul>
+<p><a href="http://github.com/googlesamples/android-NavigationDrawer">Get it on GitHub</a></p>
-<p><a href="http://github.com/googlesamples/android-ElevationBasic">Get it on GitHub</a></p>
-<h3 id="ElevationDrag">ElevationDrag</h3>
+<h3 id="JobSchedulerSample">JobSchedulerSample</h3>
+
+<p>
+This sample app allows the user to schedule jobs through the UI, and shows
+visual cues when the jobs are executed.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-JobScheduler">Get it on GitHub</a></p>
+
+
+<h3 id="AndroidTVLeanbackSample">AndroidTVLeanbackSample</h3>
<!--
<div class="figure" style="width:220px">
<img src="" srcset="@2x.png 2x" alt="" height="375" />
@@ -114,11 +244,46 @@
</div>
-->
-<p>This sample demonstrates a drag and drop action on different shapes.
-Elevation and z-translation are used to render the shadows. The views are
-clipped using different outlines.</p>
+<p>
+This sample demonstrates use of the Android TV Leanback Support Library.
+</p>
-<p><a href="http://github.com/googlesamples/android-ElevationDrag">Get it on GitHub</a></p>
+<p><a href="http://github.com/googlesamples/androidtv-Leanback">Get it on GitHub</a></p>
+
+
+<h3 id="Visual-Game-Controller">Visual-Game-Controller</h3>
+<!--
+<div class="figure" style="width:220px">
+ <img src="" srcset="@2x.png 2x" alt="" height="375" />
+ <p class="img-caption">
+ <strong>Figure n.</strong> Single sentence summarizing the figure.
+ </p>
+</div>
+-->
+
+<p>
+This sample displays events received from a game controller shown on the screen.
+</p>
+
+<p><a href="http://github.com/googlesamples/androidtv-VisualGameController">Get it on GitHub</a></p>
+
+
+<h3 id="GameControllerSample">GameControllerSample</h3>
+<!--
+<div class="figure" style="width:220px">
+ <img src="" srcset="@2x.png 2x" alt="" height="375" />
+ <p class="img-caption">
+ <strong>Figure n.</strong> Single sentence summarizing the figure.
+ </p>
+</div>
+-->
+
+<p>
+This sample implements a multi-player game, demonstrating game controller input
+handling.
+</p>
+
+<p><a href="http://github.com/googlesamples/androidtv-GameController">Get it on GitHub</a></p>
<h3 id="ClippingBasic">ClippingBasic</h3>
@@ -146,7 +311,8 @@
</p>
</div>
-<h3 id="GameControllerSample">GameControllerSample</h3>
+
+<h3 id="ElevationDrag">ElevationDrag</h3>
<!--
<div class="figure" style="width:220px">
<img src="" srcset="@2x.png 2x" alt="" height="375" />
@@ -156,15 +322,70 @@
</div>
-->
+<p>This sample demonstrates a drag and drop action on different shapes.
+Elevation and z-translation are used to render the shadows. The views are
+clipped using different outlines.</p>
+
+<p><a href="http://github.com/googlesamples/android-ElevationDrag">Get it on GitHub</a></p>
+
+
+<h3 id="ElevationBasic">ElevationBasic</h3>
+<!--
+<div class="figure" style="width:220px">
+<img src="" srcset="@2x.png 2x" alt="" height="375" />
+ <p class="img-caption">
+ <strong>Figure n.</strong> Single sentence summarizing the figure.
+ </p>
+</div>
+-->
+
<p>
-This sample implements a multi-player game, demonstrating game controller input
-handling.
-</p>
+This sample demonstrates two alternative ways to move a view in the z-axis:</p>
-<p><a href="http://github.com/googlesamples/androidtv-GameController">Get it on GitHub</a></p>
+<ul>
+ <li>With a fixed elevation, using XML.</li>
+ <li>Raising the elevation when the user taps on it, using
+ <code>setTranslationZ()</code>.</li>
+</ul>
+
+<p><a href="http://github.com/googlesamples/android-ElevationBasic">Get it on GitHub</a></p>
-<h3 id="Visual-Game-Controller">Visual-Game-Controller</h3>
+<h3 id="ActivitySceneTransitionBasic">ActivitySceneTransitionBasic</h3>
+<div class="figure" style="width:220px">
+ <img src="{@docRoot}samples/images/ActivitySceneTransitionBasic.png"
+ srcset="{@docRoot}samples/images/ActivitySceneTransitionBasic@2x.png 2x"
+ alt="" height="375" />
+ <p class="img-caption">
+ <strong>Figure 2.</strong> The ActivitySceneTransitionBasic sample app.
+ </p>
+ </div>
+
+<p> This sample demonstrates how to the use {@link android.app.Activity} scene
+transitions when transitioning from one activity to another. Uses a combination
+of <code>moveImage</code> and <code>changeBounds</code> to nicely transition
+from a grid of images to an activity with a large image and detail text. </p>
+
+<p><a href="http://github.com/googlesamples/android-ActivitySceneTransition">Get it on GitHub</a></p>
+
+
+<h3 id="Camera2Video">Camera2Video</h3>
+<!--
+<div class="figure" style="width:220px">
+<img src="" srcset="@2x.png 2x" alt="" height="375" />
+ <p class="img-caption">
+ <strong>Figure n.</strong> Single sentence summarizing the figure.
+ </p>
+</div>
+-->
+
+<p>This sample demonstrates how to record video using the Camera2 API.</p>
+
+<p><a href="http://github.com/googlesamples/android-Camera2Video">Get it on GitHub</a></p>
+
+
+<h3 id="Camera2Basic">Camera2Basic</h3>
+
<!--
<div class="figure" style="width:220px">
<img src="" srcset="@2x.png 2x" alt="" height="375" />
@@ -174,192 +395,32 @@
</div>
-->
-<p>
-This sample displays events received from a game controller shown on the screen.
-</p>
+<p>This sample demonstrates the basic use of the Camera2 API. The sample code
+demonstrates how you can display camera preview and take pictures.</p>
-<p><a href="http://github.com/googlesamples/androidtv-VisualGameController">Get it on GitHub</a></p>
+<p><a href="http://github.com/googlesamples/android-Camera2Basic">Get it on GitHub</a></p>
-<h3 id="AndroidTVLeanbackSample">AndroidTVLeanbackSample</h3>
-<!--
+
+<h3 id="BasicManagedProfile">BasicManagedProfile</h3>
<div class="figure" style="width:220px">
- <img src="" srcset="@2x.png 2x" alt="" height="375" />
+ <img src="{@docRoot}samples/images/BasicManagedProfile.png"
+ srcset="{@docRoot}samples/images/BasicManagedProfile@2x.png 2x"
+ alt="" height="375" />
<p class="img-caption">
- <strong>Figure n.</strong> Single sentence summarizing the figure.
- </p>
-</div>
--->
-
-<p>
-This sample demonstrates use of the Android TV Leanback Support Library.
-</p>
-
-<p><a href="http://github.com/googlesamples/androidtv-Leanback">Get it on GitHub</a></p>
-
-<h3 id="JobSchedulerSample">JobSchedulerSample</h3>
-
-<p>
-This sample app allows the user to schedule jobs through the UI, and shows
-visual cues when the jobs are executed.
-</p>
-
-<p><a href="http://github.com/googlesamples/android-JobScheduler">Get it on GitHub</a></p>
-
-<h3 id="NavigationDrawerSample">NavigationDrawerSample</h3>
-<!--
-<div class="figure" style="width:220px">
- <img src="" srcset="@2x.png 2x" alt="" height="375" />
- <p class="img-caption">
- <strong>Figure n.</strong> Single sentence summarizing the figure.
- </p>
-</div>
--->
-
-<p>
-This sample illustrates a common usage of the Android support library's
-{@link android.support.v4.widget.DrawerLayout} widget.
-</p>
-
-<p><a href="http://github.com/googlesamples/android-NavigationDrawer">Get it on GitHub</a></p>
-<!--
-<h3 id="">SampleName</h3>
-
-<div class="figure" style="width:220px">
- <img src="" srcset="@2x.png 2x" alt="" height="375" />
- <p class="img-caption">
- <strong>Figure n.</strong> Single sentence summarizing the figure.
+ <strong>Figure 1.</strong> The BasicManagedProfile sample app.
</p>
</div>
-<p>
-**description**
-</p>
--->
+<p>This sample demonstrates how to create a managed profile. You can also:</p>
+<ul>
+ <li>Enable or disable other apps, and set restrictions on them.</li>
+ <li>Configure intents to be forwarded between the primary account and the
+ managed profile.</li>
+ <li>Wipe all the data associated with the managed profile.</li>
+</ul>
-<h3 id="FloatingActionButtonBasic">FloatingActionButtonBasic</h3>
+<p class="note"><strong>Note:</strong> There can be only one managed profile on
+ a device at a time.</p>
-<p>
-This sample shows the two sizes of Floating Action Buttons and how to interact with
-them.
-</p>
+<p><a href="http://github.com/googlesamples/android-BasicManagedProfile">Get it on GitHub</a></p>
-<p><a href="http://github.com/googlesamples/android-FloatingActionButtonBasic">Get it on GitHub</a></p>
-
-<h3 id="RevealEffectBasic">RevealEffectBasic</h3>
-
-<p>
-A sample demonstrating how to perform a reveal effect for UI elements within the Material Design framework.
-</p>
-
-<p><a href="http://github.com/googlesamples/android-RevealEffectBasic">Get it on GitHub</a></p>
-
-<h3 id="RecyclerView">RecyclerView</h3>
-
-<p>
-Demonstration of using RecyclerView with a LayoutManager to create a vertical ListView.
-</p>
-
-<p><a href="http://github.com/googlesamples/android-RecyclerView">Get it on GitHub</a></p>
-
-<h3 id="CardView">CardView</h3>
-
-<p>
-This sample demonstrates how to use the CardView UI widget introduced in Android 5.0, using the support library for backward compatibility.
-</p>
-
-<p><a href="http://github.com/googlesamples/android-CardView">Get it on GitHub</a></p>
-
-<h3 id="LNotifications">LNotifications</h3>
-
-<p>
-This sample demonstrates how new features for notifications introduced in Android 5.0
-are used such as Heads-Up notifications, visibility, people, category and priority
-metadata. </p>
-<p><a href="http://github.com/googlesamples/android-LNotifications">Get it on GitHub</a></p>
-
-<h3 id="DrawableTinting">DrawableTinting</h3>
-
-<p>Sample that shows applying tinting and color filters to Drawables both programmatically
-and as Drawable resources in XML.</p>
-<p>Tinting is set on a nine-patch drawable through the "tint" and "tintMode" parameters.
-A color state list is referenced as the tint color, which defines colors for different
-states of a View (for example disabled/enabled, focused, pressed or selected).</p>
-<p>Programmatically, tinting is applied to a Drawable through its "setColorFilter" method,
-with a reference to a color and a PorterDuff blend mode. The color and blend mode can be
-changed from the UI to see the effect of different options.</p>
-
-<p><a href="http://github.com/googlesamples/android-DrawableTinting">Get it on GitHub</a></p>
-
-<h3 id="Interpolator">Interpolator</h3>
-
-<p>
-This sample demonstrates the use of animation interpolators and path animations for
-Material Design. It shows how an ObjectAnimator is used to animate two properties of a
-view (scale X and Y) along a path.
-</p>
-
-<p><a href="http://github.com/googlesamples/android-Interpolator">Get it on GitHub</a></p>
-
-<h3 id="HdrViewfinder">HdrViewfinder</h3>
-
-<p>
-This demo implements a real-time high-dynamic-range camera viewfinder, by alternating
-the sensor's exposure time between two exposure values on even and odd frames, and then
-compositing together the latest two frames whenever a new frame is captured.
-</p>
-
-<p><a href="http://github.com/googlesamples/android-HdrViewfinder">Get it on GitHub</a></p>
-
-<h3 id="DocumentCentricApps">DocumentCentricApps</h3>
-
-<p>
-This sample shows the basic usage of the new "Document Centric Apps" API.
-It let's you create new documents in the system overview menu and persists its
-state through reboots. If "Task per document" is checked a new task will be
-created for every new document in the overview menu.
-</p>
-
-<p><a href="http://github.com/googlesamples/android-DocumentCentricApps">Get it on GitHub</a></p>
-
-<h3 id="DocumentCentricRelinquishIdentity">DocumentCentricRelinquishIdentity</h3>
-
-<p>
-This sample shows how to relinquish identity to activities above it in the task stack.
-</p>
-
-<p><a href="http://github.com/googlesamples/android-DocumentCentricRelinquishIdentity">Get it on GitHub</a></p>
-
-<h3 id="AppRestrictionEnforcer">AppRestrictionEnforcer</h3>
-
-<p>
-This sample demonstrates how to set restrictions to other apps as a profile owner.
-Use AppRestrictionSchema sample as a app with available restrictions.
-</p>
-
-<p><a href="http://github.com/googlesamples/android-AppRestrictionEnforcer">Get it on GitHub</a></p>
-
-<h3 id="AppRestrictionSchema">AppRestrictionSchema</h3>
-
-<p>
-This sample shows how to use app restrictions. This application has one boolean
-restriction with a key "can_say_hello" that defines whether the only feature of this
-app (press the button to show "Hello" message) is enabled or disabled. Use
-AppRestrictionEnforcer sample to toggle the restriction.
-</p>
-
-<p><a href="http://github.com/googlesamples/android-AppRestrictionSchema">Get it on GitHub</a></p>
-
-<h3 id="SpeedTracker">Speed Tracker (Wear)</h3>
-
-<p>
-This sample uses the FusedLocation APIs of Google Play Services on Android Wear
-devices that have a hardware GPS built in. In those cases, this sample provides
-a simple screen that shows the current speed of the wearable device. User can
-set a speed limit and if the speed approaches that limit, it changes the color
-to yellow and if it exceeds the limit, it turns red. User can also enable
-recording of coordinates and when it pairs back with the phone, this data
-is synced with the phone component of the app and user can see a track
-made of those coordinates on a map on the phone.
-</p>
-
-<p><a href="http://github.com/googlesamples/android-SpeedTracker">Get it on GitHub</a></p>
diff --git a/docs/html/samples/notification.jd b/docs/html/samples/notification.jd
new file mode 100644
index 0000000..bbcea93
--- /dev/null
+++ b/docs/html/samples/notification.jd
@@ -0,0 +1,11 @@
+page.title=Notification
+@jd:body
+
+
+<div id="samples" class="notification">
+</div>
+
+
+<script>
+ $(document).ready(showSamples);
+</script>
diff --git a/docs/html/sdk/installing/migrate.jd b/docs/html/sdk/installing/migrate.jd
index db1b5dd..b83f8d3 100644
--- a/docs/html/sdk/installing/migrate.jd
+++ b/docs/html/sdk/installing/migrate.jd
@@ -15,23 +15,7 @@
</div>
<p>If you've previously developed for Android using Eclipse and would like to migrate
-to Android Studio, you should export your projects from Eclipse in order to generate
-Gradle build files. You can then import your project into Android Studio.</p>
-
-
-<h2 id="Export">Export from Eclipse</h2>
-<ol>
-<li><a href="{@docRoot}tools/help/adt.html#Updating">Update your Eclipse ADT Plugin</a>
- (you must have version 22.0 or higher).</li>
-<li>In Eclipse, select <strong>File > Export</strong>.</li>
-<li>In the window that appears, open <strong>Android</strong> and select <strong>Generate Gradle
-build files</strong>.</li>
-<li>Select the project you want to export for Android Studio and click
-<strong>Finish</strong>.</li>
-</ol>
-
-<p>Your selected project remains in the same location but now contains a {@code build.gradle}
-file and is ready for Android Studio.</p>
+to Android Studio, you can import your project into Android Studio.</p>
<h2 id="Export">Import into Android Studio</h2>
diff --git a/docs/html/tools/devices/managing-avds.jd b/docs/html/tools/devices/managing-avds.jd
index d3bbfdc..9afa88a 100644
--- a/docs/html/tools/devices/managing-avds.jd
+++ b/docs/html/tools/devices/managing-avds.jd
@@ -12,32 +12,23 @@
<ol>
<li><a href="#hardwareopts">Hardware options</a></li>
</ol>
- </li>
+ </li>
</ol>
</div>
</div>
<p>The AVD Manager is an easy to use user interface to manage your AVD (Android Virtual Device)
configurations. An AVD is a device configuration for the Android emulator that allows you to
- model different configurations of Android-powered devices. When you start the AVD Manager in Eclipse
- or navigate to your SDK's {@code tools/} directory and execute
- <code>android avd</code>. You will see the AVD Manager as shown in
- figure 1.</p>
-
- <img src="{@docRoot}images/avd-manager.png">
-
- <p class="img-caption"><strong>Figure 1. </strong>Screenshot of the AVD Manager. </p>
-
- <p>From the main screen, you can create, delete, repair and start AVDs as well as see the details
- of each AVD. </p>
+ model different configurations of Android-powered devices. When you start the AVD Manager in Android
+ Studio or navigate to your SDK's {@code tools/} directory and execute
+ <code>android avd</code>, you will see the AVD Manager main screen with your current virtual
+ devices. You can right-click an existing AVD to perform actions on the AVD, such as delete,
+ duplicate, wipe data, show on disk, and display details. </p>
+
+ <img src="{@docRoot}images/studio-avdmgr-firstscreen.png" alt="">
+ <p class="img-caption"><strong>Figure 1.</strong> AVD Manager.</p>
- <p class="note"><strong>Note:</strong> The emulator system images include experimental
-64-bit system images along with standard 32-bit system images. The 64-bit system images
-require the Intel x86 Emulator Accelerator (HAXM) Rev.5 which can be downloaded from the
-<a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a> <em>Extras</em> folder.
- </p>
-
<h2 id="createavd">Creating an AVD</h2>
<p>You can create as many AVDs as you would like to test on. It is recommended that you test your
@@ -49,38 +40,68 @@
<li>Start the AVD Manager:
<ul>
- <li>In Eclipse: select <strong>Window > AVD Manager</strong>, or click
- the AVD Manager icon in the Eclipse toolbar.</li>
+ <li>In Android Studio: select <strong>Tools > Android > AVD Manager</strong>, or click
+ the AVD Manager icon <img src="{@docRoot}images/ui/studio-avdmgr-icon.png"style="vertical-align:bottom;margin:0;height:19px"> in the Android Studio toolbar.</li>
+
<li>In other IDEs: Navigate to your SDK's <code>tools/</code> directory and execute the
<code>android</code> tool with no arguments.</li>
</ul>
</li>
- <li><p>In the <em>Virtual Devices</em> panel, you'll see a list of existing AVDs. Click
- <strong>New</strong> to create a new AVD. The <strong>Create New AVD</strong> dialog appears.</p>
-
- <img src="{@docRoot}images/developing/avd-dialog.png" alt="AVD Dialog">
- <p class="img-caption"><strong>Figure 2.</strong> Screenshot of the Create AVD window</p>
+ <li><p>Click <strong>Create Virtual Device</strong> to create an AVD. The
+ <strong>Select Hardware</strong> dialog appears.</p>
+
+ <img src="{@docRoot}images/studio-avdmgr-selecthdwr.png">
+ <p class="img-caption"><strong>Figure 2.</strong> Select Hardware window.</p>
+ </li>
+
+ <li><p>Select the device category and form factor. Click <strong>Edit Device</strong> to modify
+ an existing AVD, or click <strong>New Hardware Profile</strong> to create a new hardware profile.
+ Click <strong>Next</strong> to continue. </p>
+ <p>The hardware profile includes settings for screen size, camera, memory options,input type,
+ and sensors. For a list of hardware features, see <a href="#hardwareopts">Hardware options</a>.</p>
+
+ <img src="{@docRoot}images/studio-avdmgr-confighardwareprof.png" alt="">
+ <p class="img-caption"><strong>Figure 3.</strong> Configure Hardware window.</p>
+ </li>
+
+ <li>Select the desired system image. Click <strong>Install Latest Version</strong> to download
+ a new system image. Click <strong>Next</strong> to continue.
</li>
<li>Fill in the details for the AVD.
- <p>Give it a name, a platform target, an SD card size, and a skin (HVGA is default). You can
- also add specific hardware features of the emulated device by clicking the
- <strong>New...</strong> button and selecting the feature. For a list of hardware features,
- see <a href="#hardwareopts">Hardware options</a>.</p>
+ <p>Give it a name, device type, platform target, image size, orientation, and emulator
+ performance. Click <strong>Show Advanced Settings</strong> to assign a custom skin to the
+ hardware profile and other advanced settings for the device type.
+ </p>
- <p class="note"><strong>Note:</strong> Be sure to define a target for your AVD that satisfies
+ <p class="note"><strong>Tip:</strong>Store custom skins in an easily accessible directory,
+ such as <em>~/skins</em>. From information about custom skins, see
+ <a href="#skins">Skins</a>. </p>
+
+ <img src="{@docRoot}images/studio-avdmgr-configavd.png" alt="">
+ <p class="img-caption"><strong>Figure 4.</strong> Configure AVD window.</p>
+
+ <p class="note"><strong>Tip:</strong> Be sure to define a target for your AVD that satisfies
your application's Build Target (the AVD platform target must have an API Level equal to or
greater than the API Level that your application compiles against).</p>
</li>
- <li>Click <strong>Create AVD</strong>.</li>
+ <li>Click <strong>Finish</strong>.</li>
</ol>
<p>Your AVD is now ready and you can either close the AVD Manager, create more AVDs, or
- launch an emulator with the AVD by selecting a device and clicking <strong>Start</strong>.</p>
+ manage an emulator with the AVD by clicking an icon in the <strong>Actions</strong> column:
+ </p>
+
+ <ul>
+ <li>Start an AVD <img src="{@docRoot}images/tools/studio-avdmgr-action-icon.png" alt=""></li>
+ <li>Edit an AVD <img src="{@docRoot}images/tools/studio-avdmgr-actions-edit-icon.png" alt=""></li>
+ <li>Perform management actions <img src="{@docRoot}images/tools/studio-avdmgr-actions-dropdown-icon.png" alt=""></li>
+ </ul>
+
<h3 id="hardwareopts">Hardware options</h3>
<p>If you are creating a new AVD, you can specify the following hardware options for the AVD
@@ -242,3 +263,68 @@
</tr>
</table>
+
+<h3 id="skins">Using Custom Emulator Skins</h3>
+<p>A custom Android emulator skin is a collection of files that enable you to customize the visual
+and control elements of an emulator display. Custom emulator skins enable you to define variations
+of emulation properties, such as the use of a trackball or touchscreen, to match your device
+customizations. Each custom emulator skin contains:</p>
+ <ul>
+ <li>A <code>hardware.ini file</code> for initialization settings</li>
+ <li>Layout files for supported orientations (landscape, portrait) and physical configuration</li>
+ <li>Image files for display elements, such as background, keys and buttons</li>
+ </ul>
+<p>To create and use a custom skin:</p>
+ <ol>
+ <li>Create a skin folder in an easily accessible location, such as <em>~/skins</em>. </li>
+ <li>Define the skin orientation and configuration settings in a file called <code>layout</code>
+ in the skin folder.
+<pre>
+parts {
+
+ device {
+ display {
+ width 1080
+ height 1920
+ x 0
+ y 0
+ }
+ }
+
+ portrait {
+ background {
+ image background_port.png
+ }
+
+ buttons {
+ power {
+ image button_vertical.png
+ x 1229
+ y 616
+ }
+ }
+ }
+ ...
+}
+
+</pre></li>
+
+ <li>Creates a <code>hardware.ini</code> file for the skin-specific properties that determine
+ emulator specifications and behavior. For a complete list of emulator properties, see
+ <a href="{@docRoot}tools/devices/managing-avds-cmdline.html">Managing AVDs from the Command
+ Line</a>. For example:</li>
+<pre>
+# skin-specific hardware values
+hw.lcd.density=213
+vm.heapSize=48
+hw.ramSize=1024
+hw.keyboard.lid=no
+hw.mainKeys=no
+</pre>
+ <li>Add the bitmap files of the device images to the skin folder. </li>
+ <li>Archive the files in the skin folder. </li>
+ <li>Create a new AVD and select the archive file as a custom skin. </li>
+ </ol>
+
+<p>You can now run the AVD with a custom skin for testing and viewing your app. </p>
+
diff --git a/docs/html/tools/tools_toc.cs b/docs/html/tools/tools_toc.cs
index ac33185..7f93eed 100644
--- a/docs/html/tools/tools_toc.cs
+++ b/docs/html/tools/tools_toc.cs
@@ -143,9 +143,9 @@
</ul>
</li>
<li class="nav-section">
- <div class="nav-section-header"><a href="<?cs var:toroot ?>tools/publishing/publishing_overview.html"><span class="en">Publishing</span></a></div>
+ <div class="nav-section-header"><a href="<?cs var:toroot ?>tools/publishing/publishing_overview.html" zh-cn-lang="发布概述"><span class="en">Publishing</span></a></div>
<ul>
- <li><a href="<?cs var:toroot ?>tools/publishing/preparing.html"><span class="en">Preparing for Release</span></a></li>
+ <li><a href="<?cs var:toroot ?>tools/publishing/preparing.html" zh-cn-lang="准备发布"><span class="en">Preparing for Release</span></a></li>
<li><a href="<?cs var:toroot ?>tools/publishing/versioning.html"><span class="en">Versioning Your Apps</span></a></li>
<li><a href="<?cs var:toroot ?>tools/publishing/app-signing.html"><span class="en">Signing Your Apps</span></a></li>
</ul>
@@ -201,7 +201,7 @@
class="en">MonkeyRunner</span></a></li>
</ul>
</li>
- <li><a href="<?cs var:toroot ?>tools/help/proguard.html">ProGuard</a></li>
+ <li><a href="<?cs var:toroot ?>tools/help/proguard.html" zh-cn-lang="ProGuard">ProGuard</a></li>
<li><a href="<?cs var:toroot ?>tools/help/sdk-manager.html">SDK Manager</a></li>
<li><a href="<?cs var:toroot ?>tools/help/systrace.html">Systrace</a></li>
<li><a href="<?cs var:toroot ?>tools/help/gltracer.html">Tracer for OpenGL ES</a></li>
diff --git a/docs/html/training/articles/perf-jni.jd b/docs/html/training/articles/perf-jni.jd
index 1a40f62..5a9fa1e 100644
--- a/docs/html/training/articles/perf-jni.jd
+++ b/docs/html/training/articles/perf-jni.jd
@@ -635,20 +635,31 @@
<a name="faq_FindClass" id="faq_FindClass"></a>
<h2>FAQ: Why didn't <code>FindClass</code> find my class?</h2>
+<p>(Most of this advice applies equally well to failures to find methods
+with <code>GetMethodID</code> or <code>GetStaticMethodID</code>, or fields
+with <code>GetFieldID</code> or <code>GetStaticFieldID</code>.)</p>
+
<p>Make sure that the class name string has the correct format. JNI class
names start with the package name and are separated with slashes,
such as <code>java/lang/String</code>. If you're looking up an array class,
you need to start with the appropriate number of square brackets and
must also wrap the class with 'L' and ';', so a one-dimensional array of
-<code>String</code> would be <code>[Ljava/lang/String;</code>.</p>
+<code>String</code> would be <code>[Ljava/lang/String;</code>.
+If you're looking up an inner class, use '$' rather than '.'. In general,
+using <code>javap</code> on the .class file is a good way to find out the
+internal name of your class.</p>
+
+<p>If you're using ProGuard, make sure that
+<a href="{@docRoot}tools/help/proguard.html#configuring">ProGuard didn't
+strip out your class</a>. This can happen if your class/method/field is only
+used from JNI.
<p>If the class name looks right, you could be running into a class loader
issue. <code>FindClass</code> wants to start the class search in the
class loader associated with your code. It examines the call stack,
which will look something like:
<pre> Foo.myfunc(Native Method)
- Foo.main(Foo.java:10)
- dalvik.system.NativeStart.main(Native Method)</pre>
+ Foo.main(Foo.java:10)</pre>
<p>The topmost method is <code>Foo.myfunc</code>. <code>FindClass</code>
finds the <code>ClassLoader</code> object associated with the <code>Foo</code>
@@ -656,12 +667,9 @@
<p>This usually does what you want. You can get into trouble if you
create a thread yourself (perhaps by calling <code>pthread_create</code>
-and then attaching it with <code>AttachCurrentThread</code>).
-Now the stack trace looks like this:</p>
-<pre> dalvik.system.NativeStart.run(Native Method)</pre>
-
-<p>The topmost method is <code>NativeStart.run</code>, which isn't part of
-your application. If you call <code>FindClass</code> from this thread, the
+and then attaching it with <code>AttachCurrentThread</code>). Now there
+are no stack frames from your application.
+If you call <code>FindClass</code> from this thread, the
JavaVM will start in the "system" class loader instead of the one associated
with your application, so attempts to find app-specific classes will fail.</p>
diff --git a/docs/html/training/auto/audio/index.jd b/docs/html/training/auto/audio/index.jd
new file mode 100644
index 0000000..aa25769
--- /dev/null
+++ b/docs/html/training/auto/audio/index.jd
@@ -0,0 +1,475 @@
+page.title=Providing Audio Playback for Auto
+page.tags="auto", "car", "automotive", "audio"
+page.article=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>Dependencies and Prerequisites</h2>
+ <ul>
+ <li>Android 5.0 (API level 21) or higher</li>
+ </ul>
+
+ <h2>This class teaches you how to</h2>
+
+ <ol>
+ <li><a href="#overview">Provide Audio Services</a></li>
+ <li><a href="#config_manifest">Configure Your Manifest</a></li>
+ <li><a href="#implement_browser">Build a Browser Service</a></li>
+ <li><a href="#implement_callback">Implement Play Controls</a></li>
+ </ol>
+
+ <h2>Related Samples</h2>
+
+ <ul>
+ <li><a href="{@docRoot}samples/MediaBrowserService/index.html">
+ MediaBrowserService</a></li>
+ </ul>
+
+ <h2>See Also</h2>
+
+ <ul>
+ <li>
+ <a href="{@docRoot}shareables/auto/AndroidAuto-media-apps.pdf">
+ User Experience Guidelines: Media Apps</a>
+ </li>
+ <li><a href="{@docRoot}training/managing-audio/index.html">Managing Audio
+ Playback</a></li>
+ <li><a href="{@docRoot}guide/topics/media/exoplayer.html">ExoPlayer</a>
+ </li>
+ </ul>
+
+</div>
+</div>
+
+<a class="notice-developers-video wide"
+href="https://www.youtube.com/watch?v=Q96Sw6v4ULg">
+<div>
+ <h3>Video</h3>
+ <p>Devbytes: Android Auto Audio</p>
+</div>
+</a>
+
+<p>
+ Drivers want to access their music and other audio content on the road. Audio books, podcasts,
+ sports commentary, and recorded talks can make a long trip educational, inspirational, and
+ enjoyable. The Android framework allows you to extend your audio app so users can listen to their
+ favorite tunes and audio content using a simpler, safer user interface.
+</p>
+
+<p>
+ Apps running on mobile devices with Android 5.0 or higher can provide audio services for
+ dashboard systems running Android Auto. By configuring your app with a few settings and
+ implementing a service for accessing music tracks, you can enable Auto devices to discover your
+ app and provide a browse and playback interface for your app's audio content.
+</p>
+
+<p>
+ This class assumes that you have built an app that plays audio through an Android device's
+ integrated speakers or connected headphones. It describes how to extend your app to allow Auto
+ devices to browse your content listings and play it through a car stereo system.
+</p>
+
+
+<h2 id="overview">Provide Audio Services</h2>
+
+<p>
+ Audio apps do not directly control a car dashboard device that runs Android Auto. When the user
+ connects an Android mobile device into a dashboard system, Android Auto discovers your app through
+ manifest entries that indicate what audio services your app can provide. The dashboard system
+ displays a launcher icon for your app as a music provider and the user can choose to use your
+ app's services. If the user launches your app, the Auto device queries your app to see what
+ content is available, displays your content items to the user, and sends requests to your app to
+ control playback with actions such as play, pause, or skip track.
+</p>
+
+<p>To enable your app to provide audio content for Auto devices, you need to:
+</p>
+
+<ul>
+ <li>Configure your app manifest to do the following:</li>
+ <ul>
+ <li>Declare that your app can provide audio content for Auto devices.</li>
+ <li>Define a service that provides a browsable list of your audio tracks.</li>
+ </ul>
+ </li>
+ <li>Build a service that provides audio track listing information extending
+ {@link android.service.media.MediaBrowserService}.</li>
+ <li>Register a {@link android.media.session.MediaSession} object and implement the
+ {@link android.media.session.MediaSession.Callback} object to enable playback controls.</li>
+</ul>
+
+
+<h2 id="config_manifest">Configure Your Manifest</h2>
+
+<p>
+ When a user plugs an Android mobile device into a dashboard device running Auto, the system
+ requests a list of installed apps that include <a href=
+ "{@docRoot}guide/topics/manifest/manifest-intro.html">app manifest</a> entries to indicate they
+ support services for Auto devices and how to access them. This section describes how to configure
+ your app manifest to indicate your app supports audio services for Auto devices, and allow
+ dashboard system to connect with your app.
+</p>
+
+
+<h3 id="manifest-car-app">Declare Auto audio support</h3>
+
+<p>
+ You indicate that your app supports cars capabilities using the following manifest entry:
+</p>
+
+<pre>
+<application>
+ ...
+ <meta-data android:name="com.google.android.gms.car.application"
+ android:resource="@xml/automotive_app_desc"/>
+ ...
+<application>
+</pre>
+
+<p>
+ This manifest entry refers to a secondary XML file, where you declare what Auto capabilities your
+ app supports. For an app that supports audio for cars, add an XML file to the {@code res/xml/}
+ resources directory as {@code automotive_app_desc.xml}, with the following content:
+</p>
+
+<pre>
+<automotiveApp>
+ <uses name="media"/>
+</automotiveApp>
+</pre>
+
+<p>
+ For more information about declaring capabilities for Auto devices, see <a href=
+ "{@docRoot}training/auto/start/index.html#auto-metadata">Getting Started with Auto</a>.
+</p>
+
+
+<h3 id="manifest-service">Declare your media browser service</h3>
+
+<p>
+ Auto devices expect to connect to a service in order to browse audio track
+ listings. You declare this service in your manifest to allow the dashboard system to discover
+ this service and connect to your app.
+</p>
+
+<p>The following code example shows how to declare this listing browser service in your manifest:</p>
+
+<pre>
+<application>
+ ...
+ <service android:name="<em>.MyMediaBrowserService</em>"
+ android:exported="true">
+ <intent-filter>
+ <strong><action android:name=</strong>
+ <strong>"android.media.browse.MediaBrowserService"/></strong>
+ </intent-filter>
+ </service>
+ ...
+<application>
+</pre>
+
+<p>
+ The service your app provides for browsing audio tracks must extend the
+ {@link android.service.media.MediaBrowserService}. The implementation of this service is discussed
+ in the <a href="#implement_browser">Build a Browser Service</a> section.
+</p>
+
+<p class="note">
+ <strong>Note:</strong> Other clients can also contact your app's browser service aside from Auto
+ devices. These media clients might be other apps on a user's mobile device, or they might be other
+ remote clients.
+</p>
+
+<h3 id="manifest-icon">Specify a notification icon</h3>
+
+<p>
+ The Auto user interface shows notifications about your audio app to the user during the course
+ of operation. For example, if the user has a navigation app running, and one song finishes
+ and a new song starts, the Auto device shows the user a notification to indicate the change with
+ an icon from your app. You can specify an icon that is used to represent your app for these
+ notifications using the following manifest declaration:
+</p>
+
+<pre>
+<application>
+ ...
+ <meta-data android:name="com.google.android.gms.car.notification.SmallIcon"
+ android:resource="@drawable/ic_notification" />
+ ...
+<application>
+</pre>
+
+<p class="note"><strong>Note:</strong> The icon you provide should have transparency enabled, so the
+icon's background gets filled in with the app's primary color.</p>
+
+
+<h2 id="implement_browser">Build a Browser Service</h2>
+
+<p>Auto devices interact with your app by contacting its implementation of a
+ {@link android.service.media.MediaBrowserService}, which
+you declare in your app manifest. This service allows Auto devices to find out what content your app
+provides. Connected Auto devices can also query your app's media browser service to contact the
+{@link android.media.session.MediaSession} provided by your app, which handles content playback
+commands.</p>
+
+<p>You create a media browser service by extending the
+{@link android.service.media.MediaBrowserService} class.
+Connected Auto devices can contact your service to do the following:</p>
+
+<ul>
+ <li>Browse your app's content hierarchy, in order to present a menu to the
+ user</li>
+ <li>Get the token for your app's {@link android.media.session.MediaSession}
+ object, in order to control audio playback</li>
+</ul>
+
+
+<h3 id="browser_workflow">Media browser service workflow</h3>
+
+<ol>
+
+<li>When your app's audio services are requested by a user through a connected Auto device, the
+dashboard system contacts your app's media browser service.
+In your implementation of the {@link android.service.media.MediaBrowserService#onCreate()
+onCreate()} method, you must create and register a {@link
+android.media.session.MediaSession} object and its callback object.</li>
+
+<li>The Auto device calls the browser service's {@link
+android.service.media.MediaBrowserService#onGetRoot onGetRoot()} method to get the top node of
+your content hierarchy. The node retrieved by this call is not used as a menu item, it is only used
+to retrieve its child nodes, which are subsequently displayed as the top menu items.
+</li>
+
+<li>Auto invokes the {@link android.service.media.MediaBrowserService#onLoadChildren
+onLoadChildren()} method to get the children of the root node, and uses this information to
+present a menu to the user.</li>
+
+<li>If the user selects a submenu, Auto invokes
+{@link android.service.media.MediaBrowserService#onLoadChildren
+onLoadChildren()} again to retrieve the child nodes of the selected menu item.</li>
+
+<li>If the user begins playback, Auto invokes the appropriate media session
+callback method to perform that action. For more information, see the section about how to
+<a href="#implement_callback">Implement Playback Controls</a>. </li>
+
+</ol>
+
+
+<h3 id="build_hierarchy">Building your content hierarchy</h3>
+
+<p>Auto devices acting as audio clients call your app's {@link
+android.service.media.MediaBrowserService} to find out what content you have
+available. You need to implement two methods in your browser service to support
+this: {@link android.service.media.MediaBrowserService#onGetRoot
+onGetRoot()} and {@link
+android.service.media.MediaBrowserService#onLoadChildren
+onLoadChildren()}.</p>
+
+<p>Each node in your content hierarchy is represented by a {@link
+android.media.browse.MediaBrowser.MediaItem} object. Each of these objects is
+identified by a unique ID string. The client treats these ID strings as
+opaque tokens. When a client wants to browse to a submenu, or play a content
+item, it passes the ID token. Your app is responsible for associating the ID
+token with the appropriate menu node or content item.</p>
+
+<p class="note"><strong>Note:</strong> You should consider providing different content
+hierarchies depending on what client is making the query. In particular, Auto
+applications have strict limits on how large a menu they can display. This is
+intended to prevent distracting the driver, and to make it easy for the driver
+to operate the app via voice commands. For more information on the Auto user
+experience restrictions, see the <a href="{@docRoot}shareables/auto/AndroidAuto-media-apps.pdf">
+Auto Media Apps</a> guidelines.</p>
+
+<p>Your implementation of {@link android.service.media.MediaBrowserService#onGetRoot
+onGetRoot()} returns information about the root node of the menu
+hierarchy. This root node is the parent of the top items your browse hierarchy.
+The method is passed information about the calling client. You can use this
+information to decide if the client should have access to your content at all.
+For example, if you want to limit your app's content to a list of approved
+clients, you can compare the passed {@code clientPackageName} to your whitelist.
+If the caller isn't an approved package, you can return null to deny access to
+your content.</p>
+
+<p>A typical implementation of {@link
+android.service.media.MediaBrowserService#onGetRoot onGetRoot()} might
+look like this:</p>
+
+<pre>
+@Override
+public BrowserRoot onGetRoot(String clientPackageName, int clientUid,
+ Bundle rootHints) {
+
+ // To ensure you are not allowing any arbitrary app to browse your app's
+ // contents, you need to check the origin:
+ if (!PackageValidator.isCallerAllowed(this, clientPackageName, clientUid)) {
+ // If the request comes from an untrusted package, return null.
+ // No further calls will be made to other media browsing methods.
+ LogHelper.w(TAG, "OnGetRoot: IGNORING request from untrusted package "
+ + clientPackageName);
+ return null;
+ }
+ if (ANDROID_AUTO_PACKAGE_NAME.equals(clientPackageName)) {
+ // Optional: if your app needs to adapt ads, music library or anything
+ // else that needs to run differently when connected to the car, this
+ // is where you should handle it.
+ }
+ return new BrowserRoot(MEDIA_ID_ROOT, null);
+}
+</pre>
+
+<p>
+ The Auto device client builds the top-level menu by calling {@link
+ android.service.media.MediaBrowserService#onLoadChildren onLoadChildren()}
+ with the root node object and getting it's children. The client builds
+ submenus by calling the same method with other child nodes. The following
+ example code shows a simple implementation of {@link
+ android.service.media.MediaBrowserService#onLoadChildren onLoadChildren()} method:
+</p>
+
+<pre>
+@Override
+public void onLoadChildren(final String parentMediaId,
+ final Result<List<MediaItem>> result) {
+
+ // Assume for example that the music catalog is already loaded/cached.
+
+ List<MediaBrowser.MediaItem> mediaItems = new ArrayList<>();
+
+ // Check if this is the root menu:
+ if (MEDIA_BROWSER_ROOT.equals(parentMediaId)) {
+
+ // build the MediaItem objects for the top level,
+ // and put them in the <result> list
+ } else {
+
+ // examine the passed parentMediaId to see which submenu we're at,
+ // and put the children of that menu in the <result> list
+ }
+}
+</pre>
+
+
+<h2 id="implement_callback">Enable Playback Control</h2>
+
+<p>
+ Auto devices use {@link android.media.session.MediaSession} objects to pass playback control
+ commands to an app that is providing audio services. Your audio app must create an instance of
+ this object to pass to the dashboard device and implement callback methods to enable remote
+ control of audio playback.
+</p>
+
+<h3 id="registering_mediasession">Register a media session</h3>
+
+<p>An Auto device using your app as audio service needs to obtain a {@link
+android.media.session.MediaSession} object from your app. The Auto device uses the session object
+to send playback commands requested by the Auto user back to your app.</p>
+
+<p>When you initialize your browser service, you register that session object with your {@link
+android.service.media.MediaBrowserService} by calling the {@link
+android.service.media.MediaBrowserService#setSessionToken setSessionToken()} method. This step
+allows clients such as an Auto device to retrieve that object by calling your browser service's
+{@link android.service.media.MediaBrowserService#getSessionToken getSessionToken()} method.</p>
+
+<p>In your browser service's {@link
+android.service.media.MediaBrowserService#onCreate() onCreate()} method,
+create a {@link android.media.session.MediaSession}. You can then query
+the {@link android.media.session.MediaSession} to get its token, and register
+the token with your browser service:</p>
+
+<pre>
+public void onCreate() {
+ super.onCreate();
+
+ ...
+ // Start a new MediaSession
+ MediaSession mSession = new MediaSession(this, "session tag");
+ setSessionToken(mSession.getSessionToken());
+
+ // Set a callback object to handle play control requests, which
+ // implements MediaSession.Callback
+ mSession.setCallback(new MyMediaSessionCallback());
+
+ ...
+</pre>
+
+<p>
+ When you create the media session object, you set a callback object that is used to handle
+ playback control requests. You create this callback object by providing an implementation of the
+ {@link android.media.session.MediaSession.Callback} class for your app. The next section
+ discusses how to implement this object.
+</p>
+
+
+<h3 id="playback-commands">Implement play commands</h3>
+
+<p>When an Auto device requests playback of an audio track from your app, it uses the
+{@link android.media.session.MediaSession.Callback} class from your app's
+{@link android.media.session.MediaSession} object, which it obtained from your app's
+media browse service. When an Auto user wants to play content or control content playback,
+such as pausing play or skipping to the next track, Auto invokes one
+of the callback object's methods.</p>
+
+<p>To handle content playback, your app must extend the abstract {@link
+android.media.session.MediaSession.Callback} class and implement the methods
+that your app supports. The most important callback methods are as follows:</p>
+
+<dl>
+
+<dt>{@link android.media.session.MediaSession.Callback#onPlay onPlay()}</dt>
+<dd>Invoked if the user chooses play without choosing a specific item. Your
+app should play its default content. If playback was paused with
+{@link android.media.session.MediaSession.Callback#onPause onPause()}, your
+app should resume playback.</dd>
+
+<dt>{@link android.media.session.MediaSession.Callback#onPlayFromMediaId
+onPlayFromMediaId()}</dt>
+<dd>Invoked when the user chooses to play a specific item. The method is passed
+the item's media ID, which you assigned to the item in the content
+hierarchy.</dd>
+
+<dt>{@link android.media.session.MediaSession.Callback#onPlayFromSearch
+onPlayFromSearch()}</dt>
+<dd>Invoked when the user chooses to play from a search query. The app should
+make an appropriate choice based on the passed search string.</dd>
+
+<dt>{@link android.media.session.MediaSession.Callback#onPause onPause()}</dt>
+<dd>Pause playback.</dd>
+
+<dt>{@link android.media.session.MediaSession.Callback#onSkipToNext
+onSkipToNext()}</dt>
+<dd>Skip to the next item.</dd>
+
+<dt>{@link android.media.session.MediaSession.Callback#onSkipToPrevious
+onSkipToPrevious()}</dt>
+<dd>Skip to the previous item.</dd>
+
+<dt>{@link android.media.session.MediaSession.Callback#onStop onStop()}</dt>
+<dd>Stop playback.</dd>
+
+</dl>
+
+<p>Your app should override these methods to provide any desired functionality.
+In some cases you might not implement a method if it is not supported by your app.
+For example, if your app plays a live stream (such as a sports
+broadcast), the skip to next function might not make sense. In that case, you
+could simply use the default implementation of
+{@link android.media.session.MediaSession.Callback#onSkipToNext
+onSkipToNext()}.</p>
+
+<p>When your app receives a request to play content, it should play audio the same way it
+would in a non-Auto situation (as if the user was listening through a device speaker
+or connected headphones). The audio content is automatically sent to the dashboard system
+to be played over the car's speakers.</p>
+
+<p>For more information about playing audio content, see
+<a href="{@docRoot}guide/topics/media/mediaplayer.html">Media Playback</a>,
+<a href="{@docRoot}training/managing-audio/index.html">Managing Audio Playback</a>, and
+<a href="{@docRoot}guide/topics/media/exoplayer.html">ExoPlayer</a>.
+
+
+(for example, by using a {@link
+android.media.MediaPlayer} or <a
+href="{@docRoot}guide/topics/media/exoplayer.html">ExoPlayer</a>). If the phone
+is connected to an Auto device, .</p>
diff --git a/docs/html/training/auto/index.jd b/docs/html/training/auto/index.jd
new file mode 100644
index 0000000..26eee32
--- /dev/null
+++ b/docs/html/training/auto/index.jd
@@ -0,0 +1,9 @@
+page.title=Building Apps for Auto
+page.trainingcourse=true
+page.metaDescription=Starting point for building apps for Auto, with guidelines, information, and examples.
+page.image=design/tv/images/focus.png
+@jd:body
+
+
+
+<p>These classes teach you how to build and extend apps to work with Auto devices.</p>
\ No newline at end of file
diff --git a/docs/html/training/auto/messaging/index.jd b/docs/html/training/auto/messaging/index.jd
new file mode 100644
index 0000000..2405d83
--- /dev/null
+++ b/docs/html/training/auto/messaging/index.jd
@@ -0,0 +1,535 @@
+page.title=Providing Messaging for Auto
+page.tags="auto", "car", "automotive", "messaging"
+page.article=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>Dependencies and Prerequisites</h2>
+ <ul>
+ <li>Android 5.0 (API level 21) or higher</li>
+ </ul>
+
+ <h2>This class teaches you to:</h2>
+
+ <ul>
+ <li><a href="#overview">Provide Messaging Services</a></li>
+ <li><a href="#manifest">Configure Your Manifest</a></li>
+ <li><a href="#support-lib">Import Support Library for Messaging</a></li>
+ <li><a href="#messaging">Notify Users of Messages</a></li>
+ <li><a href="#handle_actions">Handle User Actions</a></li>
+ </ul>
+
+ <h2>Related Samples</h2>
+
+ <ul>
+ <li><a href="{@docRoot}samples/MessagingService/index.html">
+ MessagingService</a></li>
+ </ul>
+
+ <h2>See Also</h2>
+
+ <ul>
+ <li><a href="{@docRoot}shareables/auto/AndroidAuto-messaging-apps.pdf">
+ User Experience Guidelines: Messaging Apps</a></li>
+ <li><a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">
+ Notifications</a></li>
+ </ul>
+</div>
+</div>
+
+<a class="notice-developers-video wide"
+ href="https://www.youtube.com/watch?v=gSVLuaOTIPk">
+<div>
+ <h3>Video</h3>
+ <p>DevBytes: Android Auto Messaging</p>
+</div>
+</a>
+
+<p>
+ Staying connected through text messages is important to many drivers. Chat apps can let users
+ know if a child need to be picked up, or if a dinner location has been changed. Apps that provide
+ sports information might tell the user who just won the big game, and let the user ask questions
+ about other games being played. The Android framework enables messaging apps to extend their
+ services into car dashboards using a standard user interface that lets drivers keep their eyes
+ on the road.
+</p>
+
+<p>
+ Apps that support messaging can be extended to pass messaging notifications to Auto
+ dashboard systems, alerting them to new messages and allowing them to respond. You can configure
+ your messaging app to provide these services when an Android mobile device with your app
+ installed is connected to an Auto dashboard. Once connected, your app can provide text
+ information to users and allow them to respond. The Auto dashboard system handles displaying the
+ notification and the interface for replies.
+</p>
+
+<p>
+ This lesson assumes that you have built an app that displays messages to the user and receive the
+ user's replies, such as a chat app. It shows you how to extend your app to hand those messages
+ off to an Auto device for display and replies.
+</p>
+
+
+<h2 id="overview">Provide Messaging Services</h2>
+
+<p>
+ Messaging apps do not run directly on the Android dashboard hardware. They are installed on
+ separate, Android mobile device. When the mobile device is plugged into a dashboard,
+ the installed messaging apps can offer services for viewing and responding to messages
+ through the Auto user interface.
+</p>
+
+<p>To enable your app to provide messaging services for Auto devices:</p>
+
+<ul>
+ <li>Configure your app manifest to indicate that your app provides messaging services which are
+ compatible with Android Auto dashboard devices.
+ </li>
+ <li>Build and send a specific type of <a href=
+ "{@docRoot}guide/topics/ui/notifiers/notifications.html">notification</a> for display on Auto
+ devices.
+ </li>
+ <li>Configure your app to receive {@link android.content.Intent} objects that indicate a user
+ has read or replied to a message.
+</ul>
+
+
+<h2 id="#manifest">Configure Your Manifest</h2>
+
+<p>
+ You configure your app <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a>
+ to indicate that it supports messaging services for Auto devices and handle message actions. This
+ section describes what changes to make to your manifest to support messaging for Auto devices.
+</p>
+
+
+<h3 id="manifest-messaging">Declare Auto messaging support</h3>
+
+<p>
+ When a user connects a Android mobile device to a dashboard running Android, the dashboard
+ device looks for apps that declare support for vehicle services, such as messaging. You indicate
+ that your app supports cars capabilities using the following manifest entry:
+</p>
+
+<pre>
+<application>
+ ...
+ <meta-data android:name="com.google.android.gms.car.application"
+ android:resource="@xml/automotive_app_desc" />
+ ...
+<application>
+</pre>
+
+<p>
+ This manifest entry refers to a secondary xml file, where you declare what Auto capabilities your
+ app supports. For an app that supports messaging for Auto devices, add an xml file to the {@code
+ res/xml/} your app's development project directory as {@code automotive_app_desc.xml}, with the
+ following content:
+</p>
+
+<pre>
+<automotiveApp>
+ <uses name="notification"/>
+</automotiveApp>
+</pre>
+
+<p>
+ For more information about declaring capabilities for Auto devices, see <a href=
+ "{@docRoot}training/auto/start/index.html#auto-metadata">Getting Started with Auto</a>.
+</p>
+
+
+<h3 id="manifest-intent">Define read and reply intent filters</h3>
+
+<p>
+ Auto devices use {@link android.content.Intent} objects that indicate a user has read or replied
+ to a message provided by your app. Your app defines intent types for reading and replying to
+ messages and adds this information to messaging notifications for Auto devices, so that the
+ dashboard system can notify your app when a user takes one of these actions.
+</p>
+
+<p>
+ You define the read action and reply action intents types for your app and the {@link
+ android.content.BroadcastReceiver} classes that handle them in the manifest. The following code
+ example demonstrates how to declare these intents and their associated receivers.
+</p>
+
+<pre>
+<application>
+ ...
+ <receiver android:name="<em>.MyMessageReadReceiver</em>">
+ <intent-filter>
+ <action android:name="<em>com.myapp.messagingservice.ACTION_MESSAGE_HEARD</em>"/>
+ </intent-filter>
+ </receiver>
+
+ <receiver android:name="<em>.MyMessageReplyReceiver</em>">
+ <intent-filter>
+ <action android:name="<em>com.myapp.messagingservice.ACTION_MESSAGE_REPLY</em>"/>
+ </intent-filter>
+ </receiver>
+ ...
+</application>
+</pre>
+
+<p>
+ The definition of the {@link android.content.BroadcastReceiver} classes shown in this example
+ is discussed in <a href="#handle_actions">Handle User Actions</a>.
+</p>
+
+
+<h2 id="support-lib">Import Support Library for Messaging</h3>
+
+<p>
+ Building notifications for use with Auto devices requires classes from the
+ <a href="{@docRoot}tools/support-library/features.html#v4">v4 support library</a>. Use the
+ <a href="{@docRoot}tools/help/sdk-manager.html">Android SDK Manager</a> to update the
+ <em>Extras > Android Support Repository</em> to version 9 or higher and the
+ <em>Extras > Android Support Library</em> to version 21.0.2 or higher.
+</p>
+
+<p>
+ After you have updated the support libraries, import them into your Android Studio development
+ project by adding this dependency to your
+ <a href="{@docRoot}sdk/installing/studio-build.html#configBuild">build.gradle</a> file:
+</p>
+
+<pre>
+dependencies {
+ ...
+ compile 'com.android.support:support-v4:21.0.+'
+}
+</pre>
+
+<p>
+ For information about importing the support library into development projects for other
+ development environments, see <a href="{@docRoot}tools/support-library/setup.html">Support
+ Library Setup</a>.
+</p>
+
+
+
+<h2 id="messaging">Notify Users of Messages</h2>
+
+<p>
+ A messaging app provides messages to a connected Auto dashboard using the <a href=
+ "{@docRoot}guide/topics/ui/notifiers/notifications.html">notifications</a> framework. When your
+ messaging app has a message for a user, you build a specially configured notification that is
+ received by the dashboard system and presented to the user. The Auto device manages the
+ presentation on the dashboard screen and may play the message via text-to-speech. The dashboard
+ system also handles voice interaction if the user replies to a message using verbal input.
+</p>
+
+<p>
+ The messaging user interface for Auto presents users with two levels of information about
+ messages. The first level of notification tells users what <em>conversations</em> are
+ available, and who they are with, but not the content of the messages. Typically, a
+ conversation is one or more messages from another user to the Auto user.
+</p>
+
+<p>
+ The second level of the notification is the actual content of messages in the conversation. If a
+ user indicates they want to hear the messages in a conversation, the Auto user interface plays
+ the messages using text-to-speech.
+</p>
+
+<p>
+ This section describes how to notify Auto users that conversations are available and
+ provide the content of messages in those conversations.
+</p>
+
+
+<h3 id="build_conversation">Build message conversations</h4>
+
+<p>
+ Messaging notifications for Auto organize messages into conversations using the {@link
+ android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation} class,
+ that represents an unread or new
+ portion of a conversation from a particular sender. It contains a list of messages from the
+ sender.
+</p>
+
+<p>
+ Use the {@link android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder} class to create an unread conversation object,
+ as shown in the following example code:
+</p>
+
+<pre>
+// Build a RemoteInput for receiving voice input in a Car Notification
+RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
+ .setLabel(getApplicationContext().getString(R.string.notification_reply))
+ .build();
+
+// Create an unread conversation object to organize a group of messages
+// from a particular sender.
+UnreadConversation.Builder unreadConvBuilder =
+ new UnreadConversation.Builder(participantName)
+ .setReadPendingIntent(msgHeardPendingIntent)
+ .setReplyAction(replyPendingIntent, remoteInput);
+</pre>
+
+<p>
+ This conversation object includes a {@link android.app.PendingIntent}, which allows the Auto
+ device to signal your app that the conversation has been read by the Auto user. The construction
+ of this intent is discussed in the <a href="#conversation-intents">Creating conversation read and
+ reply intents</a> section.
+</p>
+
+<p>
+ If your app supports replying to a conversation, you must call the {@link android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder#setReplyAction setReplyAction()}
+ method and provide a pending intent to pass that user action back to your app. The
+ {@link android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation}
+ object you create must also include a {@link
+ android.support.v4.app.RemoteInput} object. When the Auto user
+ receiving this conversation speaks a reply, the remote input objects lets your app get a text
+ version of the voice reply.
+</p>
+
+
+<h4 id="conversation-messages">Associate messages with conversations</h4>
+
+<p>
+ Messages provided for Auto must be associated with a conversation using the
+ {@link android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation}
+ class. The following code example shows how
+ to associate individual messages with a conversation object.
+</p>
+
+<pre>
+// Note: Add messages from oldest to newest to the UnreadConversation.Builder
+for (Iterator<String> messages = conversation.getMessages().iterator();
+ messages.hasNext(); ) {
+ String message = messages.next();
+ unreadConvBuilder.addMessage(message);
+}
+</pre>
+
+<p>
+ When a new message arrives in a particular conversation, your app should check if there is
+ already a conversation object for that particular conversation. If there is, associate the new
+ message with the existing conversation instead of building a new one.
+</p>
+
+
+<h4 id="conversation-intents">Create conversation read and reply intents</h4>
+
+<p>
+ Unread conversation objects contain intents for reading and replying to a conversation. You
+ create a {@link android.app.PendingIntent} object for each of these actions, so the Auto device
+ can notify your app of action taken by the Auto user on a particular conversation.
+</p>
+
+<p>
+ The following example code demonstrates how to define a {@link android.app.PendingIntent} to let
+ your app know if a conversation was listened to by the Auto user:
+</p>
+
+<pre>
+Intent msgHeardIntent = new Intent()
+ .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
+ .setAction(<em>com.myapp.messagingservice.ACTION_MESSAGE_HEARD</em>)
+ .putExtra("conversation_id", <em>conversationId</em>);
+
+PendingIntent msgHeardPendingIntent =
+ PendingIntent.getBroadcast(getApplicationContext(),
+ <em>conversationId</em>,
+ msgHeardIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+</pre>
+
+<p>
+ In this example, {@code conversationId} is an integer that identifies the current conversation.
+ The value of {@link android.content.Intent#setAction setAction()} is an intent filter identifier for heard messages which is
+ defined in your app manifest, as shown in <a href="#manifest-intent">Define read and reply intent
+ filters</a>.
+</p>
+
+<p>
+ If your app supports replying to conversations, you also create a {@link
+ android.app.PendingIntent} for each conversation to notify your app that the user has replied.
+ The following code example shows you how to build this intent for use with a particular
+ conversation:
+</p>
+
+<pre>
+Intent msgReplyIntent = new Intent()
+ .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
+ .setAction(<em>com.myapp.messagingservice.ACTION_MESSAGE_REPLY</em>)
+ .putExtra("conversation_id", <em>conversationId</em>);
+
+PendingIntent msgReplyPendingIntent = PendingIntent.getBroadcast(
+ getApplicationContext(),
+ <em>conversationId</em>,
+ msgReplyIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+</pre>
+
+<p>
+ Once again, {@code conversationId} is an integer that uniquely identifies this conversation. The
+ value of {@link android.content.Intent#setAction setAction()} is an intent filter identifier for replies which is defined in your
+ app manifest, as shown in <a href="#manifest-intent">Define read and reply intent filters</a>.
+</p>
+
+
+<h3 id="sending_messages">Sending Messages</h4>
+
+<p>
+ When a message arrives for a conversation, you take the following steps to dispatch it as a
+ notification to Auto.
+</p>
+
+<p>First, add the message to the {@link
+android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder}
+for this conversation, and update its timestamp:</p>
+
+<pre>
+unreadConvBuilder.addMessage(<em>messageString</em>)
+ .setLatestTimestamp(<em>currentTimestamp</em>);
+</pre>
+
+<p>Then create a {@link android.support.v4.app.NotificationCompat.Builder}
+object that you'll use to build the actual notification. You'll need to use the
+pending intents you created in the previous step.</p>
+
+<pre>
+NotificationCompat.Builder notificationBuilder =
+ new NotificationCompat.Builder(getApplicationContext())
+ .setSmallIcon(R.drawable.<em>notification_icon</em>)
+ .setLargeIcon(<em>icon_bitmap</em>)
+ .setContentText(<em>messageString</em>)
+ .setWhen(<em>currentTimestamp</em>)
+ .setContentTitle(<em>participant_name</em>)
+ .setContentIntent(msgHeardPendingIntent);
+
+</pre>
+
+<p>You'll also need to extend the {@link
+android.support.v4.app.NotificationCompat.Builder} with the {@link
+android.support.v4.app.NotificationCompat.CarExtender}. This is where you
+actually create the {@link android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation} object using the builder you
+just created, and attach it to the {@link
+android.support.v4.app.NotificationCompat.CarExtender}:</p>
+
+<pre>
+notificationBuilder.extend(new CarExtender()
+ .setUnreadConversation(unreadConvBuilder.build());
+</pre>
+
+<p>Once you've done all this, you use your app's {@link
+android.support.v4.app.NotificationManagerCompat} to send the notification:</p>
+
+<pre>
+NotificationManagerCompat msgNotificationManager =
+ NotificationManagerCompat.from(context);
+msgNotificationManager.notify(<em>notificationId</em>, notificationBuilder.build());
+</pre>
+
+<h2 id="handle_actions">Handle User Actions</h2>
+
+<p>
+ When your create and dispatch a notification for messaging, you specify intents to be triggered
+ when the Auto user hears the message and when the user dictates a reply. Your app indicates to
+ the Android framework that it handles these intends by registering them through it's manifest, as
+ discussed in <a href="#manifest-intent">Define read and reply intent filters</a>.
+</p>
+
+<p>
+ In addition to registering these intent filters, your app must provide code to handle these
+ actions. Your app can do this by providing a service or {@link android.content.BroadcastReceiver}
+ objects that handle these intents.</p>
+
+<p>
+ For more information about intents, see <a href=
+ "{@docRoot}guide/components/intents-filters.html">Intents and Intent Filters</a>.
+</p>
+
+
+<h3 id="handling_msg_heard">Handling a message heard action</h3>
+
+<p>
+ When a user listens to a messaging conversation through the Auto user interface, the dashboard
+ device sends a read intent based on how your app defined the messaging notification. Your app
+ catches that intent and invokes the broadcast receiver class associated with it, or the service
+ method set up to handle that action.
+</p>
+
+<p>
+ The following code example shows how to define a {@link android.content.BroadcastReceiver} class
+ to handle a received message heard intent:
+</p>
+
+<pre>
+public class MessageHeardReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+
+ // If you set up the intent as described in
+ // "Create conversation read and reply intents",
+ // you can get the conversation ID by calling:
+ int conversationId = intent.getIntExtra("conversation_id", -1);
+
+ // Remove the notification to indicate it has been read
+ // and update the list of unread conversations in your app.
+ }
+}
+</pre>
+
+<p>
+ Once a notification is read, your app can remove it by calling
+ {@link android.support.v4.app.NotificationManagerCompat#cancel} with the notification ID.
+ Within your app, you should mark the messages provided in the notification as read.
+</p>
+
+
+<p class="note">
+ <strong>Note:</strong> An alternative to this implementation is to use a service in a
+ {@link android.app.PendingIntent}.
+</p>
+
+
+<h3 id="handling_reply">Handling a reply action</h3>
+
+<p>
+ When a user replies to a messaging conversation through the Auto user interface, the dashboard
+ system sends a reply intent based on how your app defined the messaging notification. Your app
+ catches that intent and invokes the broadcast receiver class associated with it, or the service
+ method set up to handle that action.
+</p>
+
+<p>
+ The following code example shows how to define a {@link android.content.BroadcastReceiver} class
+ to handle a received message reply intent:
+</p>
+
+<pre>
+ public class MessageReplyReceiver extends BroadcastReceiver {
+
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // If you set up the intent as described in
+ // "Create conversation read and reply intents",
+ // you can get the conversation ID by calling:
+ int conversationId = intent.getIntExtra("conversation_id", -1).
+
+ }
+
+ /**
+ * Get the message text from the intent.
+ * Note that you should call
+ * RemoteInput.getResultsFromIntent() to process
+ * the RemoteInput.
+ */
+ private CharSequence getMessageText(Intent intent) {
+ Bundle remoteInput =
+ RemoteInput.getResultsFromIntent(intent);
+ if (remoteInput != null) {
+ return remoteInput.getCharSequence("extra_voice_reply");
+ }
+ return null;
+ }
+
+}</pre>
diff --git a/docs/html/training/auto/start/index.jd b/docs/html/training/auto/start/index.jd
new file mode 100644
index 0000000..8abe5c5
--- /dev/null
+++ b/docs/html/training/auto/start/index.jd
@@ -0,0 +1,211 @@
+page.title=Getting Started with Auto
+page.tags="auto", "car", "automotive"
+page.article=true
+page.image=auto/images/assets/icons/auto_app_in_simulator.png
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>Dependencies and Prerequisites</h2>
+ <ul>
+ <li>Android 5.0 (API level 21) or higher</li>
+ </ul>
+
+ <h2>This class teaches you how to</h2>
+ <ol>
+ <li><a href="#dev-project">Set Up an Auto Project</a></li>
+ <li><a href="#build-it">Build Auto Apps</a></li>
+ <li><a href="#test-it">Run and Test Auto Apps</a></li>
+ </ol>
+
+ <h2>You should also read</h2>
+ <ul>
+ <li><a href="{@docRoot}design/auto/index.html">Designing for Auto</a></li>
+ <li><a href="{@docRoot}training/auto/audio/index.html">Providing Audio Playback with Auto</a></li>
+ <li><a href="{@docRoot}training/auto/messaging/index.html">Providing Messaging for Auto</a></li>
+ </ul>
+</div>
+</div>
+
+<p>Android Auto extends the Android platform into the car. When users connect
+their handheld devices running Android 5.0 or higher to a compatible vehicle,
+the Auto user interface provides a car-optimized Android experience on the
+vehicle's screen. Users interact with compatible apps and services through
+voice actions and the vehicle's input controls (like a touchscreen or dashboard
+buttons).</p>
+
+<p>Auto currently supports two types of apps:</p>
+
+<ul>
+<li><em>Audio apps</em> that allow users to browse and play music and spoken
+audio content in the car.</li>
+<li><em>Messaging apps</em> that receive incoming notifications, read messages
+ aloud via text-to-speech, and send replies via voice input in the car.</li>
+</ul>
+
+<p>You can enable your existing audio and messaging apps developed for
+phones and tablets to work in the car, without having to worry about
+vehicle-specific hardware differences. To enable your app for Auto, your
+app must target Android 5.0 (API level 21) or higher. Your app’s manifest must
+also declare the car capabilities that it uses, such as audio playback or
+messaging services. </p>
+
+<p>This lesson describes how to start building apps for Auto, including
+setting up your development environment and meeting the the minimum requirements
+to enable an app to communicate with Auto.</p>
+
+<p class="note"><strong>Important:</strong> If you are planning to develop
+apps for Auto, you are encouraged to begin enabling and testing your
+apps now. However, Auto-enabled apps cannot be published at this time.
+Join the
+<a href="http://g.co/AndroidAutoDev" class="external-link">Auto
+Developers Google+ community</a> for updates on when you will be able to submit
+your Auto-enabled apps.</p>
+
+<h2 id="dev-project">Set Up an Auto Project</h2>
+<p>This section describes how to create a new app or modify an existing app to
+communicate with Auto.</p>
+
+<h3 id="prerequisites">Prerequisites</h3>
+<p>Before you begin building apps for Auto, you must:</p>
+
+<ul>
+<li><strong><a href="{@docRoot}sdk/installing/create-project.html">Create or
+update your app project</a></strong> - Android 5.0 (API level 21) provides new
+APIs for implementing audio playback and messaging that is compatible with Auto.
+To access the new APIs, create a project or modify an existing project to target
+Android 5.0 (API level 21) or higher. This means you must set the manifest
+<a href="{@docRoot}topics/manifest/uses-sdk-element.html">{@code targetSdkVersion}</a>
+to 21 or higher.
+</li>
+<li><strong><a href="{@docRoot}tools/support-library/setup.html">Install the
+support library</a></strong> - If you are building messaging apps for Auto, you
+need the {@link android.support.v4.app.NotificationCompat.CarExtender} class
+contained in the
+<a href="{@docRoot}tools/support-library/features.html#v4">v4 support library</a>.
+This class allows you to create notifications that are compatible with Auto
+devices.</li>
+</ul>
+
+<h3 id="auto-metadata">Declare Auto capabilities</h3>
+<p>The Auto features that your app can access are controlled
+by the settings in your app manifest and a separate XML configuration file.
+Before adding Auto features to your app, you must first define the Auto
+XML configuration file and add a manifest entry referencing your XML file.</p>
+
+<h4 id="auto_xml">Define the Auto XML configuration file</h4>
+<p>Specify the car capabilities that your app uses in an XML file that you
+place in your project’s resources directory ({@code res/xml/}). For example, to
+extend an audio application for Auto, create a file called
+{@code automotive_app_desc.xml} and store it under your projects’s
+{@code res/xml/} folder. The {@code automotive_app_desc.xml} file contains the
+following metadata:</p>
+<pre>
+<automotiveApp>
+ <uses name="media" />
+</automotiveApp>
+</pre>
+<p>The {@code <uses>} element declares the Auto capability your app
+intends to use. Multiple {@code <uses>} tags can be added if your
+application uses multiple car capabilities. The {@code name} attribute indicates
+the specific capability your app uses. The values supported are:</p>
+<ul>
+<li>{@code media} - The app uses the Android framework APIs to play music in
+a vehicle. Set this value if you are enabling an audio app for Auto.</li>
+<li>{@code notification} - The app displays message notifications in the car’s
+Overview screen, allows users select a message to be read aloud, and lets them
+respond through voice input. Set this value if you are enabling a messaging
+app for Auto.
+</ul>
+
+<h4 id="auto_xml">Add a manifest entry</h4>
+<p>In your app’s manifest ({@code AndroidManifest.xml}), provide a reference to
+the Auto XML configuration file you created in the previous section. Add a
+{@code "com.google.android.gms.car.application"} metadata entry under the
+<a href="{@docRoot}guide/topics/manifest/application-element.html">{@code <application>}</a>
+element that references your Auto XML configuration file. Omit the {@code .xml}
+file extension when specifying the configuration filename.</p>
+<p>The following code snippet shows how to include this reference in your
+manifest.</p>
+<pre>
+<application>
+
+ ...
+ <meta-data android:name="com.google.android.gms.car.application"
+ android:resource="@xml/automotive_app_desc"/>
+
+</application>
+</pre>
+
+<h2 id="build-it">Add Auto Features to Your Apps</h2>
+<p>After you have completed the steps described above, you're ready to add Auto
+features to your apps. See these additional topics to help you build apps for
+Auto:</p>
+
+<ul>
+<li><a href="{@docRoot}training/auto/audio/index.html">Providing Audio Playback for Auto</a>
+- Create apps that let users browse and play music in the car.</li>
+<li><a href="{@docRoot}training/auto/messaging/index.html">Providing Messaging for Auto</a>
+- Enable users to receive and reply to messages in the car.</li>
+</ul>
+
+<p class="caution"><strong>Important:</strong> Google takes driver distraction
+very seriously. There are specific design requirements your app must meet to
+qualify as an Auto app on Google Play. By adhering to these
+requirements, you can reduce the effort for building and testing your app. For
+more information, see
+<a href="{@docRoot}distribute/essentials/quality/auto.html">Auto App Quality</a>.</p>
+
+<h2 id="test-it">Run and Test Auto Apps</h2>
+
+<p>As you prepare to publish your app, make sure that your app looks correct
+when projected on the Auto user interface. Use the Android Media Browser
+simulator and Android Messaging simulators to view and test your audio or
+messaging apps in a screen that looks similar to what is projected on Auto.</p>
+
+<p>To get the simulators, open the
+<a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a> and download
+them from <strong>Extras > Android Auto API Simulators</strong>.</p>
+
+<p>Before you begin testing, compile your app in your development environment.
+Install your app and the Android simulator for the features you want to test
+(that is, audio or messaging) on a physical or virtual device running Android
+5.0 (API level 21) or higher. To check the version of Android on the device, go
+to <strong>Settings > About > Android Version</strong>.</p>
+
+<h3 id="testing-audio-apps">Testing audio apps</h3>
+<p>To run and test audio apps:</p>
+
+<ol>
+<li>Install the Android Media Browser simulator
+({@code media-browser-simulator.apk}) on the test device. You can do this using
+the <a href="{@docRoot}tools/help/adb.html#move">adb</a> command line tool.</li>
+<li>Enable <a href="{@docRoot}tools/device.html#device-developer-options">
+developer options</a> on the test device.</li>
+<li>Install your app on the test device.</li>
+<li>Launch the Android Media Browser simulator to see how your audio app
+appears in Auto. If your app does not appear, stop the simulator from
+<strong>Settings > Apps</strong> then restart it.</li>
+</ol>
+
+<h3 id="testing-messaging-apps">Testing messaging apps</h3>
+<p>To run and test messaging apps:</p>
+
+<ol>
+<li>Install the Android Messaging simulator ({@code messaging-simulator.apk})
+on the test device. You can do this using the
+<a href="{@docRoot}tools/help/adb.html#move">adb</a> command line tool.</li>
+<li>Enable the simulator to read notifications posted on the system:
+<ol type="a">
+ <li>Enable <a href="{@docRoot}tools/device.html#device-developer-options">
+developer options</a> on the test device.</li>
+ <li>Click <strong>Settings > Sounds & Notifications > Notification
+ Access</strong> and check the box labeled
+ <strong>Messaging Simulator</strong>.</li>
+</ol>
+<li>Install your app on the test device.</li>
+<li>Launch the Android Messaging Simulator to see how your messaging app appears
+in Auto. If your app does not appear, stop the simulator from
+<strong>Settings > Apps</strong> then restart it.</li>
+</ol>
diff --git a/docs/html/training/basics/activity-lifecycle/index.jd b/docs/html/training/basics/activity-lifecycle/index.jd
index 127c1c2..afeab86 100644
--- a/docs/html/training/basics/activity-lifecycle/index.jd
+++ b/docs/html/training/basics/activity-lifecycle/index.jd
@@ -1,9 +1,9 @@
page.title=Managing the Activity Lifecycle
+page.tags=activity lifecycle
+helpoutsWidget=true
trainingnavtop=true
startpage=true
-next.title=Launching an Activity
-next.link=starting.html
@jd:body
diff --git a/docs/html/training/basics/activity-lifecycle/pausing.jd b/docs/html/training/basics/activity-lifecycle/pausing.jd
index f656fce..de2c92a 100644
--- a/docs/html/training/basics/activity-lifecycle/pausing.jd
+++ b/docs/html/training/basics/activity-lifecycle/pausing.jd
@@ -1,12 +1,8 @@
page.title=Pausing and Resuming an Activity
-parent.title=Managing the Activity Lifecycle
-parent.link=index.html
+page.tags=activity lifecycle
+helpoutsWidget=true
trainingnavtop=true
-previous.title=Starting an Activity
-previous.link=starting.html
-next.title=Stopping and Restarting an Activity
-next.link=stopping.html
@jd:body
diff --git a/docs/html/training/basics/activity-lifecycle/recreating.jd b/docs/html/training/basics/activity-lifecycle/recreating.jd
index 71fd5dd..a52d5fd 100644
--- a/docs/html/training/basics/activity-lifecycle/recreating.jd
+++ b/docs/html/training/basics/activity-lifecycle/recreating.jd
@@ -1,10 +1,8 @@
page.title=Recreating an Activity
-parent.title=Managing the Activity Lifecycle
-parent.link=index.html
+page.tags=activity lifecycle
+helpoutsWidget=true
trainingnavtop=true
-previous.title=Stopping and Restarting an Activity
-previous.link=stopping.html
@jd:body
diff --git a/docs/html/training/basics/activity-lifecycle/starting.jd b/docs/html/training/basics/activity-lifecycle/starting.jd
index 9046599..2501f38 100644
--- a/docs/html/training/basics/activity-lifecycle/starting.jd
+++ b/docs/html/training/basics/activity-lifecycle/starting.jd
@@ -1,10 +1,8 @@
page.title=Starting an Activity
-parent.title=Managing the Activity Lifecycle
-parent.link=index.html
+page.tags=activity lifecycle
+helpoutsWidget=true
trainingnavtop=true
-next.title=Pausing and Resuming an Activity
-next.link=pausing.html
@jd:body
diff --git a/docs/html/training/basics/activity-lifecycle/stopping.jd b/docs/html/training/basics/activity-lifecycle/stopping.jd
index d56c921..51c95ea 100644
--- a/docs/html/training/basics/activity-lifecycle/stopping.jd
+++ b/docs/html/training/basics/activity-lifecycle/stopping.jd
@@ -1,12 +1,8 @@
page.title=Stopping and Restarting an Activity
-parent.title=Managing the Activity Lifecycle
-parent.link=index.html
+page.tags=activity lifecycle
+helpoutsWidget=true
trainingnavtop=true
-previous.title=Pausing and Resuming an Activity
-previous.link=pausing.html
-next.title=Recreating an Activity
-next.link=recreating.html
@jd:body
diff --git a/docs/html/training/basics/fragments/communicating.jd b/docs/html/training/basics/fragments/communicating.jd
index b30045d..8c1ae21a 100644
--- a/docs/html/training/basics/fragments/communicating.jd
+++ b/docs/html/training/basics/fragments/communicating.jd
@@ -1,4 +1,6 @@
page.title=Communicating with Other Fragments
+page.tags=fragments
+helpoutsWidget=true
trainingnavtop=true
diff --git a/docs/html/training/basics/fragments/creating.jd b/docs/html/training/basics/fragments/creating.jd
index 377adfc..7afb149 100644
--- a/docs/html/training/basics/fragments/creating.jd
+++ b/docs/html/training/basics/fragments/creating.jd
@@ -1,4 +1,6 @@
page.title=Creating a Fragment
+page.tags=fragments
+helpoutsWidget=true
trainingnavtop=true
diff --git a/docs/html/training/basics/fragments/fragment-ui.jd b/docs/html/training/basics/fragments/fragment-ui.jd
index 4fa5b70..1061c15 100644
--- a/docs/html/training/basics/fragments/fragment-ui.jd
+++ b/docs/html/training/basics/fragments/fragment-ui.jd
@@ -1,4 +1,6 @@
page.title=Building a Flexible UI
+page.tags=fragments
+helpoutsWidget=true
trainingnavtop=true
diff --git a/docs/html/training/basics/fragments/index.jd b/docs/html/training/basics/fragments/index.jd
index e78b694..aba6459 100644
--- a/docs/html/training/basics/fragments/index.jd
+++ b/docs/html/training/basics/fragments/index.jd
@@ -1,5 +1,6 @@
page.title=Building a Dynamic UI with Fragments
page.tags=fragments,user interface,support library
+helpoutsWidget=true
trainingnavtop=true
startpage=true
diff --git a/docs/html/training/basics/fragments/support-lib.jd b/docs/html/training/basics/fragments/support-lib.jd
index 1d538af..a1d781b 100644
--- a/docs/html/training/basics/fragments/support-lib.jd
+++ b/docs/html/training/basics/fragments/support-lib.jd
@@ -1,5 +1,6 @@
page.title=Using the Support Library
page.tags=support library
+helpoutsWidget=true
trainingnavtop=true
diff --git a/docs/html/training/basics/intents/filters.jd b/docs/html/training/basics/intents/filters.jd
index 10bf43d..221e31b 100644
--- a/docs/html/training/basics/intents/filters.jd
+++ b/docs/html/training/basics/intents/filters.jd
@@ -1,10 +1,8 @@
page.title=Allowing Other Apps to Start Your Activity
-parent.title=Interacting with Other Apps
-parent.link=index.html
+page.tags=intents
+helpoutsWidget=true
trainingnavtop=true
-previous.title=Getting a Result from an Activity
-previous.link=result.html
@jd:body
diff --git a/docs/html/training/basics/intents/index.jd b/docs/html/training/basics/intents/index.jd
index aa0232a..d584161 100644
--- a/docs/html/training/basics/intents/index.jd
+++ b/docs/html/training/basics/intents/index.jd
@@ -1,5 +1,6 @@
page.title=Interacting with Other Apps
page.tags=intents,activity
+helpoutsWidget=true
trainingnavtop=true
startpage=true
diff --git a/docs/html/training/basics/intents/result.jd b/docs/html/training/basics/intents/result.jd
index 64fbb8b..b521488 100644
--- a/docs/html/training/basics/intents/result.jd
+++ b/docs/html/training/basics/intents/result.jd
@@ -1,12 +1,8 @@
page.title=Getting a Result from an Activity
-parent.title=Interacting with Other Apps
-parent.link=index.html
+page.tags=intents
+helpoutsWidget=true
trainingnavtop=true
-previous.title=Sending the User to Another App
-previous.link=sending.html
-next.title=Allowing Other Apps to Start Your Activity
-next.link=filters.html
@jd:body
diff --git a/docs/html/training/basics/intents/sending.jd b/docs/html/training/basics/intents/sending.jd
index 2a4dae7..4698ba1 100644
--- a/docs/html/training/basics/intents/sending.jd
+++ b/docs/html/training/basics/intents/sending.jd
@@ -1,10 +1,8 @@
page.title=Sending the User to Another App
-parent.title=Interacting with Other Apps
-parent.link=index.html
+page.tags=intents
+helpoutsWidget=true
trainingnavtop=true
-next.title=Getting a Result from an Activity
-next.link=result.html
@jd:body
diff --git a/docs/html/training/basics/supporting-devices/index.jd b/docs/html/training/basics/supporting-devices/index.jd
index 6f339f4..4644c31 100644
--- a/docs/html/training/basics/supporting-devices/index.jd
+++ b/docs/html/training/basics/supporting-devices/index.jd
@@ -1,5 +1,5 @@
page.title=Supporting Different Devices
-page.tags=resources,screens,versions,localization
+page.tags=layouts,resources,screens,localization
trainingnavtop=true
startpage=true
diff --git a/docs/html/training/basics/supporting-devices/languages.jd b/docs/html/training/basics/supporting-devices/languages.jd
index aab1e38..098b556 100644
--- a/docs/html/training/basics/supporting-devices/languages.jd
+++ b/docs/html/training/basics/supporting-devices/languages.jd
@@ -1,11 +1,9 @@
page.title=Supporting Different Languages
parent.title=Supporting Different Devices
-page.tags=localizing,localization,resources,formats,l10n
-parent.link=index.html
+page.tags=strings,localizing,localization,resources,formats,l10n
+helpoutsWidget=true
trainingnavtop=true
-next.title=Supporting Different Screens
-next.link=screens.html
@jd:body
diff --git a/docs/html/training/basics/supporting-devices/platforms.jd b/docs/html/training/basics/supporting-devices/platforms.jd
index 60aaf6a..9890c98 100644
--- a/docs/html/training/basics/supporting-devices/platforms.jd
+++ b/docs/html/training/basics/supporting-devices/platforms.jd
@@ -1,11 +1,9 @@
page.title=Supporting Different Platform Versions
page.metaDescription=Training on how to declare support for minimum and target API levels.
-parent.title=Supporting Different Devices
-parent.link=index.html
+page.tags=styles
+helpoutsWidget=true
trainingnavtop=true
-previous.title=Supporting Different Screens
-previous.link=screens.html
@jd:body
diff --git a/docs/html/training/basics/supporting-devices/screens.jd b/docs/html/training/basics/supporting-devices/screens.jd
index e52ee70..4b54de8 100644
--- a/docs/html/training/basics/supporting-devices/screens.jd
+++ b/docs/html/training/basics/supporting-devices/screens.jd
@@ -1,12 +1,8 @@
page.title=Supporting Different Screens
-parent.title=Supporting Different Devices
-parent.link=index.html
+page.tags=layouts
+helpoutsWidget=true
trainingnavtop=true
-previous.title=Supporting Different Languages
-previous.link=languages.html
-next.title=Supporting Different Platform Versions
-next.link=platforms.html
@jd:body
diff --git a/docs/html/training/location/index.jd b/docs/html/training/location/index.jd
index 249c42d..f0024e2 100644
--- a/docs/html/training/location/index.jd
+++ b/docs/html/training/location/index.jd
@@ -21,7 +21,8 @@
<h2>You should also read</h2>
<ul>
<li>
- <a href="{@docRoot}google/play-services/setup.html">Setup Google Play Services SDK</a>
+ <a href="{@docRoot}google/play-services/setup.html">Set Up Google Play
+ Services SDK</a>
</li>
</ul>
@@ -29,68 +30,75 @@
</div>
<p>
- One of the unique features of mobile applications is location awareness. Mobile users bring
- their devices with them everywhere, and adding location awareness to your app offers users a
- more contextual experience. The new Location Services API available in Google Play services
- facilitates adding location awareness to your app with automated location tracking,
- geofencing, and activity recognition. This API adds significant advantages over the plaform's
- location API.
+ One of the unique features of mobile applications is location awareness.
+ Mobile users take their devices with them everywhere, and adding location
+ awareness to your app offers users a more contextual experience. The location
+ APIs available in Google Play services facilitate adding location awareness to
+ your app with automated location tracking, geofencing, and activity
+ recognition.
</p>
+
+<p>The
+ <a href="{@docRoot}reference/com/google/android/gms/location/package-summary.html">Google
+ Play services location APIs</a> are preferred over the Android framework
+ location APIs
+ (<a href="{@docRoot}reference/android/location/package-summary.html">android.location</a>)
+ as a way of adding location awareness to your app. If you are currently using
+ the Android framework location APIs, you are strongly encouraged to switch to
+ the Google Play services location APIs as soon as possible.
+</p>
+
<p>
- This class shows you how to use Location Services in your app to get the current location,
- get periodic location updates, look up addresses, create and monitor geofences, and
- detect user activities. The class includes sample apps and code snippets that you can use as a
- starting point for adding location awareness to your own app.
+ This class shows you how to use the Google Play services location APIs in your
+ app to get the current location, get periodic location updates, look up
+ addresses, create and monitor geofences, and detect user activities. The class
+ includes sample apps and code snippets that you can use as a starting point
+ for adding location awareness to your app.
</p>
+
<p class="note">
- <strong>Note:</strong> Since this class is based on the Google Play services client library,
- make sure you install the latest version before using the sample apps or code snippets. To learn
- how to set up the client library with the latest version, see
- <a href="{@docRoot}google/play-services/setup.html">Setup</a> in the Google Play services guide.
+ <strong>Note:</strong> Since this class is based on the Google Play services
+ client library, make sure you install the latest version before using the
+ sample apps or code snippets. To learn how to set up the client library with
+ the latest version, see
+ <a href="{@docRoot}google/play-services/setup.html">Setup</a> in the Google
+ Play services guide.
</p>
<h2>Lessons</h2>
<dl>
- <dt>
- <b><a href="retrieve-current.html">Retrieving the Current Location</a></b>
- </dt>
- <dd>
- Learn how to retrieve the user's current location.
- </dd>
- <dt>
- <b><a href="receive-location-updates.html">Receiving Location Updates</a></b>
- </dt>
- <dd>
- Learn how to request and receive periodic location updates.
- </dd>
- <dt>
- <b><a href="display-address.html">Displaying a Location Address</a></b>
- </dt>
- <dd>
- Learn how to convert a location's latitude and longitude into an address (reverse
- geocoding).
- </dd>
- <dt>
- <b>
- <a href="geofencing.html">Creating and Monitoring Geofences</a>
- </b>
- </dt>
- <dd>
- Learn how to define one or more geographic areas as locations of interest, called geofences,
- and detect when the user is close to or inside a geofence.
- </dd>
- <dt>
- <b><a href="activity-recognition.html">Recognizing the User's Current Activity</a></b>
- </dt>
- <dd>
- Learn how to recognize the user's current activity, such as walking, bicycling,
- or driving a car, and how to use this information to modify your app's location strategy.
- </dd>
- <dt>
- <b><a href="location-testing.html">Testing Using Mock Locations</a></b>
- </dt>
- <dd>
- Learn how to test a location-aware app by injecting mock locations into Location
- Services. In mock mode, Location Services sends out mock locations that you inject instead
- of sensor-based locations.
- </dd>
+ <dt>
+ <b><a href="retrieve-current.html">Retrieving the Current Location</a></b>
+ </dt> <dd>
+ Learn how to retrieve the user's current location.
+ </dd> <dt>
+ <b><a href="receive-location-updates.html">Receiving Location
+ Updates</a></b>
+ </dt> <dd>
+ Learn how to request and receive periodic location updates.
+ </dd> <dt>
+ <b><a href="display-address.html">Displaying a Location Address</a></b>
+ </dt> <dd>
+ Learn how to convert a location's latitude and longitude into an address
+ (reverse geocoding).
+ </dd> <dt>
+ <b>
+ <a href="geofencing.html">Creating and Monitoring Geofences</a>
+ </b>
+ </dt> <dd>
+ Learn how to define one or more geographic areas as locations of interest,
+ called geofences, and detect when the user is close to or inside a geofence.
+ </dd> <dt>
+ <b><a href="activity-recognition.html">Recognizing the User's Current
+ Activity</a></b>
+ </dt> <dd>
+ Learn how to recognize the user's current activity, such as walking,
+ bicycling, or driving a car, and how to use this information to modify your
+ app's location strategy.
+ </dd> <dt>
+ <b><a href="location-testing.html">Testing Using Mock Locations</a></b>
+ </dt> <dd>
+ Learn how to test a location-aware app by injecting mock locations into
+ Location Services. In mock mode, Location Services sends out mock locations
+ that you inject instead of sensor-based locations.
+ </dd>
</dl>
diff --git a/docs/html/training/sync-adapters/running-sync-adapter.jd b/docs/html/training/sync-adapters/running-sync-adapter.jd
index 8fb7e80c..194e94b 100644
--- a/docs/html/training/sync-adapters/running-sync-adapter.jd
+++ b/docs/html/training/sync-adapters/running-sync-adapter.jd
@@ -396,13 +396,11 @@
// Account
public static final String ACCOUNT = "default_account";
// Sync interval constants
- public static final long MILLISECONDS_PER_SECOND = 1000L;
public static final long SECONDS_PER_MINUTE = 60L;
public static final long SYNC_INTERVAL_IN_MINUTES = 60L;
public static final long SYNC_INTERVAL =
SYNC_INTERVAL_IN_MINUTES *
- SECONDS_PER_MINUTE *
- MILLISECONDS_PER_SECOND;
+ SECONDS_PER_MINUTE;
// Global variables
// A content resolver for accessing the provider
ContentResolver mResolver;
@@ -419,7 +417,7 @@
ContentResolver.addPeriodicSync(
ACCOUNT,
AUTHORITY,
- null,
+ Bundle.EMPTY,
SYNC_INTERVAL);
...
}
diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs
index 9f06666..7a0e413 100644
--- a/docs/html/training/training_toc.cs
+++ b/docs/html/training/training_toc.cs
@@ -131,7 +131,7 @@
Creating a Fragment
</a>
</li>
- <li><a href="<?cs var:toroot ?>training/basics/fragments/fragment-ui.html">
+ <li><a href="<?cs var:toroot ?>training/basics/fragments/fragment-ui.html" zh-cn-lang="构建灵活的界面">
Building a Flexible UI
</a>
</li>
@@ -939,6 +939,36 @@
<!-- End: Building for TV -->
+ <!-- Start: Building for Auto -->
+ <li class="nav-section">
+ <div class="nav-section-header">
+ <a href="<?cs var:toroot ?>training/auto/index.html">
+ <span class="small">Building Apps for</span><br/>
+ Auto
+ </a>
+ </div>
+ <ul>
+ <li>
+ <a href="<?cs var:toroot ?>training/auto/start/index.html"
+ description="How to start building or extending apps that work
+ with Auto devices.">
+ Getting Started with Auto</a>
+ </li>
+ <li>
+ <a href="<?cs var:toroot ?>training/auto/audio/index.html"
+ description="How to extend audio apps to play content on Auto devices.">
+ Playing Audio for Auto</a>
+ </li>
+ <li>
+ <a href="<?cs var:toroot ?>training/auto/messaging/index.html"
+ description="How to extend text messaging apps to work with Auto devices.">
+ Messaging for Auto</a>
+ </li>
+ </ul>
+ </li>
+ <!-- End: Building for Auto -->
+
+
<li class="nav-section">
<div class="nav-section-header">
<a href="<?cs var:toroot ?>training/best-ux.html">
diff --git a/docs/html/training/wearables/apps/creating.jd b/docs/html/training/wearables/apps/creating.jd
index 018d9f7..683dd31 100644
--- a/docs/html/training/wearables/apps/creating.jd
+++ b/docs/html/training/wearables/apps/creating.jd
@@ -6,6 +6,7 @@
<div id="tb">
<h2>This lesson teaches you to</h2>
<ol>
+ <li><a href="#UpdateSDK">Update Your SDK</a></li>
<li><a href="#SetupEmulator">Set Up an Android Wear Emulator</a></li>
<li><a href="#SetupDevice">Set Up an Android Wear Device</a></li>
<li><a href="#CreateProject">Create a Project</a></li>
@@ -13,7 +14,7 @@
</ol>
<h2>Dependencies and Prerequisites</h2>
<ul>
- <li>Android Studio 0.8 or later and Gradle 0.12 or later</li>
+ <li>Android Studio 0.8.12 or later and Gradle 0.12 or later</li>
</ul>
</div>
</div>
@@ -34,6 +35,24 @@
both your wearable and handheld apps.
</p>
+<h2 id="UpdateSDK">Update Your SDK</h2>
+
+<p>Before you begin building wearable apps, you must:</p>
+
+<ul>
+ <li><strong>Update your SDK tools to version 23.0.0 or higher</strong>
+ <br>
+ The updated SDK tools enable you to build and test wearable apps.
+ </li>
+ <li><strong>Update your SDK with Android 4.4W.2 (API 20) or higher</strong>
+ <br>
+ The updated platform version provides new APIs for wearable apps.
+ </li>
+</ul>
+
+<p>To update your SDK with these components, see
+<a href="{@docRoot}sdk/installing/adding-packages.html#GetTools"> Get the latest SDK tools</a>.</p>
+
<h2 id="SetupEmulator">Set Up an Android Wear Emulator or Device</h2>
<p>We recommend that you develop on real hardware so you can better
@@ -45,29 +64,24 @@
<p>To set up an Android Wear virtual device:</p>
<ol>
<li>Click <b>Tools > Android > AVD Manager</b>.</li>
- <li>Click <b>Create...</b>.</li>
- <li>Fill in the following details for the AVD you want to specify and leave the rest
- of the fields with their default values:
- <ul>
- <li><b>AVD Name</b> - A name for your AVD</li>
- <li><b>Device</b> - Android Wear Round or Square device types</li>
- <li><b>Target</b> - Android 4.4W - API Level 20</li>
- <li><b>CPU/ABI</b> - Android Wear ARM (armeabi-v7a)</li>
- <li><b>Keyboard</b> - Select <b>Hardware keyboard present</b></li>
- <li><b>Skin</b> - AndroidWearRound or AndroidWearSquare depending on the selected device type</li>
- <li><b>Snapshot</b> - Not selected</li>
- <li><b>Use Host GPU</b> - Selected, to support custom activities for wearable notifications</li>
- </ul>
- </li>
- <li>Click <b>OK</b>.</li>
+ <li>Click <b>Create Virtual Device...</b>.</li>
+ <ol>
+ <li>Click <b>Wear</b> in the Category list:</li>
+ <li>Select Android Wear Square or Android Wear Round.</li>
+ <li>Click <b>Next</b>.</li>
+ <li>Select a release name (for example, KitKat Wear).</li>
+ <li>Click <b>Next</b>.</li>
+ <li>(Optional) Change any preferences for your virtual device.</li>
+ <li>Click <b>Finish</b>.</li>
+ </ol>
<li>Start the emulator:
<ol>
<li>Select the virtual device you just created.</li>
- <li>Click <b>Start...</b>, then click <b>Launch</b>.</li>
+ <li>Click the <b>Play</b> button.</li>
<li>Wait until the emulator initializes and shows the Android Wear home screen.</li>
</ol>
</li>
-<li>Pair Your handheld with the emulator:
+<li>Pair your handheld with the emulator:
<ol>
<li>On your handheld, install the Android Wear app from Google Play.</li>
<li>Connect the handheld to your machine through USB.</li>
diff --git a/docs/html/training/wearables/data-layer/accessing.jd b/docs/html/training/wearables/data-layer/accessing.jd
index b7ecf5b..0c0a2d5 100644
--- a/docs/html/training/wearables/data-layer/accessing.jd
+++ b/docs/html/training/wearables/data-layer/accessing.jd
@@ -20,7 +20,7 @@
</div>
</div>
-<p>To call the data layer API, create an instance of
+<p>To call the Data Layer API, create an instance of
<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html"><code>GoogleApiClient</code></a>,
the main entry point for any of the Google Play services APIs.
</p>
@@ -42,7 +42,7 @@
@Override
public void onConnected(Bundle connectionHint) {
Log.d(TAG, "onConnected: " + connectionHint);
- // Now you can use the data layer API
+ // Now you can use the Data Layer API
}
@Override
public void onConnectionSuspended(int cause) {
@@ -71,8 +71,10 @@
href="{@docRoot}google/auth/api-client.html#WearableApi">Access the Wearable API</a>.</p>
<p>Before you use the data layer API, start a connection on your client by calling the
-<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html#connect()">connect()</a>
+<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html#connect()">
+<code>connect()</code></a>
method, as described in
-<a href="{@docRoot}google/auth/api-client.html#Starting">Accessing Google Play services APIs</a>.
-When the system invokes the <code>onConnected()</code> callback for your client, you're ready
-to use the data layer API.</p>
+<a href="{@docRoot}google/auth/api-client.html#Starting">Start a Connection</a>.
+When the system invokes the
+<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.ConnectionCallbacks.html#onConnected(android.os.Bundle)">
+<code>onConnected()</code></a> callback for your client, you're ready to use the Data Layer API.</p>
diff --git a/docs/html/training/wearables/data-layer/assets.jd b/docs/html/training/wearables/data-layer/assets.jd
index 5dc11cb..719ccbc3 100644
--- a/docs/html/training/wearables/data-layer/assets.jd
+++ b/docs/html/training/wearables/data-layer/assets.jd
@@ -16,18 +16,18 @@
<p>
To send large blobs of binary data over the Bluetooth transport, such as images, attach an
-<a href="{@docRoot}reference/com/google/android/gms/wearable/Asset.html">Asset</a> to a
+<a href="{@docRoot}reference/com/google/android/gms/wearable/Asset.html"><code>Asset</code></a> to a
data item and the put the data item into the replicated data store.
</p>
<p>Assets automatically handle caching of data to prevent retransmission and conserve Bluetooth bandwidth.
A common pattern is for a handheld app to download an image, shrink it to an appropriate size
-for display on the wearable, and transmit it to the wearable app as an Asset. The following examples
-demonstrates this pattern.
+for display on the wearable, and transmit it to the wearable app as an asset. The following examples
+demonstrate this pattern.
</p>
-<p class="note"><b>Note:</b> Although the size of data items are limited to 100KB,
-assets can be as large as desired. However, transferring large assets affect the
+<p class="note"><b>Note:</b> Although the size of data items is limited to 100KB,
+assets can be as large as desired. However, transferring large assets affects the
user experience in many cases, so test your apps to ensure that they perform well
if you're transferring large assets.
<p>
@@ -49,7 +49,6 @@
</pre>
<p>When you have an asset, attach it to a data item with the <code>putAsset()</code> method in
-
<a href="{@docRoot}reference/com/google/android/gms/wearable/DataMap.html"><code>DataMap</code></a>
or
<a href="{@docRoot}reference/com/google/android/gms/wearable/PutDataRequest.html"><code>PutDataRequest</code></a>
@@ -77,12 +76,13 @@
.putDataItem(mGoogleApiClient, request);
</pre>
+
<h2 id="ReceiveAsset">Receive assets</h2>
<p>
When an asset is created, you probably want to read and extract
it on other side of the connection. Here's an example of how to implement the
-callback to detect an asset change and extract the Asset:
+callback to detect an asset change and extract the asset:
</p>
<pre>
diff --git a/docs/html/training/wearables/data-layer/data-items.jd b/docs/html/training/wearables/data-layer/data-items.jd
index f843bb67..12babbf 100644
--- a/docs/html/training/wearables/data-layer/data-items.jd
+++ b/docs/html/training/wearables/data-layer/data-items.jd
@@ -15,9 +15,9 @@
</div>
<p>
-A <a href="@{docRoot}reference/com/google/android/gms/wearable/DataItem.html"><code>DataItem</code></a>
+A <a href="{@docRoot}reference/com/google/android/gms/wearable/DataItem.html"><code>DataItem</code></a>
defines the data interface that the system uses to synchronize data between handhelds
-and wearables. A <a href="@{docRoot}reference/com/google/android/gms/wearable/DataItem.html"><code>DataItem</code></a> generally
+and wearables. A <a href="{@docRoot}reference/com/google/android/gms/wearable/DataItem.html"><code>DataItem</code></a> generally
consists of the following items:</p>
<ul>
<li><b>Payload</b> - A byte array, which you can set with whatever data you wish, allowing you
@@ -28,15 +28,15 @@
</ul>
<p>
-You normally don't implement <a href="@{docRoot}reference/com/google/android/gms/wearable/DataItem.html"><code>DataItem</code></a>
+You normally don't implement <a href="{@docRoot}reference/com/google/android/gms/wearable/DataItem.html"><code>DataItem</code></a>
directly. Instead, you:
<ol>
<li>Create a <a href="{@docRoot}reference/com/google/android/gms/wearable/PutDataRequest.html"><code>PutDataRequest</code></a> object,
specifying a string path to uniquely identify the item.
</li>
- <li>Call <a href="{@docRoot}reference/com/google/android/gms/wearable/PutDataRequest.html#setData(byte[])">setData()</a> to set
- the payload.
+ <li>Call <a href="{@docRoot}reference/com/google/android/gms/wearable/PutDataRequest.html#setData(byte[])">
+ <code>setData()</code></a> to set the payload.
</li>
<li>Call <a href="{@docRoot}reference/com/google/android/gms/wearable/DataApi.html#putDataItem(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.PutDataRequest)"><code>DataApi.putDataItem()</code></a> to request the system to create the data item.
</li>
@@ -51,6 +51,7 @@
a data item in an easy-to-use {@link android.os.Bundle}-like interface.
</p>
+
<h2 id="SyncData">Sync Data with a Data Map</h2>
<p>
When possible, use the <a href="{@docRoot}reference/com/google/android/gms/wearable/DataMap.html"><code>DataMap</code></a> class.
@@ -67,7 +68,7 @@
<p class="note"><b>Note:</b> The path string is a unique identifier for the
data item that allows you to access it from either side of the connection. The path must begin
with a forward slash. If you're using hierarchical data in your
-app, you should create a path scheme that matches the structure of the data.
+app, you should create a path scheme that matches the structure of the data.
</p>
</li>
<li>Call
@@ -82,12 +83,12 @@
<li>Call <a href="{@docRoot}reference/com/google/android/gms/wearable/DataApi.html#putDataItem(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.PutDataRequest)"><code>DataApi.putDataItem()</code></a> to request the system to create the data item.
<p class="note"><b>Note:</b>
If the handset and wearable devices are disconnected,
- the data is buffered and and synced when the connection is re-established.
+ the data is buffered and synced when the connection is re-established.
</p>
</li>
</ol>
-<p>The following example shows how to create a data map, set data on it, and create it:</p>
+<p>The following example shows how to create a data map and put data on it:</p>
<pre>
PutDataMapRequest dataMap = PutDataMapRequest.create("/count");
@@ -103,7 +104,7 @@
You can do this by implementing a listener for data item events.
<p>For example, here's what a typical callback looks like to carry out certain actions
-when data changes.</p>
+when data changes:</p>
<pre>
@Override
@@ -120,5 +121,6 @@
<p>
This is just a snippet that requires more implementation details. Learn about
how to implement a full listener service or activity in
-<a href="{@docRoot}training/wearables/data-layer/events.html#Listen">Listening for Data Layer Events</a>.
+<a href="{@docRoot}training/wearables/data-layer/events.html#Listen">Listen for Data Layer
+Events</a>.
</p>
\ No newline at end of file
diff --git a/docs/html/training/wearables/data-layer/events.jd b/docs/html/training/wearables/data-layer/events.jd
index 9196a2c..6a3949a 100644
--- a/docs/html/training/wearables/data-layer/events.jd
+++ b/docs/html/training/wearables/data-layer/events.jd
@@ -14,14 +14,14 @@
</div>
</div>
-<p>When you make calls with the data layer, you can receive the status
+<p>When you make calls to the Data Layer API, you can receive the status
of the call when it completes as well as listen for any changes that
the call ends up making with listeners.
</p>
<h2 id="Wait">Wait for the Status of Data Layer Calls</h2>
-<p>You'll notice that calls to the data layer API sometimes return a
+<p>You'll notice that calls to the Data Layer API sometimes return a
<a href="{@docRoot}reference/com/google/android/gms/common/api/PendingResult.html"><code>PendingResult</code></a>,
such as
<a href="{@docRoot}reference/com/google/android/gms/wearable/DataApi.html#putDataItem(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.PutDataRequest)"><code>putDataItem()</code></a>.
@@ -33,9 +33,9 @@
lets you wait for the result status, either synchronously or asynchronously.
</p>
-<h3 id="async-waiting">Asynchronously waiting</h3>
-<p>If your code is running on the main UI thread, do not making blocking calls
-to the data layer API. You can run the calls asynchronously by adding a callback
+<h3 id="async-waiting">Asynchronous calls</h3>
+<p>If your code is running on the main UI thread, do not make blocking calls
+to the Data Layer API. You can run the calls asynchronously by adding a callback method
to the <a href="{@docRoot}reference/com/google/android/gms/common/api/PendingResult.html"><code>PendingResult</code></a> object,
which fires when the operation is completed:</p>
<pre>
@@ -49,12 +49,14 @@
});
</pre>
-<h3 id="sync-waiting">Synchronously waiting</h3>
+<h3 id="sync-waiting">Synchronous calls</h3>
<p>If your code is running on a separate handler thread in a background service (which is the case
in a <a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html"><code>WearableListenerService</code></a>),
it's fine for the calls to block. In this case, you can call
<a href="{@docRoot}reference/com/google/android/gms/common/api/PendingResult.html#await()"><code>await()</code></a>
-on the PendingResult object, which will block until the request has completed, and return a Result
+on the <a href="{@docRoot}reference/com/google/android/gms/common/api/PendingResult.html"><code>PendingResult</code></a>
+object, which blocks until the request completes and returns a
+<a href="{@docRoot}reference/com/google/android/gms/common/api/Result.html"><code>Result</code></a>
object:
</p>
@@ -82,14 +84,14 @@
</li>
</ul>
-<p>With both these options, you override any of the data event callbacks that you care about
-handling in your implementation.</p>
+<p>With both these options, you override the data event callback methods for the events you
+are interested in handling.</p>
<h3 id="listener-service">With a WearableListenerService</h3>
<p>
You typically create instances of this service in both your wearable and handheld apps. If you
-don't care about data events in one of these apps, then you don't need to implement this
+are not interested in data events in one of these apps, then you don't need to implement this
service in that particular app.</p>
<p>For example, you can have a handheld app that sets and gets data item objects and a wearable app
@@ -107,8 +109,9 @@
- A message sent from one side of a connection triggers this callback on the other side of the connection.</li>
<li><a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html#onMessageReceived(com.google.android.gms.wearable.MessageEvent)"><code>onPeerConnected()</code></a>
and <a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html#onPeerDisconnected(com.google.android.gms.wearable.Node)"><code>onPeerDisconnected()</code></a> -
- Called when connection with the handheld or wearable is connected or disconnected.
- Changes in connection state on one side of the connection triggers these callbacks on both sides of the connection.
+ Called when the connection with the handheld or wearable is connected or disconnected.
+ Changes in connection state on one side of the connection trigger these callbacks on both sides
+ of the connection.
</li>
</ul>
@@ -118,8 +121,8 @@
<li>Create a class that extends
<a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html"><code>WearableListenerService</code></a>.
</li>
- <li>Listen for the events that you care about, such as
- <a href="{@docRoot}/reference/com/google/android/gms/wearable/WearableListenerService.html#onDataChanged(com.google.android.gms.wearable.DataEventBuffer)"><code>onDataChanged()</code></a>.
+ <li>Listen for the events that you're interested in, such as
+ <a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html#onDataChanged(com.google.android.gms.wearable.DataEventBuffer)"><code>onDataChanged()</code></a>.
</li>
<li>Declare an intent filter in your Android manifest to notify the system about your
<a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html"><code>WearableListenerService</code></a>.
@@ -165,7 +168,7 @@
// Get the node id from the host value of the URI
String nodeId = uri.getHost();
- // Set the data of the message to be the bytes of the URI.
+ // Set the data of the message to be the bytes of the URI
byte[] payload = uri.toString().getBytes();
// Send the RPC
@@ -189,7 +192,8 @@
<h4>Permissions within Data Layer Callbacks</h4>
-<p>In order to deliver callbacks to your application for data layer events, Google Play services
+<p>
+To deliver callbacks to your application for data layer events, Google Play services
binds to your <a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html"><code>WearableListenerService</code></a>,
and calls your callbacks via IPC. This has the consequence
that your callbacks inherit the permissions of the calling process.</p>
@@ -233,7 +237,7 @@
<li>Implement the desired interfaces.</li>
<li>In {@link android.app.Activity#onCreate}, create an instance of
<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html"><code>GoogleApiClient</code></a>
-to work with the data layer API.
+to work with the Data Layer API.
<li>
In {@link android.app.Activity#onStart onStart()}, call <a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html#connect()"><code>connect()</code></a> to connect the client to Google Play services.
</li>
@@ -283,7 +287,7 @@
}
}
- @Override
+ @Override
public void onConnected(Bundle connectionHint) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Connected to Google Api Service");
@@ -306,8 +310,8 @@
if (event.getType() == DataEvent.TYPE_DELETED) {
Log.d(TAG, "DataItem deleted: " + event.getDataItem().getUri());
} else if (event.getType() == DataEvent.TYPE_CHANGED) {
- Log.d(TAG, "DataItem changed: " + event.getDataItem().getUri());
+ Log.d(TAG, "DataItem changed: " + event.getDataItem().getUri());
}
}
}
-</pre>
\ No newline at end of file
+</pre>
diff --git a/docs/html/training/wearables/data-layer/index.jd b/docs/html/training/wearables/data-layer/index.jd
index 73d9ee5..8d42ae3 100644
--- a/docs/html/training/wearables/data-layer/index.jd
+++ b/docs/html/training/wearables/data-layer/index.jd
@@ -66,7 +66,7 @@
<h2>Lessons</h2>
<dl>
- <dt><a href="{@docRoot}training/wearables/data-layer/data-items.html">Accessing the Wearable Data Layer</a></dt>
+ <dt><a href="{@docRoot}training/wearables/data-layer/accessing.html">Accessing the Wearable Data Layer</a></dt>
<dd>This lesson shows you how to create a client to access the Data Layer APIs.</dd>
<dt><a href="{@docRoot}training/wearables/data-layer/data-items.html">Syncing Data Items</a></dt>
diff --git a/docs/html/training/wearables/data-layer/messages.jd b/docs/html/training/wearables/data-layer/messages.jd
index b3afacb8..822e395 100644
--- a/docs/html/training/wearables/data-layer/messages.jd
+++ b/docs/html/training/wearables/data-layer/messages.jd
@@ -22,20 +22,16 @@
<li>A path that uniquely identifies the message's action</li>
</ul>
<p>
-Unlike data items, there is no syncing between the handheld and wearable apps.
+Unlike with data items, there is no syncing between the handheld and wearable apps.
Messages are a one-way communication mechanism that's good for remote procedure calls (RPC),
-such as sending a message to the wearable
-to start an activity. You can also use messages in request/response model
-where one side of the connection sends a message, does some work,
-and sends back a response message.</p>
+such as sending a message to the wearable to start an activity.</p>
<h2 id="SendMessage">Send a Message</h2>
<p>The following example shows how to send a message that indicates to the other
-side of the connect to start an activity.
-This call is made synchronously, which blocks until the message
-is received or when the request times out:
-</p>
+side of the connection to start an activity.
+This call is synchronous and blocks processing until the message is received or until the request
+times out:</p>
<p class="note"><b>Note:</b> Read more about asynchronous and synchronous calls
to Google Play services and when to use each in
@@ -61,7 +57,7 @@
<pre>
private Collection<String> getNodes() {
- HashSet <String>results= new HashSet<String>();
+ HashSet <String>results = new HashSet<String>();
NodeApi.GetConnectedNodesResult nodes =
Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
for (Node node : nodes.getNodes()) {
@@ -71,14 +67,17 @@
}
</pre>
-<h2 id="ReceiveMessage">Receiving a Message</h2>
+<h2 id="ReceiveMessage">Receive a Message</h2>
<p>
-
-To be notified of received messages, you implement a listener for message events.
-This example shows how you might do this by checking the <code>START_ACTIVITY_PATH</code>
-that the previous example used to send the message. If this condition is <code>true</code>,
-a specific activity is started.
+To be notified of received messages, you implement the
+<a href="{@docRoot}reference/com/google/android/gms/wearable/MessageApi.MessageListener.html">
+<code>MessageListener</code></a> interface to provide a listener for message events. Then you register your
+listener with the
+<a href="{@docRoot}reference/com/google/android/gms/wearable/MessageApi.html#addListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.MessageApi.MessageListener)">
+<code>MessageApi.addListener()</code></a> method. This example shows how you might implement the listener
+to check the <code>START_ACTIVITY_PATH</code> that the previous example used to send the message.
+If this condition is <code>true</code>, a specific activity is started.
</p>
<pre>
@@ -95,5 +94,6 @@
<p>
This is just a snippet that requires more implementation details. Learn about
how to implement a full listener service or activity in
-<a href="{@docRoot}training/wearables/data-layer/events.html#Listen">Listening for Data Layer Events</a>.
+<a href="{@docRoot}training/wearables/data-layer/events.html#Listen">Listening for Data Layer
+Events</a>.
</p>
\ No newline at end of file
diff --git a/docs/html/wear/index.jd b/docs/html/wear/index.jd
index c372395..27e8098 100644
--- a/docs/html/wear/index.jd
+++ b/docs/html/wear/index.jd
@@ -28,6 +28,8 @@
+
+
<div class="landing-body-content">
<div class="landing-hero-container">
<div class="landing-section wear-hero">
@@ -39,7 +41,7 @@
<div class="col-10">
<div class="landing-section-header">
<div class="landing-h1 hero">Android Wear</div>
- <div class="landing-subhead hero">Information that moves with you</div>
+ <div class="landing-subhead hero">Information that moves with you.</div>
</div>
<div class="landing-hero-description">
@@ -54,6 +56,10 @@
<a href="{@docRoot}training/building-wearables.html" class="landing-button landing-primary" style="margin-top: 40px;">
Get Started
</a>
+ <a href="https://www.youtube.com/watch?v=Bl4Qne-RpcM" class="video-shadowbox-button white"
+ style="margin-left:40px">
+ Watch the Intro Video
+ </a>
</div>
</div>
diff --git a/media/jni/audioeffect/android_media_AudioEffect.cpp b/media/jni/audioeffect/android_media_AudioEffect.cpp
index c9cefbd..c364d469 100644
--- a/media/jni/audioeffect/android_media_AudioEffect.cpp
+++ b/media/jni/audioeffect/android_media_AudioEffect.cpp
@@ -803,28 +803,12 @@
android_media_AudioEffect_native_queryPreProcessings(JNIEnv *env, jclass clazz __unused,
jint audioSession)
{
- // kDefaultNumEffects is a "reasonable" value ensuring that only one query will be enough on
- // most devices to get all active audio pre processing on a given session.
- static const uint32_t kDefaultNumEffects = 5;
-
- effect_descriptor_t *descriptors = new effect_descriptor_t[kDefaultNumEffects];
- uint32_t numEffects = kDefaultNumEffects;
+ effect_descriptor_t *descriptors = new effect_descriptor_t[AudioEffect::kMaxPreProcessing];
+ uint32_t numEffects = AudioEffect::kMaxPreProcessing;
status_t status = AudioEffect::queryDefaultPreProcessing(audioSession,
descriptors,
&numEffects);
- if ((status != NO_ERROR && status != NO_MEMORY) ||
- numEffects == 0) {
- delete[] descriptors;
- return NULL;
- }
- if (status == NO_MEMORY) {
- delete [] descriptors;
- descriptors = new effect_descriptor_t[numEffects];
- status = AudioEffect::queryDefaultPreProcessing(audioSession,
- descriptors,
- &numEffects);
- }
if (status != NO_ERROR || numEffects == 0) {
delete[] descriptors;
return NULL;
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 7d8bc62..d4230f4 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"تظهر شاشاتك المعروضة مؤخرًا هنا"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"إزالة التطبيقات الحديثة"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"شاشة واحدة في العرض العام"</item>
- <item quantity="other" msgid="5523506463832158203">"%d من الشاشات في العرض العام"</item>
+ <item quantity="one" msgid="3969335317929254918">"شاشة واحدة في النظرة عامة"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d من الشاشات في النظرة عامة"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ليس هناك أي اشعارات"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"مستمر"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"رجوع"</string>
<string name="accessibility_home" msgid="8217216074895377641">"الرئيسية"</string>
<string name="accessibility_menu" msgid="316839303324695949">"القائمة"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"العرض العام"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"النظرة عامة"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"بحث"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"الكاميرا"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"الهاتف"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"الإعدادات السريعة."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"شاشة التأمين."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"الإعدادات"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"العرض العام."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"النظرة عامة."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"المستخدم <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"تم إيقاف Wifi."</string>
diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml
index cbcd3dd..43782ea 100644
--- a/packages/SystemUI/res/values-bn-rBD/strings.xml
+++ b/packages/SystemUI/res/values-bn-rBD/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"আপনার সাম্প্রতিক স্ক্রীনগুলো এখানে দেখা যাবে"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"সাম্প্রতিক অ্যাপ্লিকেশানগুলি খারিজ করুন"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"ওভারভিউ-এ ১টি স্ক্রীন"</item>
- <item quantity="other" msgid="5523506463832158203">"ওভারভিউ-এ %dটি স্ক্রীন"</item>
+ <item quantity="one" msgid="3969335317929254918">"এক নজরে-এ ১টি স্ক্রীন"</item>
+ <item quantity="other" msgid="5523506463832158203">"এক নজরে-এ %dটি স্ক্রীন"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"কোনো বিজ্ঞপ্তি নেই"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"চলতে-থাকা"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"ফিরুন"</string>
<string name="accessibility_home" msgid="8217216074895377641">"হোম"</string>
<string name="accessibility_menu" msgid="316839303324695949">"মেনু"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"ওভারভিউ"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"এক নজরে"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"অনুসন্ধান করুন"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"ক্যামেরা"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ফোন"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"দ্রুত সেটিংস৷"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"লক স্ক্রীন।"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"সেটিংস"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ওভারভিউ৷"</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"এক নজরে৷"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ব্যবহারকারী <xliff:g id="USER">%s</xliff:g>৷"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>।"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi বন্ধ হয়েছে।"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index ae87838..ee27139 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Aquí es mostren les teves pantalles recents."</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Omet les aplicacions recents"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 pantalla en la visió general"</item>
- <item quantity="other" msgid="5523506463832158203">"%d pantalles en la visió general"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 pantalla a Visió general"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d pantalles a Visió general"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Cap notificació"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continu"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 71516f1..ccba7f2 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Las pantallas recientes aparecen aquí."</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Rechazar aplicaciones recientes"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 pantalla en Descripción general"</item>
- <item quantity="other" msgid="5523506463832158203">"%d pantallas en Descripción general"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 pantalla en Recientes"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d pantallas en Recientes"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No hay notificaciones"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continuo"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Atrás"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Página principal"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menú"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Descripción general"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Recientes"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Buscar"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Cámara"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Teléfono"</string>
@@ -167,7 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configuración rápida"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla bloqueada"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Configuración"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Descripción general"</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Recientes"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi desactivado"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 1e297de..80eff2a 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Aquí aparecerán tus pantallas recientes"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ignorar aplicaciones recientes"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 pantalla en Información general"</item>
- <item quantity="other" msgid="5523506463832158203">"%d pantallas en Información general"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 pantalla en Visión general"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d pantallas en Visión general"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No tienes notificaciones"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Entrante"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Atrás"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Inicio"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menú"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Información general"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Visión general"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Buscar"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Cámara"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Teléfono"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ajustes rápidos"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla de bloqueo."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Ajustes"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Información general."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visión general."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi desactivado."</string>
@@ -298,7 +298,7 @@
<string name="speed_bump_explanation" msgid="1288875699658819755">"Notificaciones menos urgente abajo"</string>
<string name="notification_tap_again" msgid="8524949573675922138">"Vuelve a tocar para abrir"</string>
<string name="keyguard_unlock" msgid="8043466894212841998">"Desliza el dedo hacia arriba para desbloquear"</string>
- <string name="phone_hint" msgid="3101468054914424646">"Desliza el dedo hacia la izquierda para acceder al teléfono"</string>
+ <string name="phone_hint" msgid="3101468054914424646">"Desliza el dedo hacia la derecha para acceder al teléfono"</string>
<string name="camera_hint" msgid="5241441720959174226">"Desliza el dedo hacia la izquierda para acceder a la cámara"</string>
<string name="interruption_level_none" msgid="3831278883136066646">"Nada"</string>
<string name="interruption_level_priority" msgid="6517366750688942030">"Prioridad"</string>
diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml
index cf609e6..2413994 100644
--- a/packages/SystemUI/res/values-et-rEE/strings.xml
+++ b/packages/SystemUI/res/values-et-rEE/strings.xml
@@ -27,7 +27,7 @@
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Loobu hiljutistest rakendustest"</string>
<plurals name="status_bar_accessibility_recent_apps">
<item quantity="one" msgid="3969335317929254918">"1 ekraan jaotises Ülevaade"</item>
- <item quantity="other" msgid="5523506463832158203">"%d ekraani jaotises Ülevaade"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d ekraanikuva jaotises Ülevaade"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Teatisi pole"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Jätkuv"</string>
diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml
index ae0ae53..bd87668 100644
--- a/packages/SystemUI/res/values-eu-rES/strings.xml
+++ b/packages/SystemUI/res/values-eu-rES/strings.xml
@@ -301,7 +301,7 @@
<string name="phone_hint" msgid="3101468054914424646">"Telefonoa irekitzeko, pasatu hatza eskuinera."</string>
<string name="camera_hint" msgid="5241441720959174226">"Kamera irekitzeko, pasatu hatza ezkerrera."</string>
<string name="interruption_level_none" msgid="3831278883136066646">"Bat ere ez"</string>
- <string name="interruption_level_priority" msgid="6517366750688942030">"Lehentasuna"</string>
+ <string name="interruption_level_priority" msgid="6517366750688942030">"Lehentas."</string>
<string name="interruption_level_all" msgid="1330581184930945764">"Guztiak"</string>
<string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Kargatzen (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> guztiz kargatu arte)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Aldatu erabiltzailea"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 9a51767..01b936a 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Äskettäin käytetyt ruudut näkyvät tässä"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Hylkää viimeaikaiset sovellukset"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 näyttö Yleistä-kohdassa"</item>
- <item quantity="other" msgid="5523506463832158203">"%d näyttöä Yleistä-kohdassa"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 näyttö Viimeisimmät-kohdassa"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d näyttöä Viimeisimmät-kohdassa"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ei ilmoituksia"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Käynnissä olevat"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Takaisin"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Aloituspainike"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Valikko"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Yleistä"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Viimeisimmät"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Haku"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Puhelin"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Pika-asetukset."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lukitse näyttö."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Asetukset"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Yleistä."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Viimeisimmät."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Käyttäjä: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi poistettiin käytöstä."</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index a0271a0..5440453 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Vos écrans récents s\'affichent ici"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Masquer les applications récentes"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"Aperçu d\'1 écran"</item>
- <item quantity="other" msgid="5523506463832158203">"Aperçu de %d écrans"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 écran dans Aperçu"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d écrans dans Aperçu"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Aucune notification"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En cours"</string>
@@ -167,7 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Paramètres rapides"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Écran de verrouillage"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Paramètres"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Aperçu."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Aperçu"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilisateur : <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi désactivé"</string>
@@ -305,7 +305,7 @@
<string name="interruption_level_none" msgid="3831278883136066646">"Aucun"</string>
<string name="interruption_level_priority" msgid="6517366750688942030">"Priorité"</string>
<string name="interruption_level_all" msgid="1330581184930945764">"Tous"</string>
- <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Charge en cours... (chargée à 100 % dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
+ <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Charge en cours... (chargée à 100 %% dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Changer d\'utilisateur"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Changer d\'utilisateur (utilisateur actuel <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>)"</string>
<string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"Afficher le profil"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 36436b7..b7825df 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Vos écrans récents s\'affichent ici"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Masquer les applications récentes"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 écran dans la vue d\'ensemble"</item>
- <item quantity="other" msgid="5523506463832158203">"%d écrans dans la vue d\'ensemble"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 écran dans Aperçu"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d écrans dans Aperçu"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Aucune notification"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En cours"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Retour"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Accueil"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Vue d\'ensemble"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Aperçu"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Rechercher"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Appareil photo"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Téléphoner"</string>
@@ -167,7 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Paramètres rapides"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Écran de verrouillage"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Paramètres"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Vue d\'ensemble"</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Aperçu"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilisateur <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi désactivé."</string>
diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml
index fdea6ab..51f0d57 100644
--- a/packages/SystemUI/res/values-gl-rES/strings.xml
+++ b/packages/SystemUI/res/values-gl-rES/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"As túas pantallas recentes aparecen aquí"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Rexeitar aplicacións recentes"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 pantalla en Vista xeral"</item>
- <item quantity="other" msgid="5523506463832158203">"%d pantallas en Vista xeral"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 pantalla en Visión xeral"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d pantallas en Visión xeral"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Non hai notificacións"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En curso"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Volver"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Inicio"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menú"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Vista xeral"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Visión xeral"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Buscar"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Cámara"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Teléfono"</string>
@@ -167,7 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configuración rápida"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla de bloqueo."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Configuración"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Vista xeral."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visión xeral."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi desactivada."</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 285ff07..962bcac 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"आपकी हाल की स्क्रीन यहां दिखाई देती हैं"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"हाल ही के ऐप्स खारिज करें"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"ओवरव्यू मेें 1 स्क्रीन"</item>
- <item quantity="other" msgid="5523506463832158203">"ओवरव्यू में %d स्क्रीन"</item>
+ <item quantity="one" msgid="3969335317929254918">"अवलोकन मेें 1 स्क्रीन"</item>
+ <item quantity="other" msgid="5523506463832158203">"अवलोकन में %d स्क्रीन"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"कोई नोटिफिकेशन नहीं"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ऑनगोइंग"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"वापस जाएं"</string>
<string name="accessibility_home" msgid="8217216074895377641">"होम"</string>
<string name="accessibility_menu" msgid="316839303324695949">"मेनू"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"ओवरव्यू"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"अवलोकन"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"खोजें"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"कैमरा"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"फ़ोन"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"त्वरित सेटिंग."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"लॉक स्क्रीन."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"सेटिंग"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ओवरव्यू."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"अवलोकन."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"उपयोगकर्ता <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"वाई-फ़ाई को बंद किया गया."</string>
diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml
index f1bdd6d..1305a61 100644
--- a/packages/SystemUI/res/values-hy-rAM/strings.xml
+++ b/packages/SystemUI/res/values-hy-rAM/strings.xml
@@ -214,7 +214,7 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Մաքրել բոլոր ծանուցումները:"</string>
<string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Ծանուցման կարգավորումներ"</string>
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g>-ի կարգավորումներ"</string>
- <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Էկրանը ինքնուրույն կպտտվի:"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Էկրանը ինքնաշխատ կպտտվի:"</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Էկրանը կողպված է հորիզոնական դիրքավորման մեջ:"</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Էկրանը կողպված է ուղղաձիգ դիրքավորմամբ:"</string>
<string name="accessibility_rotation_lock_off_changed" msgid="8134601071026305153">"Էկրանն այժմ ավտոմատ կպտտվի:"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index c6abebe..8f750df 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Layar terkini Anda muncul di sini"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Tutup aplikasi terbaru"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 layar dalam Ikhtisar"</item>
- <item quantity="other" msgid="5523506463832158203">"%d layar dalam Ikhtisar"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 layar dalam Ringkasan"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d layar dalam Ringkasan"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Tidak ada pemberitahuan"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Berkelanjutan"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Kembali"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Utama"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Ikhtisar"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Ringkasan"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Telusuri"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Telepon"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Setelan cepat."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Layar kunci."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Setelan"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ikhtisar."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ringkasan."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Pengguna <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi dinonaktifkan."</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index a1a5368..24fd627 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"ここに最近の画面が表示されます"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"最近使ったアプリをクリア"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"[概要]に1個の画面があります"</item>
- <item quantity="other" msgid="5523506463832158203">"[概要]に%d個の画面があります"</item>
+ <item quantity="one" msgid="3969335317929254918">"[最近]に1個の画面があります"</item>
+ <item quantity="other" msgid="5523506463832158203">"[最近]に%d個の画面があります"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"通知なし"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"実行中"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"戻る"</string>
<string name="accessibility_home" msgid="8217216074895377641">"ホーム"</string>
<string name="accessibility_menu" msgid="316839303324695949">"メニュー"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"概要"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"最近"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"検索"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"カメラ"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"電話"</string>
@@ -167,7 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"クイック設定"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ロック画面"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"設定"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"概要です。"</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"最近"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ユーザー: <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-FiをOFFにしました。"</string>
diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml
index 264be48..6aa666a 100644
--- a/packages/SystemUI/res/values-km-rKH/strings.xml
+++ b/packages/SystemUI/res/values-km-rKH/strings.xml
@@ -69,7 +69,7 @@
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"កំពុងរក្សាទុករូបថតអេក្រង់…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"កំពុងរក្សាទុករូបថតអេក្រង់..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"រូបថតអេក្រង់កំពុងត្រូវបានរក្សាទុក។"</string>
- <string name="screenshot_saved_title" msgid="6461865960961414961">"បានចាប់យករូបថតអេក្រង់។"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"បានចាប់យករូបថតអេក្រង់។"</string>
<string name="screenshot_saved_text" msgid="1152839647677558815">"ប៉ះ ដើម្បីមើលរូបថតអេក្រង់របស់អ្នក។"</string>
<string name="screenshot_failed_title" msgid="705781116746922771">"មិនអាចចាប់យករូបថតអេក្រង់។"</string>
<string name="screenshot_failed_text" msgid="1260203058661337274">"មិនអាចថតអេក្រង់ដោយសារតែទំហំផ្ទុកមានដែនកំណត់ ឬវាមិនត្រូវបានអនុញ្ញាតដោយកម្មវិធី ឬស្ថាប័នរបស់អ្នក។"</string>
@@ -152,7 +152,7 @@
<string name="accessibility_remove_notification" msgid="3603099514902182350">"សម្អាតការជូនដំណឹង។"</string>
<string name="accessibility_gps_enabled" msgid="3511469499240123019">"បានបើក GPS ។"</string>
<string name="accessibility_gps_acquiring" msgid="8959333351058967158">"ទទួល GPS ។"</string>
- <string name="accessibility_tty_enabled" msgid="4613200365379426561">"បានបើកម៉ាស៊ីនអង្គុលីលេខ"</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"បានបើកម៉ាស៊ីនអង្គុលីលេខ"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"កម្មវិធីរោទ៍ញ័រ។"</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"កម្មវិធីរោទ៍ស្ងាត់។"</string>
<!-- no translation found for accessibility_casting (6887382141726543668) -->
@@ -236,7 +236,7 @@
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"បញ្ឈរ"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"ទេសភាព"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"វិធីសាស្ត្របញ្ចូល"</string>
- <string name="quick_settings_location_label" msgid="5011327048748762257">"ទីតាំង"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ទីតាំង"</string>
<string name="quick_settings_location_off_label" msgid="7464544086507331459">"ទីតាំងបានបិទ"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"ឧបករណ៍មេឌៀ"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
@@ -280,11 +280,11 @@
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"ចាក់សោទៅកម្មវិធី"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ស្វែងរក"</string>
<string name="recents_launch_error_message" msgid="2969287838120550506">"មិនអាចចាប់ផ្ដើម <xliff:g id="APP">%s</xliff:g> ទេ។"</string>
- <string name="expanded_header_battery_charged" msgid="5945855970267657951">"បានបញ្ចូលថ្ម"</string>
+ <string name="expanded_header_battery_charged" msgid="5945855970267657951">"បានបញ្ចូលថ្ម"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"កំពុងបញ្ចូលថ្ម"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> រហូតដល់ពេញ"</string>
<string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"មិនកំពុងបញ្ចូលថ្ម"</string>
- <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"បណ្ដាញអាច\nត្រូវបានត្រួតពិនិត្យ"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"បណ្ដាញអាច\nត្រូវបានត្រួតពិនិត្យ"</string>
<string name="description_target_search" msgid="3091587249776033139">"ស្វែងរក"</string>
<string name="description_direction_up" msgid="7169032478259485180">"រុញឡើងលើដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
<string name="description_direction_left" msgid="7207478719805562165">"រុញទៅឆ្វេងដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml
index c4f5731..83699b1 100644
--- a/packages/SystemUI/res/values-kn-rIN/strings.xml
+++ b/packages/SystemUI/res/values-kn-rIN/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಪರದೆಗಳು ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ವಜಾಗೊಳಿಸು"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"ಅವಲೋಕನದಲ್ಲಿರುವ 1 ಪರದೆ"</item>
- <item quantity="other" msgid="5523506463832158203">"ಅವಲೋಕನದಲ್ಲಿರುವ %d ಪರದೆಗಳು"</item>
+ <item quantity="one" msgid="3969335317929254918">"ಸಮಗ್ರ ನೋಟದಲ್ಲಿರುವ 1 ಪರದೆ"</item>
+ <item quantity="other" msgid="5523506463832158203">"ಸಮಗ್ರ ನೋಟದಲ್ಲಿರುವ %d ಪರದೆಗಳು"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ಯಾವುದೇ ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"ಹಿಂದೆ"</string>
<string name="accessibility_home" msgid="8217216074895377641">"ಮುಖಪುಟ"</string>
<string name="accessibility_menu" msgid="316839303324695949">"ಮೆನು"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"ಅವಲೋಕನ"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"ಸಮಗ್ರ ನೋಟ"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"ಹುಡುಕು"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"ಕ್ಯಾಮರಾ"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ಫೋನ್"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ಲಾಕ್ ಪರದೆ."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ಅವಲೋಕನ."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ಸಮಗ್ರ ನೋಟ."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ಬಳಕೆದಾರ <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ವೈಫೈ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index d40a7e13..460837e 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"여기에 최근 화면이 표시됩니다."</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"최근에 사용한 앱 숨기기"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"개요에 화면 1개"</item>
- <item quantity="other" msgid="5523506463832158203">"개요에 화면 %d개"</item>
+ <item quantity="one" msgid="3969335317929254918">"최근 사용에 화면 1개"</item>
+ <item quantity="other" msgid="5523506463832158203">"최근 사용에 화면 %d개"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"알림 없음"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"진행 중"</string>
@@ -82,7 +82,7 @@
<string name="accessibility_back" msgid="567011538994429120">"뒤로"</string>
<string name="accessibility_home" msgid="8217216074895377641">"홈"</string>
<string name="accessibility_menu" msgid="316839303324695949">"메뉴"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"개요"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"최근 사용"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"검색"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"카메라"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"전화"</string>
@@ -167,7 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"빠른 설정"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"화면을 잠급니다."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"설정"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"개요"</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"최근 사용"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"사용자 <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi가 사용 중지되었습니다."</string>
diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml
index fa634ae..95159c8 100644
--- a/packages/SystemUI/res/values-lo-rLA/strings.xml
+++ b/packages/SystemUI/res/values-lo-rLA/strings.xml
@@ -314,7 +314,7 @@
<string name="guest_exit_guest" msgid="7187359342030096885">"ລຶບແຂກ"</string>
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"ລຶບແຂກບໍ?"</string>
<string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"ແອັບຯແລະຂໍ້ມູນທັງໝົດໃນເຊດຊັນນີ້ຈະຖືກລຶບອອກ."</string>
- <string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"ລຶບ"</string>
+ <string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"ລຶບ"</string>
<string name="guest_wipe_session_title" msgid="6419439912885956132">"ຍິນດີຕ້ອນຮັບກັບມາ, ຜູ່ຢ້ຽມຢາມ!"</string>
<string name="guest_wipe_session_message" msgid="8476238178270112811">"ທ່ານຕ້ອງການສືບຕໍ່ເຊດຊັນຂອງທ່ານບໍ່?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ເລີ່ມຕົ້ນໃຫມ່"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 793c4b6..79522ca 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -199,7 +199,7 @@
<string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobiliojo ryšio viešosios interneto prieigos taškas išjungtas."</string>
<string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"Mobiliojo ryšio viešosios interneto prieigos taškas įjungtas."</string>
<string name="accessibility_casting_turned_off" msgid="1430668982271976172">"Ekrano perdavimas sustabdytas."</string>
- <string name="accessibility_brightness" msgid="8003681285547803095">"Ekrano ryškumas"</string>
+ <string name="accessibility_brightness" msgid="8003681285547803095">"Ekrano šviesumas"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="2626865386971800302">"2G–3G duomenys išjungti"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4629078114195977196">"4G duomenys išjungti"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="5793456071535876132">"Mobiliojo ryšio duomenys išjungti"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 7609e7f..1f5eaef 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Jūsu pēdējie ekrāni tiek rādīti šeit."</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Nerādīt nesen izmantotās lietotnes"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 ekrāns sadaļā “Kopsavilkums”"</item>
- <item quantity="other" msgid="5523506463832158203">"%d ekrāni sadaļā “Kopsavilkums”"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 ekrāns sadaļā “Pārskats”"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d ekrāni sadaļā “Pārskats”"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nav paziņojumu"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Notiekošs"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Atpakaļ"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Sākums"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Izvēlne"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Kopsavilkums"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Pārskats"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Meklēt"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Tālruņa numurs"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ātrie iestatījumi"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Bloķēšanas ekrāns."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Iestatījumi"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Kopsavilkums."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Pārskats."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Lietotājs: <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi ir izslēgts."</string>
diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml
index ddcf381..4a2d80a 100644
--- a/packages/SystemUI/res/values-ml-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ml-rIN/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"നിങ്ങളുടെ പുതിയ സ്ക്രീനുകൾ ഇവിടെ ദൃശ്യമാകുന്നു"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"സമീപകാല അപ്ലിക്കേഷനുകൾ നിരസിക്കുക"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"ചുരുക്കവിവരണത്തിലെ ഒരു സ്ക്രീൻ"</item>
- <item quantity="other" msgid="5523506463832158203">"ചുരുക്കവിവരണത്തിലെ %d സ്ക്രീനുകൾ"</item>
+ <item quantity="one" msgid="3969335317929254918">"കാഴ്ചയിലെ ഒരു സ്ക്രീൻ"</item>
+ <item quantity="other" msgid="5523506463832158203">"കാഴ്ചയിലെ %d സ്ക്രീനുകൾ"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"അറിയിപ്പുകൾ ഒന്നുമില്ല"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"നടന്നുകൊണ്ടിരിക്കുന്നവ"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"മടങ്ങുക"</string>
<string name="accessibility_home" msgid="8217216074895377641">"ഹോം"</string>
<string name="accessibility_menu" msgid="316839303324695949">"മെനു"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"ചുരുക്കവിവരണം"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"കാഴ്ച"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"തിരയൽ"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"ക്യാമറ"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ഫോണ്"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ദ്രുത ക്രമീകരണങ്ങൾ."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ലോക്ക് സ്ക്രീൻ."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ക്രമീകരണങ്ങൾ"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ചുരുക്കവിവരണം."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"കാഴ്ച."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ഉപയോക്താവ് <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"വൈഫൈ ഓഫാക്കി."</string>
diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml
index 5dcae4f..8eee0a3 100644
--- a/packages/SystemUI/res/values-ms-rMY/strings.xml
+++ b/packages/SystemUI/res/values-ms-rMY/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Skrin terbaru anda terpapar di sini"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Buang aplikasi terbaharu"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 skrin dalam Gambaran Keseluruhan"</item>
- <item quantity="other" msgid="5523506463832158203">"%d skrin dalam Gambaran Keseluruhan"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 skrin dalam Ikhtisar"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d skrin dalam Ikhtisar"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Tiada pemberitahuan"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Sedang berlangsung"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Kembali"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Rumah"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Gambaran keseluruhan"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Ikhtisar"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Cari"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Tetapan pantas."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Kunci skrin."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Tetapan"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Gambaran keseluruhan."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ikhtisar."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Pengguna <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi dimatikan."</string>
diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml
index b4f832c..5bf1808 100644
--- a/packages/SystemUI/res/values-my-rMM/strings.xml
+++ b/packages/SystemUI/res/values-my-rMM/strings.xml
@@ -26,37 +26,37 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"သင်၏ မကြာမီက မျက်နှာပြင်များ ဒီမှာ ပေါ်လာကြမည်"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"လတ်တလောအပ်ပလီကေးရှင်းများအား ဖယ်ထုတ်မည်"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"ခြုံကြည့်မှု ထဲက မျက်နှာပြင် ၁ ခု"</item>
- <item quantity="other" msgid="5523506463832158203">"ခြုံကြည့်မှု ထဲက မျက်နှာပြင် %d ခု"</item>
+ <item quantity="one" msgid="3969335317929254918">"ခြုံကြည့်မှု ထဲက မျက်နှာပြင် ၁ ခု"</item>
+ <item quantity="other" msgid="5523506463832158203">"ခြုံကြည့်မှု ထဲက မျက်နှာပြင် %d ခု"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"အကြောင်းကြားချက်များ မရှိ"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"လက်ရှိအသုံးပြုမှု"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"အကြောင်းကြားချက်များ။"</string>
<string name="battery_low_title" msgid="6456385927409742437">"ဘက်ထရီ အားနည်းနေ"</string>
<string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> ကျန်ရှိသည်"</string>
- <string name="battery_low_percent_format_saver_started" msgid="6534746636002666456">"<xliff:g id="NUMBER">%d%%</xliff:g> ကျန်နေ။ ဘက်ထရီ ချွေတာသူ ဖွင့်ထား။"</string>
+ <string name="battery_low_percent_format_saver_started" msgid="6534746636002666456">"<xliff:g id="NUMBER">%d%%</xliff:g> ကျန်နေ။ ဘက်ထရီ ချွေတာသူ ဖွင့်ထား။"</string>
<string name="invalid_charger" msgid="4549105996740522523">"လက်ရှိUSBအားသွင်းခြင်း အသုံးမပြုနိုင်ပါ \n ပေးထားသောအားသွင်းကိရိယာကိုသာ အသုံးပြုပါ"</string>
<string name="invalid_charger_title" msgid="3515740382572798460">"USB အားသွင်းမှု မပံ့ပိုးပါ။"</string>
- <string name="invalid_charger_text" msgid="5474997287953892710">"ပေးခဲ့သည့် အားသွင်းစက်ကိုသာ အသုံးပြုပါ"</string>
+ <string name="invalid_charger_text" msgid="5474997287953892710">"ပေးခဲ့သည့် အားသွင်းစက်ကိုသာ အသုံးပြုပါ"</string>
<string name="battery_low_why" msgid="4553600287639198111">"ဆက်တင်များ"</string>
- <string name="battery_saver_confirmation_title" msgid="5299585433050361634">"ဘက်ထရီ ချွေတာမှုကို ဖွင့်ရမလား?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ဖွင့်ရန်"</string>
- <string name="battery_saver_start_action" msgid="5576697451677486320">"ဘက်ထရီ ချွေတာမှုကို ဖွင့်ရန်"</string>
+ <string name="battery_saver_confirmation_title" msgid="5299585433050361634">"ဘက်ထရီ ချွေတာမှုကို ဖွင့်ရမလား?"</string>
+ <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ဖွင့်ရန်"</string>
+ <string name="battery_saver_start_action" msgid="5576697451677486320">"ဘက်ထရီ ချွေတာမှုကို ဖွင့်ရန်"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"အပြင်အဆင်များ"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"ဝိုင်ဖိုင်"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်"</string>
- <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"မျက်နှာပြင်အလိုအလျောက်လှည့်ရန်"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"မျက်နှာပြင်အလိုအလျောက်လှည့်ရန်"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"သတိပေးချက်များ"</string>
- <string name="bluetooth_tethered" msgid="7094101612161133267">"ဘလူးတုသ်မှတဆင့်ပြန်လည်ချိတ်ဆက်ခြင်း"</string>
- <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ထည့်သွင်းနည်းများ သတ်မှတ်ခြင်း"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"ဘလူးတုသ်မှတဆင့်ပြန်လည်ချိတ်ဆက်ခြင်း"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ထည့်သွင်းနည်းများ သတ်မှတ်ခြင်း"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ခလုတ်ပါဝင်သော ကီးဘုတ်"</string>
- <string name="usb_device_permission_prompt" msgid="834698001271562057">"<xliff:g id="APPLICATION">%1$s</xliff:g>အပ်ပလီကေးရှင်းအား USBပစ္စည်းကို ချိတ်ဆက်ရန်ခွင့်ပြုမည်လား"</string>
- <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"<xliff:g id="APPLICATION">%1$s</xliff:g> အပ်ပလီကေးရှင်းကို USB တွဲဖက်ပစ္စည်းများအား ဝင်ရောက်ကြည့်ရှုရန်ခွင့်ပြုသည်"</string>
- <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"<xliff:g id="ACTIVITY">%1$s</xliff:g> အားUSBပစ္စည်း ချိတ်ဆက်နေစဥ် ဖွင့်မည်လား"</string>
- <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"<xliff:g id="ACTIVITY">%1$s</xliff:g> အား USBတွဲဖက်ပစ္စည်း ချိတ်ဆက်ထားစဥ် ဖွင့်မည်"</string>
- <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ဒီUSBပစ္စည်းနှင့်ဘယ်အပ်ပလီကေးရှင်းမှ အလုပ်မလုပ်ပါ။ ပိုမိုသိရန် <xliff:g id="URL">%1$s</xliff:g>တွင် လေ့လာပါ"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"<xliff:g id="APPLICATION">%1$s</xliff:g>အပ်ပလီကေးရှင်းအား USBပစ္စည်းကို ချိတ်ဆက်ရန်ခွင့်ပြုမည်လား"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"<xliff:g id="APPLICATION">%1$s</xliff:g> အပ်ပလီကေးရှင်းကို USB တွဲဖက်ပစ္စည်းများအား ဝင်ရောက်ကြည့်ရှုရန်ခွင့်ပြုသည်"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"<xliff:g id="ACTIVITY">%1$s</xliff:g> အားUSBပစ္စည်း ချိတ်ဆက်နေစဥ် ဖွင့်မည်လား"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"<xliff:g id="ACTIVITY">%1$s</xliff:g> အား USBတွဲဖက်ပစ္စည်း ချိတ်ဆက်ထားစဥ် ဖွင့်မည်"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ဒီUSBပစ္စည်းနှင့်ဘယ်အပ်ပလီကေးရှင်းမှ အလုပ်မလုပ်ပါ။ ပိုမိုသိရန် <xliff:g id="URL">%1$s</xliff:g>တွင် လေ့လာပါ"</string>
<string name="title_usb_accessory" msgid="4966265263465181372">"USBတွဲဖက်ပစ္စည်းများ"</string>
<string name="label_view" msgid="6304565553218192990">"မြင်ကွင်း"</string>
<string name="always_use_device" msgid="1450287437017315906">"ဤUSBပစ္စည်းများအတွက် မူရင်းအတိုင်း အသုံးပြုပါ။"</string>
@@ -64,31 +64,31 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB အမှားရှာဖွေပြင်ဆင်ခြင်း ခွင့်ပြုပါမည်လား?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"ဒီကွန်ပျူတာရဲ့ RSA key fingerprint ကတော့:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g> ဖြစ်ပါသည်"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"ဒီကွန်ပျူတာမှ အမြဲခွင့်ပြုရန်"</string>
- <string name="compat_mode_on" msgid="6623839244840638213">"ဖန်သားပြင်ပြည့် ချဲ့ခြင်း"</string>
- <string name="compat_mode_off" msgid="4434467572461327898">"ဖန်သားပြင်အပြည့်ဆန့်ခြင်း"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"ဖန်သားပြင်ပြည့် ချဲ့ခြင်း"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"ဖန်သားပြင်အပြည့်ဆန့်ခြင်း"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"ဖန်သားပြင်ဓါတ်ပုံသိမ်းစဉ်.."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား သိမ်းဆည်းပါမည်"</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား သိမ်းဆည်းပြီးပါပြီ"</string>
<string name="screenshot_saved_title" msgid="6461865960961414961">"ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား ဖမ်းယူပြီး"</string>
- <string name="screenshot_saved_text" msgid="1152839647677558815">"သင့်ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား ကြည့်ရှုရန် ထိပါ"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"သင့်ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား ကြည့်ရှုရန် ထိပါ"</string>
<string name="screenshot_failed_title" msgid="705781116746922771">"ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား မဖမ်းစီးနိုင်ပါ"</string>
- <string name="screenshot_failed_text" msgid="1260203058661337274">"မျက်နှာပြင်လျှပ်တပြက်ပုံကို မရုက်နိုင်ခဲ့ပါ၊ သိုလှောင်မှု နေရာ အကန့်အသတ် ရှိနေ၍ သို့မဟုတ် app သို့မဟုတ် သင်၏ အဖွဲ့အစည်းက ခွင့်မပြု၍ ဖြစ်နိုင်သည်။"</string>
+ <string name="screenshot_failed_text" msgid="1260203058661337274">"မျက်နှာပြင်လျှပ်တပြက်ပုံကို မရုက်နိုင်ခဲ့ပါ၊ သိုလှောင်မှု နေရာ အကန့်အသတ် ရှိနေ၍ သို့မဟုတ် app သို့မဟုတ် သင်၏ အဖွဲ့အစည်းက ခွင့်မပြု၍ ဖြစ်နိုင်သည်။"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ဖိုင်ပြောင်း ရွေးမှုများ"</string>
- <string name="use_mtp_button_title" msgid="4333504413563023626">"မီဒီယာပလေရာအနေဖြင့် တပ်ဆင်ရန် (MTP)"</string>
- <string name="use_ptp_button_title" msgid="7517127540301625751">"ကင်မရာအနေဖြင့် တပ်ဆင်ရန် (PTP)"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"မီဒီယာပလေရာအနေဖြင့် တပ်ဆင်ရန် (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"ကင်မရာအနေဖြင့် တပ်ဆင်ရန် (PTP)"</string>
<string name="installer_cd_button_title" msgid="2312667578562201583">"Macအတွက်Andriodဖိုင်ပြောင်းအပ်ပလီကေးရှင်းထည့်ခြင်း"</string>
<string name="accessibility_back" msgid="567011538994429120">"နောက်သို့"</string>
<string name="accessibility_home" msgid="8217216074895377641">"ပင်မစာမျက်နှာ"</string>
<string name="accessibility_menu" msgid="316839303324695949">"မီနူး"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"ခြုံကြည့်မှု။"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"ခြုံကြည့်မှု။"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"ရှာဖွေရန်"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"ကင်မရာ"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ဖုန်း"</string>
<string name="accessibility_unlock_button" msgid="128158454631118828">"သော့ဖွင့်ရန်"</string>
- <string name="unlock_label" msgid="8779712358041029439">"သော့ဖွင့်ရန်"</string>
- <string name="phone_label" msgid="2320074140205331708">"ဖုန်းကို ဖွင့်ရန်"</string>
- <string name="camera_label" msgid="7261107956054836961">"ကင်မရာ ဖွင့်ရန်"</string>
- <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ထည့်သွင်းခြင်းခလုတ်အား ပြောင်းခြင်း"</string>
+ <string name="unlock_label" msgid="8779712358041029439">"သော့ဖွင့်ရန်"</string>
+ <string name="phone_label" msgid="2320074140205331708">"ဖုန်းကို ဖွင့်ရန်"</string>
+ <string name="camera_label" msgid="7261107956054836961">"ကင်မရာ ဖွင့်ရန်"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ထည့်သွင်းခြင်းခလုတ်အား ပြောင်းခြင်း"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"အံ့ဝင်သောချုံ့ချဲ့ခလုတ်"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ဖန်သားပြင်ပေါ်တွင် အသေးမှအကြီးသို့ချဲ့ခြင်း"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ဘလူးတုသ်ချိတ်ဆက်ထားမှု"</string>
@@ -97,17 +97,17 @@
<string name="accessibility_battery_one_bar" msgid="7774887721891057523">"ဘတ္တရီတစ်ဘား။"</string>
<string name="accessibility_battery_two_bars" msgid="8500650438735009973">"ဘတ္တရီနှစ်ဘား။"</string>
<string name="accessibility_battery_three_bars" msgid="2302983330865040446">"ဘတ္တရီသုံးဘား။"</string>
- <string name="accessibility_battery_full" msgid="8909122401720158582">"ဘတ္တရီအပြည့်။"</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"ဘတ္တရီအပြည့်။"</string>
<string name="accessibility_no_phone" msgid="4894708937052611281">"ဖုန်းလိုင်းမရှိပါ။"</string>
<string name="accessibility_phone_one_bar" msgid="687699278132664115">"ဖုန်းလိုင်းတစ်ဘား။"</string>
<string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ဖုန်းလိုင်းနှစ်ဘား။"</string>
<string name="accessibility_phone_three_bars" msgid="8521904843919971885">"ဖုန်းလိုင်းသုံးဘား။"</string>
- <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ဖုန်းလိုင်းအပြည့်။"</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ဖုန်းလိုင်းအပြည့်။"</string>
<string name="accessibility_no_data" msgid="4791966295096867555">"ဒေတာမရှိပါ။"</string>
<string name="accessibility_data_one_bar" msgid="1415625833238273628">"ဒေတာတစ်ဘား။"</string>
- <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ဒေတာထုတ်လွှင့်မှု ၂ဘားဖမ်းမိခြင်း။"</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ဒေတာထုတ်လွှင့်မှု ၂ဘားဖမ်းမိခြင်း။"</string>
<string name="accessibility_data_three_bars" msgid="9167670452395038520">"ဒေတာသုံးဘား။"</string>
- <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ဒေတာထုတ်လွှင့်မှုအပြည့်ဖမ်းမိခြင်း"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ဒေတာထုတ်လွှင့်မှုအပြည့်ဖမ်းမိခြင်း"</string>
<string name="accessibility_wifi_off" msgid="3177380296697933627">"ဝိုင်ဖိုင် မရှိ"</string>
<string name="accessibility_no_wifi" msgid="1425476551827924474">"ဝိုင်ဖိုင် ချိတ်ဆက်ထားမှု မရှိပါ"</string>
<string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"ဝိုင်ဖိုင် ၁ ဘားရှိ"</string>
@@ -127,7 +127,7 @@
<string name="accessibility_one_bar" msgid="1685730113192081895">"တစ်တုံး"</string>
<string name="accessibility_two_bars" msgid="6437363648385206679">"၂ ဘား"</string>
<string name="accessibility_three_bars" msgid="2648241415119396648">"၃ ဘား"</string>
- <string name="accessibility_signal_full" msgid="9122922886519676839">"ဒေတာထုတ်လွှင့်မှုအပြည့်ဖမ်းမိခြင်း"</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"ဒေတာထုတ်လွှင့်မှုအပြည့်ဖမ်းမိခြင်း"</string>
<string name="accessibility_desc_on" msgid="2385254693624345265">"ဖွင့်ထားသည်"</string>
<string name="accessibility_desc_off" msgid="6475508157786853157">"ပိတ်ထားသည်"</string>
<string name="accessibility_desc_connected" msgid="8366256693719499665">"ဆက်သွယ်ထားပြီး"</string>
@@ -144,7 +144,7 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"ဝိုင်ဖိုင်"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"ဆင်းကဒ်မရှိပါ။"</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ဘလူးတုသ်မှတဆင့်ပြန်လည်ချိတ်ဆက်ခြင်း"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ဘလူးတုသ်မှတဆင့်ပြန်လည်ချိတ်ဆက်ခြင်း"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်။"</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"ဘတ္တရီ <xliff:g id="NUMBER">%d</xliff:g> ရာခိုင်နှုန်း။"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"စနစ်အပြင်အဆင်များ"</string>
@@ -165,47 +165,47 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"အမြန်လုပ် အပြင်အဆင်"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"မျက်နှာပြင် သော့ပိတ်ရန်"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ဆက်တင်များ"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ခြုံကြည့်မှု။"</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ခြုံကြည့်မှု။"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"သုံးစွဲသူ <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>။"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ကြိုးမဲ့ ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"ကြိုးမဲ့ ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"ကြိုးမဲ့ ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"မိုဘိုင်းလ် <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ဘက်ထရီ <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"လေယာဉ် မုဒ် ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"လေယာဉ် မုဒ်ကို ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"လေယာဉ် မုဒ်ကို ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"လေယာဉ် မုဒ်ကို ပိတ်ထားလိုက်ပြီ။"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"လေယာဉ် မုဒ်ကို ဖွင့်ထားလိုက်ပြီ။"</string>
+ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"လေယာဉ် မုဒ်ကို ဖွင့်ထားလိုက်ပြီ။"</string>
<string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"ဘလူးတုသ် ပိတ်ထား."</string>
- <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ဘလူးတုသ် ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ဘလူးတုသ် ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"ဘလူးတုသ် ချိတ်ဆက်နေ။"</string>
<string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"ဘလူးတုသ် ချိတ်ဆက်ထား။"</string>
<string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"ဘလူးတုသ် ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"ဘလူးတုသ် ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"ဘလူးတုသ် ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"တည်နေရာ သတင်းပို့မှု ပိတ်ရန်။"</string>
- <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"တည်နေရာ သတင်းပို့မှု ဖွင့်ရန်။"</string>
+ <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"တည်နေရာ သတင်းပို့မှု ဖွင့်ရန်။"</string>
<string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"တည်နေရာ သတင်းပို့မှု ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"တည်နေရာ သတင်းပို့မှု ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"တည်နေရာ သတင်းပို့မှု ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"နိုးစက်ပေးထားသော အချိန် <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_close" msgid="3115847794692516306">"ဘောင်ကွက် ပိတ်ရန်။"</string>
<string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"အချိန် တိုး"</string>
<string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"အချိန် လျှော့"</string>
<string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"ဖလက်ရှမီး ပိတ်ထား"</string>
- <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ဖလက်ရှမီး ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ဖလက်ရှမီး ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"ဖလက်ရှမီး ပိတ်ထားသည်။"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ဖလက်ရှမီး ဖွင့်ထားသည်။"</string>
+ <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ဖလက်ရှမီး ဖွင့်ထားသည်။"</string>
<string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"အရောင် ပြောင်းပြန်လှန်မှု ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"အရောင် ပြောင်းပြန်လှန်မှု ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"အရောင် ပြောင်းပြန်လှန်မှု ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"မိုဘိုင်း ဟော့စပေါ့ ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"မိုဘိုင်း ဟော့စပေါ့ ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"မိုဘိုင်း ဟော့စပေါ့ ဖွင့်ထား။"</string>
<string name="accessibility_casting_turned_off" msgid="1430668982271976172">"မျက်နှာပြင် ကာစ်တင် လုပ်မှု ရပ်လိုက်ပြီ။"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"တောက်ပမှုကို ပြရန်"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="2626865386971800302">"2G-3G ဒေတာ ပိတ်ထား"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4629078114195977196">"4G ဒေတာ ပိတ်ထား"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="5793456071535876132">"ဆယ်လူလာ ဒေတာကို ပိတ်ထား"</string>
<string name="data_usage_disabled_dialog_title" msgid="8723412000355709802">"ဒေတာ ပိတ်ထား"</string>
- <string name="data_usage_disabled_dialog" msgid="6468718338038876604">"သင်၏ ကိရိယာသည် သင်က သတ်မှတ်ခဲ့သည့် ကန့်သတ်ချက်ကို ပြည့်မီသွား၍ ပိတ်သွားသည်။ \n\n၎င်းကို ပြန်ပြီး ဖွင့်မှုအတွက် သင်၏ စီမံပေးသူ ထံမှ ငွေတောင်းခံ လာနိုင်ပါသည်။"</string>
- <string name="data_usage_disabled_dialog_enable" msgid="5538068036107372895">"ဒေတာ ဖွင့်ပေးရန်"</string>
+ <string name="data_usage_disabled_dialog" msgid="6468718338038876604">"သင်၏ ကိရိယာသည် သင်က သတ်မှတ်ခဲ့သည့် ကန့်သတ်ချက်ကို ပြည့်မီသွား၍ ပိတ်သွားသည်။ \n\n၎င်းကို ပြန်ပြီး ဖွင့်မှုအတွက် သင်၏ စီမံပေးသူ ထံမှ ငွေတောင်းခံ လာနိုင်ပါသည်။"</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="5538068036107372895">"ဒေတာ ဖွင့်ပေးရန်"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"အင်တာနက်မရှိ"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"ကြိုးမဲ့ဆက်သွယ်မှု"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPSအားရှာဖွေသည်"</string>
@@ -229,13 +229,13 @@
<string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ဘလူးတု"</string>
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ဘလူးတု (<xliff:g id="NUMBER">%d</xliff:g> စက်များ)"</string>
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"ဘလူးတု ပိတ်ထားရန်"</string>
- <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"ချိတ်တွဲထားသည့် ကိရိယာများ မရှိ"</string>
+ <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"ချိတ်တွဲထားသည့် ကိရိယာများ မရှိ"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"အလင်းတောက်ပမှု"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"အော်တို-လည်"</string>
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"လည်မှု သော့ပိတ်ထား"</string>
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"ဒေါင်လိုက်"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"ဘေးတိုက်"</string>
- <string name="quick_settings_ime_label" msgid="7073463064369468429">"ထည့်သွင်းရန်နည်းလမ်း"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"ထည့်သွင်းရန်နည်းလမ်း"</string>
<string name="quick_settings_location_label" msgid="5011327048748762257">"တည်နေရာ"</string>
<string name="quick_settings_location_off_label" msgid="7464544086507331459">"တည်နေရာပြမှု မရှိ"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"မီဒီယာ စက်ပစ္စည်း"</string>
@@ -254,7 +254,7 @@
<string name="quick_settings_cast_title" msgid="1893629685050355115">"ကာစ်တ် မျက်နှာပြင်"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ကာစ်တင်"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"အမည်မတပ် ကိရိယာ"</string>
- <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ကာစ်တ် လုပ်ရန် အသင့် ရှိနေပြီ"</string>
+ <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ကာစ်တ် လုပ်ရန် အသင့် ရှိနေပြီ"</string>
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"ကိရိယာများ မရှိ"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"အလင်းတောက်ပမှု"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"အလိုအလျောက်"</string>
@@ -271,9 +271,9 @@
<string name="quick_settings_cellular_detail_title" msgid="8575062783675171695">"ဆယ်လူလာ ဒေတာ"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ဒေတာ သုံးစွဲမှု"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ကျန်ရှိ ဒေတာ"</string>
- <string name="quick_settings_cellular_detail_over_limit" msgid="3242930457130971204">"ကန့်သတ်ချက် ပြည့်မီသွားပြီ - ဒေတာ သုံးစွဲမှု ဆိုင်းငံ့ထားပြီ"</string>
+ <string name="quick_settings_cellular_detail_over_limit" msgid="3242930457130971204">"ကန့်သတ်ချက် ပြည့်မီသွားပြီ - ဒေတာ သုံးစွဲမှု ဆိုင်းငံ့ထားပြီ"</string>
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> သုံးထား"</string>
- <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ကန့်သတ်ချက်"</string>
+ <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ကန့်သတ်ချက်"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> သတိပေးချက်"</string>
<string name="recents_empty_message" msgid="8682129509540827999">"သင်၏ မကြာမီက မျက်နှာပြင်များ ဒီမှာ ပေါ်လာကြမည်"</string>
<string name="recents_app_info_button_label" msgid="2890317189376000030">"အပလီကေးရှင်း အင်ဖို"</string>
@@ -282,77 +282,77 @@
<string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ကို မစနိုင်ပါ။"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"အားသွင်းပြီး"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"အားသွင်းနေ"</string>
- <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ပြည်သည့် အထိ"</string>
+ <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ပြည်သည့် အထိ"</string>
<string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"အား မသွင်းပါ"</string>
<string name="ssl_ca_cert_warning" msgid="9005954106902053641">"ကွန်ယက်ကို\n စောင့်ကြည့်စစ်ဆေးခံရနိုင်သည်"</string>
<string name="description_target_search" msgid="3091587249776033139">"ရှာဖွေရန်"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် အပေါ်ကို ပွတ်ဆွဲပါ"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် ဖယ်ဘက်ကို ပွတ်ဆွဲပါ"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ကြားဖြတ်ဝင်မှုများ မရှိခဲ့။ နှိုးစက်ပင် မရှိခဲ့။"</string>
- <string name="zen_no_interruptions" msgid="7970973750143632592">"ကြားဖြတ်ဝင်မှု ခွင့်မပြုရန်"</string>
+ <string name="zen_no_interruptions" msgid="7970973750143632592">"ကြားဖြတ်ဝင်မှု ခွင့်မပြုရန်"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"ဦးစားပေး ကြားဖြတ်ဝင်မှုများ သာလျှင်"</string>
<string name="zen_alarm_information_time" msgid="5235772206174372272">"သင်၏ နောက် နှိုးစက်၏ အချိန်မှာ<xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
<string name="zen_alarm_information_day_time" msgid="8422733576255047893">"သင်၏ နောက် နှိုးစက်မှာ <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string>
<string name="zen_alarm_warning" msgid="6873910860111498041">"သင်သည် သင်၏ <xliff:g id="ALARM_TIME">%s</xliff:g> နှိုးစက်ကို ကြားရမည် မဟုတ်"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
- <string name="speed_bump_explanation" msgid="1288875699658819755">"အရေးပါမှု နည်းသည့် အကြောင်းကြားချက်များ အောက်မှာ"</string>
- <string name="notification_tap_again" msgid="8524949573675922138">"ဖွင့်ရန် ထပ်ပြီး ထိပါ"</string>
- <string name="keyguard_unlock" msgid="8043466894212841998">"သော့ဖွင့်ရန် အပေါ်သို့ ပွတ်ဆွဲပါ"</string>
+ <string name="speed_bump_explanation" msgid="1288875699658819755">"အရေးပါမှု နည်းသည့် အကြောင်းကြားချက်များ အောက်မှာ"</string>
+ <string name="notification_tap_again" msgid="8524949573675922138">"ဖွင့်ရန် ထပ်ပြီး ထိပါ"</string>
+ <string name="keyguard_unlock" msgid="8043466894212841998">"သော့ဖွင့်ရန် အပေါ်သို့ ပွတ်ဆွဲပါ"</string>
<string name="phone_hint" msgid="3101468054914424646">"ဖုန်း အတွက် ညာသို့ ပွတ်ဆွဲပါ"</string>
<string name="camera_hint" msgid="5241441720959174226">"ကင်မရာ အတွက် ဘယ်သို့ ပွတ်ဆွဲပါ"</string>
<string name="interruption_level_none" msgid="3831278883136066646">"မရှိ"</string>
<string name="interruption_level_priority" msgid="6517366750688942030">"ဦးစားပေးမှု"</string>
<string name="interruption_level_all" msgid="1330581184930945764">"အားလုံး"</string>
- <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"(<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> အပြည့် အထိ) အားသွင်းနေ"</string>
+ <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"(<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> အပြည့် အထိ) အားသွင်းနေ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"အသုံးပြုသူကို ပြောင်းလဲရန်"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"အသုံးပြုသူကို ပြောင်းရန်၊ လက်ရှိ အသုံးပြုသူ <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"ပရိုဖိုင်ကို ပြရန်"</string>
<string name="user_add_user" msgid="5110251524486079492">"သုံးသူ ထပ်ထည့်ရန်"</string>
<string name="user_new_user_name" msgid="426540612051178753">"အသုံးပြုသူ အသစ်"</string>
- <string name="guest_nickname" msgid="8059989128963789678">"ဧည့်သည်"</string>
- <string name="guest_new_guest" msgid="600537543078847803">"ဧည့်သည့်ကို ထည့်ပေးရန်"</string>
- <string name="guest_exit_guest" msgid="7187359342030096885">"ဧည့်သည်ကို ဖယ်ထုတ်ရန်"</string>
- <string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"ဧည့်သည်ကို ဖယ်ထုတ်လိုက်ရမလား?"</string>
- <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"ဒီချိတ်ဆက်မှု ထဲက appများ အားလုံး နှင့် ဒေတာကို ဖျက်ပစ်မည်။"</string>
+ <string name="guest_nickname" msgid="8059989128963789678">"ဧည့်သည်"</string>
+ <string name="guest_new_guest" msgid="600537543078847803">"ဧည့်သည့်ကို ထည့်ပေးရန်"</string>
+ <string name="guest_exit_guest" msgid="7187359342030096885">"ဧည့်သည်ကို ဖယ်ထုတ်ရန်"</string>
+ <string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"ဧည့်သည်ကို ဖယ်ထုတ်လိုက်ရမလား?"</string>
+ <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"ဒီချိတ်ဆက်မှု ထဲက appများ အားလုံး နှင့် ဒေတာကို ဖျက်ပစ်မည်။"</string>
<string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"ဖယ်ထုတ်ပါ"</string>
- <string name="guest_wipe_session_title" msgid="6419439912885956132">"ပြန်လာတာ ကြိုဆိုပါသည်၊ ဧည့်သည်!"</string>
+ <string name="guest_wipe_session_title" msgid="6419439912885956132">"ပြန်လာတာ ကြိုဆိုပါသည်၊ ဧည့်သည်!"</string>
<string name="guest_wipe_session_message" msgid="8476238178270112811">"သင်သည် သင်၏ ချိတ်ဆက်မှုကို ဆက်ပြုလုပ် လိုပါသလား?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"အစမှ ပြန်စပါ"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ဟုတ်ကဲ့၊ ဆက်လုပ်ပါ"</string>
- <string name="user_add_user_title" msgid="4553596395824132638">"အသုံးပြုသူ အသစ်ကို ထည့်ရမလား?"</string>
- <string name="user_add_user_message_short" msgid="2161624834066214559">"သင်က အသုံးပြုသူ အသစ် တစ်ဦးကို ထည့်ပေးလိုက်လျှင်၊ ထိုသူသည် ၎င်း၏ နေရာကို သတ်မှတ်စီစဉ်ရန် လိုအပ်မည်။\n\n အသုံးပြုသူ မည်သူမဆို ကျန်အသုံးပြုသူ အားလုံးတို့အတွက် appများကို မွမ်းမံပေးနိုင်သည်။"</string>
- <string name="battery_saver_notification_title" msgid="237918726750955859">"ဘက်ထရီ ချွေတာသူ ဖွင့်ထား"</string>
- <string name="battery_saver_notification_text" msgid="820318788126672692">"လုပ်ကိုင်မှုကို လျှော့ချလျက် နောက်ခံ ဒေတာကို ကန့်သတ်သည်"</string>
+ <string name="user_add_user_title" msgid="4553596395824132638">"အသုံးပြုသူ အသစ်ကို ထည့်ရမလား?"</string>
+ <string name="user_add_user_message_short" msgid="2161624834066214559">"သင်က အသုံးပြုသူ အသစ် တစ်ဦးကို ထည့်ပေးလိုက်လျှင်၊ ထိုသူသည် ၎င်း၏ နေရာကို သတ်မှတ်စီစဉ်ရန် လိုအပ်မည်။\n\n အသုံးပြုသူ မည်သူမဆို ကျန်အသုံးပြုသူ အားလုံးတို့အတွက် appများကို မွမ်းမံပေးနိုင်သည်။"</string>
+ <string name="battery_saver_notification_title" msgid="237918726750955859">"ဘက်ထရီ ချွေတာသူ ဖွင့်ထား"</string>
+ <string name="battery_saver_notification_text" msgid="820318788126672692">"လုပ်ကိုင်မှုကို လျှော့ချလျက် နောက်ခံ ဒေတာကို ကန့်သတ်သည်"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"ဘက်ထရီ ချွေတာမှုကို ပိတ်ထားရန်"</string>
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"အကြောင်းအရာများ ဝှက်ထား"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> က သင်၏ မျက်နှာပြင် ပေါ်မှာ ပြသထားသည့် အရာတိုင်းကို စတင် ဖမ်းယူမည်။"</string>
+ <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> က သင်၏ မျက်နှာပြင် ပေါ်မှာ ပြသထားသည့် အရာတိုင်းကို စတင် ဖမ်းယူမည်။"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"နောက်ထပ် မပြပါနှင့်"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"အားလုံး ရှင်းလင်းရန်"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"ယခု စတင်ပါ"</string>
<string name="empty_shade_text" msgid="708135716272867002">"အကြောင်းကြားချက်များ မရှိ"</string>
- <string name="device_owned_footer" msgid="3802752663326030053">"ကိရိယာကို စောင့်ကြပ် နိုင်ပါသည်"</string>
- <string name="profile_owned_footer" msgid="8021888108553696069">"ပရိုဖိုင်ကို စောင့်ကြပ်နိုင်သည်"</string>
- <string name="vpn_footer" msgid="2388611096129106812">"ကွန်ရက်ကို ကို စောင့်ကြပ် နိုင်ပါသည်"</string>
+ <string name="device_owned_footer" msgid="3802752663326030053">"ကိရိယာကို စောင့်ကြပ် နိုင်ပါသည်"</string>
+ <string name="profile_owned_footer" msgid="8021888108553696069">"ပရိုဖိုင်ကို စောင့်ကြပ်နိုင်သည်"</string>
+ <string name="vpn_footer" msgid="2388611096129106812">"ကွန်ရက်ကို ကို စောင့်ကြပ် နိုင်ပါသည်"</string>
<string name="monitoring_title_device_owned" msgid="7121079311903859610">"ကိရိယာကို စောင့်ကြပ်ခြင်း"</string>
- <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ပရိုဖိုင် စောင့်ကြပ်မှု"</string>
+ <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ပရိုဖိုင် စောင့်ကြပ်မှု"</string>
<string name="monitoring_title" msgid="169206259253048106">"ကွန်ရက်ကို စောင့်ကြပ်ခြင်း"</string>
<string name="disable_vpn" msgid="4435534311510272506">"VPN ကို ပိတ်ထားရန်"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN ကို အဆက်ဖြတ်ရန်"</string>
<string name="monitoring_description_device_owned" msgid="7512371572956715493">"ဤစက်ပစ္စည်းကို စီမံခန့်ခွဲသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင့်အက်ဒ်မင်သည် သင့်စက်ပစ္စည်းနှင့် အီးမေးများ၊ app များ နှင့် လုံခြုံသည့်ဝက်ဘ်ဆိုက် အပါအဝင် ကွန်ရက် လှုပ်ှရားမှုများကို စောင့်ကြည့်နိုင်သည်။\n\nနောက်ထပ်အချက်အလက်များအတွက်၊ သင့်အက်ဒ်မင်ကို ဆက်သွယ်ပါ။"</string>
<string name="monitoring_description_vpn" msgid="7288268682714305659">"သင် \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" ကို VPN စတင်သုံးခွင့်ပေးလိုက်သည်။ \n\n ဤ app သည် သင့်စက်ပစ္စည်းနှင့် အီးမေးများ၊ app များ နှင့် လုံခြုံသည့်ဝက်ဘ်ဆိုက် အပါအဝင် ကွန်ရက် လှုပ်ှရားမှုများကို စောင့်ကြည့်နိုင်သည်။"</string>
<string name="monitoring_description_legacy_vpn" msgid="4740349017929725435">"VPN (\"<xliff:g id="APPLICATION">%1$s</xliff:g>\") ကို သင်ချိတ်ဆက်မိ၏။\n\nသင့် VPN ဝန်ဆောင်မှုပေးသူသည် သင့်စက်ပစ္စည်းနှင့် အီးမေးများ၊ app များ နှင့် လုံခြုံသည့်ဝက်ဘ်ဆိုက် အပါအဝင် ကွန်ရက် လှုပ်ှရားမှုများကို စောင့်ကြည့်နိုင်သည်။"</string>
- <string name="monitoring_description_vpn_device_owned" msgid="696121105616356493">"ဒီကိရိယာကို စီမံကွပ်ကဲသူမှာ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူက သင်၏ ကွန်ရက် လှုပ်ရှားမှုကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ် နိုင်ပါသည်။ အချက်အလက်များ ပိုပြီး ရယူရန်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\n ထို့အပြင် သင်သည် \"<xliff:g id="APPLICATION">%2$s</xliff:g>\" အား VPN ချိတ်ဆက်မှု စဖွင့်လုပ်ကိုင်ရန် ခွင့်ပြုခဲ့သည်။ ဒီ appကပါ သင်၏ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ် နိုင်ပါသည်။"</string>
- <string name="monitoring_description_legacy_vpn_device_owned" msgid="649791650224064248">"ဒီကိရိယာကို စီမံကွပ်ကဲသူမှာ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူက သင်၏ ကွန်ရက် လှုပ်ရှားမှုကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ် နိုင်ပါသည်။ အချက်အလက်များ ပိုပြီး ရယူရန်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\nထို့အပြင်၊ သင်သည် VPN (\"<xliff:g id="APPLICATION">%2$s</xliff:g>\") သို့ ချိတ်ဆက်ထားသည်။ သင်၏ VPN ဝန်ဆောင်မှုကို စီမံပေးသူကပါ ကွန်ရက် လှုပ်ရှားမှုများကို စောင့်ကြပ်နိုင်သေးသည်။"</string>
- <string name="monitoring_description_profile_owned" msgid="2370062794285691713">"ဒီပရိုဖိုင်ကို စီမံကွပ်ကဲပေးသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူသည် သင်၏ ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှုများကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ်နိုင်သည်။ \n\n နောက်ထပ် သိလိုလျှင်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။"</string>
- <string name="monitoring_description_device_and_profile_owned" msgid="8685301493845456293">"ဒီကိရိယာကို စီမံကွပ်ကဲပေးသူ:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nသင့် ပရိုဖိုင်ကို စီမံကွပ်ကဲပေးသူ:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူသည် သင်၏ ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှုများကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ်နိုင်သည်။\n\nနောက်ထပ် သိလိုလျှင်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။"</string>
- <string name="monitoring_description_vpn_profile_owned" msgid="847491346263295767">"ပရိုဖိုင်ကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင့် စီမံအုပ်ချုပ်သူက သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှုကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်၊ စောင့်ကြပ်နိုင်သည်။ ထပ် သိလိုလျှင်၊ သင့် စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\n သင်သည် \"<xliff:g id="APPLICATION">%2$s</xliff:g>\" အား VPN ချိတ်ဆက်မှု ထူထောင်ခွင့် ပေးခဲ့သည်။ ဒီappကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
- <string name="monitoring_description_legacy_vpn_profile_owned" msgid="4095516964132237051">"ပရိုဖိုင်ကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင့်စီမံအုပ်ချုပ်သူက သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှု၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို စောင့်ကြပ်နိုင်သည်။ ထပ် သိလိုလျှင်၊ သင့်စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\nသင်သည် VPN (\"<xliff:g id="APPLICATION">%2$s</xliff:g>\") သို့ပါ ချိတ်ထားသည်။ သင်၏ VPN စီမံပေးသူကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
- <string name="monitoring_description_vpn_device_and_profile_owned" msgid="9193588924767232909">"ကိရိယာကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nသင့်ပရိုဖိုင်ကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nသင့်စီမံအုပ်ချုပ်သူသည် သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှု၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို စောင့်ကြပ်နိုင်သည်။\n\nသင်သည် \"<xliff:g id="APPLICATION">%3$s</xliff:g>\"အား VPN ချိတ်ဆက်မှု ထူထောင်ခွင့် ပေးခဲ့သည်။ ဒီappကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
- <string name="monitoring_description_legacy_vpn_device_and_profile_owned" msgid="6935475023447698473">"ဒီကိရိယာ စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nသင့် ပရိုဖိုင် စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\n စီမံအုပ်ချုပ်သူသည် သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှု၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို စောင့်ကြပ်နိုင်သည်။\n\nထပ် သိလိုလျှင်၊ သင့်စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။ သင်သည် VPN (\"<xliff:g id="APPLICATION">%3$s</xliff:g>\") သို့ပါ ချိတ်ထားသည်။ သင်၏ VPN စီမံပေးသူကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
- <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"သင်က လက်ဖြင့် သော့မဖွင့်မချင်း ကိရိယာမှာ သော့ပိတ်လျက် ရှိနေမည်"</string>
+ <string name="monitoring_description_vpn_device_owned" msgid="696121105616356493">"ဒီကိရိယာကို စီမံကွပ်ကဲသူမှာ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူက သင်၏ ကွန်ရက် လှုပ်ရှားမှုကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ် နိုင်ပါသည်။ အချက်အလက်များ ပိုပြီး ရယူရန်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\n ထို့အပြင် သင်သည် \"<xliff:g id="APPLICATION">%2$s</xliff:g>\" အား VPN ချိတ်ဆက်မှု စဖွင့်လုပ်ကိုင်ရန် ခွင့်ပြုခဲ့သည်။ ဒီ appကပါ သင်၏ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ် နိုင်ပါသည်။"</string>
+ <string name="monitoring_description_legacy_vpn_device_owned" msgid="649791650224064248">"ဒီကိရိယာကို စီမံကွပ်ကဲသူမှာ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူက သင်၏ ကွန်ရက် လှုပ်ရှားမှုကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ် နိုင်ပါသည်။ အချက်အလက်များ ပိုပြီး ရယူရန်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\nထို့အပြင်၊ သင်သည် VPN (\"<xliff:g id="APPLICATION">%2$s</xliff:g>\") သို့ ချိတ်ဆက်ထားသည်။ သင်၏ VPN ဝန်ဆောင်မှုကို စီမံပေးသူကပါ ကွန်ရက် လှုပ်ရှားမှုများကို စောင့်ကြပ်နိုင်သေးသည်။"</string>
+ <string name="monitoring_description_profile_owned" msgid="2370062794285691713">"ဒီပရိုဖိုင်ကို စီမံကွပ်ကဲပေးသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူသည် သင်၏ ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှုများကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ်နိုင်သည်။ \n\n နောက်ထပ် သိလိုလျှင်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။"</string>
+ <string name="monitoring_description_device_and_profile_owned" msgid="8685301493845456293">"ဒီကိရိယာကို စီမံကွပ်ကဲပေးသူ:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nသင့် ပရိုဖိုင်ကို စီမံကွပ်ကဲပေးသူ:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူသည် သင်၏ ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှုများကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ်နိုင်သည်။\n\nနောက်ထပ် သိလိုလျှင်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။"</string>
+ <string name="monitoring_description_vpn_profile_owned" msgid="847491346263295767">"ပရိုဖိုင်ကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင့် စီမံအုပ်ချုပ်သူက သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှုကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်၊ စောင့်ကြပ်နိုင်သည်။ ထပ် သိလိုလျှင်၊ သင့် စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\n သင်သည် \"<xliff:g id="APPLICATION">%2$s</xliff:g>\" အား VPN ချိတ်ဆက်မှု ထူထောင်ခွင့် ပေးခဲ့သည်။ ဒီappကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
+ <string name="monitoring_description_legacy_vpn_profile_owned" msgid="4095516964132237051">"ပရိုဖိုင်ကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင့်စီမံအုပ်ချုပ်သူက သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှု၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို စောင့်ကြပ်နိုင်သည်။ ထပ် သိလိုလျှင်၊ သင့်စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\nသင်သည် VPN (\"<xliff:g id="APPLICATION">%2$s</xliff:g>\") သို့ပါ ချိတ်ထားသည်။ သင်၏ VPN စီမံပေးသူကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
+ <string name="monitoring_description_vpn_device_and_profile_owned" msgid="9193588924767232909">"ကိရိယာကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nသင့်ပရိုဖိုင်ကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nသင့်စီမံအုပ်ချုပ်သူသည် သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှု၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို စောင့်ကြပ်နိုင်သည်။\n\nသင်သည် \"<xliff:g id="APPLICATION">%3$s</xliff:g>\"အား VPN ချိတ်ဆက်မှု ထူထောင်ခွင့် ပေးခဲ့သည်။ ဒီappကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
+ <string name="monitoring_description_legacy_vpn_device_and_profile_owned" msgid="6935475023447698473">"ဒီကိရိယာ စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nသင့် ပရိုဖိုင် စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\n စီမံအုပ်ချုပ်သူသည် သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှု၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို စောင့်ကြပ်နိုင်သည်။\n\nထပ် သိလိုလျှင်၊ သင့်စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။ သင်သည် VPN (\"<xliff:g id="APPLICATION">%3$s</xliff:g>\") သို့ပါ ချိတ်ထားသည်။ သင်၏ VPN စီမံပေးသူကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
+ <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"သင်က လက်ဖြင့် သော့မဖွင့်မချင်း ကိရိယာမှာ သော့ပိတ်လျက် ရှိနေမည်"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"အကြောင်းကြားချက်များ မြန်မြန်ရရန်"</string>
- <string name="hidden_notifications_text" msgid="2326409389088668981">"မဖွင့်ခင် ၎င်းတို့ကို ကြည့်ပါ"</string>
+ <string name="hidden_notifications_text" msgid="2326409389088668981">"မဖွင့်ခင် ၎င်းတို့ကို ကြည့်ပါ"</string>
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"မလိုအပ်ပါ"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"သတ်မှတ်ရန်"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> အသံပိတ်သည်"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index db3dc41..76d9598 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -31,7 +31,7 @@
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ingen varslinger"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Aktiviteter"</string>
- <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Varslinger"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Varsler"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Batterikapasiteten er lav"</string>
<string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> gjenværende"</string>
<string name="battery_low_percent_format_saver_started" msgid="6534746636002666456">"<xliff:g id="NUMBER">%d%%</xliff:g> gjenstår. Batterisparing er på."</string>
@@ -48,7 +48,7 @@
<string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Roter skjerm automatisk"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"DEMPET"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
- <string name="status_bar_settings_notifications" msgid="397146176280905137">"Varslinger"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"Varsler"</string>
<string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth tilknyttet"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Konfigurer inndatametoder"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Fysisk tastatur"</string>
@@ -148,7 +148,7 @@
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Flymodus."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"Batteri – <xliff:g id="NUMBER">%d</xliff:g> prosent."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Systeminnstillinger."</string>
- <string name="accessibility_notifications_button" msgid="4498000369779421892">"Varslinger."</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"Varsler."</string>
<string name="accessibility_remove_notification" msgid="3603099514902182350">"Fjern varsling"</string>
<string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS er aktivert."</string>
<string name="accessibility_gps_acquiring" msgid="8959333351058967158">"Henting av GPS-signal."</string>
diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml
index a8d0337..05b1135 100644
--- a/packages/SystemUI/res/values-ne-rNP/strings.xml
+++ b/packages/SystemUI/res/values-ne-rNP/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"तपाईँको हालको स्क्रिन यहाँ प्रकट हुन्छ"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"नयाँ अनुप्रयोगहरू खारेज गर्नुहोस्"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"अवलोकन मा १ पर्दा"</item>
- <item quantity="other" msgid="5523506463832158203">"अवलोकन मा %%d स्क्रीन"</item>
+ <item quantity="one" msgid="3969335317929254918">"सारांशमा 1 पर्दा"</item>
+ <item quantity="other" msgid="5523506463832158203">"सारांशमा %d पर्दाहरू"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"कुनै सूचनाहरू छैन"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"चलिरहेको"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"पछाडि"</string>
<string name="accessibility_home" msgid="8217216074895377641">"गृह"</string>
<string name="accessibility_menu" msgid="316839303324695949">"मेनु"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"अवलोकन"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"सारांश"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"खोज्नुहोस्"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"क्यामेरा"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"फोन"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"द्रुत सेटिङहरू"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"स्क्रीन बन्द गर्नुहोस्।"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"सेटिङहरू"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"अवलोकन।"</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"सारांश।"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"प्रयोगकर्ता <xliff:g id="USER">%s</xliff:g>।"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>।"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"वाइफाइ बन्द गरियो।"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 399628d..2f7a742 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -249,7 +249,7 @@
<string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
<string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Brak połączenia"</string>
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Brak sieci"</string>
- <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wyłącz Wi-Fi"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi wyłączone"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="2831702993995222755">"Brak dostępnych zapisanych sieci"</string>
<string name="quick_settings_cast_title" msgid="1893629685050355115">"Przesyłaj ekran"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Przesyłam"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 964f98d..2b77c80 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Здесь будут показаны недавние приложения."</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Закрыть недавние приложения"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"Показан 1 экран."</item>
- <item quantity="other" msgid="5523506463832158203">"Показано экранов: %d."</item>
+ <item quantity="one" msgid="3969335317929254918">"В обзоре 1 экран."</item>
+ <item quantity="other" msgid="5523506463832158203">"Экранов в обзоре: %d."</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Нет уведомлений"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Текущие"</string>
diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml
index eab0399..0df07ce 100644
--- a/packages/SystemUI/res/values-si-rLK/strings.xml
+++ b/packages/SystemUI/res/values-si-rLK/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"යෙදුම් තොරතුරු"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"මෙහි ඔබගේ මෑතක තිර පෙන්නුම් කරයි"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"මෑත යෙදුම් ඉවතලන්න"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"දළ විශ්ලේෂණය තුළ 1 තීරයයි"</item>
+ <item quantity="other" msgid="5523506463832158203">"දළ විශ්ලේෂණය තුළ තීරයෙන් %d"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"දැනුම්දීම් නැත"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"දැනට පවතින"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"දැනුම්දීම්"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"ආපසු"</string>
<string name="accessibility_home" msgid="8217216074895377641">"මුල් පිටුව"</string>
<string name="accessibility_menu" msgid="316839303324695949">"මෙනුව"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"දළ විශ්ලේෂණය"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"සොයන්න"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"කැමරාව"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"දුරකථනය"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ක්ෂණික සැකසීම්."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"අගුළු තිරය."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"සැකසීම්"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"දළ විශ්ලේෂණය."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"පරිශීලකයා <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi අක්රියයි."</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 3cbc6cf..f9191ff 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Vaše nedávne obrazovky sa zobrazia tu."</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Zatvoriť nedávne aplikácie"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"V Prehľade je 1 obrazovka"</item>
- <item quantity="other" msgid="5523506463832158203">"V Prehľade je niekoľko obrazoviek (počet: %d)"</item>
+ <item quantity="one" msgid="3969335317929254918">"Počet obrazoviek v Prehľade: 1"</item>
+ <item quantity="other" msgid="5523506463832158203">"Počet obrazoviek v Prehľade: %d"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Žiadne upozornenia"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Prebiehajúce"</string>
@@ -167,7 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Rýchle nastavenia."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Uzamknutá obrazovka"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Nastavenia"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Prehľad."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Prehľad"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Používateľ: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Pripojenie Wi-Fi je vypnuté."</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index b441b9b..140f3e6 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Vaši nedavni zasloni so prikazani tu"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Zapre nedavne aplikacije"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"En zaslon v pregledu"</item>
- <item quantity="other" msgid="5523506463832158203">"Št. zaslonov v pregledu: %d"</item>
+ <item quantity="one" msgid="3969335317929254918">"En zaslon v Pregledu"</item>
+ <item quantity="other" msgid="5523506463832158203">"Št. zaslonov v Pregledu: %d"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ni obvestil"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Trenutno"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index bf846cb..c59f6a1 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Dina senaste skärmar visas här"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Avvisa nya appar"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"En skärm i översikten"</item>
- <item quantity="other" msgid="5523506463832158203">"%d skärmar i översikten"</item>
+ <item quantity="one" msgid="3969335317929254918">"En skärm i Översikten"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d skärmar i Översikten"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Inga aviseringar"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Pågående"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index fcb15eb..19cb125 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -33,7 +33,7 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Inaendelea"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Arifa"</string>
<string name="battery_low_title" msgid="6456385927409742437">"Betri imeisha"</string>
- <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> zimebakia"</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"Imebakisha <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
<string name="battery_low_percent_format_saver_started" msgid="6534746636002666456">"Imesalia <xliff:g id="NUMBER">%d%%</xliff:g>. Kiokoa betri kimewashwa."</string>
<string name="invalid_charger" msgid="4549105996740522523">"Chaji ya USB haihamiliwi.\n Tumia chaka iliyopeanwa."</string>
<string name="invalid_charger_title" msgid="3515740382572798460">"Kuchaji kwa kutumia USB hakutumiki."</string>
diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml
index 1908e87..14f440f 100644
--- a/packages/SystemUI/res/values-te-rIN/strings.xml
+++ b/packages/SystemUI/res/values-te-rIN/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"మీ ఇటీవలి స్క్రీన్లు ఇక్కడ కనిపిస్తాయి"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ఇటీవలి అనువర్తనాలను తీసివేయండి"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"స్థూలదృష్టిలో 1 స్క్రీన్ ఉంది"</item>
- <item quantity="other" msgid="5523506463832158203">"స్థూలదృష్టిలో %d స్క్రీన్లు ఉన్నాయి"</item>
+ <item quantity="one" msgid="3969335317929254918">"అవలోకనంలో 1 స్క్రీన్ ఉంది"</item>
+ <item quantity="other" msgid="5523506463832158203">"అవలోకనంలో %d స్క్రీన్లు ఉన్నాయి"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"నోటిఫికేషన్లు లేవు"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"కొనసాగుతున్నవి"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"వెనుకకు"</string>
<string name="accessibility_home" msgid="8217216074895377641">"హోమ్"</string>
<string name="accessibility_menu" msgid="316839303324695949">"మెను"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"స్థూలదృష్టి"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"అవలోకనం"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"శోధించు"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"కెమెరా"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ఫోన్"</string>
@@ -143,7 +143,7 @@
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"రోమింగ్"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"ఎడ్జ్"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
- <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM లేదు."</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"సిమ్ లేదు."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"బ్లూటూత్ టెథెరింగ్."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ఎయిర్ప్లేన్ మోడ్."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"బ్యాటరీ <xliff:g id="NUMBER">%d</xliff:g> శాతం."</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"శీఘ్ర సెట్టింగ్లు."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"లాక్ స్క్రీన్."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"సెట్టింగ్లు"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"స్థూలదృష్టి."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"అవలోకనం."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"వినియోగదారు <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"వైఫై ఆఫ్ చేయబడింది."</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index b5954a3..a1a7a46 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Lumalabas dito ang iyong kamakailang screen"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Huwag pansinin ang kamakailang apps"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 screen sa Pangkalahatang-ideya"</item>
- <item quantity="other" msgid="5523506463832158203">"%d (na) screen sa Pangkalahatang-ideya"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 screen sa Overview"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d (na) screen sa Overview"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Walang mga notification"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Nagpapatuloy"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Bumalik"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Home"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Pangkalahatang-ideya"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Overview"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Hanapin"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Camera"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Telepono"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Mga mabilisang setting."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Mga Setting"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Pangkalahatang-ideya."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User na si <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Na-off ang wifi."</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 5871b03..bdcfac3 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Ваші останні екрани відображаються тут"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Відхилити останні програми"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"На панелі огляду 1 екран"</item>
- <item quantity="other" msgid="5523506463832158203">"Екранів на панелі огляду: %d"</item>
+ <item quantity="one" msgid="3969335317929254918">"Показано 1 екран"</item>
+ <item quantity="other" msgid="5523506463832158203">"Показано екранів: %d"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Немає сповіщень"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Поточні"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Швидке налаштування."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Заблокований екран."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Налаштування"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Панель огляду."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Огляд."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Користувач <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi вимкнено."</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 2f48a15..dfe34bc 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -300,7 +300,7 @@
<string name="speed_bump_explanation" msgid="1288875699658819755">"較不緊急的通知會顯示在下方"</string>
<string name="notification_tap_again" msgid="8524949573675922138">"再次輕觸即可開啟"</string>
<string name="keyguard_unlock" msgid="8043466894212841998">"向上滑動即可解鎖"</string>
- <string name="phone_hint" msgid="3101468054914424646">"向左滑動可使用手機功能"</string>
+ <string name="phone_hint" msgid="3101468054914424646">"向右滑動可使用手機功能"</string>
<string name="camera_hint" msgid="5241441720959174226">"向左滑動可使用相機功能"</string>
<string name="interruption_level_none" msgid="3831278883136066646">"無"</string>
<string name="interruption_level_priority" msgid="6517366750688942030">"優先"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index d06d339..ad25dab 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Izikrini zakho zakamuva zivela lapha"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Susa izinhlelo zokusebenza zakamumva"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 isikrini esiku-Ukubuka konke"</item>
- <item quantity="other" msgid="5523506463832158203">"%d wezikrini eziku-Ukubuka konke"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 isikrini esiku-Buka konke"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d wezikrini eziku-Buka konke"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Azikho izaziso"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Okuqhubekayo"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Emuva"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Ekhaya"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Imenyu"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Ukubuka konke"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Buka konke"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Sesha"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Ikhamela"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Ifoni"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Izilingiselelo ezisheshayo."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Khiya isikrini."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Izilungiselelo"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ukubuka konke."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Buka konke."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Umsebenzisi <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"I-Wifi ivaliwe."</string>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 4f41cd5..fcdc015 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -63,6 +63,8 @@
<!-- thickness (height) of the navigation bar on phones that require it -->
<dimen name="navigation_bar_size">@*android:dimen/navigation_bar_height</dimen>
+ <!-- Minimum swipe distance to catch the swipe gestures to invoke assist or switch tasks. -->
+ <dimen name="navigation_bar_min_swipe_distance">48dp</dimen>
<!-- thickness (height) of the dead zone at the top of the navigation bar,
reducing false presses on navbar buttons; approx 2mm -->
@@ -318,7 +320,7 @@
<dimen name="heads_up_window_height">250dp</dimen>
<!-- The minimum amount the user needs to swipe to go to the camera / phone. -->
- <dimen name="keyguard_min_swipe_amount">90dp</dimen>
+ <dimen name="keyguard_min_swipe_amount">110dp</dimen>
<!-- The minimum background radius when swiping to a side for the camera / phone affordances. -->
<dimen name="keyguard_affordance_min_background_radius">30dp</dimen>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java
index 628aab8..7ae6764 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java
@@ -17,10 +17,11 @@
package com.android.systemui.statusbar;
import android.app.StatusBarManager;
+import android.content.res.Resources;
import android.graphics.RectF;
import android.view.MotionEvent;
import android.view.View;
-import android.view.ViewConfiguration;
+import com.android.systemui.R;
public class DelegateViewHelper {
private View mDelegateView;
@@ -106,8 +107,8 @@
public void setSourceView(View view) {
mSourceView = view;
if (mSourceView != null) {
- mTriggerThreshhold =
- ViewConfiguration.get(mSourceView.getContext()).getScaledPagingTouchSlop();
+ Resources r = mSourceView.getContext().getResources();
+ mTriggerThreshhold = r.getDimensionPixelSize(R.dimen.navigation_bar_min_swipe_distance);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
index 6653254..f1dcffb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
@@ -46,7 +46,6 @@
private FlingAnimationUtils mFlingAnimationUtils;
private Callback mCallback;
- private int mTrackingPointer;
private VelocityTracker mVelocityTracker;
private boolean mSwipingInProgress;
private float mInitialTouchX;
@@ -65,6 +64,7 @@
private Animator mSwipeAnimator;
private int mMinBackgroundRadius;
private boolean mMotionPerformedByUser;
+ private boolean mMotionCancelled;
private AnimatorListenerAdapter mFlingEndListener = new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
@@ -117,13 +117,11 @@
}
public boolean onTouchEvent(MotionEvent event) {
- int pointerIndex = event.findPointerIndex(mTrackingPointer);
- if (pointerIndex < 0) {
- pointerIndex = 0;
- mTrackingPointer = event.getPointerId(pointerIndex);
+ if (mMotionCancelled && event.getActionMasked() != MotionEvent.ACTION_DOWN) {
+ return false;
}
- final float y = event.getY(pointerIndex);
- final float x = event.getX(pointerIndex);
+ final float y = event.getY();
+ final float x = event.getX();
boolean isUp = false;
switch (event.getActionMasked()) {
@@ -137,22 +135,12 @@
initVelocityTracker();
trackMovement(event);
mMotionPerformedByUser = false;
+ mMotionCancelled = false;
break;
-
- case MotionEvent.ACTION_POINTER_UP:
- final int upPointer = event.getPointerId(event.getActionIndex());
- if (mTrackingPointer == upPointer) {
- // gesture is ongoing, find a new pointer to track
- final int newIndex = event.getPointerId(0) != upPointer ? 0 : 1;
- final float newY = event.getY(newIndex);
- final float newX = event.getX(newIndex);
- mTrackingPointer = event.getPointerId(newIndex);
- mInitialTouchY = newY;
- mInitialTouchX = newX;
- mTranslationOnDown = mTranslation;
- }
+ case MotionEvent.ACTION_POINTER_DOWN:
+ mMotionCancelled = true;
+ endMotion(event, true /* forceSnapBack */);
break;
-
case MotionEvent.ACTION_MOVE:
final float w = x - mInitialTouchX;
trackMovement(event);
@@ -174,20 +162,23 @@
case MotionEvent.ACTION_UP:
isUp = true;
case MotionEvent.ACTION_CANCEL:
- mTrackingPointer = -1;
trackMovement(event);
- if (mSwipingInProgress) {
- flingWithCurrentVelocity(!isUp);
- }
- if (mVelocityTracker != null) {
- mVelocityTracker.recycle();
- mVelocityTracker = null;
- }
+ endMotion(event, !isUp);
break;
}
return true;
}
+ private void endMotion(MotionEvent event, boolean forceSnapBack) {
+ if (mSwipingInProgress) {
+ flingWithCurrentVelocity(forceSnapBack);
+ }
+ if (mVelocityTracker != null) {
+ mVelocityTracker.recycle();
+ mVelocityTracker = null;
+ }
+ }
+
private void setSwipingInProgress(boolean inProgress) {
mSwipingInProgress = inProgress;
if (inProgress) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarViewTaskSwitchHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarViewTaskSwitchHelper.java
index c253e19..fdfcdfb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarViewTaskSwitchHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarViewTaskSwitchHelper.java
@@ -17,9 +17,11 @@
package com.android.systemui.statusbar.phone;
import android.content.Context;
+import android.content.res.Resources;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
+import com.android.systemui.R;
import com.android.systemui.statusbar.BaseStatusBar;
public class NavigationBarViewTaskSwitchHelper extends GestureDetector.SimpleOnGestureListener {
@@ -36,7 +38,8 @@
public NavigationBarViewTaskSwitchHelper(Context context) {
ViewConfiguration configuration = ViewConfiguration.get(context);
- mScrollTouchSlop = 4 * configuration.getScaledTouchSlop();
+ Resources r = context.getResources();
+ mScrollTouchSlop = r.getDimensionPixelSize(R.dimen.navigation_bar_min_swipe_distance);
mMinFlingVelocity = configuration.getScaledMinimumFlingVelocity();
mTaskSwitcherDetector = new GestureDetector(context, this);
}
diff --git a/services/core/java/com/android/server/NativeDaemonConnector.java b/services/core/java/com/android/server/NativeDaemonConnector.java
index 96f9ab0..8c3b020 100644
--- a/services/core/java/com/android/server/NativeDaemonConnector.java
+++ b/services/core/java/com/android/server/NativeDaemonConnector.java
@@ -176,7 +176,6 @@
if (buffer[i] == 0) {
final String rawEvent = new String(
buffer, start, i - start, StandardCharsets.UTF_8);
- log("RCV <- {" + rawEvent + "}");
boolean releaseWl = false;
try {
@@ -197,7 +196,6 @@
mResponseQueue.add(event.getCmdNumber(), event);
}
} catch (IllegalArgumentException e) {
- log("Problem parsing message: " + rawEvent + " - " + e);
} finally {
if (releaseWl) {
mWakeLock.acquire();
@@ -209,7 +207,6 @@
}
if (start == 0) {
final String rawEvent = new String(buffer, start, count, StandardCharsets.UTF_8);
- log("RCV incomplete <- {" + rawEvent + "}");
}
// We should end at the amount we read. If not, compact then
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 5b22255..a4aff77 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -177,7 +177,7 @@
// 1280x800 or larger screen with around 1GB RAM. Values are in KB.
private final int[] mOomMinFreeHigh = new int[] {
73728, 92160, 110592,
- 129024, 147456, 184320
+ 129024, 225000, 325000
};
// The actual OOM killer memory levels we are using.
private final int[] mOomMinFree = new int[mOomAdj.length];
@@ -235,22 +235,16 @@
Slog.i("XXXXXX", "minfree_adj=" + minfree_adj + " minfree_abs=" + minfree_abs);
}
- // We've now baked in the increase to the basic oom values above, since
- // they seem to be useful more generally for devices that are tight on
- // memory than just for 64 bit. This should probably have some more
- // tuning done, so not deleting it quite yet...
- final boolean is64bit = false; //Build.SUPPORTED_64_BIT_ABIS.length > 0;
+ if (Build.SUPPORTED_64_BIT_ABIS.length > 0) {
+ // Increase the high min-free levels for cached processes for 64-bit
+ mOomMinFreeHigh[4] = 225000;
+ mOomMinFreeHigh[5] = 325000;
+ }
for (int i=0; i<mOomAdj.length; i++) {
int low = mOomMinFreeLow[i];
int high = mOomMinFreeHigh[i];
mOomMinFree[i] = (int)(low + ((high-low)*scale));
- if (is64bit) {
- // On 64 bit devices, we consume more baseline RAM, because 64 bit is cool!
- // To avoid being all pagey and stuff, scale up the memory levels to
- // give us some breathing room.
- mOomMinFree[i] = (3*mOomMinFree[i])/2;
- }
}
if (minfree_abs >= 0) {
diff --git a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
index cdfb656..531d20a 100644
--- a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
+++ b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
@@ -91,7 +91,8 @@
public void onStart() {
publishBinderService(Context.MEDIA_PROJECTION_SERVICE, new BinderService(),
false /*allowIsolated*/);
- mMediaRouter.addCallback(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, mMediaRouterCallback);
+ mMediaRouter.addCallback(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, mMediaRouterCallback,
+ MediaRouter.CALLBACK_FLAG_PASSIVE_DISCOVERY);
}
@Override
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index b79e157..3e1647e 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2860,6 +2860,38 @@
return PackageManager.SIGNATURE_NO_MATCH;
}
+ private boolean isRecoverSignatureUpdateNeeded(PackageParser.Package scannedPkg) {
+ if (isExternal(scannedPkg)) {
+ return mSettings.isExternalDatabaseVersionOlderThan(
+ DatabaseVersion.SIGNATURE_MALFORMED_RECOVER);
+ } else {
+ return mSettings.isInternalDatabaseVersionOlderThan(
+ DatabaseVersion.SIGNATURE_MALFORMED_RECOVER);
+ }
+ }
+
+ private int compareSignaturesRecover(PackageSignatures existingSigs,
+ PackageParser.Package scannedPkg) {
+ if (!isRecoverSignatureUpdateNeeded(scannedPkg)) {
+ return PackageManager.SIGNATURE_NO_MATCH;
+ }
+
+ String msg = null;
+ try {
+ if (Signature.areEffectiveMatch(existingSigs.mSignatures, scannedPkg.mSignatures)) {
+ logCriticalInfo(Log.INFO, "Recovered effectively matching certificates for "
+ + scannedPkg.packageName);
+ return PackageManager.SIGNATURE_MATCH;
+ }
+ } catch (CertificateException e) {
+ msg = e.getMessage();
+ }
+
+ logCriticalInfo(Log.INFO,
+ "Failed to recover certificates for " + scannedPkg.packageName + ": " + msg);
+ return PackageManager.SIGNATURE_NO_MATCH;
+ }
+
@Override
public String[] getPackagesForUid(int uid) {
uid = UserHandle.getAppId(uid);
@@ -4148,7 +4180,8 @@
if (ps != null
&& ps.codePath.equals(srcFile)
&& ps.timeStamp == srcFile.lastModified()
- && !isCompatSignatureUpdateNeeded(pkg)) {
+ && !isCompatSignatureUpdateNeeded(pkg)
+ && !isRecoverSignatureUpdateNeeded(pkg)) {
long mSigningKeySetId = ps.keySetData.getProperSigningKeySet();
if (ps.signatures.mSignatures != null
&& ps.signatures.mSignatures.length != 0
@@ -4423,6 +4456,10 @@
== PackageManager.SIGNATURE_MATCH;
}
if (!match) {
+ match = compareSignaturesRecover(pkgSetting.signatures, pkg)
+ == PackageManager.SIGNATURE_MATCH;
+ }
+ if (!match) {
throw new PackageManagerException(INSTALL_FAILED_UPDATE_INCOMPATIBLE, "Package "
+ pkg.packageName + " signatures do not match the "
+ "previously installed version; ignoring!");
@@ -4439,6 +4476,10 @@
== PackageManager.SIGNATURE_MATCH;
}
if (!match) {
+ match = compareSignaturesRecover(pkgSetting.sharedUser.signatures, pkg)
+ == PackageManager.SIGNATURE_MATCH;
+ }
+ if (!match) {
throw new PackageManagerException(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,
"Package " + pkg.packageName
+ " has no signatures that match those in shared user "
@@ -5386,6 +5427,9 @@
if (!pkgSetting.keySetData.isUsingUpgradeKeySets() || pkgSetting.sharedUser != null) {
try {
verifySignaturesLP(pkgSetting, pkg);
+ // We just determined the app is signed correctly, so bring
+ // over the latest parsed certs.
+ pkgSetting.signatures.mSignatures = pkg.mSignatures;
} catch (PackageManagerException e) {
if ((parseFlags & PackageParser.PARSE_IS_SYSTEM_DIR) == 0) {
throw e;
@@ -5418,7 +5462,8 @@
+ pkg.packageName + " upgrade keys do not match the "
+ "previously installed version");
} else {
- // signatures may have changed as result of upgrade
+ // We just determined the app is signed correctly, so bring
+ // over the latest parsed certs.
pkgSetting.signatures.mSignatures = pkg.mSignatures;
}
}
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 7de56c8..699adef 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -103,7 +103,7 @@
* Note that care should be taken to make sure all database upgrades are
* idempotent.
*/
- private static final int CURRENT_DATABASE_VERSION = DatabaseVersion.SIGNATURE_END_ENTITY;
+ private static final int CURRENT_DATABASE_VERSION = DatabaseVersion.SIGNATURE_MALFORMED_RECOVER;
/**
* This class contains constants that can be referred to from upgrade code.
@@ -121,6 +121,14 @@
* just the signing certificate.
*/
public static final int SIGNATURE_END_ENTITY = 2;
+
+ /**
+ * There was a window of time in
+ * {@link android.os.Build.VERSION_CODES#LOLLIPOP} where we persisted
+ * certificates after potentially mutating them. To switch back to the
+ * original untouched certificates, we need to force a collection pass.
+ */
+ public static final int SIGNATURE_MALFORMED_RECOVER = 3;
}
private static final boolean DEBUG_STOPPED = false;
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-b.png b/tools/layoutlib/bridge/resources/icons/shadow-b.png
new file mode 100644
index 0000000..68f4f4b
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-b.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-bl.png b/tools/layoutlib/bridge/resources/icons/shadow-bl.png
new file mode 100644
index 0000000..ee7dbe8
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-bl.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-br.png b/tools/layoutlib/bridge/resources/icons/shadow-br.png
new file mode 100644
index 0000000..c45ad77
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-br.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-l.png b/tools/layoutlib/bridge/resources/icons/shadow-l.png
new file mode 100644
index 0000000..77d0bd0
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-l.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-r.png b/tools/layoutlib/bridge/resources/icons/shadow-r.png
new file mode 100644
index 0000000..4af7a33
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-r.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-tl.png b/tools/layoutlib/bridge/resources/icons/shadow-tl.png
new file mode 100644
index 0000000..424fb36
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-tl.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-tr.png b/tools/layoutlib/bridge/resources/icons/shadow-tr.png
new file mode 100644
index 0000000..1fd0c772
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-tr.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-b.png b/tools/layoutlib/bridge/resources/icons/shadow2-b.png
new file mode 100644
index 0000000..963973e
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-b.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-bl.png b/tools/layoutlib/bridge/resources/icons/shadow2-bl.png
new file mode 100644
index 0000000..7612487
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-bl.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-br.png b/tools/layoutlib/bridge/resources/icons/shadow2-br.png
new file mode 100644
index 0000000..8e20252
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-br.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-l.png b/tools/layoutlib/bridge/resources/icons/shadow2-l.png
new file mode 100644
index 0000000..2db18a0
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-l.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-r.png b/tools/layoutlib/bridge/resources/icons/shadow2-r.png
new file mode 100644
index 0000000..8e026f1
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-r.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-tl.png b/tools/layoutlib/bridge/resources/icons/shadow2-tl.png
new file mode 100644
index 0000000..a8045ed
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-tl.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-tr.png b/tools/layoutlib/bridge/resources/icons/shadow2-tr.png
new file mode 100644
index 0000000..590373c
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-tr.png
Binary files differ
diff --git a/tools/layoutlib/bridge/src/android/animation/AnimatorInflater_Delegate.java b/tools/layoutlib/bridge/src/android/animation/AnimatorInflater_Delegate.java
new file mode 100644
index 0000000..4475fa4
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/animation/AnimatorInflater_Delegate.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.animation;
+
+import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
+import android.content.res.Resources.Theme;
+import android.util.AttributeSet;
+
+/**
+ * Delegate providing alternate implementation to static methods in {@link AnimatorInflater}.
+ */
+public class AnimatorInflater_Delegate {
+
+ @LayoutlibDelegate
+ /*package*/ static Animator loadAnimator(Context context, int id)
+ throws NotFoundException {
+ return loadAnimator(context.getResources(), context.getTheme(), id);
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static Animator loadAnimator(Resources resources, Theme theme, int id)
+ throws NotFoundException {
+ return loadAnimator(resources, theme, id, 1);
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static Animator loadAnimator(Resources resources, Theme theme, int id,
+ float pathErrorScale) throws NotFoundException {
+ // This is a temporary fix to http://b.android.com/77865. This skips loading the
+ // animation altogether.
+ // TODO: Remove this override when Path.approximate() is supported.
+ return new FakeAnimator();
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static ValueAnimator loadAnimator(Resources res, Theme theme,
+ AttributeSet attrs, ValueAnimator anim, float pathErrorScale)
+ throws NotFoundException {
+ return AnimatorInflater.loadAnimator_Original(res, theme, attrs, anim, pathErrorScale);
+ }
+}
diff --git a/tools/layoutlib/bridge/src/android/animation/FakeAnimator.java b/tools/layoutlib/bridge/src/android/animation/FakeAnimator.java
new file mode 100644
index 0000000..78aedc5
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/animation/FakeAnimator.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.animation;
+
+/**
+ * A fake implementation of Animator which doesn't do anything.
+ */
+public class FakeAnimator extends Animator {
+ @Override
+ public long getStartDelay() {
+ return 0;
+ }
+
+ @Override
+ public void setStartDelay(long startDelay) {
+
+ }
+
+ @Override
+ public Animator setDuration(long duration) {
+ return this;
+ }
+
+ @Override
+ public long getDuration() {
+ return 0;
+ }
+
+ @Override
+ public void setInterpolator(TimeInterpolator value) {
+
+ }
+
+ @Override
+ public boolean isRunning() {
+ return false;
+ }
+}
diff --git a/tools/layoutlib/bridge/src/android/content/res/AssetManager_Delegate.java b/tools/layoutlib/bridge/src/android/content/res/AssetManager_Delegate.java
index 914a359..e0d3b8c 100644
--- a/tools/layoutlib/bridge/src/android/content/res/AssetManager_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/content/res/AssetManager_Delegate.java
@@ -38,8 +38,4 @@
Resources_Theme_Delegate.getDelegateManager().removeJavaReferenceFor(theme);
}
- @LayoutlibDelegate
- /*package*/ static void applyThemeStyle(long theme, int styleRes, boolean force) {
- Resources_Theme_Delegate.getDelegateManager().getDelegate(theme).force = force;
- }
}
diff --git a/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java b/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java
index dd573be..66126af 100644
--- a/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java
+++ b/tools/layoutlib/bridge/src/android/content/res/BridgeResources.java
@@ -163,7 +163,7 @@
Pair<String, ResourceValue> value = getResourceValue(id, mPlatformResourceFlag);
if (value != null) {
- return ResourceHelper.getDrawable(value.getSecond(), mContext);
+ return ResourceHelper.getDrawable(value.getSecond(), mContext, theme);
}
// id was not found or not resolved. Throw a NotFoundException.
diff --git a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java b/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
index 28a109d..a2bd6d7 100644
--- a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
+++ b/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
@@ -32,6 +32,7 @@
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
+import android.content.res.Resources.Theme;
import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics;
import android.util.TypedValue;
@@ -116,6 +117,13 @@
}
/**
+ * Set the theme to be used for inflating drawables.
+ */
+ public void setTheme(Theme theme) {
+ mTheme = theme;
+ }
+
+ /**
* Return the number of values in this array.
*/
@Override
@@ -663,7 +671,7 @@
}
ResourceValue value = mResourceData[index];
- return ResourceHelper.getDrawable(value, mContext);
+ return ResourceHelper.getDrawable(value, mContext, mTheme);
}
diff --git a/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java b/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java
index f4a9f52..4bd83e9 100644
--- a/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java
@@ -39,9 +39,6 @@
*/
public class Resources_Theme_Delegate {
- // Whether to use the Theme.mThemeResId as primary theme.
- boolean force;
-
// ---- delegate manager ----
private static final DelegateManager<Resources_Theme_Delegate> sManager =
@@ -58,7 +55,8 @@
Resources thisResources, Theme thisTheme,
int[] attrs) {
boolean changed = setupResources(thisTheme);
- TypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(attrs);
+ BridgeTypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(attrs);
+ ta.setTheme(thisTheme);
restoreResources(changed);
return ta;
}
@@ -69,7 +67,9 @@
int resid, int[] attrs)
throws NotFoundException {
boolean changed = setupResources(thisTheme);
- TypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(resid, attrs);
+ BridgeTypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(resid,
+ attrs);
+ ta.setTheme(thisTheme);
restoreResources(changed);
return ta;
}
@@ -79,8 +79,9 @@
Resources thisResources, Theme thisTheme,
AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) {
boolean changed = setupResources(thisTheme);
- TypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(set, attrs,
- defStyleAttr, defStyleRes);
+ BridgeTypedArray ta = RenderSessionImpl.getCurrentContext().obtainStyledAttributes(set,
+ attrs, defStyleAttr, defStyleRes);
+ ta.setTheme(thisTheme);
restoreResources(changed);
return ta;
}
@@ -91,8 +92,8 @@
int resid, TypedValue outValue,
boolean resolveRefs) {
boolean changed = setupResources(thisTheme);
- boolean found = RenderSessionImpl.getCurrentContext().resolveThemeAttribute(
- resid, outValue, resolveRefs);
+ boolean found = RenderSessionImpl.getCurrentContext().resolveThemeAttribute(resid,
+ outValue, resolveRefs);
restoreResources(changed);
return found;
}
@@ -107,14 +108,29 @@
// ---- private helper methods ----
private static boolean setupResources(Theme thisTheme) {
- Resources_Theme_Delegate themeDelegate = sManager.getDelegate(thisTheme.getNativeTheme());
- StyleResourceValue style = resolveStyle(thisTheme.getAppliedStyleResId());
- if (style != null) {
- RenderSessionImpl.getCurrentContext().getRenderResources()
- .applyStyle(style, themeDelegate.force);
- return true;
+ // Key is a space-separated list of theme ids applied that have been merged into the
+ // BridgeContext's theme to make thisTheme.
+ String[] appliedStyles = thisTheme.getKey().split(" ");
+ boolean changed = false;
+ for (String s : appliedStyles) {
+ if (s.isEmpty()) {
+ continue;
+ }
+ // See the definition of force parameter in Theme.applyStyle().
+ boolean force = false;
+ if (s.charAt(s.length() - 1) == '!') {
+ force = true;
+ s = s.substring(0, s.length() - 1);
+ }
+ int styleId = Integer.parseInt(s, 16);
+ StyleResourceValue style = resolveStyle(styleId);
+ if (style != null) {
+ RenderSessionImpl.getCurrentContext().getRenderResources().applyStyle(style, force);
+ changed = true;
+ }
+
}
- return false;
+ return changed;
}
private static void restoreResources(boolean changed) {
diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
index f4282ad..8d24d38 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
@@ -141,7 +141,6 @@
* Creates and returns a {@link Bitmap} initialized with the given stream content.
*
* @param input the stream from which to read the bitmap content
- * @param createFlags
* @param density the density associated with the bitmap
*
* @see Bitmap#isPremultiplied()
@@ -166,8 +165,7 @@
* @see Bitmap#isMutable()
* @see Bitmap#getDensity()
*/
- public static Bitmap createBitmap(BufferedImage image, boolean isMutable,
- Density density) throws IOException {
+ public static Bitmap createBitmap(BufferedImage image, boolean isMutable, Density density) {
return createBitmap(image, getPremultipliedBitmapCreateFlags(isMutable), density);
}
@@ -175,7 +173,6 @@
* Creates and returns a {@link Bitmap} initialized with the given {@link BufferedImage}
*
* @param image the bitmap content
- * @param createFlags
* @param density the density associated with the bitmap
*
* @see Bitmap#isPremultiplied()
@@ -183,7 +180,7 @@
* @see Bitmap#getDensity()
*/
public static Bitmap createBitmap(BufferedImage image, Set<BitmapCreateFlags> createFlags,
- Density density) throws IOException {
+ Density density) {
// create a delegate with the given image.
Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ARGB_8888);
diff --git a/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java b/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java
new file mode 100644
index 0000000..6c949d9
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
+
+/**
+ * Delegate implementing the native methods of {@link RenderNode}
+ * <p/>
+ * Through the layoutlib_create tool, some native methods of RenderNode have been replaced by calls
+ * to methods of the same name in this delegate class.
+ *
+ * @see DelegateManager
+ */
+public class RenderNode_Delegate {
+
+
+ // ---- delegate manager ----
+ private static final DelegateManager<RenderNode_Delegate> sManager =
+ new DelegateManager<RenderNode_Delegate>(RenderNode_Delegate.class);
+
+
+ private float mLift;
+ @SuppressWarnings("UnusedDeclaration")
+ private String mName;
+
+ @LayoutlibDelegate
+ /*package*/ static long nCreate(String name) {
+ RenderNode_Delegate renderNodeDelegate = new RenderNode_Delegate();
+ renderNodeDelegate.mName = name;
+ return sManager.addNewDelegate(renderNodeDelegate);
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static void nDestroyRenderNode(long renderNode) {
+ sManager.removeJavaReferenceFor(renderNode);
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static boolean nSetElevation(long renderNode, float lift) {
+ RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
+ if (delegate != null && delegate.mLift != lift) {
+ delegate.mLift = lift;
+ return true;
+ }
+ return false;
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static float nGetElevation(long renderNode) {
+ RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
+ if (delegate != null) {
+ return delegate.mLift;
+ }
+ return 0f;
+ }
+}
diff --git a/tools/layoutlib/bridge/src/android/view/ShadowPainter.java b/tools/layoutlib/bridge/src/android/view/ShadowPainter.java
new file mode 100644
index 0000000..38846bd
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/view/ShadowPainter.java
@@ -0,0 +1,415 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import com.android.annotations.NonNull;
+
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBufferInt;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.ImageIO;
+
+public class ShadowPainter {
+
+ /**
+ * Adds a drop shadow to a semi-transparent image (of an arbitrary shape) and returns it as a
+ * new image. This method attempts to mimic the same visual characteristics as the rectangular
+ * shadow painting methods in this class, {@link #createRectangularDropShadow(java.awt.image.BufferedImage)}
+ * and {@link #createSmallRectangularDropShadow(java.awt.image.BufferedImage)}.
+ *
+ * @param source the source image
+ * @param shadowSize the size of the shadow, normally {@link #SHADOW_SIZE or {@link
+ * #SMALL_SHADOW_SIZE}}
+ *
+ * @return a new image with the shadow painted in
+ */
+ @NonNull
+ public static BufferedImage createDropShadow(BufferedImage source, int shadowSize) {
+ shadowSize /= 2; // make shadow size have the same meaning as in the other shadow paint methods in this class
+
+ return createDropShadow(source, shadowSize, 0.7f, 0);
+ }
+
+ /**
+ * Creates a drop shadow of a given image and returns a new image which shows the input image on
+ * top of its drop shadow.
+ * <p/>
+ * <b>NOTE: If the shape is rectangular and opaque, consider using {@link
+ * #drawRectangleShadow(Graphics2D, int, int, int, int)} instead.</b>
+ *
+ * @param source the source image to be shadowed
+ * @param shadowSize the size of the shadow in pixels
+ * @param shadowOpacity the opacity of the shadow, with 0=transparent and 1=opaque
+ * @param shadowRgb the RGB int to use for the shadow color
+ *
+ * @return a new image with the source image on top of its shadow
+ */
+ @SuppressWarnings({"SuspiciousNameCombination", "UnnecessaryLocalVariable"}) // Imported code
+ public static BufferedImage createDropShadow(BufferedImage source, int shadowSize,
+ float shadowOpacity, int shadowRgb) {
+
+ // This code is based on
+ // http://www.jroller.com/gfx/entry/non_rectangular_shadow
+
+ BufferedImage image;
+ int width = source.getWidth();
+ int height = source.getHeight();
+ image = new BufferedImage(width + SHADOW_SIZE, height + SHADOW_SIZE,
+ BufferedImage.TYPE_INT_ARGB);
+
+ Graphics2D g2 = image.createGraphics();
+ g2.drawImage(image, shadowSize, shadowSize, null);
+
+ int dstWidth = image.getWidth();
+ int dstHeight = image.getHeight();
+
+ int left = (shadowSize - 1) >> 1;
+ int right = shadowSize - left;
+ int xStart = left;
+ int xStop = dstWidth - right;
+ int yStart = left;
+ int yStop = dstHeight - right;
+
+ shadowRgb &= 0x00FFFFFF;
+
+ int[] aHistory = new int[shadowSize];
+ int historyIdx;
+
+ int aSum;
+
+ int[] dataBuffer = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
+ int lastPixelOffset = right * dstWidth;
+ float sumDivider = shadowOpacity / shadowSize;
+
+ // horizontal pass
+ for (int y = 0, bufferOffset = 0; y < dstHeight; y++, bufferOffset = y * dstWidth) {
+ aSum = 0;
+ historyIdx = 0;
+ for (int x = 0; x < shadowSize; x++, bufferOffset++) {
+ int a = dataBuffer[bufferOffset] >>> 24;
+ aHistory[x] = a;
+ aSum += a;
+ }
+
+ bufferOffset -= right;
+
+ for (int x = xStart; x < xStop; x++, bufferOffset++) {
+ int a = (int) (aSum * sumDivider);
+ dataBuffer[bufferOffset] = a << 24 | shadowRgb;
+
+ // subtract the oldest pixel from the sum
+ aSum -= aHistory[historyIdx];
+
+ // get the latest pixel
+ a = dataBuffer[bufferOffset + right] >>> 24;
+ aHistory[historyIdx] = a;
+ aSum += a;
+
+ if (++historyIdx >= shadowSize) {
+ historyIdx -= shadowSize;
+ }
+ }
+ }
+ // vertical pass
+ for (int x = 0, bufferOffset = 0; x < dstWidth; x++, bufferOffset = x) {
+ aSum = 0;
+ historyIdx = 0;
+ for (int y = 0; y < shadowSize; y++, bufferOffset += dstWidth) {
+ int a = dataBuffer[bufferOffset] >>> 24;
+ aHistory[y] = a;
+ aSum += a;
+ }
+
+ bufferOffset -= lastPixelOffset;
+
+ for (int y = yStart; y < yStop; y++, bufferOffset += dstWidth) {
+ int a = (int) (aSum * sumDivider);
+ dataBuffer[bufferOffset] = a << 24 | shadowRgb;
+
+ // subtract the oldest pixel from the sum
+ aSum -= aHistory[historyIdx];
+
+ // get the latest pixel
+ a = dataBuffer[bufferOffset + lastPixelOffset] >>> 24;
+ aHistory[historyIdx] = a;
+ aSum += a;
+
+ if (++historyIdx >= shadowSize) {
+ historyIdx -= shadowSize;
+ }
+ }
+ }
+
+ g2.drawImage(source, null, 0, 0);
+ g2.dispose();
+
+ return image;
+ }
+
+ /**
+ * Draws a rectangular drop shadow (of size {@link #SHADOW_SIZE} by {@link #SHADOW_SIZE} around
+ * the given source and returns a new image with both combined
+ *
+ * @param source the source image
+ *
+ * @return the source image with a drop shadow on the bottom and right
+ */
+ @SuppressWarnings("UnusedDeclaration")
+ public static BufferedImage createRectangularDropShadow(BufferedImage source) {
+ int type = source.getType();
+ if (type == BufferedImage.TYPE_CUSTOM) {
+ type = BufferedImage.TYPE_INT_ARGB;
+ }
+
+ int width = source.getWidth();
+ int height = source.getHeight();
+ BufferedImage image;
+ image = new BufferedImage(width + SHADOW_SIZE, height + SHADOW_SIZE, type);
+ Graphics2D g = image.createGraphics();
+ g.drawImage(source, 0, 0, null);
+ drawRectangleShadow(image, 0, 0, width, height);
+ g.dispose();
+
+ return image;
+ }
+
+ /**
+ * Draws a small rectangular drop shadow (of size {@link #SMALL_SHADOW_SIZE} by {@link
+ * #SMALL_SHADOW_SIZE} around the given source and returns a new image with both combined
+ *
+ * @param source the source image
+ *
+ * @return the source image with a drop shadow on the bottom and right
+ */
+ @SuppressWarnings("UnusedDeclaration")
+ public static BufferedImage createSmallRectangularDropShadow(BufferedImage source) {
+ int type = source.getType();
+ if (type == BufferedImage.TYPE_CUSTOM) {
+ type = BufferedImage.TYPE_INT_ARGB;
+ }
+
+ int width = source.getWidth();
+ int height = source.getHeight();
+
+ BufferedImage image;
+ image = new BufferedImage(width + SMALL_SHADOW_SIZE, height + SMALL_SHADOW_SIZE, type);
+
+ Graphics2D g = image.createGraphics();
+ g.drawImage(source, 0, 0, null);
+ drawSmallRectangleShadow(image, 0, 0, width, height);
+ g.dispose();
+
+ return image;
+ }
+
+ /**
+ * Draws a drop shadow for the given rectangle into the given context. It will not draw anything
+ * if the rectangle is smaller than a minimum determined by the assets used to draw the shadow
+ * graphics. The size of the shadow is {@link #SHADOW_SIZE}.
+ *
+ * @param image the image to draw the shadow into
+ * @param x the left coordinate of the left hand side of the rectangle
+ * @param y the top coordinate of the top of the rectangle
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ */
+ public static void drawRectangleShadow(BufferedImage image,
+ int x, int y, int width, int height) {
+ Graphics2D gc = image.createGraphics();
+ try {
+ drawRectangleShadow(gc, x, y, width, height);
+ } finally {
+ gc.dispose();
+ }
+ }
+
+ /**
+ * Draws a small drop shadow for the given rectangle into the given context. It will not draw
+ * anything if the rectangle is smaller than a minimum determined by the assets used to draw the
+ * shadow graphics. The size of the shadow is {@link #SMALL_SHADOW_SIZE}.
+ *
+ * @param image the image to draw the shadow into
+ * @param x the left coordinate of the left hand side of the rectangle
+ * @param y the top coordinate of the top of the rectangle
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ */
+ public static void drawSmallRectangleShadow(BufferedImage image,
+ int x, int y, int width, int height) {
+ Graphics2D gc = image.createGraphics();
+ try {
+ drawSmallRectangleShadow(gc, x, y, width, height);
+ } finally {
+ gc.dispose();
+ }
+ }
+
+ /**
+ * The width and height of the drop shadow painted by
+ * {@link #drawRectangleShadow(Graphics2D, int, int, int, int)}
+ */
+ public static final int SHADOW_SIZE = 20; // DO NOT EDIT. This corresponds to bitmap graphics
+
+ /**
+ * The width and height of the drop shadow painted by
+ * {@link #drawSmallRectangleShadow(Graphics2D, int, int, int, int)}
+ */
+ public static final int SMALL_SHADOW_SIZE = 10; // DO NOT EDIT. Corresponds to bitmap graphics
+
+ /**
+ * Draws a drop shadow for the given rectangle into the given context. It will not draw anything
+ * if the rectangle is smaller than a minimum determined by the assets used to draw the shadow
+ * graphics.
+ *
+ * @param gc the graphics context to draw into
+ * @param x the left coordinate of the left hand side of the rectangle
+ * @param y the top coordinate of the top of the rectangle
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ */
+ public static void drawRectangleShadow(Graphics2D gc, int x, int y, int width, int height) {
+ assert ShadowBottomLeft != null;
+ assert ShadowBottomRight.getWidth(null) == SHADOW_SIZE;
+ assert ShadowBottomRight.getHeight(null) == SHADOW_SIZE;
+
+ int blWidth = ShadowBottomLeft.getWidth(null);
+ int trHeight = ShadowTopRight.getHeight(null);
+ if (width < blWidth) {
+ return;
+ }
+ if (height < trHeight) {
+ return;
+ }
+
+ gc.drawImage(ShadowBottomLeft, x - ShadowBottomLeft.getWidth(null), y + height, null);
+ gc.drawImage(ShadowBottomRight, x + width, y + height, null);
+ gc.drawImage(ShadowTopRight, x + width, y, null);
+ gc.drawImage(ShadowTopLeft, x - ShadowTopLeft.getWidth(null), y, null);
+ gc.drawImage(ShadowBottom,
+ x, y + height, x + width, y + height + ShadowBottom.getHeight(null),
+ 0, 0, ShadowBottom.getWidth(null), ShadowBottom.getHeight(null), null);
+ gc.drawImage(ShadowRight,
+ x + width, y + ShadowTopRight.getHeight(null), x + width + ShadowRight.getWidth(null), y + height,
+ 0, 0, ShadowRight.getWidth(null), ShadowRight.getHeight(null), null);
+ gc.drawImage(ShadowLeft,
+ x - ShadowLeft.getWidth(null), y + ShadowTopLeft.getHeight(null), x, y + height,
+ 0, 0, ShadowLeft.getWidth(null), ShadowLeft.getHeight(null), null);
+ }
+
+ /**
+ * Draws a small drop shadow for the given rectangle into the given context. It will not draw
+ * anything if the rectangle is smaller than a minimum determined by the assets used to draw the
+ * shadow graphics.
+ * <p/>
+ *
+ * @param gc the graphics context to draw into
+ * @param x the left coordinate of the left hand side of the rectangle
+ * @param y the top coordinate of the top of the rectangle
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ */
+ public static void drawSmallRectangleShadow(Graphics2D gc, int x, int y, int width,
+ int height) {
+ assert Shadow2BottomLeft != null;
+ assert Shadow2TopRight != null;
+ assert Shadow2BottomRight.getWidth(null) == SMALL_SHADOW_SIZE;
+ assert Shadow2BottomRight.getHeight(null) == SMALL_SHADOW_SIZE;
+
+ int blWidth = Shadow2BottomLeft.getWidth(null);
+ int trHeight = Shadow2TopRight.getHeight(null);
+ if (width < blWidth) {
+ return;
+ }
+ if (height < trHeight) {
+ return;
+ }
+
+ gc.drawImage(Shadow2BottomLeft, x - Shadow2BottomLeft.getWidth(null), y + height, null);
+ gc.drawImage(Shadow2BottomRight, x + width, y + height, null);
+ gc.drawImage(Shadow2TopRight, x + width, y, null);
+ gc.drawImage(Shadow2TopLeft, x - Shadow2TopLeft.getWidth(null), y, null);
+ gc.drawImage(Shadow2Bottom,
+ x, y + height, x + width, y + height + Shadow2Bottom.getHeight(null),
+ 0, 0, Shadow2Bottom.getWidth(null), Shadow2Bottom.getHeight(null), null);
+ gc.drawImage(Shadow2Right,
+ x + width, y + Shadow2TopRight.getHeight(null), x + width + Shadow2Right.getWidth(null), y + height,
+ 0, 0, Shadow2Right.getWidth(null), Shadow2Right.getHeight(null), null);
+ gc.drawImage(Shadow2Left,
+ x - Shadow2Left.getWidth(null), y + Shadow2TopLeft.getHeight(null), x, y + height,
+ 0, 0, Shadow2Left.getWidth(null), Shadow2Left.getHeight(null), null);
+ }
+
+ private static Image loadIcon(String name) {
+ InputStream inputStream = ShadowPainter.class.getResourceAsStream(name);
+ if (inputStream == null) {
+ throw new RuntimeException("Unable to load image for shadow: " + name);
+ }
+ try {
+ return ImageIO.read(inputStream);
+ } catch (IOException e) {
+ throw new RuntimeException("Unable to load image for shadow:" + name, e);
+ } finally {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ // ignore.
+ }
+ }
+ }
+
+ // Shadow graphics. This was generated by creating a drop shadow in
+ // Gimp, using the parameters x offset=10, y offset=10, blur radius=10,
+ // (for the small drop shadows x offset=10, y offset=10, blur radius=10)
+ // color=black, and opacity=51. These values attempt to make a shadow
+ // that is legible both for dark and light themes, on top of the
+ // canvas background (rgb(150,150,150). Darker shadows would tend to
+ // blend into the foreground for a dark holo screen, and lighter shadows
+ // would be hard to spot on the canvas background. If you make adjustments,
+ // make sure to check the shadow with both dark and light themes.
+ //
+ // After making the graphics, I cut out the top right, bottom left
+ // and bottom right corners as 20x20 images, and these are reproduced by
+ // painting them in the corresponding places in the target graphics context.
+ // I then grabbed a single horizontal gradient line from the middle of the
+ // right edge,and a single vertical gradient line from the bottom. These
+ // are then painted scaled/stretched in the target to fill the gaps between
+ // the three corner images.
+ //
+ // Filenames: bl=bottom left, b=bottom, br=bottom right, r=right, tr=top right
+
+ // Normal Drop Shadow
+ private static final Image ShadowBottom = loadIcon("/icons/shadow-b.png");
+ private static final Image ShadowBottomLeft = loadIcon("/icons/shadow-bl.png");
+ private static final Image ShadowBottomRight = loadIcon("/icons/shadow-br.png");
+ private static final Image ShadowRight = loadIcon("/icons/shadow-r.png");
+ private static final Image ShadowTopRight = loadIcon("/icons/shadow-tr.png");
+ private static final Image ShadowTopLeft = loadIcon("/icons/shadow-tl.png");
+ private static final Image ShadowLeft = loadIcon("/icons/shadow-l.png");
+
+ // Small Drop Shadow
+ private static final Image Shadow2Bottom = loadIcon("/icons/shadow2-b.png");
+ private static final Image Shadow2BottomLeft = loadIcon("/icons/shadow2-bl.png");
+ private static final Image Shadow2BottomRight = loadIcon("/icons/shadow2-br.png");
+ private static final Image Shadow2Right = loadIcon("/icons/shadow2-r.png");
+ private static final Image Shadow2TopRight = loadIcon("/icons/shadow2-tr.png");
+ private static final Image Shadow2TopLeft = loadIcon("/icons/shadow2-tl.png");
+ private static final Image Shadow2Left = loadIcon("/icons/shadow2-l.png");
+}
diff --git a/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java b/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java
new file mode 100644
index 0000000..a6c00f7
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import com.android.annotations.NonNull;
+import com.android.layoutlib.bridge.android.BridgeContext;
+import com.android.resources.Density;
+import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap_Delegate;
+import android.graphics.Canvas;
+import android.graphics.Outline;
+import android.graphics.Path_Delegate;
+import android.graphics.Rect;
+import android.graphics.Region.Op;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+import android.view.animation.Transformation;
+
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+
+/**
+ * Delegate used to provide new implementation of a select few methods of {@link ViewGroup}
+ * <p/>
+ * Through the layoutlib_create tool, the original methods of ViewGroup have been replaced by calls
+ * to methods of the same name in this delegate class.
+ */
+public class ViewGroup_Delegate {
+
+ /**
+ * Overrides the original drawChild call in ViewGroup to draw the shadow.
+ */
+ @LayoutlibDelegate
+ /*package*/ static boolean drawChild(ViewGroup thisVG, Canvas canvas, View child,
+ long drawingTime) {
+ boolean retVal = thisVG.drawChild_Original(canvas, child, drawingTime);
+ if (child.getZ() > thisVG.getZ()) {
+ ViewOutlineProvider outlineProvider = child.getOutlineProvider();
+ Outline outline = new Outline();
+ outlineProvider.getOutline(child, outline);
+
+ if (outline.mPath != null || (outline.mRect != null && !outline.mRect.isEmpty())) {
+ int restoreTo = transformCanvas(thisVG, canvas, child);
+ drawShadow(thisVG, canvas, child, outline);
+ canvas.restoreToCount(restoreTo);
+ }
+ }
+ return retVal;
+ }
+
+ private static void drawShadow(ViewGroup parent, Canvas canvas, View child,
+ Outline outline) {
+ BufferedImage shadow = null;
+ int x = 0;
+ if (outline.mRect != null) {
+ Shadow s = getRectShadow(parent, canvas, child, outline);
+ shadow = s.mShadow;
+ x = -s.mShadowWidth;
+ } else if (outline.mPath != null) {
+ shadow = getPathShadow(child, outline, canvas);
+ }
+ if (shadow == null) {
+ return;
+ }
+ Bitmap bitmap = Bitmap_Delegate.createBitmap(shadow, false,
+ Density.getEnum(canvas.getDensity()));
+ Rect clipBounds = canvas.getClipBounds();
+ Rect newBounds = new Rect(clipBounds);
+ newBounds.left = newBounds.left + x;
+ canvas.clipRect(newBounds, Op.REPLACE);
+ canvas.drawBitmap(bitmap, x, 0, null);
+ canvas.clipRect(clipBounds, Op.REPLACE);
+ }
+
+ private static Shadow getRectShadow(ViewGroup parent, Canvas canvas, View child,
+ Outline outline) {
+ BufferedImage shadow;
+ Rect clipBounds = canvas.getClipBounds();
+ if (clipBounds.isEmpty()) {
+ return null;
+ }
+ float height = child.getZ() - parent.getZ();
+ // Draw large shadow if difference in z index is more than 10dp
+ float largeShadowThreshold = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f,
+ getMetrics(child));
+ boolean largeShadow = height > largeShadowThreshold;
+ int shadowSize = largeShadow ? ShadowPainter.SHADOW_SIZE : ShadowPainter.SMALL_SHADOW_SIZE;
+ shadow = new BufferedImage(clipBounds.width() + shadowSize, clipBounds.height(),
+ BufferedImage.TYPE_INT_ARGB);
+ Graphics2D graphics = shadow.createGraphics();
+ Rect rect = outline.mRect;
+ if (largeShadow) {
+ ShadowPainter.drawRectangleShadow(graphics,
+ rect.left + shadowSize, rect.top, rect.width(), rect.height());
+ } else {
+ ShadowPainter.drawSmallRectangleShadow(graphics,
+ rect.left + shadowSize, rect.top, rect.width(), rect.height());
+ }
+ graphics.dispose();
+ return new Shadow(shadow, shadowSize);
+ }
+
+ @NonNull
+ private static DisplayMetrics getMetrics(View view) {
+ Context context = view.getContext();
+ while (context instanceof ContextThemeWrapper) {
+ context = ((ContextThemeWrapper) context).getBaseContext();
+ }
+ if (context instanceof BridgeContext) {
+ return ((BridgeContext) context).getMetrics();
+ }
+ throw new RuntimeException("View " + view.getClass().getName() + " not created with the " +
+ "right context");
+ }
+
+ private static BufferedImage getPathShadow(View child, Outline outline, Canvas canvas) {
+ Rect clipBounds = canvas.getClipBounds();
+ BufferedImage image = new BufferedImage(clipBounds.width(), clipBounds.height(),
+ BufferedImage.TYPE_INT_ARGB);
+ Graphics2D graphics = image.createGraphics();
+ graphics.draw(Path_Delegate.getDelegate(outline.mPath.mNativePath).getJavaShape());
+ graphics.dispose();
+ return ShadowPainter.createDropShadow(image, ((int) child.getZ()));
+ }
+
+ // Copied from android.view.View#draw(Canvas, ViewGroup, long) and removed code paths
+ // which were never taken. Ideally, we should hook up the shadow code in the same method so
+ // that we don't have to transform the canvas twice.
+ private static int transformCanvas(ViewGroup thisVG, Canvas canvas, View child) {
+ final int restoreTo = canvas.save();
+ final boolean childHasIdentityMatrix = child.hasIdentityMatrix();
+ int flags = thisVG.mGroupFlags;
+ Transformation transformToApply = null;
+ boolean concatMatrix = false;
+ if ((flags & ViewGroup.FLAG_SUPPORT_STATIC_TRANSFORMATIONS) != 0) {
+ final Transformation t = thisVG.getChildTransformation();
+ final boolean hasTransform = thisVG.getChildStaticTransformation(child, t);
+ if (hasTransform) {
+ final int transformType = t.getTransformationType();
+ transformToApply = transformType != Transformation.TYPE_IDENTITY ? t : null;
+ concatMatrix = (transformType & Transformation.TYPE_MATRIX) != 0;
+ }
+ }
+ concatMatrix |= childHasIdentityMatrix;
+
+ child.computeScroll();
+ int sx = child.mScrollX;
+ int sy = child.mScrollY;
+
+ canvas.translate(child.mLeft - sx, child.mTop - sy);
+ float alpha = child.getAlpha() * child.getTransitionAlpha();
+
+ if (transformToApply != null || alpha < 1 || !childHasIdentityMatrix) {
+ if (transformToApply != null || !childHasIdentityMatrix) {
+ int transX = -sx;
+ int transY = -sy;
+
+ if (transformToApply != null) {
+ if (concatMatrix) {
+ // Undo the scroll translation, apply the transformation matrix,
+ // then redo the scroll translate to get the correct result.
+ canvas.translate(-transX, -transY);
+ canvas.concat(transformToApply.getMatrix());
+ canvas.translate(transX, transY);
+ }
+ if (!childHasIdentityMatrix) {
+ canvas.translate(-transX, -transY);
+ canvas.concat(child.getMatrix());
+ canvas.translate(transX, transY);
+ }
+ }
+
+ }
+ }
+ return restoreTo;
+ }
+
+ private static class Shadow {
+ public BufferedImage mShadow;
+ public int mShadowWidth;
+
+ public Shadow(BufferedImage shadow, int shadowWidth) {
+ mShadow = shadow;
+ mShadowWidth = shadowWidth;
+ }
+
+ }
+}
diff --git a/tools/layoutlib/bridge/src/android/view/WindowCallback.java b/tools/layoutlib/bridge/src/android/view/WindowCallback.java
new file mode 100644
index 0000000..78242a8
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/view/WindowCallback.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import android.view.ActionMode.Callback;
+import android.view.WindowManager.LayoutParams;
+import android.view.accessibility.AccessibilityEvent;
+
+/**
+ * An empty implementation of {@link Window.Callback} that always returns null/false.
+ */
+public class WindowCallback implements Window.Callback {
+ @Override
+ public boolean dispatchKeyEvent(KeyEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean dispatchKeyShortcutEvent(KeyEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean dispatchTrackballEvent(MotionEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean dispatchGenericMotionEvent(MotionEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ return false;
+ }
+
+ @Override
+ public View onCreatePanelView(int featureId) {
+ return null;
+ }
+
+ @Override
+ public boolean onCreatePanelMenu(int featureId, Menu menu) {
+ return false;
+ }
+
+ @Override
+ public boolean onPreparePanel(int featureId, View view, Menu menu) {
+ return false;
+ }
+
+ @Override
+ public boolean onMenuOpened(int featureId, Menu menu) {
+ return false;
+ }
+
+ @Override
+ public boolean onMenuItemSelected(int featureId, MenuItem item) {
+ return false;
+ }
+
+ @Override
+ public void onWindowAttributesChanged(LayoutParams attrs) {
+
+ }
+
+ @Override
+ public void onContentChanged() {
+
+ }
+
+ @Override
+ public void onWindowFocusChanged(boolean hasFocus) {
+
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+
+ }
+
+ @Override
+ public void onDetachedFromWindow() {
+
+ }
+
+ @Override
+ public void onPanelClosed(int featureId, Menu menu) {
+
+ }
+
+ @Override
+ public boolean onSearchRequested() {
+ return false;
+ }
+
+ @Override
+ public ActionMode onWindowStartingActionMode(Callback callback) {
+ return null;
+ }
+
+ @Override
+ public void onActionModeStarted(ActionMode mode) {
+
+ }
+
+ @Override
+ public void onActionModeFinished(ActionMode mode) {
+
+ }
+}
diff --git a/tools/layoutlib/bridge/src/android/widget/Toolbar_Accessor.java b/tools/layoutlib/bridge/src/android/widget/Toolbar_Accessor.java
new file mode 100644
index 0000000..fdd1779
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/widget/Toolbar_Accessor.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget;
+
+import android.content.Context;
+
+/**
+ * To access non public members of classes in {@link Toolbar}
+ */
+public class Toolbar_Accessor {
+ public static ActionMenuPresenter getActionMenuPresenter(Toolbar toolbar) {
+ return toolbar.getOuterActionMenuPresenter();
+ }
+
+ public static Context getPopupContext(Toolbar toolbar) {
+ return toolbar.getPopupContext();
+ }
+}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
index 825731b..ec78712 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
@@ -19,6 +19,7 @@
import static com.android.ide.common.rendering.api.Result.Status.ERROR_UNKNOWN;
import static com.android.ide.common.rendering.api.Result.Status.SUCCESS;
+import com.android.annotations.NonNull;
import com.android.ide.common.rendering.api.Capability;
import com.android.ide.common.rendering.api.DrawableParams;
import com.android.ide.common.rendering.api.LayoutLog;
@@ -459,7 +460,7 @@
public static void setLog(LayoutLog log) {
// check only the thread currently owning the lock can do this.
- if (sLock.isHeldByCurrentThread() == false) {
+ if (!sLock.isHeldByCurrentThread()) {
throw new IllegalStateException("scene must be acquired first. see #acquire(long)");
}
@@ -489,7 +490,6 @@
/**
* Returns the name of a framework resource whose value is an int array.
- * @param array
*/
public static String resolveResourceId(int[] array) {
sIntArrayWrapper.set(array);
@@ -502,6 +502,7 @@
* @param name the name of the resource.
* @return an {@link Integer} containing the resource id, or null if no resource were found.
*/
+ @NonNull
public static Integer getResourceId(ResourceType type, String name) {
Map<String, Integer> map = sRevRMap.get(type);
Integer value = null;
@@ -509,11 +510,8 @@
value = map.get(name);
}
- if (value == null) {
- value = sDynamicIds.getId(type, name);
- }
+ return value == null ? sDynamicIds.getId(type, name) : value;
- return value;
}
/**
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
index 04a52ea..aeb70e9 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
@@ -52,7 +52,6 @@
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
-import android.content.res.TypedArray;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
@@ -115,7 +114,7 @@
private int mDynamicIdGenerator = 0x02030000; // Base id for R.style in custom namespace
// cache for TypedArray generated from IStyleResourceValue object
- private Map<int[], Map<Integer, TypedArray>> mTypedArrayCache;
+ private Map<int[], Map<Integer, BridgeTypedArray>> mTypedArrayCache;
private BridgeInflater mBridgeInflater;
private BridgeContentResolver mContentResolver;
@@ -127,7 +126,6 @@
* @param metrics the {@link DisplayMetrics}.
* @param renderResources the configured resources (both framework and projects) for this
* render.
- * @param projectCallback
* @param config the Configuration object for this render.
* @param targetSdkVersion the targetSdkVersion of the application.
*/
@@ -331,7 +329,7 @@
boolean attachToRoot, boolean skipCallbackParser) {
boolean isPlatformLayout = resource.isFramework();
- if (isPlatformLayout == false && skipCallbackParser == false) {
+ if (!isPlatformLayout && !skipCallbackParser) {
// check if the project callback can provide us with a custom parser.
ILayoutPullParser parser = getParser(resource);
@@ -467,7 +465,7 @@
@Override
- public final TypedArray obtainStyledAttributes(int[] attrs) {
+ public final BridgeTypedArray obtainStyledAttributes(int[] attrs) {
// No style is specified here, so create the typed array based on the default theme
// and the styles already applied to it. A null value of style indicates that the default
// theme should be used.
@@ -475,19 +473,36 @@
}
@Override
- public final TypedArray obtainStyledAttributes(int resid, int[] attrs)
+ public final BridgeTypedArray obtainStyledAttributes(int resid, int[] attrs)
throws Resources.NotFoundException {
// get the StyleResourceValue based on the resId;
StyleResourceValue style = getStyleByDynamicId(resid);
if (style == null) {
+ // In some cases, style may not be a dynamic id, so we do a full search.
+ ResourceReference ref = resolveId(resid);
+ if (ref != null) {
+ if (ref.isFramework()) {
+ ref =
+ getRenderResources().getFrameworkResource(ResourceType.STYLE, ref.getName());
+ } else {
+ ref =
+ getRenderResources().getProjectResource(ResourceType.STYLE, ref.getName());
+ }
+ if (ref instanceof StyleResourceValue) {
+ style = ((StyleResourceValue) ref);
+ }
+ }
+ }
+
+ if (style == null) {
throw new Resources.NotFoundException();
}
if (mTypedArrayCache == null) {
- mTypedArrayCache = new HashMap<int[], Map<Integer,TypedArray>>();
+ mTypedArrayCache = new HashMap<int[], Map<Integer,BridgeTypedArray>>();
- Map<Integer, TypedArray> map = new HashMap<Integer, TypedArray>();
+ Map<Integer, BridgeTypedArray> map = new HashMap<Integer, BridgeTypedArray>();
mTypedArrayCache.put(attrs, map);
BridgeTypedArray ta = createStyleBasedTypedArray(style, attrs);
@@ -497,14 +512,14 @@
}
// get the 2nd map
- Map<Integer, TypedArray> map = mTypedArrayCache.get(attrs);
+ Map<Integer, BridgeTypedArray> map = mTypedArrayCache.get(attrs);
if (map == null) {
- map = new HashMap<Integer, TypedArray>();
+ map = new HashMap<Integer, BridgeTypedArray>();
mTypedArrayCache.put(attrs, map);
}
// get the array from the 2nd map
- TypedArray ta = map.get(resid);
+ BridgeTypedArray ta = map.get(resid);
if (ta == null) {
ta = createStyleBasedTypedArray(style, attrs);
@@ -515,12 +530,12 @@
}
@Override
- public final TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs) {
+ public final BridgeTypedArray obtainStyledAttributes(AttributeSet set, int[] attrs) {
return obtainStyledAttributes(set, attrs, 0, 0);
}
@Override
- public TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs,
+ public BridgeTypedArray obtainStyledAttributes(AttributeSet set, int[] attrs,
int defStyleAttr, int defStyleRes) {
Map<String, String> defaultPropMap = null;
@@ -663,7 +678,7 @@
}
String attrName = attribute.getFirst();
- boolean frameworkAttr = attribute.getSecond().booleanValue();
+ boolean frameworkAttr = attribute.getSecond();
String value = null;
if (set != null) {
value = set.getAttributeValue(
@@ -672,7 +687,7 @@
// if this is an app attribute, and the first get fails, try with the
// new res-auto namespace as well
- if (frameworkAttr == false && value == null) {
+ if (!frameworkAttr && value == null) {
value = set.getAttributeValue(BridgeConstants.NS_APP_RES_AUTO, attrName);
}
}
@@ -789,13 +804,13 @@
List<Pair<String, Boolean>> results = new ArrayList<Pair<String, Boolean>>(attrs.length);
// for each attribute, get its name so that we can search it in the style
- for (int i = 0 ; i < attrs.length ; i++) {
- Pair<ResourceType, String> resolvedResource = Bridge.resolveResourceId(attrs[i]);
+ for (int attr : attrs) {
+ Pair<ResourceType, String> resolvedResource = Bridge.resolveResourceId(attr);
boolean isFramework = false;
if (resolvedResource != null) {
isFramework = true;
} else {
- resolvedResource = mProjectCallback.resolveResourceId(attrs[i]);
+ resolvedResource = mProjectCallback.resolveResourceId(attr);
}
if (resolvedResource != null) {
@@ -841,7 +856,7 @@
if (id == null) {
// generate a new id
- id = Integer.valueOf(++mDynamicIdGenerator);
+ id = ++mDynamicIdGenerator;
// and add it to the maps.
mDynamicIdToStyleMap.put(id, resValue);
@@ -860,19 +875,24 @@
}
public int getFrameworkResourceValue(ResourceType resType, String resName, int defValue) {
- Integer value = Bridge.getResourceId(resType, resName);
- if (value != null) {
- return value.intValue();
+ if (getRenderResources().getFrameworkResource(resType, resName) != null) {
+ // Bridge.getResourceId creates a new resource id if an existing one isn't found. So,
+ // we check for the existence of the resource before calling it.
+ return Bridge.getResourceId(resType, resName);
}
return defValue;
}
public int getProjectResourceValue(ResourceType resType, String resName, int defValue) {
- if (mProjectCallback != null) {
- Integer value = mProjectCallback.getResourceId(resType, resName);
- if (value != null) {
- return value.intValue();
+ // getResourceId creates a new resource id if an existing resource id isn't found. So, we
+ // check for the existence of the resource before calling it.
+ if (getRenderResources().getProjectResource(resType, resName) != null) {
+ if (mProjectCallback != null) {
+ Integer value = mProjectCallback.getResourceId(resType, resName);
+ if (value != null) {
+ return value;
+ }
}
}
@@ -1455,9 +1475,6 @@
return null;
}
- /**
- * @hide
- */
@Override
public int getUserId() {
return 0; // not used
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/ActionBarLayout.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/ActionBarLayout.java
index d95c815..2ff8d37 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/ActionBarLayout.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/ActionBarLayout.java
@@ -18,210 +18,116 @@
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
-import com.android.ide.common.rendering.api.ActionBarCallback;
-import com.android.ide.common.rendering.api.ActionBarCallback.HomeButtonStyle;
import com.android.ide.common.rendering.api.RenderResources;
import com.android.ide.common.rendering.api.ResourceValue;
import com.android.ide.common.rendering.api.SessionParams;
import com.android.internal.R;
-import com.android.internal.app.WindowDecorActionBar;
import com.android.internal.view.menu.MenuBuilder;
import com.android.internal.view.menu.MenuItemImpl;
-import com.android.internal.widget.ActionBarAccessor;
-import com.android.internal.widget.ActionBarContainer;
-import com.android.internal.widget.ActionBarView;
import com.android.layoutlib.bridge.android.BridgeContext;
import com.android.layoutlib.bridge.impl.ResourceHelper;
-import com.android.resources.ResourceType;
-import android.app.ActionBar;
-import android.app.ActionBar.Tab;
-import android.app.ActionBar.TabListener;
-import android.app.FragmentTransaction;
import android.content.Context;
import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics;
import android.util.TypedValue;
-import android.view.Gravity;
import android.view.LayoutInflater;
-import android.view.MenuInflater;
import android.view.View;
+import android.view.View.MeasureSpec;
import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.ActionMenuPresenter;
import android.widget.FrameLayout;
-import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import java.util.ArrayList;
-/**
- * A layout representing the action bar.
- */
-public class ActionBarLayout extends LinearLayout {
+public class ActionBarLayout {
+
+ private static final String LAYOUT_ATTR_NAME = "windowActionBarFullscreenDecorLayout";
+
+ // The Action Bar
+ @NonNull
+ private CustomActionBarWrapper mActionBar;
// Store another reference to the context so that we don't have to cast it repeatedly.
- @NonNull private final BridgeContext mBridgeContext;
- @NonNull private final Context mThemedContext;
+ @NonNull
+ private final BridgeContext mBridgeContext;
- @NonNull private final ActionBar mActionBar;
-
- // Data for Action Bar.
- @Nullable private final String mIcon;
- @Nullable private final String mTitle;
- @Nullable private final String mSubTitle;
- private final boolean mSplit;
- private final boolean mShowHomeAsUp;
- private final int mNavMode;
-
- // Helper fields.
- @NonNull private final MenuBuilder mMenuBuilder;
- private final int mPopupMaxWidth;
- @NonNull private final RenderResources res;
- @Nullable private final ActionBarView mActionBarView;
- @Nullable private FrameLayout mContentRoot;
- @NonNull private final ActionBarCallback mCallback;
+ @NonNull
+ private FrameLayout mContentRoot;
// A fake parent for measuring views.
- @Nullable private ViewGroup mMeasureParent;
+ @Nullable
+ private ViewGroup mMeasureParent;
- public ActionBarLayout(@NonNull BridgeContext context, @NonNull SessionParams params) {
+ // A Layout that contains the inflated action bar. The menu popup is added to this layout.
+ @NonNull
+ private final RelativeLayout mEnclosingLayout;
- super(context);
- setOrientation(LinearLayout.HORIZONTAL);
- setGravity(Gravity.CENTER_VERTICAL);
+ /**
+ * Inflate the action bar and attach it to {@code parentView}
+ */
+ public ActionBarLayout(@NonNull BridgeContext context, @NonNull SessionParams params,
+ @NonNull ViewGroup parentView) {
+
+ mBridgeContext = context;
+
+ ResourceValue layoutName = context.getRenderResources()
+ .findItemInTheme(LAYOUT_ATTR_NAME, true);
+ if (layoutName != null) {
+ // We may need to resolve the reference obtained.
+ layoutName = context.getRenderResources().findResValue(layoutName.getValue(),
+ layoutName.isFramework());
+ }
+ int layoutId = 0;
+ String error = null;
+ if (layoutName == null) {
+ error = "Unable to find action bar layout (" + LAYOUT_ATTR_NAME
+ + ") in the current theme.";
+ } else {
+ layoutId = context.getFrameworkResourceValue(layoutName.getResourceType(),
+ layoutName.getName(), 0);
+ if (layoutId == 0) {
+ error = String.format("Unable to resolve attribute \"%s\" of type \"%s\"",
+ layoutName.getName(), layoutName.getResourceType());
+ }
+ }
+ if (layoutId == 0) {
+ throw new RuntimeException(error);
+ }
+ // Create a RelativeLayout to hold the action bar. The layout is needed so that we may
+ // add the menu popup to it.
+ mEnclosingLayout = new RelativeLayout(mBridgeContext);
+ setMatchParent(mEnclosingLayout);
+ parentView.addView(mEnclosingLayout);
// Inflate action bar layout.
- LayoutInflater.from(context).inflate(R.layout.screen_action_bar, this,
- true /*attachToRoot*/);
- mActionBar = new WindowDecorActionBar(this);
+ View decorContent = LayoutInflater.from(context).inflate(layoutId, mEnclosingLayout, true);
- // Set contexts.
- mBridgeContext = context;
- mThemedContext = mActionBar.getThemedContext();
+ mActionBar = CustomActionBarWrapper.getActionBarWrapper(context, params, decorContent);
- // Set data for action bar.
- mCallback = params.getProjectCallback().getActionBarCallback();
- mIcon = params.getAppIcon();
- mTitle = params.getAppLabel();
- // Split Action Bar when the screen size is narrow and the application requests split action
- // bar when narrow.
- mSplit = context.getResources().getBoolean(R.bool.split_action_bar_is_narrow) &&
- mCallback.getSplitActionBarWhenNarrow();
- mNavMode = mCallback.getNavigationMode();
- // TODO: Support Navigation Drawer Indicator.
- mShowHomeAsUp = mCallback.getHomeButtonStyle() == HomeButtonStyle.SHOW_HOME_AS_UP;
- mSubTitle = mCallback.getSubTitle();
+ FrameLayout contentRoot = (FrameLayout) mEnclosingLayout.findViewById(android.R.id.content);
-
- // Set helper fields.
- mMenuBuilder = new MenuBuilder(mThemedContext);
- res = mBridgeContext.getRenderResources();
- mPopupMaxWidth = Math.max(mBridgeContext.getMetrics().widthPixels / 2,
- mThemedContext.getResources().getDimensionPixelSize(
- R.dimen.config_prefDialogWidth));
- mActionBarView = (ActionBarView) findViewById(R.id.action_bar);
- mContentRoot = (FrameLayout) findViewById(android.R.id.content);
-
- setupActionBar();
- }
-
- /**
- * Sets up the action bar by filling the appropriate data.
- */
- private void setupActionBar() {
- // Add title and sub title.
- ResourceValue titleValue = res.findResValue(mTitle, false /*isFramework*/);
- if (titleValue != null && titleValue.getValue() != null) {
- mActionBar.setTitle(titleValue.getValue());
+ // If something went wrong and we were not able to initialize the content root,
+ // just add a frame layout inside this and return.
+ if (contentRoot == null) {
+ contentRoot = new FrameLayout(context);
+ setMatchParent(contentRoot);
+ mEnclosingLayout.addView(contentRoot);
+ mContentRoot = contentRoot;
} else {
- mActionBar.setTitle(mTitle);
- }
- if (mSubTitle != null) {
- mActionBar.setSubtitle(mSubTitle);
- }
-
- // Add show home as up icon.
- if (mShowHomeAsUp) {
- mActionBar.setDisplayOptions(0xFF, ActionBar.DISPLAY_HOME_AS_UP);
- }
-
- // Set the navigation mode.
- mActionBar.setNavigationMode(mNavMode);
- if (mNavMode == ActionBar.NAVIGATION_MODE_TABS) {
- setupTabs(3);
- }
-
- if (mActionBarView != null) {
- // If the action bar style doesn't specify an icon, set the icon obtained from the session
- // params.
- if (!mActionBarView.hasIcon() && mIcon != null) {
- Drawable iconDrawable = getDrawable(mIcon, false /*isFramework*/);
- if (iconDrawable != null) {
- mActionBar.setIcon(iconDrawable);
- }
- }
-
- // Set action bar to be split, if needed.
- ActionBarContainer splitView = (ActionBarContainer) findViewById(R.id.split_action_bar);
- mActionBarView.setSplitView(splitView);
- mActionBarView.setSplitToolbar(mSplit);
-
- inflateMenus();
+ mContentRoot = contentRoot;
+ mActionBar.setupActionBar();
+ mActionBar.inflateMenus();
}
}
- /**
- * Gets the menus to add to the action bar from the callback, resolves them, inflates them and
- * adds them to the action bar.
- */
- private void inflateMenus() {
- if (mActionBarView == null) {
- return;
- }
- final MenuInflater inflater = new MenuInflater(mThemedContext);
- for (String name : mCallback.getMenuIdNames()) {
- if (mBridgeContext.getRenderResources().getProjectResource(ResourceType.MENU, name)
- != null) {
- int id = mBridgeContext.getProjectResourceValue(ResourceType.MENU, name, -1);
- if (id > -1) {
- inflater.inflate(id, mMenuBuilder);
- }
- }
- }
- mActionBarView.setMenu(mMenuBuilder, null /*callback*/);
- }
-
- // TODO: Use an adapter, like List View to set up tabs.
- private void setupTabs(int num) {
- for (int i = 1; i <= num; i++) {
- Tab tab = mActionBar.newTab().setText("Tab" + i).setTabListener(new TabListener() {
- @Override
- public void onTabUnselected(Tab t, FragmentTransaction ft) {
- // pass
- }
- @Override
- public void onTabSelected(Tab t, FragmentTransaction ft) {
- // pass
- }
- @Override
- public void onTabReselected(Tab t, FragmentTransaction ft) {
- // pass
- }
- });
- mActionBar.addTab(tab);
- }
- }
-
- @Nullable
- private Drawable getDrawable(@NonNull String name, boolean isFramework) {
- ResourceValue value = res.findResValue(name, isFramework);
- value = res.resolveResValue(value);
- if (value != null) {
- return ResourceHelper.getDrawable(value, mBridgeContext);
- }
- return null;
+ private void setMatchParent(View view) {
+ view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
+ LayoutParams.MATCH_PARENT));
}
/**
@@ -229,73 +135,53 @@
* the content frame which shall serve as the new content root.
*/
public void createMenuPopup() {
- assert mContentRoot != null && findViewById(android.R.id.content) == mContentRoot
+ assert mEnclosingLayout.getChildCount() == 1
: "Action Bar Menus have already been created.";
if (!isOverflowPopupNeeded()) {
return;
}
- // Create a layout to hold the menus and the user's content.
- RelativeLayout layout = new RelativeLayout(mThemedContext);
- layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT));
- mContentRoot.addView(layout);
- // Create a layout for the user's content.
- FrameLayout contentRoot = new FrameLayout(mBridgeContext);
- contentRoot.setLayoutParams(new LayoutParams(
- LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
- // Add contentRoot and menus to the layout.
- layout.addView(contentRoot);
- layout.addView(createMenuView());
- // ContentRoot is now the view we just created.
- mContentRoot = contentRoot;
- }
-
- /**
- * Returns a {@link LinearLayout} containing the menu list view to be embedded in a
- * {@link RelativeLayout}
- */
- @NonNull
- private View createMenuView() {
DisplayMetrics metrics = mBridgeContext.getMetrics();
- OverflowMenuAdapter adapter = new OverflowMenuAdapter(mMenuBuilder, mThemedContext);
+ MenuBuilder menu = mActionBar.getMenuBuilder();
+ OverflowMenuAdapter adapter = new OverflowMenuAdapter(menu, mActionBar.getPopupContext());
- LinearLayout layout = new LinearLayout(mThemedContext);
+ ListView listView = new ListView(mActionBar.getPopupContext(), null,
+ R.attr.dropDownListViewStyle);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
measureContentWidth(adapter), LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_END);
- if (mSplit) {
+ if (mActionBar.isSplit()) {
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
- // TODO: Find correct value instead of hardcoded 10dp.
- layoutParams.bottomMargin = getPixelValue("-10dp", metrics);
+ layoutParams.bottomMargin = getActionBarHeight() + mActionBar.getMenuPopupMargin();
} else {
- layoutParams.topMargin = getPixelValue("-10dp", metrics);
+ layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
+ layoutParams.topMargin = getActionBarHeight() + mActionBar.getMenuPopupMargin();
}
- layout.setLayoutParams(layoutParams);
- final TypedArray a = mThemedContext.obtainStyledAttributes(null,
- R.styleable.PopupWindow, R.attr.popupMenuStyle, 0);
- layout.setBackground(a.getDrawable(R.styleable.PopupWindow_popupBackground));
- layout.setDividerDrawable(a.getDrawable(R.attr.actionBarDivider));
- a.recycle();
- layout.setOrientation(LinearLayout.VERTICAL);
- layout.setDividerPadding(getPixelValue("12dp", metrics));
- layout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
-
- ListView listView = new ListView(mThemedContext, null, R.attr.dropDownListViewStyle);
+ layoutParams.setMarginEnd(getPixelValue("5dp", metrics));
+ listView.setLayoutParams(layoutParams);
listView.setAdapter(adapter);
- layout.addView(listView);
- return layout;
+ final TypedArray a = mActionBar.getPopupContext().obtainStyledAttributes(null,
+ R.styleable.PopupWindow, R.attr.popupMenuStyle, 0);
+ listView.setBackground(a.getDrawable(R.styleable.PopupWindow_popupBackground));
+ listView.setDivider(a.getDrawable(R.attr.actionBarDivider));
+ a.recycle();
+ listView.setElevation(mActionBar.getMenuPopupElevation());
+ mEnclosingLayout.addView(listView);
}
private boolean isOverflowPopupNeeded() {
- boolean needed = mCallback.isOverflowPopupNeeded();
+ boolean needed = mActionBar.isOverflowPopupNeeded();
if (!needed) {
return false;
}
// Copied from android.widget.ActionMenuPresenter.updateMenuView()
- ArrayList<MenuItemImpl> menus = mMenuBuilder.getNonActionItems();
- if (ActionBarAccessor.getActionMenuPresenter(mActionBarView).isOverflowReserved() &&
+ ArrayList<MenuItemImpl> menus = mActionBar.getMenuBuilder().getNonActionItems();
+ ActionMenuPresenter presenter = mActionBar.getActionMenuPresenter();
+ if (presenter == null) {
+ throw new RuntimeException("Failed to create a Presenter for Action Bar Menus.");
+ }
+ if (presenter.isOverflowReserved() &&
menus != null) {
final int count = menus.size();
if (count == 1) {
@@ -307,7 +193,7 @@
return needed;
}
- @Nullable
+ @NonNull
public FrameLayout getContentRoot() {
return mContentRoot;
}
@@ -319,6 +205,7 @@
View itemView = null;
int itemType = 0;
+ Context context = mActionBar.getPopupContext();
final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
final int count = adapter.getCount();
@@ -330,15 +217,17 @@
}
if (mMeasureParent == null) {
- mMeasureParent = new FrameLayout(mThemedContext);
+ mMeasureParent = new FrameLayout(context);
}
itemView = adapter.getView(i, itemView, mMeasureParent);
itemView.measure(widthMeasureSpec, heightMeasureSpec);
final int itemWidth = itemView.getMeasuredWidth();
- if (itemWidth >= mPopupMaxWidth) {
- return mPopupMaxWidth;
+ int popupMaxWidth = Math.max(mBridgeContext.getMetrics().widthPixels / 2,
+ context.getResources().getDimensionPixelSize(R.dimen.config_prefDialogWidth));
+ if (itemWidth >= popupMaxWidth) {
+ return popupMaxWidth;
} else if (itemWidth > maxWidth) {
maxWidth = itemWidth;
}
@@ -347,9 +236,30 @@
return maxWidth;
}
- private int getPixelValue(@NonNull String value, @NonNull DisplayMetrics metrics) {
+ static int getPixelValue(@NonNull String value, @NonNull DisplayMetrics metrics) {
TypedValue typedValue = ResourceHelper.getValue(null, value, false /*requireUnit*/);
return (int) typedValue.getDimension(metrics);
}
+ // TODO: This is duplicated from RenderSessionImpl.
+ private int getActionBarHeight() {
+ RenderResources resources = mBridgeContext.getRenderResources();
+ DisplayMetrics metrics = mBridgeContext.getMetrics();
+ ResourceValue value = resources.findItemInTheme("actionBarSize", true);
+
+ // resolve it
+ value = resources.resolveResValue(value);
+
+ if (value != null) {
+ // get the numerical value, if available
+ TypedValue typedValue = ResourceHelper.getValue("actionBarSize", value.getValue(),
+ true);
+ if (typedValue != null) {
+ // compute the pixel value based on the display metrics
+ return (int) typedValue.getDimension(metrics);
+
+ }
+ }
+ return 0;
+ }
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomActionBarWrapper.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomActionBarWrapper.java
new file mode 100644
index 0000000..6db722e
--- /dev/null
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomActionBarWrapper.java
@@ -0,0 +1,380 @@
+/*
+ * Copyright (C) 2014 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.layoutlib.bridge.bars;
+
+import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
+import com.android.ide.common.rendering.api.ActionBarCallback;
+import com.android.ide.common.rendering.api.ActionBarCallback.HomeButtonStyle;
+import com.android.ide.common.rendering.api.RenderResources;
+import com.android.ide.common.rendering.api.ResourceValue;
+import com.android.ide.common.rendering.api.SessionParams;
+import com.android.internal.R;
+import com.android.internal.app.ToolbarActionBar;
+import com.android.internal.app.WindowDecorActionBar;
+import com.android.internal.view.menu.MenuBuilder;
+import com.android.internal.widget.ActionBarAccessor;
+import com.android.internal.widget.ActionBarView;
+import com.android.internal.widget.DecorToolbar;
+import com.android.layoutlib.bridge.android.BridgeContext;
+import com.android.layoutlib.bridge.impl.ResourceHelper;
+
+import android.app.ActionBar;
+import android.app.ActionBar.Tab;
+import android.app.ActionBar.TabListener;
+import android.app.FragmentTransaction;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowCallback;
+import android.widget.ActionMenuPresenter;
+import android.widget.Toolbar;
+import android.widget.Toolbar_Accessor;
+
+import static com.android.SdkConstants.ANDROID_NS_NAME_PREFIX;
+import static com.android.resources.ResourceType.MENU;
+
+/**
+ * A common API to access {@link ToolbarActionBar} and {@link WindowDecorActionBar}.
+ */
+public abstract class CustomActionBarWrapper {
+
+ @NonNull protected ActionBar mActionBar;
+ @NonNull protected SessionParams mParams;
+ @NonNull protected ActionBarCallback mCallback;
+ @NonNull protected BridgeContext mContext;
+
+ /**
+ * Returns a wrapper around different implementations of the Action Bar to provide a common API.
+ *
+ * @param decorContent the top level view returned by inflating
+ * ?attr/windowActionBarFullscreenDecorLayout
+ */
+ @NonNull
+ public static CustomActionBarWrapper getActionBarWrapper(@NonNull BridgeContext context,
+ @NonNull SessionParams params, @NonNull View decorContent) {
+ View view = decorContent.findViewById(R.id.action_bar);
+ if (view instanceof Toolbar) {
+ return new ToolbarWrapper(context, params, ((Toolbar) view));
+ } else if (view instanceof ActionBarView) {
+ return new WindowActionBarWrapper(context, params, decorContent,
+ ((ActionBarView) view));
+ } else {
+ throw new IllegalStateException("Can't make an action bar out of " +
+ view.getClass().getSimpleName());
+ }
+ }
+
+ CustomActionBarWrapper(@NonNull BridgeContext context, @NonNull SessionParams params,
+ @NonNull ActionBar actionBar) {
+ mActionBar = actionBar;
+ mParams = params;
+ mCallback = params.getProjectCallback().getActionBarCallback();
+ mContext = context;
+ }
+
+ protected void setupActionBar() {
+ // Do the things that are common to all implementations.
+ RenderResources res = mContext.getRenderResources();
+
+ String title = mParams.getAppLabel();
+ ResourceValue titleValue = res.findResValue(title, false);
+ if (titleValue != null && titleValue.getValue() != null) {
+ mActionBar.setTitle(titleValue.getValue());
+ } else {
+ mActionBar.setTitle(title);
+ }
+
+ String subTitle = mCallback.getSubTitle();
+ if (subTitle != null) {
+ mActionBar.setSubtitle(subTitle);
+ }
+
+ // Add show home as up icon.
+ if (mCallback.getHomeButtonStyle() == HomeButtonStyle.SHOW_HOME_AS_UP) {
+ mActionBar.setDisplayOptions(0xFF, ActionBar.DISPLAY_HOME_AS_UP);
+ }
+ }
+
+ protected boolean isSplit() {
+ return getDecorToolbar().isSplit();
+ }
+
+ protected boolean isOverflowPopupNeeded() {
+ return mCallback.isOverflowPopupNeeded();
+ }
+
+ /**
+ * Gets the menus to add to the action bar from the callback, resolves them, inflates them and
+ * adds them to the action bar.
+ */
+ protected void inflateMenus() {
+ MenuInflater inflater = new MenuInflater(getActionMenuContext());
+ MenuBuilder menuBuilder = getMenuBuilder();
+ for (String name : mCallback.getMenuIdNames()) {
+ int id;
+ if (name.startsWith(ANDROID_NS_NAME_PREFIX)) {
+ // Framework menu.
+ name = name.substring(ANDROID_NS_NAME_PREFIX.length());
+ id = mContext.getFrameworkResourceValue(MENU, name, -1);
+ } else {
+ // Project menu.
+ id = mContext.getProjectResourceValue(MENU, name, -1);
+ }
+ if (id > -1) {
+ inflater.inflate(id, menuBuilder);
+ }
+ }
+ }
+
+ /**
+ * The context used for the ActionBar and the menus in the ActionBarView.
+ */
+ @NonNull
+ protected Context getActionMenuContext() {
+ return mActionBar.getThemedContext();
+ }
+
+ /**
+ * The context used to inflate the popup menu.
+ */
+ @NonNull
+ abstract Context getPopupContext();
+
+ /**
+ * The Menu in which to inflate the user's menus.
+ */
+ @NonNull
+ abstract MenuBuilder getMenuBuilder();
+
+ @Nullable
+ abstract ActionMenuPresenter getActionMenuPresenter();
+
+ /**
+ * Framework's wrapper over two ActionBar implementations.
+ */
+ @NonNull
+ abstract DecorToolbar getDecorToolbar();
+
+ abstract int getMenuPopupElevation();
+
+ /**
+ * Margin between the menu popup and the action bar.
+ */
+ abstract int getMenuPopupMargin();
+
+ // ---- The implementations ----
+
+ /**
+ * Material theme uses {@link Toolbar} as the action bar. This wrapper provides access to
+ * Toolbar using a common API.
+ */
+ private static class ToolbarWrapper extends CustomActionBarWrapper {
+
+ @NonNull
+ private final Toolbar mToolbar; // This is the view.
+
+ ToolbarWrapper(@NonNull BridgeContext context, @NonNull SessionParams params,
+ @NonNull Toolbar toolbar) {
+ super(context, params, new ToolbarActionBar(toolbar, "", new WindowCallback())
+ );
+ mToolbar = toolbar;
+ }
+
+ @Override
+ protected void inflateMenus() {
+ super.inflateMenus();
+ // Inflating the menus doesn't initialize the ActionMenuPresenter. Setting a fake menu
+ // and then setting it back does the trick.
+ MenuBuilder menu = getMenuBuilder();
+ DecorToolbar decorToolbar = getDecorToolbar();
+ decorToolbar.setMenu(new MenuBuilder(getActionMenuContext()), null);
+ decorToolbar.setMenu(menu, null);
+ }
+
+ @NonNull
+ @Override
+ Context getPopupContext() {
+ return Toolbar_Accessor.getPopupContext(mToolbar);
+ }
+
+ @NonNull
+ @Override
+ MenuBuilder getMenuBuilder() {
+ return (MenuBuilder) mToolbar.getMenu();
+ }
+
+ @Nullable
+ @Override
+ ActionMenuPresenter getActionMenuPresenter() {
+ return Toolbar_Accessor.getActionMenuPresenter(mToolbar);
+ }
+
+ @NonNull
+ @Override
+ DecorToolbar getDecorToolbar() {
+ return mToolbar.getWrapper();
+ }
+
+ @Override
+ int getMenuPopupElevation() {
+ return 10;
+ }
+
+ @Override
+ int getMenuPopupMargin() {
+ return 0;
+ }
+ }
+
+ /**
+ * Holo theme uses {@link WindowDecorActionBar} as the action bar. This wrapper provides
+ * access to it using a common API.
+ */
+ private static class WindowActionBarWrapper extends CustomActionBarWrapper {
+
+ @NonNull
+ private final WindowDecorActionBar mActionBar;
+ @NonNull
+ private final ActionBarView mActionBarView;
+ @NonNull
+ private final View mDecorContentRoot;
+ private MenuBuilder mMenuBuilder;
+
+ public WindowActionBarWrapper(@NonNull BridgeContext context, @NonNull SessionParams params,
+ @NonNull View decorContentRoot, @NonNull ActionBarView actionBarView) {
+ super(context, params, new WindowDecorActionBar(decorContentRoot));
+ mActionBarView = actionBarView;
+ mActionBar = ((WindowDecorActionBar) super.mActionBar);
+ mDecorContentRoot = decorContentRoot;
+ }
+
+ @Override
+ protected void setupActionBar() {
+ super.setupActionBar();
+
+ // Set the navigation mode.
+ int navMode = mCallback.getNavigationMode();
+ mActionBar.setNavigationMode(navMode);
+ //noinspection deprecation
+ if (navMode == ActionBar.NAVIGATION_MODE_TABS) {
+ setupTabs(3);
+ }
+
+ String icon = mParams.getAppIcon();
+ // If the action bar style doesn't specify an icon, set the icon obtained from the
+ // session params.
+ if (!mActionBar.hasIcon() && icon != null) {
+ Drawable iconDrawable = getDrawable(icon, false);
+ if (iconDrawable != null) {
+ mActionBar.setIcon(iconDrawable);
+ }
+ }
+
+ // Set action bar to be split, if needed.
+ ViewGroup splitView = (ViewGroup) mDecorContentRoot.findViewById(R.id.split_action_bar);
+ if (splitView != null) {
+ mActionBarView.setSplitView(splitView);
+ Resources res = mContext.getResources();
+ boolean split = res.getBoolean(R.bool.split_action_bar_is_narrow)
+ && mCallback.getSplitActionBarWhenNarrow();
+ mActionBarView.setSplitToolbar(split);
+ }
+ }
+
+ @Override
+ protected void inflateMenus() {
+ super.inflateMenus();
+ // The super implementation doesn't set the menu on the view. Set it here.
+ mActionBarView.setMenu(getMenuBuilder(), null);
+ }
+
+ @NonNull
+ @Override
+ Context getPopupContext() {
+ return getActionMenuContext();
+ }
+
+ @NonNull
+ @Override
+ MenuBuilder getMenuBuilder() {
+ if (mMenuBuilder == null) {
+ mMenuBuilder = new MenuBuilder(getActionMenuContext());
+ }
+ return mMenuBuilder;
+ }
+
+ @Nullable
+ @Override
+ ActionMenuPresenter getActionMenuPresenter() {
+ return ActionBarAccessor.getActionMenuPresenter(mActionBarView);
+ }
+
+ @NonNull
+ @Override
+ ActionBarView getDecorToolbar() {
+ return mActionBarView;
+ }
+
+ @Override
+ int getMenuPopupElevation() {
+ return 0;
+ }
+
+ @Override
+ int getMenuPopupMargin() {
+ return -ActionBarLayout.getPixelValue("10dp", mContext.getMetrics());
+ }
+
+ // TODO: Use an adapter, like List View to set up tabs.
+ @SuppressWarnings("deprecation") // For Tab
+ private void setupTabs(int num) {
+ for (int i = 1; i <= num; i++) {
+ Tab tab = mActionBar.newTab().setText("Tab" + i).setTabListener(new TabListener() {
+ @Override
+ public void onTabUnselected(Tab t, FragmentTransaction ft) {
+ // pass
+ }
+ @Override
+ public void onTabSelected(Tab t, FragmentTransaction ft) {
+ // pass
+ }
+ @Override
+ public void onTabReselected(Tab t, FragmentTransaction ft) {
+ // pass
+ }
+ });
+ mActionBar.addTab(tab);
+ }
+ }
+
+ @Nullable
+ private Drawable getDrawable(@NonNull String name, boolean isFramework) {
+ RenderResources res = mContext.getRenderResources();
+ ResourceValue value = res.findResValue(name, isFramework);
+ value = res.resolveResValue(value);
+ if (value != null) {
+ return ResourceHelper.getDrawable(value, mContext);
+ }
+ return null;
+ }
+
+ }
+}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java
index b677131..669e6b5 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java
@@ -57,63 +57,59 @@
public Result render() {
checkLock();
- try {
- // get the drawable resource value
- DrawableParams params = getParams();
- HardwareConfig hardwareConfig = params.getHardwareConfig();
- ResourceValue drawableResource = params.getDrawable();
+ // get the drawable resource value
+ DrawableParams params = getParams();
+ HardwareConfig hardwareConfig = params.getHardwareConfig();
+ ResourceValue drawableResource = params.getDrawable();
- // resolve it
- BridgeContext context = getContext();
- drawableResource = context.getRenderResources().resolveResValue(drawableResource);
+ // resolve it
+ BridgeContext context = getContext();
+ drawableResource = context.getRenderResources().resolveResValue(drawableResource);
- if (drawableResource == null ||
- drawableResource.getResourceType() != ResourceType.DRAWABLE) {
- return Status.ERROR_NOT_A_DRAWABLE.createResult();
- }
-
- // create a simple FrameLayout
- FrameLayout content = new FrameLayout(context);
-
- // get the actual Drawable object to draw
- Drawable d = ResourceHelper.getDrawable(drawableResource, context);
- content.setBackground(d);
-
- // set the AttachInfo on the root view.
- AttachInfo_Accessor.setAttachInfo(content);
-
-
- // measure
- int w = hardwareConfig.getScreenWidth();
- int h = hardwareConfig.getScreenHeight();
- int w_spec = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY);
- int h_spec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
- content.measure(w_spec, h_spec);
-
- // now do the layout.
- content.layout(0, 0, w, h);
-
- // preDraw setup
- AttachInfo_Accessor.dispatchOnPreDraw(content);
-
- // draw into a new image
- BufferedImage image = getImage(w, h);
-
- // create an Android bitmap around the BufferedImage
- Bitmap bitmap = Bitmap_Delegate.createBitmap(image,
- true /*isMutable*/, hardwareConfig.getDensity());
-
- // create a Canvas around the Android bitmap
- Canvas canvas = new Canvas(bitmap);
- canvas.setDensity(hardwareConfig.getDensity().getDpiValue());
-
- // and draw
- content.draw(canvas);
-
- return Status.SUCCESS.createResult(image);
- } catch (IOException e) {
- return ERROR_UNKNOWN.createResult(e.getMessage(), e);
+ if (drawableResource == null ||
+ drawableResource.getResourceType() != ResourceType.DRAWABLE) {
+ return Status.ERROR_NOT_A_DRAWABLE.createResult();
}
+
+ // create a simple FrameLayout
+ FrameLayout content = new FrameLayout(context);
+
+ // get the actual Drawable object to draw
+ Drawable d = ResourceHelper.getDrawable(drawableResource, context);
+ content.setBackground(d);
+
+ // set the AttachInfo on the root view.
+ AttachInfo_Accessor.setAttachInfo(content);
+
+
+ // measure
+ int w = hardwareConfig.getScreenWidth();
+ int h = hardwareConfig.getScreenHeight();
+ int w_spec = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY);
+ int h_spec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
+ content.measure(w_spec, h_spec);
+
+ // now do the layout.
+ content.layout(0, 0, w, h);
+
+ // preDraw setup
+ AttachInfo_Accessor.dispatchOnPreDraw(content);
+
+ // draw into a new image
+ BufferedImage image = getImage(w, h);
+
+ // create an Android bitmap around the BufferedImage
+ Bitmap bitmap = Bitmap_Delegate.createBitmap(image,
+ true /*isMutable*/, hardwareConfig.getDensity());
+
+ // create a Canvas around the Android bitmap
+ Canvas canvas = new Canvas(bitmap);
+ canvas.setDensity(hardwareConfig.getDensity().getDpiValue());
+
+ // and draw
+ content.draw(canvas);
+
+ return Status.SUCCESS.createResult(image);
}
protected BufferedImage getImage(int w, int h) {
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
index b8dce70..a2eed9a 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
@@ -353,8 +353,7 @@
// if the theme says no title/action bar, then the size will be 0
if (mActionBarSize > 0) {
- ActionBarLayout actionBar = createActionBar(context, params);
- backgroundLayout.addView(actionBar);
+ ActionBarLayout actionBar = createActionBar(context, params, backgroundLayout);
actionBar.createMenuPopup();
mContentRoot = actionBar.getContentRoot();
} else if (mTitleBarSize > 0) {
@@ -1624,11 +1623,9 @@
/**
* Creates the action bar. Also queries the project callback for missing information.
*/
- private ActionBarLayout createActionBar(BridgeContext context, SessionParams params) {
- ActionBarLayout actionBar = new ActionBarLayout(context, params);
- actionBar.setLayoutParams(new LinearLayout.LayoutParams(
- LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
- return actionBar;
+ private ActionBarLayout createActionBar(BridgeContext context, SessionParams params,
+ ViewGroup parentView) {
+ return new ActionBarLayout(context, params, parentView);
}
public BufferedImage getImage() {
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
index 22f8e1c..677c744 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
@@ -32,6 +32,7 @@
import org.xmlpull.v1.XmlPullParserException;
import android.content.res.ColorStateList;
+import android.content.res.Resources.Theme;
import android.graphics.Bitmap;
import android.graphics.Bitmap_Delegate;
import android.graphics.NinePatch_Delegate;
@@ -166,6 +167,17 @@
* @param context the current context
*/
public static Drawable getDrawable(ResourceValue value, BridgeContext context) {
+ return getDrawable(value, context, null);
+ }
+
+ /**
+ * Returns a drawable from the given value.
+ * @param value The value that contains a path to a 9 patch, a bitmap or a xml based drawable,
+ * or an hexadecimal color
+ * @param context the current context
+ * @param theme the theme to be used to inflate the drawable.
+ */
+ public static Drawable getDrawable(ResourceValue value, BridgeContext context, Theme theme) {
if (value == null) {
return null;
}
@@ -209,7 +221,7 @@
BridgeXmlBlockParser blockParser = new BridgeXmlBlockParser(
parser, context, value.isFramework());
try {
- return Drawable.createFromXml(context.getResources(), blockParser);
+ return Drawable.createFromXml(context.getResources(), blockParser, theme);
} finally {
blockParser.ensurePopped();
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/DynamicIdMap.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/DynamicIdMap.java
index a1fae95..979aa33 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/DynamicIdMap.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/DynamicIdMap.java
@@ -16,6 +16,7 @@
package com.android.layoutlib.bridge.util;
+import com.android.annotations.NonNull;
import com.android.resources.ResourceType;
import com.android.util.Pair;
@@ -48,6 +49,7 @@
* @param name the name of the resource
* @return an integer.
*/
+ @NonNull
public Integer getId(ResourceType type, String name) {
return getId(Pair.of(type, name));
}
@@ -59,10 +61,11 @@
* @param resource the type/name of the resource
* @return an integer.
*/
+ @NonNull
public Integer getId(Pair<ResourceType, String> resource) {
Integer value = mDynamicIds.get(resource);
if (value == null) {
- value = Integer.valueOf(++mDynamicSeed);
+ value = ++mDynamicSeed;
mDynamicIds.put(resource, value);
mRevDynamicIds.put(value, resource);
}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
index f20b890..4e6f456 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
@@ -137,13 +137,13 @@
* The list of methods to rewrite as delegates.
*/
public final static String[] DELEGATE_METHODS = new String[] {
+ "android.animation.AnimatorInflater#loadAnimator", // TODO: remove when Path.approximate() is supported.
"android.app.Fragment#instantiate", //(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroid/app/Fragment;",
"android.content.res.Resources$Theme#obtainStyledAttributes",
"android.content.res.Resources$Theme#resolveAttribute",
"android.content.res.Resources$Theme#resolveAttributes",
"android.content.res.AssetManager#newTheme",
"android.content.res.AssetManager#deleteTheme",
- "android.content.res.AssetManager#applyThemeStyle",
"android.content.res.TypedArray#getValueAt",
"android.content.res.TypedArray#obtain",
"android.graphics.BitmapFactory#finishDecode",
@@ -162,6 +162,11 @@
"android.view.WindowManagerGlobal#getWindowManagerService",
"android.view.inputmethod.InputMethodManager#getInstance",
"android.view.MenuInflater#registerMenu",
+ "android.view.RenderNode#nCreate",
+ "android.view.RenderNode#nDestroyRenderNode",
+ "android.view.RenderNode#nSetElevation",
+ "android.view.RenderNode#nGetElevation",
+ "android.view.ViewGroup#drawChild",
"com.android.internal.view.menu.MenuBuilder#createNewMenuItem",
"com.android.internal.util.XmlUtils#convertValueToInt",
"com.android.internal.textservice.ITextServicesManager$Stub#asInterface",
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateClassAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateClassAdapter.java
index 3d89c68..ae4a57d 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateClassAdapter.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateClassAdapter.java
@@ -112,6 +112,7 @@
// The implementation of this 'delegate' method is done in layoutlib_bridge.
int accessDelegate = access;
+ access = access & ~Opcodes.ACC_PRIVATE; // If private, make it package protected.
MethodVisitor mwOriginal = super.visitMethod(access, name + ORIGINAL_SUFFIX,
desc, signature, exceptions);