Merge "docs: resolve bugs from external tracker" into jb-mr1-dev
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..99f3879 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,8 +56,11 @@
<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 imagePath = "/images/brand/"
var linkStart = "<a href=\"http://play.google.com/store/";
var imageStart = "\">\n"
+ " <img alt=\"";
@@ -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/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..c2ba249
--- /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..77a872c
--- /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/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaRecorderStressTestRunner.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaRecorderStressTestRunner.java
index 95e7b5e..5c74552 100755
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaRecorderStressTestRunner.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaRecorderStressTestRunner.java
@@ -33,18 +33,16 @@
// the test must be supported by the corresponding camera.
public static int mCameraId = 0;
public static int mProfileQuality = CamcorderProfile.QUALITY_HIGH;
- public static CamcorderProfile profile =
- CamcorderProfile.get(mCameraId, mProfileQuality);
-
- public static int mIterations = 100;
+ public static CamcorderProfile profile = CamcorderProfile.get(mCameraId, mProfileQuality);
+ public static int mIterations = 15;
public static int mVideoEncoder = profile.videoCodec;
- public static int mAudioEncdoer = profile.audioCodec;
+ public static int mAudioEncoder = profile.audioCodec;
public static int mFrameRate = profile.videoFrameRate;
public static int mVideoWidth = profile.videoFrameWidth;
public static int mVideoHeight = profile.videoFrameHeight;
public static int mBitRate = profile.videoBitRate;
public static boolean mRemoveVideo = true;
- public static int mDuration = 10 * 1000; // 10 seconds
+ public static int mDuration = 60 * 1000; // 60 seconds
public static int mTimeLapseDuration = 180 * 1000; // 3 minutes
public static double mCaptureRate = 0.5; // 2 sec timelapse interval
@@ -64,41 +62,41 @@
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
String iterations = (String) icicle.get("iterations");
- String video_encoder = (String) icicle.get("video_encoder");
- String audio_encoder = (String) icicle.get("audio_encoder");
- String frame_rate = (String) icicle.get("frame_rate");
- String video_width = (String) icicle.get("video_width");
- String video_height = (String) icicle.get("video_height");
- String bit_rate = (String) icicle.get("bit_rate");
- String record_duration = (String) icicle.get("record_duration");
- String remove_videos = (String) icicle.get("remove_videos");
+ String videoEncoder = (String) icicle.get("video_encoder");
+ String audioEncoder = (String) icicle.get("audio_encoder");
+ String frameRate = (String) icicle.get("frame_rate");
+ String videoWidth = (String) icicle.get("video_width");
+ String videoHeight = (String) icicle.get("video_height");
+ String bitRate = (String) icicle.get("bit_rate");
+ String recordDuration = (String) icicle.get("record_duration");
+ String removeVideos = (String) icicle.get("remove_videos");
if (iterations != null ) {
mIterations = Integer.parseInt(iterations);
}
- if ( video_encoder != null) {
- mVideoEncoder = Integer.parseInt(video_encoder);
+ if (videoEncoder != null) {
+ mVideoEncoder = Integer.parseInt(videoEncoder);
}
- if ( audio_encoder != null) {
- mAudioEncdoer = Integer.parseInt(audio_encoder);
+ if (audioEncoder != null) {
+ mAudioEncoder = Integer.parseInt(audioEncoder);
}
- if (frame_rate != null) {
- mFrameRate = Integer.parseInt(frame_rate);
+ if (frameRate != null) {
+ mFrameRate = Integer.parseInt(frameRate);
}
- if (video_width != null) {
- mVideoWidth = Integer.parseInt(video_width);
+ if (videoWidth != null) {
+ mVideoWidth = Integer.parseInt(videoWidth);
}
- if (video_height != null) {
- mVideoHeight = Integer.parseInt(video_height);
+ if (videoHeight != null) {
+ mVideoHeight = Integer.parseInt(videoHeight);
}
- if (bit_rate != null) {
- mBitRate = Integer.parseInt(bit_rate);
+ if (bitRate != null) {
+ mBitRate = Integer.parseInt(bitRate);
}
- if (record_duration != null) {
- mDuration = Integer.parseInt(record_duration);
+ if (recordDuration != null) {
+ mDuration = Integer.parseInt(recordDuration);
}
- if (remove_videos != null) {
- if (remove_videos.compareTo("true") == 0) {
+ if (removeVideos != null) {
+ if (removeVideos.compareTo("true") == 0) {
mRemoveVideo = true;
} else {
mRemoveVideo = false;
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/CameraStressTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/CameraStressTest.java
index ab9e36c3..ed1d8fc 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/CameraStressTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/CameraStressTest.java
@@ -28,6 +28,7 @@
import java.io.Writer;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
+import java.util.List;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
@@ -44,7 +45,7 @@
import junit.framework.Assert;
/**
- * Junit / Instrumentation test case for the camera zoom api
+ * Junit / Instrumentation test case for the camera zoom and scene mode APIs
*
* adb shell am instrument
* -e class com.android.mediaframeworktest.stress.CameraStressTest
@@ -54,18 +55,22 @@
private String TAG = "CameraStressTest";
private Camera mCamera;
+ private static final int CAMERA_ID = 0;
private static final int NUMBER_OF_ZOOM_LOOPS = 100;
+ private static final int NUMBER_OF_SCENE_MODE_LOOPS = 10;
private static final long WAIT_GENERIC = 3 * 1000; // 3 seconds
private static final long WAIT_TIMEOUT = 10 * 1000; // 10 seconds
private static final long WAIT_ZOOM_ANIMATION = 5 * 1000; // 5 seconds
- private static final String CAMERA_STRESS_OUTPUT =
- "/sdcard/cameraStressOutput.txt";
- private static final int CAMERA_ID = 0;
+ private static final String CAMERA_STRESS_IMAGES_DIRECTORY = "cameraStressImages";
+ private static final String CAMERA_STRESS_IMAGES_PREFIX = "camera-stress-test";
+ private static final String CAMERA_STRESS_OUTPUT = "cameraStressOutput.txt";
private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback();
private Thread mLooperThread;
private Handler mHandler;
+ private Writer mOutput;
+
public CameraStressTest() {
super("com.android.mediaframeworktest", MediaFrameworkTest.class);
}
@@ -89,6 +94,20 @@
}
getActivity();
super.setUp();
+
+ File sdcard = Environment.getExternalStorageDirectory();
+
+ // Create the test images directory if it doesn't exist
+ File stressImagesDirectory = new File(String.format("%s/%s", sdcard,
+ CAMERA_STRESS_IMAGES_DIRECTORY));
+ if (!stressImagesDirectory.exists()) {
+ stressImagesDirectory.mkdir();
+ }
+
+ // Start writing output file
+ File stressOutFile = new File(String.format("%s/%s",sdcard, CAMERA_STRESS_OUTPUT));
+ mOutput = new BufferedWriter(new FileWriter(stressOutFile, true));
+ mOutput.write(this.getName() + ":\n");
}
@Override
@@ -105,6 +124,9 @@
mLooperThread = null;
}
+ mOutput.write("\n\n");
+ mOutput.close();
+
super.tearDown();
}
@@ -127,9 +149,7 @@
private final class CameraErrorCallback implements android.hardware.Camera.ErrorCallback {
public void onError(int error, android.hardware.Camera camera) {
- if (error == android.hardware.Camera.CAMERA_ERROR_SERVER_DIED) {
- assertTrue("Camera test mediaserver died", false);
- }
+ fail(String.format("Camera error, code: %d", error));
}
}
@@ -154,49 +174,76 @@
try {
Log.v(TAG, "JPEG picture taken");
- fos = new FileOutputStream(String.format("%s/zoom-test-%d.jpg",
- Environment.getExternalStorageDirectory(), System.currentTimeMillis()));
+ fos = new FileOutputStream(String.format("%s/%s/%s-%d.jpg",
+ Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY,
+ CAMERA_STRESS_IMAGES_PREFIX, System.currentTimeMillis()));
fos.write(data);
- }
- catch (FileNotFoundException e) {
- Log.v(TAG, "File not found: " + e.toString());
- }
- catch (IOException e) {
- Log.v(TAG, "Error accessing file: " + e.toString());
- }
- finally {
+ } catch (FileNotFoundException e) {
+ Log.e(TAG, "File not found: " + e.toString());
+ } catch (IOException e) {
+ Log.e(TAG, "Error accessing file: " + e.toString());
+ } finally {
try {
if (fos != null) {
fos.close();
}
- }
- catch (IOException e) {
- Log.v(TAG, "Error closing file: " + e.toString());
+ } catch (IOException e) {
+ Log.e(TAG, "Error closing file: " + e.toString());
}
}
}
};
// Helper method for cleaning up pics taken during testStressCameraZoom
- private void cleanupZoomImages() {
+ private void cleanupStressTestImages() {
try {
- File sdcard = Environment.getExternalStorageDirectory();
+ File stressImagesDirectory = new File(String.format("%s/%s",
+ Environment.getExternalStorageDirectory(), CAMERA_STRESS_IMAGES_DIRECTORY));
File[] zoomImages = null;
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
- return name.startsWith("zoom-test-");
+ return name.startsWith(CAMERA_STRESS_IMAGES_PREFIX);
}
};
- zoomImages = sdcard.listFiles(filter);
+ zoomImages = stressImagesDirectory.listFiles(filter);
for (File f : zoomImages) {
f.delete();
}
+ } catch (SecurityException e) {
+ Log.e(TAG, "Security manager access violation: " + e.toString());
}
- catch (SecurityException e) {
- Log.v(TAG, "Security manager access violation: " + e.toString());
+ }
+
+ // Helper method for starting up the camera preview
+ private void startCameraPreview(SurfaceHolder surfaceHolder) {
+ try {
+ mCamera.setErrorCallback(mCameraErrorCallback);
+ mCamera.setPreviewDisplay(surfaceHolder);
+ mCamera.startPreview();
+ Thread.sleep(WAIT_GENERIC);
+ } catch (IOException e) {
+ Log.e(TAG, "Error setting preview display: " + e.toString());
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Error waiting for preview to come up: " + e.toString());
+ } catch (Exception e) {
+ Log.e(TAG, "Error starting up camera preview: " + e.toString());
+ }
+ }
+
+ // Helper method for taking a photo
+ private void capturePhoto() {
+ try {
+ mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
+ Thread.sleep(WAIT_GENERIC);
+ mCamera.stopPreview();
+ mCamera.release();
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Error waiting for photo to be taken: " + e.toString());
+ } catch (Exception e) {
+ Log.e(TAG, "Error capturing photo: " + e.toString());
}
}
@@ -205,14 +252,11 @@
public void testStressCameraZoom() throws Exception {
SurfaceHolder mSurfaceHolder;
mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
- File stressOutFile = new File(CAMERA_STRESS_OUTPUT);
- Writer output = new BufferedWriter(new FileWriter(stressOutFile, true));
- output.write("Camera zoom stress:\n");
- output.write("Total number of loops: " + NUMBER_OF_ZOOM_LOOPS + "\n");
+ mOutput.write("Total number of loops: " + NUMBER_OF_ZOOM_LOOPS + "\n");
try {
Log.v(TAG, "Start preview");
- output.write("No of loop: ");
+ mOutput.write("No of loop: ");
mCamera = Camera.open(CAMERA_ID);
Camera.Parameters params = mCamera.getParameters();
@@ -220,9 +264,8 @@
if (!params.isSmoothZoomSupported() && !params.isZoomSupported()) {
Log.v(TAG, "Device camera does not support zoom");
- assertTrue("Camera zoom stress test", false);
- }
- else {
+ fail("Camera zoom stress test failed");
+ } else {
Log.v(TAG, "Device camera does support zoom");
int nextZoomLevel = 0;
@@ -235,11 +278,7 @@
}
});
- mCamera.setErrorCallback(mCameraErrorCallback);
- mCamera.setPreviewDisplay(mSurfaceHolder);
- mCamera.startPreview();
- Thread.sleep(WAIT_GENERIC);
-
+ startCameraPreview(mSurfaceHolder);
params = mCamera.getParameters();
int currentZoomLevel = params.getZoom();
@@ -250,8 +289,7 @@
if (params.isSmoothZoomSupported()) {
mCamera.startSmoothZoom(nextZoomLevel);
- }
- else {
+ } else {
params.setZoom(nextZoomLevel);
mCamera.setParameters(params);
}
@@ -259,23 +297,66 @@
// sleep allows for zoom animation to finish
Thread.sleep(WAIT_ZOOM_ANIMATION);
+ capturePhoto();
- // take picture
- mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
- Thread.sleep(WAIT_GENERIC);
- mCamera.stopPreview();
- mCamera.release();
- output.write(" ," + i);
+ if (i == 0) {
+ mOutput.write(Integer.toString(i));
+ } else {
+ mOutput.write(", " + i);
+ }
}
}
+ cleanupStressTestImages();
+ } catch (Exception e) {
+ Log.e(TAG, e.toString());
+ fail("Camera zoom stress test Exception");
+ }
+ }
- cleanupZoomImages();
+ // Test case for stressing the camera scene mode feature
+ @LargeTest
+ public void testStressCameraSceneModes() throws Exception {
+ SurfaceHolder mSurfaceHolder;
+ mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
+
+ try {
+ mCamera = Camera.open(CAMERA_ID);
+ Camera.Parameters params = mCamera.getParameters();
+ mCamera.release();
+ List<String> supportedSceneModes = params.getSupportedSceneModes();
+ assertNotNull("No scene modes supported", supportedSceneModes);
+
+ mOutput.write("Total number of loops: " +
+ (NUMBER_OF_SCENE_MODE_LOOPS * supportedSceneModes.size()) + "\n");
+ Log.v(TAG, "Start preview");
+ mOutput.write("No of loop: ");
+
+ for (int i = 0; i < supportedSceneModes.size(); i++) {
+ for (int j = 0; j < NUMBER_OF_SCENE_MODE_LOOPS; j++) {
+ runOnLooper(new Runnable() {
+ @Override
+ public void run() {
+ mCamera = Camera.open(CAMERA_ID);
+ }
+ });
+
+ startCameraPreview(mSurfaceHolder);
+ Log.v(TAG, "Setting mode to " + supportedSceneModes.get(i));
+ params.setSceneMode(supportedSceneModes.get(i));
+ mCamera.setParameters(params);
+ capturePhoto();
+
+ if ((i == 0) && (j == 0)) {
+ mOutput.write(Integer.toString(j + i * NUMBER_OF_SCENE_MODE_LOOPS));
+ } else {
+ mOutput.write(", " + (j + i * NUMBER_OF_SCENE_MODE_LOOPS));
+ }
+ }
+ }
+ cleanupStressTestImages();
+ } catch (Exception e) {
+ Log.e(TAG, e.toString());
+ fail("Camera scene mode test Exception");
}
- catch (Exception e) {
- assertTrue("Camera zoom stress test Exception", false);
- Log.v(TAG, e.toString());
- }
- output.write("\n\n");
- output.close();
}
}
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java
index 6995c60..6eb9891 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java
@@ -31,6 +31,7 @@
import android.media.CamcorderProfile;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
+import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.test.ActivityInstrumentationTestCase2;
@@ -48,26 +49,26 @@
private MediaRecorder mRecorder;
private Camera mCamera;
+ private static final int CAMERA_ID = 0;
private static final int NUMBER_OF_CAMERA_STRESS_LOOPS = 100;
private static final int NUMBER_OF_RECORDER_STRESS_LOOPS = 100;
private static final int NUMBER_OF_RECORDERANDPLAY_STRESS_LOOPS = 50;
private static final int NUMBER_OF_SWTICHING_LOOPS_BW_CAMERA_AND_RECORDER = 200;
private static final int NUMBER_OF_TIME_LAPSE_LOOPS = 25;
private static final int TIME_LAPSE_PLAYBACK_WAIT_TIME = 5* 1000; // 5 seconds
+ private static final int USE_TEST_RUNNER_PROFILE = -1;
+ private static final long WAIT_TIMEOUT = 10 * 1000; // 10 seconds
private static final long WAIT_TIME_CAMERA_TEST = 3 * 1000; // 3 seconds
private static final long WAIT_TIME_RECORDER_TEST = 6 * 1000; // 6 seconds
- private static final String OUTPUT_FILE = "/sdcard/temp";
private static final String OUTPUT_FILE_EXT = ".3gp";
- private static final String MEDIA_STRESS_OUTPUT =
- "/sdcard/mediaStressOutput.txt";
- private static final int CAMERA_ID = 0;
+ private static final String MEDIA_STRESS_OUTPUT = "mediaStressOutput.txt";
private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback();
private final RecorderErrorCallback mRecorderErrorCallback = new RecorderErrorCallback();
- private final static int WAIT_TIMEOUT = 10 * 1000; // 10 seconds
- private Thread mLooperThread;
private Handler mHandler;
+ private Thread mLooperThread;
+ private Writer mOutput;
public MediaRecorderStressTest() {
super("com.android.mediaframeworktest", MediaFrameworkTest.class);
@@ -95,6 +96,11 @@
Thread.sleep(2000);
getActivity();
super.setUp();
+
+ File stressOutFile = new File(String.format("%s/%s",
+ Environment.getExternalStorageDirectory(), MEDIA_STRESS_OUTPUT));
+ mOutput = new BufferedWriter(new FileWriter(stressOutFile, true));
+ mOutput.write(this.getName() + "\n");
}
@Override
@@ -110,7 +116,8 @@
}
mLooperThread = null;
}
-
+ mOutput.write("\n\n");
+ mOutput.close();
super.tearDown();
}
@@ -133,16 +140,13 @@
private final class CameraErrorCallback implements android.hardware.Camera.ErrorCallback {
public void onError(int error, android.hardware.Camera camera) {
- if (error == android.hardware.Camera.CAMERA_ERROR_SERVER_DIED) {
- assertTrue("Camera test mediaserver died", false);
- }
+ fail(String.format("Camera error, code: %d", error));
}
}
private final class RecorderErrorCallback implements MediaRecorder.OnErrorListener {
public void onError(MediaRecorder mr, int what, int extra) {
- // fail the test case no matter what error come up
- assertTrue("mediaRecorder error", false);
+ fail(String.format("Media recorder error, code: %d\textra: %d", what, extra));
}
}
@@ -151,14 +155,11 @@
public void testStressCamera() throws Exception {
SurfaceHolder mSurfaceHolder;
mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
- File stressOutFile = new File(MEDIA_STRESS_OUTPUT);
- Writer output = new BufferedWriter(new FileWriter(stressOutFile, true));
- output.write("Camera start preview stress:\n");
- output.write("Total number of loops:" +
- NUMBER_OF_CAMERA_STRESS_LOOPS + "\n");
+ Log.v(TAG, "Camera start preview stress test");
+ mOutput.write("Total number of loops:" + NUMBER_OF_CAMERA_STRESS_LOOPS + "\n");
try {
Log.v(TAG, "Start preview");
- output.write("No of loop: ");
+ mOutput.write("No of loop: ");
for (int i = 0; i< NUMBER_OF_CAMERA_STRESS_LOOPS; i++) {
runOnLooper(new Runnable() {
@@ -173,29 +174,27 @@
Thread.sleep(WAIT_TIME_CAMERA_TEST);
mCamera.stopPreview();
mCamera.release();
- output.write(" ," + i);
+ if (i == 0) {
+ mOutput.write(i + 1);
+ } else {
+ mOutput.write(String.format(", %d", (i + 1)));
+ }
}
} catch (Exception e) {
- assertTrue("CameraStressTest", false);
- Log.v(TAG, e.toString());
+ Log.e(TAG, e.toString());
+ fail("Camera startup preview stress test");
}
- output.write("\n\n");
- output.close();
}
//Test case for stressing the camera preview.
@LargeTest
public void testStressRecorder() throws Exception {
- String filename;
SurfaceHolder mSurfaceHolder;
mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
- File stressOutFile = new File(MEDIA_STRESS_OUTPUT);
- Writer output = new BufferedWriter(new FileWriter(stressOutFile, true));
- output.write("H263 video record- reset after prepare Stress test\n");
- output.write("Total number of loops:" +
- NUMBER_OF_RECORDER_STRESS_LOOPS + "\n");
+ Log.v(TAG, "H263 video record: reset after prepare Stress test");
+ mOutput.write("Total number of loops:" + NUMBER_OF_RECORDER_STRESS_LOOPS + "\n");
try {
- output.write("No of loop: ");
+ mOutput.write("No of loop: ");
Log.v(TAG, "Start preview");
for (int i = 0; i < NUMBER_OF_RECORDER_STRESS_LOOPS; i++) {
runOnLooper(new Runnable() {
@@ -205,12 +204,15 @@
}
});
Log.v(TAG, "counter = " + i);
- filename = OUTPUT_FILE + i + OUTPUT_FILE_EXT;
- Log.v(TAG, filename);
+ String fileName = String.format("%s/temp%d%s",
+ Environment.getExternalStorageDirectory(),
+ i, OUTPUT_FILE_EXT);
+
+ Log.v(TAG, fileName);
mRecorder.setOnErrorListener(mRecorderErrorCallback);
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
- mRecorder.setOutputFile(filename);
+ mRecorder.setOutputFile(fileName);
mRecorder.setVideoFrameRate(MediaRecorderStressTestRunner.mFrameRate);
mRecorder.setVideoSize(176,144);
Log.v(TAG, "setEncoder");
@@ -224,30 +226,29 @@
Thread.sleep(WAIT_TIME_RECORDER_TEST);
mRecorder.reset();
mRecorder.release();
- output.write(", " + i);
+ if (i == 0) {
+ mOutput.write(i + 1);
+ } else {
+ mOutput.write(String.format(", %d", (i + 1)));
+ }
}
} catch (Exception e) {
- assertTrue("Recorder Stress test", false);
- Log.v(TAG, e.toString());
+ Log.e(TAG, e.toString());
+ fail("H263 video recording stress test");
}
- output.write("\n\n");
- output.close();
}
//Stress test case for switching camera and video recorder preview.
@LargeTest
public void testStressCameraSwitchRecorder() throws Exception {
- String filename;
SurfaceHolder mSurfaceHolder;
mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
- File stressOutFile = new File(MEDIA_STRESS_OUTPUT);
- Writer output = new BufferedWriter(new FileWriter(stressOutFile, true));
- output.write("Camera and video recorder preview switching\n");
- output.write("Total number of loops:"
- + NUMBER_OF_SWTICHING_LOOPS_BW_CAMERA_AND_RECORDER + "\n");
+ Log.v(TAG, "Camera and video recorder preview switching");
+ mOutput.write("Total number of loops: " +
+ NUMBER_OF_SWTICHING_LOOPS_BW_CAMERA_AND_RECORDER + "\n");
try {
Log.v(TAG, "Start preview");
- output.write("No of loop: ");
+ mOutput.write("No of loop: ");
for (int i = 0; i < NUMBER_OF_SWTICHING_LOOPS_BW_CAMERA_AND_RECORDER; i++) {
runOnLooper(new Runnable() {
@Override
@@ -263,8 +264,10 @@
mCamera.release();
mCamera = null;
Log.v(TAG, "release camera");
- filename = OUTPUT_FILE + i + OUTPUT_FILE_EXT;
- Log.v(TAG, filename);
+ String fileName = String.format("%s/temp%d%s",
+ Environment.getExternalStorageDirectory(),
+ i, OUTPUT_FILE_EXT);
+ Log.v(TAG, fileName);
runOnLooper(new Runnable() {
@Override
public void run() {
@@ -274,7 +277,7 @@
mRecorder.setOnErrorListener(mRecorderErrorCallback);
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
- mRecorder.setOutputFile(filename);
+ mRecorder.setOutputFile(fileName);
mRecorder.setVideoFrameRate(MediaRecorderStressTestRunner.mFrameRate);
mRecorder.setVideoSize(176,144);
Log.v(TAG, "Media recorder setEncoder");
@@ -287,117 +290,167 @@
Thread.sleep(WAIT_TIME_CAMERA_TEST);
mRecorder.release();
Log.v(TAG, "release video recorder");
- output.write(", " + i);
+ if (i == 0) {
+ mOutput.write(i + 1);
+ } else {
+ mOutput.write(String.format(", %d", (i + 1)));
+ }
}
} catch (Exception e) {
- assertTrue("Camer and recorder switch mode", false);
- Log.v(TAG, e.toString());
+ Log.e(TAG, e.toString());
+ fail("Camera and recorder switch mode");
}
- output.write("\n\n");
- output.close();
}
- public void validateRecordedVideo(String recorded_file) {
+ public void validateRecordedVideo(String recordedFile) {
try {
MediaPlayer mp = new MediaPlayer();
- mp.setDataSource(recorded_file);
+ mp.setDataSource(recordedFile);
mp.prepare();
int duration = mp.getDuration();
if (duration <= 0){
- assertTrue("stressRecordAndPlayback", false);
+ fail("stressRecordAndPlayback");
}
mp.release();
} catch (Exception e) {
- assertTrue("stressRecordAndPlayback", false);
+ fail("stressRecordAndPlayback");
}
}
- public void removeRecordedVideo(String filename){
- File video = new File(filename);
- Log.v(TAG, "remove recorded video " + filename);
+ public void removeRecordedVideo(String fileName){
+ File video = new File(fileName);
+ Log.v(TAG, "remove recorded video " + fileName);
video.delete();
}
- //Stress test case for record a video and play right away.
- @LargeTest
- public void testStressRecordVideoAndPlayback() throws Exception {
- int iterations = MediaRecorderStressTestRunner.mIterations;
- int video_encoder = MediaRecorderStressTestRunner.mVideoEncoder;
- int audio_encoder = MediaRecorderStressTestRunner.mAudioEncdoer;
- int frame_rate = MediaRecorderStressTestRunner.mFrameRate;
- int video_width = MediaRecorderStressTestRunner.mVideoWidth;
- int video_height = MediaRecorderStressTestRunner.mVideoHeight;
- int bit_rate = MediaRecorderStressTestRunner.mBitRate;
- boolean remove_video = MediaRecorderStressTestRunner.mRemoveVideo;
- int record_duration = MediaRecorderStressTestRunner.mDuration;
+ // Helper method for record & playback testing with different camcorder profiles
+ private void recordVideoAndPlayback(int profile) throws Exception {
+ int iterations;
+ int recordDuration;
+ boolean removeVideo;
- String filename;
- SurfaceHolder mSurfaceHolder;
- mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
- File stressOutFile = new File(MEDIA_STRESS_OUTPUT);
- Writer output = new BufferedWriter(
- new FileWriter(stressOutFile, true));
- output.write("Video record and play back stress test:\n");
- output.write("Total number of loops:"
- + NUMBER_OF_RECORDERANDPLAY_STRESS_LOOPS + "\n");
+ int videoEncoder;
+ int audioEncoder;
+ int frameRate;
+ int videoWidth;
+ int videoHeight;
+ int bitRate;
+
+ if (profile != USE_TEST_RUNNER_PROFILE) {
+ assertTrue(String.format("Camera doesn't support profile %d", profile),
+ CamcorderProfile.hasProfile(CAMERA_ID, profile));
+ CamcorderProfile camcorderProfile = CamcorderProfile.get(CAMERA_ID, profile);
+ videoEncoder = camcorderProfile.videoCodec;
+ audioEncoder = camcorderProfile.audioCodec;
+ frameRate = camcorderProfile.videoFrameRate;
+ videoWidth = camcorderProfile.videoFrameWidth;
+ videoHeight = camcorderProfile.videoFrameHeight;
+ bitRate = camcorderProfile.videoBitRate;
+ } else {
+ videoEncoder = MediaRecorderStressTestRunner.mVideoEncoder;
+ audioEncoder = MediaRecorderStressTestRunner.mAudioEncoder;
+ frameRate = MediaRecorderStressTestRunner.mFrameRate;
+ videoWidth = MediaRecorderStressTestRunner.mVideoWidth;
+ videoHeight = MediaRecorderStressTestRunner.mVideoHeight;
+ bitRate = MediaRecorderStressTestRunner.mBitRate;
+ }
+ iterations = MediaRecorderStressTestRunner.mIterations;
+ recordDuration = MediaRecorderStressTestRunner.mDuration;
+ removeVideo = MediaRecorderStressTestRunner.mRemoveVideo;
+
+ SurfaceHolder surfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
+ mOutput.write("Total number of loops: " + iterations + "\n");
+
try {
- output.write("No of loop: ");
- for (int i = 0; i < iterations; i++){
- filename = OUTPUT_FILE + i + OUTPUT_FILE_EXT;
- Log.v(TAG, filename);
+ mOutput.write("No of loop: ");
+ for (int i = 0; i < iterations; i++) {
+ String fileName = String.format("%s/temp%d%s",
+ Environment.getExternalStorageDirectory(), i, OUTPUT_FILE_EXT);
+ Log.v(TAG, fileName);
+
runOnLooper(new Runnable() {
@Override
public void run() {
mRecorder = new MediaRecorder();
}
});
+
Log.v(TAG, "iterations : " + iterations);
- Log.v(TAG, "video_encoder : " + video_encoder);
- Log.v(TAG, "audio_encoder : " + audio_encoder);
- Log.v(TAG, "frame_rate : " + frame_rate);
- Log.v(TAG, "video_width : " + video_width);
- Log.v(TAG, "video_height : " + video_height);
- Log.v(TAG, "bit rate : " + bit_rate);
- Log.v(TAG, "record_duration : " + record_duration);
+ Log.v(TAG, "video encoder : " + videoEncoder);
+ Log.v(TAG, "audio encoder : " + audioEncoder);
+ Log.v(TAG, "frame rate : " + frameRate);
+ Log.v(TAG, "video width : " + videoWidth);
+ Log.v(TAG, "video height : " + videoHeight);
+ Log.v(TAG, "bit rate : " + bitRate);
+ Log.v(TAG, "record duration : " + recordDuration);
mRecorder.setOnErrorListener(mRecorderErrorCallback);
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
- mRecorder.setOutputFile(filename);
- mRecorder.setVideoFrameRate(frame_rate);
- mRecorder.setVideoSize(video_width, video_height);
- mRecorder.setVideoEncoder(video_encoder);
- mRecorder.setAudioEncoder(audio_encoder);
- mRecorder.setVideoEncodingBitRate(bit_rate);
+ mRecorder.setOutputFile(fileName);
+ mRecorder.setVideoFrameRate(frameRate);
+ mRecorder.setVideoSize(videoWidth, videoHeight);
+ mRecorder.setVideoEncoder(videoEncoder);
+ mRecorder.setAudioEncoder(audioEncoder);
+ mRecorder.setVideoEncodingBitRate(bitRate);
+
Log.v(TAG, "mediaRecorder setPreview");
- mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
+ mRecorder.setPreviewDisplay(surfaceHolder.getSurface());
mRecorder.prepare();
mRecorder.start();
- Thread.sleep(record_duration);
+ Thread.sleep(recordDuration);
Log.v(TAG, "Before stop");
mRecorder.stop();
mRecorder.release();
+
//start the playback
MediaPlayer mp = new MediaPlayer();
- mp.setDataSource(filename);
+ mp.setDataSource(fileName);
mp.setDisplay(MediaFrameworkTest.mSurfaceView.getHolder());
mp.prepare();
mp.start();
- Thread.sleep(record_duration);
+ Thread.sleep(recordDuration);
mp.release();
- validateRecordedVideo(filename);
- if (remove_video) {
- removeRecordedVideo(filename);
+ validateRecordedVideo(fileName);
+ if (removeVideo) {
+ removeRecordedVideo(fileName);
}
- output.write(", " + i);
+ if (i == 0) {
+ mOutput.write(i + 1);
+ } else {
+ mOutput.write(String.format(", %d", (i + 1)));
+ }
}
} catch (Exception e) {
- Log.v(TAG, e.toString());
- assertTrue("record and playback", false);
+ Log.e(TAG, e.toString());
+ fail("Record and playback");
}
- output.write("\n\n");
- output.close();
+ }
+
+ // Record and playback stress test @ 1080P quality
+ @LargeTest
+ public void testStressRecordVideoAndPlayback1080P() throws Exception {
+ recordVideoAndPlayback(CamcorderProfile.QUALITY_1080P);
+ }
+
+ // Record and playback stress test @ 720P quality
+ @LargeTest
+ public void testStressRecordVideoAndPlayback720P() throws Exception {
+ recordVideoAndPlayback(CamcorderProfile.QUALITY_720P);
+ }
+
+ // Record and playback stress test @ 480P quality
+ @LargeTest
+ public void testStressRecordVideoAndPlayback480P() throws Exception {
+ recordVideoAndPlayback(CamcorderProfile.QUALITY_480P);
+ }
+
+ // This test method uses the codec info from the test runner. Use this
+ // for more granular control of video encoding.
+ @LargeTest
+ public void defaultStressRecordVideoAndPlayback() throws Exception {
+ recordVideoAndPlayback(USE_TEST_RUNNER_PROFILE);
}
// Test case for stressing time lapse
@@ -405,21 +458,19 @@
public void testStressTimeLapse() throws Exception {
SurfaceHolder mSurfaceHolder;
mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
- int record_duration = MediaRecorderStressTestRunner.mTimeLapseDuration;
- boolean remove_video = MediaRecorderStressTestRunner.mRemoveVideo;
+ int recordDuration = MediaRecorderStressTestRunner.mTimeLapseDuration;
+ boolean removeVideo = MediaRecorderStressTestRunner.mRemoveVideo;
double captureRate = MediaRecorderStressTestRunner.mCaptureRate;
- String filename;
- File stressOutFile = new File(MEDIA_STRESS_OUTPUT);
- Writer output = new BufferedWriter(new FileWriter(stressOutFile, true));
- output.write("Start camera time lapse stress:\n");
- output.write("Total number of loops: " + NUMBER_OF_TIME_LAPSE_LOOPS + "\n");
+ Log.v(TAG, "Start camera time lapse stress:");
+ mOutput.write("Total number of loops: " + NUMBER_OF_TIME_LAPSE_LOOPS + "\n");
try {
- for (int j = 0, n = Camera.getNumberOfCameras(); j < n; j++) {
- output.write("No of loop: camera " + j);
- for (int i = 0; i < NUMBER_OF_TIME_LAPSE_LOOPS; i++) {
- filename = OUTPUT_FILE + j + "_" + i + OUTPUT_FILE_EXT;
- Log.v(TAG, filename);
+ for (int i = 0, n = Camera.getNumberOfCameras(); i < n; i++) {
+ mOutput.write("No of loop: camera " + i);
+ for (int j = 0; j < NUMBER_OF_TIME_LAPSE_LOOPS; j++) {
+ String fileName = String.format("%s/temp%d_%d%s",
+ Environment.getExternalStorageDirectory(), i, j, OUTPUT_FILE_EXT);
+ Log.v(TAG, fileName);
runOnLooper(new Runnable() {
@Override
public void run() {
@@ -438,12 +489,12 @@
CamcorderProfile.get(j, CamcorderProfile.QUALITY_TIME_LAPSE_HIGH);
mRecorder.setProfile(profile);
- // Set the timelapse setting; 0.1 = 10 sec timelapse, 0.5 = 2 sec timelapse, etc.
+ // Set the timelapse setting; 0.1 = 10 sec timelapse, 0.5 = 2 sec timelapse, etc
// http://developer.android.com/guide/topics/media/camera.html#time-lapse-video
mRecorder.setCaptureRate(captureRate);
// Set output file
- mRecorder.setOutputFile(filename);
+ mRecorder.setOutputFile(fileName);
// Set the preview display
Log.v(TAG, "mediaRecorder setPreviewDisplay");
@@ -451,40 +502,40 @@
mRecorder.prepare();
mRecorder.start();
- Thread.sleep(record_duration);
+ Thread.sleep(recordDuration);
Log.v(TAG, "Before stop");
mRecorder.stop();
mRecorder.release();
// Start the playback
MediaPlayer mp = new MediaPlayer();
- mp.setDataSource(filename);
+ mp.setDataSource(fileName);
mp.setDisplay(mSurfaceHolder);
mp.prepare();
mp.start();
Thread.sleep(TIME_LAPSE_PLAYBACK_WAIT_TIME);
mp.release();
- validateRecordedVideo(filename);
- if (remove_video) {
- removeRecordedVideo(filename);
+ validateRecordedVideo(fileName);
+ if (removeVideo) {
+ removeRecordedVideo(fileName);
}
- output.write(", " + i);
+
+ if (j == 0) {
+ mOutput.write(j + 1);
+ } else {
+ mOutput.write(String.format(", %d", (j + 1)));
+ }
}
}
+ } catch (IllegalStateException e) {
+ Log.e(TAG, e.toString());
+ fail("Camera time lapse stress test IllegalStateException");
+ } catch (IOException e) {
+ Log.e(TAG, e.toString());
+ fail("Camera time lapse stress test IOException");
+ } catch (Exception e) {
+ Log.e(TAG, e.toString());
+ fail("Camera time lapse stress test Exception");
}
- catch (IllegalStateException e) {
- assertTrue("Camera time lapse stress test IllegalStateException", false);
- Log.v(TAG, e.toString());
- }
- catch (IOException e) {
- assertTrue("Camera time lapse stress test IOException", false);
- Log.v(TAG, e.toString());
- }
- catch (Exception e) {
- assertTrue("Camera time lapse stress test Exception", false);
- Log.v(TAG, e.toString());
- }
- output.write("\n\n");
- output.close();
}
}