Merge "Remove checkThread() in WebView.getFactory()"
diff --git a/api/current.txt b/api/current.txt
index 72e7601..1cf14aa 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -29106,7 +29106,7 @@
method public void setRelativeScrollPosition(int, int);
method public deprecated void setRemoteAdapter(int, int, android.content.Intent);
method public void setRemoteAdapter(int, android.content.Intent);
- method public void setRemoteAdapter(int, java.util.ArrayList<android.widget.RemoteViews>);
+ method public void setRemoteAdapter(int, java.util.ArrayList<android.widget.RemoteViews>, int);
method public void setScrollPosition(int, int);
method public void setShort(int, java.lang.String, short);
method public void setString(int, java.lang.String, java.lang.String);
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 3bdadc3..d6ddeb6 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -2844,7 +2844,7 @@
* item has been selected.
* <p>
* It is not safe to hold onto the context menu after this method returns.
- * {@inheritDoc}
+ *
*/
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
}
diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java
index 9c19766..6b1c3e2 100644
--- a/core/java/android/appwidget/AppWidgetManager.java
+++ b/core/java/android/appwidget/AppWidgetManager.java
@@ -239,7 +239,7 @@
public static final String EXTRA_CUSTOM_SORT = "customSort";
/**
- * A sentiel value that the AppWidget manager will never return as a appWidgetId.
+ * A sentinel value that the AppWidget manager will never return as a appWidgetId.
*/
public static final int INVALID_APPWIDGET_ID = 0;
diff --git a/core/java/android/os/FileObserver.java b/core/java/android/os/FileObserver.java
index 667ce68..d633486 100644
--- a/core/java/android/os/FileObserver.java
+++ b/core/java/android/os/FileObserver.java
@@ -32,7 +32,7 @@
*
* <p>Each FileObserver instance monitors a single file or directory.
* If a directory is monitored, events will be triggered for all files and
- * subdirectories (recursively) inside the monitored directory.</p>
+ * subdirectories inside the monitored directory.</p>
*
* <p>An event mask is used to specify which changes or actions to report.
* Event type constants are used to describe the possible changes in the
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index 86d04b6..7ecdcbe 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -43,6 +43,7 @@
import java.io.File;
import java.io.PrintWriter;
+import java.util.Arrays;
import java.util.concurrent.locks.ReentrantLock;
import static javax.microedition.khronos.egl.EGL10.*;
@@ -88,10 +89,12 @@
*
* Possible values:
* "true", to enable profiling
- * "visual", to enable profiling and visualize the results on screen
+ * "visual_bars", to enable profiling and visualize the results on screen
+ * "visual_lines", to enable profiling and visualize the results on screen
* "false", to disable profiling
*
- * @see #PROFILE_PROPERTY_VISUALIZE
+ * @see #PROFILE_PROPERTY_VISUALIZE_BARS
+ * @see #PROFILE_PROPERTY_VISUALIZE_LINES
*
* @hide
*/
@@ -99,11 +102,19 @@
/**
* Value for {@link #PROFILE_PROPERTY}. When the property is set to this
- * value, profiling data will be visualized on screen.
+ * value, profiling data will be visualized on screen as a bar chart.
*
* @hide
*/
- public static final String PROFILE_PROPERTY_VISUALIZE = "visual";
+ public static final String PROFILE_PROPERTY_VISUALIZE_BARS = "visual_bars";
+
+ /**
+ * Value for {@link #PROFILE_PROPERTY}. When the property is set to this
+ * value, profiling data will be visualized on screen as a line chart.
+ *
+ * @hide
+ */
+ public static final String PROFILE_PROPERTY_VISUALIZE_LINES = "visual_lines";
/**
* System property used to specify the number of frames to be used
@@ -619,6 +630,100 @@
mRequested = requested;
}
+ /**
+ * Describes a series of frames that should be drawn on screen as a graph.
+ * Each frame is composed of 1 or more elements.
+ */
+ abstract class GraphDataProvider {
+ /**
+ * Draws the graph as bars. Frame elements are stacked on top of
+ * each other.
+ */
+ public static final int GRAPH_TYPE_BARS = 0;
+ /**
+ * Draws the graph as lines. The number of series drawn corresponds
+ * to the number of elements.
+ */
+ public static final int GRAPH_TYPE_LINES = 1;
+
+ /**
+ * Returns the type of graph to render.
+ *
+ * @return {@link #GRAPH_TYPE_BARS} or {@link #GRAPH_TYPE_LINES}
+ */
+ abstract int getGraphType();
+
+ /**
+ * This method is invoked before the graph is drawn. This method
+ * can be used to compute sizes, etc.
+ *
+ * @param metrics The display metrics
+ */
+ abstract void prepare(DisplayMetrics metrics);
+
+ /**
+ * @return The size in pixels of a vertical unit.
+ */
+ abstract int getVerticalUnitSize();
+
+ /**
+ * @return The size in pixels of a horizontal unit.
+ */
+ abstract int getHorizontalUnitSize();
+
+ /**
+ * @return The size in pixels of the margin between horizontal units.
+ */
+ abstract int getHorizontaUnitMargin();
+
+ /**
+ * An optional threshold value.
+ *
+ * @return A value >= 0 to draw the threshold, a negative value
+ * to ignore it.
+ */
+ abstract float getThreshold();
+
+ /**
+ * The data to draw in the graph. The number of elements in the
+ * array must be at least {@link #getFrameCount()} * {@link #getElementCount()}.
+ * If a value is negative the following values will be ignored.
+ */
+ abstract float[] getData();
+
+ /**
+ * Returns the number of frames to render in the graph.
+ */
+ abstract int getFrameCount();
+
+ /**
+ * Returns the number of elements in each frame. This directly affects
+ * the number of series drawn in the graph.
+ */
+ abstract int getElementCount();
+
+ /**
+ * Returns the current frame, if any. If the returned value is negative
+ * the current frame is ignored.
+ */
+ abstract int getCurrentFrame();
+
+ /**
+ * Prepares the paint to draw the specified element (or series.)
+ */
+ abstract void setupGraphPaint(Paint paint, int elementIndex);
+
+ /**
+ * Prepares the paint to draw the threshold.
+ */
+ abstract void setupThresholdPaint(Paint paint);
+
+ /**
+ * Prepares the paint to draw the current frame indicator.
+ */
+ abstract void setupCurrentFramePaint(Paint paint);
+ }
+
@SuppressWarnings({"deprecation"})
static abstract class GlRenderer extends HardwareRenderer {
static final int SURFACE_STATE_ERROR = 0;
@@ -627,6 +732,14 @@
static final int FUNCTOR_PROCESS_DELAY = 4;
+ private static final int PROFILE_DRAW_MARGIN = 0;
+ private static final int PROFILE_DRAW_WIDTH = 3;
+ private static final int[] PROFILE_DRAW_COLORS = { 0xcf3e66cc, 0xcfdc3912, 0xcfe69800 };
+ private static final int PROFILE_DRAW_CURRENT_FRAME_COLOR = 0xcf5faa4d;
+ private static final int PROFILE_DRAW_THRESHOLD_COLOR = 0xff5faa4d;
+ private static final int PROFILE_DRAW_THRESHOLD_STROKE_WIDTH = 2;
+ private static final int PROFILE_DRAW_DP_PER_MS = 7;
+
static EGL10 sEgl;
static EGLDisplay sEglDisplay;
static EGLConfig sEglConfig;
@@ -660,12 +773,13 @@
boolean mUpdateDirtyRegions;
boolean mProfileEnabled;
- boolean mProfileVisualizerEnabled;
+ int mProfileVisualizerType = -1;
float[] mProfileData;
ReentrantLock mProfileLock;
int mProfileCurrentFrame = -PROFILE_FRAME_DATA_COUNT;
- float[][] mProfileRects;
+ GraphDataProvider mDebugDataProvider;
+ float[][] mProfileShapes;
Paint mProfilePaint;
boolean mDebugDirtyRegions;
@@ -688,20 +802,32 @@
loadSystemProperties(null);
}
+ private static final String[] VISUALIZERS = {
+ PROFILE_PROPERTY_VISUALIZE_BARS,
+ PROFILE_PROPERTY_VISUALIZE_LINES
+ };
+
@Override
boolean loadSystemProperties(Surface surface) {
boolean value;
boolean changed = false;
String profiling = SystemProperties.get(PROFILE_PROPERTY);
- value = PROFILE_PROPERTY_VISUALIZE.equalsIgnoreCase(profiling);
+ int graphType = Arrays.binarySearch(VISUALIZERS, profiling);
+ value = graphType >= 0;
- if (value != mProfileVisualizerEnabled) {
+ if (graphType != mProfileVisualizerType) {
changed = true;
- mProfileVisualizerEnabled = value;
+ mProfileVisualizerType = graphType;
- mProfileRects = null;
+ mProfileShapes = null;
mProfilePaint = null;
+
+ if (value) {
+ mDebugDataProvider = new DrawPerformanceDataProvider(graphType);
+ } else {
+ mDebugDataProvider = null;
+ }
}
// If on-screen profiling is not enabled, we need to check whether
@@ -728,6 +854,7 @@
} else {
mProfileData = null;
mProfileLock = null;
+ mProfileVisualizerType = -1;
}
mProfileCurrentFrame = -PROFILE_FRAME_DATA_COUNT;
@@ -1283,7 +1410,7 @@
}
}
- if (mProfileEnabled && mProfileVisualizerEnabled) dirty = null;
+ if (mDebugDataProvider != null) dirty = null;
return dirty;
}
@@ -1459,20 +1586,102 @@
}
return SURFACE_STATE_SUCCESS;
}
+
+ private static int dpToPx(int dp, float density) {
+ return (int) (dp * density + 0.5f);
+ }
+
+ class DrawPerformanceDataProvider extends GraphDataProvider {
+ private final int mGraphType;
+
+ private int mVerticalUnit;
+ private int mHorizontalUnit;
+ private int mHorizontalMargin;
+ private int mThresholdStroke;
+
+ DrawPerformanceDataProvider(int graphType) {
+ mGraphType = graphType;
+ }
+
+ @Override
+ void prepare(DisplayMetrics metrics) {
+ final float density = metrics.density;
+
+ mVerticalUnit = dpToPx(PROFILE_DRAW_DP_PER_MS, density);
+ mHorizontalUnit = dpToPx(PROFILE_DRAW_WIDTH, density);
+ mHorizontalMargin = dpToPx(PROFILE_DRAW_MARGIN, density);
+ mThresholdStroke = dpToPx(PROFILE_DRAW_THRESHOLD_STROKE_WIDTH, density);
+ }
+
+ @Override
+ int getGraphType() {
+ return mGraphType;
+ }
+
+ @Override
+ int getVerticalUnitSize() {
+ return mVerticalUnit;
+ }
+
+ @Override
+ int getHorizontalUnitSize() {
+ return mHorizontalUnit;
+ }
+
+ @Override
+ int getHorizontaUnitMargin() {
+ return mHorizontalMargin;
+ }
+
+ @Override
+ float[] getData() {
+ return mProfileData;
+ }
+
+ @Override
+ float getThreshold() {
+ return 16;
+ }
+
+ @Override
+ int getFrameCount() {
+ return mProfileData.length / PROFILE_FRAME_DATA_COUNT;
+ }
+
+ @Override
+ int getElementCount() {
+ return PROFILE_FRAME_DATA_COUNT;
+ }
+
+ @Override
+ int getCurrentFrame() {
+ return mProfileCurrentFrame / PROFILE_FRAME_DATA_COUNT;
+ }
+
+ @Override
+ void setupGraphPaint(Paint paint, int elementIndex) {
+ paint.setColor(PROFILE_DRAW_COLORS[elementIndex]);
+ if (mGraphType == GRAPH_TYPE_LINES) paint.setStrokeWidth(mThresholdStroke);
+ }
+
+ @Override
+ void setupThresholdPaint(Paint paint) {
+ paint.setColor(PROFILE_DRAW_THRESHOLD_COLOR);
+ paint.setStrokeWidth(mThresholdStroke);
+ }
+
+ @Override
+ void setupCurrentFramePaint(Paint paint) {
+ paint.setColor(PROFILE_DRAW_CURRENT_FRAME_COLOR);
+ if (mGraphType == GRAPH_TYPE_LINES) paint.setStrokeWidth(mThresholdStroke);
+ }
+ }
}
/**
* Hardware renderer using OpenGL ES 2.0.
*/
static class Gl20Renderer extends GlRenderer {
- private static final int PROFILE_DRAW_MARGIN = 0;
- private static final int PROFILE_DRAW_WIDTH = 3;
- private static final int[] PROFILE_DRAW_COLORS = { 0xcf3e66cc, 0xcfdc3912, 0xcfe69800 };
- private static final int PROFILE_DRAW_CURRENT_FRAME_COLOR = 0xcf5faa4d;
- private static final int PROFILE_DRAW_THRESHOLD_COLOR = 0xff5faa4d;
- private static final int PROFILE_DRAW_THRESHOLD_STROKE_WIDTH = 2;
- private static final int PROFILE_DRAW_DP_PER_MS = 7;
-
private GLES20Canvas mGlCanvas;
private DisplayMetrics mDisplayMetrics;
@@ -1581,101 +1790,149 @@
@Override
void drawProfileData(View.AttachInfo attachInfo) {
- if (mProfileEnabled && mProfileVisualizerEnabled) {
- initProfileDrawData(attachInfo);
+ if (mDebugDataProvider != null) {
+ final GraphDataProvider provider = mDebugDataProvider;
+ initProfileDrawData(attachInfo, provider);
- final int pxPerMs = (int) (PROFILE_DRAW_DP_PER_MS * mDisplayMetrics.density + 0.5f);
- final int margin = (int) (PROFILE_DRAW_MARGIN * mDisplayMetrics.density + 0.5f);
- final int width = (int) (PROFILE_DRAW_WIDTH * mDisplayMetrics.density + 0.5f);
+ final int height = provider.getVerticalUnitSize();
+ final int margin = provider.getHorizontaUnitMargin();
+ final int width = provider.getHorizontalUnitSize();
int x = 0;
int count = 0;
int current = 0;
- for (int i = 0; i < mProfileData.length; i += PROFILE_FRAME_DATA_COUNT) {
- if (mProfileData[i] < 0.0f) break;
+ final float[] data = provider.getData();
+ final int elementCount = provider.getElementCount();
+ final int graphType = provider.getGraphType();
+
+ int totalCount = provider.getFrameCount() * elementCount;
+ if (graphType == GraphDataProvider.GRAPH_TYPE_LINES) {
+ totalCount -= elementCount;
+ }
+
+ for (int i = 0; i < totalCount; i += elementCount) {
+ if (data[i] < 0.0f) break;
int index = count * 4;
- if (i == mProfileCurrentFrame) current = index;
+ if (i == provider.getCurrentFrame() * elementCount) current = index;
x += margin;
int x2 = x + width;
int y2 = mHeight;
- int y1 = (int) (y2 - mProfileData[i] * pxPerMs);
+ int y1 = (int) (y2 - data[i] * height);
- float[] r = mProfileRects[0];
- r[index] = x;
- r[index + 1] = y1;
- r[index + 2] = x2;
- r[index + 3] = y2;
+ switch (graphType) {
+ case GraphDataProvider.GRAPH_TYPE_BARS: {
+ for (int j = 0; j < elementCount; j++) {
+ //noinspection MismatchedReadAndWriteOfArray
+ final float[] r = mProfileShapes[j];
+ r[index] = x;
+ r[index + 1] = y1;
+ r[index + 2] = x2;
+ r[index + 3] = y2;
- y2 = y1;
- y1 = (int) (y2 - mProfileData[i + 1] * pxPerMs);
+ y2 = y1;
+ if (j < elementCount - 1) {
+ y1 = (int) (y2 - data[i + j + 1] * height);
+ }
+ }
+ } break;
+ case GraphDataProvider.GRAPH_TYPE_LINES: {
+ for (int j = 0; j < elementCount; j++) {
+ //noinspection MismatchedReadAndWriteOfArray
+ final float[] r = mProfileShapes[j];
+ r[index] = (x + x2) * 0.5f;
+ r[index + 1] = index == 0 ? y1 : r[index - 1];
+ r[index + 2] = r[index] + width;
+ r[index + 3] = y1;
- r = mProfileRects[1];
- r[index] = x;
- r[index + 1] = y1;
- r[index + 2] = x2;
- r[index + 3] = y2;
+ y2 = y1;
+ if (j < elementCount - 1) {
+ y1 = (int) (y2 - data[i + j + 1] * height);
+ }
+ }
+ } break;
+ }
- y2 = y1;
- y1 = (int) (y2 - mProfileData[i + 2] * pxPerMs);
-
- r = mProfileRects[2];
- r[index] = x;
- r[index + 1] = y1;
- r[index + 2] = x2;
- r[index + 3] = y2;
x += width;
-
count++;
}
+
x += margin;
- drawGraph(count);
- drawCurrentFrame(current);
- drawThreshold(x, pxPerMs);
+ drawGraph(graphType, count);
+ drawCurrentFrame(graphType, current);
+ drawThreshold(x, height);
}
}
- private void drawGraph(int count) {
- for (int i = 0; i < mProfileRects.length; i++) {
- mProfilePaint.setColor(PROFILE_DRAW_COLORS[i]);
- mGlCanvas.drawRects(mProfileRects[i], count, mProfilePaint);
- }
- }
-
- private void drawCurrentFrame(int index) {
- mProfilePaint.setColor(PROFILE_DRAW_CURRENT_FRAME_COLOR);
- mGlCanvas.drawRect(mProfileRects[2][index], mProfileRects[2][index + 1],
- mProfileRects[2][index + 2], mProfileRects[0][index + 3], mProfilePaint);
- }
-
- private void drawThreshold(int x, int pxPerMs) {
- mProfilePaint.setColor(PROFILE_DRAW_THRESHOLD_COLOR);
- mProfilePaint.setStrokeWidth((int)
- (PROFILE_DRAW_THRESHOLD_STROKE_WIDTH * mDisplayMetrics.density + 0.5f));
- int y = mHeight - 16 * pxPerMs;
- mGlCanvas.drawLine(0.0f, y, x, y, mProfilePaint);
- mProfilePaint.setStrokeWidth(1.0f);
- }
-
- private void initProfileDrawData(View.AttachInfo attachInfo) {
- if (mProfileRects == null) {
- mProfileRects = new float[PROFILE_FRAME_DATA_COUNT][];
- for (int i = 0; i < mProfileRects.length; i++) {
- int count = mProfileData.length / PROFILE_FRAME_DATA_COUNT;
- mProfileRects[i] = new float[count * 4];
+ private void drawGraph(int graphType, int count) {
+ for (int i = 0; i < mProfileShapes.length; i++) {
+ mDebugDataProvider.setupGraphPaint(mProfilePaint, i);
+ switch (graphType) {
+ case GraphDataProvider.GRAPH_TYPE_BARS:
+ mGlCanvas.drawRects(mProfileShapes[i], count, mProfilePaint);
+ break;
+ case GraphDataProvider.GRAPH_TYPE_LINES:
+ mGlCanvas.drawLines(mProfileShapes[i], 0, count * 4, mProfilePaint);
+ break;
}
+ }
+ }
+
+ private void drawCurrentFrame(int graphType, int index) {
+ if (index >= 0) {
+ mDebugDataProvider.setupCurrentFramePaint(mProfilePaint);
+ switch (graphType) {
+ case GraphDataProvider.GRAPH_TYPE_BARS:
+ mGlCanvas.drawRect(mProfileShapes[2][index], mProfileShapes[2][index + 1],
+ mProfileShapes[2][index + 2], mProfileShapes[0][index + 3],
+ mProfilePaint);
+ break;
+ case GraphDataProvider.GRAPH_TYPE_LINES:
+ mGlCanvas.drawLine(mProfileShapes[2][index], mProfileShapes[2][index + 1],
+ mProfileShapes[2][index], mHeight, mProfilePaint);
+ break;
+ }
+ }
+ }
+
+ private void drawThreshold(int x, int height) {
+ float threshold = mDebugDataProvider.getThreshold();
+ if (threshold > 0.0f) {
+ mDebugDataProvider.setupThresholdPaint(mProfilePaint);
+ int y = (int) (mHeight - threshold * height);
+ mGlCanvas.drawLine(0.0f, y, x, y, mProfilePaint);
+ }
+ }
+
+ private void initProfileDrawData(View.AttachInfo attachInfo, GraphDataProvider provider) {
+ if (mProfileShapes == null) {
+ final int elementCount = provider.getElementCount();
+ final int frameCount = provider.getFrameCount();
+
+ mProfileShapes = new float[elementCount][];
+ for (int i = 0; i < elementCount; i++) {
+ mProfileShapes[i] = new float[frameCount * 4];
+ }
+
mProfilePaint = new Paint();
}
+ mProfilePaint.reset();
+ if (provider.getGraphType() == GraphDataProvider.GRAPH_TYPE_LINES) {
+ mProfilePaint.setAntiAlias(true);
+ }
+
if (mDisplayMetrics == null) {
mDisplayMetrics = new DisplayMetrics();
}
+
attachInfo.mDisplay.getMetrics(mDisplayMetrics);
+ provider.prepare(mDisplayMetrics);
}
@Override
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 97287c3..a4e4f37 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -4376,10 +4376,16 @@
if ((mPrivateFlags & PFLAG_FOCUSED) == 0) {
mPrivateFlags |= PFLAG_FOCUSED;
+ View oldFocus = (mAttachInfo != null) ? getRootView().findFocus() : null;
+
if (mParent != null) {
mParent.requestChildFocus(this, this);
}
+ if (mAttachInfo != null) {
+ mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(oldFocus, this);
+ }
+
onFocusChanged(true, direction, previouslyFocusedRect);
refreshDrawableState();
@@ -4486,7 +4492,9 @@
refreshDrawableState();
- ensureInputFocusOnFirstFocusable();
+ if (!rootViewRequestFocus()) {
+ notifyGlobalFocusCleared(this);
+ }
if (AccessibilityManager.getInstance(mContext).isEnabled()) {
notifyAccessibilityStateChanged();
@@ -4494,11 +4502,18 @@
}
}
- void ensureInputFocusOnFirstFocusable() {
+ void notifyGlobalFocusCleared(View oldFocus) {
+ if (oldFocus != null && mAttachInfo != null) {
+ mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(oldFocus, null);
+ }
+ }
+
+ boolean rootViewRequestFocus() {
View root = getRootView();
if (root != null) {
- root.requestFocus();
+ return root.requestFocus();
}
+ return false;
}
/**
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index c274f27..a4898fc 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -3697,7 +3697,9 @@
clearChildFocus = true;
}
- view.clearAccessibilityFocus();
+ if (view.isAccessibilityFocused()) {
+ view.clearAccessibilityFocus();
+ }
cancelTouchTarget(view);
cancelHoverTarget(view);
@@ -3719,11 +3721,9 @@
if (clearChildFocus) {
clearChildFocus(view);
- ensureInputFocusOnFirstFocusable();
- }
-
- if (view.isAccessibilityFocused()) {
- view.clearAccessibilityFocus();
+ if (!rootViewRequestFocus()) {
+ notifyGlobalFocusCleared(this);
+ }
}
onViewRemoved(view);
@@ -3765,7 +3765,7 @@
private void removeViewsInternal(int start, int count) {
final View focused = mFocused;
final boolean detach = mAttachInfo != null;
- View clearChildFocus = null;
+ boolean clearChildFocus = false;
final View[] children = mChildren;
final int end = start + count;
@@ -3779,10 +3779,12 @@
if (view == focused) {
view.unFocus();
- clearChildFocus = view;
+ clearChildFocus = true;
}
- view.clearAccessibilityFocus();
+ if (view.isAccessibilityFocused()) {
+ view.clearAccessibilityFocus();
+ }
cancelTouchTarget(view);
cancelHoverTarget(view);
@@ -3805,9 +3807,11 @@
removeFromArray(start, count);
- if (clearChildFocus != null) {
- clearChildFocus(clearChildFocus);
- ensureInputFocusOnFirstFocusable();
+ if (clearChildFocus) {
+ clearChildFocus(focused);
+ if (!rootViewRequestFocus()) {
+ notifyGlobalFocusCleared(focused);
+ }
}
}
@@ -3849,7 +3853,7 @@
final View focused = mFocused;
final boolean detach = mAttachInfo != null;
- View clearChildFocus = null;
+ boolean clearChildFocus = false;
needGlobalAttributesUpdate(false);
@@ -3862,10 +3866,12 @@
if (view == focused) {
view.unFocus();
- clearChildFocus = view;
+ clearChildFocus = true;
}
- view.clearAccessibilityFocus();
+ if (view.isAccessibilityFocused()) {
+ view.clearAccessibilityFocus();
+ }
cancelTouchTarget(view);
cancelHoverTarget(view);
@@ -3887,9 +3893,11 @@
children[i] = null;
}
- if (clearChildFocus != null) {
- clearChildFocus(clearChildFocus);
- ensureInputFocusOnFirstFocusable();
+ if (clearChildFocus) {
+ clearChildFocus(focused);
+ if (!rootViewRequestFocus()) {
+ notifyGlobalFocusCleared(focused);
+ }
}
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index f9f955e..6a96893 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -169,9 +169,6 @@
int mSeq;
View mView;
- View mFocusedView;
- View mRealFocusedView; // this is not set to null in touch mode
- View mOldFocusedView;
View mAccessibilityFocusedHost;
AccessibilityNodeInfo mAccessibilityFocusedVirtualView;
@@ -269,7 +266,7 @@
boolean mScrollMayChange;
int mSoftInputMode;
- View mLastScrolledFocus;
+ WeakReference<View> mLastScrolledFocus;
int mScrollY;
int mCurScrollY;
Scroller mScroller;
@@ -1526,7 +1523,9 @@
} else if (!mSurface.isValid()) {
// If the surface has been removed, then reset the scroll
// positions.
- mLastScrolledFocus = null;
+ if (mLastScrolledFocus != null) {
+ mLastScrolledFocus.clear();
+ }
mScrollY = mCurScrollY = 0;
if (mScroller != null) {
mScroller.abortAnimation();
@@ -1802,13 +1801,11 @@
if (mView != null) {
if (!mView.hasFocus()) {
mView.requestFocus(View.FOCUS_FORWARD);
- mFocusedView = mRealFocusedView = mView.findFocus();
if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: requested focused view="
- + mFocusedView);
+ + mView.findFocus());
} else {
- mRealFocusedView = mView.findFocus();
if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: existing focused view="
- + mRealFocusedView);
+ + mView.findFocus());
}
}
if ((relayoutResult & WindowManagerGlobal.RELAYOUT_RES_ANIMATING) != 0) {
@@ -2514,17 +2511,12 @@
// requestChildRectangleOnScreen() call (in which case 'rectangle'
// is non-null and we just want to scroll to whatever that
// rectangle is).
- View focus = mRealFocusedView;
-
- // When in touch mode, focus points to the previously focused view,
- // which may have been removed from the view hierarchy. The following
- // line checks whether the view is still in our hierarchy.
- if (focus == null || focus.mAttachInfo != mAttachInfo) {
- mRealFocusedView = null;
+ View focus = mView.findFocus();
+ if (focus == null) {
return false;
}
-
- if (focus != mLastScrolledFocus) {
+ View lastScrolledFocus = (mLastScrolledFocus != null) ? mLastScrolledFocus.get() : null;
+ if (lastScrolledFocus != null && focus != lastScrolledFocus) {
// If the focus has changed, then ignore any requests to scroll
// to a rectangle; first we want to make sure the entire focus
// view is visible.
@@ -2533,8 +2525,7 @@
if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Eval scroll: focus=" + focus
+ " rectangle=" + rectangle + " ci=" + ci
+ " vi=" + vi);
- if (focus == mLastScrolledFocus && !mScrollMayChange
- && rectangle == null) {
+ if (focus == lastScrolledFocus && !mScrollMayChange && rectangle == null) {
// Optimization: if the focus hasn't changed since last
// time, and no layout has happened, then just leave things
// as they are.
@@ -2544,7 +2535,7 @@
// We need to determine if the currently focused view is
// within the visible part of the window and, if not, apply
// a pan so it can be seen.
- mLastScrolledFocus = focus;
+ mLastScrolledFocus = new WeakReference<View>(focus);
mScrollMayChange = false;
if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Need to scroll?");
// Try to find the rectangle from the focus view.
@@ -2671,33 +2662,19 @@
}
public void requestChildFocus(View child, View focused) {
- checkThread();
-
if (DEBUG_INPUT_RESIZE) {
Log.v(TAG, "Request child focus: focus now " + focused);
}
-
- mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(mOldFocusedView, focused);
+ checkThread();
scheduleTraversals();
-
- mFocusedView = mRealFocusedView = focused;
}
public void clearChildFocus(View child) {
- checkThread();
-
if (DEBUG_INPUT_RESIZE) {
Log.v(TAG, "Clearing child focus");
}
-
- mOldFocusedView = mFocusedView;
-
- // Invoke the listener only if there is no view to take focus
- if (focusSearch(null, View.FOCUS_FORWARD) == null) {
- mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(mOldFocusedView, null);
- }
-
- mFocusedView = mRealFocusedView = null;
+ checkThread();
+ scheduleTraversals();
}
@Override
@@ -2714,14 +2691,13 @@
// the one case where will transfer focus away from the current one
// is if the current view is a view group that prefers to give focus
// to its children first AND the view is a descendant of it.
- mFocusedView = mView.findFocus();
- boolean descendantsHaveDibsOnFocus =
- (mFocusedView instanceof ViewGroup) &&
- (((ViewGroup) mFocusedView).getDescendantFocusability() ==
- ViewGroup.FOCUS_AFTER_DESCENDANTS);
- if (descendantsHaveDibsOnFocus && isViewDescendantOf(v, mFocusedView)) {
- // If a view gets the focus, the listener will be invoked from requestChildFocus()
- v.requestFocus();
+ View focused = mView.findFocus();
+ if (focused instanceof ViewGroup) {
+ ViewGroup group = (ViewGroup) focused;
+ if (group.getDescendantFocusability() == ViewGroup.FOCUS_AFTER_DESCENDANTS
+ && isViewDescendantOf(v, focused)) {
+ v.requestFocus();
+ }
}
}
}
@@ -3199,7 +3175,6 @@
// set yet.
final View focused = mView.findFocus();
if (focused != null && !focused.isFocusableInTouchMode()) {
-
final ViewGroup ancestorToTakeFocus =
findAncestorToTakeFocusInTouchMode(focused);
if (ancestorToTakeFocus != null) {
@@ -3208,10 +3183,7 @@
return ancestorToTakeFocus.requestFocus();
} else {
// nothing appropriate to have focus in touch mode, clear it out
- mView.unFocus();
- mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(focused, null);
- mFocusedView = null;
- mOldFocusedView = null;
+ focused.unFocus();
return true;
}
}
@@ -3246,12 +3218,11 @@
private boolean leaveTouchMode() {
if (mView != null) {
if (mView.hasFocus()) {
- // i learned the hard way to not trust mFocusedView :)
- mFocusedView = mView.findFocus();
- if (!(mFocusedView instanceof ViewGroup)) {
+ View focusedView = mView.findFocus();
+ if (!(focusedView instanceof ViewGroup)) {
// some view has focus, let it keep it
return false;
- } else if (((ViewGroup)mFocusedView).getDescendantFocusability() !=
+ } else if (((ViewGroup) focusedView).getDescendantFocusability() !=
ViewGroup.FOCUS_AFTER_DESCENDANTS) {
// some view group has focus, and doesn't prefer its children
// over itself for focus, so let them keep it.
diff --git a/core/java/android/view/VolumePanel.java b/core/java/android/view/VolumePanel.java
index 6251c45..d4e27bc 100644
--- a/core/java/android/view/VolumePanel.java
+++ b/core/java/android/view/VolumePanel.java
@@ -309,6 +309,7 @@
lp.type = LayoutParams.TYPE_VOLUME_OVERLAY;
lp.width = LayoutParams.WRAP_CONTENT;
lp.height = LayoutParams.WRAP_CONTENT;
+ lp.privateFlags |= LayoutParams.PRIVATE_FLAG_FORCE_SHOW_NAV_BAR;
window.setAttributes(lp);
window.addFlags(LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 3b31ff6..6a67d8b 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -946,6 +946,13 @@
public static final int PRIVATE_FLAG_SHOW_FOR_ALL_USERS = 0x00000010;
/**
+ * Special flag for the volume overlay: force the window manager out of "hide nav bar"
+ * mode while the window is on screen.
+ *
+ * {@hide} */
+ public static final int PRIVATE_FLAG_FORCE_SHOW_NAV_BAR = 0x00000020;
+
+ /**
* Control flags that are private to the platform.
* @hide
*/
diff --git a/core/java/android/webkit/package.html b/core/java/android/webkit/package.html
index 4ed08da..7182488 100644
--- a/core/java/android/webkit/package.html
+++ b/core/java/android/webkit/package.html
@@ -1,7 +1,7 @@
<html>
<body>
-Provides tools for browsing the web.
-<p>The only classes or interfaces in this package intended for use by SDK
-developers are WebView, BroswerCallbackAdapter, BrowserCallback, and CookieManager.
+<p>Provides tools for browsing the web.
+<p>For more information about building apps with web-based content, see the
+<a href="{@docRoot}guide/webapps/overview.html">Web Apps Overview</a>.
</body>
</html>
\ No newline at end of file
diff --git a/core/java/android/widget/ArrayAdapter.java b/core/java/android/widget/ArrayAdapter.java
index 44f04db..97926a7 100644
--- a/core/java/android/widget/ArrayAdapter.java
+++ b/core/java/android/widget/ArrayAdapter.java
@@ -97,11 +97,11 @@
* Constructor
*
* @param context The current context.
- * @param textViewResourceId The resource ID for a layout file containing a TextView to use when
+ * @param resource The resource ID for a layout file containing a TextView to use when
* instantiating views.
*/
- public ArrayAdapter(Context context, int textViewResourceId) {
- init(context, textViewResourceId, 0, new ArrayList<T>());
+ public ArrayAdapter(Context context, int resource) {
+ init(context, resource, 0, new ArrayList<T>());
}
/**
@@ -120,12 +120,12 @@
* Constructor
*
* @param context The current context.
- * @param textViewResourceId The resource ID for a layout file containing a TextView to use when
+ * @param resource The resource ID for a layout file containing a TextView to use when
* instantiating views.
* @param objects The objects to represent in the ListView.
*/
- public ArrayAdapter(Context context, int textViewResourceId, T[] objects) {
- init(context, textViewResourceId, 0, Arrays.asList(objects));
+ public ArrayAdapter(Context context, int resource, T[] objects) {
+ init(context, resource, 0, Arrays.asList(objects));
}
/**
@@ -145,12 +145,12 @@
* Constructor
*
* @param context The current context.
- * @param textViewResourceId The resource ID for a layout file containing a TextView to use when
+ * @param resource The resource ID for a layout file containing a TextView to use when
* instantiating views.
* @param objects The objects to represent in the ListView.
*/
- public ArrayAdapter(Context context, int textViewResourceId, List<T> objects) {
- init(context, textViewResourceId, 0, objects);
+ public ArrayAdapter(Context context, int resource, List<T> objects) {
+ init(context, resource, 0, objects);
}
/**
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 57e3c8b..79fc51e 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -487,13 +487,15 @@
}
private class SetRemoteViewsAdapterList extends Action {
- public SetRemoteViewsAdapterList(int id, ArrayList<RemoteViews> list) {
+ public SetRemoteViewsAdapterList(int id, ArrayList<RemoteViews> list, int viewTypeCount) {
this.viewId = id;
this.list = list;
+ this.viewTypeCount = viewTypeCount;
}
public SetRemoteViewsAdapterList(Parcel parcel) {
viewId = parcel.readInt();
+ viewTypeCount = parcel.readInt();
int count = parcel.readInt();
list = new ArrayList<RemoteViews>();
@@ -506,6 +508,7 @@
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(TAG);
dest.writeInt(viewId);
+ dest.writeInt(viewTypeCount);
if (list == null || list.size() == 0) {
dest.writeInt(0);
@@ -540,18 +543,18 @@
if (target instanceof AbsListView) {
AbsListView v = (AbsListView) target;
Adapter a = v.getAdapter();
- if (a instanceof RemoteViewsListAdapter) {
+ if (a instanceof RemoteViewsListAdapter && viewTypeCount <= a.getViewTypeCount()) {
((RemoteViewsListAdapter) a).setViewsList(list);
} else {
- v.setAdapter(new RemoteViewsListAdapter(v.getContext(), list));
+ v.setAdapter(new RemoteViewsListAdapter(v.getContext(), list, viewTypeCount));
}
} else if (target instanceof AdapterViewAnimator) {
AdapterViewAnimator v = (AdapterViewAnimator) target;
Adapter a = v.getAdapter();
- if (a instanceof RemoteViewsListAdapter) {
+ if (a instanceof RemoteViewsListAdapter && viewTypeCount <= a.getViewTypeCount()) {
((RemoteViewsListAdapter) a).setViewsList(list);
} else {
- v.setAdapter(new RemoteViewsListAdapter(v.getContext(), list));
+ v.setAdapter(new RemoteViewsListAdapter(v.getContext(), list, viewTypeCount));
}
}
}
@@ -560,6 +563,7 @@
return "SetRemoteViewsAdapterList";
}
+ int viewTypeCount;
ArrayList<RemoteViews> list;
public final static int TAG = 15;
}
@@ -2099,9 +2103,13 @@
*
* @param viewId The id of the {@link AdapterView}
* @param list The list of RemoteViews which will populate the view specified by viewId.
+ * @param viewTypeCount The maximum number of unique layout id's used to construct the list of
+ * RemoteViews. This count cannot change during the life-cycle of a given widget, so this
+ * parameter should account for the maximum possible number of types that may appear in the
+ * See {@link Adapter#getViewTypeCount()}.
*/
- public void setRemoteAdapter(int viewId, ArrayList<RemoteViews> list) {
- addAction(new SetRemoteViewsAdapterList(viewId, list));
+ public void setRemoteAdapter(int viewId, ArrayList<RemoteViews> list, int viewTypeCount) {
+ addAction(new SetRemoteViewsAdapterList(viewId, list, viewTypeCount));
}
/**
diff --git a/core/java/android/widget/RemoteViewsListAdapter.java b/core/java/android/widget/RemoteViewsListAdapter.java
index 9598771..e490458 100644
--- a/core/java/android/widget/RemoteViewsListAdapter.java
+++ b/core/java/android/widget/RemoteViewsListAdapter.java
@@ -30,10 +30,13 @@
private Context mContext;
private ArrayList<RemoteViews> mRemoteViewsList;
private ArrayList<Integer> mViewTypes = new ArrayList<Integer>();
+ private int mViewTypeCount;
- public RemoteViewsListAdapter(Context context, ArrayList<RemoteViews> remoteViews) {
+ public RemoteViewsListAdapter(Context context, ArrayList<RemoteViews> remoteViews,
+ int viewTypeCount) {
mContext = context;
mRemoteViewsList = remoteViews;
+ mViewTypeCount = viewTypeCount;
init();
}
@@ -52,6 +55,11 @@
mViewTypes.add(rv.getLayoutId());
}
}
+
+ if (mViewTypes.size() > mViewTypeCount || mViewTypeCount < 1) {
+ throw new RuntimeException("Invalid view type count -- view type count must be >= 1" +
+ "and must be as large as the total number of distinct view types");
+ }
}
@Override
@@ -77,6 +85,7 @@
public View getView(int position, View convertView, ViewGroup parent) {
if (position < getCount()) {
RemoteViews rv = mRemoteViewsList.get(position);
+ rv.setIsWidgetCollectionChild(true);
View v;
if (convertView != null && rv != null &&
convertView.getId() == rv.getLayoutId()) {
@@ -102,7 +111,7 @@
}
public int getViewTypeCount() {
- return mViewTypes.size();
+ return mViewTypeCount;
}
@Override
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index 61bc002..8ccc612 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -1052,6 +1052,7 @@
(mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0;
if (showTitle) {
x += positionChild(mTitleLayout, x, y, contentHeight, isLayoutRtl);
+ homeSlop = mTitleLayout.getWidth();
}
switch (mNavigationMode) {
diff --git a/docs/downloads/brand/af_generic_rgb_wo.ai b/docs/downloads/brand/af_generic_rgb_wo.ai
new file mode 100644
index 0000000..2cec2e97
--- /dev/null
+++ b/docs/downloads/brand/af_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/ar_generic_rgb_wo.ai b/docs/downloads/brand/ar_generic_rgb_wo.ai
new file mode 100644
index 0000000..0eeb4f7
--- /dev/null
+++ b/docs/downloads/brand/ar_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/be_generic_rgb_wo.ai b/docs/downloads/brand/be_generic_rgb_wo.ai
new file mode 100644
index 0000000..3b82926
--- /dev/null
+++ b/docs/downloads/brand/be_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/bg_generic_rgb_wo.ai b/docs/downloads/brand/bg_generic_rgb_wo.ai
new file mode 100644
index 0000000..51e2a5d
--- /dev/null
+++ b/docs/downloads/brand/bg_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/ca_generic_rgb_wo.ai b/docs/downloads/brand/ca_generic_rgb_wo.ai
new file mode 100644
index 0000000..07b7fc5
--- /dev/null
+++ b/docs/downloads/brand/ca_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/cs_generic_rgb_wo.ai b/docs/downloads/brand/cs_generic_rgb_wo.ai
new file mode 100644
index 0000000..a998cb6
--- /dev/null
+++ b/docs/downloads/brand/cs_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/da_generic_rgb_wo.ai b/docs/downloads/brand/da_generic_rgb_wo.ai
new file mode 100644
index 0000000..d1bdc08
--- /dev/null
+++ b/docs/downloads/brand/da_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/de_app_rgb_wo.ai b/docs/downloads/brand/de_app_rgb_wo.ai
new file mode 100644
index 0000000..c0e8da3
--- /dev/null
+++ b/docs/downloads/brand/de_app_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/de_generic_rgb_wo.ai b/docs/downloads/brand/de_generic_rgb_wo.ai
new file mode 100644
index 0000000..e1463ef
--- /dev/null
+++ b/docs/downloads/brand/de_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/el_generic_rgb_wo.ai b/docs/downloads/brand/el_generic_rgb_wo.ai
new file mode 100644
index 0000000..0f7581b
--- /dev/null
+++ b/docs/downloads/brand/el_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/en_app_rgb_wo.ai b/docs/downloads/brand/en_app_rgb_wo.ai
new file mode 100644
index 0000000..db27314
--- /dev/null
+++ b/docs/downloads/brand/en_app_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/en_generic_rgb_wo.ai b/docs/downloads/brand/en_generic_rgb_wo.ai
new file mode 100644
index 0000000..57c1e47
--- /dev/null
+++ b/docs/downloads/brand/en_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/es-419_app_rgb_wo.ai b/docs/downloads/brand/es-419_app_rgb_wo.ai
new file mode 100644
index 0000000..9285921
--- /dev/null
+++ b/docs/downloads/brand/es-419_app_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/es-419_generic_rgb_wo.ai b/docs/downloads/brand/es-419_generic_rgb_wo.ai
new file mode 100644
index 0000000..1629e3e
--- /dev/null
+++ b/docs/downloads/brand/es-419_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/es_app_rgb_wo.ai b/docs/downloads/brand/es_app_rgb_wo.ai
new file mode 100644
index 0000000..78a3e5a4
--- /dev/null
+++ b/docs/downloads/brand/es_app_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/es_generic_rgb_wo.ai b/docs/downloads/brand/es_generic_rgb_wo.ai
new file mode 100644
index 0000000..bc839bc
--- /dev/null
+++ b/docs/downloads/brand/es_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/et_generic_rgb_wo.ai b/docs/downloads/brand/et_generic_rgb_wo.ai
new file mode 100644
index 0000000..693a73e
--- /dev/null
+++ b/docs/downloads/brand/et_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/fa_generic_rgb_wo.ai b/docs/downloads/brand/fa_generic_rgb_wo.ai
new file mode 100644
index 0000000..d6a0a8b
--- /dev/null
+++ b/docs/downloads/brand/fa_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/fi_generic_rgb_wo.ai b/docs/downloads/brand/fi_generic_rgb_wo.ai
new file mode 100644
index 0000000..1b18681
--- /dev/null
+++ b/docs/downloads/brand/fi_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/fil_generic_rgb_wo.ai b/docs/downloads/brand/fil_generic_rgb_wo.ai
new file mode 100644
index 0000000..958568a
--- /dev/null
+++ b/docs/downloads/brand/fil_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/fr_app_rgb_wo.ai b/docs/downloads/brand/fr_app_rgb_wo.ai
new file mode 100644
index 0000000..288c6da
--- /dev/null
+++ b/docs/downloads/brand/fr_app_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/fr_generic_rgb_wo.ai b/docs/downloads/brand/fr_generic_rgb_wo.ai
new file mode 100644
index 0000000..a542afc
--- /dev/null
+++ b/docs/downloads/brand/fr_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/hr_generic_rgb_wo.ai b/docs/downloads/brand/hr_generic_rgb_wo.ai
new file mode 100644
index 0000000..266257e
--- /dev/null
+++ b/docs/downloads/brand/hr_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/hu_generic_rgb_wo.ai b/docs/downloads/brand/hu_generic_rgb_wo.ai
new file mode 100644
index 0000000..dd436b6
--- /dev/null
+++ b/docs/downloads/brand/hu_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/id-in_generic_rgb_wo.ai b/docs/downloads/brand/id-in_generic_rgb_wo.ai
new file mode 100644
index 0000000..62d0be1
--- /dev/null
+++ b/docs/downloads/brand/id-in_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/it_app_rgb_wo.ai b/docs/downloads/brand/it_app_rgb_wo.ai
new file mode 100644
index 0000000..32024e4
--- /dev/null
+++ b/docs/downloads/brand/it_app_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/it_generic_rgb_wo.ai b/docs/downloads/brand/it_generic_rgb_wo.ai
new file mode 100644
index 0000000..a483b36
--- /dev/null
+++ b/docs/downloads/brand/it_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/iw-he_generic_rgb_wo.ai b/docs/downloads/brand/iw-he_generic_rgb_wo.ai
new file mode 100644
index 0000000..52c9641
--- /dev/null
+++ b/docs/downloads/brand/iw-he_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/ja_app_rgb_wo.ai b/docs/downloads/brand/ja_app_rgb_wo.ai
new file mode 100644
index 0000000..dacf38d
--- /dev/null
+++ b/docs/downloads/brand/ja_app_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/ja_generic_rgb_wo.ai b/docs/downloads/brand/ja_generic_rgb_wo.ai
new file mode 100644
index 0000000..fdfb9545
--- /dev/null
+++ b/docs/downloads/brand/ja_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/ko_app_rgb_wo.ai b/docs/downloads/brand/ko_app_rgb_wo.ai
new file mode 100644
index 0000000..4463149
--- /dev/null
+++ b/docs/downloads/brand/ko_app_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/ko_generic_rgb_wo.ai b/docs/downloads/brand/ko_generic_rgb_wo.ai
new file mode 100644
index 0000000..0d2d8bd
--- /dev/null
+++ b/docs/downloads/brand/ko_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/lt_generic_rgb_wo.ai b/docs/downloads/brand/lt_generic_rgb_wo.ai
new file mode 100644
index 0000000..fc679c7
--- /dev/null
+++ b/docs/downloads/brand/lt_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/lv_generic_rgb_wo.ai b/docs/downloads/brand/lv_generic_rgb_wo.ai
new file mode 100644
index 0000000..b07b28b
--- /dev/null
+++ b/docs/downloads/brand/lv_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/ms_generic_rgb_wo.ai b/docs/downloads/brand/ms_generic_rgb_wo.ai
new file mode 100644
index 0000000..c2f052e
--- /dev/null
+++ b/docs/downloads/brand/ms_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/nl_app_rgb_wo.ai b/docs/downloads/brand/nl_app_rgb_wo.ai
new file mode 100644
index 0000000..60d1ad8
--- /dev/null
+++ b/docs/downloads/brand/nl_app_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/nl_generic_rgb_wo.ai b/docs/downloads/brand/nl_generic_rgb_wo.ai
new file mode 100644
index 0000000..03eed23
--- /dev/null
+++ b/docs/downloads/brand/nl_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/no_generic_rgb_wo.ai b/docs/downloads/brand/no_generic_rgb_wo.ai
new file mode 100644
index 0000000..703e99a
--- /dev/null
+++ b/docs/downloads/brand/no_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/pl_generic_rgb_wo.ai b/docs/downloads/brand/pl_generic_rgb_wo.ai
new file mode 100644
index 0000000..fac15d2
--- /dev/null
+++ b/docs/downloads/brand/pl_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/pt-br_app_rgb_wo.ai b/docs/downloads/brand/pt-br_app_rgb_wo.ai
new file mode 100644
index 0000000..686455d
--- /dev/null
+++ b/docs/downloads/brand/pt-br_app_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/pt-br_generic_rgb_wo.ai b/docs/downloads/brand/pt-br_generic_rgb_wo.ai
new file mode 100644
index 0000000..00379cc
--- /dev/null
+++ b/docs/downloads/brand/pt-br_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/pt-pt_app_rgb_wo.ai b/docs/downloads/brand/pt-pt_app_rgb_wo.ai
new file mode 100644
index 0000000..bd19a28
--- /dev/null
+++ b/docs/downloads/brand/pt-pt_app_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/pt-pt_generic_rgb_wo.ai b/docs/downloads/brand/pt-pt_generic_rgb_wo.ai
new file mode 100644
index 0000000..29476cc
--- /dev/null
+++ b/docs/downloads/brand/pt-pt_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/ro_generic_rgb_wo.ai b/docs/downloads/brand/ro_generic_rgb_wo.ai
new file mode 100644
index 0000000..6152a94
--- /dev/null
+++ b/docs/downloads/brand/ro_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/ru_generic_rgb_wo.ai b/docs/downloads/brand/ru_generic_rgb_wo.ai
new file mode 100644
index 0000000..1e73a61
--- /dev/null
+++ b/docs/downloads/brand/ru_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/sk_generic_rgb_wo.ai b/docs/downloads/brand/sk_generic_rgb_wo.ai
new file mode 100644
index 0000000..50735bd
--- /dev/null
+++ b/docs/downloads/brand/sk_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/sl_generic_rgb_wo.ai b/docs/downloads/brand/sl_generic_rgb_wo.ai
new file mode 100644
index 0000000..96f4708
--- /dev/null
+++ b/docs/downloads/brand/sl_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/sr_generic_rgb_wo.ai b/docs/downloads/brand/sr_generic_rgb_wo.ai
new file mode 100644
index 0000000..53dacd9
--- /dev/null
+++ b/docs/downloads/brand/sr_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/sv_generic_rgb_wo.ai b/docs/downloads/brand/sv_generic_rgb_wo.ai
new file mode 100644
index 0000000..f148dd3
--- /dev/null
+++ b/docs/downloads/brand/sv_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/sw_generic_rgb_wo.ai b/docs/downloads/brand/sw_generic_rgb_wo.ai
new file mode 100644
index 0000000..00d660c
--- /dev/null
+++ b/docs/downloads/brand/sw_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/th_generic_rgb_wo.ai b/docs/downloads/brand/th_generic_rgb_wo.ai
new file mode 100644
index 0000000..b24eff6
--- /dev/null
+++ b/docs/downloads/brand/th_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/tr_generic_rgb_wo.ai b/docs/downloads/brand/tr_generic_rgb_wo.ai
new file mode 100644
index 0000000..39db427
--- /dev/null
+++ b/docs/downloads/brand/tr_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/uk_generic_rgb_wo.ai b/docs/downloads/brand/uk_generic_rgb_wo.ai
new file mode 100644
index 0000000..81f510f
--- /dev/null
+++ b/docs/downloads/brand/uk_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/vi_generic_rgb_wo.ai b/docs/downloads/brand/vi_generic_rgb_wo.ai
new file mode 100644
index 0000000..5a0c796
--- /dev/null
+++ b/docs/downloads/brand/vi_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/zh-cn_generic_rgb_wo.ai b/docs/downloads/brand/zh-cn_generic_rgb_wo.ai
new file mode 100644
index 0000000..078b024
--- /dev/null
+++ b/docs/downloads/brand/zh-cn_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/zh-hk_generic_rgb_wo.ai b/docs/downloads/brand/zh-hk_generic_rgb_wo.ai
new file mode 100644
index 0000000..6d3bf0e
--- /dev/null
+++ b/docs/downloads/brand/zh-hk_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/zh-tw_generic_rgb_wo.ai b/docs/downloads/brand/zh-tw_generic_rgb_wo.ai
new file mode 100644
index 0000000..55d34ba
--- /dev/null
+++ b/docs/downloads/brand/zh-tw_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/downloads/brand/zu_generic_rgb_wo.ai b/docs/downloads/brand/zu_generic_rgb_wo.ai
new file mode 100644
index 0000000..cfc14d1
--- /dev/null
+++ b/docs/downloads/brand/zu_generic_rgb_wo.ai
Binary files differ
diff --git a/docs/html/distribute/googleplay/promote/badge-files.jd b/docs/html/distribute/googleplay/promote/badge-files.jd
new file mode 100644
index 0000000..92001ed
--- /dev/null
+++ b/docs/html/distribute/googleplay/promote/badge-files.jd
@@ -0,0 +1,289 @@
+page.title=Google Play Badge Files
+@jd:body
+
+
+
+
+<style>
+table tr td {border:0}
+</style>
+
+<p>The following links provide the Adobe® Illustrator® (.ai) file for the
+two Google Play badges.</p>
+
+<hr>
+<img src="{@docRoot}images/brand/en_generic_rgb_wo_60.png" alt="Get It On Google Play">
+
+<div style="clear:left"> </div>
+
+<div class="col-4" style="margin-left:0">
+
+ <a href="{@docRoot}downloads/brand/en_generic_rgb_wo.ai">English (English)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/af_generic_rgb_wo.ai">Afrikaans (Afrikaans)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/ar_generic_rgb_wo.ai">العربية (Arabic)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/be_generic_rgb_wo.ai">Беларуская (Belarusian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/bg_generic_rgb_wo.ai">български (Bulgarian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/ca_generic_rgb_wo.ai">Català (Catalan)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/zh-cn_generic_rgb_wo.ai">中文 (中国) (Chinese)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/zh-hk_generic_rgb_wo.ai">中文(香港) (Chinese Hong Kong)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/zh-tw_generic_rgb_wo.ai">中文 (台灣) (Chinese Taiwan)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/hr_generic_rgb_wo.ai">Hrvatski (Croatian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/cs_generic_rgb_wo.ai">Česky (Czech)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/da_generic_rgb_wo.ai">Dansk (Danish)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/nl_generic_rgb_wo.ai">Nederlands (Dutch)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/et_generic_rgb_wo.ai">Eesti keel (Estonian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/fa_generic_rgb_wo.ai">فارسی (Farsi Persian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/fil_generic_rgb_wo.ai">Tagalog (Filipino)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/fi_generic_rgb_wo.ai">Suomi (Finnish)</a><br/>
+
+</div>
+
+<div class="col-4">
+
+ <a href="{@docRoot}downloads/brand/fr_generic_rgb_wo.ai">Français (French)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/de_generic_rgb_wo.ai">Deutsch (German)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/el_generic_rgb_wo.ai">Ελληνικά (Greek)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/iw-he_generic_rgb_wo.ai">עברית (Hebrew)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/hu_generic_rgb_wo.ai">Magyar (Hungarian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/id-in_generic_rgb_wo.ai">Bahasa Indonesia (Indonesian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/it_generic_rgb_wo.ai">Italiano (Italian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/ja_generic_rgb_wo.ai">日本語 (Japanese)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/ko_generic_rgb_wo.ai">한국어 (Korean)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/lv_generic_rgb_wo.ai">Latviski (Latvian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/lt_generic_rgb_wo.ai">Lietuviškai (Lithuanian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/ms_generic_rgb_wo.ai">Bahasa Melayu (Malay)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/no_generic_rgb_wo.ai">Norsk (Norwegian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/pl_generic_rgb_wo.ai">Polski (Polish)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/pt-pt_generic_rgb_wo.ai">Português (Portuguese)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/pt-br_generic_rgb_wo.ai">Português Brasil (Portuguese Brazil)</a><br/>
+
+</div>
+
+<div class="col-4" style="margin-right:0">
+
+ <a href="{@docRoot}downloads/brand/ro_generic_rgb_wo.ai">Românã (Romanian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/ru_generic_rgb_wo.ai">Pусский (Russian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/sr_generic_rgb_wo.ai">Српски / srpski (Serbian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/sk_generic_rgb_wo.ai">Slovenčina (Slovak)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/sl_generic_rgb_wo.ai">Slovenščina (Slovenian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/es_generic_rgb_wo.ai">Español (Spanish)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/es-419_generic_rgb_wo.ai">Español Latinoamérica (Spanish Latin America)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/sv_generic_rgb_wo.ai">Svenska (Swedish)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/sw_generic_rgb_wo.ai">Kiswahili (Swahili)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/th_generic_rgb_wo.ai">ภาษาไทย (Thai)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/tr_generic_rgb_wo.ai">Türkçe (Turkish)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/uk_generic_rgb_wo.ai">Українська (Ukrainian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/vi_generic_rgb_wo.ai">Tiếng Việt (Vietnamese)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/zu_generic_rgb_wo.ai">isiZulu (Zulu)</a><br/>
+
+</div>
+<div style="clear:left"> </div>
+
+
+
+
+
+
+<hr>
+<img src="{@docRoot}images/brand/en_app_rgb_wo_60.png" alt="Android App On Google Play">
+
+<div style="clear:left"> </div>
+
+<div class="col-8" style="margin-left:0">
+
+ <a href="{@docRoot}downloads/brand/en_app_rgb_wo.ai">English (English)</a><br/>
+
+<!--
+ <a href="{@docRoot}downloads/brand/af_app_rgb_wo.ai">Afrikaans (Afrikaans)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/ar_app_rgb_wo.ai">العربية (Arabic)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/be_app_rgb_wo.ai">Беларуская (Belarusian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/bg_app_rgb_wo.ai">български (Bulgarian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/ca_app_rgb_wo.ai">Català (Catalan)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/zh-cn_app_rgb_wo.ai">中文 (中国) (Chinese)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/zh-hk_app_rgb_wo.ai">中文(香港) (Chinese Hong Kong)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/zh-tw_app_rgb_wo.ai">中文 (台灣) (Chinese Taiwan)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/hr_app_rgb_wo.ai">Hrvatski (Croatian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/cs_app_rgb_wo.ai">Česky (Czech)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/da_app_rgb_wo.ai">Dansk (Danish)</a><br/>
+-->
+
+ <a href="{@docRoot}downloads/brand/nl_app_rgb_wo.ai">Nederlands (Dutch)</a><br/>
+
+<!--
+ <a href="{@docRoot}downloads/brand/et_app_rgb_wo.ai">Eesti keel (Estonian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/fa_app_rgb_wo.ai">فارسی (Farsi Persian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/fil_app_rgb_wo.ai">Tagalog (Filipino)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/fi_app_rgb_wo.ai">Suomi (Finnish)</a><br/>
+
+</div>
+
+<div class="col-4">
+-->
+
+ <a href="{@docRoot}downloads/brand/fr_app_rgb_wo.ai">Français (French)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/de_app_rgb_wo.ai">Deutsch (German)</a><br/>
+
+<!--
+ <a href="{@docRoot}downloads/brand/el_app_rgb_wo.ai">Ελληνικά (Greek)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/iw-he_app_rgb_wo.ai">עברית (Hebrew)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/hu_app_rgb_wo.ai">Magyar (Hungarian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/id-in_app_rgb_wo.ai">Bahasa Indonesia (Indonesian)</a><br/>
+-->
+
+ <a href="{@docRoot}downloads/brand/it_app_rgb_wo.ai">Italiano (Italian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/ja_app_rgb_wo.ai">日本語 (Japanese)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/ko_app_rgb_wo.ai">한국어 (Korean)</a><br/>
+
+<!--
+ <a href="{@docRoot}downloads/brand/lv_app_rgb_wo.ai">Latviski (Latvian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/lt_app_rgb_wo.ai">Lietuviškai (Lithuanian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/ms_app_rgb_wo.ai">Bahasa Melayu (Malay)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/no_app_rgb_wo.ai">Norsk (Norwegian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/pl_app_rgb_wo.ai">Polski (Polish)</a><br/>
+-->
+
+ <a href="{@docRoot}downloads/brand/pt-pt_app_rgb_wo.ai">Português (Portuguese)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/pt-br_app_rgb_wo.ai">Português Brasil (Portuguese Brazil)</a><br/>
+
+
+<!--
+</div>
+
+<div class="col-4" style="margin-right:0">
+ <a href="{@docRoot}downloads/brand/ro_app_rgb_wo.ai">Românã (Romanian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/ru_app_rgb_wo.ai">Pусский (Russian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/sr_app_rgb_wo.ai">Српски / srpski (Serbian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/sk_app_rgb_wo.ai">Slovenčina (Slovak)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/sl_app_rgb_wo.ai">Slovenščina (Slovenian)</a><br/>
+-->
+
+ <a href="{@docRoot}downloads/brand/es_app_rgb_wo.ai">Español (Spanish)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/es-419_app_rgb_wo.ai">Español Latinoamérica (Spanish Latin America)</a><br/>
+
+<!--
+ <a href="{@docRoot}downloads/brand/sv_app_rgb_wo.ai">Svenska (Swedish)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/sw_app_rgb_wo.ai">Kiswahili (Swahili)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/th_app_rgb_wo.ai">ภาษาไทย (Thai)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/tr_app_rgb_wo.ai">Türkçe (Turkish)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/uk_app_rgb_wo.ai">Українська (Ukrainian)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/vi_app_rgb_wo.ai">Tiếng Việt (Vietnamese)</a><br/>
+
+ <a href="{@docRoot}downloads/brand/zu_app_rgb_wo.ai">isiZulu (Zulu)</a><br/>
+-->
+
+</div>
+<div style="clear:left"> </div>
+
+
+
+
+
+
+<h2>Guidelines</h2>
+
+ <ul>
+ <li>Do not modify the color, proportions, spacing or any other aspect of the badge image.
+ </li>
+ <li>When used alongside logos for other application marketplaces, the Google Play logo
+ should be of equal or greater size.</li>
+ <li>When used online, the badge should link to either:
+ <ul>
+ <li>A list of products published by you, for example:<br />
+ <span style="margin-left:1em;">http://play.google.com/store/search?q=<em>publisherName</em></span>
+ </li>
+ <li>A specific app product details page within Google Play, for example:<br />
+ <span style="margin-left:1em;">http://play.google.com/store/apps/details?id=<em>packageName</em></span>
+ </li>
+ </ul>
+ </li>
+ </ul>
+
+<p>For more information, see the
+<a href="{@docRoot}distribute/googleplay/promote/brand.html#brand-google_play">Brand
+Guidelines</a>.
+
+
+<p>To quickly create a badge that links to your apps on Google Play,
+use the <a
+href="{@docRoot}distribute/googleplay/promote/badges.html">Googe Play badge generator</a>.</p>
+
+
+
\ No newline at end of file
diff --git a/docs/html/distribute/googleplay/promote/badges.jd b/docs/html/distribute/googleplay/promote/badges.jd
index 90e8c0d..0027f59 100644
--- a/docs/html/distribute/googleplay/promote/badges.jd
+++ b/docs/html/distribute/googleplay/promote/badges.jd
@@ -13,7 +13,7 @@
wraps your screenshots in real device artwork.</p>
<p>For guidelines when using the Google Play badge and other brand assets,
-see the <a href="{@docRoot}distribute/googleplay/promote/brand.html">Brand
+see the <a href="{@docRoot}distribute/googleplay/promote/brand.html#brand-google_play">Brand
Guidelines</a>.</p>
<style type="text/css">
@@ -56,9 +56,12 @@
<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 = "http://developer.android.com/images/brand/"
-var linkStart = "<a href=\"http://play.google.com/store/";
+var imagePath = "https://developer.android.com/images/brand/"
+var linkStart = "<a href=\"https://play.google.com/store/";
var imageStart = "\">\n"
+ " <img alt=\"";
// leaves opening for the alt text value
@@ -67,7 +70,7 @@
var imageEnd = ".png\" />\n</a>";
// variables for creating code snippet
-var linkStartCode = "<a href=\"http://play.google.com/store/";
+var linkStartCode = "<a href=\"https://play.google.com/store/";
var imageStartCode = "\">\n"
+ " <img alt=\"";
// leaves opening for the alt text value
@@ -77,8 +80,9 @@
/** Generate the HTML snippet and demo based on form values */
function buildButton(form) {
- var selectedValue = $('form input[type=radio]:checked').val();
- var altText = selectedValue.indexOf("get_it") != -1 ? "Get it on Google Play" : "Android app on Google Play";
+ 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();
@@ -144,6 +148,33 @@
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) */
@@ -163,7 +194,106 @@
</script>
<form class="button-form">
- <label class="block" for="package">Package name:</label>
+ <label class="block" for="locale">Language:</label>
+ <select id="locale" style="display:block;float:left;margin:0"
+ onchange="changeBadgeLang()">
+ <option title="Afrikaans"
+ value="af">Afrikaans</option>
+ <option title="Arabic"
+ value="ar">العربية</option>
+ <option title="Belarusian"
+ value="be">Беларуская</option>
+ <option title="Bulgarian"
+ value="bg">Български</option>
+ <option title="Catalan"
+ value="ca">Català</option>
+ <option title="Chinese (China)"
+ value="zh-cn">中文 (中国)</option>
+ <option title="Chinese (Hong Kong)"
+ value="zh-hk">中文(香港)</option>
+ <option title="Chinese (Taiwan)"
+ value="zh-tw">中文 (台灣)</option>
+ <option title="Croatian"
+ value="hr">Hrvatski</option>
+ <option title="Czech"
+ value="cs">Česky</option>
+ <option title="Danish"
+ value="da">Dansk</option>
+ <option title="Dutch"
+ value="nl">Nederlands</option>
+ <option title="Estonian"
+ value="et">Eesti</option>
+ <option title="Farsi - Persian"
+ value="fa">فارسی</option>
+ <option title="Filipino"
+ value="fil">Tagalog</option>
+ <option title="Finnish"
+ value="fi">Suomi</option>
+ <option title="French"
+ value="fr">Français</option>
+ <option title="German"
+ value="de">Deutsch</option>
+ <option title="Greek"
+ value="el">Ελληνικά</option>
+ <option title="English"
+ value="en" selected="true">English</option>
+ <option title="Hebrew"
+ value="iw-he">עברית</option>
+ <option title="Hungarian"
+ value="hu">Magyar</option>
+ <option title="Indonesian"
+ value="id-in">Bahasa Indonesia</option>
+ <option title="Italian"
+ value="it">Italiano</option>
+ <option title="Japanese"
+ value="ja">日本語</option>
+ <option title="Korean"
+ value="ko">한국어</option>
+ <option title="Latvian"
+ value="lv">Latviešu</option>
+ <option title="Lithuanian"
+ value="lt">Lietuviškai</option>
+ <option title="Malay"
+ value="ms">Bahasa Melayu</option>
+ <option title="Norwegian"
+ value="no">Norsk (bokmål)</option>
+ <option title="Polish"
+ value="pl">Polski</option>
+ <option title="Portuguese (Brazil)"
+ value="pt-br">Português (Brasil)</option>
+ <option title="Portuguese (Portugal)"
+ value="pt-pt">Português (Portugal)</option>
+ <option title="Romanian"
+ value="ro">Română</option>
+ <option title="Russian"
+ value="ru">Русский</option>
+ <option title="Serbian"
+ value="sr">Српски / srpski</option>
+ <option title="Slovak"
+ value="sk">Slovenčina</option>
+ <option title="Slovenian"
+ value="sl">Slovenščina</option>
+ <option title="Spanish (Spain)"
+ value="es">Español (España)</option>
+ <option title="Spanish (Latin America)"
+ value="es-419">Español (Latinoamérica)</option>
+ <option title="Swedish"
+ value="sv">Svenska</option>
+ <option title="Swahili"
+ value="sw">Kiswahili</option>
+ <option title="Thai"
+ value="th">ไทย</option>
+ <option title="Turkish"
+ value="tr">Türkçe</option>
+ <option title="Ukrainian"
+ value="uk">Українська</option>
+ <option title="Vietnamese"
+ value="vi">Tiếng Việt</option>
+ <option title="Zulu"
+ value="zu">isiZulu</option>
+ </select>
+ <p style="clear:both;margin:0"> </p>
+ <label class="block" for="package" style="clear:left">Package name:</label>
<input class="text" type="text" id="package" name="package"
value="com.example.android"
default="com.example.android"
@@ -185,27 +315,27 @@
<br/><br/>
-<div class="button-row">
- <input type="radio" name="buttonStyle" value="en_app_rgb_wo_45" id="ws" checked="checked" />
+<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 app on Google Play (small)" /></label>
- <input type="radio" name="buttonStyle" value="en_app_rgb_wo_60" id="wm" />
+ <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 app on Google Play (large)" /></label>
</div>
<div class="button-row">
- <input type="radio" name="buttonStyle" value="en_generic_rgb_wo_45" id="ns" />
+ <input type="radio" name="buttonStyle" value="_generic_rgb_wo_45" id="ns" checked="checked" />
<label for="ns"><img src="{@docRoot}images/brand/en_generic_rgb_wo_45.png"
alt="Get it on Google Play (small)" /></label>
- <input type="radio" name="buttonStyle" value="en_generic_rgb_wo_60" id="nm" />
+ <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="Get it on Google Play (large)" /></label>
</div>
- <input onclick="return buildButton(this.parentNode);"
+ <input class="button" onclick="return buildButton(this.parentNode);"
type="button" value="Build my badge" style="padding:10px" />
<br/>
</form>
diff --git a/docs/html/distribute/googleplay/promote/brand.jd b/docs/html/distribute/googleplay/promote/brand.jd
index 63b1f03..cea6d2c 100644
--- a/docs/html/distribute/googleplay/promote/brand.jd
+++ b/docs/html/distribute/googleplay/promote/brand.jd
@@ -118,8 +118,8 @@
<p>You may use the Google Play Store icon, but you may not modify it.</p>
<p>As mentioned above, when referring to the Google Play Store app in copy, use the full name:
-"Google Play Store." However, when labelling the Google Play Store icon directly, it's OK to use
-"Play Store" without "Google" (which is how the icon is labelled on a device).</p>
+"Google Play Store." However, when labeling the Google Play Store icon directly, it's OK to use
+"Play Store" alone to accurately reflect the icon label as it appears on a device.</p>
<h4>Google Play badge</h4>
@@ -128,16 +128,14 @@
<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><br>
- <a href="{@docRoot}downloads/brand/en_app_rgb_wo.ai">Illustrator (.ai)</a></p>
+ <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><br>
- <a href="{@docRoot}downloads/brand/en_generic_rgb_wo.ai">Illustrator (.ai)</a></p>
+ <a href="{@docRoot}images/brand/en_generic_rgb_wo_60.png">172x60</a></p>
</div>
<p>The "Get it on Google Play" and "Android App on Google Play" logos are badges that you
@@ -160,14 +158,19 @@
</ul>
</li>
</ul>
-
- <p>For your convenience, you can use the
- <a href="{@docRoot}distribute/googleplay/promote/badges.html">Googe Play badge generator</a>
- to create badges that link to your apps on Google Play.</p>
+
+ <p>To quickly create a badge that links to your apps on Google Play,
+ use the <a
+ href="{@docRoot}distribute/googleplay/promote/badges.html">Googe Play badge generator</a>
+ (provides the badge in over 40 languages).</p>
+
+ <p>To create your own size, download an Adobe® Illustrator® (.ai) file for the
+ <a href="{@docRoot}distribute/googleplay/promote/badge-files.html">Google Play
+ badge in over 40 languages</a>.</p>
<p>For details on all the ways that you can link to your product details page in Google Play,
see <a href="{@docRoot}distribute/googleplay/promote/linking.html">Linking to your products</a></p>
-<p>If you are not sure you meet these criteria, <a href=
+<p>If you are not sure you meet these brand guidelines, <a href=
"http://services.google.com/permissions/application">please contact us</a>. </p>
diff --git a/docs/html/google/play/billing/billing_integrate.jd b/docs/html/google/play/billing/billing_integrate.jd
index 405c58a..3f6df927 100644
--- a/docs/html/google/play/billing/billing_integrate.jd
+++ b/docs/html/google/play/billing/billing_integrate.jd
@@ -111,20 +111,21 @@
<pre>
@Override
public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- bindService(new
- Intent("com.android.vending.billing.InAppBillingService.BIND"),
- mServiceConn, Context.BIND_AUTO_CREATE);
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ bindService(new
+ Intent("com.android.vending.billing.InAppBillingService.BIND"),
+ mServiceConn, Context.BIND_AUTO_CREATE);
</pre>
<p>You can now use the mService reference to communicate with the Google Play service.</p>
<p class="note"><strong>Important:</strong> Remember to unbind from the In-app Billing service when you are done with your {@link android.app.Activity}. If you don’t unbind, the open service connection could cause your device’s performance to degrade. This example shows how to perform the unbind operation on a service connection to In-app Billing called {@code mServiceConn} by overriding the activity’s {@link android.app.Activity#onDestroy onDestroy} method.</p>
<pre>
@Override
public void onDestroy() {
- if (mServiceConn != null) {
- unbindService(mServiceConn);
- }
+ super.onDestroy();
+ if (mServiceConn != null) {
+ unbindService(mServiceConn);
+ }
}
</pre>
diff --git a/docs/html/guide/topics/connectivity/wifip2p.jd b/docs/html/guide/topics/connectivity/wifip2p.jd
index 82c9abd..bbf30fd 100644
--- a/docs/html/guide/topics/connectivity/wifip2p.jd
+++ b/docs/html/guide/topics/connectivity/wifip2p.jd
@@ -237,16 +237,16 @@
*/
public class WiFiDirectBroadcastReceiver extends BroadcastReceiver {
- private WifiP2pManager manager;
- private Channel channel;
- private MyWiFiActivity activity;
+ private WifiP2pManager mManager;
+ private Channel mChannel;
+ private MyWiFiActivity mActivity;
public WiFiDirectBroadcastReceiver(WifiP2pManager manager, Channel channel,
MyWifiActivity activity) {
super();
- this.manager = manager;
- this.channel = channel;
- this.activity = activity;
+ this.mManager = manager;
+ this.mChannel = channel;
+ this.mActivity = activity;
}
@Override
@@ -333,7 +333,7 @@
...
mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
mChannel = mManager.initialize(this, getMainLooper(), null);
- mReceiver = new WiFiDirectBroadcastReceiver(manager, channel, this);
+ mReceiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this);
...
}
</pre>
@@ -397,7 +397,7 @@
that the discovery process succeeded and does not provide any information about the actual peers
that it discovered, if any:</p>
<pre>
-manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
+mManager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
...
@@ -425,8 +425,8 @@
// request available peers from the wifi p2p manager. This is an
// asynchronous call and the calling activity is notified with a
// callback on PeerListListener.onPeersAvailable()
- if (manager != null) {
- manager.requestPeers(channel, myPeerListListener);
+ if (mManager != null) {
+ mManager.requestPeers(mChannel, myPeerListListener);
}
}
</pre>
@@ -453,7 +453,7 @@
WifiP2pDevice device;
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
-manager.connect(channel, config, new ActionListener() {
+mManager.connect(mChannel, config, new ActionListener() {
@Override
public void onSuccess() {
diff --git a/docs/html/guide/topics/manifest/manifest-intro.jd b/docs/html/guide/topics/manifest/manifest-intro.jd
index a130f7d..d25a513 100644
--- a/docs/html/guide/topics/manifest/manifest-intro.jd
+++ b/docs/html/guide/topics/manifest/manifest-intro.jd
@@ -115,6 +115,7 @@
<a href="{@docRoot}guide/topics/manifest/provider-element.html"><provider></a>
<a href="{@docRoot}guide/topics/manifest/grant-uri-permission-element.html"><grant-uri-permission /></a>
<a href="{@docRoot}guide/topics/manifest/meta-data-element.html"><meta-data /></a>
+ <a href="{@docRoot}guide/topics/manifest/path-permission-element.html"><path-permission /></a>
<a href="{@docRoot}guide/topics/manifest/provider-element.html"></provider></a>
<a href="{@docRoot}guide/topics/manifest/uses-library-element.html"><uses-library /></a>
diff --git a/docs/html/guide/topics/ui/layout/gridview.jd b/docs/html/guide/topics/ui/layout/gridview.jd
index 67bdd0f0..84c3dab 100644
--- a/docs/html/guide/topics/ui/layout/gridview.jd
+++ b/docs/html/guide/topics/ui/layout/gridview.jd
@@ -170,7 +170,7 @@
be cropped toward the center (if necessary).</li>
<li>{@link android.widget.ImageView#setPadding(int,int,int,int)} defines the padding for all
sides. (Note that, if the images have different aspect-ratios, then less
-padding will cause for more cropping of the image if it does not match
+padding will cause more cropping of the image if it does not match
the dimensions given to the ImageView.)</li>
</ul>
diff --git a/docs/html/images/brand/af_generic_rgb_wo_45.png b/docs/html/images/brand/af_generic_rgb_wo_45.png
new file mode 100644
index 0000000..bf774ab
--- /dev/null
+++ b/docs/html/images/brand/af_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/af_generic_rgb_wo_60.png b/docs/html/images/brand/af_generic_rgb_wo_60.png
new file mode 100644
index 0000000..0487c7f
--- /dev/null
+++ b/docs/html/images/brand/af_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/ar_generic_rgb_wo_45.png b/docs/html/images/brand/ar_generic_rgb_wo_45.png
new file mode 100644
index 0000000..bdb0ff6
--- /dev/null
+++ b/docs/html/images/brand/ar_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/ar_generic_rgb_wo_60.png b/docs/html/images/brand/ar_generic_rgb_wo_60.png
new file mode 100644
index 0000000..ba9fc69
--- /dev/null
+++ b/docs/html/images/brand/ar_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/be_generic_rgb_wo_45.png b/docs/html/images/brand/be_generic_rgb_wo_45.png
new file mode 100644
index 0000000..bec6c7a
--- /dev/null
+++ b/docs/html/images/brand/be_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/be_generic_rgb_wo_60.png b/docs/html/images/brand/be_generic_rgb_wo_60.png
new file mode 100644
index 0000000..53ad2a11
--- /dev/null
+++ b/docs/html/images/brand/be_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/bg_generic_rgb_wo_45.png b/docs/html/images/brand/bg_generic_rgb_wo_45.png
new file mode 100644
index 0000000..9a27471
--- /dev/null
+++ b/docs/html/images/brand/bg_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/bg_generic_rgb_wo_60.png b/docs/html/images/brand/bg_generic_rgb_wo_60.png
new file mode 100644
index 0000000..5143a66
--- /dev/null
+++ b/docs/html/images/brand/bg_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/ca_generic_rgb_wo_45.png b/docs/html/images/brand/ca_generic_rgb_wo_45.png
new file mode 100644
index 0000000..698a4cd
--- /dev/null
+++ b/docs/html/images/brand/ca_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/ca_generic_rgb_wo_60.png b/docs/html/images/brand/ca_generic_rgb_wo_60.png
new file mode 100644
index 0000000..e943de1
--- /dev/null
+++ b/docs/html/images/brand/ca_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/cs_generic_rgb_wo_45.png b/docs/html/images/brand/cs_generic_rgb_wo_45.png
new file mode 100644
index 0000000..b97b805
--- /dev/null
+++ b/docs/html/images/brand/cs_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/cs_generic_rgb_wo_60.png b/docs/html/images/brand/cs_generic_rgb_wo_60.png
new file mode 100644
index 0000000..9656c2e
--- /dev/null
+++ b/docs/html/images/brand/cs_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/da_generic_rgb_wo_45.png b/docs/html/images/brand/da_generic_rgb_wo_45.png
new file mode 100644
index 0000000..541ba29
--- /dev/null
+++ b/docs/html/images/brand/da_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/da_generic_rgb_wo_60.png b/docs/html/images/brand/da_generic_rgb_wo_60.png
new file mode 100644
index 0000000..d974154
--- /dev/null
+++ b/docs/html/images/brand/da_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/de_app_rgb_wo_45.png b/docs/html/images/brand/de_app_rgb_wo_45.png
new file mode 100644
index 0000000..db48df2
--- /dev/null
+++ b/docs/html/images/brand/de_app_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/de_app_rgb_wo_60.png b/docs/html/images/brand/de_app_rgb_wo_60.png
new file mode 100644
index 0000000..9e0f757
--- /dev/null
+++ b/docs/html/images/brand/de_app_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/de_generic_rgb_wo_45.png b/docs/html/images/brand/de_generic_rgb_wo_45.png
new file mode 100644
index 0000000..1396f79
--- /dev/null
+++ b/docs/html/images/brand/de_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/de_generic_rgb_wo_60.png b/docs/html/images/brand/de_generic_rgb_wo_60.png
new file mode 100644
index 0000000..f2df4a4
--- /dev/null
+++ b/docs/html/images/brand/de_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/el_generic_rgb_wo_45.png b/docs/html/images/brand/el_generic_rgb_wo_45.png
new file mode 100644
index 0000000..adaea5f
--- /dev/null
+++ b/docs/html/images/brand/el_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/el_generic_rgb_wo_60.png b/docs/html/images/brand/el_generic_rgb_wo_60.png
new file mode 100644
index 0000000..37ae3bc
--- /dev/null
+++ b/docs/html/images/brand/el_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/es-419_app_rgb_wo_45.png b/docs/html/images/brand/es-419_app_rgb_wo_45.png
new file mode 100644
index 0000000..3fb9a3f
--- /dev/null
+++ b/docs/html/images/brand/es-419_app_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/es-419_app_rgb_wo_60.png b/docs/html/images/brand/es-419_app_rgb_wo_60.png
new file mode 100644
index 0000000..1dfb820
--- /dev/null
+++ b/docs/html/images/brand/es-419_app_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/es-419_generic_rgb_wo_45.png b/docs/html/images/brand/es-419_generic_rgb_wo_45.png
new file mode 100644
index 0000000..b89274d
--- /dev/null
+++ b/docs/html/images/brand/es-419_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/es-419_generic_rgb_wo_60.png b/docs/html/images/brand/es-419_generic_rgb_wo_60.png
new file mode 100644
index 0000000..23d7705
--- /dev/null
+++ b/docs/html/images/brand/es-419_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/es_app_rgb_wo_45.png b/docs/html/images/brand/es_app_rgb_wo_45.png
new file mode 100644
index 0000000..ad5e61a
--- /dev/null
+++ b/docs/html/images/brand/es_app_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/es_app_rgb_wo_60.png b/docs/html/images/brand/es_app_rgb_wo_60.png
new file mode 100644
index 0000000..6796ad3
--- /dev/null
+++ b/docs/html/images/brand/es_app_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/es_generic_rgb_wo_45.png b/docs/html/images/brand/es_generic_rgb_wo_45.png
new file mode 100644
index 0000000..b89274d
--- /dev/null
+++ b/docs/html/images/brand/es_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/es_generic_rgb_wo_60.png b/docs/html/images/brand/es_generic_rgb_wo_60.png
new file mode 100644
index 0000000..23d7705
--- /dev/null
+++ b/docs/html/images/brand/es_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/et_generic_rgb_wo_45.png b/docs/html/images/brand/et_generic_rgb_wo_45.png
new file mode 100644
index 0000000..0e267381
--- /dev/null
+++ b/docs/html/images/brand/et_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/et_generic_rgb_wo_60.png b/docs/html/images/brand/et_generic_rgb_wo_60.png
new file mode 100644
index 0000000..a99dee1
--- /dev/null
+++ b/docs/html/images/brand/et_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/fa_generic_rgb_wo_45.png b/docs/html/images/brand/fa_generic_rgb_wo_45.png
new file mode 100644
index 0000000..25827f6
--- /dev/null
+++ b/docs/html/images/brand/fa_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/fa_generic_rgb_wo_60.png b/docs/html/images/brand/fa_generic_rgb_wo_60.png
new file mode 100644
index 0000000..5118909
--- /dev/null
+++ b/docs/html/images/brand/fa_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/fi_generic_rgb_wo_45.png b/docs/html/images/brand/fi_generic_rgb_wo_45.png
new file mode 100644
index 0000000..93dc4fc
--- /dev/null
+++ b/docs/html/images/brand/fi_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/fi_generic_rgb_wo_60.png b/docs/html/images/brand/fi_generic_rgb_wo_60.png
new file mode 100644
index 0000000..95eff07
--- /dev/null
+++ b/docs/html/images/brand/fi_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/fil_generic_rgb_wo_45.png b/docs/html/images/brand/fil_generic_rgb_wo_45.png
new file mode 100644
index 0000000..7e74e62
--- /dev/null
+++ b/docs/html/images/brand/fil_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/fil_generic_rgb_wo_60.png b/docs/html/images/brand/fil_generic_rgb_wo_60.png
new file mode 100644
index 0000000..8f02743
--- /dev/null
+++ b/docs/html/images/brand/fil_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/fr_app_rgb_wo_45.png b/docs/html/images/brand/fr_app_rgb_wo_45.png
new file mode 100644
index 0000000..14219e3
--- /dev/null
+++ b/docs/html/images/brand/fr_app_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/fr_app_rgb_wo_60.png b/docs/html/images/brand/fr_app_rgb_wo_60.png
new file mode 100644
index 0000000..af58843
--- /dev/null
+++ b/docs/html/images/brand/fr_app_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/fr_generic_rgb_wo_45.png b/docs/html/images/brand/fr_generic_rgb_wo_45.png
new file mode 100644
index 0000000..3e1768f
--- /dev/null
+++ b/docs/html/images/brand/fr_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/fr_generic_rgb_wo_60.png b/docs/html/images/brand/fr_generic_rgb_wo_60.png
new file mode 100644
index 0000000..5c307f5
--- /dev/null
+++ b/docs/html/images/brand/fr_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/hr_generic_rgb_wo_45.png b/docs/html/images/brand/hr_generic_rgb_wo_45.png
new file mode 100644
index 0000000..b8acaac
--- /dev/null
+++ b/docs/html/images/brand/hr_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/hr_generic_rgb_wo_60.png b/docs/html/images/brand/hr_generic_rgb_wo_60.png
new file mode 100644
index 0000000..4fe6c7b
--- /dev/null
+++ b/docs/html/images/brand/hr_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/hu_generic_rgb_wo_45.png b/docs/html/images/brand/hu_generic_rgb_wo_45.png
new file mode 100644
index 0000000..3b2184d
--- /dev/null
+++ b/docs/html/images/brand/hu_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/hu_generic_rgb_wo_60.png b/docs/html/images/brand/hu_generic_rgb_wo_60.png
new file mode 100644
index 0000000..d6572be
--- /dev/null
+++ b/docs/html/images/brand/hu_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/id-in_generic_rgb_wo_45.png b/docs/html/images/brand/id-in_generic_rgb_wo_45.png
new file mode 100644
index 0000000..17ce069
--- /dev/null
+++ b/docs/html/images/brand/id-in_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/id-in_generic_rgb_wo_60.png b/docs/html/images/brand/id-in_generic_rgb_wo_60.png
new file mode 100644
index 0000000..ad067ce
--- /dev/null
+++ b/docs/html/images/brand/id-in_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/it_app_rgb_wo_45.png b/docs/html/images/brand/it_app_rgb_wo_45.png
new file mode 100644
index 0000000..16a137e
--- /dev/null
+++ b/docs/html/images/brand/it_app_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/it_app_rgb_wo_60.png b/docs/html/images/brand/it_app_rgb_wo_60.png
new file mode 100644
index 0000000..27123dc
--- /dev/null
+++ b/docs/html/images/brand/it_app_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/it_generic_rgb_wo_45.png b/docs/html/images/brand/it_generic_rgb_wo_45.png
new file mode 100644
index 0000000..ee5f85e
--- /dev/null
+++ b/docs/html/images/brand/it_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/it_generic_rgb_wo_60.png b/docs/html/images/brand/it_generic_rgb_wo_60.png
new file mode 100644
index 0000000..03ea5ba
--- /dev/null
+++ b/docs/html/images/brand/it_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/iw-he_generic_rgb_wo_45.png b/docs/html/images/brand/iw-he_generic_rgb_wo_45.png
new file mode 100644
index 0000000..1d03c77
--- /dev/null
+++ b/docs/html/images/brand/iw-he_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/iw-he_generic_rgb_wo_60.png b/docs/html/images/brand/iw-he_generic_rgb_wo_60.png
new file mode 100644
index 0000000..decfdae
--- /dev/null
+++ b/docs/html/images/brand/iw-he_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/ja_app_rgb_wo_45.png b/docs/html/images/brand/ja_app_rgb_wo_45.png
new file mode 100644
index 0000000..6af7582
--- /dev/null
+++ b/docs/html/images/brand/ja_app_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/ja_app_rgb_wo_60.png b/docs/html/images/brand/ja_app_rgb_wo_60.png
new file mode 100644
index 0000000..e197e12
--- /dev/null
+++ b/docs/html/images/brand/ja_app_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/ja_generic_rgb_wo_45.png b/docs/html/images/brand/ja_generic_rgb_wo_45.png
new file mode 100644
index 0000000..5f5281a
--- /dev/null
+++ b/docs/html/images/brand/ja_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/ja_generic_rgb_wo_60.png b/docs/html/images/brand/ja_generic_rgb_wo_60.png
new file mode 100644
index 0000000..fcb4c9c
--- /dev/null
+++ b/docs/html/images/brand/ja_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/ko_app_rgb_wo_45.png b/docs/html/images/brand/ko_app_rgb_wo_45.png
new file mode 100644
index 0000000..f0b427e
--- /dev/null
+++ b/docs/html/images/brand/ko_app_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/ko_app_rgb_wo_60.png b/docs/html/images/brand/ko_app_rgb_wo_60.png
new file mode 100644
index 0000000..6ccb673
--- /dev/null
+++ b/docs/html/images/brand/ko_app_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/ko_generic_rgb_wo_45.png b/docs/html/images/brand/ko_generic_rgb_wo_45.png
new file mode 100644
index 0000000..61ae04a
--- /dev/null
+++ b/docs/html/images/brand/ko_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/ko_generic_rgb_wo_60.png b/docs/html/images/brand/ko_generic_rgb_wo_60.png
new file mode 100644
index 0000000..9c14e36
--- /dev/null
+++ b/docs/html/images/brand/ko_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/lt_generic_rgb_wo_45.png b/docs/html/images/brand/lt_generic_rgb_wo_45.png
new file mode 100644
index 0000000..96564d5
--- /dev/null
+++ b/docs/html/images/brand/lt_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/lt_generic_rgb_wo_60.png b/docs/html/images/brand/lt_generic_rgb_wo_60.png
new file mode 100644
index 0000000..2c6c1bf
--- /dev/null
+++ b/docs/html/images/brand/lt_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/lv_generic_rgb_wo_45.png b/docs/html/images/brand/lv_generic_rgb_wo_45.png
new file mode 100644
index 0000000..8182ca5
--- /dev/null
+++ b/docs/html/images/brand/lv_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/lv_generic_rgb_wo_60.png b/docs/html/images/brand/lv_generic_rgb_wo_60.png
new file mode 100644
index 0000000..5c0b3d2
--- /dev/null
+++ b/docs/html/images/brand/lv_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/ms_generic_rgb_wo_45.png b/docs/html/images/brand/ms_generic_rgb_wo_45.png
new file mode 100644
index 0000000..d6ccc6b
--- /dev/null
+++ b/docs/html/images/brand/ms_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/ms_generic_rgb_wo_60.png b/docs/html/images/brand/ms_generic_rgb_wo_60.png
new file mode 100644
index 0000000..6e1c34d
--- /dev/null
+++ b/docs/html/images/brand/ms_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/nl_app_rgb_wo_45.png b/docs/html/images/brand/nl_app_rgb_wo_45.png
new file mode 100644
index 0000000..f06ed04
--- /dev/null
+++ b/docs/html/images/brand/nl_app_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/nl_app_rgb_wo_60.png b/docs/html/images/brand/nl_app_rgb_wo_60.png
new file mode 100644
index 0000000..f2c797d
--- /dev/null
+++ b/docs/html/images/brand/nl_app_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/nl_generic_rgb_wo_45.png b/docs/html/images/brand/nl_generic_rgb_wo_45.png
new file mode 100644
index 0000000..6b5826d
--- /dev/null
+++ b/docs/html/images/brand/nl_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/nl_generic_rgb_wo_60.png b/docs/html/images/brand/nl_generic_rgb_wo_60.png
new file mode 100644
index 0000000..cb11afda
--- /dev/null
+++ b/docs/html/images/brand/nl_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/no_generic_rgb_wo_45.png b/docs/html/images/brand/no_generic_rgb_wo_45.png
new file mode 100644
index 0000000..fb390d8
--- /dev/null
+++ b/docs/html/images/brand/no_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/no_generic_rgb_wo_60.png b/docs/html/images/brand/no_generic_rgb_wo_60.png
new file mode 100644
index 0000000..e83dce7
--- /dev/null
+++ b/docs/html/images/brand/no_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/pl_generic_rgb_wo_45.png b/docs/html/images/brand/pl_generic_rgb_wo_45.png
new file mode 100644
index 0000000..78caded
--- /dev/null
+++ b/docs/html/images/brand/pl_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/pl_generic_rgb_wo_60.png b/docs/html/images/brand/pl_generic_rgb_wo_60.png
new file mode 100644
index 0000000..2d956fb
--- /dev/null
+++ b/docs/html/images/brand/pl_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/pt-br_app_rgb_wo_45.png b/docs/html/images/brand/pt-br_app_rgb_wo_45.png
new file mode 100644
index 0000000..065998b
--- /dev/null
+++ b/docs/html/images/brand/pt-br_app_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/pt-br_app_rgb_wo_60.png b/docs/html/images/brand/pt-br_app_rgb_wo_60.png
new file mode 100644
index 0000000..1ce0a6c
--- /dev/null
+++ b/docs/html/images/brand/pt-br_app_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/pt-br_generic_rgb_wo_45.png b/docs/html/images/brand/pt-br_generic_rgb_wo_45.png
new file mode 100644
index 0000000..a661d44
--- /dev/null
+++ b/docs/html/images/brand/pt-br_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/pt-br_generic_rgb_wo_60.png b/docs/html/images/brand/pt-br_generic_rgb_wo_60.png
new file mode 100644
index 0000000..402af71
--- /dev/null
+++ b/docs/html/images/brand/pt-br_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/pt-pt_app_rgb_wo_45.png b/docs/html/images/brand/pt-pt_app_rgb_wo_45.png
new file mode 100644
index 0000000..0b50959
--- /dev/null
+++ b/docs/html/images/brand/pt-pt_app_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/pt-pt_app_rgb_wo_60.png b/docs/html/images/brand/pt-pt_app_rgb_wo_60.png
new file mode 100644
index 0000000..65dd887
--- /dev/null
+++ b/docs/html/images/brand/pt-pt_app_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/pt-pt_generic_rgb_wo_45.png b/docs/html/images/brand/pt-pt_generic_rgb_wo_45.png
new file mode 100644
index 0000000..a616cf1
--- /dev/null
+++ b/docs/html/images/brand/pt-pt_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/pt-pt_generic_rgb_wo_60.png b/docs/html/images/brand/pt-pt_generic_rgb_wo_60.png
new file mode 100644
index 0000000..36a7b83
--- /dev/null
+++ b/docs/html/images/brand/pt-pt_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/ro_generic_rgb_wo_45.png b/docs/html/images/brand/ro_generic_rgb_wo_45.png
new file mode 100644
index 0000000..c18a548
--- /dev/null
+++ b/docs/html/images/brand/ro_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/ro_generic_rgb_wo_60.png b/docs/html/images/brand/ro_generic_rgb_wo_60.png
new file mode 100644
index 0000000..b8f3433
--- /dev/null
+++ b/docs/html/images/brand/ro_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/ru_generic_rgb_wo_45.png b/docs/html/images/brand/ru_generic_rgb_wo_45.png
new file mode 100644
index 0000000..c049ddb
--- /dev/null
+++ b/docs/html/images/brand/ru_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/ru_generic_rgb_wo_60.png b/docs/html/images/brand/ru_generic_rgb_wo_60.png
new file mode 100644
index 0000000..e00c276
--- /dev/null
+++ b/docs/html/images/brand/ru_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/sk_generic_rgb_wo_45.png b/docs/html/images/brand/sk_generic_rgb_wo_45.png
new file mode 100644
index 0000000..27ce06a
--- /dev/null
+++ b/docs/html/images/brand/sk_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/sk_generic_rgb_wo_60.png b/docs/html/images/brand/sk_generic_rgb_wo_60.png
new file mode 100644
index 0000000..8591f2c
--- /dev/null
+++ b/docs/html/images/brand/sk_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/sl_generic_rgb_wo_45.png b/docs/html/images/brand/sl_generic_rgb_wo_45.png
new file mode 100644
index 0000000..115a99d
--- /dev/null
+++ b/docs/html/images/brand/sl_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/sl_generic_rgb_wo_60.png b/docs/html/images/brand/sl_generic_rgb_wo_60.png
new file mode 100644
index 0000000..37c2e52
--- /dev/null
+++ b/docs/html/images/brand/sl_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/sr_generic_rgb_wo_45.png b/docs/html/images/brand/sr_generic_rgb_wo_45.png
new file mode 100644
index 0000000..86dba47
--- /dev/null
+++ b/docs/html/images/brand/sr_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/sr_generic_rgb_wo_60.png b/docs/html/images/brand/sr_generic_rgb_wo_60.png
new file mode 100644
index 0000000..67806da
--- /dev/null
+++ b/docs/html/images/brand/sr_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/sv_generic_rgb_wo_45.png b/docs/html/images/brand/sv_generic_rgb_wo_45.png
new file mode 100644
index 0000000..fb390d8
--- /dev/null
+++ b/docs/html/images/brand/sv_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/sv_generic_rgb_wo_60.png b/docs/html/images/brand/sv_generic_rgb_wo_60.png
new file mode 100644
index 0000000..e83dce7
--- /dev/null
+++ b/docs/html/images/brand/sv_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/sw_generic_rgb_wo_45.png b/docs/html/images/brand/sw_generic_rgb_wo_45.png
new file mode 100644
index 0000000..c7deecc
--- /dev/null
+++ b/docs/html/images/brand/sw_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/sw_generic_rgb_wo_60.png b/docs/html/images/brand/sw_generic_rgb_wo_60.png
new file mode 100644
index 0000000..9c0d057
--- /dev/null
+++ b/docs/html/images/brand/sw_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/th_generic_rgb_wo_45.png b/docs/html/images/brand/th_generic_rgb_wo_45.png
new file mode 100644
index 0000000..803b6c5
--- /dev/null
+++ b/docs/html/images/brand/th_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/th_generic_rgb_wo_60.png b/docs/html/images/brand/th_generic_rgb_wo_60.png
new file mode 100644
index 0000000..6e36e02
--- /dev/null
+++ b/docs/html/images/brand/th_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/tr_generic_rgb_wo_45.png b/docs/html/images/brand/tr_generic_rgb_wo_45.png
new file mode 100644
index 0000000..baa8394
--- /dev/null
+++ b/docs/html/images/brand/tr_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/tr_generic_rgb_wo_60.png b/docs/html/images/brand/tr_generic_rgb_wo_60.png
new file mode 100644
index 0000000..63fa31f
--- /dev/null
+++ b/docs/html/images/brand/tr_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/uk_generic_rgb_wo_45.png b/docs/html/images/brand/uk_generic_rgb_wo_45.png
new file mode 100644
index 0000000..68c111f
--- /dev/null
+++ b/docs/html/images/brand/uk_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/uk_generic_rgb_wo_60.png b/docs/html/images/brand/uk_generic_rgb_wo_60.png
new file mode 100644
index 0000000..918d70a
--- /dev/null
+++ b/docs/html/images/brand/uk_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/vi_generic_rgb_wo_45.png b/docs/html/images/brand/vi_generic_rgb_wo_45.png
new file mode 100644
index 0000000..e39d00a
--- /dev/null
+++ b/docs/html/images/brand/vi_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/vi_generic_rgb_wo_60.png b/docs/html/images/brand/vi_generic_rgb_wo_60.png
new file mode 100644
index 0000000..ba1e9a0
--- /dev/null
+++ b/docs/html/images/brand/vi_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/zh-cn_generic_rgb_wo_45.png b/docs/html/images/brand/zh-cn_generic_rgb_wo_45.png
new file mode 100644
index 0000000..c7748de
--- /dev/null
+++ b/docs/html/images/brand/zh-cn_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/zh-cn_generic_rgb_wo_60.png b/docs/html/images/brand/zh-cn_generic_rgb_wo_60.png
new file mode 100644
index 0000000..0a0f91a
--- /dev/null
+++ b/docs/html/images/brand/zh-cn_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/zh-hk_generic_rgb_wo_45.png b/docs/html/images/brand/zh-hk_generic_rgb_wo_45.png
new file mode 100644
index 0000000..c3d064c
--- /dev/null
+++ b/docs/html/images/brand/zh-hk_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/zh-hk_generic_rgb_wo_60.png b/docs/html/images/brand/zh-hk_generic_rgb_wo_60.png
new file mode 100644
index 0000000..2b072de
--- /dev/null
+++ b/docs/html/images/brand/zh-hk_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/zh-tw_generic_rgb_wo_45.png b/docs/html/images/brand/zh-tw_generic_rgb_wo_45.png
new file mode 100644
index 0000000..7bb2b09
--- /dev/null
+++ b/docs/html/images/brand/zh-tw_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/zh-tw_generic_rgb_wo_60.png b/docs/html/images/brand/zh-tw_generic_rgb_wo_60.png
new file mode 100644
index 0000000..0797c84b
--- /dev/null
+++ b/docs/html/images/brand/zh-tw_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/images/brand/zu_generic_rgb_wo_45.png b/docs/html/images/brand/zu_generic_rgb_wo_45.png
new file mode 100644
index 0000000..1e9f7c7
--- /dev/null
+++ b/docs/html/images/brand/zu_generic_rgb_wo_45.png
Binary files differ
diff --git a/docs/html/images/brand/zu_generic_rgb_wo_60.png b/docs/html/images/brand/zu_generic_rgb_wo_60.png
new file mode 100644
index 0000000..09f521b
--- /dev/null
+++ b/docs/html/images/brand/zu_generic_rgb_wo_60.png
Binary files differ
diff --git a/docs/html/training/basics/activity-lifecycle/recreating.jd b/docs/html/training/basics/activity-lifecycle/recreating.jd
index 1a65e71..71fd5dd 100644
--- a/docs/html/training/basics/activity-lifecycle/recreating.jd
+++ b/docs/html/training/basics/activity-lifecycle/recreating.jd
@@ -126,7 +126,7 @@
state from the {@link android.os.Bundle} that the system
passes your activity. Both the {@link android.app.Activity#onCreate onCreate()} and {@link
android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} callback methods receive
-the same {@link android.os.Bundle} that containes the instance state information.</p>
+the same {@link android.os.Bundle} that contains the instance state information.</p>
<p>Because the {@link android.app.Activity#onCreate onCreate()} method is called whether the
system is creating a new instance of your activity or recreating a previous one, you must check
diff --git a/docs/html/training/basics/activity-lifecycle/starting.jd b/docs/html/training/basics/activity-lifecycle/starting.jd
index dd17304..dce6e30 100644
--- a/docs/html/training/basics/activity-lifecycle/starting.jd
+++ b/docs/html/training/basics/activity-lifecycle/starting.jd
@@ -265,7 +265,7 @@
with the activity and your activity should perform most cleanup during {@link
android.app.Activity#onPause} and {@link android.app.Activity#onStop}. However, if your
activity includes background threads that you created during {@link
-android.app.Activity#onCreate onCreate()} or other other long-running resources that could
+android.app.Activity#onCreate onCreate()} or other long-running resources that could
potentially leak memory if not properly closed, you should kill them during {@link
android.app.Activity#onDestroy}.</p>
diff --git a/docs/html/training/basics/data-storage/shared-preferences.jd b/docs/html/training/basics/data-storage/shared-preferences.jd
index 67f45cb..099da67 100644
--- a/docs/html/training/basics/data-storage/shared-preferences.jd
+++ b/docs/html/training/basics/data-storage/shared-preferences.jd
@@ -115,7 +115,7 @@
<pre>
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
-long default = getResources().getInteger(R.string.saved_high_score_default));
-long highScore = sharedPref.getInt(getString(R.string.saved_high_score), default);
+int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
+long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);
</pre>
diff --git a/docs/html/training/basics/network-ops/xml.jd b/docs/html/training/basics/network-ops/xml.jd
index b148257..0ea696d 100644
--- a/docs/html/training/basics/network-ops/xml.jd
+++ b/docs/html/training/basics/network-ops/xml.jd
@@ -551,5 +551,5 @@
conn.setDoInput(true);
// Starts the query
conn.connect();
- InputStream stream = conn.getInputStream();
+ return conn.getInputStream();
}</pre>
diff --git a/docs/html/training/basics/supporting-devices/screens.jd b/docs/html/training/basics/supporting-devices/screens.jd
index 8697cd5..1114f21 100644
--- a/docs/html/training/basics/supporting-devices/screens.jd
+++ b/docs/html/training/basics/supporting-devices/screens.jd
@@ -108,7 +108,7 @@
<p>By default, the <code>layout/main.xml</code> file is used for portrait orientation.</p>
-<p>If you want a provide a special layout for landscape, including while on large screens, then
+<p>If you want to provide a special layout for landscape, including while on large screens, then
you need to use both the <code>large</code> and <code>land</code> qualifier:</p>
<pre class="classic no-pretty-print">
diff --git a/docs/html/training/custom-views/index.jd b/docs/html/training/custom-views/index.jd
index 0661c05..cec75b4 100644
--- a/docs/html/training/custom-views/index.jd
+++ b/docs/html/training/custom-views/index.jd
@@ -17,12 +17,12 @@
<h2>You should also read</h2>
<ul>
- <li><a href="{@docRoot}/guide/topics/ui/custom-components.html">Custom Components</a>
+ <li><a href="{@docRoot}guide/topics/ui/custom-components.html">Custom Components</a>
</li>
- <li><a href="{@docRoot}/guide/topics/ui/ui-events.html">Input Events</a></li>
- <li><a href="{@docRoot}/guide/topics/graphics/prop-animation.html">Property
+ <li><a href="{@docRoot}guide/topics/ui/ui-events.html">Input Events</a></li>
+ <li><a href="{@docRoot}guide/topics/graphics/prop-animation.html">Property
Animation</a></li>
- <li><a href="{@docRoot}/guide/topics/graphics/hardware-accel.html">Hardware
+ <li><a href="{@docRoot}guide/topics/graphics/hardware-accel.html">Hardware
Acceleration</a></li>
<li><a href="{@docRoot}guide/topics/ui/accessibility/index.html">
Accessibility</a> developer guide</li>
diff --git a/docs/html/training/managing-audio/volume-playback.jd b/docs/html/training/managing-audio/volume-playback.jd
index 76abbb6..be0f583 100644
--- a/docs/html/training/managing-audio/volume-playback.jd
+++ b/docs/html/training/managing-audio/volume-playback.jd
@@ -153,4 +153,4 @@
UI.</p>
<p>A better approach is to register and unregister the media button event receiver when your
-application gains and losses the audio focus. This is covered in detail in the next lesson.</p>
+application gains and loses the audio focus. This is covered in detail in the next lesson.</p>
diff --git a/docs/html/training/multiple-apks/texture.jd b/docs/html/training/multiple-apks/texture.jd
index e4ea72b..c49cc95 100644
--- a/docs/html/training/multiple-apks/texture.jd
+++ b/docs/html/training/multiple-apks/texture.jd
@@ -90,8 +90,8 @@
<tbody>
<tr>
<td class="blueCell">ETC1</td>
- <td class="greenCell">ATI</td>
- <td class="redCell">PowerVR</td>
+ <td class="redCell">ATI</td>
+ <td class="greenCell">PowerVR</td>
</tr>
</tbody>
</table>
diff --git a/docs/html/training/sharing/send.jd b/docs/html/training/sharing/send.jd
index 741c017..9cb8eac 100644
--- a/docs/html/training/sharing/send.jd
+++ b/docs/html/training/sharing/send.jd
@@ -32,7 +32,7 @@
<p>When you construct an intent, you must specify the action you want the intent to "trigger."
Android defines several actions, including {@link android.content.Intent#ACTION_SEND} which, as
you can probably guess, indicates that the intent is sending data from one activity to another,
-even across process boundaries. To send data to another activity, all you need to do is speicify
+even across process boundaries. To send data to another activity, all you need to do is specify
the data and its type, the system will identify compatible receiving activities and display them
to the user (if there are multiple options) or immediately start the activity (if there is only
one option). Similarly, you can advertise the data types that your activities support receiving
@@ -95,7 +95,7 @@
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
-startActivity(<strong>Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)</strong>);
+startActivity(<strong>Intent.createChooser(sendIntent, getResources().getText(R.string.send_to))</strong>);
</pre>
<p>The resulting dialog is shown in figure 1.</p>
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index dfc9044..71e80831d 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -412,6 +412,8 @@
boolean mForceStatusBar;
boolean mForceStatusBarFromKeyguard;
boolean mHideLockScreen;
+ boolean mForcingShowNavBar;
+ int mForcingShowNavBarLayer;
// States of keyguard dismiss.
private static final int DISMISS_KEYGUARD_NONE = 0; // Keyguard not being dismissed.
@@ -2952,6 +2954,8 @@
mTopFullscreenOpaqueWindowState = null;
mForceStatusBar = false;
mForceStatusBarFromKeyguard = false;
+ mForcingShowNavBar = false;
+ mForcingShowNavBarLayer = -1;
mHideLockScreen = false;
mAllowLockscreenWhenOn = false;
@@ -2966,6 +2970,13 @@
WindowManager.LayoutParams attrs) {
if (DEBUG_LAYOUT) Slog.i(TAG, "Win " + win + ": isVisibleOrBehindKeyguardLw="
+ win.isVisibleOrBehindKeyguardLw());
+ if (mTopFullscreenOpaqueWindowState == null && (win.getAttrs().privateFlags
+ &WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_NAV_BAR) != 0) {
+ if (mForcingShowNavBarLayer < 0) {
+ mForcingShowNavBar = true;
+ mForcingShowNavBarLayer = win.getSurfaceLayer();
+ }
+ }
if (mTopFullscreenOpaqueWindowState == null &&
win.isVisibleOrBehindKeyguardLw() && !win.isGoneForLayoutLw()) {
if ((attrs.flags & FLAG_FORCE_NOT_FULLSCREEN) != 0) {
@@ -4494,9 +4505,13 @@
// will quickly lose focus once it correctly gets hidden.
return 0;
}
- final int visibility = mFocusedWindow.getSystemUiVisibility()
+ int tmpVisibility = mFocusedWindow.getSystemUiVisibility()
& ~mResettingSystemUiFlags
& ~mForceClearedSystemUiFlags;
+ if (mForcingShowNavBar && mFocusedWindow.getSurfaceLayer() < mForcingShowNavBarLayer) {
+ tmpVisibility &= ~View.SYSTEM_UI_CLEARABLE_FLAGS;
+ }
+ final int visibility = tmpVisibility;
int diff = visibility ^ mLastSystemUiFlags;
final boolean needsMenu = mFocusedWindow.getNeedsMenuLw(mTopFullscreenOpaqueWindowState);
if (diff == 0 && mLastFocusNeedsMenu == needsMenu
@@ -4692,6 +4707,11 @@
pw.print(prefix); pw.print("mTopFullscreenOpaqueWindowState=");
pw.println(mTopFullscreenOpaqueWindowState);
}
+ if (mForcingShowNavBar) {
+ pw.print(prefix); pw.print("mForcingShowNavBar=");
+ pw.println(mForcingShowNavBar); pw.print( "mForcingShowNavBarLayer=");
+ pw.println(mForcingShowNavBarLayer);
+ }
pw.print(prefix); pw.print("mTopIsFullscreen="); pw.print(mTopIsFullscreen);
pw.print(" mHideLockScreen="); pw.println(mHideLockScreen);
pw.print(prefix); pw.print("mForceStatusBar="); pw.print(mForceStatusBar);
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index dd99322..a488b84 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -2854,18 +2854,15 @@
// updateFocusedWindowLocked() already assigned layers so we only need to
// reassign them at this point if the IM window state gets shuffled
- boolean assignLayers = false;
-
- if (imMayMove) {
- if (moveInputMethodWindowsIfNeededLocked(false) || toBeDisplayed) {
- // Little hack here -- we -should- be able to rely on the
- // function to return true if the IME has moved and needs
- // its layer recomputed. However, if the IME was hidden
- // and isn't actually moved in the list, its layer may be
- // out of data so we make sure to recompute it.
- assignLayers = true;
- }
+ if (imMayMove && (moveInputMethodWindowsIfNeededLocked(false) || toBeDisplayed)) {
+ // Little hack here -- we -should- be able to rely on the
+ // function to return true if the IME has moved and needs
+ // its layer recomputed. However, if the IME was hidden
+ // and isn't actually moved in the list, its layer may be
+ // out of data so we make sure to recompute it.
+ assignLayersLocked(win.getWindowList());
}
+
if (wallpaperMayMove) {
getDefaultDisplayContentLocked().pendingLayoutChanges |=
WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/colorcube.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/colorcube.rs
index 5250474..fda0d1e 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/colorcube.rs
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/colorcube.rs
@@ -62,10 +62,10 @@
uint4 yz01 = ((v001 * weight1.x) + (v101 * weight2.x)) >> (int4)8;
uint4 yz11 = ((v011 * weight1.x) + (v111 * weight2.x)) >> (int4)8;
- uint4 z0 = (yz00 * weight1.y) + (yz10 * weight2.y) >> (int4)16;
- uint4 z1 = (yz01 * weight1.y) + (yz11 * weight2.y) >> (int4)16;
+ uint4 z0 = ((yz00 * weight1.y) + (yz10 * weight2.y)) >> (int4)16;
+ uint4 z1 = ((yz01 * weight1.y) + (yz11 * weight2.y)) >> (int4)16;
- uint4 v = (z0 * weight1.z) + (z1 * weight2.z) >> (int4)16;
+ uint4 v = ((z0 * weight1.z) + (z1 * weight2.z)) >> (int4)16;
uint4 v2 = (v + 0x7f) >> (int4)8;
*out = convert_uchar4(v2);
diff --git a/tests/permission/src/com/android/framework/permission/tests/VibratorServicePermissionTest.java b/tests/permission/src/com/android/framework/permission/tests/VibratorServicePermissionTest.java
index 274ac00..2416828 100644
--- a/tests/permission/src/com/android/framework/permission/tests/VibratorServicePermissionTest.java
+++ b/tests/permission/src/com/android/framework/permission/tests/VibratorServicePermissionTest.java
@@ -46,7 +46,7 @@
*/
public void testVibrate() throws RemoteException {
try {
- mVibratorService.vibrate(2000, new Binder());
+ mVibratorService.vibrate(null, 2000, new Binder());
fail("vibrate did not throw SecurityException as expected");
} catch (SecurityException e) {
// expected
@@ -62,7 +62,7 @@
*/
public void testVibratePattern() throws RemoteException {
try {
- mVibratorService.vibratePattern(new long[] {0}, 0, new Binder());
+ mVibratorService.vibratePattern(null, new long[] {0}, 0, new Binder());
fail("vibratePattern did not throw SecurityException as expected");
} catch (SecurityException e) {
// expected
diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java
index ac31663..194c982 100644
--- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java
+++ b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java
@@ -222,10 +222,10 @@
*/
// The length equals to 3 plus the number of octets in the vendor
// specific content field. And this is little endian.
- int length = ((dis.readByte() & 0xff) +
- ((dis.readByte() & 0xff) << 8)) - 3;
+ int length = (dis.readUnsignedByte() +
+ (dis.readUnsignedByte() << 8)) - 3;
int type = dis.readUnsignedByte();
- byte transId = dis.readByte();
+ int transId = dis.readUnsignedByte();
int status = dis.readUnsignedByte();
if (length < 0) {
return null;