diff options
Diffstat (limited to 'docs')
339 files changed, 14555 insertions, 5378 deletions
diff --git a/docs/html/about/dashboards/index.jd b/docs/html/about/dashboards/index.jd index c61a94b..32b9c9e 100644 --- a/docs/html/about/dashboards/index.jd +++ b/docs/html/about/dashboards/index.jd @@ -64,7 +64,7 @@ Platform Versions</a>.</p> </div> -<p style="clear:both"><em>Data collected during a 7-day period ending on May 1, 2014. +<p style="clear:both"><em>Data collected during a 7-day period ending on June 4, 2014. <br/>Any versions with less than 0.1% distribution are not shown.</em> </p> @@ -95,7 +95,7 @@ Screens</a>.</p> </div> -<p style="clear:both"><em>Data collected during a 7-day period ending on May 1, 2014. +<p style="clear:both"><em>Data collected during a 7-day period ending on June 4, 2014. <br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p> @@ -114,7 +114,7 @@ support for any lower version (for example, support for version 2.0 also implies <img alt="" style="float:right" -src="//chart.googleapis.com/chart?chs=400x250&cht=p&chd=t%3A0.1%2C87.0%2C12.9&chf=bg%2Cs%2C00000000&chl=GL%201.1%20only%7CGL%202.0%7CGL%203.0&chco=c4df9b%2C6fad0c" /> +src="//chart.googleapis.com/chart?chs=400x250&cht=p&chd=t%3A0.1%2C83.6%2C16.3&chf=bg%2Cs%2C00000000&chl=GL%201.1%20only%7CGL%202.0%7CGL%203.0&chco=c4df9b%2C6fad0c" /> <p>To declare which version of OpenGL ES your application requires, you should use the {@code android:glEsVersion} attribute of the <a @@ -136,17 +136,17 @@ uses.</p> </tr> <tr> <td>2.0</th> -<td>87.0%</td> +<td>83.6%</td> </tr> <tr> <td>3.0</th> -<td>12.9%</td> +<td>16.3%</td> </tr> </table> -<p style="clear:both"><em>Data collected during a 7-day period ending on May 1, 2014</em></p> +<p style="clear:both"><em>Data collected during a 7-day period ending on June 4, 2014</em></p> @@ -164,47 +164,42 @@ uses.</p> var VERSION_DATA = [ { - "chart": "//chart.googleapis.com/chart?chs=500x250&cht=p&chd=t%3A1.0%2C16.2%2C0.1%2C13.4%2C60.8%2C8.5&chf=bg%2Cs%2C00000000&chl=Froyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat&chco=c4df9b%2C6fad0c", + "chart": "//chart.googleapis.com/chart?chl=Froyo%7CGingerbread%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat&chf=bg%2Cs%2C00000000&chd=t%3A0.8%2C14.9%2C12.3%2C58.4%2C13.6&chco=c4df9b%2C6fad0c&cht=p&chs=500x250", "data": [ { "api": 8, "name": "Froyo", - "perc": "1.0" + "perc": "0.8" }, { "api": 10, "name": "Gingerbread", - "perc": "16.2" - }, - { - "api": 13, - "name": "Honeycomb", - "perc": "0.1" + "perc": "14.9" }, { "api": 15, "name": "Ice Cream Sandwich", - "perc": "13.4" + "perc": "12.3" }, { "api": 16, "name": "Jelly Bean", - "perc": "33.5" + "perc": "29.0" }, { "api": 17, "name": "Jelly Bean", - "perc": "18.8" + "perc": "19.1" }, { "api": 18, "name": "Jelly Bean", - "perc": "8.5" + "perc": "10.3" }, { "api": 19, "name": "KitKat", - "perc": "8.5" + "perc": "13.6" } ] } @@ -226,23 +221,22 @@ var SCREEN_DATA = "xhdpi": "0.6" }, "Normal": { - "hdpi": "33.9", - "mdpi": "12.5", - "xhdpi": "19.9", - "xxhdpi": "13.5" + "hdpi": "34.2", + "mdpi": "12.0", + "xhdpi": "19.6", + "xxhdpi": "14.6" }, "Small": { - "ldpi": "7.5" + "ldpi": "7.2" }, "Xlarge": { "hdpi": "0.3", - "ldpi": "0.1", - "mdpi": "4.2", + "mdpi": "4.0", "xhdpi": "0.3" } }, - "densitychart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chd=t%3A8.2%2C21.1%2C1.6%2C34.8%2C20.8%2C13.5&chf=bg%2Cs%2C00000000&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&chco=c4df9b%2C6fad0c", - "layoutchart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chd=t%3A4.9%2C7.8%2C80.0%2C7.5&chf=bg%2Cs%2C00000000&chl=Xlarge%7CLarge%7CNormal%7CSmall&chco=c4df9b%2C6fad0c" + "densitychart": "//chart.googleapis.com/chart?chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&chf=bg%2Cs%2C00000000&chd=t%3A7.8%2C20.4%2C1.6%2C35.1%2C20.5%2C14.6&chco=c4df9b%2C6fad0c&cht=p&chs=400x250", + "layoutchart": "//chart.googleapis.com/chart?chl=Xlarge%7CLarge%7CNormal%7CSmall&chf=bg%2Cs%2C00000000&chd=t%3A4.6%2C7.8%2C80.4%2C7.2&chco=c4df9b%2C6fad0c&cht=p&chs=400x250" } ]; diff --git a/docs/html/auto/images/assets/00_frame.png b/docs/html/auto/images/assets/00_frame.png Binary files differnew file mode 100644 index 0000000..2a78380 --- /dev/null +++ b/docs/html/auto/images/assets/00_frame.png diff --git a/docs/html/auto/images/assets/01_a_maps.png b/docs/html/auto/images/assets/01_a_maps.png Binary files differnew file mode 100644 index 0000000..0d1b219 --- /dev/null +++ b/docs/html/auto/images/assets/01_a_maps.png diff --git a/docs/html/auto/images/assets/01_b_now.png b/docs/html/auto/images/assets/01_b_now.png Binary files differnew file mode 100644 index 0000000..043ec74 --- /dev/null +++ b/docs/html/auto/images/assets/01_b_now.png diff --git a/docs/html/auto/images/assets/02_a_notif.gif b/docs/html/auto/images/assets/02_a_notif.gif Binary files differnew file mode 100644 index 0000000..9f3d35d --- /dev/null +++ b/docs/html/auto/images/assets/02_a_notif.gif diff --git a/docs/html/auto/images/assets/02_b_switcher.gif b/docs/html/auto/images/assets/02_b_switcher.gif Binary files differnew file mode 100644 index 0000000..c4014e3 --- /dev/null +++ b/docs/html/auto/images/assets/02_b_switcher.gif diff --git a/docs/html/auto/images/assets/03_a_musict.png b/docs/html/auto/images/assets/03_a_musict.png Binary files differnew file mode 100644 index 0000000..4e11243 --- /dev/null +++ b/docs/html/auto/images/assets/03_a_musict.png diff --git a/docs/html/auto/images/assets/03_b_voice.gif b/docs/html/auto/images/assets/03_b_voice.gif Binary files differnew file mode 100644 index 0000000..b280a9b --- /dev/null +++ b/docs/html/auto/images/assets/03_b_voice.gif diff --git a/docs/html/auto/images/assets/do_01_switcher.png b/docs/html/auto/images/assets/do_01_switcher.png Binary files differnew file mode 100644 index 0000000..b654a13 --- /dev/null +++ b/docs/html/auto/images/assets/do_01_switcher.png diff --git a/docs/html/auto/images/assets/do_02_music.png b/docs/html/auto/images/assets/do_02_music.png Binary files differnew file mode 100644 index 0000000..59fc8df --- /dev/null +++ b/docs/html/auto/images/assets/do_02_music.png diff --git a/docs/html/auto/images/assets/do_02_music_night.png b/docs/html/auto/images/assets/do_02_music_night.png Binary files differnew file mode 100644 index 0000000..7faccfb --- /dev/null +++ b/docs/html/auto/images/assets/do_02_music_night.png diff --git a/docs/html/auto/images/assets/do_03_more.png b/docs/html/auto/images/assets/do_03_more.png Binary files differnew file mode 100644 index 0000000..17040d1 --- /dev/null +++ b/docs/html/auto/images/assets/do_03_more.png diff --git a/docs/html/auto/images/assets/do_04_mdrawer.png b/docs/html/auto/images/assets/do_04_mdrawer.png Binary files differnew file mode 100644 index 0000000..de94c22 --- /dev/null +++ b/docs/html/auto/images/assets/do_04_mdrawer.png diff --git a/docs/html/auto/images/assets/do_05_template.png b/docs/html/auto/images/assets/do_05_template.png Binary files differnew file mode 100644 index 0000000..63a07d8 --- /dev/null +++ b/docs/html/auto/images/assets/do_05_template.png diff --git a/docs/html/auto/images/assets/do_05_template_night.png b/docs/html/auto/images/assets/do_05_template_night.png Binary files differnew file mode 100644 index 0000000..6acd259 --- /dev/null +++ b/docs/html/auto/images/assets/do_05_template_night.png diff --git a/docs/html/auto/images/assets/do_06_gdrawer.png b/docs/html/auto/images/assets/do_06_gdrawer.png Binary files differnew file mode 100644 index 0000000..b02c0e6 --- /dev/null +++ b/docs/html/auto/images/assets/do_06_gdrawer.png diff --git a/docs/html/auto/images/assets/do_07_notif.png b/docs/html/auto/images/assets/do_07_notif.png Binary files differnew file mode 100644 index 0000000..50ea565 --- /dev/null +++ b/docs/html/auto/images/assets/do_07_notif.png diff --git a/docs/html/auto/images/figure01.png b/docs/html/auto/images/figure01.png Binary files differnew file mode 100644 index 0000000..3044020 --- /dev/null +++ b/docs/html/auto/images/figure01.png diff --git a/docs/html/auto/images/hero.jpg b/docs/html/auto/images/hero.jpg Binary files differnew file mode 100644 index 0000000..34b5b5d --- /dev/null +++ b/docs/html/auto/images/hero.jpg diff --git a/docs/html/auto/images/logos/apps/iheartradio.png b/docs/html/auto/images/logos/apps/iheartradio.png Binary files differnew file mode 100644 index 0000000..8feb38d --- /dev/null +++ b/docs/html/auto/images/logos/apps/iheartradio.png diff --git a/docs/html/auto/images/logos/apps/joyride.png b/docs/html/auto/images/logos/apps/joyride.png Binary files differnew file mode 100644 index 0000000..8c2897e --- /dev/null +++ b/docs/html/auto/images/logos/apps/joyride.png diff --git a/docs/html/auto/images/logos/apps/mlb.png b/docs/html/auto/images/logos/apps/mlb.png Binary files differnew file mode 100644 index 0000000..ddde4cd --- /dev/null +++ b/docs/html/auto/images/logos/apps/mlb.png diff --git a/docs/html/auto/images/logos/apps/pandora.png b/docs/html/auto/images/logos/apps/pandora.png Binary files differnew file mode 100644 index 0000000..13fa1d3 --- /dev/null +++ b/docs/html/auto/images/logos/apps/pandora.png diff --git a/docs/html/auto/images/logos/apps/pocketcasts.png b/docs/html/auto/images/logos/apps/pocketcasts.png Binary files differnew file mode 100644 index 0000000..5227937 --- /dev/null +++ b/docs/html/auto/images/logos/apps/pocketcasts.png diff --git a/docs/html/auto/images/logos/apps/songza.png b/docs/html/auto/images/logos/apps/songza.png Binary files differnew file mode 100644 index 0000000..3bd7107 --- /dev/null +++ b/docs/html/auto/images/logos/apps/songza.png diff --git a/docs/html/auto/images/logos/apps/spotify.png b/docs/html/auto/images/logos/apps/spotify.png Binary files differnew file mode 100644 index 0000000..d039fd3 --- /dev/null +++ b/docs/html/auto/images/logos/apps/spotify.png diff --git a/docs/html/auto/images/logos/apps/stitcher.png b/docs/html/auto/images/logos/apps/stitcher.png Binary files differnew file mode 100644 index 0000000..b77da12 --- /dev/null +++ b/docs/html/auto/images/logos/apps/stitcher.png diff --git a/docs/html/auto/images/logos/apps/tunein.png b/docs/html/auto/images/logos/apps/tunein.png Binary files differnew file mode 100644 index 0000000..137ba81 --- /dev/null +++ b/docs/html/auto/images/logos/apps/tunein.png diff --git a/docs/html/auto/images/logos/apps/umano.png b/docs/html/auto/images/logos/apps/umano.png Binary files differnew file mode 100644 index 0000000..7b59f95 --- /dev/null +++ b/docs/html/auto/images/logos/apps/umano.png diff --git a/docs/html/auto/images/logos/auto/abarth.png b/docs/html/auto/images/logos/auto/abarth.png Binary files differnew file mode 100644 index 0000000..fd1d228 --- /dev/null +++ b/docs/html/auto/images/logos/auto/abarth.png diff --git a/docs/html/auto/images/logos/auto/acura.png b/docs/html/auto/images/logos/auto/acura.png Binary files differnew file mode 100644 index 0000000..4ba69cc --- /dev/null +++ b/docs/html/auto/images/logos/auto/acura.png diff --git a/docs/html/auto/images/logos/auto/alpharomeo.png b/docs/html/auto/images/logos/auto/alpharomeo.png Binary files differnew file mode 100644 index 0000000..51c8c58 --- /dev/null +++ b/docs/html/auto/images/logos/auto/alpharomeo.png diff --git a/docs/html/auto/images/logos/auto/audi.png b/docs/html/auto/images/logos/auto/audi.png Binary files differnew file mode 100644 index 0000000..86cb06b --- /dev/null +++ b/docs/html/auto/images/logos/auto/audi.png diff --git a/docs/html/auto/images/logos/auto/bentley.png b/docs/html/auto/images/logos/auto/bentley.png Binary files differnew file mode 100644 index 0000000..ed8cf47 --- /dev/null +++ b/docs/html/auto/images/logos/auto/bentley.png diff --git a/docs/html/auto/images/logos/auto/chevrolet.png b/docs/html/auto/images/logos/auto/chevrolet.png Binary files differnew file mode 100644 index 0000000..e0980b0 --- /dev/null +++ b/docs/html/auto/images/logos/auto/chevrolet.png diff --git a/docs/html/auto/images/logos/auto/chrysler.png b/docs/html/auto/images/logos/auto/chrysler.png Binary files differnew file mode 100644 index 0000000..c670c19 --- /dev/null +++ b/docs/html/auto/images/logos/auto/chrysler.png diff --git a/docs/html/auto/images/logos/auto/datsun.png b/docs/html/auto/images/logos/auto/datsun.png Binary files differnew file mode 100644 index 0000000..059ffd8 --- /dev/null +++ b/docs/html/auto/images/logos/auto/datsun.png diff --git a/docs/html/auto/images/logos/auto/dodge.png b/docs/html/auto/images/logos/auto/dodge.png Binary files differnew file mode 100644 index 0000000..4d6fcc0 --- /dev/null +++ b/docs/html/auto/images/logos/auto/dodge.png diff --git a/docs/html/auto/images/logos/auto/fiat.png b/docs/html/auto/images/logos/auto/fiat.png Binary files differnew file mode 100644 index 0000000..b9783d9 --- /dev/null +++ b/docs/html/auto/images/logos/auto/fiat.png diff --git a/docs/html/auto/images/logos/auto/ford.png b/docs/html/auto/images/logos/auto/ford.png Binary files differnew file mode 100644 index 0000000..86a2670 --- /dev/null +++ b/docs/html/auto/images/logos/auto/ford.png diff --git a/docs/html/auto/images/logos/auto/honda.png b/docs/html/auto/images/logos/auto/honda.png Binary files differnew file mode 100644 index 0000000..62ee38f --- /dev/null +++ b/docs/html/auto/images/logos/auto/honda.png diff --git a/docs/html/auto/images/logos/auto/hyundai.png b/docs/html/auto/images/logos/auto/hyundai.png Binary files differnew file mode 100644 index 0000000..4744641 --- /dev/null +++ b/docs/html/auto/images/logos/auto/hyundai.png diff --git a/docs/html/auto/images/logos/auto/infinity.png b/docs/html/auto/images/logos/auto/infinity.png Binary files differnew file mode 100644 index 0000000..a20e0a0 --- /dev/null +++ b/docs/html/auto/images/logos/auto/infinity.png diff --git a/docs/html/auto/images/logos/auto/jeep.png b/docs/html/auto/images/logos/auto/jeep.png Binary files differnew file mode 100644 index 0000000..024c3d1 --- /dev/null +++ b/docs/html/auto/images/logos/auto/jeep.png diff --git a/docs/html/auto/images/logos/auto/kia.png b/docs/html/auto/images/logos/auto/kia.png Binary files differnew file mode 100644 index 0000000..f8046d9 --- /dev/null +++ b/docs/html/auto/images/logos/auto/kia.png diff --git a/docs/html/auto/images/logos/auto/maserati.png b/docs/html/auto/images/logos/auto/maserati.png Binary files differnew file mode 100644 index 0000000..22bcf6a --- /dev/null +++ b/docs/html/auto/images/logos/auto/maserati.png diff --git a/docs/html/auto/images/logos/auto/mazda.png b/docs/html/auto/images/logos/auto/mazda.png Binary files differnew file mode 100644 index 0000000..2281c90 --- /dev/null +++ b/docs/html/auto/images/logos/auto/mazda.png diff --git a/docs/html/auto/images/logos/auto/mitsubishi.png b/docs/html/auto/images/logos/auto/mitsubishi.png Binary files differnew file mode 100644 index 0000000..1405b19 --- /dev/null +++ b/docs/html/auto/images/logos/auto/mitsubishi.png diff --git a/docs/html/auto/images/logos/auto/nissan.png b/docs/html/auto/images/logos/auto/nissan.png Binary files differnew file mode 100644 index 0000000..63bc4f7 --- /dev/null +++ b/docs/html/auto/images/logos/auto/nissan.png diff --git a/docs/html/auto/images/logos/auto/opel.png b/docs/html/auto/images/logos/auto/opel.png Binary files differnew file mode 100644 index 0000000..7e25ed5 --- /dev/null +++ b/docs/html/auto/images/logos/auto/opel.png diff --git a/docs/html/auto/images/logos/auto/ram.png b/docs/html/auto/images/logos/auto/ram.png Binary files differnew file mode 100644 index 0000000..9702587 --- /dev/null +++ b/docs/html/auto/images/logos/auto/ram.png diff --git a/docs/html/auto/images/logos/auto/renault.png b/docs/html/auto/images/logos/auto/renault.png Binary files differnew file mode 100644 index 0000000..65a4ae3 --- /dev/null +++ b/docs/html/auto/images/logos/auto/renault.png diff --git a/docs/html/auto/images/logos/auto/seat.png b/docs/html/auto/images/logos/auto/seat.png Binary files differnew file mode 100644 index 0000000..9802ccf --- /dev/null +++ b/docs/html/auto/images/logos/auto/seat.png diff --git a/docs/html/auto/images/logos/auto/skoda.png b/docs/html/auto/images/logos/auto/skoda.png Binary files differnew file mode 100755 index 0000000..7bc06b0 --- /dev/null +++ b/docs/html/auto/images/logos/auto/skoda.png diff --git a/docs/html/auto/images/logos/auto/subaru.png b/docs/html/auto/images/logos/auto/subaru.png Binary files differnew file mode 100644 index 0000000..7407e61 --- /dev/null +++ b/docs/html/auto/images/logos/auto/subaru.png diff --git a/docs/html/auto/images/logos/auto/suzuki.png b/docs/html/auto/images/logos/auto/suzuki.png Binary files differnew file mode 100644 index 0000000..85fd7e5 --- /dev/null +++ b/docs/html/auto/images/logos/auto/suzuki.png diff --git a/docs/html/auto/images/logos/auto/volkswagen.png b/docs/html/auto/images/logos/auto/volkswagen.png Binary files differnew file mode 100644 index 0000000..febadf4 --- /dev/null +++ b/docs/html/auto/images/logos/auto/volkswagen.png diff --git a/docs/html/auto/images/logos/auto/volvo.png b/docs/html/auto/images/logos/auto/volvo.png Binary files differnew file mode 100644 index 0000000..683af26 --- /dev/null +++ b/docs/html/auto/images/logos/auto/volvo.png diff --git a/docs/html/auto/images/logos/hard/alpine.png b/docs/html/auto/images/logos/hard/alpine.png Binary files differnew file mode 100644 index 0000000..55f0e8a --- /dev/null +++ b/docs/html/auto/images/logos/hard/alpine.png diff --git a/docs/html/auto/images/logos/hard/clarion.png b/docs/html/auto/images/logos/hard/clarion.png Binary files differnew file mode 100644 index 0000000..2288b99 --- /dev/null +++ b/docs/html/auto/images/logos/hard/clarion.png diff --git a/docs/html/auto/images/logos/hard/cloudcar.png b/docs/html/auto/images/logos/hard/cloudcar.png Binary files differnew file mode 100644 index 0000000..9e7e8b7 --- /dev/null +++ b/docs/html/auto/images/logos/hard/cloudcar.png diff --git a/docs/html/auto/images/logos/hard/delphi.png b/docs/html/auto/images/logos/hard/delphi.png Binary files differnew file mode 100644 index 0000000..a2a03de --- /dev/null +++ b/docs/html/auto/images/logos/hard/delphi.png diff --git a/docs/html/auto/images/logos/hard/freescale.png b/docs/html/auto/images/logos/hard/freescale.png Binary files differnew file mode 100644 index 0000000..2909944 --- /dev/null +++ b/docs/html/auto/images/logos/hard/freescale.png diff --git a/docs/html/auto/images/logos/hard/fujitsuten.png b/docs/html/auto/images/logos/hard/fujitsuten.png Binary files differnew file mode 100644 index 0000000..70269e3 --- /dev/null +++ b/docs/html/auto/images/logos/hard/fujitsuten.png diff --git a/docs/html/auto/images/logos/hard/harman.png b/docs/html/auto/images/logos/hard/harman.png Binary files differnew file mode 100644 index 0000000..0fb295a --- /dev/null +++ b/docs/html/auto/images/logos/hard/harman.png diff --git a/docs/html/auto/images/logos/hard/jvc.png b/docs/html/auto/images/logos/hard/jvc.png Binary files differnew file mode 100644 index 0000000..6a9c7ad --- /dev/null +++ b/docs/html/auto/images/logos/hard/jvc.png diff --git a/docs/html/auto/images/logos/hard/kenwood.png b/docs/html/auto/images/logos/hard/kenwood.png Binary files differnew file mode 100644 index 0000000..3c80098 --- /dev/null +++ b/docs/html/auto/images/logos/hard/kenwood.png diff --git a/docs/html/auto/images/logos/hard/lg.png b/docs/html/auto/images/logos/hard/lg.png Binary files differnew file mode 100644 index 0000000..52feeff --- /dev/null +++ b/docs/html/auto/images/logos/hard/lg.png diff --git a/docs/html/auto/images/logos/hard/panasonic.png b/docs/html/auto/images/logos/hard/panasonic.png Binary files differnew file mode 100644 index 0000000..b6aaaf1 --- /dev/null +++ b/docs/html/auto/images/logos/hard/panasonic.png diff --git a/docs/html/auto/images/logos/hard/parrot.png b/docs/html/auto/images/logos/hard/parrot.png Binary files differnew file mode 100644 index 0000000..d5bf41f --- /dev/null +++ b/docs/html/auto/images/logos/hard/parrot.png diff --git a/docs/html/auto/images/logos/hard/pioneer.png b/docs/html/auto/images/logos/hard/pioneer.png Binary files differnew file mode 100644 index 0000000..307d71a --- /dev/null +++ b/docs/html/auto/images/logos/hard/pioneer.png diff --git a/docs/html/auto/images/logos/hard/renesas.png b/docs/html/auto/images/logos/hard/renesas.png Binary files differnew file mode 100644 index 0000000..69ecab7 --- /dev/null +++ b/docs/html/auto/images/logos/hard/renesas.png diff --git a/docs/html/auto/images/logos/hard/symphonyteleca.png b/docs/html/auto/images/logos/hard/symphonyteleca.png Binary files differnew file mode 100644 index 0000000..0b3ebe5 --- /dev/null +++ b/docs/html/auto/images/logos/hard/symphonyteleca.png diff --git a/docs/html/auto/images/logos/hard/texasinstruments.png b/docs/html/auto/images/logos/hard/texasinstruments.png Binary files differnew file mode 100644 index 0000000..87d80cb --- /dev/null +++ b/docs/html/auto/images/logos/hard/texasinstruments.png diff --git a/docs/html/auto/index.jd b/docs/html/auto/index.jd new file mode 100644 index 0000000..116f26d --- /dev/null +++ b/docs/html/auto/index.jd @@ -0,0 +1,490 @@ +page.title=Android Auto +page.viewport_width=970 +fullpage=true +no_footer_links=true +page.type=about + +@jd:body + +<style> +.fullpage>#footer, +#jd-content>.content-footer.wrap { + display:none; +} +#hero-height { + height:calc(100% - 100px); +} +.img-logo { + margin:0 auto; + display:block; + margin-bottom:-28px !important; +} +.img-logo-thin { + margin:0 auto; + display:block; + margin-bottom:-55px !important; +} +.col-5 { + width:170px; +} +.auto-img-container-cols { + position:relative; + margin-bottom:25px; + margin-top:25px; +} +.auto-img-frame-cols { + z-index:2; + position:relative; + width:460px; +} +.auto-img-shot-cols { + width:447px; + position:absolute; + top:8px; + left:7px; + z-index:1; +} +.sdk-link { + font-size:16px; + padding-left:5px; + padding-right:15px; +} +.sdk-link-title { + font-size:18px; + padding-left:5px; + padding-right:15px; +} +.sdk-link-desc { + font-size:14px; + padding-left:5px; + padding-right:15px; +} +</style> + + +<div class="landing-body-content"> + <div class="landing-hero-container"> + + <div id="hero-height" class="landing-section auto-hero"> + <div class="landing-hero-scrim"></div> + <div class="landing-hero-wrap"> + <div class="vertical-center-outer"> + <div class="vertical-center-inner"> + + <div class="col-10"> + <div class="landing-section-header"> + <div class="landing-h1 hero">Android Auto</div> + <div class="landing-subhead hero">Entertainment and services on your dashboard</div> + <div class="landing-hero-description"> + <p style="width:450px">Display and control your Android app in vehicles. + Integrate your content with easy-to-use APIs and let Android Auto take + care of the rest.</p> + </div> + + <div class="landing-body"> + <a href="{@docRoot}auto/overview.html" class="landing-button landing-primary" + style="margin-top:40px;"> + Developer Overview + </a> + </div> + </div> + </div> + </div> + </div> <!-- end .wrap --> + + <div class="landing-scroll-down-affordance"> + <a class="landing-down-arrow" href="#android-in-car"> + <img src="{@docRoot}wear/images/carrot.png" alt="Scroll down to read more"> + </a> + </div> + </div> <!-- end .landing-section .landing-hero --> + </div> <!-- end .landing-hero-container --> + + <div class="landing-rest-of-page"> + + <div class="landing-section landing-gray-background" id="android-in-car"> + <div class="wrap"> + <div class="landing-section-h1"> + <div class="landing-h1">Extending Android to Cars</div> + </div> + <div class="landing-body"> + <div class="landing-subhead">Android Auto brings the Android experience to + cars with apps like Google Now and Maps.</div> + <div class="cols"> + <div class="col-8"> + <div class="auto-img-container-cols"> + <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/01_b_now.png" /> + </div> + </div> + <div class="col-8"> + <div class="auto-img-container-cols"> + <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/01_a_maps.png" /> + </div> + </div> + </div> + + <p>When users connect their Android phones to compatible vehicles, Android Auto + shows a standard interface that lets them start enabled apps and services. + Android Auto locks the handheld device when connected, so drivers + interact with Auto by using the vehicle's input controls, touch display, and voice.</p> + </p> + </div> + </div> <!-- end .wrap --> + </div> <!-- end .landing-section --> + + + <div class="landing-section"> + <div class="wrap"> + <div class="landing-section-header"> + <div class="landing-h1">Build for One Platform</div> + <div class="landing-subhead">Create apps with the Android APIs you're familiar with + and extend them to cars with the Auto SDK. + </div> + </div> + + <div class="landing-body"> + + <div class="cols"> + <div class="col-8"> + <div class="auto-img-container-cols"> + <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/02_b_switcher.gif" /> + </div> + </div> + <div class="col-8"> + <div class="auto-img-container-cols"> + <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/02_a_notif.gif" /> + </div> + </div> + </div> + <p>Write your apps without having + to worry about vehicle-specific hardware differences like screen resolution, software + interfaces, knobs, and touch controls. Your users get the same experience on any compatible + vehicle such as a consistent app launcher and system events such as notifications.</p> + </div> + </div> <!-- end .wrap --> + </div> <!-- end .landing-section --> + + + <div class="landing-section landing-gray-background"> + <div class="wrap"> + <div class="landing-section-header"> + <div class="landing-h1">Minimize Distraction</div> + <div class="landing-subhead"> + Android Auto displays different UIs for several app categories that let users focus on the road. + </div> + </div> + <div class="landing-body"> + <div class="cols"> + <div class="col-8"> + <div class="auto-img-container-cols"> + <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/03_b_voice.gif" /> + </div> + </div> + <div class="col-8"> + <div class="auto-img-container-cols"> + <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/03_a_musict.png" /> + </div> + </div> + </div> + <p>Android Auto defines the user interaction model for all + apps and let you hook into a standard UI with touch and voice controls. The interface + is designed to reduce driver distraction while still letting you customize and brand them to properly deliver your content. + </p> + </div> + </div> <!-- end .wrap --> + </div> <!-- end .landing-section --> + + <div class="landing-section" style="background-color:#f5f5f5"> + <div class="wrap"> + <div class="landing-section-header"> + <div class="landing-pre-h1">Coming soon</div> + <div class="landing-h1">Android Auto SDK</div> + </div> + + <div class="landing-body"> + <p>In the coming months, we’ll be releasing the Android Auto SDK, which includes APIs + and tools to make your existing apps compatible with Android Auto. The first version + of the SDK will provide APIs for music, podcast, live radio, and audio + news apps, as well as limited voice actions.</p> + + <div class="cols" style="margin-top:40px"> + <div class="col-3-wide"> + <p class="sdk-link-title">Updates</p> + <p class="sdk-link-desc"> + Register to receive more information and be notified when the SDK is available. + </p> + <a class="sdk-link" href="https://docs.google.com/a/google.com/forms/d/1ANgYOoYLkfyZ2JRPSU34Nep5yNaU-Ha2syXJ9b4xLrA/viewform">Sign up for updates</a> + </div> + <div class="col-3-wide"> + <p class="sdk-link-title">Google+ Community</p> + <p class="sdk-link-desc"> + Stay involved, get updates, and exchange experiences with other developers. + </p> + <a class="sdk-link" href="http://g.co/androidautodev">Discuss on Google+</a> + </div> + <div class="col-3-wide"> + <p class="sdk-link-title">Developer Overview</p> + <p class="sdk-link-desc"> + Learn more about developing apps for Android Auto when the SDK is available. + </p> + <a class="sdk-link" href="{@docRoot}auto/overview.html">Learn about the platform</a> + </div> + </div> + </div> + + </div> <!-- end .wrap --> + </div> <!-- end .landing-section --> + + + + <div class="landing-section landing-gray-background" > + <div class="wrap"> + <div class="landing-section-header"> + <div class="landing-h1">See What Others Have Done</div> + <div class="landing-subhead">We're working with developers to bring many popular apps + to Android Auto</div> + </div> + <div class="landing-body"> + <div class="cols"> + + <div class="col-4"> + <img src="{@docRoot}auto/images/logos/apps/joyride.png" + width="160" height="160" class="img-logo" /> + </div> + <div class="col-4"> + <img src="{@docRoot}auto/images/logos/apps/mlb.png" + width="160" height="160" class="img-logo" /> + </div> + <div class="col-4"> + <img src="{@docRoot}auto/images/logos/apps/pandora.png" + width="160" height="160" class="img-logo" /> + </div> + <div class="col-4"> + <img src="{@docRoot}auto/images/logos/apps/pocketcasts.png" + width="160" height="160" class="img-logo" /> + </div> + </div> + <div class="cols"> + <div class="col-4"> + <img src="{@docRoot}auto/images/logos/apps/songza.png" + width="160" height="160" class="img-logo" /> + </div> + <div class="col-4"> + <img src="{@docRoot}auto/images/logos/apps/stitcher.png" + width="160" height="160" class="img-logo" /> + </div> + <div class="col-4"> + <img src="{@docRoot}auto/images/logos/apps/tunein.png" + width="160" height="160" class="img-logo" /> + </div> + <div class="col-4"> + <img src="{@docRoot}auto/images/logos/apps/umano.png" + width="160" height="160" class="img-logo" /> + </div> + </div> + <div class="cols" style="margin-top:40px"> + <div class="col-4"> + <img src="{@docRoot}auto/images/logos/apps/iheartradio.png" + width="160" height="160" class="img-logo" /> + </div> + <div class="col-12"> + <p><em> + "The Android Auto APIs provide an easy way to integrate the most important features and functionality of iHeartRadio’s robust music service into a safety-minded automotive infotainment solution. The process was seamless, utilizing a flexible construct that allowed us to quickly adapt our existing product without losing any of the core experience our listeners know and love."</em></p> + </div> + </div> + <div class="cols" style="margin-top:60px"> + + <div class="col-4"> + <img src="{@docRoot}auto/images/logos/apps/spotify.png" + width="160" height="160" class="img-logo" /> + </div> + <div class="col-12"><p style="margin-top:20px"><em> + "Android Auto offers Spotify the exciting opportunity to easily enable safe access to millions of songs while driving. We were able to quickly develop for the platform using the new Android voice and media API extensions. As a result, Android users will soon be able to continue the Spotify experience in their cars, including being able to play any song, artist, album or playlist by voice.</em></p> + </div> + </div> + </div> + </div> <!-- end .wrap --> + </div> <!-- end .landing-section --> + + + + + <div class="landing-section landing-white-background"> + <div class="wrap"> + <div class="landing-section-header"> + <div class="landing-h1">Building an Ecosystem</div> + </div> + <div class="landing-body landing-align-center"> + <div class="landing-subhead"> + Android Auto is coming soon to new cars from these manufacturers + </div> + </div> + <div class="cols"> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/abarth.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/alpharomeo.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/acura.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/audi.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/bentley.png" + width="120" height="120" class="img-logo" /> + </div> + </div> + <div class="cols"> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/chevrolet.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/chrysler.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/dodge.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/fiat.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/ford.png" + width="120" height="120" class="img-logo" /> + </div> + </div> + <div class="cols"> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/honda.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/hyundai.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/infinity.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/jeep.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/kia.png" + width="120" height="120" class="img-logo" /> + </div> + </div> + <div class="cols"> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/maserati.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/mazda.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/mitsubishi.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/nissan.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/opel.png" + width="120" height="120" class="img-logo" /> + </div> + </div> + <div class="cols"> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/ram.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/renault.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/seat.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/skoda.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/subaru.png" + width="120" height="120" class="img-logo" /> + </div> + </div> + <div class="cols"> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/suzuki.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/volkswagen.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <img src="{@docRoot}auto/images/logos/auto/volvo.png" + width="120" height="120" class="img-logo" /> + </div> + <div class="col-5"> + <!--<img src="/auto/images/logos/auto/skoda.png" + width="120" height="120" class="img-logo" />--> + </div> + <div class="col-5"> + <!--<img src="/auto/images/logos/auto/skoda.png" + width="120" height="120" class="img-logo" />--> + </div> + </div> + </div> + </div> + </div> <!-- end .landing-rest-of-page --> + <div class="content-footer wrap" itemscope="" itemtype="http://schema.org/SiteNavigationElement" + style="border-top: none;"> + <div class="layout-content-col col-16" style="padding-top:4px"> + <style>#___plusone_0 {float:right !important;}</style> + <div class="g-plusone" data-size="medium"></div> + </div> + </div> + <div id="footer" class="wrap" style="width:940px;position:relative;top:-35px;z-index:-1"> + <div id="copyright"> + Except as noted, this content is + licensed under <a href="http://creativecommons.org/licenses/by/2.5/"> + Creative Commons Attribution 2.5</a>. For details and + restrictions, see the <a href="{@docRoot}license.html">Content + License</a>. + </div> + </div> + </div> <!-- end .landing-hero-container --> + + <script> + $("a.landing-down-arrow").on("click", function(e) { + $("body").animate({ + scrollTop: $(".auto-hero").height() + 120 + }, 1000, "easeOutQuint"); + e.preventDefault(); + }); + </script> + +</div> <!-- end landing-body-content --> diff --git a/docs/html/auto/overview.jd b/docs/html/auto/overview.jd new file mode 100644 index 0000000..cf63b98 --- /dev/null +++ b/docs/html/auto/overview.jd @@ -0,0 +1,411 @@ +fullpage=true +page.viewport_width=970 +no_footer_links=true +excludeFromSuggestions=true +page.metaDescription=Android Auto + +@jd:body + +<style> +.jd-descr { + height:auto; +} +#copyright { + margin-top:-35px; +} +.auto-img-container { + position:relative; +} +.auto-img-frame { + z-index:2; + position:relative; +} +.auto-img-shot { + position:absolute; + top:9px; + left:8px; + z-index:1; +} +.auto-img-container-cols { + position:relative; + margin-top:10px; +} +.auto-img-frame-cols { + width:380px; + z-index:2; + position:relative; +} +.auto-img-shot-cols { + width:369px; + position:absolute; + top:7px; + left:6px; + z-index:1; +} +.auto-col-2 { + width:380px; + display: inline; + float: left; + margin-left: 10px; + margin-right: 10px; +} +.auto-img-container-single { + width:380px; + margin:0 auto; + margin-top:20px; +} +</style> + +<div style="width:780px; margin:0 auto;"> + +<div id="qv-wrapper"> +<div id="qv"> +<h2>In this document</h2> +<ol> + <li><a href="#design">Design</a> + <ol> + <li><a href="#designprinciples">Design Principles</a></li> + <li><a href="#uioverview">UI Overview</a></li> + </ol> + </li> + <li><a href="#architecture">Architecture</a></li> + <li><a href="#ui">User Interface</a> + <ol> + <li><a href="#launchapp">Launch App</a></li> + <li><a href="#useractions">User Actions</a></li> + <li><a href="#drawertransitions">Drawer Transitions</a></li> + <li><a href="#daynighttransitions">Day and Night Transitions</a></li> + <li><a href="#customizeui">Customizing the UI</a></li> + </ol> + </li> + <li><a href="#devprocess">Development Process</a></li> + <li><a href="#emulator">Testing Your App</a></li> + <li><a href="#running">Running Your App</a></li> +</ol> +</div> +</div> + +<h1>Android Auto Developer Overview</h1> + +<p>Android Auto extends the Android platform into the car. When users connect +their Android handheld device to a compatible vehicle, Android Auto provides a car-optimized +Android experience on the vehicle's screen. Users interact with compatible apps and services +through voice actions and the vehicle's input controls.</p> + +<p>The Android Auto SDK lets you easily extend your existing apps to work in the car, without +having to worry about vehicle-specific hardware differences. You can use many Android APIs and +services you are already familiar with. Android Auto provides an easy to use UI model and +supports notifications and voice actions:</p> + +<dl> +<dt style="margin-bottom:10px"><strong>Media UI</strong></dt> +<dd style="margin-bottom:20px"> +Android Auto defines interaction models and car-specific UI patterns for apps. The +first version of Android Auto supports media apps, such as music, podcast, live radio, and +audio news apps. +</dd> +<dt style="margin-bottom:10px"><strong>Notifications</strong></dt> +<dd style="margin-bottom:20px"> +The platform will integrate with existing Android APIs for notifications. Users will get +car appropiate notifications from Android apps on the vehicle's screen.</dd> + +<dt style="margin-bottom:10px"><strong>Voice Actions</strong></dt> +<dd style="margin-bottom:20px"> +Android Auto supports a set of voice actions to interact with compatible apps and services. +Apps can respond to the voice actions they're interested in, such as playing a particular song +or taking a note.</dd> + +<dt style="margin-bottom:10px"><strong>Easy Development Workflow</strong></dt> +<dd style="margin-bottom:20px"> +To extend an existing Android app for Android Auto, you implement a set of interfaces and +services defined in the platform. You can reuse existing functionality and many Android APIs +you already know.</dd> +</dl> + +<p>We’ll release the Android Auto SDK in the coming months, which will let you test your +Android Auto experience on a regular Android device.</p> + + +<h2 id="design">Design</h2> + +<p>Android Auto extends users' digital ecosystem into their cars, allowing drivers to stay +connected to their virtual worlds while staying focused on the road ahead.</p> + +<p>Because driving is the primary activity in the car, any digital experiences should be designed +to complement and augment that activity. They should never demand the user's attention.</p> + +<p>Designing for cars is fundamentally different than designing for phones or tablets, and +requires rethinking how experiences unfold. Because attention is limited and not all tasks are +possible in the car, effective apps leverage the entire set of devices that drivers have, +leveraging the app experience on those devices, outside of the car, to set the stage for simple +experiences while driving.</p> + +<p>Android Auto experiences are:</p> + +<p><strong>Glanceable and simple</strong>. Driving requires users' full attention. In-car software +should not. Android Auto was designed to simplify not only the UI, but to optimize interactions +and require less thinking, induce lower cognitive load, and ultimately, be safer. Effective apps +provide just enough information in the minimum amount of time the user needs to glance at it and +return their attention back to the road. Apps should also reduce the number of features to only +those that are safe and drive-appropriate.</p> + +<p><strong>Predictive, yet predictable</strong>. Android Auto leverages rich, contextual awareness +to keep the driver informed about important situations during the drive. Rich, timely help is +combined with predictable functions. Effective apps make use of the patterns for common tasks and +show timely information only when relevant.</p> + +<p><strong>Connected</strong>. By leveraging the user's personal ecosystem of apps and services, +Android Auto promotes a continuous experience from phone to car to other devices. The user's +music, destinations, and virtual ecosystem are always available to augment the drive. Experiences +that leverage personal context and other devices are naturally part of Android Auto.</p> + +<p><strong>Naturally integrated</strong>. Android Auto blends the user's apps with the car, +creating a truly integrated experience that leverages what is unique about each car. By using +the screens, controls, and capabilities of the vehicle, Android Auto feels like an extension of +the car.</p> + + + + +<h2 id="architecture">Architecture</h2> + +<p>The Android Auto app shows your app's customized UI on the vehicle's screen. To communicate +with the Android Auto app, your media app implements a set of media interfaces.</p> + +<div style="width:750px;margin:0 auto"> +<img src="{@docRoot}auto/images/figure01.png" alt="" /> +<p class="img-caption"> + <strong>Figure 1</strong> - Architecture of Android Auto. +</p> +</div> + +<p>The architecture consists of the following components:</p> + +<p><strong>Media App</strong> - Runs a media service that exposes content through browsing and +playback APIs. The service provides content to the Android Auto app. This is your Android app.</p> + +<p><strong>Android Auto App</strong> - Creates the UI and handles user interactions. +This app uses a media client to request content from the media service running in the media +app. The client requests data from the media service and monitors service states.</p> + +<p><strong>Vehicle Display</strong> - Shows app content and supports user interaction via +on-screen soft buttons and other components, such as physical buttons or steering +wheel controls.</p> + +<p>Android media apps must implement binders to these APIs:</p> + +<ul> +<li><strong>Browsing</strong> - Enables a media client to browse a hierarchy of a user’s +media collection, presented as a virtual file system with containers (similar to directories) +and items (similar to files).</li> +<li><strong>Playback</strong> - Enables a media client to control media playback and monitor +playback state through callbacks.</li> +</ul> + + +<h2 id="ui">User Interface</h2> + +<p>The Android Auto app uses a car-specific UI model to display content and user interaction +opportunities. Android Auto provides you with a standard UI designed to minimize driver +distraction. You do not have to test a custom UI for for driver distraction, which is a +lengthy and expensive process involving multiple legislations across the globe and different +standards for each vehicle OEM.</p> + +<p>The UI defines interfaces for browsing, searching, and listening to content from +media apps. You can customize the UI colors, action icons, background images, and more.</p> + +<h3 id="launchapp">Launcher</h3> + +<p>The launcher shows all the compatible media apps installed on the user’s +Android device and lets users select one of them from an scrollable list:</p> + +<div class="auto-img-container-single"> + <div class="auto-img-container"> + <img class="auto-img-frame-cols" src="/auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="/auto/images/assets/do_01_switcher.png" /> + </div> + <p class="img-caption" style="margin-top:0px"> + <strong>Figure 2.</strong> The launcher. + </p> +</div> + +<h3>Primary App UI</h3> + +<p>After the user selects a media app, the display shows the primary app UI. +You can customize this UI to show your own icons, app name, and +background images. Figure 3 shows an example of a customized UI:</p> + +<div class="cols"> +<div class="auto-col-2"> + <div class="auto-img-container-cols"> + <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/do_05_template.png" /> + </div> +</div> +<div class="auto-col-2"> + <div class="auto-img-container-cols"> + <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/do_02_music.png" /> + </div> +</div> +</div> +<p class="img-caption"> + <strong>Figure 3.</strong> A customized UI. +</p> + + + +<h3 id="useractions">User Actions</h3> + +<p>The primary app UI supports four main actions on the action bar, four auxiliary actions +on the overflow bar, and the <em>Return</em> action. You can use standard controls and customize +the actions and icons, as shown in Figure 4.</p> + +<div class="auto-img-container-single"> + <div class="auto-img-container"> + <img class="auto-img-frame-cols" src="/auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="/auto/images/assets/do_03_more.png" /> + </div> + <p class="img-caption" style="margin-top:0px"> + <strong>Figure 4.</strong> Custom extra actions. + </p> +</div> + +<h3 id="drawertransitions">Drawer Transitions</h3> + +<p>For browse actions, the display shows the drawer transition as shown in Figure 5.</p> + +<div class="cols"> +<div class="auto-col-2"> + <div class="auto-img-container-cols"> + <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/do_06_gdrawer.png" /> + </div> +</div> +<div class="auto-col-2"> + <div class="auto-img-container-cols"> + <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/do_04_mdrawer.png" /> + </div> +</div> +</div> +<p class="img-caption"> + <strong>Figure 5.</strong> Generic and customized drawers. +</p> + +<p>After the transition from the primary app UI to the drawer UI, the drawer +appears on the center. The customized drawer UI shows the media containers and +media files provided by the media service in your app. You can also customize drawers +with icons for list items.</p> + + +<h3 id="daynighttransitions">Day and Night Transitions</h3> + +<p>All the UIs support different color schemes for day and night. +The platform provides the state (day or night) and makes adjustments automatically.</p> + +<div class="cols"> +<div class="auto-col-2"> + <div class="auto-img-container-cols"> + <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/do_02_music.png" /> + </div> +</div> +<div class="auto-col-2"> + <div class="auto-img-container-cols"> + <img class="auto-img-frame-cols" src="{@docRoot}auto/images/assets/00_frame.png" /> + <img class="auto-img-shot-cols" src="{@docRoot}auto/images/assets/do_02_music_night.png" /> + </div> +</div> +</div> +<p class="img-caption"> + <strong>Figure 6.</strong> Day and night modes. +</p> + +<h3 id="customizeui">Customizing UIs</h3> + +<p>To customize the UI, you provide the following app-specific resources and actions +to the Android Auto media client:</p> + +<ul> +<li><strong>Resources</strong> - App logo, app name, theme colors, and background images.</li> +<li><strong>Actions</strong> - Multiple custom actions; for example: <em>Thumbs Up/Down</em>, +<em>Favorite</em>, and <em>Bookmark</em>. These actions are app-specific.</li> +</ul> + +<p>If provided, the media client automatically uses them in the UI.</p> + + +<h2 id="devprocess">Development Process</h2> + +<p class="note"><strong>Note:</strong> When released, the Android Auto SDK will provide +media service interfaces, an APK for handheld devices that simulates the Android Auto +app, and other tools for Android Auto development.</p> + +<p>To create a media app for Android Auto, you include an Android service in your app +that implements the media service interfaces provided by the Android Auto SDK. These +interfaces define functionality for browsing and finding content, playing media, +customizing the UI, and performing app-specific actions.</p> + +<p>The media service interfaces present the content library as a navigable tree and enable +clients to play media, get album art, obtain theme resources for the UI, and +invoke app-specific actions.</p> + +<p>You don’t have to create a new app for Android Auto: you can extend your existing +Android app with implementations of the media service interfaces. Your service exposes +your app’s media content, theme resources, and app-specific actions using the methods and +data types specified by the media service interfaces. This simplifies the development +cycle because:</p> + +<ul> +<li>You do not have to maintain a separate project for Android Auto</li> +<li>You can reuse existing functionality from your Android app</li> +</ul> + +<p>The Android Auto client presents the customized UI to users and invokes the +functionality from your service as needed. This has two additional advantages:</p> + +<ul> +<li>Your app does not implement a UI for Android Auto</li> +<li>Your app does not manage user interactions directly</li> +</ul> + +<p>This also means that you do not have to worry about vehicle-specific hardware +differences such as screen resolutions, software interfaces, knobs and touch +controls.</p> + + +<h2 id="emulator">Testing Your App on an Android Device</h2> + +<p>The Android Auto SDK includes an APK with a media client implementation, which is +similar to those available in compatible vehicles. To test your app with this +client:</p> + +<ol> +<li>Get an Android device with a similar form factor to a dashboard screen (like a +Nexus 7).</li> +<li>Configure the device for Android development.</li> +<li>Install the APK for the media client from the Android Auto SDK on the device.</li> +<li>Install the APK for your app on the device.</li> +<li>Open the media client app from the Android Auto SDK on the device.</li> +<li>Select your app from the list of available services.</li> +</ol> + +<p>The customized UI for your app appears on the client. You can navigate the content +library and play media. If your app provides app-specific actions, these actions appear +in the UI controls.</p> + + +<h2 id="running">Running Your App on Android Auto</h2> + +<p>Media apps are available on the Google Play Store for compatible Android devices. +When users connect their Android device to a compatible vehicle, the +Android Auto media client shows a list of all the Android apps installed on the phone +that implement the media service interfaces.</p> + +<p>When users select one of these apps, the Android Auto media client uses the app’s +service to respond to user input and invoke the methods in the media service interfaces +to build the UI, navigate the content library, and play media.</p> + +<div style="margin-bottom:40px"> </div> +</div> diff --git a/docs/html/community/index.html b/docs/html/community/index.html index eeb1c51..e3834ba 100644 --- a/docs/html/community/index.html +++ b/docs/html/community/index.html @@ -34,6 +34,9 @@ href="//fonts.googleapis.com/css?family=Roboto:regular,medium,thin,italic,medium </script> <style> +#header { + padding: 2.2em 0 0.2em 0; +} #header-wrap h1 { margin:0; padding:0; diff --git a/docs/html/design/auto/index.jd b/docs/html/design/auto/index.jd new file mode 100644 index 0000000..aac79ab --- /dev/null +++ b/docs/html/design/auto/index.jd @@ -0,0 +1,35 @@ +page.title=Auto +@jd:body + +<style> +.auto-img-container-cols { + position:relative; + margin-bottom:25px; + margin-top:25px; +} +.auto-img-frame-cols { + z-index:2; + position:relative; +} +.auto-img-shot-cols { + position:absolute; + top:5px; + left:2px; + z-index:1; +} +</style> + +<div class="auto-img-container-cols" style="float:right; margin:0 0 40px 40px;width:460px"> + <img class="auto-img-frame-cols" src="/auto/images/assets/00_frame.png"> + <img class="auto-img-shot-cols" src="/auto/images/assets/03_a_musict.png"> +</div> + +<p>Android Auto is <strong>coming soon</strong> and brings apps to the car, +integrating with the vehicle's input controls and display.</p> + +<p>The future design guidelines provide templates that define the user interaction model for all apps and let you hook into a standard UI with touch and voice controls. The templates meet international best practices for reducing driver distraction while still letting you customize and brand them to properly deliver your content.</p> + +<p><a href="{@docRoot}auto/index.html">Learn more about Android Auto</a>.</p> + + + diff --git a/docs/html/design/design_toc.cs b/docs/html/design/design_toc.cs index 4c2aab2..885f336 100644 --- a/docs/html/design/design_toc.cs +++ b/docs/html/design/design_toc.cs @@ -5,7 +5,26 @@ <ul> <li><a href="<?cs var:toroot ?>design/get-started/creative-vision.html">Creative Vision</a></li> <li><a href="<?cs var:toroot ?>design/get-started/principles.html">Design Principles</a></li> - <li><a href="<?cs var:toroot ?>design/get-started/ui-overview.html">UI Overview</a></li> + </ul> + </li> + + <li class="nav-section"> + <div class="nav-section-header"><a href="<?cs var:toroot ?>design/devices.html">Devices</a></div> + <ul> + <li><a href="<?cs var:toroot ?>design/handhelds/index.html">Phones & Tablets</a></li> + <li class="nav-section"> + <div class="nav-section-header"> + <a href="<?cs var:toroot ?>design/wear/index.html">Wear</a></div> + <ul> + <li><a href="<?cs var:toroot ?>design/wear/creative-vision.html">Creative Vision</a></li> + <li><a href="<?cs var:toroot ?>design/wear/principles.html">Design Principles</a></li> + <li><a href="<?cs var:toroot ?>design/wear/structure.html">App Structure</a></li> + <li><a href="<?cs var:toroot ?>design/wear/patterns.html">UI Patterns</a></li> + <li><a href="<?cs var:toroot ?>design/wear/style.html">Style</a></li> + </ul> + </li> + <li><a href="<?cs var:toroot ?>design/tv/index.html">TV</a></li> + <li><a href="<?cs var:toroot ?>design/auto/index.html">Auto</a></li> </ul> </li> diff --git a/docs/html/design/devices.jd b/docs/html/design/devices.jd new file mode 100644 index 0000000..0015d01 --- /dev/null +++ b/docs/html/design/devices.jd @@ -0,0 +1,37 @@ +page.title=Devices +page.viewport_width=970 +section.landing=true +header.hide=1 +footer.hide=1 +@jd:body + +<style> +#landing-graphic-container { + position: relative; +} + +#text-overlay { + position: absolute; + left: 0; + top: 420px; + width: 360px; + +} +#hero-image { +} +</style> + +<div id="landing-graphic-container"> + <div id="text-overlay"> + <p itemprop="description">The device-centric UI principles, overviews, and detailed guidelines + described here build on the core <a href="{@docRoot}design/get-started/principles.html">Android Design Principles</a> + to provide more specific design guidance for different form factors. + </p> + <p> + <a href="{@docRoot}design/handhelds/index.html" class="landing-page-link">Phones & Tablets</a></p> + </div> + <a id="hero-image" href="{@docRoot}design/handhelds/index.html"> + <img src="{@docRoot}design/media/device_family.png"> + </a> +</div> + diff --git a/docs/html/design/get-started/creative-vision.jd b/docs/html/design/get-started/creative-vision.jd index 1ce305a..9261c6e 100644 --- a/docs/html/design/get-started/creative-vision.jd +++ b/docs/html/design/get-started/creative-vision.jd @@ -6,10 +6,10 @@ page.title=Creative Vision <div class="vspace size-1"> </div> <p itemprop="description"> - We focused the design of Android around three overarching goals, which apply - to our core apps as well as the system at large. As you design apps to work - with Android, consider these goals: <em>Enchant me</em>, <em>Simplify my - life</em>, and <em>Make me amazing</em> + Starting with Ice Cream Sandwich, we focused the design of + Android around these three overarching goals, which apply + to our core apps as well as the system at large. + As you work with Android, consider these goals. </p> <div class="vspace size-1"> </div> diff --git a/docs/html/design/get-started/principles.jd b/docs/html/design/get-started/principles.jd index 0b7147b..73ec3a6 100644 --- a/docs/html/design/get-started/principles.jd +++ b/docs/html/design/get-started/principles.jd @@ -1,9 +1,16 @@ -page.title=Design Principles +page.title=Android Design Principles @jd:body -<p>These design principles were developed by and for the Android User Experience Team to keep users' -best interests in mind. Consider them as you apply your own creativity and design thinking. Deviate -with purpose.</p> +<p>These design principles were developed by and for the Android +User Experience Team to keep users' best interests in mind. +For Android developers and designers, they continue to +underlie the more detailed design guidelines for different +types of devices.</p> + +<p> +Consider these principles as you apply your own +creativity and design thinking. Deviate with purpose. +</p> <h2 id="enchant-me">Enchant Me</h2> diff --git a/docs/html/design/get-started/ui-overview.jd b/docs/html/design/handhelds/index.jd index 5f4c40f..882b070 100644 --- a/docs/html/design/get-started/ui-overview.jd +++ b/docs/html/design/handhelds/index.jd @@ -1,12 +1,20 @@ -page.title=UI Overview +page.title=Phones & Tablets @jd:body -<p>Android's system UI provides the framework on top of which you build your app. Important aspects -include the Home screen experience, global device navigation, and notifications.</p> -<p>Your app will play an important part in keeping the overall Android experience consistent and -enjoyable to use. At the end of this chapter we introduce the main elements for achieving this goal -in your app.</p> -<p>Read on for a quick overview of the most important aspects of the Android user interface.</p> +<p> +Android's system UI provides the framework on top of which you build your app, +whether you're designing for phones, tablets, watches, or other form factors. +Aspects of UI that are especially important for phones and tablets include +the Home screen experience, global device navigation, and notifications. +</p> + +<p> +Your app will play an important part in keeping the overall Android experience +consistent and enjoyable to use. This page introduces some of the main elements +that can help you achieve this goal. The main Android Design topics listed on +the left, after the Devices sections, provide detailed guidelines for phones +and tablets. +</p> <h2 id="home-all-apps-recents">Home, All Apps, and Recents</h2> diff --git a/docs/html/design/index.jd b/docs/html/design/index.jd index cb7dd4f..27e3169 100644 --- a/docs/html/design/index.jd +++ b/docs/html/design/index.jd @@ -13,7 +13,7 @@ footer.hide=1 #text-overlay { position: absolute; - left: 36px; + left: 0; top: 42px; width: 266px; @@ -34,5 +34,15 @@ footer.hide=1 <a id="hero-image" href="/design/get-started/creative-vision.html"> <img src="/design/media/index_landing_page.png"> </a> + +<div style="background: hsl(8, 70%, 54%); margin: 0; padding: 20px 20px 10px 20px;color: #fff; position: absolute;top: 255px;width: 179px;"> +<h2 style="color: #fff;margin:0 0 10px; font-size:18px" class="norule">L Developer Preview</h2> +<p> The next version of Android uses a design +metaphor inspired by paper and ink that provides a reassuring sense of tactility. Before it arrives for users, you can get an early +look at the new Material design. +</p> +<p><a class="white" href="{@docRoot}preview/material/index.html">Learn more about Material</a></p> +</div> + </div> diff --git a/docs/html/design/media/device_family.png b/docs/html/design/media/device_family.png Binary files differnew file mode 100644 index 0000000..7889884 --- /dev/null +++ b/docs/html/design/media/device_family.png diff --git a/docs/html/design/media/wear/1D_picker.png b/docs/html/design/media/wear/1D_picker.png Binary files differnew file mode 100644 index 0000000..46c6bf6 --- /dev/null +++ b/docs/html/design/media/wear/1D_picker.png diff --git a/docs/html/design/media/wear/2D_picker.png b/docs/html/design/media/wear/2D_picker.png Binary files differnew file mode 100644 index 0000000..82c766a --- /dev/null +++ b/docs/html/design/media/wear/2D_picker.png diff --git a/docs/html/design/media/wear/2D_picker_action.png b/docs/html/design/media/wear/2D_picker_action.png Binary files differnew file mode 100644 index 0000000..8560ef8 --- /dev/null +++ b/docs/html/design/media/wear/2D_picker_action.png diff --git a/docs/html/design/media/wear/Bluebird.png b/docs/html/design/media/wear/Bluebird.png Binary files differnew file mode 100644 index 0000000..447e643 --- /dev/null +++ b/docs/html/design/media/wear/Bluebird.png diff --git a/docs/html/design/media/wear/action_button.png b/docs/html/design/media/wear/action_button.png Binary files differnew file mode 100644 index 0000000..dfdffa3 --- /dev/null +++ b/docs/html/design/media/wear/action_button.png diff --git a/docs/html/design/media/wear/action_on_card.png b/docs/html/design/media/wear/action_on_card.png Binary files differnew file mode 100644 index 0000000..d0b0fff --- /dev/null +++ b/docs/html/design/media/wear/action_on_card.png diff --git a/docs/html/design/media/wear/assets_specifics.png b/docs/html/design/media/wear/assets_specifics.png Binary files differnew file mode 100644 index 0000000..35a3819 --- /dev/null +++ b/docs/html/design/media/wear/assets_specifics.png diff --git a/docs/html/design/media/wear/bridgednotifications.jpg b/docs/html/design/media/wear/bridgednotifications.jpg Binary files differnew file mode 100644 index 0000000..a9e57a4 --- /dev/null +++ b/docs/html/design/media/wear/bridgednotifications.jpg diff --git a/docs/html/wear/images/circle_message2.png b/docs/html/design/media/wear/circle_message2.png Binary files differindex 63b7839..63b7839 100644 --- a/docs/html/wear/images/circle_message2.png +++ b/docs/html/design/media/wear/circle_message2.png diff --git a/docs/html/design/media/wear/clear_bold_type.jpg b/docs/html/design/media/wear/clear_bold_type.jpg Binary files differnew file mode 100644 index 0000000..e4b742c --- /dev/null +++ b/docs/html/design/media/wear/clear_bold_type.jpg diff --git a/docs/html/design/media/wear/confirmation.png b/docs/html/design/media/wear/confirmation.png Binary files differnew file mode 100644 index 0000000..513b85f --- /dev/null +++ b/docs/html/design/media/wear/confirmation.png diff --git a/docs/html/design/media/wear/contextualnotification.png b/docs/html/design/media/wear/contextualnotification.png Binary files differnew file mode 100644 index 0000000..1ec7ac8 --- /dev/null +++ b/docs/html/design/media/wear/contextualnotification.png diff --git a/docs/html/design/media/wear/continue_phone.png b/docs/html/design/media/wear/continue_phone.png Binary files differnew file mode 100644 index 0000000..fed93b6 --- /dev/null +++ b/docs/html/design/media/wear/continue_phone.png diff --git a/docs/html/design/media/wear/copywrite.png b/docs/html/design/media/wear/copywrite.png Binary files differnew file mode 100644 index 0000000..78be0bd --- /dev/null +++ b/docs/html/design/media/wear/copywrite.png diff --git a/docs/html/design/media/wear/countdown.png b/docs/html/design/media/wear/countdown.png Binary files differnew file mode 100644 index 0000000..11b1504 --- /dev/null +++ b/docs/html/design/media/wear/countdown.png diff --git a/docs/html/design/media/wear/customlayout.jpg b/docs/html/design/media/wear/customlayout.jpg Binary files differnew file mode 100644 index 0000000..9573cfc --- /dev/null +++ b/docs/html/design/media/wear/customlayout.jpg diff --git a/docs/html/design/media/wear/dismiss_cards.png b/docs/html/design/media/wear/dismiss_cards.png Binary files differnew file mode 100644 index 0000000..2e2d53b --- /dev/null +++ b/docs/html/design/media/wear/dismiss_cards.png diff --git a/docs/html/design/media/wear/expandable_stacks.png b/docs/html/design/media/wear/expandable_stacks.png Binary files differnew file mode 100644 index 0000000..edc2456 --- /dev/null +++ b/docs/html/design/media/wear/expandable_stacks.png diff --git a/docs/html/wear/images/fitness-24.png b/docs/html/design/media/wear/fitness.png Binary files differindex 3cf2f3c..3cf2f3c 100644 --- a/docs/html/wear/images/fitness-24.png +++ b/docs/html/design/media/wear/fitness.png diff --git a/docs/html/design/media/wear/low_info_card.png b/docs/html/design/media/wear/low_info_card.png Binary files differnew file mode 100644 index 0000000..a3ebf16 --- /dev/null +++ b/docs/html/design/media/wear/low_info_card.png diff --git a/docs/html/design/media/wear/peek_card.png b/docs/html/design/media/wear/peek_card.png Binary files differnew file mode 100644 index 0000000..2b12297 --- /dev/null +++ b/docs/html/design/media/wear/peek_card.png diff --git a/docs/html/design/media/wear/selection_list.png b/docs/html/design/media/wear/selection_list.png Binary files differnew file mode 100644 index 0000000..dcb0745 --- /dev/null +++ b/docs/html/design/media/wear/selection_list.png diff --git a/docs/html/design/media/wear/separate_info_cards.jpg b/docs/html/design/media/wear/separate_info_cards.jpg Binary files differnew file mode 100644 index 0000000..d4cb386 --- /dev/null +++ b/docs/html/design/media/wear/separate_info_cards.jpg diff --git a/docs/html/design/media/wear/separate_info_cards_1.jpg b/docs/html/design/media/wear/separate_info_cards_1.jpg Binary files differnew file mode 100644 index 0000000..b987aea --- /dev/null +++ b/docs/html/design/media/wear/separate_info_cards_1.jpg diff --git a/docs/html/design/media/wear/separate_info_cards_2.jpg b/docs/html/design/media/wear/separate_info_cards_2.jpg Binary files differnew file mode 100644 index 0000000..1930cb8 --- /dev/null +++ b/docs/html/design/media/wear/separate_info_cards_2.jpg diff --git a/docs/html/design/media/wear/single_action_controls.jpg b/docs/html/design/media/wear/single_action_controls.jpg Binary files differnew file mode 100644 index 0000000..ef89da0 --- /dev/null +++ b/docs/html/design/media/wear/single_action_controls.jpg diff --git a/docs/html/design/media/wear/voice_commands.png b/docs/html/design/media/wear/voice_commands.png Binary files differnew file mode 100644 index 0000000..9839ed8 --- /dev/null +++ b/docs/html/design/media/wear/voice_commands.png diff --git a/docs/html/design/tv/index.jd b/docs/html/design/tv/index.jd new file mode 100644 index 0000000..5534724 --- /dev/null +++ b/docs/html/design/tv/index.jd @@ -0,0 +1,15 @@ +page.title=TV +@jd:body + + +<img src="{@docRoot}preview/tv/design/images/atv-home.jpg" + width="460" height="283" style="float:right;margin:0 0 40px 40px" /> + + +<p>Android TV is <strong>coming soon</strong> and lets you engage your users in a new, shared environment.</p> + +<p>Users bring a specific set of expectations to the experience of watching TV, versus interacting +with a phone or tablet. So find out how to get your app ready for its big-screen debut +later this year by reading the +<a href="{@docRoot}preview/tv/design/index.html">Android TV Design Guide</a> +in the L Developer Preview.</p>
\ No newline at end of file diff --git a/docs/html/design/wear/creative-vision.jd b/docs/html/design/wear/creative-vision.jd new file mode 100644 index 0000000..4530744 --- /dev/null +++ b/docs/html/design/wear/creative-vision.jd @@ -0,0 +1,36 @@ +page.title=Creative Vision for Wear +@jd:body + + +<p>Android Wear devices provide just the right information at just the right time, +allowing users to be more connected to both the virtual world and the real world. Great Android +Wear experiences are:</p> + + +<div class="layout-content-row"> + <div class="layout-content-col span-6"> + <h4>Launched automatically</h4> + <p>Most people are used to launching apps by clicking an icon. Android Wear is different. Wearable apps are aware of the user’s context - time, location, physical activity, and so on. The apps use this information to insert cards into the stream when they become relevant. This makes Android Wear timely, relevant and very specific.</p> + </div> + <div class="layout-content-col span-6" style="margin-left:75px"> + <h4>Glanceable</h4> + <p>A classic wrist watch is designed to let you see the time in a split second and get on with what you were doing. Designing for Android Wear is no different. The less time it takes to use your software, the more time the user can be present in whatever they are doing. Android wear is fast, sharp and immediate.</p> + </div> +</div> + + +<div class="layout-content-row"> + <div class="layout-content-col span-6"> + <h4>Zero or low interaction</h4> + <p>Staying true to the strengths afforded by a smaller form factor, Android Wear focuses on simple interactions, only requiring input by the user when absolutely necessary. Most inputs are based around touch swipes or voice, and inputs requiring fine-grained finger movements are avoided. Android Wear is gestural, simple, and fast.</p> + </div> + <div class="layout-content-col span-6" style="margin-left:75px"> + <h4>All about suggest and demand</h4> + <p>Android Wear is like a great personal assistant: it knows you and your preferences, it only interrupts you when absolutely necessary, and it’s always on hand to provide a ready answer. Android Wear is helpful, respectful, and responsive.</p> + </div> +</div> + +<p>By providing a smart connection to the rest of the world while respecting the user’s attention, Android Wear feels personal and global, simple and smart, unobtrusive and ever-ready. Applications that represent these principles will feel most at home in the overall Android Wear experience.</p> + +<p>Third party apps extend Android Wear to be more specialized and helpful throughout the day. Installing apps are a way for the user to tell the Android Wear how to do that.</p> + diff --git a/docs/html/design/wear/index.jd b/docs/html/design/wear/index.jd new file mode 100644 index 0000000..3536445 --- /dev/null +++ b/docs/html/design/wear/index.jd @@ -0,0 +1,67 @@ +page.title=Wear +@jd:body + + + +<p>Designing apps for wearables powered by Android Wear +is substantially different than designing for phones or +tablets: different strengths and weaknesses, different use cases, different ergonomics. +To get started, you should understand the overall vision for the Android Wear experience, +and how apps fit into and enhance this experience.</p> + +<p>A new form factor deserves a new UI model. At a high level, the Android Wear UI consists of two +main spaces centered around the core functions of <strong>Suggest</strong> and +<strong>Demand</strong>. Your app will have an important role to play in both of these +spaces.</p> + + + +<h2 id="Stream">Suggest: The Context Stream</h2> + +<div class="framed-wear-square" style="float:right;margin:0 -22px 60px 40px"> + <img src="{@docRoot}wear/images/screens/stream.gif"> +</div> + +<p>The context stream is a vertical list of cards, each showing a useful or timely piece of information. Much like the Google Now feature on Android phones and tablets, users swipe vertically to navigate from card to card. Only one card is displayed at a time, and background photos are used to provide additional visual information. Your application can create cards and inject them into the stream when they are most likely to be useful.</p> + +<p>This UI model ensures that users don’t have to launch many different applications to check for updates; they can simply glance at their stream for a brief update on what’s important to them.</p> + +<p>Cards in the stream are more than simple notifications. They can be swiped horizontally to reveal additional pages. Further horizontal swiping may reveal buttons, allowing the user to take action on the notification. Cards can also be dismissed by swiping left to right, removing them from the stream until the next time the app has useful information to display.</p> + + + + +<h2 id="CueCard">Demand: The Cue Card</h2> + +<div class="framed-wear-square" style="float:right;margin:0 -22px 60px 40px"> + <img src="{@docRoot}wear/images/screens/cuecard.gif"> +</div> + +<p>For cases where Android Wear does not suggest an answer proactively through the context stream, the cue card allows users to speak to Google. The cue card is opened by saying, “OK Google†or by tapping on the background of the home screen. Swiping up on the cue card shows a list of suggested voice commands, which can also be tapped.</p> + +<p>At a technical level, each suggested voice command activates a specific type of intent. As a developer, you can match your applications to some of these intents so that users can complete tasks using these voice commands. Multiple applications may register for a single voice intent, and the user will have the opportunity to choose which application they prefer to use.</p> + +<p>Applications can respond to a voice command in the same way as they can respond to a tap on a regular in-stream action button: by adding or updating a stream card, or by launching a full screen application. Voice input often takes the form of a command, such as "remind me to get milk," in which case a simple confirmation animation is sufficient to display before automatically returning to the Context Stream.</p> + + +<h2 id="Other">Other UI Features</h2> + +<ul> +<li>The <strong>Home screen</strong> is the default state of the device and features: + <ul> + <li>The background, showing either content relating to the first card or a custom watch face design, depending on the watch face the user has chosen. Tapping anywhere on the background or saying "Ok Google" starts a voice query. + <li>Status indicators, showing connectivity, charging status, airplane mode, and in some watch faces a count of unread items. + <li>The top ranked card in the Context Stream, peeking up at the bottom of the screen. The amount of the peek card that appears is determined by the current watch face. + </ul> +</li> + +<li><strong>Watch faces</strong> may be chosen by the user to appear in the background of the Home screen. Watch faces display the time and accommodate the top ranked peek card. The user can choose a different watch face by long pressing on the current one.</li> + +<li>Some devices may enter a low-power <strong>Ambient Mode</strong> when not being used. This usually involves dimming the screen in some way. The contents of a peek card will automatically be optimized for display in this state. Users can exit ambient mode by tapping on the screen, by tilting the screen towards them, or by pressing a hardware button if one exists.</li> + +<li>Swiping down on the Home screen reveals the <strong>Date and Battery</strong> display. Dragging further down toggles <strong>Mute mode</strong>, preventing interruptive notifications from vibrating and illuminating the screen.</li> + +<li>The <strong>Settings screen</strong> can be invoked from the cue card or on some devices using a hardware button. From here the user may shut down or restart their device, adjust screen brightness, toggle airplane mode, and access device information.</li> + +<li><strong>Full screen apps</strong> can be launched on top of the main stream where a wider range of interaction is called for. Although not stylistically limited to the context stream pattern, apps should respect the same design principles as the rest of the system. For more information, see the <a href="{@docRoot}design/wear/structure.html">App Structure</a> guide.</li> +</ul>
\ No newline at end of file diff --git a/docs/html/design/wear/patterns.jd b/docs/html/design/wear/patterns.jd new file mode 100644 index 0000000..8f4698c --- /dev/null +++ b/docs/html/design/wear/patterns.jd @@ -0,0 +1,150 @@ +page.title=UI Patterns for Wear +@jd:body + + + +<p>Android Wear is used for micro-interactions, and so adhering to consistent design patterns that users are already accustomed to is paramount.</p> + +<h2>Cards</h2> + +<p>Cards in the stream can take slightly different forms:</p> + +<div class="framed-wear-square-small" style="float:left;margin:0 20px 20px 0"> + <img src="{@docRoot}design/media/wear/Bluebird.png"> +</div> + +<div class="framed-wear-square-small" style="float:left;margin:0 20px 20px 0"> + <img src="{@docRoot}design/media/wear/single_action_controls.jpg"> +</div> + +<div class="framed-wear-square-small" style="float:left;margin:0 20px 20px 0"> + <img src="{@docRoot}design/media/wear/expandable_stacks.png"> +</div> + +<ul style="clear:both"> +<li>Standard cards for displaying information from a notification</li> +<li>Single-action controls (such as a play/pause toggle)</li> +<li>Expandable stack of cards, for grouping a set of related notifications together</li> +</ul> + + +<h2>App icons</h2> + +<div class="framed-wear-square-small" style="float:right;margin:0 0 20px 60px"> + <img src="{@docRoot}design/media/wear/clear_bold_type.jpg"> +</div> + +<p>App icons appear in a fixed position overhanging the edge at the top right of the card by default for all notifications in the Context Stream. This is an opportunity for cards to be recognized as coming from a specific source. Photo backgrounds should be used only to convey information, not to brand a card. App icons are necessary only on the leftmost card; it is not necessary to add the app icon to pages.</p> + +<h2 style="clear:both">Pages</h2> + +<div class="framed-wear-square-small" style="float:right;margin:0 0 20px 40px"> + <img src="{@docRoot}design/media/wear/separate_info_cards_2.jpg"> +</div> + +<div class="framed-wear-square-small" style="float:right;margin:0 0 20px 40px"> + <img src="{@docRoot}design/media/wear/separate_info_cards_1.jpg"> +</div> + +<p>Supplementary information should be displayed on additional cards to the right of a main Context Stream card. In most cases one additional detail card should be sufficient. For example, a weather card might show the weather for the current location today, with subsequent days listed in an additional card to the right. Keep the number of detail cards as low as possible. Actions (see below) should always come after pages; don’t change the order or interleave them.</p> + + +<h2 style="clear:both">Dismissing cards</h2> + + <img src="{@docRoot}design/media/wear/dismiss_cards.png" height="147"> + +<p>Swiping from left to right on a card causes it to be dismissed from the stream. Dismissed cards may return when they next have relevant information. State is synced between the Android Wear context stream and the notifications on the Android handheld device, so dismissing from one causes an automatic dismissal from the other.</p> + + + +<h2 style="clear:both">Action buttons</h2> + +<div class="framed-wear-square-small" style="float:right;margin:0 0 20px 40px"> + <img src="{@docRoot}design/media/wear/action_button.png"> +</div> + +<p>Where the user may need to take action on the information shown in a notification, you can provide action buttons. These are system-rendered buttons that appear to the right of detail cards. They consist of a white icon set on a blue system-rendered circular button and a short caption with a verb. Actions should be limited to three for a single card row.</p> + +<p>Tapping on an action button can cause an action to be executed; or an action to be continued on the companion handheld; or a full screen activity to be invoked for further input (see “2D Picker†section below).</p> + +<p>Refer to the UI Toolkit provided in the Downloads section for detailed specs regarding action icons.</p> + + +<h2 style="clear:both">Action countdown and confirmation</h2> + +<div class="framed-wear-square-small" style="float:right;margin:0 0 20px 40px"> + <img src="{@docRoot}design/media/wear/countdown.png"> +</div> + +<p>Where tapping on an action button results in an action being executed, one of the following can happen:</p> + +<ol> +<li>The action is completed immediately and the result of the action is shown (either by updating the relevant card contents immediately, or by showing a confirmation animation).</li> +<li>A short countdown animation to completing the action is played, which the user can interrupt to cancel. Once the timer has counted down, a confirmation animation is played. This animation can be custom-designed by developers.</li> +<li>A confirmation step is required. This is for actions that are potentially damaging if accidentally triggered. A generic confirmation template is supplied by the system. Once the user confirms, the standard confirmation animation is played.</li> +<li>The cue card can be invoked to continue specifying the action. For example in a messaging application, tapping a “Reply†action button invokes the Cue Card and prompts for voice input. In this case the prompt label (such as “Speak your message…â€) and a set of sample voice suggestions can be specified by developers.</li> +</ol> + + +<h2 style="clear:both">Continuing activities on phone</h2> + +<div class="framed-wear-square-small" style="float:right;margin:0 0 20px 40px"> + <img src="{@docRoot}design/media/wear/continue_phone.png"> +</div> + +<p>Developers should attempt to perform actions on the wearable device wherever possible. In cases where the phone must be used, a generic animation should be played once the action button has been tapped and the corresponding Android app will open on the phone.</p> + + +<h2 style="clear:both">Actions on cards (such as media controls)</h2> + +<div class="framed-wear-square-small" style="float:right;margin:0 0 20px 40px"> + <img src="{@docRoot}design/media/wear/action_on_card.png"> +</div> + +<p>Some cards may benefit from having tappable actions directly on a card. Some guidance on when to use this pattern versus using an action button:</p> + +<ul> +<li>This pattern should be used when only one possible action could be reasonably expected. For example, tapping on an address with a car icon and ETA seems like it would very obviously launch directions. Conversely, if you see a contact's photo and name, it's not clear what tapping would do (call them? email them?), so the pattern shouldn't be used in this case.</li> +<li>On-card actions should not require a text label to be understood.</li> +<li>On-card actions should only result in something happening on the wearable (apart from web links to open them on the phone).</li> +<li>Only one action per card: no menus on a single card.</li> +</ul> + +<p>Good examples of using an action on card include: play / pause music; toggle light switch on and off; navigate to an address; call a phone number.</p> + + +<h2 style="clear:both">Card stacks</h2> +<img src="/wear/images/11_bundles_B.png" height="200" width="169" style="float:right;margin:0 0 20px 40px" alt=""> +<img src="/wear/images/11_bundles_A.png" height="200" width="169" style="float:right;margin:0 0 20px 40px" alt=""> +<p>Card stacks group related cards together and allow them to be progressively expanded vertically in the stream. A tap on a stack fans the cards out so that the top edge of each card can be seen. A subsequent tap on a fanned card reveals that card fully. Stacks of cards revert to a fully collapsed state once the user has swiped away from them.</p> + + + +<h2 style="clear:both">2D Picker</h2> + +<p>A 2D Picker component in your app can be invoked from the cue card or from an action button. It allows users to choose from a list of items, and optionally select an attribute of each item. For example, in response to a voice action to “buy tickets to a movie tonight,†you could show a 2D Picker with a vertical list of movies playing, with each movie having a horizontal list of showtimes.</p> + +<img src="{@docRoot}design/media/wear/2D_picker_action.png" width="500" alt=""> + +<p>In some instances, further information may be required. In these cases, the most probable default values for these choices should be chosen on the user’s behalf with the option to edit before completing the action. This pattern is in keeping with Android Wear’s core design principle of minimizing interactions required.</p> + + +<h2 style="clear:both">Voice commands</h2> + +<div class="framed-wear-square-small" style="float:right;margin:0 0 20px 40px"> + <img src="{@docRoot}design/media/wear/voice_commands.png"> +</div> + +<p>It is possible for apps to take action in response to Android voice commands that invoke intents. For example, an app can register for the “Take a note†intent and capture the subsequent voice input for processing. In the case where multiple apps registered for the same intent, user preference will be captured once and saved. Users can edit their intent preferences in the Android Wear app on their handheld.</p> + + +<h2 style="clear:both">Selection List</h2> + +<div class="framed-wear-square-small" style="float:right;margin:0 0 20px 40px"> + <img src="{@docRoot}design/media/wear/selection_list.png"> +</div> + +<p>Choosing an item from a list is a common interaction. The Selection List pattern (available as the WearableListView component) creates a simple list optimized for ease of use on a small screen: the focused item snaps to the center of the screen, and a single tap selects. This widget is recommended as a common pattern for selecting items. It is used throughout the system UI, including in the list that can be accessed by swiping up on the cue card.</p> + + +<p>Of course, it is possible for Android Wear apps to extend themselves beyond the familiarities of these patterns. For a deeper look at the options available, see the section on App Structure.</p> diff --git a/docs/html/design/wear/principles.jd b/docs/html/design/wear/principles.jd new file mode 100644 index 0000000..a214435 --- /dev/null +++ b/docs/html/design/wear/principles.jd @@ -0,0 +1,52 @@ +page.title=Design Principles for Wear +@jd:body + +<style> +p.try { + background:#e4e4e4; + padding:10px; +} +</style> + +<p>These design principles provide some simple heuristics about how you should plan and assess your +Android Wear app design.</p> + + +<h2>Focus on not stopping the user and all else will follow</h2> +<p>A watch is a perfect form factor for a device that you can use while doing something else, such as cooking, eating, walking, running, or even having a conversation. If using your wearable app causes the user to stop whatever they’re doing, it’s a good occasion to consider how to improve it using the principles in this section.</p> + +<p class="try"><strong>Try this:</strong> Time a typical use of your Wear app. If using it takes more than 5 seconds, you should think about making your app more focused. Also try using your app while you’re having a conversation, and see how it affects your train of thought and eye contact.</p> + + +<h2>Design for big gestures</h2> + +<p>When you swipe through photos on your phone you’re using a large area of the display, and you don’t have to be precise at all. That’s the best kind of interaction for a wearable device. Your users are going to use your app in all sorts of situations, the least frequent one might actually be sitting down at their desk.</p> + +<p class="try"><strong>Try this:</strong> Use your app in various everyday situations, such as walking, eating, talking to people, or ordering coffee. If you have to slow down while walking or stop the conversation to be precise, you should consider how your gestures could be bigger.</p> + +<h2>Think about stream cards first</h2> +<p>The best experience on a wearable device is when the right content is there just when the user needs it. You can figure out when to show your cards with sensors, or events happening in the cloud. For the cases where it’s impossible to know when the user needs your app, you can rely on a voice action or touch.</p> + +<p class="try"><strong>Try this:</strong> Make a list of all the situations a user would find your app useful. What do they have in common? Same location? Time of day? Certain physical activities? You will most likely come up with several different situations - that’s a good sign, because it means that you can specialize your cards to those situations. Remember that the user always has the option of completely muting your stream cards if they feel they aren’t relevant enough.</p> + + +<p>[image] </p> +<p class="img-caption">An app that offers to check in users could appear in the stream suggesting the most likely place nearby, after a certain amount of time.</p> + + +<h2>Do one thing, really fast</h2> +<p>While users will engage with your app for only a few seconds at time, they'll use it many times throughout the day. A well-designed stream card carries one bit of information and potentially offers a few action buttons when the user swipes over.</p> + +<p class="try"><strong>Try this:</strong> How many bits of information is there in your design? Is everything absolutely necessary, or could you split it up into separate cards? If you’re designing a card, don’t forget that you can use multiple pages.</p> + + +<h2>Design for the corner of the eye</h2> +<p>The longer the user is looking at your app, the more you are pulling them out of the real world. Thinking about how to design your app for glanceability can vastly help the user get full value from your app and quickly go back to what they were doing.</p> + +<p class="try"><strong>Try this:</strong> To view your app with your peripheral vision, try focusing on your knuckles while your watch is displaying the app. Do you get a sense of what it is trying to do? Is it distinguishable from other apps? Does the background image help conveying the message? Does it use photos or a distinct shape and color?</p> + +<h2> +Don’t be a constant shoulder tapper</h2> +<p>A watch constantly touches the user’s skin. Being this intimate, you want to buzz the watch fewer times than you’re used to on the phone.</p> + +<p class="try"><strong>Try this:</strong> Next time you’re in a conversation, imagine someone tapping you your shoulder, interrupting you with the information you want your app to deliver. If the information delivered did not justify suspending a conversation, you should not make the notification interruptive.</p>
\ No newline at end of file diff --git a/docs/html/design/wear/structure.jd b/docs/html/design/wear/structure.jd new file mode 100644 index 0000000..caeb119 --- /dev/null +++ b/docs/html/design/wear/structure.jd @@ -0,0 +1,116 @@ +page.title=App Structure for Wear +@jd:body + + +<p>As outlined in the <a href="{@docRoot}design/wear/creative-vision.html">Creative Vision</a>, +Android Wear apps do not adhere to the traditional mobile app model of touching an icon to launch into a self-contained experience. Rather, it is useful to think about the different spaces in the Android Wear UI and how your app might present itself across these spaces. For example, a typical app might begin by showing a notification card in the stream at a contextually relevant moment, then jump into a custom full screen UI for a micro-interaction, or maybe open the cue card to capture voice input that is then relayed back to the in-stream card.</p> + +<p>It’s important to make some fundamental decisions about how your users will interact with your app. There are a number of ways that functionality can manifest itself in Android Wear, and it is important to choose the places that provide maximum value and ease of use.</p> + +<p>For example, application functionality might show up in the following ways:</p> + +<ul> + <li>As a <strong>card in the main context stream</strong>: + <ul> + <li><strong>Bridged notifications</strong> are pushed to the wearable from the connected handheld (a phone or tablet) using the standard Android notifications framework. In general, bridged notifications mirror what’s happening on the handheld and use one of a predefined layout templates. Example: new message notification. + <li><strong>Contextual notifications</strong> are like smart notifications. They are generated locally on the wearable and appear at contextually relevant moments specificed by the app developer. Contextual notifications allow more freedom of control, allowing for custom layouts and dynamic updating of card contents. Example: live updating exercise stats. + </ul> + </li> + <li>As a <strong>full screen UI</strong> that temporarily overlays on top of the context stream: + <ul> + <li>The <strong>2D Picker</strong> is a simple design pattern (available in the SDK as a prebuilt component) aimed at asking the user to select from a set of items. This is a common interaction and a familiar pattern, so use of the familiar 2D Picker pattern is encouraged wherever possible. Example: choose from a set of artists and albums to play. + <li><strong>Custom layouts</strong> are also possible where apps need to extend beyond the basic card/stream metaphor. These apps should be distinctly separate from the core user experience in both appearance and interaction.</li> + </ul> + </li> +</ul> + + +<p>Apps can also open the cue card to capture voice input.</p> + +<p>Note that the different approaches above are listed in order of complexity. When designing your interactions, try to achieve them with the simplest approach possible. If your needs are more involved, move to the next level of complexity.</p> + +<p>Many applications will consist of a combination of these views, possibly with connections between them. For example, a contextual card may have an action that launches a more immersive experience. Inversely, an immersive experience may result in a card being added to the stream.</p> + +<p>Think of these different components as building blocks that can be snapped together into a single user flow. Avoid single monolithic full screen UIs that need to be launched and quit. Place simple notifications and ongoing information in the stream, and jump in and out of simple full screen activities to complete quick tasks before returning to the stream.</p> + +<p>In this section we will look at these different approaches and how combine them to create the best experience for your users.</p> + + +<h2 id="Bridged">Bridged Notifications</h2> + +<div class="framed-wear-square-small" style="float:right;margin:0 -22px 60px 40px"> + <img src="{@docRoot}design/media/wear/bridgednotifications.jpg"> +</div> + +<p>Bridged notifications are the simplest way of having content appear on an Android wearable. Since cards in the Android Wear stream are synced from the notifications on your connected handheld, any notifications created there automatically appear on Android Wear. Where appropriate, make sure to use the new APIs in the support library that enhance your app's notifications with features such as voice replies and notification pages.</p> + + + +<h2 id="Contextual">Contextual Notifications</h2> + +<p>Displaying information on contextual cards is at the core of the Android Wear user experience. Cards with focused trigger criteria appear at just the right time, delighting and assisting the user with timely, useful content. Refer to the Design principles section for details on how to think about triggering cards, and the UI overview section for a breakdown of the familiar system UI components that make up an entry in the context stream.</p> + +<p>An important aspect of creating contextual notifications is defining trigger conditions: what is the specific scenario in which your notification should appear? Think about using all sensor information available to you -- time, location, movement, identity, user habits and patterns, interaction with nearby devices, and more -- and describe the specific combination of sensor readings that should result in your app presenting itself.</p> + + +<img src="{@docRoot}design/media/wear/contextualnotification.png" width="500" alt="" /> + + +<p>For example, imagine you were building a running app. If the user is standing at the beginning of their regular running trail, at the time that they often go for a run, and we detect a running activity... they are probably going for a run! This would be a great time to present a contextual card that offers to track their run.</p> + +<p>Putting effort into getting your contextual triggering just right is one of the most impactful things you can do to create a delightful experience for your users.</p> + +<p>You may use the standard Android notifications framework to create cards using a range of provided templates, or draw your own ActivityView inside cards for a custom card layout. Make sure to refer to the Style section to make sure your custom ActivityView layouts are sympathetic to the overall design of cards in the stream. Use ActivityViews to create custom card layouts that are stylistically consistent with neighboring cards in the stream; do not invent entirely new or conflicting UI patterns inside cards.</p> + +<p>Contextual cards are ideal for situations where it may be useful to push information to the user, when the information may be useful on an ongoing basis or referred back to, or when context strongly indicates that the information is useful. Refer to the section on Respecting Users Attention in the Design Principles section for details on targeted triggering. Triggering too often or in unsuitable contexts will result in users being annoyed by your app.</p> + + + +<h2 id="Picker">2D Picker</h2> + +<p>The 2D Picker design pattern (available as the GridViewPager component) is useful for showing a range of options or asking a user to make a quick selection. Google search results on Android Wear are a great example of the GridViewPager pattern in action.</p> + +<p>A 2D Picker is called up as an overlay on the main UI by tapping a card or button, or through a voice action. It preserves the same look and feel as the main context stream, giving users a familiar and predictable set of interaction patterns to rely on.</p> + +<p>On Android Wear, the basic hierarchy is vertical-then-horizontal, never horizontal-then-vertical, with a recommended vertical limit of five cards. Each vertical slot may consist of one card, as in the Google results case, or multiple cards which may be swiped horizontally.</p> + +<img src="{@docRoot}design/media/wear/1D_picker.png" alt="" width="499px" /> +<p class="img-caption">This pattern can be used to present a single vertical list, or a “1D Pickerâ€</p> + +<img src="{@docRoot}design/media/wear/2D_picker.png" alt="" width:760px" /> +<p class="img-caption">It can also be used as a 2D matrix of options, as a way of presenting categorized options.</p> + +<p>This flexibility means that developers can choose to present a one or two-dimensional set of options. For example, a music app could use a vertical list to present a list of albums by a given artist (one dimension of options), and it could additionally allow each album slot to be horizontally swipeable to also choose a song from each album (a second dimension of options).</p> + +<p>Do not add buttons or pages to horizontal 2D Picker rows; rows should only be used to present a list or grid of similar options in this context. Provide a clear call to action on the card using the Action cards pattern detailed in the <a href="{@docRoot}design/wear/patterns.html">UI Patterns</a> guide.</p> + +<p>2D Picker should be automatically dismissed when a selection is made. It may also be exited by swiping back down on the first card, or by swiping left to right on a leftmost card.</p> + +<p>The simplicity of individual cards within a 2D Picker is a feature. Remember that in many cases the user may be on the go or attempting to complete a task as quickly as possible. As such, micro-interactions and familiar input mechanism are paramount, and using the already-familiar pattern of vertically-then-horizontally oriented cards gives users exactly what they want with as little fuss as possible. Strive to minimize the number of results or options that you present. Show the most popular or repeatedly-used options at the top of the list of cards to avoid scrolling. Learn the user's preferences and use context detection to put the most likely option for any given situation at the top. In general, optimize for fast task completion over excessive customization.</p> + + + +<h2 id="Custom">Custom Layouts</h2> + +<p>Some interactions may require a broader range of input mechanisms than is possible within the limitations of a card-based UI. For example, an app that allows for location selection may require the user to swipe in many directions before tapping to drop a pin. In cases like this, it is recommended to momentarily launch out of the context stream UI and present an immersive, full screen app with a custom layout.</p> + +<p>Custom full screen apps provides the benefit of flexibility: you can launch your own Android activity that takes up the entire screen, and capture all touch events, making a wide range of UIs possible.</p> + +<img src="{@docRoot}design/media/wear/customlayout.jpg" alt="" width="760px" /> + + +<p>However, be cautious of making this the default way of accessing your app’s functionality. Users will thank you for presenting your content in the familiar, simple environment of the context stream if it is possible to do so. Only enter full screen mode when the interactions required are not possible using the card UI. Full screen is a modal state to be entered for the purpose of achieving a specific task, and in most cases should be easily and quickly exited. You should use full screen apps to achieve a single, quick task within a broader user flow that hinges off the Context Stream. A great full screen experience will present itself quickly, ask for some user input, and then self-quit back to the stream.</p> + +<p>To avoid confusion, avoid using the specific styles and idioms of the context stream when designing immersive experiences. If you find yourself replicating the structure of the card layout, your should probably be using a 2D Picker. Make your immersive experience visually distinct. However, still adhere to the <a href="{@docRoot}design/wear/principles.html">Design Principles</a>, which apply universally to Android Wear interfaces.</p> + +<p>Because Android wearables do not feature a home or back button, exiting the application at the appropriate time is the responsibility of the app developer. Exiting always leads back to the context stream. Where possible, exit automatically or present the option to exit at logical break points using acknowledge/cancel buttons. For example:</p> + +<ol> +<li>A map view that allows the user to slide a map to drop a pin on a location should automatically exit when the pin has been placed.</li> +<li>A short game should automatically exit back to the stream at the end of each game.</li> +<li>A drawing app should display the option to exit after 5 seconds of inactivity.</li> +</ol> + +<p>Even with logical exit points like these, some cases may exist where the user may want to immediately initiate an exit. This may be particularly common in apps of longer duration. In all cases, the developer should <strong>present the option to quit the app on long press</strong> using DismissOverlayView. Your design should long press for the sole purpose of prompting to quit.</p> + +<p>Seamlessly and fluidly moving between the context stream and immersive mode makes your app feel like an integrated part of the Android Wear experience.</p>
\ No newline at end of file diff --git a/docs/html/design/wear/style.jd b/docs/html/design/wear/style.jd new file mode 100644 index 0000000..ed39bd6 --- /dev/null +++ b/docs/html/design/wear/style.jd @@ -0,0 +1,102 @@ +page.title=Style for Wear +@jd:body + + +<p>Here are a number of design considerations to bear in mind that are particular to Android Wear.</p> + +<h2 id="ScreenSize">Screen Size</h2> + +<img src="{@docRoot}design/media/wear/circle_message2.png" height="200" + style="float:right;margin:0 0 20px 60px"> + +<img src="{@docRoot}design/media/wear/fitness.png" height="200" + style="float:right;margin:0 0 20px 60px"> + +<p>Be mindful of different device sizes and shapes. Wearable devices are a form of fashion and expression for their owners, and so Android Wear supports a variety of forms. Most of the complexities of supporting these different devices is taken care of at a system level, but bear in mind different screen types when designing custom full screen apps.</p> + +<p>Use the Android Wear emulator to test both square and round devices, and note that <code>WatchViewStub</code> is available to activities to detect whether a square or round device is being used.</p> + + + + +<h2 id="Assets" style="clear:both">Specific Assets Required</h2> + +<img src="{@docRoot}design/media/wear/assets_specifics.png" width="300" + style="float:left;margin:0 60px 20px 0"> + +<p>A core set of standard assets may need to be provided depending on your card design: app icon, background image or images, action icons, actions confirmation animation. Of course, your specific design may necessitate other assets. Background image should be provided in landscape format at least 600px width for notifications that include pages of cards, since the system automatically adds a parallaxing effect.</p> + + + +<h2 id="PeekCard" style="clear:both">Peek Card Readability</h2> + +<img src="{@docRoot}design/media/wear/peek_card.png" width="300" + style="float:left;margin:0 60px 20px 0"> + +<p>Test your card layout to ensure that useful information is conveyed in the peek state on the Home screen. The main message of the card should be readable in the peek state, particularly for contextual cards. Content that requires an interaction to be read, for example a long message, should be cropped appropriately to provide an affordance to the user to swipe the card to read more.</p> + + + +<h2 id="InfoDensity" style="clear:both">Low Information Density</h2> + +<div class="framed-wear-square-small" style="float:right;margin:0 0 40px 60px"> + <img src="{@docRoot}design/media/wear/low_info_card.png"> +</div> + +<p>Cards should be designed to be glanceable in a split second, just like reading the time on a traditional watch. In most cases a pairing of an icon and value, or a title and short caption should be enough to convey a meaningful message. Note that the background photo should also be used to convey information; backgrounds that change to reflect and support the primary message in the card work great. For example, in the case illustrated above a suitable background image is chosen to reflect severity of the current traffic conditions. This is not just a nice piece of attention to detail; the background actually reinforces the message and makes the content more glanceable.</p> + + +<h2 id="Chunks" style="clear:both">Separate Information into Chunks</h2> + +<img src="{@docRoot}design/media/wear/separate_info_cards.jpg" width="400" + style="float:left;margin:0 60px 20px 0"> + +<p>In cases where additional information is absolutely necessary, don’t crowd out a card layout to the point where glanceability is affected. Instead, add an additional page (or multiple pages, if needed) to the right of the main card in the stream to which the user can swipe for more information. See also “Continuing activities on phoneâ€, below.</p> + + +<h2 id="KeepMinimum" style="clear:both">Keep Notifications to a Minimum</h2> + +<p>Don’t abuse the user’s attention. Active notifications (that is, those that cause the device to vibrate) should only be used in cases that are both timely and involve a contact, for example receiving a message from a friend. Non-urgent notifications should be silently added to the Context Stream. See also the general Android Notifications Guidelines.</p> + + +<h2 id="Typography" style="clear:both">Use Clear, Bold Typography</h2> + +<div class="framed-wear-square-small" style="float:right;margin:0 0 60px 40px"> + <img src="{@docRoot}design/media/wear/clear_bold_type.jpg"> +</div> + +<p>The system font is Roboto Condensed, with Regular and Light variants. Text should adhere to the size and color recommendations (see the UI Toolkit in the Downloads section). In general, text should be displayed as large as possible. Your goal should be to convey maximum information with minimum fuss.</p> + + +<h2 id="Branding" >Use Consistent Branding and Color</h2> + +<p>The app icon is used to identify and brand your application. The icon is optional but when present always appears in the same location, overhanging the top edge of the card at the right. Note that app icons or branding should not be displayed in the background photo, which is reserved to display an image relevant to the information on the card.</p> + + +<h2 id="Copywrite" style="clear:both">Copywrite Sparingly</h2> + +<div class="framed-wear-square-small" style="float:right;margin:0 0 60px 40px"> + <img src="{@docRoot}design/media/wear/copywrite.png"> +</div> + +<p>Omit needless text. Design for glanceability, not reading. Use words and phrases, not sentences. Use icons paired with values instead of text wherever possible. Text strings should be as concise as possible, and long pieces of text will be truncated to fit on a single card.</p> + + +<h2 id="BeDiscreet" >Be Discreet if Necessary</h2> + +<p>Wearables are personal devices by nature, but they are not completely private. If your notification serves content that may be particularly sensitive or embarrassing (such as notifications from a dating app or a medical status report), consider not displaying all of the information in a peek card. A notification could place the sensitive information on a second page that must be swiped to, or an application could show different amounts of detail in peek and focused card positions.</p> + + +<h2 id="ConfirmAnim" style="clear:both">Confirmation Animations</h2> + +<div class="framed-wear-square-small" style="float:left;margin:0 40px 40px 0 "> + <img src="{@docRoot}design/media/wear/confirmation.png"> +</div> + +<p>If your app allows the user to perform an action, it is necessary to provide positive feedback. Show a generic confirmation animation or create your own. A confirmation animation is an opportunity to express your app’s character and insert a moment of delight for your user. Keep animations short (less than 1000ms) and simple. Animating the confirmation icon is an effective way of transitions the user to a new state after completing an action.</p> + + + + + + diff --git a/docs/html/distribute/engage/analytics.jd b/docs/html/distribute/engage/analytics.jd new file mode 100644 index 0000000..5f7cade --- /dev/null +++ b/docs/html/distribute/engage/analytics.jd @@ -0,0 +1,50 @@ +page.title=Understand User Behavior +page.metaDescription=Use Google Analytics to learn what your users like and what keeps them coming back. +page.tags="analytics, user behavior" +page.image=/images/gp-analytics.jpg + +@jd:body + +<div class="figure"> + <img src="{@docRoot}images/gp-analytics.jpg" style="width:320px"> +</div> + + +<p> + Link your Google Play Developer Console with Google Analytics to learn much + more about how users interact with your app — before and after they + download it. +</p> + +<p> + Start by discovering how many people visit your Google Play listing page, + where they come from, and how many go on to install your app. Once the app is + launched, use Google Analytics to see which of your features are most + popular, where power users spend their time, who tends to make in-app + purchases, and more. +</p> + +<p> + Google Analytics delivers the numbers in real time, so you can act fast to + update your landing page and your app. <a href= + "http://www.google.com/analytics/mobile/">Learn more</a>. +</p> + +<p> + If you have a Google Analytics account already, linking it to Google Play + takes just a few moments. You can also link your Google Analytics account to + Admob to start gaining more user insights to improve your in-app marketing. +</p> + + <div class="headerLine clearfloat"> + <h2 id="related-resources"> + Related Resources + </h2> +</div> + +<div class="resource-widget resource-flow-layout col-13" + data-query="collection:distribute/engage/analytics" + data-sortorder="-timestamp" + data-cardsizes="9x3" + data-maxresults="6"> +</div>
\ No newline at end of file diff --git a/docs/html/distribute/engage/app-updates.jd b/docs/html/distribute/engage/app-updates.jd index 6b751b9..2b7cd2c 100644 --- a/docs/html/distribute/engage/app-updates.jd +++ b/docs/html/distribute/engage/app-updates.jd @@ -36,12 +36,12 @@ page.image=/images/gp-your-user-0.jpg "18x6," data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="related-resources"> +<div class="headerLine"> + <h2 id="related-resources"> Related Resources - </h1> + </h2> + - <hr> </div> <div class="resource-widget resource-flow-layout col-13" data-query= diff --git a/docs/html/distribute/engage/community.jd b/docs/html/distribute/engage/community.jd index 035058a..e202d54 100644 --- a/docs/html/distribute/engage/community.jd +++ b/docs/html/distribute/engage/community.jd @@ -29,12 +29,14 @@ page.image=/images/gp-engage-9.jpg Learn more about how to <a href="{@docRoot}distribute/users/build-community.html">build and manage a community</a>. </p> -<div class="headerLine clearfloat"> - <h1 id="related-resources"> +<p style="clear:both"> +</p> +<div class="headerLine"> + <h2 id="related-resources"> Related Resources - </h1> + </h2> + - <hr> </div> <div class="resource-widget resource-flow-layout col-13" data-query= diff --git a/docs/html/distribute/engage/deep-linking.jd b/docs/html/distribute/engage/deep-linking.jd index cd62f9d..a25c3c6 100644 --- a/docs/html/distribute/engage/deep-linking.jd +++ b/docs/html/distribute/engage/deep-linking.jd @@ -1,17 +1,17 @@ page.title=Deep Link to Bring Users Back -page.metaDescription=Use deep links to bring your users into your apps from social posts or search. +page.metaDescription=Use deep links to bring your users into your apps from social posts, search, or ads. page.tags="app indexing, google+ signin" page.image=/images/gp-listing-4.jpg @jd:body <p> - Use deep links to bring your users into your apps from social posts or - search. + Use deep links to bring your users into your apps from social posts, + search, or ads. </p> <div class="headerLine"> -<h1>Deep Linking from Google+ Posts</h1><hr> +<h2>Deep Linking from Google+ Posts</h2> </div> <p> @@ -43,8 +43,13 @@ page.image=/images/gp-listing-4.jpg </div> -<div class="headerLine clearfloat"> -<h1>Deep Linking from Google Search — App Indexing</h1><hr> +<div class="headerLine"> +<h2>Deep Linking from Google Search — App Indexing</h2> +</div> + + +<div style="float:right;"> + <img src="/images/gp-listing-4.jpg" style="padding-top:1em;padding-left:2em;"> </div> <p> @@ -60,16 +65,32 @@ page.image=/images/gp-listing-4.jpg content</a>. </p> -<div> - <img src="{@docRoot}images/gp-listing-4.jpg" style="padding-top:1em;"> +<div class="clearfloat" style="margin-top:2em;"></div> + +<div style="float:right;width:340px;padding-left:2em;"> + <img src="/images/gp-ads-linking2.jpg" style="padding-top:1em;"> +</div> + +<div class="headerLine "> +<h2>Deep Linking from Google Ads</h2> </div> +<p> + Ads can remind users about the apps they already have. +</p> + +<p> + As with deep links from Google's organic search results, AdWords deep links + send users directly to the relevant pages in apps they already have on their + mobile device. A mobile search for "flights to London," for instance, could + take a user straight to the London page in a travel app. <a href= + "http://www.thinkwithgoogle.com/products/ads-apps.html" + class="external-link">Learn more</a>. +</p> <div class="headerLine clearfloat"> - <h1 id="related-resources"> + <h2 id="related-resources"> Related Resources - </h1> - - <hr> + </h2> </div> <div class="resource-widget resource-flow-layout col-13" data-query= diff --git a/docs/html/distribute/engage/easy-signin.jd b/docs/html/distribute/engage/easy-signin.jd index 92c3ffc..d066181 100644 --- a/docs/html/distribute/engage/easy-signin.jd +++ b/docs/html/distribute/engage/easy-signin.jd @@ -37,11 +37,11 @@ page.image=/images/google/gps-googleplus.png </p> <div class="headerLine"> - <h1> + <h2> And Spreading the Word a Snap - </h1> + </h2> + - <hr> </div> @@ -85,12 +85,14 @@ page.image=/images/google/gps-googleplus.png </li> </ul> - <div class="headerLine clearfloat"> - <h1 id="related-resources"> +<p style="clear:both"> +</p> + <div class="headerLine"> + <h2 id="related-resources"> Related Resources - </h1> + </h2> + - <hr> </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/distribute/engage/engage_toc.cs b/docs/html/distribute/engage/engage_toc.cs index 0314f8c..596051a 100644 --- a/docs/html/distribute/engage/engage_toc.cs +++ b/docs/html/distribute/engage/engage_toc.cs @@ -37,6 +37,12 @@ </li> <li class="nav-section"> <div class="nav-section empty" style="font-weight:normal"><a href="<?cs + var:toroot?>distribute/engage/analytics.html"> + <span class="en">Understand User Behavior</span></a> + </div> + </li> + <li class="nav-section"> + <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/engage/app-updates.html"> <span class="en">Update Regularly</span></a> </div> diff --git a/docs/html/distribute/engage/game-services.jd b/docs/html/distribute/engage/game-services.jd index 5153435..1c77d2d 100644 --- a/docs/html/distribute/engage/game-services.jd +++ b/docs/html/distribute/engage/game-services.jd @@ -75,12 +75,12 @@ page.image=/images/google/gps-play_games_logo.png Game Developer Best Practices</a>. </p> -<div class="headerLine clearfloat"> - <h1 id="related-resources"> +<div class="headerLine"> + <h2 id="related-resources"> Related Resources - </h1> + </h2> + - <hr> </div> <div class="resource-widget resource-flow-layout col-13" data-query= diff --git a/docs/html/distribute/engage/gcm.jd b/docs/html/distribute/engage/gcm.jd index d793124e..7d9b6bb 100644 --- a/docs/html/distribute/engage/gcm.jd +++ b/docs/html/distribute/engage/gcm.jd @@ -35,12 +35,12 @@ page.image=/images/gcm/gcm-logo.png free and there are no quotas. </p> -<div class="headerLine clearfloat"> - <h1 id="related-resources"> +<div class="headerLine"> + <h2 id="related-resources"> Related Resources - </h1> + </h2> + - <hr> </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/distribute/engage/index.jd b/docs/html/distribute/engage/index.jd index f8cd1ee..2b103c3 100644 --- a/docs/html/distribute/engage/index.jd +++ b/docs/html/distribute/engage/index.jd @@ -15,8 +15,8 @@ nonavpage=true <div class="resource-widget resource-flow-layout landing col-16" data-query="collection:distribute/engagelanding" - data-cardSizes="6x6" - data-maxResults="9"> + data-cardSizes="9x6,9x6,6x6,6x6,6x6,9x6,9x6,6x6,6x6,6x6" + data-maxResults="10"> </div> <h3>Related Resources</h3> diff --git a/docs/html/distribute/engage/notifications.jd b/docs/html/distribute/engage/notifications.jd index fecfb45..1aa0637 100644 --- a/docs/html/distribute/engage/notifications.jd +++ b/docs/html/distribute/engage/notifications.jd @@ -40,17 +40,15 @@ page.image=/design/media/notifications_pattern_anatomy.png </p> - <div class="sidebox" style="width:326px;float:left;margin-left:0"> <p><strong>Tip:</strong> Use notifications sparingly — be sure any information presented is useful. Give users the option to turn notifications off. </p> - </div> - <div class="headerLine clearfloat"> - <h1 id="related-resources"> + <div class="headerLine"> + <h2 id="related-resources"> Related Resources - </h1><hr> + </h2> </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/distribute/engage/video.jd b/docs/html/distribute/engage/video.jd index 1a30f3a..c5a4997 100644 --- a/docs/html/distribute/engage/video.jd +++ b/docs/html/distribute/engage/video.jd @@ -23,12 +23,12 @@ page.image=/images/gp-engage-smule.jpg <img src="{@docRoot}images/gp-engage-smule.jpg"> </div> -<div class="headerLine clearfloat"> - <h1 id="related-resources"> +<div class="headerLine"> + <h2 id="related-resources"> Related Resources - </h1> + </h2> + - <hr> </div> <div class="resource-widget resource-flow-layout col-13" data-query= diff --git a/docs/html/distribute/engage/widgets.jd b/docs/html/distribute/engage/widgets.jd index b17af08..6adb55c 100644 --- a/docs/html/distribute/engage/widgets.jd +++ b/docs/html/distribute/engage/widgets.jd @@ -1,5 +1,5 @@ page.title=Build Useful Widgets -page.metaDescription=Use widgets to remind users about important information in your apps and games, even when your apps are closed. +page.metaDescription=Use home screen widgets to remind users about important information in your apps and games, even when your apps are closed. page.tags="" page.image=/images/gp-engage-0.jpg @@ -28,10 +28,13 @@ page.image=/images/gp-engage-0.jpg or upcoming deadlines. Widgets should serve as more than a launcher icon.</p> </div> -<div class="headerLine clearfloat"> - <h1 id="related-resources"> +<p style="clear:both"> +</p> + +<div class="headerLine"> + <h2 id="related-resources"> Related Resources - </h1><hr> + </h2> </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/distribute/essentials/best-practices/apps.jd b/docs/html/distribute/essentials/best-practices/apps.jd index 055a349..bbac727 100644 --- a/docs/html/distribute/essentials/best-practices/apps.jd +++ b/docs/html/distribute/essentials/best-practices/apps.jd @@ -17,7 +17,7 @@ page.metaDescription=Essential tips for launching successful apps in Google Play <p>The following best practices have enabled developers worldwide to build great, successful apps for Google Play.</p> <div class="headerLine"> -<h1 id="essentials">Get the Essentials Right</h1><hr> +<h2 id="essentials">Get the Essentials Right</h2> </div> <h3>1. Make it Android</h3> @@ -82,11 +82,11 @@ page.metaDescription=Essential tips for launching successful apps in Google Play </ul> <div class="headerLine"> - <h1 id="users"> + <h2 id="users"> Get Users - </h1> + </h2> + - <hr> </div> <h3> @@ -150,11 +150,11 @@ page.metaDescription=Essential tips for launching successful apps in Google Play </ul> <div class="headerLine"> - <h1 id="engage"> + <h2 id="engage"> Engage and Retain - </h1> + </h2> + - <hr> </div> <h3> @@ -211,11 +211,11 @@ page.metaDescription=Essential tips for launching successful apps in Google Play </ul> <div class="headerLine"> - <h1 id="beyond"> + <h2 id="beyond"> Beyond the Basics - </h1> + </h2> + - <hr> </div> <ul> @@ -249,7 +249,7 @@ page.metaDescription=Essential tips for launching successful apps in Google Play </ul> <div class="headerLine"> -<h1 id="related-resources">Related Resources</h1><hr> +<h2 id="related-resources">Related Resources</h2> </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/distribute/essentials/best-practices/games.jd b/docs/html/distribute/essentials/best-practices/games.jd index ac1df44..c4ce66e 100644 --- a/docs/html/distribute/essentials/best-practices/games.jd +++ b/docs/html/distribute/essentials/best-practices/games.jd @@ -20,11 +20,11 @@ page.metaDescription=Essential tips for launching successful games in Google Pla </p> <div class="headerLine"> - <h1 id="users"> + <h2 id="users"> Get Users - </h1> + </h2> + - <hr> </div> <h3> @@ -111,11 +111,11 @@ page.metaDescription=Essential tips for launching successful games in Google Pla </ul> <div class="headerLine"> - <h1 id="engage"> + <h2 id="engage"> Engage and Retain - </h1> + </h2> + - <hr> </div> <h3> @@ -213,11 +213,11 @@ page.metaDescription=Essential tips for launching successful games in Google Pla </ul> <div class="headerLine"> - <h1 id="beyond"> + <h2 id="beyond"> Beyond the Basics - </h1> + </h2> + - <hr> </div> <ul> @@ -249,7 +249,7 @@ page.metaDescription=Essential tips for launching successful games in Google Pla </ul> <div class="headerLine"> -<h1 id="related-resources">Related Resources</h1><hr> +<h2 id="related-resources">Related Resources</h2> </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/distribute/essentials/essentials_toc.cs b/docs/html/distribute/essentials/essentials_toc.cs index 7084fdd..d0a1114 100644 --- a/docs/html/distribute/essentials/essentials_toc.cs +++ b/docs/html/distribute/essentials/essentials_toc.cs @@ -11,12 +11,6 @@ </div> </li> <li class="nav-section"> - <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/essentials/gpfe-guidelines.html"> - <span class="en">Education Guidelines</span> - </a> - </div> - </li> - <li class="nav-section"> <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/essentials/optimizing-your-app.html"> <span class="en">Optimize Your App</span> </a> diff --git a/docs/html/distribute/essentials/gpfe-guidelines.jd b/docs/html/distribute/essentials/gpfe-guidelines.jd deleted file mode 100644 index 799009f..0000000 --- a/docs/html/distribute/essentials/gpfe-guidelines.jd +++ /dev/null @@ -1,509 +0,0 @@ -page.title=Education Guidelines -page.metaDescription=These guidelines and requirements help you develop great apps for students, which offer compelling content and an intuitive user experience on Android tablets. -page.image=/distribute/images/edu-guidelines.jpg -Xnonavpage=true - -@jd:body - - -<div id="qv-wrapper"><div id="qv"> -<h2>Guidelines</h2> -<ol> -<li><a href="#basic-reqts">Basic Requirements</a></li> -<li><a href="#monetizing-ads">Monetizing and Ads</a></li> -<li><a href="#e-value">Educational Value</a></li> -<li><a href="#quality">App Quality</a></li> -<li><a href="#related-resources">Related Resources</a></li> -</ol> - -<h2> - Testing -</h2> - -<ol> - <li> - <a href="#test-environment">Setting Up a Test Environment</a> - </li> -</ol> - -</div></div> - -<div style="margin:0 0 1em 0;"> - <img src="{@docRoot}distribute/images/edu-guidelines.jpg" style= - "width:274px;"> -</div> - -<p> - These guidelines and requirements help you develop great apps for students, - which offer compelling content and an intuitive user experience on Android - tablets. -</p> - -<p> - You’ll also need to ensure that your apps comply with the terms of the - <a href= - "https://play.google.com/about/developer-distribution-agreement-addendum.html"> - Google Play for Education Addendum</a>, <a href= - "http://play.google.com/about/developer-content-policy.html">Google Play - Developer Program Policies</a>, and <a href= - "http://play.google.com/about/developer-distribution-agreement.html">Developer - Distribution Agreement</a>. -</p> - -<div class="headerLine clearfloat"> - <h1 id="basic-reqts"> - Basic Requirements - </h1> - - <hr> -</div> - -<p> - To participate, your apps must be designed for the K-12 market. The basic - requirements that your apps must meet are: -</p> - -<ul> - <li> - <p> - Apps and the ads they contain must not collect personally identifiable - information, other than user credentials or data required to operate and - improve the app. - </p> - </li> - - <li> - <p> - Apps must not use student data for purposes unrelated to its educational - function. - </p> - </li> - - <li> - <p> - Apps must have a content rating of "Everyone" or "Low Maturity" (apps - with a "Medium Maturity" rating are allowed, if they have that rating - solely because they allow communication between students). - </p> - </li> - - <li> - <p> - App content, including ads displayed by the app, must be consistent with - the app's maturity rating. The app must not display any "offensive" - content, as described in the <a href= - "http://play.google.com/about/developer-content-policy.html">Google Play - Developer Program Policies</a> and <a href= - "https://support.google.com/googleplay/android-developer/answer/188189">content-rating - guidelines</a>. - </p> - </li> - - <li> - <p> - Apps must comply with the Children’s Online Privacy Protection Act and - all other applicable laws and regulations. - </p> - </li> -</ul> - -<div class="headerLine"> - <h1 id="monetizing-ads"> - Monetizing and Ads - </h1> - - <hr> -</div> - -<p> - In-app purchase is currently not supported with Google Play for Education, so - a student device will block any transactions. To avoid confusion, be sure to - remove any in-app purchase buttons and related UI elements from your apps. - We’re investigating additional purchase mechanisms to enable more flexible - pricing models for developers and schools. -</p> - -<p> - If your apps are priced In Google Play for Education, you must allow Google - Play to offer teachers limited free trials before purchase (you provide this - through business terms only, no development work is needed.) -</p> - -<p> - You can only choose not to remove in-app purchasing from your apps where all - content and services are sold through Google Play for Education using In-app - Billing. If you choose not to remove In-app Billing features, ensure that: -</p> - -<ul> - <li> - <p> - Users can access your apps’ core functionality for a classroom setting - without an in-app purchase. - </p> - </li> - - <li> - <p> - In-app purchases are clearly identifiable in your UI. - </p> - </li> - - <li> - <p> - You declare the use of in-app purchases at <a href= - "{@docRoot}distribute/googleplay/edu/start.html#publish">opt-in</a>. - </p> - </li> -</ul> - -<p> - For each app that you publish, you can set a single price that applies to - both Google Play and Google Play for Education. You can’t set a different - price for a given app (based on a single package name) in Google Play for - Education. -</p> - -<p> - If your apps display ads, you should disable the display of ads if possible, - or ensure that: -</p> - -<ul> - <li>Ads are not distracting for students or teachers (this includes - Flash-based ads, video ads, and ads that flash or move) - </li> - - <li>Interstitial ads are not served in the app - </li> - - <li>Ad walls do not appear in the app UI - </li> - - <li>Ads do not occupy a significant portion of the screen - </li> - - <li>Ads content does not exceed the maturity rating of the app. - </li> - - <li> - <p> - You declare the use of ads at <a href= - "{@docRoot}distribute/googleplay/edu/start.html#publish">opt-in</a>. - </p> - </li> -</ul> - -<div class="headerLine"> - <h1 id="e-value"> - Educational Value - </h1> - - <hr> -</div> - -<div class="figure"> - <img src="{@docRoot}images/gp-e-value.png" class="border-img"> -</div> - -<p> - Apps submitted to Google Play for Education will be evaluated by a - third-party educator network, which will review them based on alignment with - <a href="http://www.corestandards.org/">Common Core Standards</a> and other - educational considerations. This will help make your content more - discoverable for teachers and administrators as they browse by grade level, - subject, core curriculum, and other parameters. -</p> - -<p> - Apps with highest educational value will have these characteristics: -</p> - -<ul> - <li> - <p> - Designed for use in K-12 classrooms. - </p> - </li> - - <li> - <p> - Aligned with a common core standard or support common-core learning. - </p> - </li> - - <li> - <p> - Simple, easy to use, and intuitive for the grade levels the apps are - targeting. Apps are relatively easy to navigate without teacher guidance. - Not distracting or overwhelming to students. - </p> - </li> - - <li> - <p> - Enjoyable and interactive. Apps are engaging to students and lets them - control their experience. - </p> - </li> - - <li> - <p> - Versatile. Apps have features that make them useful for more than one - classroom function or lesson throughout the school year. - </p> - </li> - - <li> - <p> - Supports the "4Cs": - </p> - - <ul> - <li> - <p> - <em>Creativity</em> — Allows students to create in order to - express understanding of the learning objectives, and try new - approaches, innovation, and invention to get things done. - </p> - </li> - - <li> - <p> - <em>Critical thinking</em> — Allows students to look at - problems in a new way, linking learning across subjects and - disciplines. - </p> - </li> - - <li> - <p> - <em>Collaboration</em> — Allows students and (if appropriate) - educators to work together to reach a goal. - </p> - </li> - - <li> - <p> - <em>Communication</em> — Allows students to comprehend, - critique and share thoughts, questions, ideas, and solutions. - </p> - </li> - </ul> - </li> -</ul> - -<p> - As you design and develop your apps, make sure they offer high educational - value by addressing as many of these characteristics as possible. -</p> - -<div class="headerLine"> - <h1 id="quality"> - App Quality - </h1> - - <hr> -</div> - -<div class="figure"> - <img src="{@docRoot}images/gp-edu-quality.png"> -</div> - -<p> - Your apps should be designed to perform well and look great on Android - tablets, and they should offer the best user experience possible. -</p> - -<p> - High quality apps are engaging, intuitive, and offer compelling content. - Google Play for Education will highlight high-quality apps for easy discovery - in the store. Here are some recommendations for making your app easy for - students and teachers to enjoy: -</p> - -<ul> - <li> - <p> - Meet the Core Quality Guidelines: - </p> - - <ul> - <li> - <p> - Follow <a href="{@docRoot}design/index.html">Android Design - Guidelines</a>. Pay special attention to the sections on <a href= - "{@docRoot}design/patterns/actionbar.html">Action Bar</a>, <a href= - "{@docRoot}design/patterns/navigation.html">Navigation</a>, and - <a href="{@docRoot}design/patterns/pure-android.html">Pure - Android</a>. - </p> - </li> - - <li> - <p> - Test your apps against the <a href= - "{@docRoot}distribute/essentials/quality/core.html">Core Quality - Guidelines</a>. - </p> - </li> - </ul> - </li> - - <li> - <p> - Meet the Tablet App Quality guidelines: - </p> - - <ul> - <li> - <p> - Follow our best practices for tablet app development. - </p> - </li> - - <li> - <p> - Review the <a href= - "{@docRoot}distribute/essentials/quality/tablets.html">Tablet App - Quality</a> guidelines and <a href= - "http://android-developers.blogspot.com/2012/11/designing-for-tablets-were-here-to-help.html"> - blog post on designing for tablets.</a> - </p> - - <ul> - <li>Check your Optimization Tips in the <a href= - "https://play.google.com/apps/publish/">Developer Console</a> (if - you've already uploaded your apps.) - </li> - </ul> - </li> - - <li> - <p> - Strive for simplicity and highest usability for students: - </p> - - <ul> - <li> - <p> - Design your app so that teachers and students can use all the - capabilities of your app without having to sign-in to multiple - accounts and remember multiple passwords. - </p> - </li> - - <li> - <p> - Every student or teacher using a Google Play for Education tablet - will already be signed in with a Google account on the device. - You can take advantage of that to provide a simple, seamless - sign-in experience in your app. A recommended approach is to use - <a href="{@docRoot}google/play-services/auth.html">Google OAuth 2 - authorization</a> through Google Play Services. - </p> - </li> - </ul> - </li> - </ul> - </li> -</ul> - -<div class="headerLine"> - <h1 id="test-environment"> - Test Environment - </h1> - - <hr> -</div> - -<p> - To test your app and assess it against the guidelines in this document, it's - recommended that you <a href= - "{@docRoot}distribute/essentials/quality/tablets.html#test-environment">set - up a test environment</a> that replicates the actual environment in which - students and teachers will run your app. -</p> - -<h3> - Test conditions -</h3> - -<p> - Make sure to test your apps under conditions that simulate those of schools. - For example, Google Play for Education lets administrators <a href= - "https://support.google.com/a/answer/182442?hl=en">control or disable certain - capabilities</a> for students, so it's good to test your app with those - capabilities disabled. Below are some conditions to test your apps for, to - ensure best results in the Google Play for Education environment: -</p> - -<ul> - <li> - <p> - <em>Android version</em> — Test the apps on devices running Android - 4.2. Google Play for Education devices will be running Android 4.2 or - higher (API level 17+). - </p> - </li> - - <li> - <p> - <em>Proxy server</em> — Test the apps in a network environment that - uses proxies. Many schools use proxies. - </p> - </li> - - <li> - <p> - <em>No location services</em> — Test the apps to make sure they - work properly with location services disabled. Many schools will disable - location services for student devices. - </p> - </li> - - <li> - <p> - <em>No In-app Billing</em> — Test the apps to make sure they work - properly without access to In-app Billing. In-app purchases are blocked - on Google Play for Education devices. - </p> - </li> - - <li> - <p> - <em>No Bluetooth</em> — Test the apps to make sure they work - properly when Bluetooth is disabled. Many schools will disable Bluetooth - on student devices. - </p> - </li> - - <li> - <p> - <em>No access to network</em> — Test the app to make sure it works - properly when the device cannot connect to the internet. - </p> - </li> -</ul> - -<div class="headerLine"> -<h1>Related Resources</h1><hr> -</div> - -<div class="dynamic-grid"> -<h3>FOR DEVELOPERS</h3> - -<div class="resource-widget resource-flow-layout col-13" - data-query="collection:distribute/essentials/eduessentials/developers" - data-sortOrder="-timestamp" - data-cardSizes="6x3,6x3,6x3" - data-maxResults="6"></div> - -<h3>FOR TEACHERS AND EDUCATORS</h3> - -<div class="resource-widget resource-flow-layout col-13" - data-query="collection:distribute/essentials/eduessentials/educators" - data-sortOrder="-timestamp" - data-cardSizes="6x3,6x3,6x3" - data-maxResults="3"></div> -</div>
\ No newline at end of file diff --git a/docs/html/distribute/essentials/optimizing-your-app.jd b/docs/html/distribute/essentials/optimizing-your-app.jd index 3fe91b28..696ef53 100644 --- a/docs/html/distribute/essentials/optimizing-your-app.jd +++ b/docs/html/distribute/essentials/optimizing-your-app.jd @@ -53,11 +53,11 @@ page.image=/distribute/images/gp-optimize-card.jpg </p> <div class="headerLine"> - <h1 id="listen-to-your-users"> + <h2 id="listen-to-your-users"> Listen to Your Users - </h1> + </h2> + - <hr> </div> <div class="figure"> @@ -147,11 +147,11 @@ page.image=/distribute/images/gp-optimize-card.jpg </p> <div class="headerLine" id="measuring-analyzing-responding"> - <h1> + <h2> Measuring, Analyzing, and Responding to User Behavior - </h1> + </h2> + - <hr> </div> <div class="figure"> @@ -260,11 +260,11 @@ who can help automate, measure, and optimize your mobile marketing. </p> <div class="headerLine"> - <h1 id="improve-stability"> + <h2 id="improve-stability"> Improve Stability and Eliminate Bugs - </h1> + </h2> + - <hr> </div> <p> @@ -298,11 +298,11 @@ who can help automate, measure, and optimize your mobile marketing. </p> <div class="headerLine"> - <h1 id="improve-ui"> + <h2 id="improve-ui"> Improve UI Responsiveness - </h1> + </h2> + - <hr> </div> <div class="figure"> @@ -352,11 +352,11 @@ who can help automate, measure, and optimize your mobile marketing. </p> <div class="headerLine"> - <h1 id="improve-usability"> + <h2 id="improve-usability"> Improve Usability - </h1> + </h2> + - <hr> </div> <div class="sidebox-wrapper" style="float:right;"> @@ -403,11 +403,11 @@ who can help automate, measure, and optimize your mobile marketing. </p> <div class="headerLine"> - <h1 id="professional-appearance"> + <h2 id="professional-appearance"> Professional Appearance and Aesthetics - </h1> + </h2> + - <hr> </div> <p> @@ -439,11 +439,11 @@ who can help automate, measure, and optimize your mobile marketing. </p> <div class="headerLine"> - <h1 id="deliver-features"> + <h2 id="deliver-features"> Deliver the Right Set of Features - </h1> + </h2> + - <hr> </div> <p> @@ -464,11 +464,11 @@ who can help automate, measure, and optimize your mobile marketing. </p> <div class="headerLine"> - <h1 id="integrate"> + <h2 id="integrate"> Integrate with the System and Third-Party apps - </h1> + </h2> + - <hr> </div> <p> @@ -502,7 +502,7 @@ who can help automate, measure, and optimize your mobile marketing. </p> <div class="headerLine"> -<h1 id="related-resources">Related Resources</h1><hr> +<h2 id="related-resources">Related Resources</h2> </div> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/optimizing, tag:addia" diff --git a/docs/html/distribute/essentials/quality/core.jd b/docs/html/distribute/essentials/quality/core.jd index 558b030..cfe1a2a 100644 --- a/docs/html/distribute/essentials/quality/core.jd +++ b/docs/html/distribute/essentials/quality/core.jd @@ -63,12 +63,12 @@ page.image=/distribute/images/core-quality-guidelines.jpg Guidelines</a>. </p> -<div class="headerLine clearfloat"> - <h1 id="ux"> +<div class="headerLine"> + <h2 id="ux"> Visual Design and User Interaction - </h1> + </h2> + - <hr> </div> <p> @@ -234,9 +234,7 @@ page.image=/distribute/images/core-quality-guidelines.jpg </tr> </table> -<h3> - Related Resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/essentials/corequalityguidelines/visualdesign" @@ -244,12 +242,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,6x3,6x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="fn"> +<div class="headerLine"> + <h2 id="fn"> Functionality - </h1> + </h2> + - <hr> </div> <p> @@ -509,21 +507,19 @@ data-maxresults="6"> </tr> </table> -<h3> - Related Resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/essentials/corequalityguidelines/functionality" data-sortorder="-timestamp" data-cardsizes="6x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="ps"> +<div class="headerLine"> + <h2 id="ps"> Performance and Stability - </h1> + </h2> + - <hr> </div> <p> @@ -670,21 +666,19 @@ data-sortorder="-timestamp" data-cardsizes="6x3" data-maxresults="6"> </tr> </table> -<h3> - Related Resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/essentials/core/performance" data-sortorder="-timestamp" data-cardsizes="6x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="listing"> +<div class="headerLine"> + <h2 id="listing"> Google Play - </h1> + </h2> + - <hr> </div> <p> @@ -819,21 +813,19 @@ data-cardsizes="6x3" data-maxresults="6"> </tr> </table> -<h3> - Related Resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/essentials/core/play" data-sortorder="-timestamp" data-cardsizes="6x3,6x3,6x3,6x3,6x3,6x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="test-environment"> +<div class="headerLine"> + <h2 id="test-environment"> Setting Up a Test Environment - </h1> + </h2> + - <hr> </div> <p> @@ -863,12 +855,12 @@ data-cardsizes="6x3,6x3,6x3,6x3,6x3,6x3" data-maxresults="6"> increase the number or complexity of tests and quality criteria. </p> -<div class="headerLine clearfloat"> - <h1 id="tests"> +<div class="headerLine"> + <h2 id="tests"> Test Procedures - </h1> + </h2> + - <hr> </div> <p> diff --git a/docs/html/distribute/essentials/quality/tablets.jd b/docs/html/distribute/essentials/quality/tablets.jd index 7dfab48..2b2a5ae 100644 --- a/docs/html/distribute/essentials/quality/tablets.jd +++ b/docs/html/distribute/essentials/quality/tablets.jd @@ -52,7 +52,7 @@ Xnonavpage=true help you address each recommendation included. </p> -<div class="headerLine"><h1 id="core-app-quality">1. Test for Basic Tablet App Quality</h1><hr></div> +<div class="headerLine"><h2 id="core-app-quality">1. Test for Basic Tablet App Quality</h2></div> <p>The first step in delivering a great tablet app experience is making sure that it meets the <em>core app quality criteria</em> for all of the devices @@ -78,8 +78,8 @@ Before publishing, also ensure that your app passes the basic technical checks a Tips page</a>.</p> -<div class="headerLine clearfloat"> -<h1 id="optimize-layouts">2. Optimize Layouts for Larger Screens</h1><hr></div> +<div class="headerLine"> +<h2 id="optimize-layouts">2. Optimize Layouts for Larger Screens</h2></div> <p> Android makes it easy to develop an app that runs well on a wide range of @@ -158,7 +158,7 @@ across the screen:</p> multi-pane UI for tablets (see next section).</li> </ul> -<h3>Related resources</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/optimize" @@ -167,7 +167,7 @@ multi-pane UI for tablets (see next section).</li> data-maxResults="6"></div> -<div class="headerLine clearfloat"><h1 id="use-extra-space">3. Take Advantage of Extra Screen Area</h1><hr></div> +<div class="headerLine"><h2 id="use-extra-space">3. Take Advantage of Extra Screen Area</h2></div> <div style="width:340px;float:right;margin:1.5em;margin-bottom:0;margin-top:0;"> <img src="{@docRoot}images/training/app-navigation-multiple-sizes-multipane-good.png" @@ -219,7 +219,7 @@ different layouts in the appropriate screen size buckets (such as <code>sw600dp</code>/<code>sw720</code>).</li> </ul> -<h3>Related resources</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/extrascreen" @@ -227,7 +227,7 @@ different layouts in the appropriate screen size buckets (such as data-cardSizes="6x3,6x3,6x3" data-maxResults="6"></div> -<div class="headerLine clearfloat"><h1 id="use-tablet-icons">4. Use Assets Designed for Tablet Screens</h1><hr></div> +<div class="headerLine"><h2 id="use-tablet-icons">4. Use Assets Designed for Tablet Screens</h2></div> <div><img src="{@docRoot}design/media/devices_displays_density@2x.png"></div> @@ -308,7 +308,7 @@ icon at the highest density possible. For example, if a tablet has an {@code xhd it will request the {@code xxhdpi} version of the launcher icon.</li> </ul> -<h3>Related resources</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/assets" @@ -316,8 +316,8 @@ it will request the {@code xxhdpi} version of the launcher icon.</li> data-cardSizes="9x3" data-maxResults="6"></div> -<div class="headerLine clearfloat"><h1 id="adjust-font-sizes">5. -Adjust Font Sizes and Touch Targets</h1><hr></div> +<div class="headerLine"><h2 id="adjust-font-sizes">5. +Adjust Font Sizes and Touch Targets</h2></div> <p>To make sure your app is easy to use on tablets, take some time to adjust the font sizes and touch targets in your tablet UI, for all of the screen @@ -345,7 +345,7 @@ larger touch targets. </li> or just centering the icon within the transparent button.</li> </ul> -<h3>Related resources</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/fonts" @@ -353,7 +353,7 @@ or just centering the icon within the transparent button.</li> data-cardSizes="9x3,9x3,6x3,6x3,6x3" data-maxResults="6"></div> -<div class="headerLine clearfloat"><h1 id="adjust-widgets">6. Adjust Sizes of Home Screen Widgets</h1><hr></div> +<div class="headerLine"><h2 id="adjust-widgets">6. Adjust Sizes of Home Screen Widgets</h2></div> <p>If your app includes a home screen widget, here are a few points to consider to ensure a great user experience on tablet screens: </p> @@ -371,7 +371,7 @@ horizontal or square widget). </li> possible.</li> </ul> -<h3>Related resources</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/widgets" @@ -380,7 +380,7 @@ possible.</li> data-maxResults="6"></div> -<div class="headerLine clearfloat"><h1 id="offer-full-feature-set">7. Full Feature Set for Tablet Users</h1><hr></div> +<div class="headerLine"><h2 id="offer-full-feature-set">7. Full Feature Set for Tablet Users</h2></div> <div class="centered-full-image" style="width:600px;margin:1.5em"><img src="{@docRoot}images/gp-tablets-full-feature-set.png" alt="Tablet feature sets"></div> @@ -415,7 +415,7 @@ some recommendations:</p> </li> </ul> -<div class="headerLine clearfloat"><h1 id="android-versions">8. Target Android Versions Properly</h1><hr></div> +<div class="headerLine"><h2 id="android-versions">8. Target Android Versions Properly</h2></div> <p> To ensure the broadest possible distribution to tablets, make sure that your @@ -458,7 +458,7 @@ some recommendations:</p> </li> </ol> -<h3>Related resources</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/versions" @@ -466,7 +466,7 @@ some recommendations:</p> data-cardSizes="6x3" data-maxResults="6"></div> -<div class="headerLine clearfloat"><h1 id="hardware-requirements">9. Declare Hardware Feature Dependencies Properly</h1><hr></div> +<div class="headerLine"><h2 id="hardware-requirements">9. Declare Hardware Feature Dependencies Properly</h2></div> <p> Handsets and tablets typically offer slightly different hardware support for @@ -528,7 +528,7 @@ permissions, make sure to explicitly declare a corresponding as needed. </p> -<h3>Related resources</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/hardware" @@ -536,7 +536,7 @@ permissions, make sure to explicitly declare a corresponding data-cardSizes="9x3" data-maxResults="6"></div> -<div class="headerLine clearfloat"><h1 id="support-screens">10. Declare Support for Tablet Screens</h1><hr></div> +<div class="headerLine"><h2 id="support-screens">10. Declare Support for Tablet Screens</h2></div> <p>To ensure that you can distribute your app to a broad range of tablets, your app should declare support for tablet screen sizes in its manifest file, as follows:</p> @@ -560,7 +560,7 @@ app supports. Note that, if possible, you should avoid using the <a href="{@docRoot}guide/topics/manifest/compatible-screens-element.html"><code><compatible-screens></code></a> element in your app.</p> -<h3>Related resources</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/tabletscreens" @@ -569,7 +569,7 @@ element in your app.</p> data-maxResults="6"></div> -<div class="headerLine clearfloat"><h1 id="google-play">11. Showcase Your Tablet UI in Google Play</h1><hr></div> +<div class="headerLine"><h2 id="google-play">11. Showcase Your Tablet UI in Google Play</h2></div> <p> After you've done the work to create an rich, optimized UI for your tablet @@ -689,7 +689,7 @@ element in your app.</p> </li> </ul> -<h3>Related resources</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/showcase" @@ -697,12 +697,12 @@ element in your app.</p> data-cardSizes="9x3,9x3,9x3,9x3" data-maxResults="6"></div> -<div class="headerLine clearfloat"> - <h1 id="google-play-best-practices"> +<div class="headerLine"> + <h2 id="google-play-best-practices"> 12. Follow Best Practices for Publishing in Google Play - </h1> + </h2> + - <hr> </div> <p> @@ -799,7 +799,7 @@ appropriate.</p> recommended. </p> -<h3 class="clearfloat">Related resources</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines/googleplay" data-sortOrder="-timestamp" @@ -807,12 +807,12 @@ appropriate.</p> data-maxResults="6"></div> -<div class="headerLine clearfloat"> - <h1 id="test-environment"> +<div class="headerLine"> + <h2 id="test-environment"> Setting Up a Test Environment for Tablets - </h1> + </h2> + - <hr> </div> <p> @@ -858,7 +858,7 @@ listed platform versions, screen configurations, and hardware feature configurat </tr> </table> -<div class="headerLine clearfloat"><h1 id="related-resources">Related Resources</h1><hr></div> +<div class="headerLine"><h2 id="related-resources">Related Resources</h2></div> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/essentials/tabletguidelines" diff --git a/docs/html/distribute/googleplay/about.jd b/docs/html/distribute/googleplay/about.jd index cf0c6d2..c7c91ac 100644 --- a/docs/html/distribute/googleplay/about.jd +++ b/docs/html/distribute/googleplay/about.jd @@ -58,11 +58,11 @@ page.image=/distribute/images/about-play.jpg </p> <div class="headerLine"> - <h1 id="ratings-reviews"> + <h2 id="ratings-reviews"> User Ratings and Reviews - </h1> + </h2> + - <hr> </div> <p> @@ -83,11 +83,11 @@ page.image=/distribute/images/about-play.jpg </div> <div class="headerLine"> - <h1 id="category-browsing"> + <h2 id="category-browsing"> Category Browsing - </h1> + </h2> + - <hr> </div> <p> @@ -98,11 +98,11 @@ page.image=/distribute/images/about-play.jpg </p> <div class="headerLine"> - <h1 id="search"> + <h2 id="search"> Search - </h1> + </h2> + - <hr> </div> <p> @@ -113,11 +113,11 @@ page.image=/distribute/images/about-play.jpg </p> <div class="headerLine"> - <h1 id="top-charts-and-lists"> + <h2 id="top-charts-and-lists"> Top Charts and Lists - </h1> + </h2> + - <hr> </div> <div class="figure"> @@ -195,11 +195,11 @@ page.image=/distribute/images/about-play.jpg </table> <div class="headerLine"> - <h1 id="featured-staff-picks"> + <h2 id="featured-staff-picks"> Featured, Staff Picks, Collections, and Badges - </h1> + </h2> + - <hr> </div> <p> @@ -313,11 +313,11 @@ page.image=/distribute/images/about-play.jpg </p> <div class="headerLine"> - <h1 id="product-detail-pages"> + <h2 id="product-detail-pages"> Store Listing Pages - </h1> + </h2> + - <hr> </div> <div class="figure"> @@ -357,8 +357,11 @@ page.image=/distribute/images/about-play.jpg Products</a> to find out how. </p> -<div class="headerLine clearfloat"> -<h1>Related Resources</h1><hr> +<p style="clear:both"> +</p> + +<div class="headerLine"> +<h2>Related Resources</h2> </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/distribute/googleplay/developer-console.jd b/docs/html/distribute/googleplay/developer-console.jd index 6263431..f5b3ac6 100644 --- a/docs/html/distribute/googleplay/developer-console.jd +++ b/docs/html/distribute/googleplay/developer-console.jd @@ -44,12 +44,12 @@ Xnonavpage=true verification by email, you can sign in to your Google Play Developer Console. </p> -<div class="headerLine clearfloat"> - <h1 id="allapps"> +<div class="headerLine"> + <h2 id="allapps"> All Applications - </h1> + </h2> + - <hr> </div> <p> @@ -61,12 +61,12 @@ Xnonavpage=true <img src="{@docRoot}images/gp-dc-home.png" class="border-img"> </div> -<div class="headerLine clearfloat" style="margin-top:-6px"> - <h1 id="account-details"> +<div class="headerLine" style="margin-top:-6px"> + <h2 id="account-details"> Your Account Details - </h1> + </h2> + - <hr> </div> <p> @@ -112,12 +112,12 @@ Xnonavpage=true Google Play licensing. </p> -<div class="headerLine clearfloat"> - <h1 id="merchant-account"> +<div class="headerLine"> + <h2 id="merchant-account"> Linking Your Merchant Account - </h1> + </h2> + - <hr> </div> <p> @@ -127,12 +127,12 @@ Xnonavpage=true from sales. </p> -<div class="headerLine clearfloat"> - <h1 id="multiple-user-accounts"> +<div class="headerLine"> + <h2 id="multiple-user-accounts"> Multiple User Accounts - </h1> + </h2> + - <hr> </div> <p> @@ -157,12 +157,12 @@ Xnonavpage=true up multiple accounts</a> now. </p> -<div class="headerLine clearfloat"> - <h1 id="store-listing-details"> +<div class="headerLine"> + <h2 id="store-listing-details"> Store Listing Details - </h1> + </h2> + - <hr> </div> <p> @@ -181,12 +181,12 @@ Xnonavpage=true <img src="{@docRoot}images/gp-dc-details.png" class="frame"> </div> -<div class="headerLine clearfloat"> - <h1 id="upload-instantly-publish"> +<div class="headerLine"> + <h2 id="upload-instantly-publish"> Upload and Instantly Publish - </h1> + </h2> + - <hr> </div> <p> @@ -212,12 +212,12 @@ Xnonavpage=true time. </p> -<div class="headerLine clearfloat"> - <h1 id="alpha-beta"> +<div class="headerLine"> + <h2 id="alpha-beta"> Alpha and Beta Testing - </h1> + </h2> + - <hr> </div> <p> @@ -270,12 +270,12 @@ Xnonavpage=true Checklist</a>. </p> -<div class="headerLine clearfloat"> - <h1 id="staged-rollouts"> +<div class="headerLine"> + <h2 id="staged-rollouts"> Staged Rollouts - </h1> + </h2> + - <hr> </div> <p> @@ -303,12 +303,12 @@ Xnonavpage=true updates. </p> -<div class="headerLine clearfloat"> - <h1 id="multiple-apk"> +<div class="headerLine"> + <h2 id="multiple-apk"> Multiple APK Support - </h1> + </h2> + - <hr> </div> <p> @@ -335,12 +335,12 @@ Xnonavpage=true of the normal app installation. </p> -<div class="headerLine clearfloat"> - <h1 id="selling-pricing-your-products"> +<div class="headerLine"> + <h2 id="selling-pricing-your-products"> Selling and Pricing Your Products - </h1> + </h2> + - <hr> </div> <div class="figure-right"> @@ -407,12 +407,12 @@ Xnonavpage=true Expand into New Markets</a>. </p> -<div class="headerLine clearfloat"> - <h1 id="in-app-products"> +<div class="headerLine"> + <h2 id="in-app-products"> In-app Products - </h1> + </h2> + - <hr> </div> <p> @@ -448,12 +448,12 @@ Xnonavpage=true monetization models </p> -<div class="headerLine clearfloat"> - <h1 id="distribution-controls"> +<div class="headerLine"> + <h2 id="distribution-controls"> Distribution Controls - </h1> + </h2> + - <hr> </div> <p> @@ -518,12 +518,12 @@ Xnonavpage=true exclude specific devices if needed. </p> -<div class="headerLine clearfloat"> - <h1 id="reviews-reports"> +<div class="headerLine"> + <h2 id="reviews-reports"> User Reviews and Crash Reports - </h1> + </h2> + - <hr> </div> <div class="figure-right" style="width:500px;"> @@ -548,12 +548,12 @@ Xnonavpage=true devices. </p> -<div class="headerLine clearfloat"> - <h1 id="app-stats"> +<div class="headerLine"> + <h2 id="app-stats"> App Statistics - </h1> + </h2> + - <hr> </div> <div class="figure" style="width:500px"> @@ -587,9 +587,12 @@ Xnonavpage=true on data inside a dimension by adding specific points to the timeline. </p> +<p style="clear:both"> +</p> + <div class="dynamic-grid"> -<div class="headerLine clearfloat"> -<h1 id="related-resources">Related Resources</h1><hr/> +<div class="headerLine"> +<h2 id="related-resources">Related Resources</h2> </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/distribute/googleplay/edu/about.jd b/docs/html/distribute/googleplay/edu/about.jd index 3944909..60d9402 100644 --- a/docs/html/distribute/googleplay/edu/about.jd +++ b/docs/html/distribute/googleplay/edu/about.jd @@ -9,7 +9,7 @@ Xnonavpage=true <p> Google Play for Education is an extension of Google Play designed for - schools. Here educators can discover apps approved by teachers for teachers, + schools. Here educators can discover Android and Chrome apps approved by teachers for teachers, as well as educational videos and a collection of classic books for their classroom. </p> @@ -22,7 +22,7 @@ Xnonavpage=true </p> -<div class="resource-widget resource-flow-layout col-13" +<div class="resource-widget resource-flow-layout col-13" style="height:323px" data-query="collection:distribute/googleplay/gpfe/highlight" data-sortOrder="-timestamp" data-cardSizes="18x6," @@ -106,8 +106,10 @@ Xnonavpage=true </div> </div> -<div class="headerLine clearfloat"> -<h1>Related Resources</h1><hr> +<p style="clear:both"> +</p> +<div class="headerLine"> +<h2 id="related-resources">Related Resources</h2> </div> <div class="dynamic-grid"> diff --git a/docs/html/distribute/googleplay/edu/faq.jd b/docs/html/distribute/googleplay/edu/faq.jd deleted file mode 100644 index 0866da5..0000000 --- a/docs/html/distribute/googleplay/edu/faq.jd +++ /dev/null @@ -1,433 +0,0 @@ -page.title=Education FAQ -meta.tags="gpfe, edu" -page.metaDescription=Answers to frequent questions about Google Play for Education. -page.image=/distribute/images/gpfe-faq.jpg - -@jd:body - -<div id="qv-wrapper"> - <div id="qv"> - <h2> - Topics - </h2> - - <ol> - <li> - <a href="#business-model-and-monetization">Business Model and - Monetization</a> - </li> - - <li> - <a href="#free-trials">Free Trials</a> - </li> - - <li> - <a href="#discovery">Discovery</a> - </li> - - <li> - <a href="#app-review-process">App Review Process</a> - </li> - - <li> - <a href="#app-features">App Features</a> - </li> - - <li> - <a href="#marketing-and-roi">Marketing and ROI</a> - </li> - - <li> - <a href="#devices">Devices</a> - </li> - - <li> - <a href="#accounts">Accounts</a> - </li> - - <li> - <a href="#related-resources">Related Resources</a> - </li> - </ol> - </div> -</div> - -<p> - This page provides answers to common questions that you might have about - Google Play for Education. -</p> - -<div class="headerLine"> - <h1 id="business-model-and-monetization"> - Business Model and Monetization - </h1> - - <hr> -</div> - -<p> - <strong>What is Google Play for Education?</strong> -</p> - -<p> - Google Play for Education is a new online destination designed for schools. - Teachers can discover educational apps, books, and videos to meet the needs - of a single student, a classroom, or a whole district. Educators can browse - apps by grade, subject, keyword, or standard including Common Core State - Standards. Purchasing is done using a PO with no credit card required. Apps - are distributed to tablets instantly through the cloud. -</p> - -<p> - <strong>Is Google Play for Education primarily for students or - educators?</strong> -</p> - -<p> - The store on Google Play for Education is for educators, but its content is - for both educators and students. Teachers and administrators have the ability - to make purchases and control who within their school has access to the - purchase flows. -</p> - -<div class="figure"> - <img src="{@docRoot}distribute/images/gpfe-faq.jpg" style= - "width:480px;margin:1em 0em 1.5em 1.5em;"> -</div> - -<p> - <strong>Will Google Play for Education support subscription - purchases?</strong> -</p> - -<p> - Currently, Google Play for Education supports one-time purchases. We’re - investigating additional purchase mechanisms to enable more flexible pricing - models for developers and schools. -</p> - -<p> - <strong>Why is it recommended that in-app purchase features are - removed?</strong> -</p> - -<p> - In-app Billing is currently not supported with Google Play for Education, and - a student device will block the Google Play transaction if a student attempts - to make an in-app purchase. To avoid confusing students, we recommend not - including any in-app purchase buttons and other UI in your apps. We’re - investigating additional purchase mechanisms to enable more flexible pricing - models for developers and schools. -</p> - -<p> - <strong>Is Google Play for Education restricted so only its users can - purchase from the Google Play for Education? Or will anyone be able to - purchase from it?</strong> -</p> - -<p> - Currently, only schools that are signed up for Google Play for Education can - make purchases on it. -</p> - -<p> - <strong>Can I set different prices for my apps in Google Play for Education - and Google Play?</strong> -</p> - -<p> - You set a single price for each app that applies to both Google Play and - Google Play for Education. You can’t set a different price for a given app - (based on a single package name) in Google Play for Education. -</p> - -<div class="headerLine"> - <h1 id="free-trials"> - Free Trials - </h1> - - <hr> -</div> - -<p> - <strong>Can I offer free trials through Google Play for Education?</strong> -</p> - -<p> - Google Play for Education doesn't currently support free trials. If you want, - you can offer a free version of your app with limited functionality in Google - Play for Education, but that app would need to be separate from your paid app - and be reviewed separately for educational content. -</p> - -<p> - <strong>Can I offer a free trial through Google Play's "In-app Subscriptions - with Free Trials" feature?</strong> -</p> - -<p> - Google Play for Education doesn’t currently support In-app Billing or In-app - Subscriptions with free trials. -</p> - -<div class="headerLine"> - <h1 id="discovery"> - Discovery - </h1> - - <hr> -</div> - -<p> - <strong>What are the categories in Google Play for Education?</strong> -</p> - -<p> - Google Play for Education includes categories for all grade levels from - Kindergarten to 12 and the following subjects: English Language Arts, World - Languages, Mathematics, Science, Social Science, Elective, Open Education - Resources (OER), and Tools. -</p> - -<p> - <strong>I created an app specifically for Google Play for Education and don’t - want it to show up in Google Play. Is this possible?</strong> -</p> - -<p> - Currently, it’s not possible to publish an app on Google Play for Education - and make it unavailable on Google Play. -</p> - -<p> - <strong>If my app offers content for every level of education, how will it - fit the Common Core State Standard filters?</strong> -</p> - -<p> - If your app applies to multiple levels of education, then the app will show - up in filtered results for multiple levels. -</p> - -<div class="headerLine"> - <h1 id="app-review-process"> - App Review Process - </h1> - - <hr> -</div> - -<p> - <strong>How are apps being reviewed? By whom and against what - criteria?</strong> -</p> - -<p> - Apps are being reviewed by a third-party network of educators. These - educators assign the appropriate subject, grade, and Common Core State - Standards metadata, as well as evaluating whether the app meets the Google - Play for Education <a href= - "{@docRoot}distribute/essentials/gpfe-guidelines.html">criteria for classroom - use</a>. -</p> - -<p> - <strong>How do I update my apps in Google Play for Education?</strong> -</p> - -<p> - You can update your apps on Google Play for Education in the same manner you - do on Google Play. App updates will not be reviewed prior to being made - available through Google Play for Education. However, we will periodically - review updated apps for quality. -</p> - -<p> - <strong>Does the app maturity rating reflect solely on what a user can do - within my Android app, or does the web version of my app influence the rating - as well?</strong> -</p> - -<p> - The maturity rating that you set for an Android app refers only to the - content displayed in that app. -</p> - -<div class="headerLine"> - <h1 id="app-features"> - App Features - </h1> - - <hr> -</div> - -<p> - <strong>Do I need separate builds of my phone and tablet apps for Google Play - for Education, or is it the exact same app that lives on Google - Play?</strong> -</p> - -<p> - We recommend you create one app and use it in both Google Play and Google - Play for Education. -</p> - -<p> - <strong>What is the best way to get students’ work within apps sent back to - their teachers?</strong> -</p> - -<p> - Teachers have mentioned that many apps achieve this by email from a third - party, which isn’t optimal for schools. As many schools use Google Apps for - Education, consider integrating your apps with Google Drive using the - <a href="https://developers.google.com/drive/about-sdk">SDK</a>. -</p> - -<p> - <strong>How can developers test the teacher experience in Google Play for - Education? Is there a way to get an account to test it?</strong> -</p> - -<p> - Currently, we are unable to provide developers with a test account to test - the Google Play for Education user experience. We’re investigating ways to - allow developers to simulate the environment. -</p> - -<p> - <strong>If I already have an app in the Chrome Apps Pack will I get some help - migrating this to Android?</strong> -</p> - -<p> - If you’d like to reach tablet users in schools we encourage you to build a - native app for the optimal user experience. Considerations for building your - apps can be found in the <a href= - "{@docRoot}distribute/essentials/gpfe-guidelines.html">Google Play for - Education Guidelines</a>. -</p> - -<div class="headerLine"> - <h1 id="marketing-and-roi"> - Marketing and ROI - </h1> - - <hr> -</div> - -<p> - <strong>What are you doing to promote these apps to educators?</strong> -</p> - -<p> - Google Play for Education is an extension of Google Play targeting schools - and making the discovery of educational apps easier. It helps your apps gain - visibility with the right audiences, without having to knock on school doors. - We’re constantly referring to the highest quality apps in our educator - outreach. We’ve also developed a series of collections to help educators - quickly browse apps for the most common use cases. -</p> - -<p> - <strong>How many installs have similar apps had on Google Play for Education? - How much can I expect to make if I do an ROI analysis?</strong> -</p> - -<p> - While we cannot disclose specific numbers, Google Play app listings provide - app download ranges for all apps. -</p> - -<p> - <strong>What is the seasonality like for the education market? What are the - key timing considerations for app developers?</strong> -</p> - -<p> - In the United States, school districts’ budget decisions go through a - planning phase in the Spring with budgets being released on July 1. We’ve - observed high purchase-volumes in the second quarter of the calendar year, to - use up end-of-year budgets. New budget purchases begin in the third quarter - of the calendar year. -</p> - -<p> - <strong>Is there a way to offer a special deal, such as a discount, only on - Google Play for Education and not on Google Play?</strong> -</p> - -<p> - No, this isn’t possible. Pricing, including special offers, must be the same - between Google Play for Education and Google Play. -</p> - -<div class="headerLine"> - <h1 id="devices"> - Devices - </h1> - - <hr> -</div> - -<p> - <strong>Which devices are available in the program? Will more be - available?</strong> -</p> - -<p> - Nexus 7 is available for shipment now, and the Asus Transformer, HP Slate 8 - Pro, and Galaxy Tab for Education will be available in early 2014. We look - forward to welcoming more Android devices into the Google in Education family - soon. -</p> - -<p> - <strong>Can the devices be shared among many students?</strong> -</p> - -<p> - No. Currently, this program is for one-to-one use. Each student can login to - one specific tablet that is allocated to them. -</p> - -<div class="headerLine"> - <h1 id="accounts"> - Accounts - </h1> - - <hr> -</div> - -<p> - <strong>Will an app know whether a user is a teacher or student?</strong> -</p> - -<p> - No, the app has no mechanism for knowing if it’s running on a teacher’s - device or a student’s device. We recommend developers use their own user - database to enable this feature, where logins can be based on Google Account - information. -</p> - -<p> - <strong>What log-in method do you recommend for an app on Google Play for - Education?</strong> -</p> - -<p> - One of the key pieces of feedback we’ve heard multiple times from various - schools is that they prefer apps that offer Google Single Sign-on, so that - teachers and students don’t need to remember multiple log-in credentials. As - schools in the program use Google Accounts and Google Apps for Education, - offering Google Single Sign-on is ideal. -</p> -<div class="headerLine"><h1 id="related-resources">Related Resources</h1><hr></div> - -<div class="resource-widget resource-flow-layout col-13" - data-query="collection:distribute/toolsreference/gpfefaq" - data-sortOrder="-timestamp" - data-cardSizes="6x3,6x3,6x3,9x3,9x3,9x3" - data-maxResults="6"></div> - diff --git a/docs/html/distribute/googleplay/edu/start.jd b/docs/html/distribute/googleplay/edu/start.jd index 260ae85..136611c 100644 --- a/docs/html/distribute/googleplay/edu/start.jd +++ b/docs/html/distribute/googleplay/edu/start.jd @@ -1,4 +1,4 @@ -page.title=Get Started with Education +page.title=Publish Android Apps for Education page.image=/distribute/images/play-education.jpg meta.tags="education", "guidelines", "quality" page.tags="education", "addendum" @@ -16,28 +16,30 @@ page.metaDescription=Join Google Play for Education in just a few simple steps. </ol> </div></div> <p> - If you've got great apps for education and want to reach even more teachers + If you've got great Android apps for education and want to reach even more teachers and students, you can join the <strong>Google Play for Education</strong> program in a few simple steps. You do everything using the familiar tools and processes in Google Play. </p> <p> - Note that Google Play for Education is currently available to <strong>K-12 - schools in the United States</strong> only. +Note that Google Play for Education is currently available to <strong>K-12 schools in the United +States</strong> only.</p> + +<p>If you have an educational Chrome app instead of an Android app, you can learn more about +Chrome Apps in Google Play for Education at <a href= +"https://developers.google.com/edu">developers.google.com/edu</a>. </p> -<div class="center-img"> - <img src="{@docRoot}images/gpfe-start-0.jpg" style= - "border:1px solid #ddd;padding:0px;width:100%;"> -</div> +<img src="{@docRoot}images/gpfe-start-0.jpg" style= + "border:1px solid #ddd;padding:0px" width="760" height="403"> -<div class="headerLine clearfloat"> - <h1 id="register"> +<div class="headerLine"> + <h2 id="register"> Register for a Publisher Account - </h1> + </h2> + - <hr> </div> <p> @@ -49,11 +51,11 @@ page.metaDescription=Join Google Play for Education in just a few simple steps. </p> <div class="headerLine"> - <h1 id="prepare"> + <h2 id="prepare"> Prepare Your Apps - </h1> + </h2> + - <hr> </div> <div class="figure-right"> @@ -138,11 +140,11 @@ page.metaDescription=Join Google Play for Education in just a few simple steps. </p> <div class="headerLine"> - <h1 id="publish"> + <h2 id="publish"> Publish Your Apps - </h1> + </h2> + - <hr> </div> <p> @@ -298,7 +300,7 @@ page.metaDescription=Join Google Play for Education in just a few simple steps. </li> </ul> <div class="headerLine"> -<h1 id="related-resources">Related Resources</h1><hr> +<h2 id="related-resources">Related Resources</h2> </div> <div class="dynamic-grid"> diff --git a/docs/html/distribute/googleplay/googleplay_toc.cs b/docs/html/distribute/googleplay/googleplay_toc.cs index 4196c39..36e424a 100644 --- a/docs/html/distribute/googleplay/googleplay_toc.cs +++ b/docs/html/distribute/googleplay/googleplay_toc.cs @@ -25,13 +25,7 @@ </li> <li class="nav-section"> <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/googleplay/edu/start.html"> - <span class="en">Get Started with Education</span> - </a> - </div> - </li> - <li class="nav-section"> - <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/googleplay/edu/faq.html"> - <span class="en">Education FAQ</span> + <span class="en">Publish Android Apps for Education</span> </a> </div> </li> diff --git a/docs/html/distribute/googleplay/start.jd b/docs/html/distribute/googleplay/start.jd index 6dc397b..2ba5880 100644 --- a/docs/html/distribute/googleplay/start.jd +++ b/docs/html/distribute/googleplay/start.jd @@ -33,11 +33,11 @@ page.image=/distribute/images/getting-started.jpg </p> <div class="headerLine"> - <h1> + <h2> Register for a Publisher Account - </h1> + </h2> + - <hr> </div> <div class="sidebox-wrapper" style="float:right;"> @@ -92,11 +92,11 @@ page.image=/distribute/images/getting-started.jpg </ol> <div class="headerLine"> - <h1 id="merchant-account"> + <h2 id="merchant-account"> Set Up a Google Wallet Merchant Account - </h1> + </h2> + - <hr> </div> <div class="figure" style="width:200px;"> @@ -135,11 +135,11 @@ page.image=/distribute/images/getting-started.jpg </p> <div class="headerLine"> - <h1> + <h2> Explore the Developer Console - </h1> + </h2> + - <hr> </div> <p> @@ -153,7 +153,7 @@ page.image=/distribute/images/getting-started.jpg </div> <div class="headerLine"> -<h1 id="related-resources">Related Resources</h1><hr /> +<h2 id="related-resources">Related Resources</h2><hr /> </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/distribute/monetize/ads.jd b/docs/html/distribute/monetize/ads.jd index 40120c3..9a847ff 100644 --- a/docs/html/distribute/monetize/ads.jd +++ b/docs/html/distribute/monetize/ads.jd @@ -10,17 +10,32 @@ page.image=/distribute/images/advertising.png </div> <p> - In-app advertising offers a quick and easy way to incorporate a monetization - option into both your <a href= + Ads can be a quick and easy way to earn more from your <a href= "{@docRoot}distribute/monetize/freemium.html">freemium</a>, <a href= "{@docRoot}distribute/monetize/premium.html">premium</a>, and <a href= - "{@docRoot}distribute/monetize/subscriptions.html">subscription</a> apps. </p> + "{@docRoot}distribute/monetize/subscriptions.html">subscription</a> apps. + AdMob and the Google Mobile Ads SDK let you add advertising to your apps with + just a few lines of code. +</p> + +<p> + The question is: which model gets the best results for your app? Google's ad + tools are made to help you figure out what combination works best for both + your audience and your bottom line. </p> -<p>Using <a href= +<p>Start by linking your AdMob and Google + Analytics accounts to get better insights and more earning power: for + instance, AdMob can promote in-app purchases to the people who buy them most + often, while showing income-generating ads to those less likely to buy right + now. +</p> + +<p> + Using <a href= "http://www.google.com/ads/admob/monetize.html#subid=us-en-et-dac">AdMob</a> - and the <a href="{@docRoot}google/play-services/ads.html">Google - Mobile Ads SDK</a> included in Google Play Services, you’re able to add - advertising into your apps, with just a few lines of code. + and the <a href="{@docRoot}google/play-services/ads.html">Google Mobile Ads + SDK</a> included in Google Play Services, you’re able to add advertising into + your apps, with just a few lines of code. </p> <p> @@ -30,36 +45,33 @@ page.image=/distribute/images/advertising.png <ul> <li> <p> - <strong>Placement within your apps</strong> — Well placed ads will - optimize your revenue by making it more likely that users will ‘click - through’. Poorly placed ads can result in low click-through rates, and in - the worse cases poor rating and users rapidly abandoning your apps. You - can get advice on how to best place ads from the developer training on - <a href= - "{@docRoot}training/monetization/ads-and-ux.html">using - ads</a>. + <strong>Placement within your apps</strong> — Well-placed ads make + it more likely that users will click through and convert. Poorly-placed + ads lead to lower click-through rates, and even poor ratings and users + abandoning your apps. Our <a href= + "{@docRoot}training/monetization/ads-and-ux.html">developer training</a> + on using ads shows some of the best ways to place ads. </p> </li> <li> <p> <strong>Ad formats</strong> — Every app offers a different type of - experience for users, so it’s important to consider the format of ads - you’re using to ensure it’s compatible with the experience. While banner - ads may work well for a flashlight utility app, an immersive gaming app - may benefit more from a video interstitial. Mismatched ad formats may - negatively affect your users’ experience and ad revenue, so try to select - formats that fit well with the content and flow of your apps. + experience for users, so it’s important that your ad formats match that + experience. While banner ads may work well for a flashlight utility app, + an immersive gaming app may benefit more from a video interstitial. + Mismatched ad formats can make users unhappy and leave money on the + table. </p> </li> <li> <p> - <strong>Maximizing your performance</strong> — Ensure you’re optimizing - your advertising revenue by maximizing your CPMs <em>and</em> fill rate. - Often ad providers will cite very high CPMs but will have a low fill rate - that can severely decrease your effective CPM, so look at both of these - figures. Also consider using a <a href= + <strong>Maximizing your performance</strong> — Make sure you’re + optimizing your advertising revenue by maximizing your CPMs and fill + rate. Ad providers often cite their very high CPMs but don't mention low + fill rates that can severely decrease your effective CPM. Be sure to look + at both of these figures. Consider using a <a href= "https://support.google.com/admob/v2/answer/3063564?hl=en&ref_topic=3063091#subid=us-en-et-dac"> mediation</a> solution if you’d like to use multiple ad providers in your apps. Look for solutions that offer yield management or <a href= @@ -71,30 +83,43 @@ page.image=/distribute/images/advertising.png <li> <p> - <strong>Exercising control options</strong> — A variety of ads promoting a - broad selection of other services or apps may show up within you apps. - Depending on your goals and the type of experience you want to provide - your users, it may make sense to <a href= + <strong>Exercising control options</strong> — A variety of ads may + show up within your app. It may make sense to <a href= "https://support.google.com/admob/v2/answer/3150235?hl=enl#subid=us-en-et-dac"> - block</a> certain advertisements from appearing. Some developers don’t - want apps in a similar category showing to their users, but some don’t - mind. + block</a> certain of those advertisements from appearing, depending on + your goals and the type of experience you want to provide. Some + developers, for instance, don’t want ads for apps in their same category + showing to their users, while others don’t mind at all. </p> </li> <li> <p> - <strong>Cross promoting your other apps</strong> — Ads can be used for - more than just earning revenue. Consider using <a href= + <strong>Cross promoting your other apps</strong> — Ads can do more + than earn revenue. Consider running <a href= "https://support.google.com/admob/v2/answer/3210452?hl=en#subid=us-en-et-dac"> - house ads</a> within your apps to create awareness and promote your - entire portfolio of apps. When launching new apps, an easy way to quickly - attract users is to promote directly to your existing customers. + house ads</a> within your apps to promote other apps in your portfolio. + When you launch a new app, this kind of promotion is a free and easy way + to attract new users quickly. </p> </li> </ul> <p> + Don't forget that paid channels like AdWords and YouTube can help you cast a + wider net by reaching targeted audiences outside the app ecosystem. They're a + great way to find new users at a price that you control. <a href= + "https://support.google.com/adwords/answer/2549053">Learn more</a>. +</p> + +<p> + To start monetizing with ads, sign up for AdMob and integrate the Google + Mobile Ads SDK into your apps. If you also need to manage direct deals with + advertisers, consider using DoubleClick for Publishers Small Business. +</p> + + +<p> To start monetizing with ads sign up for <a href= "http://www.google.com/ads/admob/#subid=us-en-et-dac">AdMob</a> and integrate the <a href="https://developers.google.com/mobile-ads-sdk/download">Google @@ -104,7 +129,7 @@ page.image=/distribute/images/advertising.png DoubleClick for Publishers Small Business</a>. </p> -<div class="headerLine"><h1 id="related-resources">Related resources</h1><hr></div> +<div class="headerLine"><h2 id="related-resources">Related resources</h2></div> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/monetize/advertising" diff --git a/docs/html/distribute/monetize/ecommerce.jd b/docs/html/distribute/monetize/ecommerce.jd index b3f790d..65e2b20 100644 --- a/docs/html/distribute/monetize/ecommerce.jd +++ b/docs/html/distribute/monetize/ecommerce.jd @@ -44,12 +44,14 @@ page.tags="monetizing", "physical goods", "wallet" Account</a>. </p> -<div class="headerLine clearfloat"> - <h1 id="related-resources"> +<p style="clear:both"> +</p> +<div class="headerLine"> + <h2 id="related-resources"> Related Resources - </h1> + </h2> + - <hr> </div> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/monetize/ecommerce" diff --git a/docs/html/distribute/monetize/freemium.jd b/docs/html/distribute/monetize/freemium.jd index ec86d19..0d33054 100644 --- a/docs/html/distribute/monetize/freemium.jd +++ b/docs/html/distribute/monetize/freemium.jd @@ -66,11 +66,11 @@ page.tags="in-app", "billing", "iap", "monetizing" </p> <div class="headerLine"> - <h1 id="related-resources"> + <h2 id="related-resources"> Related Resources - </h1> + </h2> + - <hr> </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/distribute/monetize/payments.jd b/docs/html/distribute/monetize/payments.jd index 37b4d44..55c289f 100644 --- a/docs/html/distribute/monetize/payments.jd +++ b/docs/html/distribute/monetize/payments.jd @@ -17,11 +17,11 @@ page.tags="google play", "payments", "gift card" </p> <div class="headerLine"> - <h1 id="dcb"> + <h2 id="dcb"> Direct Carrier Billing - </h1> + </h2> + - <hr> </div> <p> @@ -33,10 +33,10 @@ page.tags="google play", "payments", "gift card" </p> <div class="headerLine"> - <h1 id="credit"> + <h2 id="credit"> Credit Cards - </h1> - <hr> + </h2> + </div> <p> @@ -47,12 +47,12 @@ page.tags="google play", "payments", "gift card" setup process. </p> -<div class="headerLine clearfloat"> - <h1 id="gift-cards"> +<div class="headerLine"> + <h2 id="gift-cards"> Google Play Gift Cards - </h1> + </h2> + - <hr> </div> <div class="figure"> @@ -67,12 +67,14 @@ page.tags="google play", "payments", "gift card" "_android">here</a>. </p> -<div class="headerLine clearfloat"> - <h1 id="balance"> +<p style="clear:both"> +</p> +<div class="headerLine"> + <h2 id="balance"> Google Play Balance - </h1> + </h2> + - <hr> </div> <div class="figure"> @@ -94,7 +96,9 @@ page.tags="google play", "payments", "gift card" network, and other factors. </p> -<div class="headerLine clearfloat"><h1 id="related-resources">Related Resources</h1><hr></div> +<p style="clear:both"> +</p> +<div class="headerLine"><h2 id="related-resources">Related Resources</h2></div> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/monetize/paymentmethods" diff --git a/docs/html/distribute/monetize/premium.jd b/docs/html/distribute/monetize/premium.jd index b66cd03..c8823d1 100644 --- a/docs/html/distribute/monetize/premium.jd +++ b/docs/html/distribute/monetize/premium.jd @@ -35,11 +35,13 @@ page.tags="monetizing", "paid" <a href="{@docRoot}distribute/monetize/ads.html">advertising</a> models. </p> -<div class="headerLine clearfloat"> - <h1> +<p style="clear:both"> +</p> +<div class="headerLine"> + <h2> Related Resources - </h1> - <hr> + </h2> + </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/distribute/monetize/subscriptions.jd b/docs/html/distribute/monetize/subscriptions.jd index a838e30..6a4d9b1 100644 --- a/docs/html/distribute/monetize/subscriptions.jd +++ b/docs/html/distribute/monetize/subscriptions.jd @@ -61,7 +61,9 @@ page.tags="in-app", "iap", "monetizing", "free", "trials" </p> </div> -<div class="headerLine clearfloat"><h1 id="related-resources">Related Resources</h1><hr></div> +<p style="clear:both"> +</p> +<div class="headerLine"><h2 id="related-resources">Related Resources</h2></div> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/monetize/subscriptions" diff --git a/docs/html/distribute/tools/launch-checklist.jd b/docs/html/distribute/tools/launch-checklist.jd index 3b0dd55..f310800 100644 --- a/docs/html/distribute/tools/launch-checklist.jd +++ b/docs/html/distribute/tools/launch-checklist.jd @@ -62,11 +62,11 @@ src="{@docRoot}distribute/images/launch-checklist.jpg"></div> </p> <div class="headerLine"> - <h1 id="understand-publishing"> + <h2 id="understand-publishing"> 1. Understand the Publishing Process - </h1> + </h2> + - <hr> </div> <p> @@ -85,9 +85,7 @@ src="{@docRoot}distribute/images/launch-checklist.jpg"></div> Play. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/understanding" @@ -95,12 +93,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="understand-policies"> +<div class="headerLine"> + <h2 id="understand-policies"> 2. Understand Google Play Policies and Agreements - </h1> + </h2> + - <hr> </div> <p> @@ -110,21 +108,19 @@ data-maxresults="6"> repeated violations, termination of your developer account. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/policies" data-sortorder= "-timestamp" data-cardsizes="6x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="test-quality"> +<div class="headerLine"> + <h2 id="test-quality"> 3. Test for Quality - </h1> + </h2> + - <hr> </div> <p> @@ -154,21 +150,19 @@ data-maxresults="6"> should exhibit. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/quality" data-sortorder= "-timestamp" data-cardsizes="6x3,6x3,6x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="determine-rating"> +<div class="headerLine"> + <h2 id="determine-rating"> 4. Determine your App’s Content Rating - </h1> + </h2> + - <hr> </div> <p> @@ -212,21 +206,19 @@ data-maxresults="6"> no changes are required in your app binary. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/rating" data-sortorder= "-timestamp" data-cardsizes="9x3,6x3,6x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="determine-country"> +<div class="headerLine"> + <h2 id="determine-country"> 5. Determine Country Distribution - </h1> + </h2> + - <hr> </div> <p> @@ -280,21 +272,19 @@ data-maxresults="6"> Checklist</a> for key steps and considerations in the localization process. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/country" data-sortorder= "-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="confirm-size"> +<div class="headerLine"> + <h2 id="confirm-size"> 6. Confirm the App's Overall Size - </h1> + </h2> + - <hr> </div> <p> @@ -335,21 +325,19 @@ data-maxresults="6"> on your code when building your release-ready APK. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/size" data-sortorder= "-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="confirm-platform"> +<div class="headerLine"> + <h2 id="confirm-platform"> 7. Confirm the App's Platform and Screen Compatibility Ranges - </h1> + </h2> + - <hr> </div> <p> @@ -387,21 +375,19 @@ data-maxresults="6"> <a href="{@docRoot}about/dashboards/index.html">Device Dashboard</a> charts. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/platform" data-sortorder= "-timestamp" data-cardsizes="6x3,6x3,6x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="decide-price"> +<div class="headerLine"> + <h2 id="decide-price"> 8. Decide Whether your App will be Free or Priced - </h1> + </h2> + - <hr> </div> <div class="figure"> @@ -450,21 +436,19 @@ data-maxresults="6"> set up a Google Wallet Merchant Account</a> before you can publish. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/price" data-sortorder= "-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="consider-billing"> +<div class="headerLine"> + <h2 id="consider-billing"> 9. Consider using In-app Billing - </h1> + </h2> + - <hr> </div> <p> @@ -485,9 +469,7 @@ data-maxresults="6"> complete and test your implementation before creating your release-ready APK. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/purchasemethod" @@ -495,12 +477,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="set-prices"> +<div class="headerLine"> + <h2 id="set-prices"> 10. Set Prices for your Products - </h1> + </h2> + - <hr> </div> <p> @@ -517,21 +499,19 @@ data-maxresults="6"> available currencies through the Developer Console. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/setprice" data-sortorder= "-timestamp" data-cardsizes="9x3,9x3,9x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="start-localization"> +<div class="headerLine"> + <h2 id="start-localization"> 11. Start Localization - </h1> + </h2> + - <hr> </div> <p> @@ -599,9 +579,7 @@ data-maxresults="6"> listing. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/localization" @@ -609,12 +587,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="prepare-graphics"> +<div class="headerLine"> + <h2 id="prepare-graphics"> 12. Prepare Promotional Graphics, Screenshots, and Videos - </h1> + </h2> + - <hr> </div> <p> @@ -659,21 +637,19 @@ data-maxresults="6"> publishing date. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/graphics" data-sortorder= "-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="build-upload"> +<div class="headerLine"> + <h2 id="build-upload"> 13. Build and Upload the Release-ready APK - </h1> + </h2> + - <hr> </div> <p> @@ -701,7 +677,7 @@ data-maxresults="6"> Developer Console. If necessary, you can replace an APK with a more recent version before publishing. </p> -<!--<h3>Related resources</h3> +<!--<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/build" @@ -709,12 +685,12 @@ data-maxresults="6"> data-cardSizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxResults="6"></div>--> -<div class="headerLine clearfloat"> - <h1 id="plan-beta"> +<div class="headerLine"> + <h2 id="plan-beta"> 14. Plan a Beta Release - </h1> + </h2> + - <hr> </div> <div class="sidebox-wrapper" style="float:right;"> @@ -765,11 +741,11 @@ See how you can facilitate testing with Google Play.</td> </table> --> <div class="headerLine"> - <h1 id="complete-details"> + <h2 id="complete-details"> 15. Complete the Apps’ Store Listing - </h1> + </h2> + - <hr> </div> <p> @@ -815,9 +791,7 @@ See how you can facilitate testing with Google Play.</td> elsewhere. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/productdetails" @@ -825,12 +799,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="use-badges"> +<div class="headerLine"> + <h2 id="use-badges"> 16. Use Google Play Badges and Links in your Promotional Campaigns - </h1> + </h2> + - <hr> </div> <p> @@ -853,21 +827,19 @@ data-maxresults="6"> available. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/badges" data-sortorder= "-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="final-checks"> +<div class="headerLine"> + <h2 id="final-checks"> 17. Final Checks and Publishing - </h1> + </h2> + - <hr> </div> <p> @@ -959,9 +931,7 @@ data-maxresults="6"> linking from your promotional campaigns. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/launchchecklist/finalchecks" @@ -969,12 +939,12 @@ data-sortorder="-timestamp" data-cardsizes="6x3,6x3,6x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="support-users"> +<div class="headerLine"> + <h2 id="support-users"> 18. Support Users after Launch - </h1> + </h2> + - <hr> </div> <p> @@ -1063,7 +1033,7 @@ data-maxresults="6"> </ul> </ul> -<h3>Related resources</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/launchchecklist/afterlaunch" diff --git a/docs/html/distribute/tools/localization-checklist.jd b/docs/html/distribute/tools/localization-checklist.jd index 7a638ed..08a8143 100644 --- a/docs/html/distribute/tools/localization-checklist.jd +++ b/docs/html/distribute/tools/localization-checklist.jd @@ -41,11 +41,11 @@ page.image=/distribute/images/localization-checklist.jpg </p> <div class="headerLine"> - <h1 id="identify-languages"> + <h2 id="identify-languages"> 1. Identify target languages and locales - </h1> + </h2> + - <hr> </div> <p> @@ -84,21 +84,19 @@ page.image=/distribute/images/localization-checklist.jpg development, translation, testing, and marketing efforts to these markets. </p> -<h3 id="related-resources"> - Related Resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/localizationchecklist/identifylocales" data-sortorder="-timestamp" data-cardsizes="9x3," data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="design"> +<div class="headerLine"> + <h2 id="design"> 2. Design for localization - </h1> + </h2> + - <hr> </div> <p> @@ -224,21 +222,19 @@ data-sortorder="-timestamp" data-cardsizes="9x3," data-maxresults="6"> directories, without language or locale qualifiers. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/tools/loc/designforloc" data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="manage-strings"> +<div class="headerLine"> + <h2 id="manage-strings"> 3. Manage strings for localization - </h1> + </h2> + - <hr> </div> <p> @@ -399,21 +395,19 @@ data-cardsizes="9x3" data-maxresults="6"> </resources> </pre> -<h3 class="clearfloat"> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/localizationchecklist/managestrings" data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="translate-strings"> +<div class="headerLine"> + <h2 id="translate-strings"> 4. Translate UI strings and other resources - </h1> + </h2> + - <hr> </div> <p> @@ -570,21 +564,19 @@ data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6"> <img src="{@docRoot}images/gp-localization-trans-0.png" class="border-img"> </div> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/localizationchecklist/translatestrings" data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="test"> +<div class="headerLine"> + <h2 id="test"> 5. Test your localized app - </h1> + </h2> + - <hr> </div> <p> @@ -690,7 +682,7 @@ data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6"> your localized apps. One way to do that is through beta testing with regional users — Google Play can help you do this. <!-- </p> -<h3 class="clearfloat">Related resources</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/localizationchecklist/test" @@ -699,12 +691,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6"> data-maxResults="6"></div> --> </p> -<div class="headerLine clearfloat"> - <h1 id="prepare-launch"> +<div class="headerLine"> + <h2 id="prepare-launch"> 6. Prepare for international launch - </h1> + </h2> + - <hr> </div> <p> @@ -887,9 +879,7 @@ data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6"> helpful reminders for a successful localized launch. </p> -<h3> - Related resources -</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query= "collection:distribute/toolsreference/localizationchecklist/preplaunch" @@ -897,12 +887,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6"> </div> -<div class="headerLine clearfloat"> - <h1 id="support-users"> +<div class="headerLine"> + <h2 id="support-users"> 7. Support international users after launch - </h1> + </h2> + - <hr> </div> <p> @@ -968,7 +958,7 @@ data-maxresults="6"> "{@docRoot}distribute/tools/launch-checklist.html">Launch Checklist</a> to learn more about how to plan, build, and launch your app on Google Play. </p> -<h3 class="clearfloat">Related resources</h3> +<h3 class="rel-resources clearfloat">Related resources</h3> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/toolsreference/localizationchecklist/supportlaunch" diff --git a/docs/html/distribute/tools/open-distribution.jd b/docs/html/distribute/tools/open-distribution.jd index f804af2..e28102d 100644 --- a/docs/html/distribute/tools/open-distribution.jd +++ b/docs/html/distribute/tools/open-distribution.jd @@ -26,11 +26,11 @@ page.image=/distribute/images/alt-distribution.jpg </p> <div class="headerLine"> - <h1> + <h2> Distributing Through an App Marketplace - </h1> + </h2> + - <hr> </div> <p> @@ -55,11 +55,11 @@ page.image=/distribute/images/alt-distribution.jpg </p> <div class="headerLine"> - <h1> + <h2> Distributing Your Apps by Email - </h1> + </h2> + - <hr> </div> <div class="figure" style="width:300px;"> @@ -95,11 +95,11 @@ page.image=/distribute/images/alt-distribution.jpg </p> <div class="headerLine"> - <h1> + <h2> Distributing Through a Website - </h1> + </h2> + - <hr> </div> <p> @@ -119,12 +119,12 @@ page.image=/distribute/images/alt-distribution.jpg sources</a>. </p> -<div class="headerLine clearfloat"> - <h1> +<div class="headerLine"> + <h2> User Opt-In for Apps from Unknown Sources - </h1> + </h2> + - <hr> </div> <div class="figure" style="width:325px;"> diff --git a/docs/html/distribute/tools/promote/badge-files.jd b/docs/html/distribute/tools/promote/badge-files.jd index cce3632..e65e698 100644 --- a/docs/html/distribute/tools/promote/badge-files.jd +++ b/docs/html/distribute/tools/promote/badge-files.jd @@ -12,7 +12,7 @@ table tr td {border:0} <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> @@ -21,9 +21,10 @@ two Google Play badges.</p> <a href="{@docRoot}downloads/brand/v2/english_get.ai">English (English)</a><br/> + <a href="{@docRoot}downloads/brand/af_generic_rgb_wo.ai">Afrikaans (Afrikaans)</a><br/> + <a href="{@docRoot}downloads/brand/v2/amharic_get.ai">ኣማáˆáŠ› (Amharic)</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/> --> @@ -137,7 +138,7 @@ two Google Play badges.</p> -<hr> + <img src="{@docRoot}images/brand/en_app_rgb_wo_60.png" alt="Android App On Google Play"> <div style="clear:left"> </div> @@ -286,6 +287,3 @@ Guidelines</a>. <p>To quickly create a badge that links to your apps on Google Play, use the <a href="{@docRoot}distribute/tools/promote/badges.html">Googe Play badge generator</a>.</p> - - -
\ No newline at end of file diff --git a/docs/html/distribute/tools/promote/brand.jd b/docs/html/distribute/tools/promote/brand.jd index 2116c0f..9b9f9a3 100644 --- a/docs/html/distribute/tools/promote/brand.jd +++ b/docs/html/distribute/tools/promote/brand.jd @@ -9,6 +9,11 @@ page.tags="brand, bugdroid, assets" promotional materials. You can use the icons and other assets on this page provided that you follow the guidelines.</p> +<p>Use of the Android or Google Play brands must be reviewed by the Android +Partner Marketing team. Use the <a +href="https://docs.google.com/forms/d/1YE5gZpAAcFKjYcUddCsK1Bv9a9Y-luaLVnkazVlaJ2w/viewform">Android and Google Play Brand Permissions Inquiry form</a> to submit your +marketing for review.</p> + <h2 id="brand-android">Android</h2> <p>The following are guidelines for the Android brand @@ -29,10 +34,12 @@ provided that you follow the guidelines.</p> <li><span style="color:red">Incorrect</span>: "Android MediaPlayer"</li> <li><span style="color:green">Correct</span>: "MediaPlayer for Android"</li> </ul> - <p>If used with your logo, "for Android" needs to be smaller in size than your logo. + <p>If used with your logo, "for Android" should be no larger than 90% of your logo’s size. First instance of this use should be followed by a TM symbol, "for Android™".</p> </li> - <li>Android may be used as a descriptor, as long as it is followed by a proper generic term. + <li>Android may be used as a descriptor, as long as it is followed by a + proper generic term. (Think of "Android" as a term used in place of + "the Android platform.") <ul> <li><span style="color:red">Incorrect</span>: "Android MediaPlayer" or "Android XYZ app"</li> <li><span style="color:green">Correct</span>: "Android features" or "Android applications"</li> @@ -62,14 +69,14 @@ provided that you follow the guidelines.</p> <p>When using the Android Robot or any modification of it, proper attribution is required under the terms of the <a href="http://creativecommons.org/licenses/by/3.0/">Creative -Commons Attribution</a> license:</p> + Commons Attribution 3.0</a> license:</p> <blockquote><em>The Android robot is reproduced or modified from work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License.</em></blockquote> - <p>You may not file trademark applications incorporating the Android robot logo or -derivatives thereof. We want to ensure that the Android robot remains available -for all to use.</p> + <p>You may not file trademark applications incorporating the Android robot + logo or derivatives thereof within your company logo or business name. We + want to ensure that the Android robot remains available for all to use.</p> <h4 style="clear:right">Android logo</h4> @@ -78,11 +85,9 @@ for all to use.</p> <img alt="" src="{@docRoot}images/brand/android_logo_no.png"> </div> -<p>The Android logo may not be used. Nor can this be used with the Android robot.</p> -<p>The custom typeface may not be used.</p> - - +<p>The Android logo may not be used.</p> +<p>The custom typeface may not be used.</p> <h2 id="brand-google_play">Google Play</h2> @@ -98,7 +103,7 @@ in text.</p> <p>When referring to the mobile experience, use "Google Play" unless the text is clearly instructional for the user. For example, a marketing headline might read "Download our games on Google Play™," but instructional text would read "Download our games using the Google -Play™ Store app." +Play™ store app." <p>Any use of the Google Play name or icon needs to include this attribution in your communication:</p> @@ -111,16 +116,16 @@ Play™ Store app." <p style="text-align:center"> <a href="{@docRoot}images/brand/Google_Play_Store_48.png">48x48</a> | <a href="{@docRoot}images/brand/Google_Play_Store_96.png">96x96</a><br> - <a href="{@docRoot}downloads/brand/Google_Play_Store.ai">Illustrator (.ai)</a> + <a href="{@docRoot}images/brand/Google_Play_Store_600.png">600x576</a> </p> </div> -<h4>Google Play Store icon</h4> +<h4>Google Play store icon</h4> -<p>You may use the Google Play Store icon, but you may not modify it.</p> +<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 labeling the Google Play Store icon directly, it's OK to use +<p>As mentioned above, when referring to the Google Play store app in copy, use the full name: +"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> @@ -140,9 +145,14 @@ Play™ Store app." <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 - can use on your website and promotional materials, to point to your products on Google - Play.</p> + <p>The "Get it on Google Play" and "Android App on Google Play" logos are + badges that you can use on your website and promotional materials, to point + to your products on Google Play. Additional Google Play badge formats and + badges for music, books, magazines, movies, and TV shows are also available. + Use the <a + href="https://docs.google.com/forms/d/1YE5gZpAAcFKjYcUddCsK1Bv9a9Y-luaLVnkazVlaJ2w/viewform">Android + and Google Play Brand Permissions Inquiry form</a> to request + those badges.</p> <ul> <li>Don't modify the color, proportions, spacing, or any other aspect of the badge image. @@ -163,7 +173,7 @@ Play™ Store app." <p>To quickly create a badge that links to your apps on Google Play, use the <a - href="{@docRoot}distribute/tools/promote/badges.html">Googe Play badge generator</a> + href="{@docRoot}distribute/tools/promote/badges.html">Google 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 @@ -171,25 +181,11 @@ Play™ Store app." 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/tools/promote/linking.html">Linking to your products</a></p> - - - -<h2 id="Questions">Questions</h2> - -<p>To view our full guidelines or for any further brand usage questions, please contact our -Android Partner Marketing team:</p> -<ul> - <li>For North and South America, please contact <a - href="mailto:android-brand-approvals@google.com?Subject=Brand%20Approval%20Questions" - >android-brand-approvals@google.com</a></li> - - <li>For Europe and Emerging Markets, please contact <a - href="mailto:emea-android-brand@google.com?Subject=Brand%20Approval%20Questions" - >emea-android-brand@google.com</a></li> + see <a href="{@docRoot}distribute/tools/promote/linking.html">Linking to your products</a>.</p> - <li>For Asia and Pacific-America, please contact <a - href="mailto:apac-android-brand-approvals@google.com?Subject=Brand%20Approval%20Questions" - >apac-android-brand-approvals@google.com</a></li> -</ul> +<h2 id="Marketing_Review">Marketing Reviews and Brand Inquiries</h2> +<p>Use the <a +href="https://docs.google.com/forms/d/1YE5gZpAAcFKjYcUddCsK1Bv9a9Y-luaLVnkazVlaJ2w/viewform">Android +and Google Play Brand Permissions Inquiry form</a> to submit any marketing +reviews or brand inquires. Typical response time is at least one week.</p> diff --git a/docs/html/distribute/tools/promote/device-art.jd b/docs/html/distribute/tools/promote/device-art.jd index b0b5f84..a204ea1 100644 --- a/docs/html/distribute/tools/promote/device-art.jd +++ b/docs/html/distribute/tools/promote/device-art.jd @@ -12,7 +12,7 @@ Xnonavpage=true <p class="note"><strong>Note</strong>: Do <em>not</em> use graphics created here in your 1024x500 feature image or screenshots for your Google Play app listing.</p> -<hr> + <div class="supported-browser"> @@ -28,7 +28,7 @@ feature image or screenshots for your Google Play app listing.</p> </div> </div> -<hr> + <div class="layout-content-row"> <div class="layout-content-col span-3"> diff --git a/docs/html/distribute/users/build-buzz.jd b/docs/html/distribute/users/build-buzz.jd index b76498e..412589f 100644 --- a/docs/html/distribute/users/build-buzz.jd +++ b/docs/html/distribute/users/build-buzz.jd @@ -65,11 +65,11 @@ page.tags="users, growth, promotion" </p> <div class="headerLine"> - <h1 id="link-to-your-apps"> + <h2 id="link-to-your-apps"> Link to Your Apps in Google Play - </h1> + </h2> + - <hr> </div> <p> @@ -101,12 +101,12 @@ page.tags="users, growth, promotion" </li> </ul> -<div class="headerLine clearfloat"> - <h1 id="use-the-google-play-badge"> +<div class="headerLine"> + <h2 id="use-the-google-play-badge"> Use the Google Play Badge - </h1> + </h2> + - <hr> </div> <div class="figure" style="margin:0 3em;"> @@ -126,12 +126,12 @@ page.tags="users, growth, promotion" also easy to make and available in multiple languages. </p> -<div class="headerLine clearfloat"> - <h1 id="cross-promote-from-your-other-apps"> +<div class="headerLine"> + <h2 id="cross-promote-from-your-other-apps"> Cross-Promote from Your Other Apps - </h1> + </h2> + - <hr> </div> <div class="figure-right"> @@ -158,11 +158,11 @@ page.tags="users, growth, promotion" </p> <div class="headerLine"> - <h1 id="hold-a-contest"> + <h2 id="hold-a-contest"> Hold a Contest - </h1> + </h2> + - <hr> </div> <p> @@ -180,11 +180,11 @@ page.tags="users, growth, promotion" </p> <div class="headerLine"> - <h1 id="leverage-pr"> + <h2 id="leverage-pr"> Leverage PR - </h1> + </h2> + - <hr> </div> <p> @@ -196,11 +196,11 @@ page.tags="users, growth, promotion" </p> <div class="headerLine"> - <h1 id="use-social-media"> + <h2 id="use-social-media"> Use Social Media - </h1> + </h2> + - <hr> </div> <p> @@ -220,12 +220,12 @@ page.tags="users, growth, promotion" review your apps. A review on the right blog is a great promotion. </p> -<div class="headerLine clearfloat"> - <h1 id="publish-youtube-videos"> +<div class="headerLine"> + <h2 id="publish-youtube-videos"> Publish YouTube Videos - </h1> + </h2> + - <hr> </div> <div class="center-img" style="padding-top:1em;"> @@ -240,11 +240,11 @@ page.tags="users, growth, promotion" </p> <div class="headerLine"> - <h1 id="advertise"> + <h2 id="advertise"> Advertise - </h1> + </h2> + - <hr> </div> <div class="figure"> @@ -262,12 +262,12 @@ page.tags="users, growth, promotion" Sign up for an AdMob account</a> to get started. </p> -<div class="headerLine clearfloat"> - <h1 id="maximize-your-marketing-spend"> +<div class="headerLine"> + <h2 id="maximize-your-marketing-spend"> Maximize your Marketing Spend - </h1> + </h2> + - <hr> </div> <div class="figure" style="margin: 0 3em;"> @@ -285,12 +285,12 @@ page.tags="users, growth, promotion" platforms simultaneously helps you maximize your return on investment. </p> -<div class="headerLine clearfloat"> - <h1 id="related-resources"> +<div class="headerLine"> + <h2 id="related-resources"> Related Resources - </h1> + </h2> + - <hr> </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/distribute/users/build-community.jd b/docs/html/distribute/users/build-community.jd index 1623939..5cdabea 100644 --- a/docs/html/distribute/users/build-community.jd +++ b/docs/html/distribute/users/build-community.jd @@ -43,11 +43,11 @@ page.tags="users, growth, community" </p> <div class="headerLine"> - <h1 id="starting-your-community"> + <h2 id="starting-your-community"> Starting Your Community - </h1> + </h2> + - <hr> </div> <p> @@ -116,11 +116,11 @@ page.tags="users, growth, community" </p> <div class="headerLine"> - <h1 id="tools-to-build-your-community"> + <h2 id="tools-to-build-your-community"> Tools to Build Your Community - </h1> + </h2> + - <hr> </div> <p> @@ -158,11 +158,11 @@ page.tags="users, growth, community" </p> <div class="headerLine"> - <h1 id="managing-your-community"> + <h2 id="managing-your-community"> Managing Your Community - </h1> + </h2> + - <hr> </div> <div class="figure"> @@ -189,11 +189,11 @@ page.tags="users, growth, community" versions or new apps to make them feel special. </p> -<div class="headerLine clearfloat"> - <h1 id="related-resources"> +<div class="headerLine"> + <h2 id="related-resources"> Related Resources - </h1> - <hr> + </h2> + </div> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/users/buildcommunity" diff --git a/docs/html/distribute/users/expand-to-new-markets.jd b/docs/html/distribute/users/expand-to-new-markets.jd index cc94a92..df1a0fb 100644 --- a/docs/html/distribute/users/expand-to-new-markets.jd +++ b/docs/html/distribute/users/expand-to-new-markets.jd @@ -77,11 +77,11 @@ page.tags="users, growth, global" </p> <div class="headerLine"> - <h1 id="localize-your-product"> + <h2 id="localize-your-product"> Localize Your Product - </h1> + </h2> + - <hr> </div> <div class="sidebox-wrapper" style="float:right;"> @@ -124,20 +124,16 @@ page.tags="users, growth, global" high-quality professional translations at competitive prices. </p> -<div style="float:left; width:48%; padding:8px;"> - <img src="{@docRoot}images/gp-listing-3.jpg"> -</div> +<img src="{@docRoot}images/gp-listing-3.jpg" style="padding:8px 0"> -<div style="width:48%; padding:8px; float:left"> - <img src="{@docRoot}images/gp-expand-2.jpg"> -</div> +<img src="{@docRoot}images/gp-expand-2.jpg" style="padding:8px 0"> -<div class="headerLine clearfloat"> - <h1 id="testing-and-support"> +<div class="headerLine"> + <h2 id="testing-and-support"> Testing and Support - </h1> + </h2> + - <hr> </div> <p> @@ -162,11 +158,11 @@ page.tags="users, growth, global" </p> <div class="headerLine"> - <h1 id="localize-your-google-play-listing"> + <h2 id="localize-your-google-play-listing"> Localize Your Google Play Store Listing - </h1> + </h2> + - <hr> </div> <div class="sidebox-wrapper" style="float:right;"> @@ -295,11 +291,11 @@ page.tags="users, growth, global" </p> <div class="headerLine"> - <h1 id="marketing"> + <h2 id="marketing"> Marketing - </h1> + </h2> + - <hr> </div> <div class="figure"> @@ -316,7 +312,7 @@ page.tags="users, growth, global" for each language you support. </p> -<div class="headerLine clearfloat"><h1 id="related-resources">Related Resources</h1><hr></div> +<div class="headerLine"><h2 id="related-resources">Related Resources</h2></div> <div class="resource-widget resource-flow-layout col-13" data-query="collection:distribute/getusers/expandnewmarkets" diff --git a/docs/html/distribute/users/index.jd b/docs/html/distribute/users/index.jd index 77ef609..a810f36 100644 --- a/docs/html/distribute/users/index.jd +++ b/docs/html/distribute/users/index.jd @@ -14,8 +14,8 @@ nonavpage=true <div class="resource-widget resource-flow-layout landing col-16" data-query="collection:distribute/users" - data-cardSizes="6x6, 6x6, 6x6, 9x6, 9x6, 6x6, 6x6, 6x6" - data-maxResults="8"> + data-cardSizes="6x6" + data-maxResults="6"> </div> <h3>Related resources</h3> diff --git a/docs/html/distribute/users/know-your-user.jd b/docs/html/distribute/users/know-your-user.jd index fb91a05..1fbcb9c 100644 --- a/docs/html/distribute/users/know-your-user.jd +++ b/docs/html/distribute/users/know-your-user.jd @@ -15,13 +15,9 @@ page.tags="users, growth, global" when they use your app, and how often they return to it. </p> -<div class="headerLine"> - <h1 id="read-ratings-comments"> + <h2 id="read-ratings-comments"> Read Ratings Comments - </h1> - - <hr> -</div> + </h2> <p> The most obvious way to get to know your users is by reading review comments @@ -46,11 +42,11 @@ page.tags="users, growth, global" </div> <div class="headerLine"> - <h1 id="start-community"> + <h2 id="start-community"> Start a Community - </h1> + </h2> + - <hr> </div> <p> @@ -68,11 +64,11 @@ page.tags="users, growth, global" </p> <div class="headerLine"> - <h1 id="create-survey"> + <h2 id="create-survey"> Create a Survey - </h1> + </h2> + - <hr> </div> <p> @@ -92,11 +88,11 @@ page.tags="users, growth, global" </p> <div class="headerLine"> - <h1 id="add-analytics"> + <h2 id="add-analytics"> Add Analytics to your Apps - </h1> + </h2> + - <hr> </div> <p> @@ -121,11 +117,11 @@ page.tags="users, growth, global" </div> <div class="headerLine"> - <h1 id="use-google"> + <h2 id="use-google"> Use Google+ - </h1> + </h2> + - <hr> </div> <p> @@ -142,8 +138,8 @@ page.tags="users, growth, global" <img src="{@docRoot}images/gp-your-user-2.jpg"> </div> -<div class="headerLine clearfloat"> -<h1 id="related-resources">Related Resources</h1><hr> +<div class="headerLine"> +<h2 id="related-resources">Related Resources</h2> </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/distribute/users/promote-with-ads.jd b/docs/html/distribute/users/promote-with-ads.jd new file mode 100644 index 0000000..1e28ae1 --- /dev/null +++ b/docs/html/distribute/users/promote-with-ads.jd @@ -0,0 +1,45 @@ +page.title=Promote Your App with Ads +page.metaDescription=Promote your app through AdMob, AdWords, and YouTube to find new users at the right moment. +page.image=/images/gp-ads-console.jpg +page.tags="users, ads, analytics" + +@jd:body + +<p> + AdMob is Google's advertising platform for mobile apps. You can use it to + monetize your app and promote your apps, and you can link your Google + Analytics account to AdMob so you can analyze your apps — all in one + place. +</p> + +<p> + <a href="http://www.google.com/ads/admob/">AdMob</a> is the largest mobile ad + app network. But you get more than just massive scale: AdMob will soon help + you find the right users in related apps. If your app is for bicycling, AdMob + can promote your app on other fitness and cycling-related apps worldwide. + <a href= + "https://apps.admob.com/admob/signup?subid=us-en-et-dac&_adc=ww-ww-et-admob2&hl=en"> + Sign up for AdMob</a>. +</p> + +<p> + AdMob also offers new solutions to help you achieve app-related goals such as + downloads, re-engagement and in-app purchases using Google search and the + Google Display Network. These solutions include streamlined campaign creation + flows and tools to track performance across the entire app lifecycle. + <a href="https://support.google.com/adwords/answer/2549053?hl=en">Learn + More</a>. +</p> +<div style="margin-top:2em;"> + <img src="{@docRoot}images/gp-ads-console.jpg"> +</div> + +<div class="headerLine"> +<h2 id="related-resources">Related Resources</h2> +</div> + +<div class="resource-widget resource-flow-layout col-13" + data-query="collection:distribute/users/promotewithads" + data-sortOrder="-timestamp" + data-cardSizes="9x3" + data-maxResults="6"></div>
\ No newline at end of file diff --git a/docs/html/distribute/users/users_toc.cs b/docs/html/distribute/users/users_toc.cs index a2437a6..1f173cb 100644 --- a/docs/html/distribute/users/users_toc.cs +++ b/docs/html/distribute/users/users_toc.cs @@ -28,7 +28,12 @@ </a> </div> </li> - + <li class="nav-section"> + <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/users/promote-with-ads.html"> + <span class="en">Promote with Ads</span> + </a> + </div> + </li> </ul> diff --git a/docs/html/distribute/users/your-listing.jd b/docs/html/distribute/users/your-listing.jd index cc72fff..f869950 100644 --- a/docs/html/distribute/users/your-listing.jd +++ b/docs/html/distribute/users/your-listing.jd @@ -13,11 +13,11 @@ page.tags="listing, google play, users, growth" </p> <div class="headerLine"> - <h1 id="graphics-imagery"> + <h2 id="graphics-imagery"> Graphics & Imagery Tips - </h1> + </h2> + - <hr> </div> <p> @@ -94,12 +94,12 @@ page.tags="listing, google play, users, growth" Featured-Image Guidelines</a>. </p> -<div class="headerLine clearfloat"> - <h1 id="localization-tips"> +<div class="headerLine"> + <h2 id="localization-tips"> Localization Tips - </h1> + </h2> + - <hr> </div> <div class="sidebox-wrapper" style="float:right;"> @@ -125,16 +125,14 @@ page.tags="listing, google play, users, growth" the growing international audience</a>. </p> -<div style="float:left;"> <img src="{@docRoot}images/gp-listing-3.jpg"> -</div> -<div class="headerLine clearfloat"> - <h1 id="keyword-tips"> +<div class="headerLine"> + <h2 id="keyword-tips"> Keyword Tips - </h1> + </h2> + - <hr> </div> <p> @@ -146,11 +144,11 @@ page.tags="listing, google play, users, growth" </p> <div class="headerLine"> - <h1 id="app-indexing"> + <h2 id="app-indexing"> Sign Up for App Indexing - </h1> + </h2> + - <hr> </div> <p> @@ -164,11 +162,11 @@ page.tags="listing, google play, users, growth" </div> <div class="headerLine"> - <h1 id="education-app"> + <h2 id="education-app"> Education App Tips - </h1> + </h2> + - <hr> </div> <p> @@ -181,7 +179,7 @@ page.tags="listing, google play, users, growth" </p> <div class="headerLine"> -<h1 id="related-resources">Related Resources</h1><hr> +<h2 id="related-resources">Related Resources</h2> </div> <div class="resource-widget resource-flow-layout col-13" diff --git a/docs/html/google/auth/api-client.jd b/docs/html/google/auth/api-client.jd index 402a95f..5331d1e 100644 --- a/docs/html/google/auth/api-client.jd +++ b/docs/html/google/auth/api-client.jd @@ -1,4 +1,4 @@ -page.title=Accessing Google Play Services APIs +page.title=Accessing Google APIs page.tags="oauth 2.0","GoogleAuthUtil" trainingnavtop=true diff --git a/docs/html/google/gcm/ccs.jd b/docs/html/google/gcm/ccs.jd index 03addfd..4389e3d 100644 --- a/docs/html/google/gcm/ccs.jd +++ b/docs/html/google/gcm/ccs.jd @@ -19,7 +19,11 @@ page.title=GCM Cloud Connection Server (XMPP) <li><a href="#response">Response format</a></li> </ol> </li> - <li><a href="#upstream">Upstream Messages</a> </li> + <li><a href="#upstream">Upstream Messages</a> + <ol> + <li><a href="#receipts">Receive return receipts</a></li> + </ol> + </li> <li><a href="#flow">Flow Control</a> </li> <li><a href="#implement">Implementing an XMPP-based App Server</a> <ol class="toc"> @@ -43,9 +47,6 @@ target="_android">CCS and User Notifications Signup Form</a></li> </div> </div> -<p class="note"><strong>Note:</strong> To try out this feature, sign up using -<a href="https://services.google.com/fb/forms/gcm/">this form</a>.</p> - <p>The GCM Cloud Connection Server (CCS) is an XMPP endpoint that provides a persistent, asynchronous, bidirectional connection to Google servers. The connection can be used to send and receive messages between your server and @@ -149,8 +150,8 @@ exceptions:</p> <li>CCS adds the field {@code message_id}, which is required. This ID uniquely identifies the message in an XMPP connection. The ACK or NACK from CCS uses the {@code message_id} to identify a message sent from 3rd-party app servers to CCS. -Therefore, it's important that this {@code message_id} not only be unique, but -always present.</li> +Therefore, it's important that this {@code message_id} not only be unique (per +sender ID), but always present.</li> </ul> <p>In addition to regular GCM messages, control messages are sent, indicated by @@ -188,7 +189,8 @@ parameters and which connection server(s) supports them.</p> "hello":"world", } "time_to_live":"600", - "delay_while_idle": true/false + "delay_while_idle": true/false, + "delivery_receipt_requested": true/false } </gcm> </message> @@ -227,42 +229,48 @@ message is "nack". A NACK message contains:</p> <p>Below are some examples.</p> <p>Bad registration:</p> + <pre><message> - <data:gcm xmlns:data="google:mobile:data"> + <gcm xmlns="google:mobile:data"> { - "error":"BAD_REGISTRATION", // error code + "message_type":"nack", "message_id":"msgId1", - "from":"PA91bHFOtaQGSwupt5l1og", - "message_type":"nack" + "from":"SomeInvalidRegistrationId", + "error":"BAD_REGISTRATION", + "error_description":"Invalid token on 'to' field: SomeInvalidRegistrationId" } - </data:gcm> + </gcm> </message></pre> -<p>Invalid "time to live":</p> +<p>Invalid JSON:</p> <pre><message> - <data:gcm xmlns:data="google:mobile:data"> - { - "error":"InvalidJson : INVALID_TTL : Invalid value (-1) for \"time_to_live\": must be between 0 and \"2419200\"\n", - "message_id":"msgId1", - "from":"APA91bHFOtaQGSwupt5l1og", - "message_type":"nack" - } - </data:gcm> -</message></pre> + <gcm xmlns="google:mobile:data"> + { + "message_type":"nack", + "message_id":"msgId1", + "from":"APA91bHFOtaQGSwupt5l1og", + "error":"INVALID_JSON", + "error_description":"InvalidJson: JSON_TYPE_ERROR : Field \"time_to_live\" must be a JSON java.lang.Number: abc" + } + </gcm> +</message> +</pre> -<p>JSON type error:</p> +<p>Quota exceeded:</p> <pre><message> - <data:gcm xmlns:data="google:mobile:data"> - { - "error":"InvalidJson : JSON_TYPE_ERROR : Field \"delay_while_idle\" must be a JSON java.lang.Boolean: not-boolean-user-supplied-value\n", - "message_id":"msgId1", - "from":"APA91bHFOtaQGSwupt5l1og", - "message_type":"nack" - } - </data:gcm> -</message></pre> + <gcm xmlns="google:mobile:data"> + { + "message_type":"nack", + "message_id":"msgId1", + "from":"APA91bHFOtaQGSwupt5l1og", + "error":"QUOTA_EXCEEDED", + "error_description":"Short-term downstream quota exceeded for this registration id" + } + </gcm> +</message> +</pre> <p>The following table lists NACK error codes. Unless otherwise @@ -300,7 +308,7 @@ message should be immediately retried over another connection.</td> </tr> <tr> <td>{@code INVALID_JSON}</td> -<td>The JSON message payload was not valid.</td> +<td>The JSON message payload is not valid.</td> </tr> <tr> <td>{@code QUOTA_EXCEEDED}</td> @@ -309,10 +317,10 @@ sender/device pair) is too high. If you want to retry the message, try using a s rate.</td> </tr> <tr> -<td>{@code SERVICE_UNAVAILABLE}</td> -<td>CCS is not currently able to process the message. The -message should be retried over the same connection using exponential backoff -with an initial delay of 1 second.</td> + <td>{@code SERVICE_UNAVAILABLE}</td> + <td>CCS is not currently able to process the message. The + message should be retried over the same connection using exponential backoff + with an initial delay of 1 second.</td> </tr> </table> @@ -382,8 +390,8 @@ Bundle data = new Bundle(); // Bundle data consists of a key-value pair data.putString("hello", "world"); // "time to live" parameter -// This is optional. It specifies a value in seconds up to 4 weeks. -int ttl = [0 seconds, 4 weeks] +// This is optional. It specifies a value in seconds up to 24 hours. +int ttl = [0 seconds, 24 hours] gcm.send(GCM_SENDER_ID + "@gcm.googleapis.com", id, ttl, data); </pre> @@ -419,6 +427,69 @@ response to the above message:</p> </gcm> </message></pre> +<h3 id="receipts">Receive return receipts</h3> + +<p>You can use upstream messaging to get receipt notifications, confirming +that a given message was sent to a device. Your 3rd-party app server receives the receipt +notification from CCS once the message has been sent to the device.</p> + +<p>To enable this feature, the message your 3rd-party app server sends to CCS must include +a field called <code>"delivery_receipt_requested"</code>. When this field is set to +<code>true</code>, CCS sends a return receipt. Here is an XMPP stanza containing a JSON +message with <code>"delivery_receipt_requested"</code> set to <code>true</code>:</p> + +<pre><message id=""> + <gcm xmlns="google:mobile:data"> + { + "to":"REGISTRATION_ID", + "message_id":"m-1366082849205" + "data": + { + "hello":"world", + } + "time_to_live":"600", + "delay_while_idle": true, + <strong>"delivery_receipt_requested": true</strong> + } + </gcm> +</message> +</pre> + +<p>Here is an example of a receipt notification message that CCS sends back to your 3rd-party +app server:</p> + +</p> +<pre><message id=""> + <gcm xmlns="google:mobile:data"> + { + "category":"com.example.yourapp", // to know which app sent it + "data": + { + “message_status":"MESSAGE_SENT_TO_DEVICE", + “original_message_id”:”m-1366082849205” + “device_registration_id”: “REGISTRATION_ID” + }, + "message_id":"dr2:m-1366082849205", + "message_type":"receipt", + "from":"gcm.googleapis.com" + } + </gcm> +</message></pre> + +<p>Note the following:</p> + +<ul> + <li>The {@code "message_type"} is set to {@code "receipt"}. + <li>The {@code "message_status"} is set to {@code "MESSAGE_SENT_TO_DEVICE"}, + indicating that the message was delivered. Notice that in this case, +{@code "message_status"} is not a field but rather part of the data payload.</li> + <li>The receipt message ID consists of the original message ID, but with a +<code>dr:</code> prefix. Your 3rd-party app server must send an ACK back with this ID, +which in this example is {@code dr2:m-1366082849205}.</li> + <li>The original message ID and status are inside the +{@code "data"} field.</li> +</ul> + <h2 id="flow">Flow Control</h2> <p>Every message sent to CCS receives either an ACK or a NACK response. Messages diff --git a/docs/html/google/gcm/client.jd b/docs/html/google/gcm/client.jd index ac446dc..20bff10 100644 --- a/docs/html/google/gcm/client.jd +++ b/docs/html/google/gcm/client.jd @@ -246,7 +246,8 @@ private boolean checkPlayServices() { <h3 id="sample-register">Register for GCM</h3> <p>An Android application needs to register with GCM servers before it can receive messages. When an app registers, it receives a registration ID, which it can then -store for future use. In the following snippet the {@code onCreate()} method in the sample app's +store for future use (note that registration IDs must be kept secret). In the +following snippet the {@code onCreate()} method in the sample app's main activity checks to see if the app is already registered with GCM and with the server:</p> diff --git a/docs/html/google/gcm/gcm.jd b/docs/html/google/gcm/gcm.jd index 88bf659..19151b9 100644 --- a/docs/html/google/gcm/gcm.jd +++ b/docs/html/google/gcm/gcm.jd @@ -123,7 +123,7 @@ it to receive messages. Once the Android application has the registration ID, it it to the 3rd-party application server, which uses it to identify each device that has registered to receive messages for a given Android application. In other words, a registration ID is tied to a particular Android application running on a particular -device. +device. Note that registration IDs must be kept secret. <br/> <br/> <strong>Note:</strong> If you use diff --git a/docs/html/google/gcm/index.jd b/docs/html/google/gcm/index.jd index 70f7a9c..56e0865 100644 --- a/docs/html/google/gcm/index.jd +++ b/docs/html/google/gcm/index.jd @@ -14,7 +14,10 @@ header.hide=1 <h1 itemprop="name" style="margin-bottom:0;">Google Cloud Messaging for Android</h1> <p itemprop="description"> Google Cloud Messaging for Android (GCM) is a service that allows you to send data -from your server to your users' Android-powered device, and also to receive messages from devices on the same connection. The GCM service handles all aspects of queueing of messages and delivery to the target Android application running on the target device. GCM is completely free no matter how big your messaging needs are, and there are no quotas. +from your server to your users' Android-powered device, and also to receive messages from +devices on the same connection. The GCM service handles all aspects of queueing of messages +and delivery to the target Android application running on the target device. GCM is +completely free no matter how big your messaging needs are, and there are no quotas. </p> </div> @@ -27,31 +30,39 @@ from your server to your users' Android-powered device, and also to receive mess <p>This could be a lightweight message telling your app there is new data to be fetched from the server (for instance, a movie uploaded by a friend), or it could be a message containing -up to 4kb of payload data (so apps like instant messaging can consume the message directly). <a href="{@docRoot}google/gcm/gcm.html">GCM Architectural Overview.</a></p> +up to 4kb of payload data (so apps like instant messaging can consume the message directly). +<a href="{@docRoot}google/gcm/gcm.html">GCM Architectural Overview.</a></p> <h4>Send "send-to-sync" messages</h4> - <p>A send-to-sync (collapsible) message is often a "tickle" that tells a mobile application to sync data from the server. For example, suppose you have an email application. When a user receives new email on the server, the server pings the mobile application with a "New mail" message. This tells the application to sync to the server to pick up the new email. - <a href="{@docRoot}google/gcm/adv.html#s2s">Send-to-sync messages</a>.</p> - </a> + <p>A send-to-sync (collapsible) message is often a "tickle" that tells a mobile + application to sync data from the server. For example, suppose you have an email + application. When a user receives new email on the server, the server pings the mobile + application with a "New mail" message. This tells the application to sync to the server + to pick up the new email. + <a href="{@docRoot}google/gcm/adv.html#s2s">Learn more »</a></p> <h4>Send messages with payload</h4> - <p>Unlike a send-to-sync message, every "message with payload" (non-collapsible message) is delivered. The payload the message contains can be up to 4kb. - <a href="{@docRoot}google/gcm/adv.html#payload">Messages with payload</a>.</p> + <p>Unlike a send-to-sync message, every "message with payload" (non-collapsible message) + is delivered. The payload the message contains can be up to 4kb. + <a href="{@docRoot}google/gcm/adv.html#payload">Learn more »</a></p> </div> <div class="col-6 normal-links"> <h3 style="clear:left">New Features</h3> - <h4>Faster, easier GCM setup</h4> - <p>Streamlined registration makes it simple and fast to add GCM support to your Android app. <a href="{@docRoot}google/gcm/gs.html">Learn more »</a></p> - <h4>Upstream messaging over XMPP</h4> - <p>GCM's Cloud Connection Service (CCS) lets you communicate with Android devices over a persistent XMPP connection. The primary advantages of CCS are speed, and the ability to receive upstream messages (that is, messages from a device to the cloud). You can use the service in tandem with existing GCM APIs. Use <a href="https://services.google.com/fb/forms/gcm/">this form</a> to sign up for CCS. <a href="{@docRoot}google/gcm/ccs.html">Learn more »</a></p> - <h4>Seamless multi-device messaging</h4> - <p>Maps a single user to a notification key, which you can then use to send a single message to multiple devices owned by the user. Use <a href="https://services.google.com/fb/forms/gcm/">this form</a> to sign up for User Notifications. <a href="{@docRoot}google/gcm/notifications.html">Learn more »</a></p> + + + <h4>Return Receipts</h4> + <p>You can use upstream messaging to get receipt notifications, confirming that a given + message was sent to a device. Your 3rd-party app server receives the receipt notification + from CCS once the message has been sent to the device. + <a href="{@docRoot}google/gcm/ccs.html#receipts">Learn more »</a></p> + <h4>Get Started</h4> - <p>Get started using the new features with a tutorial that walks you through creating a GCM app. <a href="{@docRoot}google/gcm/gs.html">Learn more »</a></p> + <p>Get started with a tutorial that walks you through creating a GCM app. + <a href="{@docRoot}google/gcm/gs.html">Learn more »</a></p> </div> </div> diff --git a/docs/html/google/gcm/notifications.jd b/docs/html/google/gcm/notifications.jd index 43a7368..2815f3d 100644 --- a/docs/html/google/gcm/notifications.jd +++ b/docs/html/google/gcm/notifications.jd @@ -14,8 +14,8 @@ page.title=User Notifications <h2>In this document</h2> <ol class="toc"> - <li><a href="#request">Request Format</a></li> - <li><a href="#create">Generate a Notification Key</a></li> + <li><a href="#gen-server">Generate a Notification Key on the Server</a></li> + <li><a href="#gen-client">Generate a Notification Key on the Client</a></li> <li><a href="#add">Add Registration IDs</a></li> <li><a href="#remove">Remove Registration IDs</a></li> <li><a href="#upstream">Send Upstream Messages</a></li> @@ -31,15 +31,11 @@ page.title=User Notifications <ol class="toc"> <li><a href="{@docRoot}google/gcm/gs.html">Getting Started</a></li> -<li><a href="https://services.google.com/fb/forms/gcm/" class="external-link" target="_android">CCS and User Notifications Signup Form</a></li> </ol> </div> </div> -<p class="note"><strong>Note:</strong> To try out this feature, sign up using <a href="https://services.google.com/fb/forms/gcm/">this form</a>.</p> - - <p>With user notifications, 3rd-party app servers can send a single message to multiple instance of an app running on devices owned by a single user. This feature is called <em>user notifications</em>. User notifications make it possible for every @@ -76,27 +72,23 @@ and then reconciling it with the corresponding notification. <p>You can use this feature with either the <a href="ccs.html">XMPP</a> (CCS) or <a href="http.html">HTTP</a> connection server.</p> +<p>You can generate notification keys in two different ways: on the server, and on +the client, if the user has a Google account. All of the associated registration IDs +can be mapped to a single user.</p> <p>The examples below show you how to perform generate/add/remove operations, and how to send upstream messages. For generate/add/remove operations, the message body is JSON.</p> -<h2 id="request">Request Format</h2> -<p>To send a message, the application server issues a POST request to -<code>https://android.googleapis.com/gcm/notification</code>.</p> +<h2 id="gen-server">Generate a Notification Key on the Server</h2> -<p>Here is the HTTP request header you should use for all create/add/remove operations:</p> - -<pre>content-type: "application/json" -Header : "project_id": <projectID> -Header: "Authorization", "key=API_KEY" -</pre> - -<h2 id="create">Generate a Notification Key</h2> +<p>To generate a notification key on the server, you create a new +create a new <code>notification_key</code> and map it to a +<code>notification_key_name</code>.</p> <p>This example shows how to create a new <code>notification_key</code> for a <code>notification_key_name</code> called <code>appUser-Chris</code>. -The {@code notification_key_name} is a name or identifier (can be a username for +The {@code notification_key_name} is a name or identifier (it can be a username for a 3rd-party app) that is unique to a given user. It is used by third parties to group together registration IDs for a single user. Note that <code>notification_key_name</code> and <code>notification_key</code> are unique to a group of registration IDs. It is also @@ -116,10 +108,109 @@ to use in subsequent operations:</p> "registration_ids": ["4", "8", "15", "16", "23", "42"] }</pre> +<h3 id="request-server">Request format</h3> + +<p>To send a message in cases where your notification key is generated on the server, +the application server issues a POST request to +<code>https://android.googleapis.com/gcm/notification</code>.</p> + +<p>Here is the HTTP request header you should use for all server side create/add/remove operations:</p> + +<pre>content-type: "application/json" +Header : "project_id": <projectID> +Header: "Authorization", "key=API_KEY" +</pre> + + +<h2 id="gen-client">Generate a Notification Key on the Client</h2> + +<p>Generating a notification key on the client is useful for cases where a server is unavailable. +To generate a notification key on the client, the device must have at least one +Google account. Note that the process for generating a notification key on the client is significantly +different from the server process described above.</p> + +<p>To generate a notification key on the client:</p> + +<ol> + <li>Open your project in the <a href="https://cloud.google.com/console">Google Developers Console</a>.</li> + <li>Click <strong>APIS & AUTH > Credentials</strong>.</li> + <li>Under OAuth, click <strong>Create new Client ID</strong>.</li> + <li>In the <strong>Create Client ID</strong> dialog, select <strong>Web Application</strong> as +the application type, and click <strong>Create Client ID</strong>.</li> + <li>Copy the value from <strong>Client ID for web application > Client ID</strong>. +This client ID represents a Google account "scope" that you will use to generate an {@code id_token}.</li> +</ol> + +<p>Once you've followed the above steps and gotten a client ID from Google Developers Console, + you're ready to add this feature to your app. First check the device for the presence of a Google +account. For example:</p> + +<pre>// This snippet takes the simple approach of using the first returned Google account, +// but you can pick any Google account on the device. +public String getAccount() { + Account[] accounts = AccountManager.get(getActivity()). + getAccountsByType("com.google"); + if (accounts.length == 0) { + return null; + } + return accounts[0].name; +}</pre> + +<p>Next, get an authentication token ({@code id_token}) by using the <code><a href= +"http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html">GoogleAuthUtil</a></code> +class. For example:</p> + +<pre>String accountName = getAccount(); + +// Initialize the scope using the client ID you got from the Console. +final String scope = "audience:server:client_id:" + + "1262xxx48712-9qs6n32447mcj9dirtnkyrejt82saa52.apps.googleusercontent.com"; +String id_token = null; +try { + id_token = GoogleAuthUtil.getToken(context, accountName, scope); +} catch (Exception e) { + log("exception while getting id_token: " + e); +} +...</pre> + +<p>Now use <code>id_token</code> to authenticate your request. +This add operation returns a {@code notification_key}. +Third parties must save this {@code notification_key} (as well as its mapping to the +<code>notification_key_name</code>) +to use in subsequent operations. Note that a client request only takes a single regID. +The only operations supported on the client side are add/remove.</p> + +<pre>request: +{ + "operation": "add", + "notification_key_name": "appUser-Chris", + "registration_ids": ["4"] + "id_token": "id_token" +}</pre> + +<h3 id="request-client">Request format</h3> + +<p>To send a message in cases where your notification key is generated on the client, +the application server issues a POST request to +<code>https://android.googleapis.com/gcm/googlenotification</code>.</p> + +<p>Here is the HTTP request header you should use for all add/remove operations. The +client side doesn't support the create operation; +the add operation has the effect of creating the notification key if it doesn't already +exist:</p> + +<pre>content-type: "application/json" +Header : "project_id": <projectID> +</pre> + +<p>Note that the authentication token is passed in the JSON body as shown above, not the header. +This is different from the server case.</p> + + <h2 id="add">Add Registration IDs</h2> <p>This example shows how to add registration IDs for a given notification key. -The maximum number of members allowed for a {@code notification_key} is 10.</p> +The maximum number of members allowed for a {@code notification_key} is 20.</p> <p>Note that the <code>notification_key_name</code> is not strictly required for adding/removing regIDs. But including it protects you against accidentally using diff --git a/docs/html/google/gcm/server.jd b/docs/html/google/gcm/server.jd index ccd1267..e3a6b25 100644 --- a/docs/html/google/gcm/server.jd +++ b/docs/html/google/gcm/server.jd @@ -120,7 +120,8 @@ have an application server that meets the following criteria:</p> <li>Able to store the API key and client registration IDs. The API key is included in the header of POST requests that send messages.</li> - <li>Able to generate message IDs to uniquely identify each message it sends.</li> + <li>Able to generate message IDs to uniquely identify each message it sends. Message IDs +should be unique per sender ID.</li> </ul> <h2 id="send-msg">Sending Messages</h2> diff --git a/docs/html/google/gcs/gcs-signup.jd b/docs/html/google/gcs/gcs-signup.jd new file mode 100644 index 0000000..7334cec --- /dev/null +++ b/docs/html/google/gcs/gcs-signup.jd @@ -0,0 +1,10 @@ +page.title=Sign Up for Google Cloud Save + +@jd:body + +<p>Sign up to be a trial partner for Google Cloud Save.</p> + + +<iframe src="https://docs.google.com/a/google.com/forms/d/1_V67YIXzLDLb-UzxOOpSjUDuJFfeYg3hEUT0oliK2ck/viewform?embedded=true" width="100%" height="930" frameborder="0" marginheight="0" marginwidth="0" id="signupform">Loading...</iframe> +</body> +</html> diff --git a/docs/html/google/gcs/index.jd b/docs/html/google/gcs/index.jd new file mode 100644 index 0000000..e5f4776 --- /dev/null +++ b/docs/html/google/gcs/index.jd @@ -0,0 +1,30 @@ +page.title=Google Cloud Save +page.tags="gcs" +header.hide=1 +@jd:body + + +<div class="landing-banner"> + +<div class="col-5" style="min-height:100px"> + <img src="{@docRoot}images/google/gcs.png" /> +</div> +<div class="col-7"> + + <h1 itemprop="name" style="margin-bottom:0;">Google Cloud Save</h1> + <p itemprop="description"> + Google Cloud Save is a service that enables per-user data storage +and sync in your apps with no backend programming required. Google Cloud Save +stores its data +in <a href="http://developers.google.com/datastore/">Google Cloud Datastore</a>, + a fully managed, schemaless database for storing non-relational data. Cloud +Datastore automatically scales with your users. +Google Cloud Save works even when your device is offline, and it +provides an easy transition to server-side coding because +the same database is accessible via App Engine and Compute Engine. +Finally, Google Cloud Save provides a generous initial per-user free quota that +expands as your user base grows. +</p> +<a href="{@docRoot}google/gcs/gcs-signup.html" class="button">Sign Up</a> +</div> +</div> diff --git a/docs/html/google/google_toc.cs b/docs/html/google/google_toc.cs index 6ff00c0..b4028bd 100644 --- a/docs/html/google/google_toc.cs +++ b/docs/html/google/google_toc.cs @@ -3,11 +3,11 @@ ######## ATTENTION ############### ######## ############### ######################################################### - + IF YOU MAKE CHANGES TO THIS FILE, YOU MUST GENERATE THE GMS REFERENCE DOCS, BECAUSE THEY ARE NOT INCLUDED IN THE DOCS BUILD RULE. - + ######################################################### ######################################################### ?> @@ -73,11 +73,11 @@ </div> <ul> <li><a href="<?cs var:toroot?>google/play-services/setup.html"> - <span class="en">Setup</span></a> + <span class="en">Setting Up Google Play Services</span></a> </li> <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot?>google/auth/api-client.html"> - <span class="en">Accessing Google Play Services APIs</span></a> + <span class="en">Accessing Google APIs</span></a> </div> <ul> <li> diff --git a/docs/html/google/index.jd b/docs/html/google/index.jd index 2e97d62..4778a85 100644 --- a/docs/html/google/index.jd +++ b/docs/html/google/index.jd @@ -89,6 +89,16 @@ cloud messaging.</p> to use Google Cloud Messaging.</p> </div> +<div class="landing-cell"> + <div class="cell-icon"> + <img src="{@docRoot}images/google/gcs-small.png" width="40" > + </div> + <h4><a href="{@docRoot}google/gcs/index.html" + >Google Cloud Save</a></h4> + <p>Enable per-user data storage and sync in your apps with no backend programming + required.</p> +</div> + </div><!-- col-6 --> diff --git a/docs/html/google/play-services/games.jd b/docs/html/google/play-services/games.jd index 94f6715..a73f688 100644 --- a/docs/html/google/play-services/games.jd +++ b/docs/html/google/play-services/games.jd @@ -1,4 +1,5 @@ page.title=Google Play Game Services +page.tags="games" header.hide=1 @jd:body diff --git a/docs/html/google/play-services/index.jd b/docs/html/google/play-services/index.jd index f5d4574..eec4f5a 100644 --- a/docs/html/google/play-services/index.jd +++ b/docs/html/google/play-services/index.jd @@ -11,10 +11,8 @@ header.hide=1 <div class="col-6"> <h1 itemprop="name" style="margin-bottom:0;">Google Play Services</h1> - <p itemprop="description"> - </p> - - <p>Give your apps more features to attract users on a wider range of devices. + <p itemprop="description">Give your apps more features to attract users + on a wider range of devices. With Google Play services, your app can take advantage of the latest, Google-powered features such as Maps, Google+, and more, with automatic platform updates distributed as an APK through diff --git a/docs/html/google/play-services/setup.jd b/docs/html/google/play-services/setup.jd index d502e8d..4332953 100644 --- a/docs/html/google/play-services/setup.jd +++ b/docs/html/google/play-services/setup.jd @@ -1,4 +1,4 @@ -page.title=Set Up Google Play Services SDK +page.title=Setting Up Google Play Services @jd:body @@ -8,8 +8,7 @@ page.title=Set Up Google Play Services SDK <h2>In this document</h2> <ol> - <li><a href="#Install">Install the Google Play Services SDK</a></li> - <li><a href="#Setup">Set Up a Project that Uses Google Play Services</a></li> + <li><a href="#Setup">Add Google Play Services to Your Project</a></li> <li><a href="#Proguard">Create a Proguard Exception</a></li> <li><a href="#ensure">Ensure Devices Have the Google Play services APK</a></li> </ol> @@ -18,12 +17,17 @@ page.title=Set Up Google Play Services SDK </div> </div> +<script> +$(document).ready(function() { + setupIdeDocToggle(); +}); +</script> + - <p>To develop an app using the <a href="{@docRoot}reference/gms-packages.html">Google -Play services APIs</a>, you must download the Google Play services SDK -from the <a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a>. -The download includes the client library and code samples.</p> +Play services APIs</a>, you need to set up your project with the Google Play services SDK. +<p>If you haven't installed the Google Play services SDK yet, go get it now by following the guide +to <a href="{@docRoot}sdk/installing/adding-packages.html">Adding SDK Packages</a>.</p> <p>To test your app when using the Google Play services SDK, you must use either:</p> <ul> @@ -33,69 +37,28 @@ The download includes the client library and code samples.</p> that runs the Google APIs platform based on Android 4.2.2 or higher.</li> </ul> -<p>Ideally, you should develop and test your app on a variety of devices, including -both phones and tablets.</p> - - -<h2 id="Install">Install the Google Play Services SDK</h2> - -<p>To install the Google Play services SDK for development:</p> -<ol> - <li>Launch the SDK Manager in one of the following ways: - <ul> - <li>In Android Studio, click <strong>SDK Manager</strong> -<img src="{@docRoot}images/tools/sdk-manager-studio.png" style="vertical-align:bottom;margin:0;height:19px" /> -in the toolbar.</li> - <li>In Eclipse (with <a href="{@docRoot}tools/help/adt.html">ADT</a>), - select <strong>Window</strong> > <strong>Android SDK Manager</strong>.</li> - <li>On Windows, double-click the <code>SDK Manager.exe</code> file at the root of the Android - SDK directory.</li> - <li>On Mac or Linux, open a terminal and navigate to the <code>tools/</code> directory in the - Android SDK, then execute <code>android sdk</code>.</li> - </ul> - </li> - <li>Install the Google Play services SDK. - <p>Scroll to the bottom of the package list, expand <b>Extras</b>, select - <b>Google Play services</b>, and install it. If you're using Android Studio, also install - <b>Google Repository</b> (it provides the Maven repository used for Gradle builds).</p> - <p>The Google Play services SDK is saved in your Android SDK environment at - <code><android-sdk>/extras/google/google_play_services/</code>.</p> - -<p class="note"><strong>Note:</strong> Google Play services 4.0.30 (released -November 2013) and newer versions require Android 2.3 or higher. If your app supports Android 2.2, -you can continue development with the Google Play services SDK, but must instead install -<b>Google Play services for Froyo</b> from the SDK Manager.</p> - - </li> - <li>Install a compatible version of the Google APIs platform. - <p>If you want to test your app on the emulator, expand the directory for <b>Android 4.2.2 - (API 17)</b> or a higher version, select <b>Google APIs</b>, and install it. Then create a - new <a href="{@docRoot}tools/devices/index.html">AVD</a> with Google APIs as - the platform target.</p> - </li> - <li>Make a copy of the Google Play services library project. - <p class="note"><strong>Note:</strong> If you are using Android Studio, skip this step.</p> - <p>Copy the library project at - <code><android-sdk>/extras/google/google_play_services/libproject/google-play-services_lib/</code> - to the location where you maintain your Android app projects. - <p>If you are using Eclipse, import the library project into your workspace. - Click <b>File > Import</b>, select <b>Android > Existing - Android Code into Workspace</b>, and browse to the copy of the library project to import it.</p> - </li> -</ol> +<h2 id="Setup">Add Google Play Services to Your Project</h2> +<p> +<select class="ide"> + <option value="eclipse">Using Eclipse with ADT</option> + <option value="studio">Using Android Studio</option> + <option value="other">Using something else</option> +</select> +</p> -<h2 id="Setup">Set Up a Project that Uses Google Play Services</h2> -<p><b>Using Android Studio:</b></p> +<div class="select-ide studio"> <ol> - <li>Open the <code>build.gradle</code> file inside your application module directory. - <p class="note"><strong>Note:</strong> Android Studio projects contain a top-level - <code>build.gradle</code> file and a <code>build.gradle</code> file for each module. - Be sure to edit the file for your application module.</p></li> + <li>Open the <code>build.gradle</code> file inside your application module directory. + <p class="note"><strong>Note:</strong> Android Studio projects contain a top-level + <code>build.gradle</code> file and a <code>build.gradle</code> file for each module. + Be sure to edit the file for your application module. See + <a href="{@docRoot}sdk/installing/studio-build.html">Building Your Project with + Gradle</a> for more information about Gradle.</p></li> <li>Add a new build rule under <code>dependencies</code> for the latest version of <code>play-services</code>. For example: <pre class="no-pretty-print"> @@ -126,8 +89,11 @@ element: <p>You can now begin developing features with the <a href="{@docRoot}reference/gms-packages.html">Google Play services APIs</a>.</p> +</div><!-- end studio --> -<p><b>Using Eclipse or another IDE:</b></p> + + +<div class="select-ide eclipse other"> <p>To make the Google Play services APIs available to your app, you must reference the library project you created in step 4 of the <a href="#Install">installation instructions</a>.</p> @@ -154,6 +120,9 @@ element: you can begin developing features with the <a href="{@docRoot}reference/gms-packages.html">Google Play services APIs</a>.</p> +</div><!-- end eclipse and other --> + + <h2 id="Proguard">Create a Proguard Exception</h2> @@ -234,5 +203,6 @@ about the error and provides an action that takes the user to Google Play Store to install the update.</p> -<p>To then begin a connection to Google Play services, read <a -href="{@docRoot}google/auth/api-client.html">Accessing Google Play Services APIs</a>.</p> +<p>To then begin a connection to Google Play services (required by most Google APIs such +as Google Drive, Google+, and Games), read <a +href="{@docRoot}google/auth/api-client.html">Accessing Google APIs</a>.</p> diff --git a/docs/html/google/play/billing/billing_admin.jd b/docs/html/google/play/billing/billing_admin.jd index 46ad905..5904b03 100644 --- a/docs/html/google/play/billing/billing_admin.jd +++ b/docs/html/google/play/billing/billing_admin.jd @@ -66,7 +66,8 @@ storing and delivering the digital content that you sell in your applications.</ </p> </div> -<p>You can create a product list for any published application or any draft application that's been +<p>You can create a product list for any published application, or any +application in the alpha or beta channels, that's been uploaded and saved to the Developer Console. However, you must have a Google Wallet merchant account and the application's manifest must include the <code>com.android.vending.BILLING</code> permission. If an application's manifest does not include this permission, you will be able to edit @@ -75,6 +76,13 @@ information about this permission, see <a href="{@docRoot}google/play/billing/billing_integrate.html#billing-permission">Updating Your Application's Manifest</a>.</p> +<p class="note"><strong>Note:</strong> Previously you could test an app by +uploading an unpublished "draft" version. This functionality is no longer +supported; instead, you must publish it to the alpha or beta distribution +channel. For more information, see <a +href="{@docRoot}google/play/billing/billing_testing.html#draft_apps">Draft Apps +are No Longer Supported</a>. + <p>In addition, an application package can have only one product list. If you create a product list for an application, and you use the <a href="{@docRoot}google/play/publishing/multiple-apks.html">multiple APK feature</a> to distribute diff --git a/docs/html/google/play/billing/billing_testing.jd b/docs/html/google/play/billing/billing_testing.jd index df6c657..8a49433 100644 --- a/docs/html/google/play/billing/billing_testing.jd +++ b/docs/html/google/play/billing/billing_testing.jd @@ -8,8 +8,9 @@ parent.link=index.html <h2>In this document</h2> <ol> <li><a href="#testing-purchases">Testing In-app Purchases</a></li> - <li><a href="#billing-testing-static">Testing with static responses</a></li> + <li><a href="#billing-testing-static">Testing with Static Responses</a></li> <li><a href="#billing-testing-real">Setting Up for Test Purchases</a></li> + <li><a href="#draft_apps">Draft Apps are No Longer Supported</a></li> </ol> <h2>See also</h2> <ol> @@ -79,8 +80,7 @@ method).</p> <p>First, upload and publish in-app products that you want testers to be able to purchase. You can upload and publish in-app products in the Developer Console. Note that you can upload and publish your in-app items before you publish the -APK itself. For example, you can publish your in-app items while your APK is -still a draft. </p> +APK itself.</p> <p>Next, create license test accounts for authorized users. In the Developer Console, go to <strong>Settings</strong> > <strong>Account details</strong>, @@ -149,11 +149,12 @@ license accounts in your alpha and beta distribution groups, those users will only be able to make test purchases. </p> -<h2 id="billing-testing-static">Testing with static responses</h2> +<h2 id="billing-testing-static">Testing with Static Responses</h2> <p>We recommend that you first test your In-app Billing implementation using static responses from Google Play. This enables you to verify that your application is handling the primary Google -Play responses correctly and that your application is able to verify signatures correctly.</p> +Play responses correctly and that your application is able to verify signatures correctly. You can do this +even if the app hasn't been published yet.</p> <p>To test your implementation with static responses, you make an In-app Billing request using a special item that has a reserved product ID. Each reserved product ID returns a specific static @@ -173,6 +174,12 @@ the Developer Console to perform static response tests with the reserved product install your application on a device, log into the device, and make billing requests using the reserved product IDs.</p> +<p class="note"><strong>Note:</strong> Previously you could test an app by +uploading an unpublished "draft" version. This functionality is no longer +supported. However, you can test your app with static responses even before you +upload it to the Google Play store. For more information, see <a +href="#draft_apps">Draft Apps are No Longer Supported</a>. + <p>There are four reserved product IDs for testing static In-app Billing responses:</p> <ul> @@ -205,67 +212,12 @@ Pricing</a>.</p> </li> </ul> -<p>In some cases, the reserved items may return signed static responses, which lets you test -signature verification in your application. To test signature verification with the special reserved -product IDs, you may need to set up <a -href="{@docRoot}google/play/billing/billing_admin.html#billing-testing-setup">test accounts</a> or -upload your application as a unpublished draft application. Table 1 shows you the conditions under -which static responses are signed.</p> - -<p class="table-caption" id="static-responses-table"><strong>Table 1.</strong> -Conditions under which static responses are signed.</p> - -<table> -<tr> -<th>Application ever been published?</th> -<th>Draft application uploaded and unpublished?</th> -<th>User who is running the application</th> -<th>Static response signature</th> -</tr> - -<tr> -<td>No</td> -<td>No</td> -<td>Any</td> -<td>Unsigned</td> -</tr> - -<tr> -<td>No</td> -<td>No</td> -<td>Developer</td> -<td>Signed</td> -</tr> - -<tr> -<td>Yes</td> -<td>No</td> -<td>Any</td> -<td>Unsigned</td> -</tr> - -<tr> -<td>Yes</td> -<td>No</td> -<td>Developer</td> -<td>Signed</td> -</tr> - -<tr> -<td>Yes</td> -<td>No</td> -<td>Test account</td> -<td>Signed</td> -</tr> - -<tr> -<td>Yes</td> -<td>Yes</td> -<td>Any</td> -<td>Signed</td> -</tr> - -</table> +<p>In some cases, the reserved items may return signed static responses, which +lets you test signature verification in your application. The reserved items +only return signed responses if the user running the application has a <a +href="{@docRoot}distribute/googleplay/start.html">developer</a> or <a +href="{@docRoot}google/play/billing/billing_admin.html#billing-testing-setup">test +account.</a> <p>To make an In-app Billing request with a reserved product ID, you simply construct a normal <code>REQUEST_PURCHASE</code> request, but instead of using a real product ID from your @@ -310,9 +262,11 @@ purchases. Testing real in-app purchases enables you to test the end-to-end In-a experience, including the actual purchases from Google Play and the actual checkout flow that users will experience in your application.</p> -<p class="note"><strong>Note</strong>: You do not need to publish your application to do end-to-end -testing. You only need to upload your application as a draft application to perform end-to-end -testing.</p> +<p class="note"><strong>Note:</strong> You can do end-to-end testing of your app + by publishing it to an <a + href="{@docRoot}distribute/googleplay/developer-console.html#alpha-beta">alpha + distribution channel</a>. This allows you to publish the app to the Google + Play store, but limit its availability to just the testers you designate. </p> <p>To test your In-app Billing implementation with actual in-app purchases, you will need to register at least one test account on the Google Play Developer Console. You cannot use your @@ -327,14 +281,16 @@ application does not need to be published, but the item does need to be publishe <p>To test your In-app Billing implementation with actual purchases, follow these steps:</p> <ol> - <li><strong>Upload your application as a draft application to the Developer Console.</strong> - <p>You do not need to publish your application to perform end-to-end testing with real product - IDs; you only need to upload your application as a draft application. However, you must sign - your application with your release key before you upload it as a draft application. Also, the - version number of the uploaded application must match the version number of the application you - load to your device for testing. To learn how to upload an application to Google Play, see - <a href="http://support.google.com/googleplay/android-developer/bin/answer.py?hl=en&answer=113469">Uploading - applications</a>.</p> + <li><strong>Upload your application to the <a + href="{@docRoot}distribute/googleplay/developer-console.html#alpha-beta">alpha + distribution channel</a> with the Developer Console.</strong> + + <p class="note"><strong>Note:</strong> Previously you could test an app by + uploading an unpublished "draft" version. This functionality is no longer + supported; instead, you must publish it to the alpha or beta distribution + channel. For more information, see <a href="#draft_apps">Draft Apps are No + Longer Supported</a>. + </li> <li><strong>Add items to the application's product list.</strong> <p>Make sure that you publish the items (the application can remain unpublished). See <a @@ -370,3 +326,24 @@ href="{@docRoot}tools/publishing/app-signing.html">signing</a>, and <a href="{@docRoot}distribute/tools/launch-checklist.html">publishing on Google Play</a>. </p> +<h2 id="draft_apps">Draft Apps are No Longer Supported</h2> + +<p>Previously, you could publish a "draft" version of your app for testing. This +functionality is no longer supported. Instead, there are two ways you can test +how a pre-release app functions on the Google Play store:</p> + +<ul> + + <li>You can publish an app to the <a + href="{@docRoot}distribute/googleplay/developer-console.html#alpha-beta">alpha + or beta distribution channels</a>. This makes the app available on the Google + Play store, but only to the testers you put on a "whitelist".</li> + + <li>In a few cases, you can test Google Play functionality with an unpublished + app. For example, you can test an unpublished app's in-app billing support by + using <a + href="{@docRoot}google/play/billing/billing_testing.html#billing-testing-static">static + responses</a>, special reserved product IDs that always return a specific + result (like "purchased" or "refunded").</li> + +</ul> diff --git a/docs/html/google/play/billing/v2/billing_integrate.jd b/docs/html/google/play/billing/v2/billing_integrate.jd index ca41e0b..5eb17d5 100644 --- a/docs/html/google/play/billing/v2/billing_integrate.jd +++ b/docs/html/google/play/billing/v2/billing_integrate.jd @@ -208,6 +208,14 @@ following:</p> a draft to the Google Play Developer Console. You also need to create a product list for the in-app items that are available for purchase in the sample application. The following instructions show you how to do this.</p> + +<p class="caution"><strong>Caution:</strong> Draft applications are no longer +supported. To test an application, publish it in the <a +href="{@docRoot}distribute/googleplay/developer-console.html#alpha-beta">alpha +or beta channels</a>. For more information, see <a +href="{@docRoot}google/play/billing/billing_testing.html#draft_apps">Draft Apps +are No Longer Supported</a>.</p> + <ol> <li><strong>Upload the release version of the sample application to Google Play.</strong> <p>Do not publish the sample application; leave it as an unpublished draft application. The @@ -928,10 +936,12 @@ public class BillingReceiver extends BroadcastReceiver { // Intent actions that we receive in the BillingReceiver from Google Play. // These are defined by Google Play and cannot be changed. // The sample application defines these in the Consts.java file. - public static final String ACTION_NOTIFY = "com.android.vending.billing.IN_APP_NOTIFY"; - public static final String ACTION_RESPONSE_CODE = "com.android.vending.billing.RESPONSE_CODE"; + public static final String ACTION_NOTIFY = + "com.android.vending.billing.IN_APP_NOTIFY"; + public static final String ACTION_RESPONSE_CODE = + "com.android.vending.billing.RESPONSE_CODE"; public static final String ACTION_PURCHASE_STATE_CHANGED = - "com.android.vending.billing.PURCHASE_STATE_CHANGED"; + "com.android.vending.billing.PURCHASE_STATE_CHANGED"; // The intent extras that are passed in an intent from Google Play. // These are defined by Google Play and cannot be changed. @@ -962,7 +972,8 @@ public class BillingReceiver extends BroadcastReceiver { Log.w(TAG, "unexpected action: " + action); } } - // Perform other processing here, such as forwarding intent messages to your local service. + // Perform other processing here, such as forwarding intent messages + // to your local service. } </pre> diff --git a/docs/html/google/play/expansion-files.jd b/docs/html/google/play/expansion-files.jd index e90f8fa..601ea48 100644 --- a/docs/html/google/play/expansion-files.jd +++ b/docs/html/google/play/expansion-files.jd @@ -527,17 +527,21 @@ are:</p> <!-- Required to download files from Google Play --> <uses-permission android:name="android.permission.INTERNET" /> - <!-- Required to keep CPU alive while downloading files (NOT to keep screen awake) --> + <!-- Required to keep CPU alive while downloading files + (NOT to keep screen awake) --> <uses-permission android:name="android.permission.WAKE_LOCK" /> - <!-- Required to poll the state of the network connection and respond to changes --> - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> + <!-- Required to poll the state of the network connection + and respond to changes --> + <uses-permission + android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- Required to check whether Wi-Fi is enabled --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- Required to read and write the expansion files on shared storage --> - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <uses-permission + android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ... </manifest> </pre> @@ -650,8 +654,8 @@ public class SampleAlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { try { - DownloaderClientMarshaller.startDownloadServiceIfRequired(context, intent, - SampleDownloaderService.class); + DownloaderClientMarshaller.startDownloadServiceIfRequired(context, + intent, SampleDownloaderService.class); } catch (NameNotFoundException e) { e.printStackTrace(); } @@ -693,16 +697,19 @@ versionCode)}</li> <p>For example, the sample app provided in the Apk Expansion package calls the following method in the activity's {@link android.app.Activity#onCreate onCreate()} method to check whether the expansion files already exist on the device:</p> + <pre> boolean expansionFilesDelivered() { for (XAPKFile xf : xAPKS) { - String fileName = Helpers.getExpansionAPKFileName(this, xf.mIsBase, xf.mFileVersion); + String fileName = Helpers.getExpansionAPKFileName(this, xf.mIsBase, + xf.mFileVersion); if (!Helpers.doesFileExist(this, fileName, xf.mFileSize, false)) return false; } return true; } </pre> + <p>In this case, each {@code XAPKFile} object holds the version number and file size of a known expansion file and a boolean as to whether it's the main expansion file. (See the sample application's {@code SampleDownloaderActivity} class for details.)</p> @@ -740,6 +747,7 @@ the Downloader Library begins the download and you should update your activity U display the download progress (see the next step). If the response <em>is</em> {@code NO_DOWNLOAD_REQUIRED}, then the files are available and your application can start.</p> <p>For example:</p> + <pre> @Override public void onCreate(Bundle savedInstanceState) { @@ -754,11 +762,14 @@ public void onCreate(Bundle savedInstanceState) { notifierIntent, PendingIntent.FLAG_UPDATE_CURRENT); // Start the download service (if required) - int startResult = DownloaderClientMarshaller.startDownloadServiceIfRequired(this, + int startResult = + DownloaderClientMarshaller.startDownloadServiceIfRequired(this, pendingIntent, SampleDownloaderService.class); - // If download has started, initialize this activity to show download progress + // If download has started, initialize this activity to show + // download progress if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) { - // This is where you do set up to display the download progress (next step) + // This is where you do set up to display the download + // progress (next step) ... return; } // If the download wasn't necessary, fall through to start the app @@ -766,6 +777,7 @@ public void onCreate(Bundle savedInstanceState) { startApp(); // Expansion files are available, start the app } </pre> + </li> <li>When the {@code startDownloadServiceIfRequired()} method returns anything <em>other than</em> {@code NO_DOWNLOAD_REQUIRED}, create an instance of {@code IStub} by @@ -783,9 +795,11 @@ android.app.Activity#onCreate onCreate()} method, after {@code startDownloadServ starts the download. </p> <p>For example, in the previous code sample for {@link android.app.Activity#onCreate onCreate()}, you can respond to the {@code startDownloadServiceIfRequired()} result like this:</p> + <pre> // Start the download service (if required) - int startResult = DownloaderClientMarshaller.startDownloadServiceIfRequired(this, + int startResult = + DownloaderClientMarshaller.startDownloadServiceIfRequired(this, pendingIntent, SampleDownloaderService.class); // If download has started, initialize activity to show progress if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) { @@ -892,7 +906,8 @@ others. By default, this flag is <em>not</em> enabled, so the user must be on Wi expansion files. You might want to provide a user preference to enable downloads over the cellular network. In which case, you can call: <pre> -mRemoteService.setDownloadFlags(IDownloaderService.FLAGS_DOWNLOAD_OVER_CELLULAR); +mRemoteService + .setDownloadFlags(IDownloaderService.FLAGS_DOWNLOAD_OVER_CELLULAR); </pre> </dd> </dl> @@ -975,10 +990,12 @@ to both your expansion files:</p> // The shared path to all app expansion files private final static String EXP_PATH = "/Android/obb/"; -static String[] getAPKExpansionFiles(Context ctx, int mainVersion, int patchVersion) { +static String[] getAPKExpansionFiles(Context ctx, int mainVersion, + int patchVersion) { String packageName = ctx.getPackageName(); Vector<String> ret = new Vector<String>(); - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + if (Environment.getExternalStorageState() + .equals(Environment.MEDIA_MOUNTED)) { // Build the full path to the app's expansion files File root = Environment.getExternalStorageDirectory(); File expPath = new File(root.toString() + EXP_PATH + packageName); @@ -1102,7 +1119,8 @@ following:</p> <pre> // Get a ZipResourceFile representing a merger of both the main and patch files -ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(appContext, +ZipResourceFile expansionFile = + APKExpansionSupport.getAPKExpansionZipFile(appContext, mainVersion, patchVersion); // Get an input stream for a known file inside the expansion file ZIPs @@ -1190,28 +1208,18 @@ android.content.Context#getExternalFilesDir getExternalFilesDir()}.</li> opens, it's important that you test this process to be sure your application can successfully query for the URLs, download the files, and save them to the device.</p> -<p>To test your application's implementation of the manual download procedure, you must upload -your application to Google Play as a "draft" to make your expansion files available for -download:</p> - -<ol> - <li>Upload your APK and corresponding expansion files using the Google Play Developer -Console.</li> - <li>Fill in the necessary application details (title, screenshots, etc.). You can come back and -finalize these details before publishing your application. - <p>Click the <strong>Save</strong> button. <em>Do not click Publish.</em> This saves -the application as a draft, such that your application is not published for Google Play users, -but the expansion files are available for you to test the download process.</p></li> - <li>Install the application on your test device using the Eclipse tools or <a -href="{@docRoot}tools/help/adb.html">{@code adb}</a>.</li> - <li>Launch the app.</li> -</ol> - -<p>If everything works as expected, your application should begin downloading the expansion +<p>To test your application's implementation of the manual download procedure, +you can publish it to the alpha or beta channel, so it will only be available to +authorized testers. +If everything works as expected, your application should begin downloading the expansion files as soon as the main activity starts.</p> - - +<p class="note"><strong>Note:</strong> Previously you could test an app by +uploading an unpublished "draft" version. This functionality is no longer +supported; instead, you must publish it to the alpha or beta distribution +channel. For more information, see <a +href="{@docRoot}google/play/billing/billing_testing.html#draft_apps">Draft Apps +are No Longer Supported</a>. <h2 id="Updating">Updating Your Application</h2> diff --git a/docs/html/google/play/licensing/licensing-reference.jd b/docs/html/google/play/licensing/licensing-reference.jd index 7bfa61a..d4ca79a 100644 --- a/docs/html/google/play/licensing/licensing-reference.jd +++ b/docs/html/google/play/licensing/licensing-reference.jd @@ -151,7 +151,8 @@ returned by the Google Play server in a license response.</p> <tr> <td>{@code LICENSED}</td> <td>The application is licensed to the user. The user has purchased the -application or the application only exists as a draft.</td> +application, or is authorized to download and install the alpha or beta version +of the application.</td> <td>Yes</td> <td><code>VT</code>, <code>GT</code>, <code>GR</code></td> <td><em>Allow access according to {@code Policy} constraints.</em></td> @@ -233,16 +234,14 @@ implementation.</p> href="{@docRoot}google/play/licensing/setting-up.html#test-env"> Setting Up The Testing Environment</a>, the response code can be manually overridden for the application developer and any registered test users via the -Google Play Developer Console. -<br/><br/> -Additionally, as noted above, applications that are in draft mode (in other -words, applications that have been uploaded but have <em>never</em> been -published) will return {@code LICENSED} for all users, even if not listed as a test -user. Since the application has never been offered for download, it is assumed -that any users running it must have obtained it from an authorized channel for -testing purposes.</p> - +Google Play Developer Console.</p> +<p class="note"><strong>Note:</strong> Previously you could test an app by +uploading an unpublished "draft" version. This functionality is no longer +supported; instead, you must publish it to the alpha or beta distribution +channel. For more information, see <a +href="{@docRoot}google/play/billing/billing_testing.html#draft_apps">Draft Apps +are No Longer Supported</a>. <h2 id="extras">Server Response Extras</h2> @@ -430,8 +429,8 @@ public boolean allowAccess() { } } else if (mLastResponse == LicenseResponse.RETRY && ts < mLastResponseTime + MILLIS_PER_MINUTE) { - // Only allow access if we are within the retry period or we haven't used up our - // max retries. + // Only allow access if we are within the retry period + // or we haven't used up our max retries. return (ts <= mRetryUntil || mRetryCount <= mMaxRetries); } return false; diff --git a/docs/html/google/play/licensing/overview.jd b/docs/html/google/play/licensing/overview.jd index 4e1a9c9..a2d5379 100644 --- a/docs/html/google/play/licensing/overview.jd +++ b/docs/html/google/play/licensing/overview.jd @@ -38,12 +38,11 @@ the licensing server and receives the result. The Google Play application sends the result to your application, which can allow or disallow further use of the application as needed.</p> -<p class="note"><strong>Note:</strong> If a paid application has been uploaded -to Google Play, but saved only as a draft application (the app is -unpublished), the licensing server considers all users to be licensed users of -the application (because it's not even possible to purchase the app). This -exception is necessary in order for you to perform testing of your licensing -implementation.</p> +<p class="note"><strong>Note:</strong> If a version of an app is in the alpha or +beta channel, all users who are authorized to download and install that app are +considered to be licensed users of the app. For more information, see <a +href="{@docRoot}distribute/googleplay/developer-console.html#alpha-beta">Alpha +and Beta Testing</a>.</p> <div class="figure" style="width:469px"> <img src="{@docRoot}images/licensing_arch.png" alt=""/> @@ -52,6 +51,12 @@ license check through the License Verification Library and the Google Play client, which handles communication with the Google Play server.</p> </div> +<p class="note"><strong>Note:</strong> Previously you could test an app by +uploading an unpublished "draft" version. This functionality is no longer +supported; instead, you must publish it to the alpha or beta distribution +channel. For more information, see <a +href="{@docRoot}google/play/billing/billing_testing.html#draft_apps">Draft Apps +are No Longer Supported</a>. <p>To properly identify the user and determine the license status, the licensing server requires information about the application and user—your application and the Google Play client work diff --git a/docs/html/guide/components/activities.jd b/docs/html/guide/components/activities.jd index b4617fb..5e6917b 100644 --- a/docs/html/guide/components/activities.jd +++ b/docs/html/guide/components/activities.jd @@ -4,12 +4,6 @@ page.tags=activity,intent <div id="qv-wrapper"> <div id="qv"> -<h2>Quickview</h2> -<ul> - <li>An activity provides a user interface for a single screen in your application</li> - <li>Activities can move into the background and then be resumed with their state restored</li> -</ul> - <h2>In this document</h2> <ol> <li><a href="#Creating">Creating an Activity</a> diff --git a/docs/html/guide/components/bound-services.jd b/docs/html/guide/components/bound-services.jd index 653c7a0..4215f0f 100644 --- a/docs/html/guide/components/bound-services.jd +++ b/docs/html/guide/components/bound-services.jd @@ -6,12 +6,6 @@ parent.link=services.html <div id="qv-wrapper"> <ol id="qv"> -<h2>Quickview</h2> -<ul> - <li>A bound service allows other components to bind to it, in order to interact with it and -perform interprocess communication</li> - <li>A bound service is destroyed once all clients unbind, unless the service was also started</li> -</ul> <h2>In this document</h2> <ol> <li><a href="#Basics">The Basics</a></li> diff --git a/docs/html/guide/components/fragments.jd b/docs/html/guide/components/fragments.jd index 32c9f99..0cc5f72 100644 --- a/docs/html/guide/components/fragments.jd +++ b/docs/html/guide/components/fragments.jd @@ -5,15 +5,6 @@ parent.link=activities.html <div id="qv-wrapper"> <div id="qv"> - - <h2>Quickview</h2> - <ul> - <li>Fragments decompose application functionality and UI into reusable modules</li> - <li>Add multiple fragments to a screen to avoid switching activities</li> - <li>Fragments have their own lifecycle, state, and back stack</li> - <li>Fragments require API Level 11 or greater</li> - </ul> - <h2>In this document</h2> <ol> <li><a href="#Design">Design Philosophy</a></li> diff --git a/docs/html/guide/components/fundamentals.jd b/docs/html/guide/components/fundamentals.jd index 9ac063e..fd1a7a8 100644 --- a/docs/html/guide/components/fundamentals.jd +++ b/docs/html/guide/components/fundamentals.jd @@ -335,8 +335,8 @@ documentation. </p> {@link android.content.Intent} to start activities, services, and broadcast receivers. You can do so by explicitly naming the target component (using the component class name) in the intent. However, the real power of intents lies in the concept of <em>implicit intents</em>. An implicit intent -simply describe the type of action to perform (and optionally, the data upon which you’d like to -perform the action) and allow the system to find a component on the device that can perform the +simply describes the type of action to perform (and, optionally, the data upon which you’d like to +perform the action) and allows the system to find a component on the device that can perform the action and start it. If there are multiple components that can perform the action described by the intent, then the user selects which one to use.</p> diff --git a/docs/html/guide/components/processes-and-threads.jd b/docs/html/guide/components/processes-and-threads.jd index c8c3764..e7ef7ba 100644 --- a/docs/html/guide/components/processes-and-threads.jd +++ b/docs/html/guide/components/processes-and-threads.jd @@ -5,13 +5,6 @@ page.tags=lifecycle,background <div id="qv-wrapper"> <div id="qv"> -<h2>Quickview</h2> -<ul> - <li>Every application runs in its own process and all components of the application run in that -process, by default</li> - <li>Any slow, blocking operations in an activity should be done in a new thread, to avoid slowing -down the user interface</li> -</ul> <h2>In this document</h2> <ol> diff --git a/docs/html/guide/components/services.jd b/docs/html/guide/components/services.jd index da01d2c..6e22be8 100644 --- a/docs/html/guide/components/services.jd +++ b/docs/html/guide/components/services.jd @@ -3,14 +3,6 @@ page.title=Services <div id="qv-wrapper"> <ol id="qv"> -<h2>Quickview</h2> -<ul> - <li>A service can run in the background to perform work even while the user is in a different -application</li> - <li>A service can allow other components to bind to it, in order to interact with it and -perform interprocess communication</li> - <li>A service runs in the main thread of the application that hosts it, by default</li> -</ul> <h2>In this document</h2> <ol> <li><a href="#Basics">The Basics</a></li> diff --git a/docs/html/guide/components/tasks-and-back-stack.jd b/docs/html/guide/components/tasks-and-back-stack.jd index f818873..e054313 100644 --- a/docs/html/guide/components/tasks-and-back-stack.jd +++ b/docs/html/guide/components/tasks-and-back-stack.jd @@ -5,14 +5,6 @@ parent.link=activities.html <div id="qv-wrapper"> <div id="qv"> -<h2>Quickview</h2> -<ul> - <li>All activities belong to a task</li> - <li>A task contains a collection of activities in the order in which the user interacts with -them</li> - <li>Tasks can move to the background and retain the state of each activity in order for users -to perform other tasks without losing their work</li> -</ul> <h2>In this document</h2> <ol> diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs index 0a234aa..ea36405 100644 --- a/docs/html/guide/guide_toc.cs +++ b/docs/html/guide/guide_toc.cs @@ -373,6 +373,9 @@ <li><a href="<?cs var:toroot ?>guide/topics/media/mediarouteprovider.html"> <span class="en">Media Route Provider</span></a> </li> + <li><a href="<?cs var:toroot ?>guide/topics/media/exoplayer.html"> + <span class="en">ExoPlayer</span></a> + </li> <li><a href="<?cs var:toroot ?>guide/appendix/media-formats.html"> <span class="en">Supported Media Formats</span></a> </li> @@ -564,7 +567,11 @@ <li><a href="<?cs var:toroot ?>guide/practices/tablets-and-handsets.html"> <span class="en">Supporting Tablets and Handsets</span> </a></li> - + <li> + <a href="<?cs var:toroot ?>guide/practices/verifying-apps-art.html"> + <span class="en">Verifying App Behavior on ART</span> + </a> + </li> </ul> </li> diff --git a/docs/html/guide/practices/verifying-apps-art.jd b/docs/html/guide/practices/verifying-apps-art.jd new file mode 100644 index 0000000..8a88222 --- /dev/null +++ b/docs/html/guide/practices/verifying-apps-art.jd @@ -0,0 +1,296 @@ +page.title=Verifying App Behavior on the Android Runtime (ART) +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> +<h2>Quickview</h2> + <ul> + <li>The new Android runtime (ART) is available on some of the newest Android + devices, though all of them currently have Dalvik as the default + runtime.</li> + <li>App developers should make sure their apps are compatible with ART, + especially if you use JNI to run native code or if you use certain tools + that produce non-standard code (such as some obfuscators).</li> + </ul> + + <h2 id="Contents">In this document</h2> + <ol> + <li><a href="#GC_Migration">Addressing Garbage Collection (GC) Issues</a></li> + <li><a href="#JNI_Issues">Preventing JNI Issues</a> + <ol> + <li><a href="#JNI_and_GC">Checking JNI code for garbage-collection + issues</a></li> + <li><a href="#Error_Handling">Error handling</a></li> + <li><a href="#Object_Model_Changes">Object model changes</a></li> + </ol> + </li> + <li><a href="#Stack_Size">Preventing Stack Size Issues</a></li> + <li><a href="#AOT_Fails">Fixing AOT Compilation Issues</a></li> + <li><a href="#Reporting_Problems">Reporting Problems</a></li> + </ol> + <h2>See also</h2> + <ol> + <li><a href="http://source.android.com/devices/tech/dalvik/art.html">Introducing ART</a></li> + <li><a +href="http://android-developers.blogspot.com/2011/07/debugging-android-jni-with-checkjni.html">Debugging +Android JNI with CheckJNI</a></li> + </ol> +</div> +</div> + +<p>With Android 4.4, we are beginning to roll out a new Android runtime, +<strong>ART</strong>. This runtime offers a number of new features that improve +performance and smoothness of the Android platform and apps. (You can find more +information about ART's new features in <a +href="http://source.android.com/devices/tech/dalvik/art.html">Introducing +ART</a>.)</p> + +<p>Currently, ART is available on a number of Android 4.4 devices, such as the +Nexus 4, Nexus 5, Nexus 7, and Google Play edition devices. +At this time, all devices still use Dalvik as the default runtime. We encourage +you to test your apps for ART compatibility and to take advantage of ART's new +features. However, for the time being, you should also take care to maintain +compatibility with Dalvik.</p> + +<p>This document lets you know about things to watch for when migrating an +existing app to be compatible with ART. Most apps should just work when +running with ART. However, some techniques that work on Dalvik do not work on +ART. This document discusses some of these issues.</p> + +<h2 id="GC_Migration">Addressing Garbage Collection (GC) Issues</h2> + +<p>Under Dalvik, apps frequently find it useful to explicitly call {@link +java.lang.System#gc() System.gc()} to prompt garbage collection (GC). This should be +far less necessary with ART, particularly if you're invoking garbage collection +to prevent <a +href="{@docRoot}/tools/debugging/debugging-memory.html#LogMessages"><code>GC_FOR_ALLOC</code></a>-type +occurrences or to reduce fragmentation. You can verify which runtime is in use +by calling {@link java.lang.System#getProperty(java.lang.String) +System.getProperty("java.vm.version")}. If ART is in use, the property's value +is <code>"2.0.0"</code> or higher.</p> + +<p>Furthermore, a compacting garbage collector is under development in the <a +href="https://source.android.com">Android Open-Source Project (AOSP)</a> to +improve memory management. Because of this, you should avoid using techniques +that are incompatible with compacting GC (such as saving pointers to object +instance data). This is particularly important for apps that make use of the +Java Native Interface (JNI). For more information, see <a +href="#JNI_Issues">Preventing JNI Issues</a>.</p> + +<h2 id="JNI_Issues">Preventing JNI Issues</h2> + +<p>ART's JNI is somewhat stricter than Dalvik's. It is an especially good idea +to use CheckJNI mode to catch common problems. If your app makes use of C/C++ +code, you should review the following article:</p> + +<p><a +href="http://android-developers.blogspot.com/2011/07/debugging-android-jni-with-checkjni.html">Debugging +Android JNI with CheckJNI</a></p> + +<h3 id="JNI_and_GC">Checking JNI code for garbage-collection issues</h3> + +<p>ART has a compacting garbage collector under development on the +Android Open Source Project (AOSP). Once the compacting garbage collector is in +use, objects may be moved in memory. If you use C/C++ code, do not +perform operations that are incompatible with compacting GC. We have enhanced +CheckJNI to identify some potential issues (as described in <a +href="http://android-developers.blogspot.com/2011/11/jni-local-reference-changes-in-ics.html">JNI +Local Reference Changes in ICS</a>).</p> + +<p>One area to watch for in particular is the use of +<code>Get...ArrayElements()</code> and <code>Release...ArrayElements()</code> +functions. In runtimes with non-compacting GC, the +<code>Get...ArrayElements()</code> functions typically return a reference to the +actual memory backing the array object. If you make a change to one of the +returned array elements, the array object is itself changed (and the arguments +to <code>Release...ArrayElements()</code> are usually ignored). However, if +compacting GC is in use, the <code>Get...ArrayElements()</code> functions may +return a copy of the memory. If you misuse the reference when compacting GC is +in use, this can lead to memory corruption or other problems. For example:</p> + +<ul> + + <li>If you make any changes to the returned array elements, you must call the + appropriate <code>Release...ArrayElements()</code> function when you are done, + to make sure the changes you made are correctly copied back to the underlying + array object.</li> + + <li>When you release the memory array elements, you must use the appropriate + mode, depending on what changes you made: + + <ul> + + <li>If you did not make any changes to the array elements, use + <code>JNI_ABORT</code> mode, which releases the memory without copying + changes back to the underlying array object.</li> + + <li>If you made changes to the array, and do not need the reference any + more, use code <code>0</code> (which updates the array object and frees + the copy of the memory).</li> + + <li>If you made changes to the array that you want to commit, and you want + to keep the copy of the array, use <code>JNI_COMMIT</code> (which updates + the underlying array object and retains the copy).</li> + + </ul> + + </li> + + <li>When you call <code>Release...ArrayElements()</code>, return the same + pointer that was originally returned by <code>Get...ArrayElements()</code>. For + example, it's not safe to increment the original pointer (to scan through the + returned array elements) then pass the incremented pointer to + <code>Release...ArrayElements()</code>. Passing this modified pointer can cause + the wrong memory to be freed, resulting in memory corruption.</li> + +</ul> + +<h3 id="Error_Handling">Error handling</h3> + +<p>ART's JNI throws errors in a number of cases where Dalvik didn’t. (Once +again, you can catch many such cases by testing with CheckJNI.)</p> + +<p>For example, if <code>RegisterNatives</code> is called with a method that +does not exist (perhaps because the method was removed by a tool such as +<strong>ProGuard</strong>), ART now properly throws {@link +java.lang.NoSuchMethodError}:</p> + +<pre class="no-pretty-print"> +08-12 17:09:41.082 13823 13823 E AndroidRuntime: FATAL EXCEPTION: main +08-12 17:09:41.082 13823 13823 E AndroidRuntime: java.lang.NoSuchMethodError: + no static or non-static method + "Lcom/foo/Bar;.native_frob(Ljava/lang/String;)I" +08-12 17:09:41.082 13823 13823 E AndroidRuntime: + at java.lang.Runtime.nativeLoad(Native Method) +08-12 17:09:41.082 13823 13823 E AndroidRuntime: + at java.lang.Runtime.doLoad(Runtime.java:421) +08-12 17:09:41.082 13823 13823 E AndroidRuntime: + at java.lang.Runtime.loadLibrary(Runtime.java:362) +08-12 17:09:41.082 13823 13823 E AndroidRuntime: + at java.lang.System.loadLibrary(System.java:526) +</pre> + +<p>ART also logs an error (visible in logcat) if <code>RegisterNatives</code> is +called with no methods:</p> + +<pre class="no-pretty-print"> +W/art ( 1234): JNI RegisterNativeMethods: attempt to register 0 native +methods for <classname> +</pre> + +<p>In addition, the JNI functions <code>GetFieldID()</code> and +<code>GetStaticFieldID()</code> now properly throw {@link java.lang.NoSuchFieldError} +instead of simply returning null. Similarly, <code>GetMethodID()</code> and +<code>GetStaticMethodID()</code> now properly throw {@link java.lang.NoSuchMethodError}. +This can lead to CheckJNI failures because of the unhandled exceptions or the +exceptions being thrown to Java callers of native code. This makes it +particularly important to test ART-compatible apps with CheckJNI mode.</p> + +<p>ART expects users of the JNI <code>CallNonvirtual...Method()</code> methods +(such as <code>CallNonvirtualVoidMethod()</code>) to use the method's declaring +class, not a subclass, as required by the JNI specification.</p> + +<h2 id="Stack_Size">Preventing Stack Size Issues</h2> + +<p>Dalvik had separate stacks for native and Java code, with a default Java +stack size of 32KB and a default native stack size of 1MB. ART has a unified +stack for better locality. Ordinarily, the ART {@link java.lang.Thread} stack +size should be approximately the same as for Dalvik. However, if you explicitly +set stack sizes, you may need to revisit those values for apps running in +ART.</p> + +<ul> + + <li>In Java, review calls to the {@link + java.lang.Thread#Thread(java.lang.ThreadGroup, java.lang.Runnable, + java.lang.String, long) Thread} constructor that specify an explicit stack + size. For example, you will need to increase the size if {@link + java.lang.StackOverflowError} occurs.</li> + + <li>In C/C++, review use of <code>pthread_attr_setstack()</code> and + <code>pthread_attr_setstacksize()</code> for threads that also run Java code via + JNI. Here is an example of the error logged when an app attempts to call JNI + <code>AttachCurrentThread()</code> when the pthread size is too small: + +<pre class="no-pretty-print">F/art: art/runtime/thread.cc:435] + Attempt to attach a thread with a too-small stack (16384 bytes)</pre> + </li> + +</ul> + +<h2 id="Object_Model_Changes">Object model changes</h2> + +<p>Dalvik incorrectly allowed subclasses to override package-private methods. +ART issues a warning in such cases:</p> + +<pre class="no-pretty-print"> +Before Android 4.1, method void com.foo.Bar.quux() +would have incorrectly overridden the package-private method in +com.quux.Quux +</pre> + +<p>If you intend to override a class's method in a different package, declare the +method as <code>public</code> or <code>protected</code>.</p> + +<p>{@link java.lang.Object} now has private fields. Apps that reflect on fields +in their class hierarchies should be careful not to attempt to look at the +fields of {@link java.lang.Object}. For example, if you are iterating up a class +hierarchy as part of a serialization framework, stop when + +<pre>Class.getSuperclass() == java.lang.Object.class</pre> + +instead of continuing until the method returns <code>null</code>.</p> + +<p>Proxy {@link +java.lang.reflect.InvocationHandler#invoke(java.lang.Object,java.lang.reflect.Method,java.lang.Object[]) +InvocationHandler.invoke()} now receives <code>null</code> if there are no +arguments instead of an empty array. This behavior was documented previously but +not correctly handled in Dalvik. Previous versions of <a +href="https://code.google.com/p/mockito/">Mockito</a> have difficulties with +this, so use an updated Mockito version when testing with ART.</p> + +<h2 id="AOT_Fails">Fixing AOT Compilation Issues</h2> + +<p>ART's Ahead-Of-Time (AOT) Java compilation should work for all standard Java +code. Compilation is performed by ART's +<code>dex2oat</code> tool; if you encounter any issues related to +<code>dex2oat</code> at install time, let us know (see <a +href="#Reporting_Problems">Reporting Problems</a>) so we can fix them as quickly +as possible. A couple of issues to note:</p> + +<ul> + + <li>ART does tighter bytecode verification at install time than Dalvik does. + Code produced by the Android build tools should be fine. However, some + post-processing tools (especially tools that perform obfuscation) may produce + invalid files that are tolerated by Dalvik but rejected by ART. We have been + working with tool vendors to find and fix such issues. In many cases, getting + the latest versions of your tools and regenerating the DEX files can fix these + problems.</li> + + <li>Some typical problems that are flagged by the ART verifier include: + <ul> + <li>invalid control flow</li> + <li>unbalanced <code>moniterenter</code>/<code>moniterexit</code></li> + <li>0-length parameter type list size</li> + </ul> + </li> + + <li>Some apps have dependencies on the installed <code>.odex</code> file + format in <code>/system/framework</code>, <code>/data/dalvik-cache</code>, or + in {@link dalvik.system.DexClassLoader}’s optimized output directory. These + files are now ELF files and not an extended form of DEX files. While ART tries + to follow the same naming and locking rules as Dalvik, apps should not depend + on the file format; the format is subject to change without notice.</li> + + + +<h2 id="Reporting_Problems">Reporting Problems</h2> + +<p>If you run into any issues that aren’t due to app JNI issues, report +them via the Android Open Source Project Issue Tracker at <a +href="https://code.google.com/p/android/issues/list">https://code.google.com/p/android/issues/list</a>. +Include an <code>"adb bugreport"</code> and a link to the app in the Google +Play store if available. Otherwise, if possible, attach an APK that reproduces +the issue. Note that issues (including attachments) are publicly +visible.</p> diff --git a/docs/html/guide/topics/manifest/activity-element.jd b/docs/html/guide/topics/manifest/activity-element.jd index b648d48..c4d5083 100644 --- a/docs/html/guide/topics/manifest/activity-element.jd +++ b/docs/html/guide/topics/manifest/activity-element.jd @@ -5,7 +5,8 @@ parent.link=manifest-intro.html <dl class="xml"> <dt>syntax:</dt> -<dd><pre class="stx"><activity android:<a href="#reparent">allowTaskReparenting</a>=["true" | "false"] +<dd><pre class="stx"><activity android:<a href="#embedded">allowEmbedded</a>=["true" | "false"] + android:<a href="#reparent">allowTaskReparenting</a>=["true" | "false"] android:<a href="#always">alwaysRetainTaskState</a>=["true" | "false"] android:<a href="#clear">clearTaskOnLaunch</a>=["true" | "false"] android:<a href="#config">configChanges</a>=["mcc", "mnc", "locale", @@ -62,6 +63,17 @@ by the system and will never be run. <dt>attributes:</dt> <dd><dl class="attr"> +<dt><a name="embedded"></a>{@code android:allowEmbedded}</dt> +<dd> + Indicate that the activity can be launched as the embedded child of another + activity. Particularly in the case where the child lives in a container + such as a Display owned by another activity. For example, activities + that are used for Wear custom notifications must declare this so + Wear can display the activity in it's context stream, which resides + in another process. + + <p>The default value of this attribute is <code>false</code>. +</dd> <dt><a name="reparent"></a>{@code android:allowTaskReparenting}</dt> <dd>Whether or not the activity can move from the task that started it to the task it has an affinity for when that task is next brought to the diff --git a/docs/html/guide/topics/media/exoplayer.jd b/docs/html/guide/topics/media/exoplayer.jd new file mode 100644 index 0000000..17b4669 --- /dev/null +++ b/docs/html/guide/topics/media/exoplayer.jd @@ -0,0 +1,514 @@ +page.title=ExoPlayer +page.tags="audio","video","adaptive","streaming","DASH","smoothstreaming" +@jd:body + +<div id="qv-wrapper"> + <div id="qv"> + <h2>In this document</h2> + <ol> + <li><a href="#overview">Overview</a></li> + <li><a href="#trackrenderer">TrackRenderer</a></li> + <li><a href="#samplesource">SampleSource</a> + <ol> + <li><a href="#mediaextractor">Providing media using MediaExtractor</a></li> + <li><a href="#adaptive-playback">Providing media for adaptive playback</a> + <ol> + <li><a href="#format-selection">Format selection for adaptive playback</a></li> + </ol> + </li> + </ol> + <li><a href="#events">Player Events</a> + <ol> + <li><a href="#high-events">High level events</a></li> + <li><a href="#low-events">Low level events</a></li> + </ol> + </li> + <li><a href="#sending-messages">Sending messages to components</a></li> + <li><a href="#customizing">Customizing ExoPlayer</a> + <ol> + <li><a href="#custom-guidelines">Custom component guidelines</a></li> + </ol> + </li> + <li><a href="#drm">Digital Rights Management</a></li> + </ol> + <h2>Key Classes</h2> + <ol> + <li>{@link android.media.MediaCodec}</li> + <li>{@link android.media.MediaExtractor}</li> + <li>{@link android.media.AudioTrack}</li> + </ol> + <h2>Related Samples</h2> + <ol> + <li><a class="external-link" href="https://github.com/google/ExoPlayer"> + ExoPlayer Project</a></li> + <li><a class="external-link" href="http://google.github.io/ExoPlayer/doc/reference/packages.html"> + Class Reference</a></li> + </ol> + </div> +</div> + + +<p>Playing videos and music is a popular activity on Android devices. The Android framework + provides {@link android.media.MediaPlayer} as a quick solution for playing media with minimal + code, and the {@link android.media.MediaCodec} and {@link android.media.MediaExtractor} classes + are provided for building custom media players. The open source project, ExoPlayer, is a + solution between these two options, providing a pre-built player that you can extend.</p> + +<p>ExoPlayer supports features not currently provided by + {@link android.media.MediaPlayer}, including Dynamic adaptive streaming + over HTTP (DASH), SmoothStreaming, and persistent caching. ExoPlayer can be extended + to handle additional media formats, and because you include it as part of your app code, + you can update it along with your app.</p> + +<p>This guide describes how to use ExoPlayer for playing Android supported media formats, as well as + DASH and SmoothStreaming playback. This guide also discusses ExoPlayer events, messages, DRM + support and guidelines for customizing the player.</p> + +<p class="note"> + <strong>Note:</strong> ExoPlayer is an open source project that is not part of the Android + framework and is distributed separately from the Android SDK. The project contains a library and + a demo app that shows both simple and more advanced use of ExoPlayer:</p> + +<ul> + <li><a class="external-link" href="https://github.com/google/ExoPlayer/tree/master/library"> + ExoPlayer Library</a> — This part of the project contains the core library classes.</li> + <li><a class="external-link" href="https://github.com/google/ExoPlayer/tree/master/demo/src/main/java/com/google/android/exoplayer/demo/simple"> + Simple Demo</a> — This part of the app demonstrates a basic use of ExoPlayer.</li> + <li><a class="external-link" href="https://github.com/google/ExoPlayer/tree/master/demo/src/main/java/com/google/android/exoplayer/demo/full"> + Full Demo</a> — This part of the app demonstrates more advanced features, + including the ability to select between multiple audio tracks, a background audio mode, + event logging and DRM protected playback. </li> +</ul> + + +<h2 id="overview">Overview</h2> + +<p>ExoPlayer is a media player built on top of the {@link android.media.MediaExtractor} and + {@link android.media.MediaCodec} APIs released in Android 4.1 (API level 16). At the core of this + library is the {@code ExoPlayer} class. This class maintains the player’s global state, but makes few + assumptions about the nature of the media being played, such as how the media data is obtained, + how it is buffered or its format. You inject this functionality through ExoPlayer’s {@code + prepare()} method in the form of {@code TrackRenderer} objects.</p> + +<p>ExoPlayer provides default {@code TrackRenderer} implementations for audio and + video, which make use of the {@link android.media.MediaCodec} and {@link android.media.AudioTrack} + classes in the Android framework. Both renderers require a {@code SampleSource} object, from which + they obtain individual media samples for playback. Figure 1 shows the high level object model for + an ExoPlayer implementation configured to play audio and video using these components.</p> + +<img src="{@docRoot}images/exoplayer/object-model.png" alt="" id="figure1" /> +<p class="img-caption"> + <strong>Figure 1.</strong> High level object model for an ExoPlayer configured to play audio + and video using {@code TrackRenderer} objects +</p> + + +<h2 id="trackrenderer">TrackRenderer</h2> + +<p>A {@code TrackRenderer} processes a component of media for playback, such as + video, audio or text. The ExoPlayer class invokes methods on its {@code TrackRenderer} instances from a + single playback thread, and by doing so causes each media component to be rendered as the global + playback position is advanced. The ExoPlayer library provides {@code MediaCodecVideoTrackRenderer} as + the default implementations rendering video and {@code MediaCodecAudioTrackRenderer} for audio. + Both implementations make use of {@link android.media.MediaCodec} to decode individual media + samples. They can handle all audio and video formats supported by a given Android device + (see <a href="http://developer.android.com/guide/appendix/media-formats.html">Supported Media + Formats</a> for details). The ExoPlayer library also provides an implementation for rendering + text called {@code TextTrackRenderer}. +</p> + +<p>The code example below outlines the main steps required to instantiate an ExoPlayer to play video + and audio using the standard {@code TrackRenderer} implementations.</p> + +<pre> +// 1. Instantiate the player. +player = ExoPlayer.Factory.newInstance(RENDERER_COUNT); +// 2. Construct renderers. +MediaCodecVideoTrackRenderer videoRenderer = … +MediaCodecAudioTrackRenderer audioRenderer = ... +// 3. Inject the renderers through prepare. +player.prepare(videoRenderer, audioRenderer); +// 4. Pass the surface to the video renderer. +player.sendMessage(videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, + surface); +// 5. Start playback. +player.setPlayWhenReady(true); +... +player.release(); // Don’t forget to release when done! +</pre> + +<p>For a complete example, see the {@code SimplePlayerActivity} in the ExoPlayer demo app, which + correctly manages an ExoPlayer instance with respect to both the {@link android.app.Activity} and + {@link android.view.Surface} lifecycles.</p> + + +<h2 id="samplesource">SampleSource</h2> + +<p>A standard {@code TrackRenderer} implementation requires a {@code SampleSource} to + be provided in its constructor. A {@code SampleSource} object provides format information and + media samples to be rendered. The ExoPlayer library provides {@code FrameworkSampleSource} and + {@code ChunkSampleSource}. The {@code FrameworkSampleSource} class uses {@link + android.media.MediaExtractor} to request, buffer and extract the media samples. The {@code + ChunkSampleSource} class provides adaptive playback using DASH or SmoothStreaming, and + implements networking, buffering and media extraction within the ExoPlayer library.</p> + + +<h3 id="mediaextractor">Providing media using MediaExtractor</h3> + +<p> + In order to render media formats supported by the Android framework, the {@code + FrameworkSampleSource} class uses {@link android.media.MediaExtractor} for networking, + buffering and sample extraction functionality. By doing so, it supports any media container format + supported by the version of Android where it is running. For more information about media formats + supported by Android, see <a href="{@docRoot}guide/appendix/media-formats.html">Supported + Media Formats</a>. +</p> + +<p>The diagram in Figure 2 shows the object model for an ExoPlayer implementation using + {@code FrameworkSampleSource}.</p> + +<img src="{@docRoot}images/exoplayer/frameworksamplesource.png" alt="" id="figure2" /> +<p class="img-caption"> + <strong>Figure 2.</strong> Object model for an implementation of ExoPlayer that renders + media formats supported by Android using {@code FrameworkSampleSource} +</p> + +<p>The following code example outlines how the video and audio renderers are constructed to + load the video from a specified URI.</p> + +<pre> +FrameworkSampleSource sampleSource = new FrameworkSampleSource( + activity, uri, null, 2); +MediaCodecVideoTrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer( + sampleSource, null, true, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT, 0, + mainHandler, playerActivity, 50); +MediaCodecAudioTrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer( + sampleSource, null, true); +</pre> + +<p>The ExoPlayer demo app provides a complete implementation of this code in + {@code DefaultRendererBuilder}. The {@code SimplePlaybackActivity} class uses it to play one + of the videos available in the demo app. Note that in the example, video and audio + are muxed, meaning they are streamed together from a single URI. The {@code FrameworkSampleSource} + instance provides video samples to the {@code videoRenderer} object and audio samples to the + {@code audioRenderer} object as they are extracted from the media container format. It is also + possible to play demuxed media, where video and audio are streamed separately from different URIs. + This functionality can be achieved by having two {@code FrameworkSampleSource} instances instead + of one.</p> + + +<h3 id="adaptive-playback">Providing media for adaptive playback</h3> + +<p>ExoPlayer supports adaptive streaming, which allows the quality of the + media data to be adjusted during playback based on the network conditions. DASH + and SmoothStreaming are examples of adaptive streaming technologies. Both these approaches + load media in small chunks (typically 2 to 10 seconds in duration). Whenever a chunk of media + is requested, the client selects from a number of possible formats. For example, a client may + select a high quality format if network conditions are good, or a low quality format if network + conditions are bad. In both techniques, video and audio are streamed separately.</p> + +<p>ExoPlayer supports adaptive playback through use of the {@code ChunkSampleSource} class, + which loads chunks of media data from which individual samples can be extracted. Each {@code + ChunkSampleSource} requires a {@code ChunkSource} object to be injected through its constructor, + which is responsible for providing media chunks from which to load and read samples. The {@code + DashMp4ChunkSource} and {@code SmoothStreamingChunkSource} classes provide DASH and SmoothStreaming + playback using the FMP4 container format. The {@code DashWebMChunkSource} class uses the WebM + container format to provide DASH playback.</p> + +<p>All of the standard {@code ChunkSource} implementations require a {@code FormatEvaluator} and + a {@code DataSource} to be injected through their constructors. The {@code FormatEvaluator} + objects select from the available formats before each chunk is loaded. The {@code DataSource} + objects are responsible for actually loading the data. Finally, the {@code ChunkSampleSources} + require a {@code LoadControl} object that controls the chunk buffering policy.</p> + +<p>The object model of an ExoPlayer configured for a DASH adaptive playback is shown in the + diagram below. This example uses an {@code HttpDataSource} object to stream the media over the + network. The video quality is varied at runtime using the adaptive implementation of {@code + FormatEvaluator}, while audio is played at a fixed quality level.</p> + +<img src="{@docRoot}images/exoplayer/adaptive-streaming.png" alt="" id="figure3" /> +<p class="img-caption"> + <strong>Figure 3.</strong> Object model for a DASH adaptive playback using ExoPlayer +</p> + +<p>The following code example outlines how the video and audio renderers are constructed.</p> + +<pre> +Handler mainHandler = playerActivity.getMainHandler(); +LoadControl loadControl = new DefaultLoadControl( + new BufferPool(BUFFER_SEGMENT_SIZE)); +BandwidthMeter bandwidthMeter = new BandwidthMeter(); + +// Build the video renderer. +DataSource videoDataSource = new HttpDataSource(userAgent, + HttpDataSource.REJECT_PAYWALL_TYPES, bandwidthMeter); +ChunkSource videoChunkSource = new DashMp4ChunkSource(videoDataSource, + new AdaptiveEvaluator(bandwidthMeter), videoRepresentations); +ChunkSampleSource videoSampleSource = new ChunkSampleSource(videoChunkSource, + loadControl, VIDEO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, true); +MediaCodecVideoTrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer( + videoSampleSource, null, true, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT, + 0, mainHandler, playerActivity, 50); + +// Build the audio renderer. +DataSource audioDataSource = new HttpDataSource(userAgent, + HttpDataSource.REJECT_PAYWALL_TYPES, bandwidthMeter); +ChunkSource audioChunkSource = new DashMp4ChunkSource(audioDataSource, + new FormatEvaluator.FixedEvaluator(), audioRepresentation); +SampleSource audioSampleSource = new ChunkSampleSource(audioChunkSource, + loadControl, AUDIO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, true); +MediaCodecAudioTrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer( + audioSampleSource, null, true); +</pre> + +<p>In this code, {@code videoRepresentations} and {@code audioRepresentation} are {@code + Representation} objects, each of which describes one of the available media streams. In the DASH + model, these streams are parsed from a media presentation description (MPD) file. The ExoPlayer + library provides a {@code MediaPresentationDescriptionParser} class to obtain {@code + Representation} objects from MPD files.</p> + +<p class="note"> + <strong>Note:</strong> Building Representation objects from MPD files is not required. You can + build Representation objects from other data sources if necessary. +</p> + +<p>The ExoPlayer demo app provides complete implementation of this code in + {@code DashVodRendererBuilder}. The {@code SimplePlaybackActivity} class uses this builder to + construct renderers for playing DASH sample videos in the demo app. It asynchronously fetches a + specified MPD file in order to construct the required {@code Representation} objects. For an + equivalent SmoothStreaming example, see the {@code SmoothStreamingRendererBuilder} class in the + demo app.</p> + + +<h4 id="format-selection">Format selection for adaptive playback</h4> + +<p>For DASH and SmoothStreaming playback, consider both static format selection at the + start of playback and dynamic format selection during playback. Static format selection should be + used to filter out formats that should not be used throughout the playback, for example formats + with resolutions higher than the maximum supported by the playback device. Dynamic selection varies + the selected format during playback, typically to adapt video quality in response to changes in + network conditions.</p> + +<h5 id="static-selection">Static format selection</h5> + +<p>When preparing a player, you should consider filtering out some of the available formats if + they are not useable for playback. Static format selection allows you to filter out + formats that cannot be used on a particular device or are not compatible with your player. + For audio playback, this often means picking a single format to play and discarding the others.</p> + +<p>For video playback, filtering formats can be more complicated. Apps should first + eliminate any streams that whose resolution is too high to be played by the device. For H.264, + which is normally used for DASH and SmoothStreaming playback, ExoPlayer’s {@code MediaCodecUtil} + class provides a {@code maxH264DecodableFrameSize()} method that can be used to determine what + resolution streams the device is able to handle, as shown in the following code example:</p> + +<pre> +int maxDecodableFrameSize = MediaCodecUtil.maxH264DecodableFrameSize(); +Format format = representation.format; +if (format.width * format.height <= maxDecodableFrameSize) { + // The device can play this stream. + videoRepresentations.add(representation); +} else { + // The device isn't capable of playing this stream. +} +</pre> + +<p>This approach is used to filter {@code Representations} in the {@code DashVodRendererBuilder} + class of the ExoPlayer demo app, and similarly to filter track indices in {@code + SmoothStreamingRendererBuilder}.</p> + +<p>In addition to eliminating unsupported formats, it should be noted that the ability to + seamlessly switch between H.264 streams of different resolution is an optional decoder feature + available in Android 4.3 (API level 16) and higher, and so is not supported by all devices. The + availability of an adaptive H.264 decoder can be queried using {@code MediaCodecUtil}, as shown in + the following code example:</p> + +<pre> +boolean isAdaptive = MediaCodecUtil.getDecoderInfo(MimeTypes.VIDEO_H264).adaptive; +</pre> + +<p>The {@code MediaCodecVideoTrackRenderer} class is still able to handle resolution changes on + devices that do not have adaptive decoders, however the switch is not seamless. Typically, the + switch creates a small discontinuity in visual output lasting around 50-100ms. For devices that + do not provide an adaptive decoder, app developers may choose to adapt between formats at + a single fixed resolution so as to avoid discontinuities. The ExoPlayer demo app + implementation does not pick a fixed resolution.</p> + + +<h5 id="dynamic-selection">Dynamic format selection</h5> + +<p>During playback, you can use a {@code FormatEvaluator} to dynamically select from the + available video formats. The ExoPlayer library provides a {@code FormatEvaluator.Adaptive} + implementation for dynamically selecting between video formats based on the current network + conditions.</p> + +<p>This class provides a simple, general purpose reference implementation, however you are + encouraged to write your own {@code FormatEvaluator} implementation to best suit your particular + needs.</p> + + +<h2 id="events">Player Events</h2> + +<p>During playback, your app can listen for events generated by the ExoPlayer that indicate the + overall state of the player. These events are useful as triggers for updating the app user + interface such as playback controls. Many ExoPlayer components also report their own component + specific low level events, which can be useful for performance monitoring.</p> + + +<h3 id="high-events">High level events</h3> + +<p>ExoPlayer allows instances of {@code ExoPlayer.Listener} to be added and removed using its + {@code addListener()} and {@code removeListener()} methods. Registered listeners are notified of + changes in playback state, as well as when errors occur that cause playback to fail. For more + information about the valid playback states and the possible transitions between them, see the + ExoPlayer source code.</p> + +<p>Developers who implement custom playback controls should register a listener and use it to + update their controls as the player’s state changes. An app should also show an + appropriate error to the user if playback fails.</p> + +<h3 id="low-events">Low level events</h3> + +<p>In addition to high level listeners, many of the individual components provided by the + ExoPlayer library allow their own event listeners. For example, {@code + MediaCodecVideoTrackRenderer} has constructors that take a {@code + MediaCodecVideoTrackRenderer.EventListener}. In the ExoPlayer demo app, {@code SimplePlayerActivity} + acts as a listener so that it can adjust the dimensions of the target surface to have the correct + height and width ratio for the video being played:</p> + +<pre> +@Override +public void onVideoSizeChanged(int width, int height) { + surfaceView.setVideoWidthHeightRatio(height == 0 ? 1 : (float) width / height); +} +</pre> + +<p>The {@code RendererBuilder} classes in the ExoPlayer demo app inject the activity as the + listener, for example in the {@code DashVodRendererBuilder} class:</p> + +<pre> +MediaCodecVideoTrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer( + videoSampleSource, null, true, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT, + 0, <strong>mainHandler, playerActivity</strong>, 50); +</pre> + +<p>Note that you must pass a {@link android.os.Handler} object to the renderer, which determines + the thread on which the listener’s methods are invoked. In most cases, you should use a + {@link android.os.Handler} associated with the app’s main thread, as is the case in this example. + </p> + +<p>Listening to individual components can be useful for adjusting UI based on player events, as + in the example above. Listening to component events can also be helpful for logging performance + metrics. For example, {@code MediaCodecVideoTrackRenderer} notifies its listener of dropped video + frames. A developer may wish to log such metrics to track playback performance in their + app.</p> + +<p>Many components also notify their listeners when errors occur. Such errors may or may not + cause playback to fail. If an error does not cause playback to fail, it may still result in + degraded performance, and so you may wish to log all errors in order to track playback + performance. Note that an ExoPlayer instance always notifies its high level listeners of errors that + cause playback to fail, in addition to the listener of the individual component from which the error + originated. Hence, you should display error messages to users only from high level listeners. + Within individual component listeners, you should use error notifications only for informational + purposes.</p> + + +<h2 id="sending-messages">Sending messages to components</h2> + +<p>Some ExoPlayer components allow changes in configuration during playback. By convention, you make + these changes by passing asynchronous messages through the ExoPlayer to the component. + This approach ensures both thread safety and that the configuration change is + executed in order with any other operations being performed on the player.</p> + +<p>The most common use of messaging is passing a target surface to + {@code MediaCodecVideoTrackRenderer}:</p> + +<pre> +player.sendMessage(videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, + surface); +</pre> + +<p>Note that if the surface needs to be cleared because + {@link android.view.SurfaceHolder.Callback#surfaceDestroyed + SurfaceHolder.Callback.surfaceDestroyed()} has been invoked, then you must send this + message using the blocking variant of {@code sendMessage()}:</p> +<p> + +<pre> +player.blockingSendMessage(videoRenderer, + MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, null); +</pre> + +<p>You must use a blocking message because the contract of {@link + android.view.SurfaceHolder.Callback#surfaceDestroyed surfaceDestroyed()} requires that the + app does not attempt to access the surface after the method returns. The {@code + SimplePlayerActivity} class in the demo app demonstrates how the surface should be set and + cleared.</p> + + +<h2 id="customizing">Customizing ExoPlayer</h2> + +<p>One of the main benefits of ExoPlayer over {@link android.media.MediaPlayer} is the ability to + customize and extend the player to better suit the developer’s use case. The ExoPlayer library + is designed specifically with this in mind, defining a number of abstract base classes and + interfaces that make it possible for app developers to easily replace the default implementations + provided by the library. Here are some use cases for building custom components:</p> + +<ul> + <li><strong>{@code TrackRenderer}</strong> - You may want to implement a custom + {@code TrackRenderer} to handle media types other than audio and video. The {@code + TextTrackRenderer} class within the ExoPlayer library is an example of how to implement a + custom renderer. You could use the approach it demonstrates to render custom + overlays or annotations. Implementing this kind of functionality as a {@code TrackRenderer} + makes it easy to keep the overlays or annotations in sync with the other media being played.</li> + <li><strong>{@code SampleSource}</strong> - If you need to support a container format not + already handled by {@link android.media.MediaExtractor} or ExoPlayer, consider implementing a + custom {@code SampleSource} class.</li> + <li><strong>{@code FormatEvaluator}</strong> - The ExoPlayer library provides {@code + FormatEvaluator.Adaptive} as a simple reference implementation that switches between different + quality video formats based on the available bandwidth. App developers are encouraged to + develop their own adaptive {@code FormatEvaluator} implementations, which can be designed to + suit their use specific needs.</li> + <li><strong>{@code DataSource}</strong> - ExoPlayer’s upstream package already contains a + number of {@code DataSource} implementations for different use cases, such as writing and + reading to and from a persistent media cache. You may want to implement you own + {@code DataSource} class to load data in another way, such as a custom + protocol or HTTP stack for data input.</li> +</ul> + + +<h3 id="custom-guidelines">Custom component guidelines</h3> + +<p>If a custom component needs to report events back to the app, we recommend that you + do so using the same model as existing ExoPlayer components, where an event listener is passed + together with a {@link android.os.Handler} to the constructor of the component.</p> + +<p>We recommended that custom components use the same model as existing ExoPlayer components to + allow reconfiguration by the app during playback, as described in + <a href="#sending-messages">Sending messages to components</a>. + To do this, you should implement a {@code ExoPlayerComponent} and receive + configuration changes in its {@code handleMessage()} method. Your app should pass + configuration changes by calling ExoPlayer’s {@code sendMessage()} and {@code + blockingSendMessage()} methods.</p> + + +<h2 id="drm">Digital Rights Management</h2> + +<p>On Android 4.3 (API level 18) and higher, ExoPlayer supports Digital Rights Managment (DRM) + protected playback. In order to play DRM protected content with ExoPlayer, your app must + inject a {@code DrmSessionManager} into the {@code MediaCodecVideoTrackRenderer} and {@code + MediaCodecAudioTrackRenderer} constructors. A {@code DrmSessionManager} object is responsible for + providing the {@code MediaCrypto} object required for decryption, as well as ensuring that the + required decryption keys are available to the underlying DRM module being used.</p> + +<p>The ExoPlayer library provides a default implementation of {@code DrmSessionManager}, called + {@code StreamingDrmSessionManager}, which uses {@link android.media.MediaDrm}. The session + manager supports any DRM scheme for which a modular DRM component exists on the device. All + Android devices are required to support Widevine modular DRM (with L3 security, although many + devices also support L1). Some devices may support additional schemes such as PlayReady.</p> + +<p>The {@code StreamingDrmSessionManager} class requires a {@code MediaDrmCallback} to be + injected into its constructor, which is responsible for actually making provisioning and key + requests. You should implement this interface to make network requests to your license + server and obtain the required keys. The {@code WidevineTestMediaDrmCallback} class in the + ExoPlayer demo app sends requests to a Widevine test server.</p> diff --git a/docs/html/guide/topics/ui/settings.jd b/docs/html/guide/topics/ui/settings.jd index 1d36430..f454c4e 100644 --- a/docs/html/guide/topics/ui/settings.jd +++ b/docs/html/guide/topics/ui/settings.jd @@ -820,7 +820,8 @@ public class SettingsActivity extends PreferenceActivity public static final String KEY_PREF_SYNC_CONN = "pref_syncConnectionType"; ... - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, + String key) { if (key.equals(KEY_PREF_SYNC_CONN)) { Preference connectionPref = findPreference(key); // Set summary to be the user-description for the selected value @@ -863,7 +864,40 @@ protected void onPause() { } </pre> +<p class="caution"><strong>Caution:</strong> When you call {@link +android.content.SharedPreferences#registerOnSharedPreferenceChangeListener +registerOnSharedPreferenceChangeListener()}, the preference manager does not +currently store a strong reference to the listener. You must store a strong +reference to the listener, or it will be susceptible to garbage collection. We +recommend you keep a reference to the listener in the instance data of an object +that will exist as long as you need the listener.</p> + +<p>For example, in the following code, the caller does not keep a reference to +the listener. As a result, the listener will be subject to garbage collection, +and it will fail at some indeterminate time in the future:</p> + +<pre> +prefs.registerOnSharedPreferenceChangeListener( + // Bad! The listener is subject to garbage collection! + new SharedPreferences.OnSharedPreferenceChangeListener() { + public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { + // listener implementation + } +}); +</pre> + +<p>Instead, store a reference to the listener in an instance data field of an +object that will exist as long as the listener is needed:</p> +<pre> +SharedPreferences.OnSharedPreferenceChangeListener listener = + new SharedPreferences.OnSharedPreferenceChangeListener() { + public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { + // listener implementation + } +}; +prefs.registerOnSharedPreferenceChangeListener(listener); +</pre> <h2 id="NetworkUsage">Managing Network Usage</h2> @@ -1142,13 +1176,15 @@ protected Parcelable onSaveInstanceState() { final Parcelable superState = super.onSaveInstanceState(); // Check whether this Preference is persistent (continually saved) if (isPersistent()) { - // No need to save instance state since it's persistent, use superclass state + // No need to save instance state since it's persistent, + // use superclass state return superState; } // Create instance of custom BaseSavedState final SavedState myState = new SavedState(superState); - // Set the state's value with the class member that holds current setting value + // Set the state's value with the class member that holds current + // setting value myState.value = mNewValue; return myState; } diff --git a/docs/html/images/brand/Google_Play_Store_600.png b/docs/html/images/brand/Google_Play_Store_600.png Binary files differnew file mode 100644 index 0000000..f748652 --- /dev/null +++ b/docs/html/images/brand/Google_Play_Store_600.png diff --git a/docs/html/images/exoplayer/adaptive-streaming.png b/docs/html/images/exoplayer/adaptive-streaming.png Binary files differnew file mode 100644 index 0000000..9fc650c --- /dev/null +++ b/docs/html/images/exoplayer/adaptive-streaming.png diff --git a/docs/html/images/exoplayer/frameworksamplesource.png b/docs/html/images/exoplayer/frameworksamplesource.png Binary files differnew file mode 100644 index 0000000..fd1e314 --- /dev/null +++ b/docs/html/images/exoplayer/frameworksamplesource.png diff --git a/docs/html/images/exoplayer/object-model.png b/docs/html/images/exoplayer/object-model.png Binary files differnew file mode 100644 index 0000000..e0d6e55 --- /dev/null +++ b/docs/html/images/exoplayer/object-model.png diff --git a/docs/html/images/google/datastore-logo.png b/docs/html/images/google/datastore-logo.png Binary files differnew file mode 100644 index 0000000..a0fc0a0 --- /dev/null +++ b/docs/html/images/google/datastore-logo.png diff --git a/docs/html/images/google/gcs-small.png b/docs/html/images/google/gcs-small.png Binary files differnew file mode 100644 index 0000000..b8dbe0d --- /dev/null +++ b/docs/html/images/google/gcs-small.png diff --git a/docs/html/images/google/gcs.png b/docs/html/images/google/gcs.png Binary files differnew file mode 100644 index 0000000..7355d64 --- /dev/null +++ b/docs/html/images/google/gcs.png diff --git a/docs/html/images/gp-ads-console.jpg b/docs/html/images/gp-ads-console.jpg Binary files differnew file mode 100644 index 0000000..158e31d --- /dev/null +++ b/docs/html/images/gp-ads-console.jpg diff --git a/docs/html/images/gp-ads-linking2.jpg b/docs/html/images/gp-ads-linking2.jpg Binary files differnew file mode 100644 index 0000000..0c2f731 --- /dev/null +++ b/docs/html/images/gp-ads-linking2.jpg diff --git a/docs/html/images/gp-analytics.jpg b/docs/html/images/gp-analytics.jpg Binary files differnew file mode 100644 index 0000000..e1a92c7 --- /dev/null +++ b/docs/html/images/gp-analytics.jpg diff --git a/docs/html/images/gpfe-start-0.jpg b/docs/html/images/gpfe-start-0.jpg Binary files differindex e97381d..bb68aaa 100644 --- a/docs/html/images/gpfe-start-0.jpg +++ b/docs/html/images/gpfe-start-0.jpg diff --git a/docs/html/images/home/auto.png b/docs/html/images/home/auto.png Binary files differnew file mode 100644 index 0000000..7ea01b0 --- /dev/null +++ b/docs/html/images/home/auto.png diff --git a/docs/html/images/home/tv.png b/docs/html/images/home/tv.png Binary files differnew file mode 100644 index 0000000..3cf2034 --- /dev/null +++ b/docs/html/images/home/tv.png diff --git a/docs/html/images/home/wear.png b/docs/html/images/home/wear.png Binary files differnew file mode 100644 index 0000000..dfaded7 --- /dev/null +++ b/docs/html/images/home/wear.png diff --git a/docs/html/images/tools-home.png b/docs/html/images/tools-home.png Binary files differindex 291a361..86a7414 100644 --- a/docs/html/images/tools-home.png +++ b/docs/html/images/tools-home.png diff --git a/docs/html/images/tools/android-studio.png b/docs/html/images/tools/android-studio.png Binary files differdeleted file mode 100644 index 4d93a86..0000000 --- a/docs/html/images/tools/android-studio.png +++ /dev/null diff --git a/docs/html/images/tools/laptop-studio.png b/docs/html/images/tools/laptop-studio.png Binary files differnew file mode 100644 index 0000000..3684ff0 --- /dev/null +++ b/docs/html/images/tools/laptop-studio.png diff --git a/docs/html/images/tools/wizard2.png b/docs/html/images/tools/wizard2.png Binary files differnew file mode 100644 index 0000000..921d58c --- /dev/null +++ b/docs/html/images/tools/wizard2.png diff --git a/docs/html/images/tools/wizard3.png b/docs/html/images/tools/wizard3.png Binary files differnew file mode 100644 index 0000000..d5749d5 --- /dev/null +++ b/docs/html/images/tools/wizard3.png diff --git a/docs/html/images/tools/wizard4.png b/docs/html/images/tools/wizard4.png Binary files differnew file mode 100644 index 0000000..2709f7b --- /dev/null +++ b/docs/html/images/tools/wizard4.png diff --git a/docs/html/images/tools/wizard5.png b/docs/html/images/tools/wizard5.png Binary files differnew file mode 100644 index 0000000..105cf2a --- /dev/null +++ b/docs/html/images/tools/wizard5.png diff --git a/docs/html/images/tools/wizard6.png b/docs/html/images/tools/wizard6.png Binary files differnew file mode 100644 index 0000000..8b0691c --- /dev/null +++ b/docs/html/images/tools/wizard6.png diff --git a/docs/html/images/tools/wizard7.png b/docs/html/images/tools/wizard7.png Binary files differnew file mode 100644 index 0000000..83396cf --- /dev/null +++ b/docs/html/images/tools/wizard7.png diff --git a/docs/html/images/training/volley-request.png b/docs/html/images/training/volley-request.png Binary files differnew file mode 100644 index 0000000..85f0681 --- /dev/null +++ b/docs/html/images/training/volley-request.png diff --git a/docs/html/index.jd b/docs/html/index.jd index a4b0683..2f01538 100644 --- a/docs/html/index.jd +++ b/docs/html/index.jd @@ -1,159 +1,102 @@ fullpage=true page.viewport_width=970 -no_footer_links=true -carousel=true excludeFromSuggestions=true page.metaDescription=The official site for Android developers. Provides the Android SDK and documentation for app developers and designers. page.customHeadTag=<meta name="google-site-verification" content="sa-bIAI6GKvct3f61-WpRguHq-aNjtF7xJjMTSi79as" /> @jd:body - -<div class="wrap"> - <!-- Slideshow --> - <div class="slideshow-container slideshow-home col-16"> - <a href="" class="slideshow-prev">Prev</a> - <a href="" class="slideshow-next">Next</a> - <div class="frame"> - <ul> - <!-- set explicit widths as needed to prevent overflow issues --> - - - <li class="item carousel-home"> - <div class="content-left col-10" style="width:580px;"> - <a href="{@docRoot}wear/index.html"> - <img src="{@docRoot}images/home/aw_dac.png" style="margin-top:50px" > - </a> - </div> - <div class="content-right col-5" style="width:280px;"> - <h1>Introducing Android Wear</h1> - <p>We’re extending the Android platform to wearables. You can start building richer wearable experiences for your apps today using the enhanced Notification APIs in this Developer Preview.</p> - <p>We can’t wait to see what you will create.</p> - <p><a href="{@docRoot}wear/index.html" class="button">Learn more</a></p> - </div> - </li> - - - <li class="item carousel-home"> - <div class="content-left col-11" style="padding-top:65px;"> - <script src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script> - <div style="box-shadow: 3px 10px 18px 1px #999;width:600px;height:336px"> - <div id="ytapiplayer"> - <a href="http://www.youtube.com/watch?v=WWArLD6nqrk"><img width=600 src="{@docRoot}images/video-kiwi.jpg"></a><!--You need Flash player 8+ and JavaScript enabled to view this video. --> - </div> - <script type="text/javascript"> - var params = { allowScriptAccess: "always" }; - var atts = { id: "ytapiplayer" }; - swfobject.embedSWF("//www.youtube.com/v/WWArLD6nqrk?enablejsapi=1&playerapiid=ytplayer&version=3&HD=1;rel=0;showinfo=0;modestbranding;origin=developer.android.com;autohide=1", - "ytapiplayer", "600", "336", "8", null, null, params, atts); - - // Callback used to pause/resume carousel based on video state - function onytplayerStateChange(newState) { - var isPaused = $("#pauseButton").hasClass("paused"); - if ((newState == 1) || (newState == 3)) { - // if playing or buffering, pause the carousel - if (!isPaused) { - $("#pauseButton").click(); - } - } else { - // otherwise, make sure carousel is running - if (isPaused) { - $("#pauseButton").click(); - } - } - } - - // Callback received when YouTube player loads to setup callback (above) - function onYouTubePlayerReady(playerId) { - var ytplayer = document.getElementById("ytapiplayer"); - ytplayer.addEventListener("onStateChange", "onytplayerStateChange"); - } - - </script> - </div> - </div> - <div class="content-right col-4"> - <h1 style="white-space:nowrap;line-height:1.2em;">Developer Story: <br />Kiwi, Inc.</h1> - <p>Game developer Kiwi has had five titles in the top 25 grossing on Google Play. Hear how Google Play - has helped them double revenue every six months.</p> - <p><a href="{@docRoot}distribute/stories/index.html" class="button">Watch more videos </a></p> - </div> - </li> - - <li class="item carousel-home"> - <div class="content-left col-7" style="width:400px;"> - <a href="{@docRoot}about/versions/kitkat.html"> - <img src="{@docRoot}images/home/kk-hero.jpg" width="242" style="padding-top:72px;"> - </a> - </div> - <div class="content-right col-4" style="width:340px;"> - <h1>Android 4.4 KitKat!</h1> - <p>A new version of Android is here, with great new features, APIs, and tools for developers.</p> - <p>Android 4.4 is built to run on more devices than ever before, and gives you more ways to showcase your content and create beautiful, useful, and innovative apps.</p> - <p>Learn about what's new in the Platform Highlights and see the API Overview for details.</p> - <p><a href="{@docRoot}about/versions/kitkat.html" class="button">Check out the highlights</a></p> - </div> - </li> - - <li class="item carousel-home"> - <div class="content-left col-11" style="padding-top:65px;"> - <a href="https://www.youtube.com/watch?v=sONcojECWXs&list=PLWz5rJ2EKKc-2quE-o0enpILZF3nBZg_K&index=1"> - <img src="{@docRoot}images/title-devbytes-kk.jpg" style="margin-top:0px;width:600px;"> - </a> - </div> - <div class="content-right col-4"> - <h1 style="white-space:nowrap;line-height:1.2em;">DevBytes: <br />Android 4.4</h1> - <p>Join the DevBytes team for a look at what's new in Android 4.4 KitKat — new ways to make your apps beautiful, printing, storage access framework, and more.</p> - <p><a href="https://www.youtube.com/watch?v=sONcojECWXs&list=PLWz5rJ2EKKc-2quE-o0enpILZF3nBZg_K&index=1" class="button">Watch the video </a></p> - </div> - </li> - - <li class="item carousel-home"> - <div class="content-left col-19" style="width:580px;"> - <a href="{@docRoot}design/patterns/new.html"> - <img src="{@docRoot}design/media/design_elements_landing.png" style="margin-top:30px"> - </a> - </div> - <div class="content-right col-4" style="width:280px;"> - <h1>Design for Android KitKat</h1> - <p>Android KitKat brings a refreshed UI with updated styles, patterns, and gestures to use in your apps. </p> - <p>We've updated the Android Design guidelines and added new pages on branding, fullscreen, and more. </p> - <p><a href="{@docRoot}design/patterns/new.html" class="button">See what's new</a></p> - </div> - </li> - - <li class="item carousel-home"> - <div class="content-left col-11" style="padding-top:65px;"> - <a href="http://www.youtube.com/watch?v=6QHkv-bSlds&list=PLWz5rJ2EKKc8j2B95zGMb8muZvrIy-wcF&index=1"> - <img src="{@docRoot}images/title-adia-kk.png" style="margin-top:0px;width:600px;"> - </a> - </div> - <div class="content-right col-4"> - <h1 style="white-space:nowrap;line-height:1.2em;">ADIA: <br />Android 4.4</h1> - </p>Join the Android Design in Action team for a walkthrough of new developer features, UX changes, and updates to design guidelines in Android 4.4.</p> - <p><a href="http://www.youtube.com/watch?v=6QHkv-bSlds&list=PLWz5rJ2EKKc8j2B95zGMb8muZvrIy-wcF&index=1" class="button">Watch the video </a></p> - </div> - </li> - </ul> +<!-- Top full-bleed carousel --> +<div class="home-new-carousel-1" style="margin-top:40px"> + <div class="fullscreen-carousel-content"> + <div class="vcenter"> + <div class="wrap clearfix"> + + <div class="static resource-flow-layout wrap col-16"> + <div class="resource resource-card resource-card-18x6"> + <div class="card-bg" style="background-image: url('/preview/images/l-dev-prev.png');"></div> + <div class="card-info"> + <div class="section"></div> + <div class="title">Android L Developer Preview</div> + <div class="description ellipsis" style="height: 285px;"> + <div class="text" style="height: auto;"> + <p style="font-size:16px;">Get an early look at the next Android release and + start using new APIs so your apps are ready when the platform officially launches.</p> + <p> + <a href="{@docRoot}preview/index.html" class="landing-button landing-secondary">Learn more</a></p> + </div> + </div> + </div> + </div> </div> - </div> - -<!-- /End slideshow --> - <a href="" id="pauseButton" style="display:none">pause</a> - - -</div> -<div class="wrap" style="padding-bottom:20px"> - <!-- Section links --> - <div class="home-sections"> - <ul> - <li><a href="{@docRoot}about/index.html">About Android</a></li> - <li><a href="{@docRoot}sdk/index.html">Get the SDK</a></li> - <li><a href="http://source.android.com">Open Source</a></li> - <li><a href="{@docRoot}support.html">Support</a></li> - <li class="last"><a href="{@docRoot}legal.html">Legal</a></li> - </ul> - </div> - <!-- /Section links --> -</div> + <div class="resource-widget resource-flow-layout wrap col-16 no-section" + data-query="collection:index/primary" + data-resourceStyle="card" + data-sortOrder="-timestamp" + data-maxResults="3" + data-cardSizes="6x2,6x2,6x2"> + </div> <!-- end .resource-widget --> + </div> <!-- end .wrap --> + </div> <!-- end .vcenter --> + </div> <!-- end .fullscreen-carousel-content --> +</div> <!-- end .fullscreen-carousel --> + +<div class="actions-bar" style="margin-top:30px"> + <div class="wrap"> + <div class="actions"> + <div><a href="{@docRoot}sdk/index.html">Get the SDK</a></div> + <div><a href="{@docRoot}samples/index.html">Browse Samples</a></div> + <div><a href="//www.youtube.com/user/androiddevelopers">Watch Videos</a></div> + <div><a href="{@docRoot}distribute/googleplay/developer-console.html">Manage Your Apps</a></div> + </div><!-- end .actions --> + </div><!-- end .wrap --> +</div><!-- end .actions-bar --> + + + +<div class="landing-rest-of-page"> + <div class="landing-section"> + <div class="wrap"> + <div class="landing-section-header"> + <div class="landing-h1">Develop for Multiple Form Factors</div> + <div class="landing-subhead" style="margin-top: 20px;"> + Android runs on hundreds of millions of handheld devices around the world, <br /> + and it now supports these exciting, new form-factors. + </div> + </div> + <div class="landing-body" style="margin-top: 80px;"> + <div class="landing-breakout cols"> + <div class="col-3-wide"> + <img src="{@docRoot}images/home/wear.png"> + <p class="landing-small" style="margin-top:30px"> + Provide information on-the-go for your users, whenever they need it. + </p> + <p class="landing-small"> + <a href="{@docRoot}wear/index.html">Learn about Android Wear</a> + </p> + </div> + <div class="col-3-wide"> + <img src="{@docRoot}images/home/tv.png"> + <p class="landing-small" style="margin-top:30px"> + Build your apps for the big screen and bring your content to life. + </p> + <p class="landing-small"> + <a href="{@docRoot}tv/index.html">Learn about Android TV</a> + + </p> + </div> + <div class="col-3-wide"> + <img src="{@docRoot}images/home/auto.png"> + <p class="landing-small" style="margin-top:30px"> + Extend your music apps to automobile + entertainment systems. + </p> + <p class="landing-small"> + <a href="{@docRoot}auto/index.html">Learn about Android Auto</a> + </p> + </div> + </div> + </div> + </div> <!-- end .wrap --> + </div> <!-- end .landing-section -->
\ No newline at end of file diff --git a/docs/html/jd_collections.js b/docs/html/jd_collections.js index 8a4ac47..a92236e 100644 --- a/docs/html/jd_collections.js +++ b/docs/html/jd_collections.js @@ -1,4 +1,20 @@ var RESOURCE_COLLECTIONS = { + "index/primary": { + "title": "", + "resources": [ + "distribute/essentials/quality/tablets.html", + "distribute/engage/game-services.html", + "distribute/googleplay/edu/about.html" + ] + }, + "index/devices": { + "title": "", + "resources": [ + "wear/index.html", + "tv/index.html", + "auto/index.html" + ] + }, "launch/static": { "title": "", "resources": [ @@ -29,14 +45,14 @@ var RESOURCE_COLLECTIONS = { "resources": [ "distribute/googleplay/edu/about.html", "distribute/googleplay/edu/start.html", - "distribute/googleplay/edu/faq.html" + "https://developers.google.com/edu/faq" ] }, "distribute/essentials": { "resources": [ "distribute/essentials/quality/core.html", "distribute/essentials/quality/tablets.html", - "distribute/essentials/gpfe-guidelines.html", + "https://developers.google.com/edu/guidelines", "distribute/essentials/optimizing-your-app.html", "distribute/essentials/best-practices/apps.html", "distribute/essentials/best-practices/games.html" @@ -49,7 +65,8 @@ var RESOURCE_COLLECTIONS = { "distribute/users/your-listing.html", "distribute/users/build-buzz.html", "distribute/users/build-community.html", - "distribute/users/expand-to-new-markets.html" + "distribute/users/expand-to-new-markets.html", + "distribute/users/promote-with-ads.html" ] }, "distribute/engagelanding": { @@ -60,6 +77,7 @@ var RESOURCE_COLLECTIONS = { "distribute/engage/easy-signin.html", "distribute/engage/deep-linking.html", "distribute/engage/game-services.html", + "distribute/engage/analytics.html", "distribute/engage/app-updates.html", "distribute/engage/community.html", "distribute/engage/video.html" @@ -147,16 +165,18 @@ var RESOURCE_COLLECTIONS = { "title": "About Google Play for Education / Developers", "resources": [ "distribute/googleplay/edu/start.html", - "distribute/essentials/gpfe-guidelines.html", - "distribute/googleplay/edu/faq.html", - "distribute/essentials/quality/tablets.html" + "https://developers.google.com/edu/guidelines", + "https://developers.google.com/edu/faq", + "distribute/essentials/quality/tablets.html", + "https://developers.google.com/edu/", + "https://www.google.com/edu/tablets/#tablets-family" ] }, "distribute/googleplay/gpfe/dev": { "title": "About Google Play for Education / Developers", "resources": [ "distribute/googleplay/edu/about.html", - "distribute/essentials/gpfe-guidelines.html", + "https://developers.google.com/edu/guidelines", "distribute/essentials/quality/tablets.html", "distribute/googleplay/developer-console.html", "http://play.google.com/about/developer-distribution-agreement-addendum.html", @@ -188,7 +208,7 @@ var RESOURCE_COLLECTIONS = { "resources": [ "distribute/googleplay/developer-console.html", "distribute/googleplay/edu/start.html", - "distribute/googleplay/edu/faq.html" + "https://developers.google.com/edu/faq" ] }, "distribute/essentials/eduessentials/educators": { @@ -214,6 +234,13 @@ var RESOURCE_COLLECTIONS = { "distribute/stories/localization.html" ] }, + "distribute/users/promotewithads": { + "title": "", + "resources": [ + "http://www.google.com/ads/admob/#subid=us-en-et-dac", + "distribute/essentials/optimizing-your-app.html" + ] + }, "distribute/users/buildbuzz": { "title": "", "resources": [ @@ -394,6 +421,14 @@ var RESOURCE_COLLECTIONS = { "http://play.google.com/about/developer-content-policy.html" ] }, + "distribute/engage/analytics": { + "title": "", + "resources": [ + "http://www.google.com/analytics/mobile/", + "http://android-developers.blogspot.com/2013/10/improved-app-insight-by-linking-google.html", + "https://developers.google.com/analytics/devguides/collection/android/" + ] + }, "distribute/engage/widgets": { "title": "", "resources": [ @@ -553,7 +588,7 @@ var RESOURCE_COLLECTIONS = { "resources": [ "distribute/essentials/quality/core.html", "distribute/essentials/quality/tablets.html", - "distribute/essentials/gpfe-guidelines.html" + "https://developers.google.com/edu/guidelines" ] }, "distribute/toolsreference/launchchecklist/rating": { diff --git a/docs/html/jd_extras.js b/docs/html/jd_extras.js index f26b747..03bbea1 100644 --- a/docs/html/jd_extras.js +++ b/docs/html/jd_extras.js @@ -15,6 +15,17 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ { + "title":"Android L Developer Preview", + "titleFriendly":"", + "summary":"<p style='font-size:18px;'>Get an early look at the next release and get your apps ready when the platform officially launches.</p>", + "url":"preview/index.html", + "group":"", + "keywords": [], + "tags": [], + "image":"preview/images/l-dev-prev.png", + "type":"" + }, + { "title":"Developer Registration", "titleFriendly":"", "summary":"Additional information about the registration process.", @@ -208,7 +219,7 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "keywords": [], "type": "support", "titleFriendly": "" - }, + }, { "lang": "en", "group": "", @@ -571,7 +582,7 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "image":"http://chart.googleapis.com/chart?chl=GL%201.1%20only%7CGL%202.0%7CGL%203.0&chf=bg%2Cs%2C00000000&chd=t%3A0.1%2C93.5%2C6.4&chco=c4df9b%2C6fad0c&chs=400x250&cht=p", "lang":"en", "type":"about" - }, + }, { "lang": "en", "group": "", @@ -700,7 +711,7 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "timestamp": 1383243492000, "image": "http://i1.ytimg.com/vi/vzvpcEffvaE/maxresdefault.jpg", "title": "Introducing Google Play for Education", - "summary": "Google Play for Education is a destination where schools can find great, teacher-approved, educational apps and videos on Play Store. Teachers can filter content by subject matter, grade and other criteria. Bulk purchase and instant distribution let educators bring your apps directly to classrooms and schools.", + "summary": "Google Play for Education is a destination where schools can find great, teacher-approved, educational content—from videos and books, to educational apps—all in one place. Teachers can filter content by subject matter, grade and other criteria. Bulk purchase and instant distribution let educators bring your apps directly to classrooms and schools.", "keywords": [], "type": "youtube", "titleFriendly": "" @@ -726,6 +737,21 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "tags": [ "#engagement", ], + "url": "http://www.google.com/analytics/mobile/", + "timestamp": 1383243492000, + "image": "http://www.google.com//analytics/images/heros/mobile-index.jpg", + "title": "Google Mobile App Analytics", + "summary": "Mobile App Analytics measures what matters most at all key stages: from first discovery and download to in-app purchases. ", + "keywords": ["analytics,user behavior"], + "type": "guide", + "titleFriendly": "" + }, + { + "lang": "en", + "group": "", + "tags": [ + "#engagement", + ], "url": "https://developers.google.com/app-indexing/", "timestamp": 1383243492000, "image": "https://developers.google.com/app-indexing/images/allthecooks_srp.png", @@ -1101,4 +1127,69 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "type": "Google+", "titleFriendly": "" }, -]);
\ No newline at end of file + { + "lang": "en", + "group": "", + "tags": ["analytics"], + "url": "https://developers.google.com/analytics/devguides/collection/android/", + "timestamp": null, + "image": "https://developers.google.com/analytics/images/home/gear-logo.png", + "title": "Google Mobile App Analytics SDK", + "summary": "The Google Analytics for Mobile Apps SDKs make it easy for you to implement Google Analytics in your mobile application.", + "keywords": ["analytics, user behavior"], + "type": "sdk", + "titleFriendly": "" + }, + { + "lang": "en", + "group": "", + "tags": [], + "url": "https://developers.google.com/edu/guidelines", + "timestamp": null, + "image": "http://developer.android.com/distribute/images/edu-guidelines.jpg", + "title": "Education Guidelines", + "summary": "These guidelines and requirements help you develop great apps for students, which offer compelling content and an intuitive user experience on Android tablets.", + "keywords": [], + "type": "", + "titleFriendly": "" + }, + { + "lang": "en", + "group": "", + "tags": [], + "url": "https://developers.google.com/edu/faq", + "timestamp": null, + "image": "http://developer.android.com/distribute/images/gpfe-faq.jpg", + "title": "Education FAQ", + "summary": "Answers to common questions you might have about Google Play for Education.", + "keywords": [], + "type": "", + "titleFriendly": "" + }, + { + "lang": "en", + "group": "", + "tags": [], + "url": "https://developers.google.com/edu/", + "timestamp": null, + "image": "https://developers.google.com/edu/images/home-android.png", + "title": "Chrome Apps in Google Play for Education", + "summary": "Find out more about Chrome apps in Google Play for Education.", + "keywords": [], + "type": "", + "titleFriendly": "" + }, + { + "lang": "en", + "group": "", + "tags": [], + "url": "https://www.google.com/edu/tablets/#tablets-family", + "timestamp": null, + "image": "https://www.google.com/edu/images/tablets/big-tablet.png", + "title": "Google Play for Education Tablets", + "summary": "Google Play for Education leverages a diverse set up tablets approved for the classroom which may help inform you how to build educational apps.", + "keywords": [], + "type": "", + "titleFriendly": "" + } +]);
\ No newline at end of file diff --git a/docs/html/jd_tag_helpers.js b/docs/html/jd_tag_helpers.js index ca01386..7538e4d 100644 --- a/docs/html/jd_tag_helpers.js +++ b/docs/html/jd_tag_helpers.js @@ -7,6 +7,7 @@ function mergeArrays() { } var ALL_RESOURCES = mergeArrays( + ABOUT_RESOURCES, DESIGN_RESOURCES, DISTRIBUTE_RESOURCES, GOOGLE_RESOURCES, @@ -63,6 +64,7 @@ function buildResourceLookupMap(resourceDict) { // Type lookups var ALL_RESOURCES_BY_TYPE = { + 'about': ABOUT_RESOURCES, 'design': DESIGN_RESOURCES, 'distribute': DISTRIBUTE_RESOURCES, 'google': GOOGLE_RESOURCES, @@ -78,6 +80,7 @@ var IS_RESOURCE_OF_TYPE = buildResourceLookupMap(ALL_RESOURCES_BY_TYPE); // Tag lookups var ALL_RESOURCES_BY_TAG = mergeMaps( + {map:ABOUT_BY_TAG,arr:ABOUT_RESOURCES}, {map:DESIGN_BY_TAG,arr:DESIGN_RESOURCES}, {map:DISTRIBUTE_BY_TAG,arr:DISTRIBUTE_RESOURCES}, {map:GOOGLE_BY_TAG,arr:GOOGLE_RESOURCES}, diff --git a/docs/html/preview/api-overview.jd b/docs/html/preview/api-overview.jd new file mode 100644 index 0000000..f992bf9 --- /dev/null +++ b/docs/html/preview/api-overview.jd @@ -0,0 +1,907 @@ +page.title=API Overview +excludeFromSuggestions=true +sdk.platform.apiLevel=20 +@jd:body + + +<div id="qv-wrapper"> +<div id="qv"> + +<h2>In this document + <a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle"> + <span class="more">show more</span> + <span class="less" style="display:none">show less</span></a></h2> + +<ol id="toc44" class="hide-nested"> + <li><a href="#Behaviors">Important Behavior Changes</a> + <ol> + <li><a href="#ART">New Android Runtime (ART)</a></li> + <li><a href="#BehaviorNotifications">If your app implements notifications...</a></li> + <li><a href="#BehaviorMediaControl">If your app uses RemoteControlClient...</a></li> +<li><a href="#BehaviorGetRecentTasks">If your app uses ActivityManager.getRecentTasks()...</a></li> + </ol> + </li> + <li><a href="#UI">User Interface</a> + <ol> + <li><a href="#MaterialDesign">Material design support</a></li> + <li><a href="#LockscreenNotifications">Lockscreen notifications</a></li> + <li><a href="#NotificationsMetadata">Notifications metadata</a></li> + <li><a href="#Recents">Concurrent documents and activities in the Recents screen</a></li> + <li><a href="#WebView">WebView updates</a></li> + </ol> + </li> + <li><a href="#Graphics">Graphics</a> + <ol> + <li><a href="#OpenGLES-3-1">Support for OpenGL ES 3.1</a></li> + <li><a href="#AndroidExtensionPack">Android Extension Pack</a></li> + </ol> + </li> + <li><a href="#Multimedia">Multimedia</a> + <ol> + <li><a href="#Camera-v2">Camera API for advanced camera capabilities</a></li> + <li><a href="#AudioPlayback">Audio playback</a></li> + <li><a href="#MediaPlaybackControl">Media playback control</a></li> + </ol> + </li> + <li><a href="#Storage">Storage</a> + <ol> + <li><a href="#DirectorySelection">Directory selection</a></li> + </ol> + </li> + <li><a href="#Wireless">Wireless and Connectivity</a> + <ol> + <li><a href="#Multinetwork">Multiple network connections</a></li> + <li><a href="#BluetoothBroadcasting">Bluetooth broadcasting</a></li> + <li><a href="#NFCEnhancements">NFC enhancements</a></li> + </ol> + </li> + <li><a href="#Power">Power Efficiency</a> + <ol> + <li><a href="#JobScheduler">Scheduling Jobs</a></li> + <li><a href="#PowerMeasurementTools">Developer tools for power measurement</a> + </ol> + </li> + <li><a href="#Enterprise">Enterprise</a> + <ol> + <li><a href="#ManagedProvisioning">Managed provisioning</a></li> + <li><a href="#TaskLocking">Task locking</a></li> + </ol> + </li> + <li><a href="#Printing">Printing Framework</a> + <ol> + <li><a href="#PDFRender">Render PDF as bitmap</a></li> + </ol> + </li> + <li><a href="#TestingA11y">Testing & Accessibility</a> + <ol> + <li><a href="#TestingA11yImprovements">Testing and accessibility improvements</a></li> + </ol> + </li> + <li><a href="#IME">IME</a> + <ol> + <li><a href="#Switching">Easier switching between input languages</a></li> + </ol> + </li> + <li><a href="#Manifest">Manifest Declarations</a> + <ol> + <li><a href="#ManifestFeatures">Declarable required features</a></li> + </ol> + </li> +</ol> + +</div> +</div> + +<p>The L Developer Preview gives you an advance look at the upcoming release +for the Android platform, which offers new features for users and app +developers. This document provides an introduction to the most notable APIs.</p> + +<p>The L Developer Preview is intended for <strong>developer early +adopters</strong> and <strong>testers</strong>. If you are interested in +influencing the direction of the Android framework, +<a href="{@docRoot}preview/setup-sdk.html">give the L Developer Preview a +try</a> and send us your feedback!</p> + +<p class="caution"><strong>Caution:</strong> Do not not publish apps +that use the L Developer Preview to the Google Play store.</p> + +<p class="note"><strong>Note:</strong> This document often refers to classes and +methods that do not yet have reference material available on <a +href="{@docRoot}">developer.android.com</a>. These API elements are +formatted in {@code code style} in this document (without hyperlinks). For the +preliminary API documentation for these elements, download the <a +href="{@docRoot}preview/l-developer-preview-reference.zip">preview +reference</a>.</p> + +<h2 id="Behaviors">Important Behavior Changes</h2> + +<p>If you have previously published an app for Android, be aware that your app + might be affected by changes in the upcoming release.</p> + +<h3 id="ART">New Android Runtime (ART)</h3> + +<p>The 4.4 release introduced a new, experimental Android runtime, ART. Under +4.4, ART was optional, and the default runtime remained Dalvik. With the L +Developer Preview, ART is now the default runtime.</p> + +<p>For an overview of ART's new features, see +<a href="https://source.android.com/devices/tech/dalvik/art.html">Introducing +ART</a>. Some of the major new features are:</p> + +<ul> + <li>Ahead-of-Time (AOT) compilation</li> + <li>Improved garbage collection (GC)</li> + <li>Improved debugging support</li> +</ul> + +<p>Most Android apps should just work without change under ART. However, some +techniques that work on Dalvik do not work on ART. For information about the +most important issues, see +<a href="{@docRoot}guide/practices/verifying-apps-art.html">Verifying App +Behavior on the Android Runtime (ART)</a>. Pay particular attention if:</p> + +<ul> + <li>Your app uses Java Native Interface (JNI) to run C/C++ code.</li> + <li>You use development tools that generate non-standard code (such as some + obfuscators).</li> + <li>You use techniques that are incompatible with compacting garbage + collection. (ART does not currently implement compacting GC, but + compacting GC is under development in the Android Open-Source + Project.)</li> +</ul> + +<h3 id="BehaviorNotifications">If your app implements notifications...</h3> + +<p>Notifications are drawn with dark text atop white (or very light) +backgrounds to match the new material design widgets. Make sure that all your +notifications look right with the new color scheme:</p> + +<div class="figure" style="width:320px"> + <img src="images/hun-example.png" + srcset="images/hun-example@2x.png 2x" + alt="" width="320" height="541" id="figure1" /> + <p class="img-caption"> + <strong>Figure 1.</strong> Fullscreen activity showing a heads-up notification + </p> +</div> + +<ul> + + <li>Update or remove assets that involve color.</li> + + <li>The system automatically inverts action icons in notifications. Use + {@code android.app.Notification. Builder.setColor()} to set an accent color + in a circle behind your {@link android.app.Notification#icon} image.</li> + + <li>The system ignores all non-alpha channels in action icons and the main + notification icon. You should assume that these icons are alpha-only.</li> + +</ul> + +<p>If you are currently adding sounds and vibrations to your notifications by +using the {@link android.media.Ringtone}, {@link android.media.MediaPlayer}, +or {@link android.os.Vibrator} classes, remove this code so that +the system can present notifications correctly in Do +not Disturb mode. Instead, use the {@link android.app.Notification.Builder} +methods instead to add sounds and vibration.</p> + +<p>Notifications now appear in a small floating window +(also called a <em>heads-up notification</em>) when the device is active +(that is, the device is unlocked and its screen is on). These notifications +appear similar to the compact form of your notification, except that the +heads-up notification also shows action buttons. Users can act on, or dismiss, +a heads-up notification without leaving the current app.</p> + +<p>Examples of conditions that may trigger heads-up notifications include:</p> + +<ul> + <li>The user's activity is in fullscreen mode (the app uses +{@link android.app.Notification#fullScreenIntent}), or</li> + <li>The notification has high priority and uses ringtones or + vibrations</li> +</ul> + +<p>If your app implements notifications under those scenarios, make sure that +heads-up notifications are presented correctly.</p> + +<h3 id="BehaviorMediaControl">If your app uses RemoteControlClient...</h3> + +<p>Lockscreens in the L Developer Preview do not show transport controls for +your {@link android.media.RemoteControlClient}. Instead, your app can provide +media playback control from the lockscreen through a notification. This +gives your app more control over the presentation of media buttons, while +providing a consistent experience for users across the lockscreen and +unlocked device.</p> + +<p>The L Developer Preview introduces a new +{@code android.app.Notification.MediaStyle} template which is recommended for +this purpose. {@code MediaStyle} converts notification actions that you added +with +{@link android.app.Notification.Builder#addAction(int, java.lang.CharSequence, + android.app.PendingIntent) +Notification.Builder.addAction()} into compact buttons embedded in your app's +media playback notifications.</p> + +<p>If you are using the new +{@code android.media.session.MediaSession} class +(see <a href="#MediaPlaybackControl">Media Playback Control</a> below), attach +your session token with {@code Notification.MediaStyle.setMediaToken()} to +inform the system that this notification controls an ongoing media session.</p> + +<p>Call {@code +Notification.Builder.setVisibility(Notification.VISIBILITY_PUBLIC)} to mark a +notification as safe to show atop any lockscreen (secure or otherwise). For more +information, see <a href="#LockscreenNotifications">Lockscreen Notifications</a>.</p> + +<h3 id="BehaviorGetRecentTasks">If your app uses ActivityManager.getRecentTasks()...</h3> + +<p>With the introduction of the new <em>concurrent documents and activities +tasks</em> feature in the upcoming release (see <a href="#Recents">Concurrent +documents and activities in Recents screen</a> below), +the {@link android.app.ActivityManager#getRecentTasks +ActivityManager.getRecentTasks()} method is now deprecated to improve user +privacy. For backward compatibility, this method still returns a small subset of +its data, including the calling application’s own tasks and possibly some other +non-sensitive tasks (such as Home). If your app is using this method to retrieve +its own tasks, use {@code android.app.ActivityManager.getAppTasks()} instead to +retrieve that information.</p> + +<h2 id="UI">User Interface</h2> + +<h3 id="MaterialDesign">Material design support</h3> + +<p>The upcoming release adds support for Android's new <em>material</em> design +style. You can create apps with material design that are visually dynamic and +have UI element transitions that feel natural to users. This support includes:</p> + +<ul> + + <li>The material theme</li> + <li>View shadows</li> + <li>The {@code RecyclerView} widget</li> + <li>Drawable animation and styling effects</li> + <li>Material design animation and activity transition effects</li> + <li>Animators for view properties based on the state of a view</li> + <li>Customizable UI widgets and app bars with color palettes that you control</li> +</ul> + +<p>To learn more about adding material design functionality to your app, see +<a href="{@docRoot}preview/material/index.html">Material Design</a>.</p> + +<h3 id="LockscreenNotifications">Lockscreen notifications</h3> +<p>Lockscreens in the L Developer Preview have the ability to present +notifications. Users can choose via <em>Settings</em> whether to allow +sensitive notification content to be shown over a secure lockscreen.</p> + +<p>Your app can control the level of detail visible when its notifications are +displayed over the secure lockscreen. To control the visibility level, call +{@code android.app.Notification.Builder.setVisibility()} and specify one of these +values:</p> + +<ul> +<li>{@code VISIBILITY_PRIVATE}. Shows basic information, such as the +notification’s icon, but hides the notification’s full content.</li> +<li>{@code VISIBILITY_PUBLIC}. Shows the notification’s full content.</li> +<li>{@code VISIBILITY_SECRET}. Shows nothing, excluding even the +notification’s icon.</li> +</ul> + +<p>When {@code VISIBILITY_PRIVATE} is set, you can also provide a redacted +version of the notification content that hides personal details. For example, +an SMS app might display a notification that shows "You have 3 new text messages." +but hides the message content and senders. To provide this alternative +notification, first create the replacement notification using +{@link android.app.Notification.Builder}. When you create the private +notification object, attach the replacement notification to it through the +{@code Notification.Builder.setPublicVersion()} method.</p> + +<h3 id="NotificationsMetadata">Notifications metadata</h3> +<p>The L Developer Preview uses metadata associated with your app notifications +to sort the notifications more intelligently. To set the metadata, call the +following methods in {@code android.app.Notification.Builder} when you +construct the notification:</p> + +<ul> +<li>{@code setCategory()}. Depending on the message category, this tells +the system how to handle your app notifications when the device is +in <em>Do not Disturb</em> mode (for example, if your notification represents an +incoming call, instant message, or alarm). +<li>{@code setPriority()}. Notifications with the priority field set to +{@code PRIORITY_MAX} or {@code PRIORITY_HIGH} will appear in a small floating +window if the notification also has sound or vibration.</li> +<li>{@code addPerson()}. Allows you to add a list of people to a notification. +Your app can use this to signal to the system that it should group together +notifications from the specified people, or rank notifications from these +people as being more important.</li> +</ul> + +<h3 id="Recents">Concurrent documents and activities in the Recents screen</h3> + +<p>In previous releases, the +<a href="{@docRoot}design/get-started/ui-overview.html">Recents screen</a> +could only display a single task for each app that the user interacted with +most recently. Now your app can open more tasks as +needed for additional concurrent activities for documents. +This feature facilitates multitasking by letting users quickly switch between +individual activities and documents from the Recents screen, with a consistent +switching experience across all apps. +Examples of such concurrent tasks might include open tabs in a web +browser app, documents in a productivity app, concurrent matches in +a game, or chats in a messaging app. Your app can manage its tasks +through the {@code android.app.ActivityManager.AppTask} class.</p> + +<p>To insert a logical break so that the system treats your activity as a new +task, use {@code android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT} when +launching the activity with {@link android.app.Activity#startActivity(android.content.Intent) +startActivity()}. You can also get this behavior by declaring the +<a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a> +attribute {@code documentLaunchMode="intoExisting"} or {@code ="always"} in your +manifest.</p> + +<p>You can also mark that a task should be removed from the Recents screen +when all its activities are closed. To do this, use {@code +android.content.Intent.FLAG_ACTIVITY_AUTO_REMOVE_FROM_RECENTS} when starting the +root activity for +the task. You can also set this behavior for an activity by declaring the +<a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a> +attribute {@code autoRemoveFromRecents=“trueâ€} in your manifest.</p> + +<p>To avoid cluttering the Recents screen, you can set the maximum number of +tasks from your app that can appear in that screen. To do this, set the +<a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a> +attribute {@code android:maxRecent}. The current maximum that can be specified +is 100 tasks per user.</a></p> + +<h3 id="WebView">WebView updates</h3> +<p>The L Developer Preview updates the {@link android.webkit.WebView} +implementation to Chromium M36, bringing security and stability enhancements, +as well as bug fixes. The default user-agent string for a +{@link android.webkit.WebView} running on the L Developer Preview has +been updated to incorporate 36.0.0.0 as the version number.</p> + +<p>Additionally, this release brings support for the +<a href="http://webaudio.github.io/web-audio-api/" class="external-link">WebAudio</a>, +<a href="https://www.khronos.org/webgl/" class="external-link">WebGL</a>, and +<a href="http://www.webrtc.org/" class="external-link">WebRTC</a> open standards. To learn more about +the new features included in this release, see <a href="https://developer.chrome.com/multidevice/webview/overview" class="external-link">WebView for Android</a>.</p> + +<h2 id="Graphics">Graphics</h2> + +<h3 id="OpenGLES-3-1">Support for OpenGL ES 3.1</h3> +<p>The L Developer Preview adds Java interfaces and native support for OpenGL +ES 3.1. Key new functionality provided in OpenGL ES 3.1 includes:</p> + +<ul> +<li>Compute shaders +<li>Separate shader objects +<li>Indirect draw commands +<li>Multisample and stencil textures +<li>Shading language improvements +<li>Extensions for advanced blend modes and debugging +<li>Backward compatibility with OpenGL ES 2.0 and 3.0 +</ul> + +<p>The Java interface for OpenGL ES 3.1 on Android is provided with {@code GLES31}. When +using OpenGL ES 3.1, be sure that you declare it in your manifest file with the +<a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> +tag and the {@code android:glEsVversion} attribute. For example:</p> + +<pre> +<manifest> + <uses-feature android:glEsVersion="0x00030001" /> + ... +</manifest> +</pre> + +<p>For more information about using OpenGL ES, including how to check the +device’s supported OpenGL ES version at runtime, see the +<a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL ES API guide</a>.</p> + +<h3 id="AndroidExtensionPack">Android Extension Pack</h3> + +<p>In addition to OpenGL ES 3.1, this release provides an extension pack with Java interfaces and +native support for advanced graphics functionality. These extensions are treated as a single +package by Android. (If the {@code ANDROID_extension_pack_es31} extension is present, your app can +assume all extensions in the package are present and enable the shading language features with +a single {@code #extension} statement.</p> +<p>The extension pack supports:</p> +<ul> +<li>Guaranteed fragment shader support for shader storage buffers, images, and + atomics (fragment shader support is optional in OpenGL ES 3.1.)</li> +<li>Tessellation and geometry shaders</li> +<li>ASTC (LDR) texture compression format</li> +<li>Per-sample interpolation and shading</li> +<li>Different blend modes for each color attachment in a frame buffer</li> +</ul> + +<p>The Java interface for the extension pack is provided with {@code GLES31Ext}. +In your app manifest, you can declare that support for the extension pack is +required, with the +<a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> +tag, but the precise syntax is not finalized in the L Developer Preview.</p> + +<h2 id="Multimedia">Multimedia</h2> + +<h3 id="Camera-v2">Camera API for advanced camera capabilities</h3> + +<p>The L Developer Preview introduces the new {@code android.hardware.camera2} +API to facilitate fine-grain photo capture and image processing. You can now +programmatically access the camera devices available to the system with {@code +CameraManager.getCameraIdList()} and connect to a specific device with {@code +CameraManager.openCamera()}. To start capturing images, create a {@code +CameraCaptureSession} and specify the {@link android.view.Surface} objects for +the captured images. The {@code CameraCaptureSession} can be configured to take +single shots or multiple images in a burst.</p> + +<p>To be notified when new images are captured, implement the +{@code CameraCaptureSession.CaptureListener()} interface and set it in your +capture request. Now when the system completes the image capture request, your +{@code CameraCaptureSession.CaptureListener()} receives a call to +{@code onCaptureCompleted()}, providing you with the image capture metadata in a +{@code CaptureResult}.</p> + +<p>To see an example of how to use the updated Camera API, refer to the {@code Camera2Basic} +and {@code Camera2Video} implementation samples in this release.</p> + +<h3 id="AudioPlayback">Audio playback</h3> +<p>This release includes the following changes to + {@link android.media.AudioTrack}:</p> +<ul> + <li>Your app can now supply audio data in floating-point format +({@code android.media.AudioFormat.ENCODING_PCM_FLOAT}). This permits greater +dynamic range, more consistent precision, and greater headroom. Floating-point +arithmetic is especially useful during intermediate calculations. Playback +end-points use integer format for audio data, and with lower bit-depth. (In the +L Developer Preview, portions of the internal pipeline are not yet +floating-point.) + <li>Your app can now supply audio data as a {@link java.nio.ByteBuffer}, in +the same format as provided by {@link android.media.MediaCodec}. + <li>The {@code WRITE_NON_BLOCKING} option can simplify buffering and + multithreading for some apps. +</ul> + +<h3 id="MediaPlaybackControl">Media playback control</h3> +<p>You can now build your own media controller app with the new +{@code android.media.session.MediaController} class, which provides +simplified transport controls APIs that replace those in +{@link android.media.RemoteControlClient}. The {@code MediaController} class +allows thread-safe control of playback from a non-UI process, making it easier +to control your media playback service from your app’s user interface. + +<p>You can also create multiple controllers to send playback commands, +media keys, and other events to the same ongoing +{@code android.media.session.MediaSession}. When you add a controller, you must +call {@code MediaSession.getSessionToken()} to request an access +token in order for your app to interact with the session.</p> + +<p>You can now send transport commands such as "play", "stop", "skip", and +"set rating" by using {@code MediaController.TransportControls}. To handle +in-bound media transport commands from controllers attached to the session, +override the callback methods in +{@code MediaSession.TransportControlsCallback}.</p> + +<p>You can also create rich notifications that allow playback control tied to a +media session with the new {@code android.app.Notification.MediaStyle} class. By +using the new notification and media APIs, you will ensure that the System UI +knows about your playback and can extract and show album art.</p> + +<h2 id="Storage">Storage</h2> + +<h3 id="DirectorySelection">Directory selection</h3> + +<p>The L Developer Preview extends the <a href="{@docRoot}guide/topics/providers/document-provider.html">Storage Access Framework</a> to let users select an entire directory subtree, +giving apps read/write access to all contained documents without requiring user +confirmation for each item.</p> + +<p>To select a directory subtree, build and send an +{@code android.intent.action.OPEN_DOCUMENT_TREE} {@link android.content.Intent}. +The system displays all +{@link android.provider.DocumentsProvider} instances that support subtree selection, +letting the user browse and select a directory. The returned URI represents access to the selected +subtree. You can then use {@code DocumentsContract.buildChildDocumentsUriUsingTree()} +and {@code DocumentsContract.buildDocumentUriUsingTree()} along with +{@code ContentResolver.query()} to explore the subtree.</p> + +<p>The new {@code DocumentsContract.createDocument()} method lets you create +new documents or directories anywhere under the subtree. To manage +existing documents, use {@code DocumentsContract.renameDocument()} and +{@code DocumentsContract.deleteDocument()}. Check {@code DocumentsContract.Document.COLUMN_FLAGS} +to verify provider support for these calls before issuing them.</p> + +<p>If you're implementing a {@link android.provider.DocumentsProvider} and want +to support subtree selection, implement {@code DocumentsProvider.isChildDocument()} +and include {@code Documents.Contract.FLAG_SUPPORTS_IS_CHILD} in your +{@code Root.COLUMN_FLAGS}.</p> + +<p>The L Developer Preview also introduces new package-specific directories on +shared storage where your app can place media files for inclusion in +{@link android.provider.MediaStore}. The new +{@code android.content.Context.getExternalMediaDirs()} returns paths to these +directories on all shared storage devices. Similarly to +{@link android.content.Context#getExternalFilesDir(java.lang.String) Context.getExternalFilesDir()}, +no additional permissions are needed by your app to access the returned paths. The +platform periodically scans for new media in these directories, but you can also +use {@link android.media.MediaScannerConnection} to explicitly scan for new +content.</p> + +<h2 id="Wireless">Wireless & Connectivity</h2> + +<h3 id="Multinetwork">Multiple network connections</h3> +<p>The L Developer Preview provides new multi-networking APIs. These let your app +dynamically scan for available networks with specific capabilities, and +establish a connection to them. This is useful when your app requires a +specialized network, such as an SUPL, MMS, or carrier-billing network, or if +you want to send data using a particular type of transport protocol.</p> + +<p>To select and connect to a network dynamically from your app follow these +steps:</p> + +<ol> + <li>Create a {@link android.net.ConnectivityManager}.</li> + <li>Create a + {@code android.net.NetworkRequest} to specify the network features and transport + type your app is interested in.</li> + <li>To scan for suitable networks, call + {@code ConnectivityManager.requestNetwork()} or + {@code ConnectivityManager.registerNetworkCallback()}, and pass in the + {@code NetworkRequest} object and an implementation of + {@code ConnectivityManager.NetworkCallbackListener}.</li> + +</ol> + +<p>When the system detects a suitable network, it connects to the network and +invokes the {@code NetworkCallbackListener.onAvailable()} callback. You can use +the {@code android.net.Network} object from the callback to get additional +information about the network, or to direct traffic to use the selected +network.</p> + +<h3 id="BluetoothBroadcasting">Bluetooth broadcasting</h3> +<p>Android 4.3 introduced platform support for + <a href="{@docRoot}guide/topics/connectivity/bluetooth-le.html">Bluetooth Low Energy</a> +(BLE) in the central role. In the L Developer Preview, an Android device can now +act as a Bluetooth LE <em>peripheral device</em>. Apps can use this capability +to make their presence known to +nearby devices. For instance, you can build apps that allow a device to +function as a pedometer or health monitor and communicate its data with another +BLE device.</p> + +<p>The new {@code android.bluetooth.le} APIs enable your apps to broadcast +advertisements, scan for responses, and form connections with nearby BLE devices. +You must add the {@code android.permission.BLUETOOTH_ADMIN} permission in your +manifest in order for your app to use the new advertising and scanning features.</a> + +<p>To begin Bluetooth LE advertising so that other devices can discover +your app, call {@code android.bluetooth.le.BluetoothAdvertiser.startAdvisertising()} +and pass in an implementation of the +{@code android.bluetooth.le.AdvertiseCallback} class. The callback object +receives a report of the success or failure of the advertising operation.</p> + +<p> The L Developer Preview introduces the {@code +android.bluetooth.le.ScanFilter} class so that your app can scan for only the +specific types of devices it is interested in. To begin scanning for Bluetooth +LE devices, call {@code android.bluetooth.le.BluetoothLeScanner.startScan()} and +pass in a list of filters. In the method call, you must also provide an +implementation of {@code android.bluetooth.le.ScanCallback} to report if a +Bluetooth LE advertisement is found. </p> + +<h3 id="NFCEnhancements">NFC enhancements</h3> +<p>The L Developer Preview adds these enhancements to enable wider and more +flexible use of NFC:</p> + +<ul> +<li>Android Beam is now available in the share menu. +<li>Your app can invoke the Android Beam on the user’s device to share data by +calling {@code android.nfc.NfcAdapter.invokeBeam()}. This avoids the need for +the user to manually tap the device against another NFC-capable device to +complete the data transfer. +<li>You can use the new {@code android.nfc.NdefRecord.createTextRecord()} method +to create an NDEF record containing UTF-8 text data. +<li>If you are developing a payment app, you now have the ability to +register an NFC application ID (AID) dynamically by calling +{@code android.nfc.cardemulation.CardEmulation.registerAidsForService()}. +You can also use {@code android.nfc.cardemulation.CardEmulation.setPreferredService()} +to set the preferred card emulation service that should be used when a specific +activity is in the foreground. +</ul> + +<h2 id="Power">Power Efficiency</h2> + +<h3 id="JobScheduler">Scheduling jobs</h3> +<p>The L Developer Preview provides a new {@code android.app.job.JobScheduler} +API that lets you optimize battery life by defining jobs for the system to run +asynchronously at a later time or under specified conditions (such as when the +device is charging). This is useful in such situations as:</p> +<ul> + <li>The app has non-user-facing work that you can defer.</li> + <li>The app has work you'd prefer to do when the unit is plugged in.</li> + <li>The app has a task that requires network access (or requires a Wi-Fi + connection).</li> + <li>The app has a number of tasks that you want to run as a batch on a regular + schedule.</li> + +</ul> + +<p>A unit of work is encapsulated by a {@code android.app.job.JobInfo} object. +This object provides an exact description of the criteria to be used for +scheduling.</p> + +<p>Use the {@code android.app.job.JobInfo.Builder} to configure how the +scheduled task should run. You can schedule the task to run under specific +conditions, such as:</p> + +<ul> + <li>The device is charging</li> + <li>The device is connected to an unmetered network</li> + <li>The system deems the device to be idle</li> + <li>Completion with a minimum delay or within a specific deadline.</li> +</ul> + +<p>For example, you can add code like this to run your task on an +unmetered network:</p> + +<pre> +JobInfo uploadTask = new JobInfo.Builder(mJobId, mServiceComponent) + .setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED) + .build(); + +JobScheduler jobScheduler = + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE) +jobScheduler.schedule(uploadTask); +</pre> + +<p>To see an example of how to use the {@code JobScheduler} API, refer to the +{@code JobSchedulerSample} implementation sample in this release.</p> + +<h3 id="PowerMeasurementTools">Developer tools for power measurement</h3> +<p>The L Developer Preview provides several new developer tools and APIs to help +you better measure and understand your app's power usage.</p> + +<dl> +<dt><strong>batterystats</strong></dt> +<dd> +<p>The {@code dumpsys batterystats} command allows you to generate interesting +statistical data about battery usage on a device, organized by unique user ID +(UID). The statistics generated by the tool include:</p> + +<ul> +<li>History of battery related events +<li>Global statistics for the device +<li>Approximated power use per UID and system component +<li>Per-app mobile ms per packet +<li>System UID aggregated statistics +<li>App UID aggregated statistics +</ul> + +<p>Use the {@code --help} option to learn about the various options for +tailoring the output. For example, to print battery usage +statistics for a given app package since the device was last charged, run this +command: +<pre> +$ adb shell dumpsys batterystats --charged <package-name> +</pre> +</dd> + +<dt><strong>Battery Historian</strong></dt> +<dd> +<p>The Battery Historian tool ({@code historian.par}) analyzes Android +bug reports from the L Developer Preview and creates an HTML visualization of +power-related events. It can +also visualize power consumption data from a power monitor, and attempts to +map power usage to the wake locks seen. You can find the Battery Historian tool +in {@code <sdk>/tools}.</p> + +<img src="images/battery_historian.png" + srcset="images/battery_historian@2x.png 2x" + alt="" width="760" height="462" + id="figure2" /> +<p class="img-caption"> + <strong>Figure 2.</strong>HTML visualization generated by the Battery + Historian tool. +</p> + +<p>For best results, you should first enable full wake lock reporting, to allow +the Battery Historian tool to monitor uninterrupted over an extended period of +time:</p> +<pre> +$ adb shell dumpsys batterystats --enable full-wake-history +</pre> + +<p>You should also reset battery statistics at the beginning of a +measurement:</p> +<pre> +$ adb shell dumpsys batterystats --reset +</pre> + +<p>To generate an HTML visualization:</p> +<pre> +$ historian.par [-p powerfile] bugreport.txt > out.html +</pre> +</dd> + +</dl> + +<h2 id="Enterprise">Enterprise</h2> +<h3 id="ManagedProvisioning">Managed provisioning</h3> + +<div class="figure" style="width:360px"> + <img src="images/managed_apps_launcher.png" + srcset="images/managed_apps_launcher@2x.png 2x" + alt="" width="360" height="609" id="figure3" /> + <p class="img-caption"> + <strong>Figure 3.</strong> Launcher screen showing managed apps (marked with + a lock badge) + </p> +</div> + +<p>The L Developer Preview provides new functionality for running apps within +an enterprise environment. A +<a href="{@docRoot}guide/topics/admin/device-admin.html">device administrator</a> can +initiate a managed provisioning process to add a co-present but separate <em>managed profile</em> to a device, if the user has an existing personal account. +Apps that are associated with managed profiles will appear alongside +non-managed apps in the user’s Launcher, Recent apps screen, and notifications.</p> + +<p>To start the managed provisioning process, send {@code +ACTION_PROVISION_MANAGED_PROFILE} in an {@link android.content.Intent}. If the +call is successful, the system triggers the {@code +android.app.admin.DeviceAdminReceiver. onProfileProvisioningComplete()} callback. +You can then call {@code app.admin.DevicePolicyManager. setProfileEnabled()} to +enable this managed profile.</p> + +<p>If you are developing a Launcher app, you can use the new {@code +android.content.pm.LauncherApps} class to get a list of launchable activities +for the current user and any associated managed profiles. Your Launcher can make +the managed apps visually prominent by appending a “work†badge to the icon +drawable with {@code android.os.UserManager. getBadgeDrawableForUser()}.</p> + +<p>To see an example of how to use the new functionality, refer to the +{@code BasicManagedProfile} implementation sample in this release.</p> + +<h3 id="TaskLocking">Task locking</h3> +<p>The L Developer Preview introduces a new task locking API that +lets you temporarily restrict users from leaving your app or being interrupted +by notifications. This could be used, for example, if you are developing an +education app to support high stakes assessment requirements on Android. +Once your app activates this mode, users will not be able to see +notifications, access other apps, or return to the Home screen, until your +app exits the mode.</p> + +<p>To prevent unauthorized usage, only authorized apps can activate task locking. +Furthermore, task locking authorization must be granted by a +specially-configured <em>device owner</em> app, through the {@code android.app.admin.DevicePolicyManager.setLockTaskComponents()} method.</p> + +<p>To set up a device owner, follow these steps:</p> +<ol> +<li>Attach a device running an Android <a href="https://source.android.com/source/building-running.html" class="external-link">{@code userdebug}</a> build to your development machine.</li> +<li>Install your device owner app.</li> +<li>Create a {@code device_owner.xml} file and save it to the {@code /data/system} +directory on the device. +<pre> +$ adb root +$ adb shell stop +$ rm /tmp/device_owner.xml +$ echo "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" +>> /tmp/device_owner.xml +$ echo "&device-owner package=\"<your_device_owner_package>\" +name=\"*<your_organization_name>\" />" >> /tmp/device_owner.xml +$ adb push /tmp/device_owner.xml /data/system/device_owner.xml +$ adb reboot +</pre> +</li> +</ol> + +<p>Before using the task locking API in your app, verify that your activity is +authorized by calling {@code DevicePolicyManager.isLockTaskPermitted()}.</p> + +<p>To activate task locking, call +{@code android.app.Activity.startLockTask()} from your authorized activity.</p> + +<p>When task locking is active, the following behavior takes effect:</p> + +<ul> +<li>The status bar is blank, and user notifications and status information is +hidden.</li> +<li>The Home and Recent Apps buttons are hidden.</li> +<li>Other apps may not launch new activities.</li> +<li>The current app may start new activities, as long as doing so does not +create new tasks.</li> +<li>The user remains locked on your app until an authorized activity calls +{@code Activity.stopLockTask()}.</li> +</ul> + +<h2 id="Printing">Printing Framework</h2> + +<h3 id="PDFRender">Render PDF as bitmap</h3> +<p>You can now render PDF document pages into bitmap images for printing by +using the new {@code android.graphics.pdf.PdfRenderer} class. You must specify a +{@link android.os.ParcelFileDescriptor} that is seekable (that is, the content +can be randomly accessed) on which the system writes the the printable content. +Your app can obtain a page for rendering with {@code openPage()}, then call +{@code render()} to turn the opened {@code PdfRenderer.Page} into a bitmap. You +can also set additional parameters if you only want to convert a portion of the +document into a bitmap image (for example, to implement +<a href="http://en.wikipedia.org/wiki/Tiled_rendering" class="external-link">tiled rendering</a> in +order to zoom in on the document).</p> + +<h2 id="TestingA11y">Testing & Accessibility </h2> + +<h3 id="TestingA11yImprovements">Testing and accessibility improvements</h3> +<p>The L Developer Preview adds the following support for testing and +accessibility:</p> + +<ul> +<li>You can use the new {@code android.app.UiAutomation.getWindowAnimationFrameStats()} +and {@code android.app.UiAutomation.getWindowContentFrameStats()} methods to +capture frame statistics for window animations and content. This lets you +write instrumentation tests to evaluate if the app under test is rendering +frames at a sufficient refresh frequency to provide a smooth user experience. + +<li>You can execute shell commands from your instrumentation test with the new +{@code android.app.UiAutomation.executeShellCommand()}. The command execution +is similar to running {@code adb shell} from a host connected to the device. This +allows you to use shell based tools such as {@code dumpsys}, {@code am}, +{@code content}, and {@code pm}. + +<li>Accessibility services and test tools that use the accessibility APIs +(such as <a href="{@docRoot}tools/help/uiautomator/index.html">uiautomator</a>) +can now retrieve detailed information about the properties of windows on the +screen that sighted users can interact with. To retrieve a list of +{@code android.view.accessibility.AccessibilityWindowInfo} objects +representing the windows information, call the new +{@code android.accessibilityservice.AccessibilityService.getWindows()} method. +<li>You can use the new {@code android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction} to define standard or customized +actions to perform on an {@link android.view.accessibility.AccessibilityNodeInfo}. +The new {@code AccessibilityAction} class replaces the actions-related APIs +previously found in {@code AccessibilityNodeInfo}. +</ul> + +<h2 id="IME">IME</h2> + +<h3 id="Switching">Easier switching between input languages</h3> + +<p>Beginning in the L Developer Preview, users can more easily switch between +all <a href="{@docRoot}guide/topics/text/creating-input-method.html">input +method editors (IME)</a> supported by the platform. Performing the designated +switching action (usually touching a Globe icon on the soft keyboard) will cycle +among all such IMEs. This change takes place in +{@link android.view.inputmethod.InputMethodManager#shouldOfferSwitchingToNextInputMethod +InputMethodManager.shouldOfferSwitchingToNextInputMethod()}.</p> + +<p>In addition, the framework now checks whether the next IME includes a +switching mechanism at all (and, thus, whether that IME supports switching to +the IME after it). An +IME with a switching mechanism will not cycle to an IME without one. This +change takes place in +{@link android.view.inputmethod.InputMethodManager#switchToNextInputMethod +InputMethodManager.switchToNextInputMethod}. + +<p>To see an example of how to use the updated IME-switching APIs, refer to the +updated soft-keyboard implementation sample in this release.</p> + +<h2 id="Manifest">Manifest Declarations</h2> + +<h3 id="ManifestFeatures">Declarable required features</h3> +<p>The following values are now supported in the +<a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> +element, so you can ensure that your app is installed only on devices that provide the features +your app needs.</p> + +<ul> +<li>{@code FEATURE_LEANBACK}. Declares that your app must be installed only on +devices that support the +<a href="{@docRoot}training/tv/index.html">Android TV</a> user interface. +Example: +<pre> +<uses-feature android:name="android.software.leanback" + android:required="true" /> +</pre> + +<li>{@code FEATURE_WEBVIEW}. Declares that your app must only be installed on +devices that fully implement the {@code android.webkit.*} APIs. Example: +<pre> +<uses-feature android:name="android.software.webview" + android:required="true" /> +</pre> +</ul> + +<p class="note">For a detailed view of all API changes in the L Developer Preview, see the +<a href="{@docRoot}preview/reference.html">API Differences Report</a>.</p> diff --git a/docs/html/preview/google-play-services-wear.html b/docs/html/preview/google-play-services-wear.html new file mode 100644 index 0000000..ad8891f --- /dev/null +++ b/docs/html/preview/google-play-services-wear.html @@ -0,0 +1,95 @@ +<html><head> + + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<meta name="viewport" content="width=device-width"> + +<meta name="Description" content="Google Play services will fully roll out to the hundreds of millions of Android devices in early July. Because of this, we usually wait to release the Google Play services SDK until all users receive the most updated Google Play services on their devices…"> +<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"> +<title>Google Play services Preview for Wear | Android Developers</title> + +<!-- STYLESHEETS --> +<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold" title="roboto"> +<link href="/assets/css/default.css" rel="stylesheet" type="text/css"> +</head> +<body> +<div class="col-12" id="doc-col"> + +<h1 itemprop="name">Google Play services Preview for Wear</h1> + + + + + + + <div id="jd-content"> + <div class="jd-descr" itemprop="articleBody"> +<p>The Google Play services app is currently being rolled out to the hundreds of millions of +Android devices and will complete in early July. Because of this, we usually wait to release the Google Play +services SDK until all users receive the app. This guarantees that your newly-updated apps can +run on the most devices as possible.</p> + +<p>However, if want to develop for Android Wear now, complete the following steps +to get special access to all the things you need to start developing, without waiting +for the rollout to complete. </p> + +<p class="warning"><b>Warning</b>: Do not publish any apps that use the new Google Play services +APIs until the rollout is complete. Your apps will break on most user devices, which will +degrade your user rating.</b> +</p> + +<h2 style="margin-bottom: 0px;">1. Get Whitelisted for the Preview</h2><hr> + +<p>If you attended Google I/O, your registered Gmail account is automatically whitelisted for these +preview resources. If you didn't attend Google I/O, sign up below to get access:</p> + +<a href="https://groups.google.com/forum/?hl=en#!forum/io14androidweardev">Get Whitelisted</a> + +<h2 style="margin-bottom: 0px;">2. Download Required Apps</h2><hr> +<p>You'll need the following apps to get the most out of Android Wear:</p> + + +<p>Here's a list of the apps you need:</p> +<ul> +<li><a href="https://play.google.com/apps/testing/com.google.android.gms">Google Play services</a>: Allows your Wear device to properly communicate with your handheld device. This is +required to use the Android Wear Companion App.</li> + <li><a href="https://play.google.com/apps/testing/com.google.android.wearable.app">Android Wear + Companion</a>: The main user app to pair a handheld to a wearable and to provide syncing + of notifications and data.</li> + <li><a href="https://play.google.com/apps/testing/com.google.android.googlequicksearchbox">Google + Search</a>: A preview release of the Google Search handheld app that Wear communicates with + to carry out searches.</li> + <li><a href="https://play.google.com/apps/testing/com.google.android.keep">Google Keep</a>: To enable the "Take a note" command</li> + <li><a href="https://play.google.com/apps/testing/com.google.samples.apps.iosched">Google I/O 2014</a></li> + </ul> + +<p>To enable the preview versions of the apps, click each app link above and follow these +instructions:</p> + +<ol> + <li>Click the <b>Become a Tester</b> button to opt-in to the preview version of the app. The page + confirms that you're a tester after clicking.</li> + <li>Click the <b>Download <app name> from the Play Store</b> link to go to Google Play + Store download page to get the app. The + following screenshot shows how the opt-in process looks like: +<img style="margin-top:40px" src="/preview/images/opt-in.png"></li> + <li>When Google Play services is rolled out to all devices, go back to the app links provided + to opt-out of the preview versions of the apps. Check back here in a week for the status of + the rollout.</li> +</ol> + + + +<h2 style="margin-bottom: 0px;">3. Start Building</h2><hr> +<p>Check out the <a href="/training/building-wearables">Building Apps for Wearables</a> +training classes for information on how to build for Wear.</p> + </div> + + + + + </div> <!-- end jd-content --> +</div><!-- end doc-content --> +</div> <!-- end body-content --> +</body> +</html>
\ No newline at end of file diff --git a/docs/html/preview/images/ActivitySceneTransitionBasic.png b/docs/html/preview/images/ActivitySceneTransitionBasic.png Binary files differnew file mode 100644 index 0000000..ea58641 --- /dev/null +++ b/docs/html/preview/images/ActivitySceneTransitionBasic.png diff --git a/docs/html/preview/images/ActivitySceneTransitionBasic@2x.png b/docs/html/preview/images/ActivitySceneTransitionBasic@2x.png Binary files differnew file mode 100644 index 0000000..cd28ade --- /dev/null +++ b/docs/html/preview/images/ActivitySceneTransitionBasic@2x.png diff --git a/docs/html/preview/images/BasicManagedProfile.png b/docs/html/preview/images/BasicManagedProfile.png Binary files differnew file mode 100644 index 0000000..7354842 --- /dev/null +++ b/docs/html/preview/images/BasicManagedProfile.png diff --git a/docs/html/preview/images/BasicManagedProfile@2x.png b/docs/html/preview/images/BasicManagedProfile@2x.png Binary files differnew file mode 100644 index 0000000..c232809 --- /dev/null +++ b/docs/html/preview/images/BasicManagedProfile@2x.png diff --git a/docs/html/preview/images/JobSchedulerSample.png b/docs/html/preview/images/JobSchedulerSample.png Binary files differnew file mode 100644 index 0000000..ee57bdb --- /dev/null +++ b/docs/html/preview/images/JobSchedulerSample.png diff --git a/docs/html/preview/images/JobSchedulerSample@2x.png b/docs/html/preview/images/JobSchedulerSample@2x.png Binary files differnew file mode 100644 index 0000000..3d543db --- /dev/null +++ b/docs/html/preview/images/JobSchedulerSample@2x.png diff --git a/docs/html/preview/images/art.png b/docs/html/preview/images/art.png Binary files differnew file mode 100644 index 0000000..c48f039 --- /dev/null +++ b/docs/html/preview/images/art.png diff --git a/docs/html/preview/images/battery_historian.png b/docs/html/preview/images/battery_historian.png Binary files differnew file mode 100644 index 0000000..f1d4e40 --- /dev/null +++ b/docs/html/preview/images/battery_historian.png diff --git a/docs/html/preview/images/battery_historian@2x.png b/docs/html/preview/images/battery_historian@2x.png Binary files differnew file mode 100644 index 0000000..8c8a87f --- /dev/null +++ b/docs/html/preview/images/battery_historian@2x.png diff --git a/docs/html/preview/images/bugs.png b/docs/html/preview/images/bugs.png Binary files differnew file mode 100644 index 0000000..46adf05 --- /dev/null +++ b/docs/html/preview/images/bugs.png diff --git a/docs/html/preview/images/hero.jpg b/docs/html/preview/images/hero.jpg Binary files differnew file mode 100644 index 0000000..1c52989 --- /dev/null +++ b/docs/html/preview/images/hero.jpg diff --git a/docs/html/preview/images/hun-example.png b/docs/html/preview/images/hun-example.png Binary files differnew file mode 100644 index 0000000..251b938 --- /dev/null +++ b/docs/html/preview/images/hun-example.png diff --git a/docs/html/preview/images/hun-example@2x.png b/docs/html/preview/images/hun-example@2x.png Binary files differnew file mode 100644 index 0000000..5b98a36 --- /dev/null +++ b/docs/html/preview/images/hun-example@2x.png diff --git a/docs/html/preview/images/l-dev-prev.png b/docs/html/preview/images/l-dev-prev.png Binary files differnew file mode 100644 index 0000000..eae6ede --- /dev/null +++ b/docs/html/preview/images/l-dev-prev.png diff --git a/docs/html/preview/images/managed_apps_launcher.png b/docs/html/preview/images/managed_apps_launcher.png Binary files differnew file mode 100644 index 0000000..b5ef407 --- /dev/null +++ b/docs/html/preview/images/managed_apps_launcher.png diff --git a/docs/html/preview/images/managed_apps_launcher@2x.png b/docs/html/preview/images/managed_apps_launcher@2x.png Binary files differnew file mode 100644 index 0000000..90d7d51 --- /dev/null +++ b/docs/html/preview/images/managed_apps_launcher@2x.png diff --git a/docs/html/preview/images/material.png b/docs/html/preview/images/material.png Binary files differnew file mode 100644 index 0000000..2d807d4 --- /dev/null +++ b/docs/html/preview/images/material.png diff --git a/docs/html/preview/images/notifications.png b/docs/html/preview/images/notifications.png Binary files differnew file mode 100644 index 0000000..2fb2fea --- /dev/null +++ b/docs/html/preview/images/notifications.png diff --git a/docs/html/preview/images/opt-in.png b/docs/html/preview/images/opt-in.png Binary files differnew file mode 100644 index 0000000..51754af --- /dev/null +++ b/docs/html/preview/images/opt-in.png diff --git a/docs/html/preview/images/updates.png b/docs/html/preview/images/updates.png Binary files differnew file mode 100644 index 0000000..f165c5a --- /dev/null +++ b/docs/html/preview/images/updates.png diff --git a/docs/html/preview/images/volta.png b/docs/html/preview/images/volta.png Binary files differnew file mode 100644 index 0000000..9125081 --- /dev/null +++ b/docs/html/preview/images/volta.png diff --git a/docs/html/preview/index.html b/docs/html/preview/index.html new file mode 100644 index 0000000..4f3f150 --- /dev/null +++ b/docs/html/preview/index.html @@ -0,0 +1,361 @@ +<!DOCTYPE html> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<html> +<head> + + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta name="viewport" content="width=970" /> + +<meta name="Description" content="Test and build your apps against the next version of Android to ensure they're ready when the platform officially launches."> +<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" /> +<title>Android L Developer Preview | Android Developers</title> + +<!-- STYLESHEETS --> +<link rel="stylesheet" +href="//fonts.googleapis.com/css?family=Roboto+Condensed"> +<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold" + title="roboto"> +<link href="/assets/css/default.css" rel="stylesheet" type="text/css"> + + + +<!-- JAVASCRIPT --> +<script src="//www.google.com/jsapi" type="text/javascript"></script> +<script src="/assets/js/android_3p-bundle.js" type="text/javascript"></script> +<script type="text/javascript"> + var toRoot = "/"; + var metaTags = []; + var devsite = false; +</script> +<script src="/assets/js/docs.js" type="text/javascript"></script> + +<script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + + ga('create', 'UA-5831155-1', 'android.com'); + ga('create', 'UA-49880327-2', 'android.com', {'name': 'universal'}); // New tracker); + ga('send', 'pageview'); + ga('universal.send', 'pageview'); // Send page view for new tracker. +</script> + +</head> + +<body class="gc-documentation + +" itemscope itemtype="http://schema.org/Article"> + + +<a name="top"></a> +<div id="body-content"> +<div class="fullpage" > +<div id="jd-content"> + <div class="jd-descr" itemprop="articleBody"> + <style> +.fullpage>#footer, +#jd-content>.content-footer.wrap { + display:none; +} +</style> + +<style> +#footer { + display: none; +} +.content-footer { + display: none; +} +</style> + + <div class="landing-rest-of-page"> + <div class="landing-section" style="padding-top:30px"> + <div class="wrap"> + <div class="landing-section-header"> + <div class="landing-h1">Android L Developer Preview</div> + <div class="landing-subhead"> + Get an early look at the next release and get your apps ready when the + platform officially launches. + </div> + + <img src="/preview/images/l-dev-prev.png" style=" margin:0px 0 0 40px" width="860px"/> + <div class="col-6" style="margin-left:660px; margin-top:-105px"> + <a href="/preview/setup-sdk.html" class="landing-button landing-primary" style="position:absolute;z-index:100;float:right;margin-top: 0px;">Get Started</a><!-- + <p>Set up your environment and check out all the docs to get up and running.</p>--> + + + </div> + </div> + </div> <!-- end .wrap --> + </div> <!-- end .landing-section --> + + + +<div class="landing-section landing-gray-background" style="margin-top:-135px; padding-bottom:20px"> + <div class="wrap"> + <div class="cols"> +<div class="landing-body" style="margin-top:-80px" > + + <div class="landing-breakout cols"> + <div class="col-4"> + <p>A New UI Design</p> + <p class="landing-small"> + Create a consistent experience across mobile and the web with + <b>material design</b>, the new Google-wide standard. + </p> + <p class="landing-small"> + <a href="/preview/material/index.html">Learn about material</a> + </p> + </div> + <div class="col-4"> + <p>A New Runtime</p> + <p class="landing-small"> + Test your apps and get them ready for <b>ART</b> (<b>A</b>ndroid <b>R</b>un<b>t</b>ime), + the default runtime in the next release. + </p> + <p class="landing-small"> + <a href="/preview/api-overview.html#ART">Learn about ART</a> + </p> + </div> + <div class="col-4"> + <p style="width:230px">Enhanced Notifications</p> + <p class="landing-small"> + Get control over where notifications appear, + how they look, and how they sync to non-handheld devices. + </p> + <p class="landing-small"> + <a href="/preview/api-overview.html#UI">Learn about notifications</a> + </p> + </div> + <div class="col-4"> + <p>Increased Efficiency</p> + <p class="landing-small"> + <b>Project Volta</b> is our effort to make the platform energy efficient and + to give you more control over resource usage. + </p> + <p class="landing-small"> + <a href="/preview/api-overview.html#Power">Learn about Project Volta</a> + </p> + </div> + </div> + <p style="margin-left:20px">See the <a href="/preview/api-overview.html">API overview</a> for more information + on the rest of the new and updated features.</p> + </div> + </div></div></div> + <div class="landing-section"> + <div class="wrap"> + <div class="cols"> + <div class="landing-body"> + <div class="col-3-wide"> + <a target="_blank" href="https://code.google.com/p/android-developer-preview/"> + <img class="landing-social-image" src="/preview/images/bugs.png" alt=""> + </a> + <div class="landing-social-copy"> + <p>Issue Tracker</p> + <p class="landing-small"> + Let us know when you encounter problems, so we can fix them and make + the platform better for you and your users. + </p><p class="landing-small"> + <a href="https://code.google.com/p/android-developer-preview/"> + Report Issues</a> + </p> + <p></p> + </div> + </div> + <div class="col-3-wide"> + <a target="_blank" href="http://plus.google.com"> + <img class="landing-social-image" src="//www.google.com/images/icons/product/gplus-128.png" alt=""> + </a> + <div class="landing-social-copy"> + <p>Google+ </p> + <p class="landing-small"> + Join the community of Android developers testing out the L Developer Preview and + share your thoughts and experiences. + </p><p class="landing-small"> + <a href="https://plus.google.com/communities/113159138894928487684"> + Discuss on Google+</a> + </p> + </div> + </div> + <div class="col-3-wide"> + <a target="_blank" href="/preview/support.html"> + <img class="landing-social-image" src="/preview/images/updates.png" alt=""> + </a> + <div class="landing-social-copy"> + <p>Support and Updates</p> + <p class="landing-small"> + Updates to the L Developer Preview are delivered + in the Android SDK Manager. Check back periodically + for news about the changes. + </p> + <p class="landing-small"> + <a href="/preview/support.html">Get Support</a> + </p> + </div> + </div> + </div> + </div> + </div> + </div> + + <div class="content-footer wrap" itemscope="" itemtype="http://schema.org/SiteNavigationElement"> + <div class="layout-content-col col-16" style="padding-top:4px"> + <style>#___plusone_0 {float:right !important;}</style> + <div class="g-plusone" data-size="medium"></div> + </div> + </div> + <div id="footer" class="wrap" style="width:940px;position:relative;top:-35px;z-index:-1"> + <div id="copyright"> + Except as noted, this content is + licensed under <a href="http://creativecommons.org/licenses/by/2.5/"> + Creative Commons Attribution 2.5</a>. For details and + restrictions, see the <a href="/license.html">Content + License</a>. + </div> + </div> + </div> <!-- end landing-body-content --> + + <script> + $("a.landing-down-arrow").on("click", function(e) { + $("body").animate({ + scrollTop: $(".preview-hero").height() + 76 + }, 1000, "easeOutQuint"); + e.preventDefault(); + }); + </script> + </div> + + <div class="content-footer wrap" + itemscope itemtype="http://schema.org/SiteNavigationElement"> + + <div class="paging-links layout-content-col col-10"> + + </div> + <div class="layout-content-col plus-container col-2" > + <style>#___plusone_0 {float:right !important;}</style> + <div class="g-plusone" data-size="medium"></div> + + </div> + + </div> + + + + + </div> <!-- end jd-content --> + +<div id="footer" class="wrap" style="width:940px"> + + + <div id="copyright"> + + Except as noted, this content is + licensed under <a href="http://creativecommons.org/licenses/by/2.5/"> + Creative Commons Attribution 2.5</a>. For details and + restrictions, see the <a href="/license.html">Content + License</a>. + </div> + + +</div> <!-- end footer --> +</div><!-- end doc-content --> + +</div> <!-- end body-content --> + + + + + + <script src="https://developer.android.com/ytblogger_lists_unified.js" type="text/javascript"></script> + <script src="/jd_lists_unified.js" type="text/javascript"></script> + <script src="/jd_extras.js" type="text/javascript"></script> + <script src="/jd_collections.js" type="text/javascript"></script> + <script src="/jd_tag_helpers.js" type="text/javascript"></script> + +</body> +</html> diff --git a/docs/html/preview/license.jd b/docs/html/preview/license.jd new file mode 100644 index 0000000..5ff52ba --- /dev/null +++ b/docs/html/preview/license.jd @@ -0,0 +1,143 @@ +page.title=License Agreement + +@jd:body + +<p> +To get started with the Android SDK Preview, you must agree to the following terms and conditions. +As described below, please note that this is a preview version of the Android SDK, subject to change, that you use at your own risk. The Android SDK Preview is not a stable release, and may contain errors and defects that can result in serious damage to your computer systems, devices and data. +</p> + +<p> +This is the Android SDK Preview License Agreement (the “License Agreementâ€). +</p> +<div class="sdk-terms" style="height:auto;border:0;padding:0;width:700px"> +1. Introduction + +1.1 The Android SDK Preview (referred to in the License Agreement as the “Preview†and specifically including the Android system files, packaged APIs, and Preview library files, if and when they are made available) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the Preview. + +1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. + +1.3 "Google" means Google Inc., a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States. + +2. Accepting the License Agreement + +2.1 In order to use the Preview, you must first agree to the License Agreement. You may not use the Preview if you do not accept the License Agreement. + +2.2 By clicking to accept and/or using the Preview, you hereby agree to the terms of the License Agreement. + +2.3 You may not use the Preview and may not accept the License Agreement if you are a person barred from receiving the Preview under the laws of the United States or other countries including the country in which you are resident or from which you use the Preview. + +2.4 If you will use the Preview internally within your company or organization you agree to be bound by the License Agreement on behalf of your employer or other entity, and you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the Preview on behalf of your employer or other entity. + +3. Preview License from Google + +3.1 Subject to the terms of the License Agreement, Google grants you a royalty-free, non-assignable, non-exclusive, non-sublicensable, limited, revocable license to use the Preview, personally or internally within your company or organization, solely to develop applications to run on the Android platform. + +3.2 You agree that Google or third parties owns all legal right, title and interest in and to the Preview, including any Intellectual Property Rights that subsist in the Preview. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. + +3.3 You may not use the Preview for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not: (a) copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the Preview or any part of the Preview; or (b) load any part of the Preview onto a mobile handset or any other hardware device except a personal computer, combine any part of the Preview with other software, or distribute any software or device incorporating a part of the Preview. + +3.4 You agree that you will not take any actions that may cause or result in the fragmentation of Android, including but not limited to distributing, participating in the creation of, or promoting in any way a software development kit derived from the Preview. + +3.5 Use, reproduction and distribution of components of the Preview licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. You agree to remain a licensee in good standing in regard to such open source software licenses under all the rights granted and to refrain from any actions that may terminate, suspend, or breach such rights. + +3.6 You agree that the form and nature of the Preview that Google provides may change without prior notice to you and that future versions of the Preview may be incompatible with applications developed on previous versions of the Preview. You agree that Google may stop (permanently or temporarily) providing the Preview (or any features within the Preview) to you or to users generally at Google's sole discretion, without prior notice to you. + +3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. + +3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the Preview. + +4. Use of the Preview by You + +4.1 Google agrees that nothing in the License Agreement gives Google any right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the Preview, including any intellectual property rights that subsist in those applications. + +4.2 You agree to use the Preview and write applications only for purposes that are permitted by (a) the License Agreement, and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). + +4.3 You agree that if you use the Preview to develop applications, you will protect the privacy and legal rights of users. If users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If users provide you with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, each user has given you permission to do so. + +4.4 You agree that you will not engage in any activity with the Preview, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of Google or any third party. + +4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. + +4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach. + +4.7 The Preview is in development, and your testing and feedback are an important part of the development process. By using the Preview, you acknowledge that implementation of some features are still under development and that you should not rely on the Preview having the full functionality of a stable release. You agree not to publicly distribute or ship any application using this Preview as this Preview will no longer be supported after the official Android SDK is released. + +5. Your Developer Credentials + +5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials. + +6. Privacy and Information + +6.1 In order to continually innovate and improve the Preview, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the Preview are being used and how they are being used. Before any of this information is collected, the Preview will notify you and seek your consent. If you withhold consent, the information will not be collected. + +6.2 The data collected is examined in the aggregate to improve the Preview and is maintained in accordance with Google's Privacy Policy located at http://www.google.com/policies/privacy/. + +7. Third Party Applications + +7.1 If you use the Preview to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. + +7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. + +7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. + +8. Using Google APIs + +8.1 Google APIs + +8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. + +8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so. + +9. Terminating the License Agreement + +9.1 the License Agreement will continue to apply until terminated by either you or Google as set out below. + +9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the Preview and any relevant developer credentials. + +9.3 Google may at any time, terminate the License Agreement, with or without cause, upon notice to you. + +9.4 The License Agreement will automatically terminate without notice or other action upon the earlier of: +(A) when Google ceases to provide the Preview or certain parts of the Preview to users in the country in which you are resident or from which you use the service; and +(B) Google issues a final release version of the Android SDK. + +9.5 When the License Agreement is terminated, the license granted to you in the License Agreement will terminate, you will immediately cease all use of the Preview, and the provisions of paragraphs 10, 11, 12 and 14 shall survive indefinitely. + +10. DISCLAIMERS + +10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE PREVIEW IS AT YOUR SOLE RISK AND THAT THE PREVIEW IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. + +10.2 YOUR USE OF THE PREVIEW AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE PREVIEW IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. WITHOUT LIMITING THE FOREGOING, YOU UNDERSTAND THAT THE PREVIEW IS NOT A STABLE RELEASE AND MAY CONTAIN ERRORS, DEFECTS AND SECURITY VULNERABILITIES THAT CAN RESULT IN SIGNIFICANT DAMAGE, INCLUDING THE COMPLETE, IRRECOVERABLE LOSS OF USE OF YOUR COMPUTER SYSTEM OR OTHER DEVICE. + +10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + +11. LIMITATION OF LIABILITY + +11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING. + +12. Indemnification + +12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys’ fees) arising out of or accruing from (a) your use of the Preview, (b) any application you develop on the Preview that infringes any Intellectual Property Rights of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you of the License Agreement. + +13. Changes to the License Agreement + +13.1 Google may make changes to the License Agreement as it distributes new versions of the Preview. When these changes are made, Google will make a new version of the License Agreement available on the website where the Preview is made available. + +14. General Legal Terms + +14.1 the License Agreement constitutes the whole legal agreement between you and Google and governs your use of the Preview (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the Preview. + +14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. + +14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable. + +14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement. + +14.5 EXPORT RESTRICTIONS. THE PREVIEW IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE PREVIEW. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. + +14.6 The License Agreement may not be assigned or transferred by you without the prior written approval of Google, and any attempted assignment without such approval will be void. You shall not delegate your responsibilities or obligations under the License Agreement without the prior written approval of Google. + +14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. + + +</div>
\ No newline at end of file diff --git a/docs/html/preview/material/animations.jd b/docs/html/preview/material/animations.jd new file mode 100644 index 0000000..b8d063b --- /dev/null +++ b/docs/html/preview/material/animations.jd @@ -0,0 +1,441 @@ +page.title=Animations + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> +<h2>In this document</h2> +<ol> + <li><a href="#touch">Touch Feedback</a></li> + <li><a href="#reveal">Reveal Effect</a></li> + <li><a href="#transitions">Activity Transitions</a></li> + <li><a href="#curvedmotion">Curved Motion</a></li> + <li><a href="#viewstate">Animating View State Changes</a></li> + <li><a href="#drawabletint">Drawable Tinting</a></li> + <li><a href="#colorextract">Extracting Colors from an Image</a></li> +</ol> +</div> +</div> + +<p>Animations in material design give users feedback on their actions and provide visual +continuity as users interact with your app. The material theme provides some default animations +for buttons and activity transitions, and the Android L Developer Preview provides additional +APIs that let you customize these animations and create new ones:</p> + +<ul> +<li>Touch feedback</li> +<li>Reveal effect</li> +<li>Activity transitions</li> +<li>Curved motion</li> +<li>View state changes</li> +</ul> + + +<h2 id="touch">Touch Feedback</h2> + +<p>The default touch feedback animations for buttons use the new +<code>RippleDrawable</code> class, which transitions between different states with a ripple +effect.</p> + +<p>In most cases, this functionality should be applied in your view XML by specifying the +background as <code>?android:attr/selectableItemBackground</code> for a bounded ripple or +<code>?android:attr/selectableItemBackgroundBorderless</code> for a ripple that extends beyond +the view bounds. You can also create a <code>RippleDrawable</code> and set +it as the background of your view. Alternatively, you can define a <code>RippleDrawable</code> +as an XML resource using the <code>ripple</code> element. The +Android L Developer Preview animates the selection color with a ripple effect.</p> + +<p>You can assign a color to <code>RippleDrawable</code> objects. To change the default touch +feedback color, use the theme's <code>android:colorControlHighlight</code> attribute.</p> + + +<h2 id="reveal">Reveal Effect</h2> + +<p>The <code>ViewAnimationUtils.createCircularReveal</code> method enables you to animate a +clipping circle to reveal or hide a view.</p> + +<p>To reveal a previously invisible view using this effect:</p> + +<pre> +// previously invisible view +View myView = findViewById(R.id.my_view); + +// get the center for the clipping circle +int cx = (myView.getLeft() + myView.getRight()) / 2; +int cy = (myView.getTop() + myView.getBottom()) / 2; + +// get the final radius for the clipping circle +int finalRadius = myView.getWidth(); + +// create and start the animator for this view +// (the start radius is zero) +ValueAnimator anim = + ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius); +anim.start(); +</pre> + +<p>To hide a previously visible view using this effect:</p> + +<pre> +// previously visible view +final View myView = findViewById(R.id.my_view); + +// get the center for the clipping circle +int cx = (myView.getLeft() + myView.getRight()) / 2; +int cy = (myView.getTop() + myView.getBottom()) / 2; + +// get the initial radius for the clipping circle +int initialRadius = myView.getWidth(); + +// create the animation (the final radius is zero) +ValueAnimator anim = + ViewAnimationUtils.createCircularReveal(myView, cx, cy, initialRadius, 0); + +// make the view invisible when the animation is done +anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + myView.setVisibility(View.INVISIBLE); + } +}); + +// start the animation +anim.start(); +</pre> + + +<h2 id="transitions">Activity Transitions</h2> + +<p>You can specify custom animations for enter and exit transitions and for +transitions of shared elements between activities.</p> + +<ul> +<li>An <strong>enter</strong> transition determines how views in an activity enter the scene. +For example, in the <em>explode</em> enter transition, the views enter the scene from the outside +and fly in towards the center of the screen.</li> + +<li>An <strong>exit</strong> transition determines how views in an activity exit the scene. For + example, in the <em>explode</em> exit transition, the views exit the scene away from the +center.</li> + +<li>A <strong>shared elements</strong> transition determines how views that are shared between +two activities transition between these activities. For example, if two activities have the same +image in different positions and sizes, the <em>moveImage</em> shared element transition +translates and scales the image smoothly between these activities.</li> +</ul> + +<p>The Android L Developer Preview supports these enter and exit transitions:</p> + +<ul> +<li><em>explode</em> - Moves views in or out from the center of the scene.</li> +<li><em>slide</em> - Moves views in or out from one of the edges of the scene.</li> +<li><em>fade</em> - Mades views in or out of the scene.</li> +</ul> + +<p>Any transition that extends the <code>android.transition.Visibility</code> class is supported +as an enter or exit transition. For more information, see the API reference for the +<code>android.transition.Transition</code> class.</p> + +<p>The Android L Developer Preview also supports these shared elements transitions:</p> + +<ul> +<li><em>changeBounds</em> - Animates the changes in layout bounds of target views.</li> +<li><em>changeClipBounds</em> - Animates the changes in clip bounds of target views.</li> +<li><em>changeTransform</em> - Animates the changes in scale and rotation of target views.</li> +<li><em>moveImage</em> - Animates changes in size and scale type for an image view.</li> +</ul> + +<p>When you enable activity transitions in your app, the default cross-fading transition is +activated between the entering and exiting activities.</p> + +<img src="/preview/material/images/SceneTransition.png" alt="" + id="figure1" style="width:600px;margin-top:20px"/> +<p class="img-caption"> + <strong>Figure 1</strong> - A scene transition with one shared element. +</p> + +<h3>Specify custom transitions</h3> + +<p>First, enable window content transitions with the <code>android:windowContentTransitions</code> +attribute when you define a style that inherits from the material theme. You can also specify +enter, exit, and shared element transitions in your style definition:</p> + +<pre> +<style name="BaseAppTheme" parent="android:Theme.Material"> + <!-- enable window content transitions --> + <item name="android:windowContentTransitions">true</item> + + <!-- specify enter and exit transitions --> + <item name="android:windowEnterTransition">@transition/explode</item> + <item name="android:windowExitTransition">@transition/explode</item> + + <!-- specify shared element transitions --> + <item name="android:windowSharedElementEnterTransition"> + @transition/move_image</item> + <item name="android:windowSharedElementExitTransition"> + @transition/move_image</item> +</style> +</pre> + +<p>The <code>move_image</code> transition in this example is defined as follows:</p> + +<pre> +<!-- res/transition/move_image.xml --> +<!-- (see also Shared Transitions below) --> +<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> + <moveImage/> +</transitionSet> +</pre> + +<p>The <code>moveImage</code> element corresponds to the <code>android.transition.MoveImage</code> +class. For more information, see the API reference for <code>android.transition.Transition</code>. +</p> + +<p>To enable window content transitions in your code instead, call the +<code>Window.requestFeature</code> method:</p> + +<pre> +// inside your activity (if you did not enable transitions in your theme) +getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); + +// set an exit transition +getWindow().setExitTransition(new Explode()); +</pre> + +<p>To specify transitions in your code, call these methods with a <code>Transition</code> +object:</p> + +<ul> + <li><code>Window.setEnterTransition</code></li> + <li><code>Window.setExitTransition</code></li> + <li><code>Window.setSharedElementEnterTransition</code></li> + <li><code>Window.setSharedElementExitTransition</code></li> +</ul> + +<p>The <code>setExitTransition</code> and <code>setSharedElementExitTransition</code> methods +define the exit transition for the calling activity. The <code>setEnterTransition</code> and +<code>setSharedElementEnterTransition</code> methods define the enter transition for the called +activity.</p> + +<p>To get the full effect of a transition, you must enable window content transitions on both the +calling and called activities. Otherwise, the calling activity will start the exit transition, +but then you'll see a window transition (like scale or fade).</p> + +<p>To start an enter transition as soon as possible, use the +<code>Window.setAllowEnterTransitionOverlap</code> method on the called activity. This lets you +have more dramatic enter transitions. The same applies for the calling activity and exit +transitions with the <code>Window.setAllowExitTransitionOverlap</code> method.</p> + +<h3>Start an activity using transitions</h3> + +<p>If you enable transitions and set an exit transition for an activity, the transition is activated +when you launch another activity with the <code>startActivity</code> method. If you have set an +enter transition for the second activity, the transition is also activated when the activity +starts.</p> + +<h3>Shared elements transitions</h3> + +<p>To make a screne transition animation between two activities that have a shared element:</p> + +<ol> +<li>Enable window content transitions in your style.</li> +<li>Specify a shared elements transition in your style.</li> +<li>Define your transition as an XML resource.</li> +<li>Assign a common name to the shared elements in both layouts with the + <code>android:viewName</code> attribute.</li> +<li>Use the <code>ActivityOptions.makeSceneTransitionAnimation</code> method.</li> +</ol> + +<pre> +// get the element that receives the click event +final View imgContainerView = findViewById(R.id.img_container); + +// get the common element for the transition in this activity +final View androidRobotView = findViewById(R.id.image_small); + +// define a click listener +imgContainerView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(this, Activity2.class); + // create the transition animation - the images in the layouts + // of both activities are defined with android:viewName="robot" + ActivityOptions options = ActivityOptions + .makeSceneTransitionAnimation(this, androidRobotView, "robot"); + // start the new activity + startActivity(intent, options.toBundle()); + } +}); +</pre> + +<p>For shared dynamic views that you generate in your code, use the <code>View.setViewName</code> +method to specify a common element name in both activities.</p> + +<p>To reverse the scene transition animation when you finish the second activity, call the +<code>Activity.finishAfterTransition</code> method instead of <code>Activity.finish</code>.</p> + +<h3>Multiple shared elements</h3> + +<p>To make a scene transition animation between two activities that have more than one shared +element, define the shared elements in both layouts with the <code>android:viewName</code> +attribute (or use the <code>View.setViewName</code> in both activities), and create an +<code>ActivityOptions</code> object as follows:</p> + +<pre> +ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, + Pair.create(view1, "agreedName1"), + Pair.create(view2, "agreedName2")); +</pre> + + +<h2 id="curvedmotion">Curved Motion</h2> + +<p>Animations in material design rely on curves for time interpolation and spatial movement +patterns. The Android L Developer Preview provides new APIs that enable you to define custom +timing curves and curved motion patterns for animations.</p> + +<p>The <code>PathInterpolator</code> class is a new interpolator based on a Bézier curve or a +<code>Path</code> object. This interpolator specifies a motion curve in a 1x1 square, with anchor +points at (0,0) and (1,1) and control points as specified using the constructor arguments. You can +also define a <code>PathInterpolator</code> as an XML resource:</p> + +<pre> +<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android" + android:controlX1="0.4" + android:controlY1="0" + android:controlX2="1" + android:controlY2="1"/> +</pre> + +<p>The Android L Developer Preview provides XML resources for the three basic curves in the +material design specification:</p> + +<ul> + <li><code>@interpolator/fast_out_linear_in.xml</code></li> + <li><code>@interpolator/fast_out_slow_in.xml</code></li> + <li><code>@interpolator/linear_out_slow_in.xml</code></li> +</ul> + +<p>You can pass a <code>PathInterpolator</code> object to the +<code>Animator.setInterpolation</code> method.</p> + +<p>The <code>ObjectAnimator</code> class has new constructors that enable you to animate +coordinates along a path using two or more properties at once. For example, the following animator +uses a <code>Path</code> object to animate the X and Y properties of a view:</p> + +<pre> +ObjectAnimator mAnimator; +mAnimator = ObjectAnimator.ofFloat(view, View.X, View.Y, path); +... +mAnimator.start(); +</pre> + + +<h2 id="viewstate">Animating View State Changes</h2> + +<p>The new <code>StateListAnimator</code> class lets you define animators that run when the state +of a view changes. The following example shows how to define an <code>StateListAnimator</code> as +an XML resource:</p> + +<pre> +<!-- animate the translationZ property of a view when pressed --> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true"> + <set> + <objectAnimator android:propertyName="translationZ" + android:duration="100" + android:valueTo="2" + android:valueType="floatType"/> + <!-- you could have other objectAnimator elements + here for "x" and "y", or other properties --> + </set> + </item> + <item android:state_enabled="true" + android:state_pressed="false" + android:state_focused="true"> + <set> + <objectAnimator android:propertyName="translationZ" + android:duration="100" + android:valueTo="2" + android:valueType="floatType"/> + </set> + </item> +</selector> +</pre> + +<p class="note"><strong>Note:</strong> There is a known issue in the L Developer Preview release +that requires valueFrom values to be provided in StateListAnimator animations to get the correct +behavior.</p> + +<p>The new <code>AnimatedStateListDrawable</code> class lets you create drawables that show +animations between state changes of the associated view. Some of the system widgets in the +Android L Developer Preview use these animations by default. The following example shows how +to define an <code>AnimatedStateListDrawable</code> as an XML resource:</p> + +<pre> +<!-- res/drawable/myanimstatedrawable.xml --> +<animated-selector + xmlns:android="http://schemas.android.com/apk/res/android"> + + <!-- provide a different drawable for each state--> + <item android:id="@+id/pressed" android:drawable="@drawable/drawableP" + android:state_pressed="true"/> + <item android:id="@+id/focused" android:drawable="@drawable/drawableF" + android:state_focused="true"/> + <item android:id="@id/default" + android:drawable="@drawable/drawableD"/> + + <!-- specify a transition --> + <transition android:fromId="@+id/default" android:toId="@+id/pressed"> + <animation-list> + <item android:duration="15" android:drawable="@drawable/dt1"/> + <item android:duration="15" android:drawable="@drawable/dt2"/> + ... + </animation-list> + </transition> + ... +</animated-selector> +</pre> + + +<h2 id="drawabletint">Drawable Tinting</h2> + +<p>The Android L Developer Preview enables you to define bitmaps or nine-patches as alpha masks and +to tint them using a color resource or a theme attribute that resolves to a color resource (for +example, <code>?android:attr/colorPrimary</code>). You can create these assets only once and color them +automatically to match your theme.</p> + +<p>To apply a tint to a bitmap, use the <code>setTint</code> method or the <code>android:tint</code> +attribute for <code>BitmapDrawable</code> and <code>NinePatchDrawable</code>.</p> + +<p>The <code>setTint</code> method also lets you set the Porter-Duff mode used to blend the +tint color for <code>NinePatchDrawable</code> and <code>BitmapDrawable</code> objects in your code. +To set the tint mode in your layouts, use the <code>android:tintMode</code> attribute.</p> + + +<h2 id="colorextract">Extracting Prominent Colors from an Image</h2> + +<p>The Android L Developer Preview Support Library includes the <code>Palette</code> class, +which lets you extract prominent colors from an image. This class extracts the following +prominent colors:</p> + +<ul> +<li>Vibrant</li> +<li>Vibrant dark</li> +<li>Vibrant light</li> +<li>Muted</li> +<li>Muted dark</li> +<li>Muted light</li> +</ul> + +<p>To extract these colors, pass a <code>Bitmap</code> object to the +<code>Palette.generate</code> static method in the background thread where you load your images. +If you can't use that thread, call the <code>Palette.generateAsync</code> method instead and +provide a listener.</p> + +<p>To retrieve the prominent colors from the image, use the getter methods in the +<code>Palette</code> class, such as <code>Palette.getVibrantColor</code>.</p> + +<p>For more information, see the API reference for the +<code>android.support.v7.graphics.Palette</code> class.</p>
\ No newline at end of file diff --git a/docs/html/preview/material/compatibility.jd b/docs/html/preview/material/compatibility.jd new file mode 100644 index 0000000..fb97112 --- /dev/null +++ b/docs/html/preview/material/compatibility.jd @@ -0,0 +1,82 @@ +page.title=Compatibility + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> +<h2>In this document</h2> +<ol> + <li><a href="#materialtheme">Material Theme</a></li> + <li><a href="#layouts">Layouts</a></li> + <li><a href="#widgets">UI Widgets</a></li> + <li><a href="#animation">Animation APIs</a></li> +</ol> +</div> +</div> + +<p>The new material design features (like the material theme and activity transitions) are only +available in the Android L Developer Preview. However, you can design your apps to make use of +these features when running on devices with the Android L Developer Preview and still be +compatible with previous releases of Android.</p> + + +<h2 id="materialtheme">Material Theme</h2> + +<p>The material theme is only available in the Android L Developer Preview. To configure your +app to use the material theme on devices running the Android L Developer Preview and an older +theme on devices running earlier versions of Android:</p> + +<ol> +<li>Define a theme that inherits from an older theme (like Holo) in +<code>res/values/styles.xml</code>.</li> +<li>Define a theme with the same name that inherits from the material theme in +<code>res/values-v21/styles.xml</code>.</li> +<li>Set this theme as your app's theme in the manifest file.</li> +</ol> + +<p class="note"><strong>Note:</strong> If you do not provide an alternative theme in this manner, +your app will not run on earlier versions of Android.</p> + + +<h2 id="layouts">Layouts</h2> + +<p>If the layouts that you design according to the material design guidelines do not use any +of the new XML attributes from the Android L Developer Preview, they will work on previous +versions of Android. Otherwise, you can provide alternative layouts. You can also provide +alternative layouts to customize how your app looks on earlier versions of Android.</p> + +<p>Create your layout files for the Android L Developer Preview inside <code>res/layout-v21/</code> +and your alternative layout files for earlier versions of Android inside <code>res/layout/</code>. +Alternative layouts have the same file name.</p> + +<p>To avoid duplication of code, define your styles inside <code>res/values/</code> and modify the +styles in <code>res/values-v21/</code> for the new APIs.</p> + + +<h2 id="widgets">UI Widgets</h2> + +<p>The <code>RecyclerView</code> and <code>CardView</code> widgets are included in the Android L +Developer Preview Support Library, so they are available in earlier versions of Android with +these limitations:</p> + +<ul> +<li><code>CardView</code> falls back to a programmatic shadow implementation using additional padding.</li> +<li><code>CardView</code> does not clip its children views that intersect with rounded corners.</li> +</ul> + +<p>These limitations do not apply to the Android L Developer Preview.</p> + + +<h2 id="animation">Animation APIs</h2> + +<p>The following new APIs are only available in the Android L Developer Preview:</p> + +<ul> +<li>Activity transitions</li> +<li>Touch feedback</li> +<li>Reveal animations</li> +<li>Path-based animations</li> +</ul> + +<p>To preserve compatibility with earlier verisons of Android, check the system version at +runtime before you invoke these APIs.</p>
\ No newline at end of file diff --git a/docs/html/preview/material/get-started.jd b/docs/html/preview/material/get-started.jd new file mode 100644 index 0000000..7d0625e --- /dev/null +++ b/docs/html/preview/material/get-started.jd @@ -0,0 +1,147 @@ +page.title=Get Started + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> +<h2>In this document</h2> +<ol> + <li><a href="#applytheme">Apply the Material Theme</a></li> + <li><a href="#layouts">Design Your Layouts</a></li> + <li><a href="#depth">Specify Elevation in Your Views</a></li> + <li><a href="#widgets">Use the New UI Widgets</a></li> + <li><a href="#animations">Customize Your Animations</a></li> +</ol> +</div> +</div> + +<p>To create apps with material design:</p> + +<ol> + <li style="margin-bottom:10px"> + Take a look at the <a href="http://www.google.com/design/spec">material design + specification</a>.</li> + <li style="margin-bottom:10px"> + Apply the material <strong>theme</strong> to your app.</li> + <li style="margin-bottom:10px"> + Define additional <strong>styles</strong> to customize the material theme.</li> + <li style="margin-bottom:10px"> + Create your <strong>layouts</strong> following material design guidelines.</li> + <li style="margin-bottom:10px"> + Specify the <strong>elevation</strong> of your views to cast appropriate shadows.</li> + <li style="margin-bottom:10px"> + Use the new <strong>widgets</strong> for complex views, such as lists and cards.</li> + <li style="margin-bottom:10px"> + Use the new APIs to customize the <strong>animations</strong> in your app.</li> +</ol> + +<h3>Update Your App for the Android L Developer Preview</h3> + +<p>To update an existing app for the Android L Developer Preview, design new layouts following +material design guidelines and consider how you can improve the user experience for your app by +incorporating depth, touch feedback and animations in your UI.</p> + +<h3>Create New Apps for the Android L Developer Preview</h3> + +<p>If you are creating a new app for the Android L Developer Preview, the <a +href="http://www.google.com/design/spec">material design guidelines</a> provide you with a +cohesive design framework for your app. Follow these guidelines and +use the new functionality in the Android framework to design and develop your app.</p> + + +<h2 id="applytheme">Apply the Material Theme</h2> + +<p>To apply the material theme in your app, specify a style that inherits from +<code>android:Theme.Material</code>:</p> + +<pre> +<!-- res/values/styles.xml --> +<resources> + <!-- your app's theme inherits from the Material theme --> + <style name="AppTheme" parent="android:Theme.Material"> + <!-- theme customizations --> + </style> +</resources> +</pre> + +<p>The material theme provides new system widgets that let you set their color palette and default +animations for touch feedback and activity transitions. For more details, see +<a href="{@docRoot}preview/material/theme.html">Material Theme</a>.</p> + + +<h2 id="layouts">Design Your Layouts</h2> + +<p>In addition to applying and customizing the material theme, your layouts should conform to +the <a href="http://www.google.com/design/spec">material design guidelines</a>. When you design +your layouts, pay special attention to the following:</p> + +<ul> +<li>Baseline grids</li> +<li>Keylines</li> +<li>Spacing</li> +<li>Touch target size</li> +<li>Layout structure</li> +</ul> + + +<h2 id="depth">Specify Elevation in Your Views</h2> + +<p>Views can cast shadows, and the elevation value of a view +determines the size of its shadow and its drawing order. To set the elevation of a view, use the +<code>android:elevation</code> attribute in your layouts:</p> + +<pre> +<TextView + android:id="@+id/my_textview" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/next" + android:background="@color/white" + <strong>android:elevation</strong>="5dp" /> +</pre> + +<p>The new <code>translationZ</code> property lets you create animations that reflect temporary +changes in the elevation of a view. For example, this is useful to respond to touch gestures.</p> + +<p>For more details, see <a href="{@docRoot}preview/material/views-shadows.html">Views and +Shadows</a>.</p> + + +<h2 id="widgets">Use the New UI Widgets</h2> + +<p><code>RecyclerView</code> is a more advanced version of <code>ListView</code> that provides +performance improvements and is easier to use. <code>CardView</code> lets you show pieces of +information inside cards with a consistent look across apps. To include a <code>CardView</code> +in your layout:</p> + +<pre> +<android.support.v7.widget.CardView + android:id="@+id/card_view" + android:layout_width="200dp" + android:layout_height="200dp" + card_view:cardCornerRadius="3dp"> + ... +</android.support.v7.widget.CardView> +</pre> + +<p>For more information, see <a href="{@docRoot}preview/material/ui-widgets.html">UI Widgets</a>.</p> + + +<h2 id="animations">Customize Your Animations</h2> + +<p>The Android L Developer Preview includes new APIs to create custom animations in your app. +For example, you can enable activity transitions and define an exit transition inside an +activity:</p> + +<pre> +// inside your activity +getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); + +// set an exit transition +getWindow().setExitTransition(new Explode()); +</pre> + +<p>When you start another activity from this activity, the exit transition is activated.</p> + +<p>To learn about all the features in the new APIs, see <a +href="{@docRoot}preview/material/animations.html">Animations</a>.</p>
\ No newline at end of file diff --git a/docs/html/preview/material/images/MaterialDark.png b/docs/html/preview/material/images/MaterialDark.png Binary files differnew file mode 100644 index 0000000..f1018af --- /dev/null +++ b/docs/html/preview/material/images/MaterialDark.png diff --git a/docs/html/preview/material/images/MaterialLight.png b/docs/html/preview/material/images/MaterialLight.png Binary files differnew file mode 100644 index 0000000..4ed7d5c --- /dev/null +++ b/docs/html/preview/material/images/MaterialLight.png diff --git a/docs/html/preview/material/images/RecyclerView.png b/docs/html/preview/material/images/RecyclerView.png Binary files differnew file mode 100644 index 0000000..364951d --- /dev/null +++ b/docs/html/preview/material/images/RecyclerView.png diff --git a/docs/html/preview/material/images/SceneTransition.png b/docs/html/preview/material/images/SceneTransition.png Binary files differnew file mode 100644 index 0000000..ecaf472 --- /dev/null +++ b/docs/html/preview/material/images/SceneTransition.png diff --git a/docs/html/preview/material/images/ThemeColors.png b/docs/html/preview/material/images/ThemeColors.png Binary files differnew file mode 100644 index 0000000..bbcecf2 --- /dev/null +++ b/docs/html/preview/material/images/ThemeColors.png diff --git a/docs/html/preview/material/images/card_travel.png b/docs/html/preview/material/images/card_travel.png Binary files differnew file mode 100644 index 0000000..19752a8 --- /dev/null +++ b/docs/html/preview/material/images/card_travel.png diff --git a/docs/html/preview/material/images/list_mail.png b/docs/html/preview/material/images/list_mail.png Binary files differnew file mode 100644 index 0000000..bd107ff --- /dev/null +++ b/docs/html/preview/material/images/list_mail.png diff --git a/docs/html/preview/material/index.jd b/docs/html/preview/material/index.jd new file mode 100644 index 0000000..d9a276f --- /dev/null +++ b/docs/html/preview/material/index.jd @@ -0,0 +1,128 @@ +page.title=Material Design +page.type=design + +@jd:body + +<p itemprop="description">The Android L Developer Preview includes support for material design +apps. Material design is a comprehensive guide for visual, motion, and interaction design across +platforms and devices. To use material design in your Android apps, follow the guidelines defined +in the <a href="http://www.google.com/design/spec">material design specification</a> and use the +new components and functionality available in the Android L Developer Preview.</p> + +<p>The Android L Developer Preview provides the following elements for you to build material +design apps:</p> + +<ul> + <li>A new theme</li> + <li>New widgets for complex views</li> + <li>New APIs for custom shadows and animations</li> +</ul> + + +<h3>Material Theme</h3> + +<p>The material theme provides a new style for your app, system widgets that let you set +their color palette, and default animations for touch feedback and activity transitions.</p> + +<!-- two columns --> +<div style="width:700px;margin-top:25px;margin-bottom:20px"> +<div style="float:left;width:250px;margin-left:40px;margin-right:60px;"> + <img src="{@docRoot}preview/material/images/MaterialDark.png" width="500" height="238"/> + <div style="width:140px;margin:0 auto"> + <p style="margin-top:8px">Dark Material theme</p> + </div> +</div> +<div style="float:left;width:250px;margin-right:0px;"> + <img src="{@docRoot}preview/material/images/MaterialLight.png" width="500" height="238"/> + <div style="width:140px;margin:0 auto"> + <p style="margin-top:8px">Light Material theme</p> + </div> +</div> +<br style="clear:left"/> +</div> + + +<h3>New Widgets</h3> + +<p>The Android L Developer Preview includes two new widgets for displaying complex views:</p> + +<!-- two columns --> +<div style="width:700px;margin-top:25px;margin-bottom:20px"> +<div style="float:left;width:250px;margin-left:40px;margin-right:60px;"> + <img src="{@docRoot}preview/material/images/list_mail.png" width="500" height="426"/> + <p>The new <code>RecyclerView</code> widget is a more advanced version of <code>ListView</code> + that provides performance improvements for dynamic views and is easier to use.</p> +</div> +<div style="float:left;width:250px;margin-right:0px;"> + <img src="{@docRoot}preview/material/images/card_travel.png" width="500" height="426"/> + <p>The new <code>CardView</code> widget lets you display important pieces of information inside + cards that have a consistent look and feel.</p> +</div> +<br style="clear:left"/> +</div> + + +<h3>View Shadows</h3> + +<p>In addition to the X and Y properties, views in the Android L Developer Preview have a Z +property. This new property represents the elevation of a view, which determines:</p> + +<ul> +<li>The size of the shadow - Views with higher Z values cast bigger shadows.</li> +<li>The drawing order - Views with higher Z values appear on top of other views.</li> +</ul> + +<div style="width:290px;margin-left:35px;float:right"> + <div class="framed-nexus5-port-span-5"> + <video class="play-on-hover" autoplay> + <source src="/preview/material/videos/ContactsAnim.mp4"/> + <source src="/preview/material/videos/ContactsAnim.webm"/> + <source src="/preview/material/videos/ContactsAnim.ogv"/> + </video> + </div> + <div style="font-size:10pt;margin-left:20px;margin-bottom:30px"> + <em>Click on the device screen to replay the movie</em> + </div> +</div> + +<h3>Animations</h3> + +<p>The Android L Developer Preview provides new APIs that let you create custom animations for +touch feedback in UI controls, view state changes, and activity transitions.</p> + +<p>The new animation APIs let you:</p> + +<ul> +<li style="margin-bottom:15px"> +Respond to touch events in your views with <strong>touch feedback</strong> animations. +</li> +<li style="margin-bottom:15px"> +Hide and show views with <strong>reveal effect</strong> animations. +</li> +<li style="margin-bottom:15px"> +Switch between activities with custom <strong>activity transition</strong> animations. +</li> +<li style="margin-bottom:15px"> +Create more natural animations with <strong>curved motion</strong>. +</li> +<li style="margin-bottom:15px"> +Animate changes in one or more view properties with <strong>view state change</strong> animations. +</li> +<li style="margin-bottom:15px"> +Show animations in <strong>state list drawables</strong> between view state changes. +</li> +</ul> + +<p>Touch feedback animations are built into several standard views, such as buttons. The new APIs +let you customize these animations and add animations to your custom views.</p> + + +<h3>New Capabilities for Drawables</h3> + +<p>The Android L Developer Preview supports <strong>drawable tinting</strong>: you can define +bitmaps as an alpha mask and tint them using a color resource. You create these assets only +once and color each instance to match your theme. Drawables also now support specifying most XML +properties as <strong>theme attributes</strong>.</p> + +<p>The Android L Developer Preview Support Library includes a <strong>color extraction</strong> +library that lets you automatically extract prominent colors from a bitmap image.</p>
\ No newline at end of file diff --git a/docs/html/preview/material/theme.jd b/docs/html/preview/material/theme.jd new file mode 100644 index 0000000..740bf56 --- /dev/null +++ b/docs/html/preview/material/theme.jd @@ -0,0 +1,102 @@ +page.title=Material Theme + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> +<h2>In this document</h2> +<ol> + <li><a href="#colorpalette">Customize the Colot Palette</a></li> + <li><a href="#statusbar">Customize the Status Bar</a></li> + <li><a href="#inheritance">Theme Individual Views</a></li> +</ol> +</div> +</div> + +<p>The new material theme provides:</p> + +<ul> + <li>System widgets that let you set their color palette</li> + <li>Touch feedback animations for the system widgets</li> + <li>Activity transition animations</li> +</ul> + +<p>You can customize the look of the material theme +according to your brand identity with a color palette you control. You can tint the action bar and +the status bar using theme attributes, as shown in Figure 1.</p> + +<div style="float:right;margin-left:25px;margin-top:-50px"> +<img src="{@docRoot}preview/material/images/ThemeColors.png" style="width:250px"/> +<p class="img-caption" style="margin-bottom:0px"> +<strong>Figure 1.</strong> Customizing the material theme.</p> +</div> + +<p>The system widgets have a new design and touch feedback animations. You can customize the +color palette, the touch feedback animations, and the activity transitions for your app.</p> + +<p>The material theme is defined as:</p> + +<ul> + <li><code>@android:style/Theme.Material</code> (dark version)</li> + <li><code>@android:style/Theme.Material.Light</code> (light version)</li> + <li><code>@android:style/Theme.Material.Light.DarkActionBar</code></li> +</ul> + +<p>For a list of material styles that you can use, see the API reference for +<code>android.R.style</code>.</p> + +<p class="note"> +<strong>Note:</strong> The material theme is only available in the Android L Developer Preview. +For more information, see <a href="{@docRoot}preview/material/compatibility.html">Compatibility</a>. +</p> + + +<h2 id="colorpalette">Customize the Color Palette</h2> + +<p style="margin-bottom:30px">To customize the theme's base colors to fit your brand, define +your custom colors using theme attributes when you inherit from the material theme:</p> + +<pre> +<resources> + <!-- inherit from the material theme --> + <style name="AppTheme" parent="android:Theme.Material"> + <!-- Main theme colors --> + <!-- your app's branding color (for the app bar) --> + <item name="android:colorPrimary">@color/primary</item> + <!-- darker variant of colorPrimary (for status bar, contextual app bars) --> + <item name="android:colorPrimaryDark">@color/primary_dark</item> + <!-- theme UI controls like checkboxes and text fields --> + <item name="android:colorAccent">@color/accent</item> + </style> +</resources> +</pre> + + +<h2 id="statusbar">Customize the Status and Navigation Bar</h2> + +<p>The material theme lets you easily customize the status bar, so you can specify a +color that fits your brand and provides enough contrast to show the white status icons. To +set a custom color for the status bar, use the <code>android:statusBarColor</code> attribute when +you extend the material theme. By default, <code>android:statusBarColor</code> inherits the +value of <code>android:colorPrimaryDark</code>.</p> + +<p>To handle the color of the status bar yourself (for example, by adding a gradient in the +background), set the <code>android:statusBarColor</code> attribute to +<code>@android:color/transparent</code> and adjust the window flags as required. You can +also use the <code>Window.setStatusBarColor</code> method for animations or fading.</p> + +<p class="note"><strong>Note:</strong> +The status bar should almost always have a clear delineation from the primary toolbar, except for +full-bleed imagery cases and when you use a gradient as a protection. +</p> + +<p>When customizing the navigation and status bars, make them both transparent or modify only +the status bar. The navigation bar should remain black in all other cases.</p> + + +<h2 id="inheritance">Theme Individual Views</h3> + +<p>Elements in XML layout definitions can specify the <code>android:theme</code> attribute, +which references a theme resource. This attribute modifies the theme for the element and any +elements inflated below it, which is useful to alter theme color palettes in a specific portion +of an interface.</p>
\ No newline at end of file diff --git a/docs/html/preview/material/ui-widgets.jd b/docs/html/preview/material/ui-widgets.jd new file mode 100644 index 0000000..31604d6 --- /dev/null +++ b/docs/html/preview/material/ui-widgets.jd @@ -0,0 +1,198 @@ +page.title=UI Widgets + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> +<h2>In this document</h2> +<ol> + <li><a href="#recyclerview">RecyclerView</a></li> + <li><a href="#cardview">CardView</a></li> +</ol> +</div> +</div> + +<p>The support library in the Android L Developer Preview contains two new widgets, +<code>RecyclerView</code> and <code>CardView</code>. Use these widgets to show complex lists +and cards in your app. These widgets have material design style by default.</p> + + +<h2 id="recyclerview">RecyclerView</h2> + +<p><code>RecyclerView</code> is a more advanced and flexible version of <code>ListView</code>. +This widget is a container for large sets of views that can be recycled and scrolled very +efficiently. Use the <code>RecyclerView</code> widget when you have lists with elements that +change dynamically.</p> + +<p><code>RecyclerView</code> is easy to use, because it provides:</p> + +<ul> + <li>A layout manager for positioning items</li> + <li>Default animations for common item operations</li> +</ul> + +<p>You also have the flexibility to define custom layout managers and animations for this +widget.</p> + +<p>To use the <code>RecyclerView</code> widget, you have to specify an adapter and a layout +manager. To create an adapter, you extend the <code>RecyclerView.Adapter</code> class. The details +of the implementation depend on the specifics of your dataset and the type of views. For more +information, see the <a href="#rvexamples">examples</a> below.</p> + +<img src="/preview/material/images/RecyclerView.png" alt="" id="figure1" style="width:550px"/> +<p class="img-caption"> +Â <strong>Figure 1</strong> - The <code>RecyclerView</code> widget. +</p> + +<p>A <strong>layout manager</strong> positions item views inside a <code>RecyclerView</code> and +determines when to reuse item views that are no longer visible to the user. To reuse (or +<em>recycle</em>) a view, a layout manager may ask the adapter to replace the content of the +view with a different element from the dataset. Recycling views in this manner improves +performance by avoiding the creation of unnecessary views or performing expensive +<code>findViewById</code> lookups. +</p> + +<p><code>RecyclerView</code> provides <code>LinearLayoutManager</code>, which shows the items in a +vertical or horizontal scrolling list. To create a custom layout, you extend the +<code>RecyclerView.LayoutManager</code> class.</p> + +<h3>Animations</h3> + +<p>Animations for adding and removing items are enabled by default in <code>RecyclerView</code>. +To customize these animations, extend the <code>RecyclerView.ItemAnimator</code> class and use +the <code>RecyclerView.setItemAnimator</code> method.</p> + +<h3 id="rvexamples">Examples</h3> + +<p>To include a <code>RecyclerView</code> in your layout:</p> + +<pre> +<!-- A RecyclerView with some commonly used attributes --> +<android.support.v7.widget.RecyclerView + android:id="@+id/my_recycler_view" + android:scrollbars="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"/> +</pre> + +<p>To get the <code>RecyclerView</code> object in your activity:</p> + +<pre> +public class MyActivity extends Activity { + private RecyclerView mRecyclerView; + private RecyclerView.Adapter mAdapter; + private RecyclerView.LayoutManager mLayoutManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.my_activity); + mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); + + // improve performance if you know that changes in content + // do not change the size of the RecyclerView + mRecyclerView.setHasFixedSize(true); + + // use a linear layout manager + mLayoutManager = new LinearLayoutManager(this); + mRecyclerView.setLayoutManager(mLayoutManager); + + // specify an adapter (see also next example) + mAdapter = new MyAdapter(myDataset); + mRecyclerView.setAdapter(mAdapter); + } + ... +} +</pre> + +<p>To create a simple adapter:</p> + +<pre> +public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { + private String[] mDataset; + + // Provide a reference to the type of views that you are using + // (custom viewholder) + public static class ViewHolder extends RecyclerView.ViewHolder { + public TextView mTextView; + public ViewHolder(TextView v) { + super(v); + mTextView = v; + } + } + + // Provide a suitable constructor (depends on the kind of dataset) + public MyAdapter(String[] myDataset) { + mDataset = myDataset; + } + + // Create new views (invoked by the layout manager) + @Override + public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, + int viewType) { + // create a new view + View v = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.my_text_view, null); + // set the view's size, margins, paddings and layout parameters + ... + ViewHolder vh = new ViewHolder(v); + return vh; + } + + // Replace the contents of a view (invoked by the layout manager) + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + // - get element from your dataset at this position + // - replace the contents of the view with that element + holder.mTextView.setText(mDataset[position]); + + } + + // Return the size of your dataset (invoked by the layout manager) + @Override + public int getItemCount() { + return mDataset.length; + } +} +</pre> + + +<h2 id="cardview">CardView</h2> + +<p><code>CardView</code> extends the <code>FrameLayout</code> class and lets you show information +inside cards that have a consistent look on any app. <code>CardView</code> widgets can have +shadows and rounded corners.</p> + +<p>To create a card with a shadow, use the <code>android:elevation</code> attribute. +<code>CardView</code> uses real elevation and dynamic shadows +and falls back to a programmatic shadow implementation on earlier versions. For more information, +see <a href="{@docRoot}preview/material/compatibility.html">Compatibility</a>.</p> + +<p>Here's how to specify properties of <code>CardView</code>:</p> + +<ul> + <li>To set the corner radius in your layouts, use the <code>android:cardCornerRadius</code> + attribute.</li> + <li>To set the corner radius in your code, use the <code>CardView.setRadius</code> method.</li> + <li>To set the background color of a card, use the <code>android:cardBackgroundColor</code> +attribute.</li> +</ul> + +<p>To include a <code>CardView</code> in your layout:</p> + +<pre> +<!-- A CardView that contains a TextView --> +<android.support.v7.widget.CardView + xmlns:card_view="http://schemas.android.com/apk/res-auto" + android:id="@+id/card_view" + android:layout_gravity="center" + android:layout_width="200dp" + android:layout_height="200dp" + card_view:cardCornerRadius="4dp"> + + <TextView + android:id="@+id/info_text" + android:layout_width="match_parent" + android:layout_height="match_parent" /> +</android.support.v7.widget.CardView> +</pre>
\ No newline at end of file diff --git a/docs/html/preview/material/videos/ContactsAnim.mp4 b/docs/html/preview/material/videos/ContactsAnim.mp4 Binary files differnew file mode 100644 index 0000000..073f9dc --- /dev/null +++ b/docs/html/preview/material/videos/ContactsAnim.mp4 diff --git a/docs/html/preview/material/videos/ContactsAnim.ogv b/docs/html/preview/material/videos/ContactsAnim.ogv Binary files differnew file mode 100644 index 0000000..c5e751b --- /dev/null +++ b/docs/html/preview/material/videos/ContactsAnim.ogv diff --git a/docs/html/preview/material/videos/ContactsAnim.webm b/docs/html/preview/material/videos/ContactsAnim.webm Binary files differnew file mode 100644 index 0000000..2a15ff5 --- /dev/null +++ b/docs/html/preview/material/videos/ContactsAnim.webm diff --git a/docs/html/preview/material/views-shadows.jd b/docs/html/preview/material/views-shadows.jd new file mode 100644 index 0000000..f7682f5 --- /dev/null +++ b/docs/html/preview/material/views-shadows.jd @@ -0,0 +1,95 @@ +page.title=Views and Shadows + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> +<h2>In this document</h2> +<ol> + <li><a href="#elevation">View Elevation</a></li> + <li><a href="#shadows">Shadows and Outlines</a></li> + <li><a href="#clip">Clipping Views</a></li> +</ol> +</div> +</div> + +<p>The elevation of a view determines the size of its shadow: +views with higher Z values cast bigger shadows. Views only cast shadows on the Z=0 plane under an +orthographic projection (the views do not scale for different values of Z).</p> + +<p>Elevation is also useful to create animations where widgets temporarily rise above the +view plane when performing some action.</p> + + +<h2 id="elevation">View Elevation</h2> + +<p>The Z value for a view has two components, elevation and translation. The elevation is the +static component, and the translation is used for animations:</p> + +<p><code>Z = elevation + translationZ</code></p> + +<p>To set the elevation of a view:</p> + +<ul> + <li>In a layout definition, use the <code>android:elevation</code> attribute.</li> + <li>In the code of an activity, use the <code>View.setElevation</code> method.</li> +</ul> + +<p>To set the translation of a view, use the <code>View.setTranslationZ</code> method.</p> + +<p>The new <code>ViewPropertyAnimator.z</code> and <code>ViewPropertyAnimator.translationZ</code> +methods enable you to easily animate the elevation of views. For more information, see +the API reference for <code>ViewPropertyAnimator</code> and the <a +href="{@docRoot}guide/topics/graphics/prop-animation.html#object-animator">Property Animation</a> +developer guide.</p> + +<p>The Z values are measured in the same units as the X and Y values.</p> + + +<h2 id="shadows">Shadows and Outlines</h2> + +<p>The bounds of a view's background drawable determine the default shape of its shadow. +<strong>Outlines</strong> represent the outer shape of a graphics object and define the ripple +area for touch feedback.</p> + +<p>For example, if you define a view with a background drawable:</p> + +<pre> +<TextView + android:id="@+id/myview" + ... + android:elevation="2dp" + android:background="@drawable/myrect" /> +</pre> + +<p>where the background drawable is defined as a rectangle with rounded corners:</p> + +<pre> +<!-- res/drawable/myrect.xml --> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <solid android:color="#42000000" /> + <corners android:radius="5dp" /> +</shape> +</pre> + +<p>Then this view and drawable cast the appropiate shadow.</p> + +<p>You can also create outlines in your code using the methods in the <code>Outline</code> class, +and you can assign them to views with the <code>View.setOutline</code> method.</p> + +<p>To prevent a view from casting a shadow, set its outline to <code>null</code>.</p> + + +<h2 id="clip">Clipping Views</h2> + +<p>Clip a view to its outline area using the +<code>View.setClipToOutline</code> method. Only rectangle, circle, and round rectangle outlines +support clipping, as determined by the <code>Outline.canClip</code> method.</p> + +<p>To clip a view to the shape of a drawable, set the drawable as the background of the view +(as shown above) and call the <code>View.setClipToOutline</code> method.</p> + +<p>Because clipping views is an expensive operation, don't animate the shape you use to +clip a view. To achieve this effect, use a <a +href="{@docRoot}preview/material/animations.html#reveal">Reveal Effect</a> animation.</p>
\ No newline at end of file diff --git a/docs/html/preview/preview_toc.cs b/docs/html/preview/preview_toc.cs new file mode 100644 index 0000000..a292146 --- /dev/null +++ b/docs/html/preview/preview_toc.cs @@ -0,0 +1,101 @@ +<ul id="nav"> + + + <li class="nav-section"> + <div class="nav-section-header empty"><a href="<?cs var:toroot ?>preview/setup-sdk.html">Set up the SDK + </a></div> + </li> + <li class="nav-section"> + <div class="nav-section-header empty"><a href="<?cs var:toroot ?>preview/api-overview.html">API Overview + </a></div> + </li> + <li class="nav-section"> + + <div class="nav-section-header"><a href="<?cs var:toroot ?>preview/material/index.html">Material Design + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>preview/material/get-started.html">Get Started</a></li> + <li><a href="<?cs var:toroot ?>preview/material/theme.html">Material Theme</a></li> + <li><a href="<?cs var:toroot ?>preview/material/ui-widgets.html">UI Widgets</a></li> + <li><a href="<?cs var:toroot ?>preview/material/views-shadows.html">Views and Shadows</a></li> + <li><a href="<?cs var:toroot ?>preview/material/animations.html">Animations</a></li> + <li><a href="<?cs var:toroot ?>preview/material/compatibility.html">Compatibility</a></li> + </ul> + </li> + + <li class="nav-section"> + <div class="nav-section-header"> + <a href="<?cs var:toroot ?>preview/tv/index.html">TV</a> + </div> + <ul> + <li><a href="<?cs var:toroot ?>preview/tv/start/index.html"> + Get Started</a></li> + <li class="nav-section"> + <div class="nav-section-header"> + <a href="<?cs var:toroot ?>preview/tv/design/index.html"> + Design</a></div> + <ul> + <li><a href="<?cs var:toroot ?>preview/tv/design/principles.html"> + Creative Vision</a></li> + <li><a href="<?cs var:toroot ?>preview/tv/design/patterns.html"> + UI Patterns</a></li> + <li><a href="<?cs var:toroot ?>preview/tv/design/style.html"> + Style</a></li> + </ul> + </li> + <li class="nav-section"> + <div class="nav-section-header"> + <a href="<?cs var:toroot ?>preview/tv/ui/index.html"> + User Interface</a></div> + <ul> + <li><a href="<?cs var:toroot ?>preview/tv/ui/layouts.html"> + Layouts</a></li> + <li><a href="<?cs var:toroot ?>preview/tv/ui/navigation.html"> + Navigation</a></li> + <li><a href="<?cs var:toroot ?>preview/tv/ui/browse.html"> + BrowseFragment</a></li> + <li><a href="<?cs var:toroot ?>preview/tv/ui/details.html"> + DetailsFragment</a></li> + <li><a href="<?cs var:toroot ?>preview/tv/ui/in-app-search.html"> + In-App Search</a></li> + <li><a href="<?cs var:toroot ?>preview/tv/ui/recommendations.html"> + Recommendations</a></li> + </ul> + </li> + <li><a href="<?cs var:toroot ?>preview/tv/games/index.html"> + Games on TV</a></li> + <li><a href="<?cs var:toroot ?>preview/tv/start/hardware-features.html"> + Hardware Features</a></li> + <li><a href="<?cs var:toroot ?>preview/tv/adt-1/index.html"> + ADT-1</a></li> + </ul> + </li> + + <li class="nav-section"> + <div class="nav-section-header empty"> + <a href="<?cs var:toroot ?>preview/samples.html">Samples</a> + </div> + </li> + <li class="nav-section"> + <div class="nav-section-header empty"> + + <a href="<?cs var:toroot ?>preview/reference.html">Reference</a> + + </div> + </li> + <li class="nav-section"> + <div class="nav-section-header empty"> + <a href="<?cs var:toroot ?>preview/support.html">Support</a> + </div> + </li> + <li class="nav-section"> + <div class="nav-section-header empty"> + <a href="<?cs var:toroot ?>preview/license.html">License Agreement</a> + </div> + </li> + <li class="nav-section" style="margin: 20px 0 0 3px;"> + <div class="nav-section-header paging-links empty"> + <a href="<?cs var:toroot ?>index.html" class="prev-page-link">Developer Home</a> + </div> + </li> +</ul> diff --git a/docs/html/preview/reference.jd b/docs/html/preview/reference.jd new file mode 100644 index 0000000..f70f7a2 --- /dev/null +++ b/docs/html/preview/reference.jd @@ -0,0 +1,13 @@ +page.title=Reference + +@jd:body + +<p>The reference documentation and API difference report are available as downloadable packages. +</p> + +<ul> + <li><a href="{@docRoot}preview/l-developer-preview-reference.zip">L + Developer Preview reference</a></li> + <li><a href="{@docRoot}preview/l-developer-preview-api-diff.zip">L + Developer Preview difference report</a></li> +</ul>
\ No newline at end of file diff --git a/docs/html/preview/samples.jd b/docs/html/preview/samples.jd new file mode 100644 index 0000000..635f49e --- /dev/null +++ b/docs/html/preview/samples.jd @@ -0,0 +1,248 @@ +page.title=Samples + +@jd:body + +<p>The following code samples are provided for the L Developer Preview. You can +download them with the Android SDK Manager.</p> + +<p>To import a downloaded project:<p> + +<div class="toggle-content closed"> +<p style="margin-top:5px"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" alt="" + />Using Android Studio</a></p> + + <div class="toggle-content-toggleme"> + + <ol> + <li>Unpack the downloaded project package.</li> + <li>In <a href="{@docRoot}sdk/installing/studio.html">Android Studio</a>, chose + <strong>File > Import Project</strong> and select the root folder of + the unpacked project. + <p>Android Studio may ask you to choose the type of project you are + importing. If it does, make sure to choose <strong>Import project from + external model</strong> and select the <strong>Gradle</strong> option. + </p> + </li> + </ol> + + </div> +</div> + +<p class="note"> + <strong>Note:</strong> At this time, the downloadable projects are designed + for use with Gradle and Android Studio. +</p> + + + + +<h3 id="BasicManagedProfile">BasicManagedProfile</h3> +<div class="figure" style="width:220px"> + <img src="{@docRoot}preview/images/BasicManagedProfile.png" + srcset="{@docRoot}preview/images/hun-BasicManagedProfile@2x.png 2x" + alt="" height="375" /> + <p class="img-caption"> + <strong>Figure 1.</strong> The BasicManagedProfile sample app. + </p> +</div> + +<p>This sample demonstrates how to create a managed profile. You can also:</p> +<ul> + <li>Enable or disable other apps, and set restrictions on them.</li> + <li>Configure intents to be forwarded between the primary account and the + managed profile.</li> + <li>Wipe all the data associated with the managed profile.</li> +</ul> + +<p class="note"><strong>Note:</strong> There can be only one managed profile on + a device at a time.</p> + +<h3 id="Camera2Basic">Camera2Basic</h3> + +<!-- +<div class="figure" style="width:220px"> + <img src="" srcset="@2x.png 2x" alt="" height="375" /> + <p class="img-caption"> + <strong>Figure n.</strong> Single sentence summarizing the figure. + </p> +</div> +--> + +<p>This sample demonstrates the basic use of the Camera2 API. The sample code +demonstrates how you can display camera preview and take pictures.</p> + + + +<h3 id="Camera2Video">Camera2Video</h3> +<!-- +<div class="figure" style="width:220px"> +<img src="" srcset="@2x.png 2x" alt="" height="375" /> + <p class="img-caption"> + <strong>Figure n.</strong> Single sentence summarizing the figure. + </p> +</div> +--> +<p>This sample demonstrates how to record video using the Camera2 API.</p> + + +<h3 id="ActivitySceneTransitionBasic">ActivitySceneTransitionBasic</h3> +<div class="figure" style="width:220px"> + <img src="{@docRoot}preview/images/ActivitySceneTransitionBasic.png" + srcset="{@docRoot}preview/images/ActivitySceneTransitionBasic@2x.png 2x" + alt="" height="375" /> + <p class="img-caption"> + <strong>Figure 2.</strong> The ActivitySceneTransitionBasic sample app. + </p> + </div> + +<p> This sample demonstrates how to the use {@link android.app.Activity} scene +transitions when transitioning from one activity to another. Uses a combination +of <code>moveImage</code> and <code>changeBounds</code> to nicely transition +from a grid of images to an activity with a large image and detail text. </p> + + +<h3 id="ElevationBasic">ElevationBasic</h3> +<!-- +<div class="figure" style="width:220px"> +<img src="" srcset="@2x.png 2x" alt="" height="375" /> + <p class="img-caption"> + <strong>Figure n.</strong> Single sentence summarizing the figure. + </p> +</div> +--> +<p> +This sample demonstrates two alternative ways to move a view in the z-axis:</p> + +<ul> + <li>With a fixed elevation, using XML.</li> + <li>Raising the elevation when the user taps on it, using + <code>setTranslationZ()</code>.</li> +</ul> + + + +<h3 id="ElevationDrag">ElevationDrag</h3> +<!-- +<div class="figure" style="width:220px"> + <img src="" srcset="@2x.png 2x" alt="" height="375" /> + <p class="img-caption"> + <strong>Figure n.</strong> Single sentence summarizing the figure. + </p> +</div> +--> + +<p>This sample demonstrates a drag and drop action on different shapes. +Elevation and z-translation are used to render the shadows. The views are +clipped using different outlines.</p> + + + +<h3 id="ClippingBasic">ClippingBasic</h3> +<!-- +<div class="figure" style="width:220px"> + <img src="" srcset="@2x.png 2x" alt="" height="375" /> + <p class="img-caption"> + <strong>Figure n.</strong> Single sentence summarizing the figure. + </p> +</div> +--> +<p> +This sample demonstrates clipping on a {@link android.view.View}. +</p> + + + +<h3 id="GameControllerSample">GameControllerSample</h3> +<!-- +<div class="figure" style="width:220px"> + <img src="" srcset="@2x.png 2x" alt="" height="375" /> + <p class="img-caption"> + <strong>Figure n.</strong> Single sentence summarizing the figure. + </p> +</div> +--> +<p> +This sample implements a multi-player game, demonstrating game controller input +handling. +</p> + + + +<h3 id="Visual-Game-Controller">Visual-Game-Controller</h3> +<!-- +<div class="figure" style="width:220px"> + <img src="" srcset="@2x.png 2x" alt="" height="375" /> + <p class="img-caption"> + <strong>Figure n.</strong> Single sentence summarizing the figure. + </p> +</div> +--> +<p> +This sample displays events received from a game controller shown on the screen. +</p> + + + +<h3 id="AndroidTVLeanbackSample">AndroidTVLeanbackSample</h3> +<!-- +<div class="figure" style="width:220px"> + <img src="" srcset="@2x.png 2x" alt="" height="375" /> + <p class="img-caption"> + <strong>Figure n.</strong> Single sentence summarizing the figure. + </p> +</div> +--> +<p> +This sample demonstrates use of the Android TV Leanback Support Library. +</p> + + + +<h3 id="JobSchedulerSample">JobSchedulerSample</h3> + +<div class="figure" style="width:220px"> + <img src="{@docRoot}preview/images/JobSchedulerSample.png" + srcset="{@docRoot}preview/images/JobSchedulerSample@2x.png 2x" + alt="" height="375" /> + <p class="img-caption"> + <strong>Figure 3.</strong> The JobSchedulerSample sample app. + </p> +</div> + +<p> +This sample app allows the user to schedule jobs through the UI, and shows +visual cues when the jobs are executed. +</p> + + + +<h3 id="NavigationDrawerSample">NavigationDrawerSample</h3> +<!-- +<div class="figure" style="width:220px"> + <img src="" srcset="@2x.png 2x" alt="" height="375" /> + <p class="img-caption"> + <strong>Figure n.</strong> Single sentence summarizing the figure. + </p> +</div> +--> +<p> +This sample illustrates a common usage of the Android support library's +{@link android.support.v4.widget.DrawerLayout} widget. +</p> + + +<!-- +<h3 id="">SampleName</h3> + +<div class="figure" style="width:220px"> + <img src="" srcset="@2x.png 2x" alt="" height="375" /> + <p class="img-caption"> + <strong>Figure n.</strong> Single sentence summarizing the figure. + </p> +</div> + +<p> +**description** +</p> +--> diff --git a/docs/html/preview/setup-sdk.jd b/docs/html/preview/setup-sdk.jd new file mode 100644 index 0000000..876b348 --- /dev/null +++ b/docs/html/preview/setup-sdk.jd @@ -0,0 +1,144 @@ +page.title=Setting Up the Preview SDK +@jd:body + +<p>The Preview SDK is available from the Android SDK Manager. <!-- Not yet! --> +This document assumes that you are familiar with Android app development, such +as using the Android SDK Manager and creating projects. If you're new to +Android, see <a href="/training/basics/firstapp/index.html">Building Your First +App</a> training lesson first.</a></p> + +<h2 id="downloadSdk">Download the SDK</h2> + +<ol> + <li>Start the Android SDK Manager.</li> + <li>In the <b>Tools</b> section, select the latest Android <b>SDK Tools</b>, + <b>Platform-tools</b>, and <b>Build-tools</b>.</li> + <!-- Android L not yet showing up in Android SDK Manager... --> + <li>Select everything under the <b>Android L Developer Preview</b> section and + click <b>Install packages...</b></li> + <li>Accept the Licensing Agreement for all of the packages and click + <b>Install</b>.</li> +</ol> + +<p class="note"><strong>Note:</strong> The Eclipse ADT plug-in requires Java 7 +if your compilation target is the L developer preview.</p> + +<h2 id="setupHardware">Set Up Hardware and AVDs</h2> + +<p>The Android L developer preview provides you with 32-bit system images +to flash the following devices: +</p> + +<ul> + <li>Nexus 5</li> + <li>Nexus 7 Wi-Fi (version 2, released in 2013)</li> +</ul> + +<p>In addition, you also get the emulator system images, which includes +experimental 64-bit system images along with standard 32-bit system images. +</p> + +<h3 id="installImage">Install the L Preview System Image</h3> + +<p class="warning"><b>Warning:</b> This is a preview version of the Android +system image, and is subject to change. Your use of this system image is +governed by the Android SDK Preview License Agreement. The Android preview +system image is not a stable release, and may contain errors and defects that +can result in damage to your computer systems, devices, and data. The preview +Android system image is not subject to the same testing as the factory OS and +can cause your phone and installed services and applications to stop working. +</p> + + +<ol> + <li>Download and uncompress the Android Developer Preview package. + <p class="table-caption" id="table1"> + <strong>Table 1.</strong> L Developer Preview system images.</p> + <table> + <tr> + <th scope="col">Device</th> + <th scope="col">Download</th> + <th scope="col">MD5 Checksum</th> + <th scope="col">SHA-1 Checksum</th> + </tr> + <tr id="hammerhead"> + <td>Nexus 5 (GSM/LTE) "hammerhead"</td> + <td><!-- TODO --></td> + <td><code>5a6ae77217978cb7b958a240c2e80b57</code></td> + <td><code>ac1d8a8e4f4a1dca5864dc733caa940bffc28616</code></td> + </tr> + <tr id="razor"> + <td>Nexus 7 (Wifi) "razor"</td> + <td><!-- TODO --></td> + <td><code>b293a5d3a4e07beabebcc0be85ad68a2</code></td> + <td><code>d0ddf8ce733ba2a34279cdff8827fd604762c2342d</code></td> + </tr> + </table> + </li> + + <li>Follow the instructions at + <a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a> + to flash the image onto your device.</li> +</ol> + +<h3 id="revertDevice">Revert a Device to Factory Specifications</h3> + + <p>If you want to uninstall the L Preview and revert the device to factory +specifications, go to <a href="http://developers.google.com/android +/nexus/images">developers.google.com/android</a> and download the image you want +to flash to for your device. Follow the instructions on that page to flash the +image to your device.</p> + +<h3 id="setupAVD">Set up an AVD</h3> + +<p>You can set up <a href="{@docRoot}tools/devices/">Android Virtual Devices +(AVD)</a> and use the emulator to build and test apps with the L Preview.</p> + +<p>To create an AVD with the AVD Manager:</p> + +<ol> + <li>Install the L Preview SDK in your development environment, as described + in <a href="{@docRoot}preview/setup-sdk.html">Setting Up the Preview + SDK.</a></li> + <li>Follow the steps in + <a href="{@docRoot}tools/devices/managing-avds.html">Managing AVDs with AVD + Manager</a>. Use the following settings: + <ul> + <li><b>Device:</b> Either Nexus 5 or Nexus 7</li> + <li><b>Target:</b> <!-- Confirm exact text when we have final distro --> + Android L (Preview) - API Level L</li> + </ul> + <!-- Confirm this works when you can download image through SDK manager! --> + </li> +</ol> + +<h2 id="createProject">Create a Project</h2> + +<p>Android Studio makes it easy to create a project for the L Developer Preview. Follow +the steps described in <a href="{@docRoot}sdk/installing/create-project.html">Creating a +Project</a>. In the <strong>Form Factors</strong> screen:</p> + +<ul> + <li>Check <strong>Phone and Tablet</strong>.</li> + <li>Select <strong>API 20+: Android L (Preview)</strong> in <strong>Minimum SDK</strong>.</li> +</ul> + +<p>On the development environment, open the <code>build.gradle</code> file for your module +and make sure that:</p> + +<ul> + <li><code>compileSdkVersion</code> is set to <code>'android-L'</code></li> + <li><code>minSdkVersion</code> is set to <code>'L'</code></li> + <li><code>targetSdkVersion</code> is set to <code>'L'</code></li> +</ul> + +<p>To use the material theme, open the <code>values/styles.xml</code> in your project and make +sure that you theme extends the material theme:</p> + +<pre> +<resources> + <style name="AppTheme" parent="android:Theme.Material"> + <!-- Customize your theme here --> + </style> +</resources> +</pre> diff --git a/docs/html/preview/support.jd b/docs/html/preview/support.jd new file mode 100644 index 0000000..8efc4bc --- /dev/null +++ b/docs/html/preview/support.jd @@ -0,0 +1,108 @@ +page.title=Support + +@jd:body + +<p>If you've encountered bugs or have feedback about the L Developer Preview, +<a href="https://code.google.com/p/android-developer-preview/">create an issue</a> on +our issue tracker.</p> + +<p>For more support, +<a href="https://plus.google.com/communities/113159138894928487684">join +the L Developer Preview Google+ community</a> to discuss your development experiences. + + +<h2 id="ReleaseNotes">Release Notes</h2> +<p>June 25, 2014 - Initial Release of the L Developer Preview</p> + +<h3 id="UserInterface">User interface</h3> +<ul> +<li>If your app launches an activity with +{@link android.app.Activity#startActivity startActivity()} +and an {@link android.content.Intent} set to +{@link android.content.Intent#FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET}, the +activity shows up as a separate task in the Recent apps screen. This is the +same behavior as though your app used {@code Intent.FLAG_ACTIVITY_NEW_DOCUMENT} +(see <a href="{@docRoot}preview/api-overview.html#Recents">Concurrent +documents and activities in the Recents screen</a>). If you want your activity +to remain in the same task that launched it, use +{@link android.app.Activity#startActivityForResult +startActivityForResult()} instead.</li> +<li>System-rendered shadows for user interface (UI) elements in views may +appear with visible spiky edges. To avoid this visual artifact, use a higher +<a href="{@docRoot}preview/material/views-shadows.html#elevation">view +elevation</a>.</li> +<li>On very tall or wide views, view shadows may appear with additional rough +visual artifacts around the view edges. To minimize this, avoid using view +shadows with very narrow views.</li> +<li>The {@code android.graphics.drawable.RippleDrawable} class does not +respond to pointer location changes, except when the drawable is set as a +{@link android.view.View} background.</li> +</ul> + +<h3 id="Multimedia">Multimedia</h3> +<ul> +<li>The {@code android.hardware.camera2} APIs are supported only on Nexus 5 +devices.</li> +<li>Saving a DNG file with the new {@code android.hardware.camera2.DngCreator} +API fails if lens shading compensation map generation is not enabled. To +capture images to DNG files, add the following code when creating your capture +requests: +<pre> +CaptureRequest.Builder stillCaptureRequest = + mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); + +stillCaptureRequest.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE, + CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON); +</pre></li> +<li>The {@code android.media.AudioTrack.write(float[], int, int, int)} method +currently does not work. Use the +{@link android.media.AudioTrack#write(short[], int, int) +AudioTrack.write(short[], int, int)} method instead.</li> +<li>Lockscreen security is currently not enforced when users start a Android +mirroring session from the Quick Settings shade.</li> +</ul> + +<h3 id="UserInput">User input</h3> +<ul><li>The System UI may crash unexpectedly while the device is charging, if + the locale is set to {@code fr} (FRENCH).</li></ul> + +<h3 id="Wireless">Wireless and Connectivity</h3> +<ul> +<li>The {@code android.bluetooth.le} APIs are supported only on Nexus 5 +devices.</li> +<li>You might encounter these issues while using Bluetooth LE scanning: + <ul> + <li><em>Settings</em> does not show all Bluetooth LE devices when a scan + filter is set.</li> + <li>System returns non-intuitive error messages during a Bluetooth LE scan, + when Bluetooth is off.</li> + <li>The {@code BluetoothLeScanner.startScan()} method starts failing after + six concurrent scans with different callbacks.</li> + </ul> +</li> +<li>You might encounter these issues while using Bluetooth LE advertising: + <ul> + <li>The device MAC address does not change for multiple advertising + when the application processor is asleep.</li> + <li>The TX Power Level is always 0 in advertising packets.</li> + </ul> +</li> +</ul> + +<h3 id="Enterprise">Enterprise</h3> +<ul> +<li>The device may crash unexpectedly in these situations when using +Android work functionality: +<ul> +<li>The user attempts to share a web page (via <strong>Menu > Share</strong>) +from a non-Android work Chrome app to a Android work profile Gmail app.</li> +<li>The user attempts to share a web page via Bluetooth from a +Android work profile +Chrome app.</li> +<li>The user attempts to share a web page via Android Beam from a +Android work profile Chrome app.</li> +</ul> +</li> +<li>Deleting a Android work profile may take several minutes to complete. You +cannot create a new Android work profile until the deletion operation is over.</li> +</ul> diff --git a/docs/html/preview/tv/adt-1/index.jd b/docs/html/preview/tv/adt-1/index.jd new file mode 100644 index 0000000..d83dd11 --- /dev/null +++ b/docs/html/preview/tv/adt-1/index.jd @@ -0,0 +1,282 @@ +page.title=ADT-1 Developer Kit +page.tags="emote","e-mote","adt" + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + <h2>In this document</h2> + <ol> + <li><a href="#faq">Frequently Asked Questions</a> + <ol> + <li><a href="#setup">Device Setup</a></li> + <li><a href="#input">User Input</a></li> + <li><a href="#cast">Google Cast</a></li> + <li><a href="#trouble">Troubleshooting</a></li> + </ol> + </li> + <li><a href="#emote">Android TV Remote Control App</a></li> + <li><a href="#reg-safety">Regulatory Disclosures and Safety</a></li> + </ol> +</div> +</div> + +<p>The ADT-1 Developer Kit is a streaming media player and game controller designed for running +and testing apps built for Android TV. Supplies of ADT-1 are limited and it is intended for +developers who are interested in building new apps or extending their existing apps to run on the +Android TV platform.</p> + +<p class="note"> + <strong>Note:</strong> The ADT-1 kit <em>is not required</em> for building and testing apps + for Android TV. You can build apps for TV and test them using an emulator for TV devices. The + L Developer Preview includes all the software needed to build TV apps and an emulator for running + and testing them. For more information, see the + <a href="{@docRoot}preview/tv/start/index.html">Get Started</a> guide for TV apps. +</p> + +<h2 id="faq">ADT-1 Frequently Asked Questions</h2> + +<p>The following information is provided to help set up and use the ADT-1 device.</p> + + +<h3 id="setup">Device Setup</h3> + +<p> + <strong>How do I turn my device on?</strong> +</p> +<p>Plug the included power cable into the back of ADT-1. The device does not have an on/off + switch.</p> + +<p> + <strong>How do I completely turn my device off? </strong> +</p> +<p>Unplug the included power cable from the back of ADT-1. The device does not have an on/off + switch. However, ADT-1 will begin sleeping (daydream) based on user settings in + <strong>Settings > Display > Daydream</strong>. + </p> + +<p> + <strong>How do I connect to the network?</strong> +</p> +<p>ADT-1 has both wireless and Ethernet for connecting to your network. To change your wireless + network, go to <strong>Settings -> Wi-Fi</strong>. To use an Ethernet network connection, + simply plug an Ethernet cable (that is connected to your network) into the port on the back of + ADT-1.</p> + +<p> + <strong>How do I use the developer cable?</strong> +</p> +<p>The developer cable has three connectors: a small, male power connector that plugs into the + power port on the back of ADT-1, a standard male USB-A connector that connects your PC, and a + small, female power connector that the included power supply plugs into.</p> + + + +<h3 id="input">User Input</h3> + +<p> + <strong>How do I put the gamepad that came with my ADT-1 into pairing mode?</strong> +</p> +<p>Press and hold the Back and Home buttons together for about three seconds, until all four + blue LEDs flash together. When the LEDs are flashing, the gamepad is in pairing mode.</p> + +<p> + <strong>How do I use the gamepad with the on-screen keyboard?</strong> +</p> +<p>Use the D-pad or left joystick to move the cursor, and press A to select. Press X to delete a + character, and press Y to insert a space. Also, you can press the right joystick to toggle caps + lock, and press the left joystick to show additional symbols.</p> + +<p> + <strong>Can I control ADT-1 with my phone or tablet?</strong> +</p> +<p>Yes. In order to control the ADT-1 with Android phones or tablets, you can download a remote + control app from the Google Play store. For more information, see <a href="#emote">Android TV + Remote Control App</a>. + </p> + +<p> + <strong>Can I connect a USB keyboard or mouse to ADT-1?</strong> +</p> +<p>Yes, you can connect a USB keyboard or mouse to the USB port on the back of ADT-1. + +<p class="note"> + <strong>Note:</strong> The ADT-1 device is not compatible with all manufacturers and models of + these devices. If a particular keyboard or mouse does not work, try a different model. +</p> + +<p> + <strong>How do I connect a Bluetooth device without an input device already attached?</strong> +</p> +<p>You can put ADT-1 into Bluetooth pairing mode using a hardware button. Press the small, round + button on the back of ADT-1 to make it search for Bluetooth devices in pairing mode. If multiple + accessories are found, press the small, round button to select the device you want to pair. + Pairing will happen automatically after a few seconds. +</p> + +<p> + <strong>How do I connect additional Bluetooth accessories?</strong> +<p> +<p>To pair Bluetooth devices to ADT-1 from the user interface, go to <strong>Settings > + Remote & Accessories > Add accessory</strong> + + +<h3 id="cast">Google Cast</h3> + +<p> + <strong>Can I cast to an ADT-1 device?</strong> +<p> +<p>Yes. The ADT-1 includes Google Cast receiver functionality, similar to Chromecast. Since the + ADT-1 is a developer device running a development software release, the Google Cast receiver is + open only to a limited number of apps.</p> + +<p> + <strong>Which Cast apps are supported on ADT-1?</strong> +<p> +<p>As a developer device, the ADT-1 supports casting from only the following apps/websites:</p> + +<ul> + <li>YouTube</li> + <li>Netflix</li> + <li>Google+ Photos</li> + <li>Google Play Movies and TV (Android only)</li> +</ul> + +<p>Coming soon:</p> + +<ul> + <li>Google Play Music</li> + <li>Google Play Movies and TV (iOS and Chrome)</li> + <li>Mirror you Android device screen to ADT-1</li> +</ul> + +<p class="note"> + <strong>Note:</strong> When casting from a Chrome browser, you must use Chrome V.36 or higher. + Chrome V.36 is available in beta-channel and is planned to be released soon. +</p> + +<p> + <strong>How do I cast to ADT-1?</strong> +<p> +<p>You cast to an ADT-1 device the same way you do with a Chromecast device. Open the supported + Cast apps or webpages, press the <strong>Cast</strong> button and you should see the ADT-1 as a + Cast target. For more infomation about on how to cast, see + <a href="http://www.google.com/intl/en/chrome/devices/chromecast/learn.html">Learn How to + Cast</a>. + </p> + +<p> + <strong>Will my Google Cast sender apps work on ADT-1 just like Chromecast?</strong> +<p> +<p>Yes. Your Cast app works on ADT-1 and Android TV products without additional work.<p> + +<p class="note"> + <strong>Note:</strong> Your iOS sender app requires the Google Cast iOS API version 2.2.1 + or later to work with the ADT-1 device. +</p> + +<p> + <strong>How do I register my ADT-1 in order to run my apps?</strong> +</p> +<ol> + <li>Go to <strong>Settings > Google Cast</strong> and turn on developer support, allowing the + ADT-1 device to send its serial number to Google.</li> + <li>Register your ADT-1 device in the Google Cast Developer Console, using the 12 character + serial number engraved on the back of the ADT-1.</li> +</ol> + +<p>For more Google Cast developer information, see the + <a href="https://developers.google.com/cast/">Cast developer site</a>. Please use the Google Cast + SDK <a href="https://code.google.com/p/google-cast-sdk/issues/list">issue tracker</a> for filing + issues related to Cast. Make sure you mention the ADT-1 device when filing an issue. +</p> + +<p> + <strong>How do I debug my Cast app on ADT-1?</strong> +</p> +<p>Connect your development platform using the power/USB cable, and using a Chrome browser, + navigate to <code>chrome://inspect/#devices</code> to debug the webview.</p> + + +<h3 id="trouble">Troubleshooting</h3> + +<p> + <strong>Why doesn't the on-screen keyboard come up?</strong> +</p> +<p>Enable the keyboard in the device Settings. Go to <strong>Settings > Keyboard > Current + keyboard</strong> and choose <strong>Leanback keyboard</strong>. + +<p> + <strong>How do I perform a hardware reboot?</strong> +</p> +<p>Locked it up, huh? No worries. We've done that a few times ourselves. Unplug and replug the + included power cable from the back of ADT-1 to reboot it. +</p> + +<p> + <strong>How do I perform a factory reset?</strong> +</p> +<p class="warning"> + <strong>Warning:</strong> This procedure removes all data from the device, including system + data, downloaded apps, app data, and account settings. +</p> + +<p>From the home screen, go to <strong>Settings > Device > Factory data reset</strong>, and + select <strong>Reset device</strong>. +</p> + +<p> + <strong>How do I perform a hardware reset?</strong> +</p> +<p class="warning"> + <strong>Warning:</strong> This procedure performs a factory data reset, removing all data from + the device, including system data, downloaded apps, app data, and account settings. +</p> + +<p>Unplug the power cable from the back of ADT-1. Press and hold the small, round button on the + back of ADT-1 as you re-insert the power cable, and continue to hold the small round button. The + LED will begin flashing red for a few seconds, then change to multi-color cycle. When the LED + starts the multi-color cycle, release the small, round button, and ADT-1 boots up. If you release + the button while the LED is flashing red, the device will be in Fastboot mode.</p> + +<p> + <strong>There is a hardware problem with my ADT-1. How do I return it?</strong> +</p> +<p>You can request a return of the device using the + <a href="https://support.google.com/googleplay/android-developer/contact/adt_rma">return + merchandise authorization form</a>. +</p> + + +<h2 id="emote">Android TV Remote Control App</h2> + +<div class="figure" style="width:250px;margin-top:0"> +<img src="/preview/tv/images/android-tv-remote.png" alt="Android TV Remote Screenshots"> +</div> + +<p>A remote control app is available for Android phones and tablets that allows you to interact + with the ADT-1 device. This app allows you to switch between D-pad input mode or touchpad mode + to navigate content and play games on a Android TV device. You can also tap the mic button to + start a voice search, or use the keyboard to input text using this app.</p> + +<p>You download the remote control app from the Google Play store using + <a href="https://play.google.com/store/apps/details?id=com.google.android.tv.remote">this + link</a>. +</p> + +<p class="note"> + <strong>Note:</strong> your Android ​phone or tablet must be connected to the same local network + as ADT-1. +</p> + + +<h2 id="reg-safety">Regulatory Disclosures and Safety Information</h2> + +<p>The ADT-1 device comes with important regulatory disclosures and safety information. Please +read this information before using the device:</p> + +<ul> + <li><a href="regulatory.html">Regulatory Disclosures</a></li> + <li><a href="safety.html">Important Safety Information</a></li> +</ul> + diff --git a/docs/html/preview/tv/adt-1/regulatory.jd b/docs/html/preview/tv/adt-1/regulatory.jd new file mode 100644 index 0000000..2f5bf7e --- /dev/null +++ b/docs/html/preview/tv/adt-1/regulatory.jd @@ -0,0 +1,79 @@ +page.title=Regulatory Disclosures for ADT-1 +parent.title=ADT-1 Developer Kit +parent.link=index.html + +@jd:body + +<p>Disclosures for the <a href="index.html">ADT-1</a> device.</p> + +<p> + Model: W2<br> + FCC ID: A4R-W2<br> + IC: 10395A-W2 +</p> + +<p>U.S. Federal Communications Commission Notices</p> +<p>To satisfy FCC and IC exposure requirements, a separation distance of at least 20 cm should + be maintained between the antenna of this device and persons during device operation. Operations + at closer than this distance are not recommended.</p> +<p>The antenna used for this transmitter must not be co-located in conjunction with any other + antenna or transmitter.</p> +<p>This equipment has been tested and found to comply with the limits for a Class B digital + device, pursuant to part 15 of the FCC Rules. These limits are designed to provide reasonable + protection against harmful interference in a residential installation. This equipment generates, + uses and can radiate radio frequency energy and, if not installed and used in accordance with the + instructions, may cause harmful interference to radio communications. However, there is no + guarantee that interference will not occur in a particular installation. If this equipment does + cause harmful interference to radio or television reception, which can be determined by turning + the equipment off and on, the user is encouraged to try to correct the interference by one or more + of the following measures:</p> +<p>—Reorient or relocate the receiving antenna.</p> +<p>—Increase the separation between the equipment and receiver.</p> +<p>—Connect the equipment into an outlet on a circuit different from that to which the receiver + is connected.</p> +<p>—Consult the dealer or an experienced radio/ TV technician for help.</p> +<p>This device complies with part 15 of the FCC Rules. Operation is subject to the following two + conditions: (1) This device may not cause harmful interference, and (2) this device must accept + any interference received, including interference that may cause undesired operation.</p> +<p>Changes or modifications not expressly approved by Google Inc. could void the user's + authority to operate the equipment.</p> +<p>Industry Canada Notices</p> +<p>This device complies with Industry Canada licence-exempt RSS standard(s). Operation is + subject to the following two conditions: (1) this device may not cause interference, and (2) this + device must accept any interference, including interference that may cause undesired operation of + the device.</p> +<p>Under Industry Canada regulations, this radio transmitter may only operate using an antenna + of a type and maximum (or lesser) gain approved for the transmitter by Industry Canada. To reduce + potential radio interference to other users, the antenna type and its gain should be so chosen + that the equivalent isotropically radiated power (e.i.r.p.) is not more than that necessary for + successful communication.</p> +<p>The radiated output power of the Wireless Device is below the Industry Canada (IC) radio + frequency exposure limits. The Wireless Device should be used in such a manner such that the + potential for human contact during normal operation is minimized.</p> + +<hr /> + +<p>CAN ICES-3 (B)/NMB-3(B)</p> +<p> + <u>Avis d’<em>Industrie Canada</em></u> +</p> +<p> + Le présent appareil est conforme aux <em>CNR</em> d'Industrie Canada applicables aux appareils + radio exempts de licence. L'exploitation est autorisée aux deux conditions suivantes : (1) + l'appareil ne doit pas produire de brouillage, et (2) l'appareil doit accepter tout brouillage + radioélectrique subi, même si le brouillage est susceptible d'en compromettre le fonctionnement. +</p> +<p> + En vertu de la règlementation d’<em>Industrie Canada</em>, cet émetteur radio peut + fonctionner avec une antenne d'un type et d'un gain maximal (ou inférieur) approuvé pour + l'émetteur par <em>Industrie Canada</em>. Dans le but de réduire les risques de brouillage + radioélectrique à l'intention des autres utilisateurs, il faut choisir le type d'antenne et son + gain de sorte que la puissance isotrope rayonnée équivalente (p.i.r.e.) ne dépasse pas l'intensité + nécessaire à l'établissement d'une communication satisfaisante. +</p> +<p> + La puissance rayonnée en sortie de l'appareil sans fil est inférieure aux limites fixées par + <em>Industrie Canada</em> en matière d'exposition aux radiofréquences. L'appareil sans fil + doit être utilisé de sorte que la possibilité d'un contact humain pendant le fonctionnement + normal soit limitée. +</p> diff --git a/docs/html/preview/tv/adt-1/safety.jd b/docs/html/preview/tv/adt-1/safety.jd new file mode 100644 index 0000000..1984853 --- /dev/null +++ b/docs/html/preview/tv/adt-1/safety.jd @@ -0,0 +1,140 @@ +page.title=Important Safety Instructions for ADT-1 +parent.title=ADT-1 Developer Kit +parent.link=index.html + +@jd:body + +<p>Safety information for the <a href="index.html">ADT-1</a> device.</p> + +<p> + <strong>WARNING:</strong> Read all safety information below before using this device to avoid + injury. +</p> +<ul> + <li><p>Do not install near heat sources, such as heaters and other devices.</p></li> + <li><p>Use in a well-ventilated area and plug power adapter into an easily accessible + outlet. Only use this device with the provided power adapter.</p></li> + <li><p>The device has no on/off switch. To disconnect from power, you must unplug the + power adapter.</p></li> + <li><p>Only use indoors and do not expose to rain, liquid, moisture, excessive heat, or + naked flame.</p></li> + <li><p>Clean only with a dry cloth.</p></li> +</ul> +<p> + <strong>WARNING:</strong> Playing video games has been linked to injuries in some + users. Read all safety and health information below before using the gamepad to avoid possible + injury. +</p> + +<p><u>Photosensitive Seizures</u></p> + +<p> + A very small percentage of people may experience a seizure when exposed to certain visual images, + including flashing lights or patterns that may appear in some video games, even people who have no + history of seizures or epilepsy. These seizures have a variety of symptoms, including + lightheadedness, altered vision, disorientation, loss of awareness, involuntary movements, loss of + consciousness, or convulsions. If you experience any of these symptoms, <u>stop gaming + immediately and consult your doctor</u>. +</p> + +<p><u>Ergonomics</u></p> + +<p>Long periods of repetitive motion using incorrect body positioning may be associated with + physical discomfort and injuries to nerves, tendons, and muscles. If during or after gaming you + feel pain, numbness, weakness, swelling, burning, cramping, or stiffness, <u>stop gaming + and consult your doctor</u>. + +<p> + <strong>Healthy Gaming</strong> +</p> + +<p>To reduce risk of seizures or injury, take the following precautions:</p> + +<ul> + <li><p>Sit as far away from the TV screen as possible.</p></li> + <li><p>Play in a well-lit room.</p></li> + <li><p>Do not play when you are drowsy or fatigued.</p></li> + <li><p>Take 10-15 minute breaks every hour if playing video games and avoid prolonged + gaming.</p></li> +</ul> + +<p> + <strong>Do Not Attempt Repairs Yourself</strong> +</p> + +<p>There are no user-serviceable parts inside. Do not attempt to open or disassemble.</p> + +<p>Failure to follow these safety instructions could result in fire, electric shock, damage to + the device or other property, or personal injury.</p> + +<hr /> + +<p> + <strong>Importantes instructions concernant la sécurité</strong> +</p> + +<p> + <strong>ATTENTION:</strong> Veuillez lire toutes les informations de sécurité énoncées ci-bas + avant d’utiliser l’appareil pour éviter des blessures. +</p> + +<ul> + <li><p>Ne pas installer à proximité d’une source de chaleur telle une chaufferette ou un + autre appareil similaire.</p></li> + <li><p>Utiliser dans un endroit bien aéré et brancher l’adaptateur électrique dans une + prise de courant facilement accessible.</p></li> + <li><p>L’appareil ne possède aucun interrupteur marché/arrêt. Pour mettre l’appareil hors + tension, il faut débrancher l’appareil de la prise de courant.</p></li> + <li><p>Utiliser l’appareil uniquement à l’intérieur et ne pas l’exposer à la pluie, à des + substances liquides, à l’humidité, à la chaleur excessive ou à une flamme.</p></li> + <li><p>Nettoyer uniquement avec un linge sec.</p></li> +</ul> + +<p> + <strong>ATTENTION:</strong> Le fait de jouer à des jeux vidéo a été relié à des blessures chez certains + utilisateurs. Afin d’éviter de possibles blessures, veuillez lire toutes les informations + concernant la sécurité et la santé énoncées ci-bas avant d’utiliser la tablette de jeu. +</p> + +<p><u>Épilepsie photosensible</u></p> + +<p>L’exposition à certaines images visuelles, incluant les lumières ou motifs clignotants qui + peuvent apparaître dans certains jeux vidéo, peut provoquer chez un très faible pourcentage de + personnes une crise d’épilepsie, et ce, même si ces personnes n’ont aucun historique de crises ou + d’épilepsie. Ces crises comportent divers symptômes tels que des étourdissements, une vision + altérée, un sentiment de désorientation, la perte de conscience, des mouvements involontaires, la + perte de connaissance ou de conscience ou des convulsions. Si vous ressentez quelconque de ces + symptômes, <u>cessez de jouer immédiatement et consultez votre médecin</u>.</p> + +<p><u>Ergonomie</u></p> + +<p>Les longues périodes de mouvements répétitifs effectués dans une position corporelle + inadéquate peuvent mener à un inconfort physique et à des blessures aux nerfs, tendons et muscles. + Si durant ou après avoir joué à des jeux vidéo, vous ressentez de la douleur, de + l’engourdissement, une faiblesse, de l’inflammation, une sensation de brûlure, des crampes ou de + la rigidité, <u>cessez de jouer immédiatement et consultez votre médecin</u>.</p> + +<p> + <strong>Le jeu sécuritaire</strong> +</p> + +<p>Afin de réduire les risques de crises d’épilepsie ou de blessures, veuillez prendre les + précautions suivantes :</p> + +<ul> + <li>Asseyez-vous aussi loin de l’écran de télévision que possible.</li> + <li>Jouez dans une pièce munie d’un éclairage adéquat.</li> + <li>Ne jouez pas lorsque vous êtes étourdi ou fatigué.</li> + <li>Prenez 10 à 15 minutes de pause après chaque heure de jeu et évitez les périodes de jeu + prolongées.</li> +</ul> + +<p> + <strong>Ne pas tenter d’effectuer des réparations par vous-même</strong> +</p> + +<p>L’Appareil ne contient aucune pièce pouvant être réparée par l’utilisateur. Ne pas tenter + d’ouvrir ou de désassembler l’Appareil.</p> + +<p>Le défaut de suivre ces instructions de sécurité pourrait provoquer un feu, un choc + électrique, un dommage à l’Appareil ou à d’autres objets ou des lésions corporelles.</p> diff --git a/docs/html/preview/tv/design/images/apps-games-rows.jpg b/docs/html/preview/tv/design/images/apps-games-rows.jpg Binary files differnew file mode 100644 index 0000000..5023655 --- /dev/null +++ b/docs/html/preview/tv/design/images/apps-games-rows.jpg diff --git a/docs/html/preview/tv/design/images/atv-framed-med.png b/docs/html/preview/tv/design/images/atv-framed-med.png Binary files differnew file mode 100644 index 0000000..e06f6e7 --- /dev/null +++ b/docs/html/preview/tv/design/images/atv-framed-med.png diff --git a/docs/html/preview/tv/design/images/atv-home.jpg b/docs/html/preview/tv/design/images/atv-home.jpg Binary files differnew file mode 100644 index 0000000..4b25bab --- /dev/null +++ b/docs/html/preview/tv/design/images/atv-home.jpg diff --git a/docs/html/preview/tv/design/images/focus.png b/docs/html/preview/tv/design/images/focus.png Binary files differnew file mode 100644 index 0000000..df61f4d --- /dev/null +++ b/docs/html/preview/tv/design/images/focus.png diff --git a/docs/html/preview/tv/design/images/icon.png b/docs/html/preview/tv/design/images/icon.png Binary files differnew file mode 100644 index 0000000..ae34e18 --- /dev/null +++ b/docs/html/preview/tv/design/images/icon.png diff --git a/docs/html/preview/tv/design/images/overscan.png b/docs/html/preview/tv/design/images/overscan.png Binary files differnew file mode 100644 index 0000000..fb7e4bc --- /dev/null +++ b/docs/html/preview/tv/design/images/overscan.png diff --git a/docs/html/preview/tv/design/images/recommendations.png b/docs/html/preview/tv/design/images/recommendations.png Binary files differnew file mode 100644 index 0000000..942cd10 --- /dev/null +++ b/docs/html/preview/tv/design/images/recommendations.png diff --git a/docs/html/preview/tv/design/images/search.jpg b/docs/html/preview/tv/design/images/search.jpg Binary files differnew file mode 100644 index 0000000..c034939 --- /dev/null +++ b/docs/html/preview/tv/design/images/search.jpg diff --git a/docs/html/preview/tv/design/images/settings.jpg b/docs/html/preview/tv/design/images/settings.jpg Binary files differnew file mode 100644 index 0000000..1c5bf31 --- /dev/null +++ b/docs/html/preview/tv/design/images/settings.jpg diff --git a/docs/html/preview/tv/design/index.jd b/docs/html/preview/tv/design/index.jd new file mode 100644 index 0000000..b924a5c --- /dev/null +++ b/docs/html/preview/tv/design/index.jd @@ -0,0 +1,65 @@ +page.title=Design for TV +header.justLinks=1 +footer.hide=1 +@jd:body + + +<p>The Android TV platform user interface provides the launch pad for your app's big screen + experience. It's important to understand how your app is presented in the main user interface and + how your app can help users get to the content they want quickly.</p> + + +<h2>Home Screen</h2> + +<p>The Home Screen is the start of the user experience, providing search, content + recommendations, and access to apps and settings. This screen provides a rich and cinematic + overview of apps and content.</p> + +<img src="{@docRoot}preview/tv/design/images/atv-home.jpg" alt="TV Home screen" /> + + +<h2>Search</h2> + +<p>By bringing the power of Google search to the big screen, Android TV makes new, dynamic + connections between content. A favorite movie may lead to the discovery of a new music artist, + planning a trip to Paris might surface new YouTube content and photos.</p> + +<img src="{@docRoot}preview/tv/design/images/search.jpg" alt="Recommendations Row" /> + +<p>To learn more about searching within your app, see + <a href="{@docRoot}preview/tv/ui/in-app-search.html">Searching in TV Apps</a>. + +<h2>Recommendations</h2> + +<p>The recommendations row on Android TV is a central feature of the Home Screen that allows + users quick access to dynamic and relevant content for their media-consumption activities. The + row is optimized for quick browsing of personalized content and activity resumption (on the + device and across devices), while also providing a way for users to act on meaningful new + content.</p> + +<img src="{@docRoot}preview/tv/design/images/recommendations.png" alt="Recommendations Row" /> + +<p> + Recommendations are based on the user’s recent and frequent usage behaviors, as well as + expressed content preferences. They appear as cards that represent a system or app action, + notification, activity, or piece of actionable media. Your app can provide suggestions for the + recommendations row to help get your content noticed. To learn more, see + <a href="{@docRoot}preview/tv/ui/recommendations.html">Recommendations</a>. +</p> + + +<h2>Apps and Games</h2> + +<p>Apps and Games rows both have special areas on the Home Screen. Within their respective + areas, Apps and Games titles are ordered to reflect the user’s recent usage.</p> + +<img src="{@docRoot}preview/tv/design/images/apps-games-rows.jpg" alt="Apps and Games Rows" /> + + +<h2>Settings</h2> + +<p>Access to Settings is found at the bottom of the Home Screen. From here, the user can access + Android and device-specific settings. +</p> + +<img src="{@docRoot}preview/tv/design/images/settings.jpg" alt="Settings Row" /> diff --git a/docs/html/preview/tv/design/patterns.jd b/docs/html/preview/tv/design/patterns.jd new file mode 100644 index 0000000..cdba74c --- /dev/null +++ b/docs/html/preview/tv/design/patterns.jd @@ -0,0 +1,86 @@ +page.title=Patterns for TV +page.tags="design" +@jd:body + +<p>As a developer of apps for TV, you should follow certain patterns to enable users to + quickly understand and operate your app. This section describes recommended design patterns + for TV apps.</p> + +<h2>Navigation, Focus and Selection</h2> + +<p>Users typically navigate TV devices using a directional pad (D-Pad). This type of controller + limits movement to up, down, left, and right. As you design your app for TV, make sure your + user interface has clear paths for two-axis navigation by aligning objects in lists and + grids.</p> + +<img src="{@docRoot}preview/tv/design/images/focus.png" alt="TV navigation and focus diagram" /> + +<p>A key aspect of making your application work well with a D-Pad controller is to make sure + that there is always an object that is obviously in focus. Your app must clearly indicate + what object is focused, so users can easily see what action they can take. Use scale, shadow + brightness, opacity, animation or a combination of these attributes to help users see a focused + object.</p> + + +<h2>Icons</h2> + +<p>Apps on TV devices require some additional icon images for presentation in the system + user interface, including home screen launcher images (banners) and recommendation icons. + The visual specifications for these icons are shown below.</p> + + +<h3>Banners</h3> + +<p>App Banners represent your app on the home screen of TV devices and serve and as a way for + users to launch your app. Here are specific requirements for a banner image: +</p> + +<ul> + <li>Size: 320 x 180 px, xhdpi resource</li> + <li>Text should be included in the image. If your app is available in more than one + language, you must provide versions of the banner image for each supported language.</li> +</ul> + + +<h3>Recommendation Icons</h3> + +<p>Recommendation cards include a small icon that is imposed over a colored background. + An example and specifications for the this icon are shown below:</p> + +<img src="{@docRoot}preview/tv/design/images/icon.png" alt="Recommendation icon examples" /> + +<p>Here are the requirements for recommendation icons:</p> + +<ul> + <li>Monocolor: size 16x16dp, white (#fff) icon with transparent background, PNG format</li> + <li>Graphics should be centered within the icon image</li> +</ul> + +<p class="note"> + <strong>Note:</strong> Your app icon image may be desaturated and blended for some card + displays. +</p> + + +<h2>Background Images</h2> + +<p>Background images are displayed in the background of your app to provide additional visual + interest, information, or branding. The BrowseFragment and DetailsFragment classes in the Leanback + support library provide specific support for background images and for updating them as items gain + and lose focus. Here are the specific requirements for background images:</p> + +<ul> + <li>Full color, 1920 x 1080 pixels</li> +</ul> + +<p class="note"> + <strong>Note:</strong> If the image does not meet this requirement, it is scaled to fit. +</p> + +<h2>Audio Feedback</h2> + +<p>Sounds on Android TV bring a cinematic quality to the interaction experience. You should + consider adding sounds for user actions or to provide feedback when a user is only partially + visually engaged with the screen (e.g., because they are distracted or multitasking). + You should also consider using sounds as alternatives to visual messages, for example to indicate + that a user has reached the end of a list or is trying to navigate to an undefined location.</p> diff --git a/docs/html/preview/tv/design/principles.jd b/docs/html/preview/tv/design/principles.jd new file mode 100644 index 0000000..106fa96 --- /dev/null +++ b/docs/html/preview/tv/design/principles.jd @@ -0,0 +1,33 @@ +page.title=Creative Vision for TV +@jd:body + +<p>Users bring a specific set of expectations when watching TV, versus + interacting with a phone or tablet. These guidelines have been developed by the Android User + Experience Team to guide creation of the Android TV platform and the apps that run on it.</p> + +<h2>Casual Consumption</h2> + +<p>The TV is an entertainment interface, not a computer or mobile device. Optimize for + activities that put content at the center: from the casual posture of movie-watching, to + immersive gameplay, to hanging out with friends in a living room.</p> + +<p>Users expect immediate access to content when they turn on a TV. Get users into the action + fast, be it the big game, their favorite show, or a game with friends. The next piece of content + to watch or play should only be a click or two away.</p> + + +<h2>Cinematic Experience</h2> + +<p>Create immersive experiences for the user. Design for as little user interface and as much + content as possible on each screen. Use visual imagery, movement, and sound to inform and delight + users. Avoid using on-screen text to convey information and purpose. Tell your story with pictures + and sound.</p> + + +<h2>Simplicity</h2> + +<p>Android TV is simple and magical. It’s all about finding and enjoying content and + apps with the least amount of friction. Minimize the number of navigation steps required to + perform actions. Build apps with the fewest screens possible between app entry and content + immersion. Avoid making users enter text whenever possible, and use voice interfaces when you + require text input.</p> diff --git a/docs/html/preview/tv/design/style.jd b/docs/html/preview/tv/design/style.jd new file mode 100644 index 0000000..67a7096 --- /dev/null +++ b/docs/html/preview/tv/design/style.jd @@ -0,0 +1,101 @@ +page.title=Style for TV +page.tags="design" +@jd:body + + +<p>Follow these style guidelines to create beautiful, functional apps for TV.</p> + + +<h2>Layouts</h2> + +<p>The difference between a TV experience that feels right and one that does not greatly depends + on the number, spacing, and size of on-screen elements. Although TV sizes and resolutions have + steadily increased over time, users expect TV experiences to be relatively simple and + uncluttered.</p> + +<p>The additional resolution and screen area afforded by modern displays is best used to display + things at better quality, rather than greater quantity. For example, use your layouts to show + large, beautiful pieces of content, or to resize type for both easy reading and generous spacing. +</p> + +<p>If you are creating an app for browsing and playing content, use the prebuilt fragments in the + Leanback support library. These layouts have been built specifically for use on TV devices with + the guidance of the Android User Experience team. For more information on using these classes, + see the <a href="{@docRoot}preview/tv/build-ui/index.html">User Interfaces</a> guide. +</p> + +<p>Here are some additional recommendations for creating functional and attractive layouts for TV + apps:</p> + +<ul> + <li>Design layouts for landscape orientation. TV screens always use this + orientation.</li> + <li>Design your artwork assets for best viewing at HD resolution (1920 x 1080 pixels).</li> + <li>Put on-screen navigational controls on the left or right side of the screen, and + save the vertical space for content.</li> + <li>Use Fragments to create UIs that are divided into sections, and use view groups + like GridView instead of ListView to make better use of the horizontal screen space.</li> + <li>Avoid a cluttered interface by adding sufficient margins between layout controls.</li> +</ul> + + +<h3>Overscan</h3> + +<p>During the evolution of TV technology, overscan originally described an area of TV content + outside of a safe zone that most TVs could reliably display. Even on some of today’s HDTV flat + screens, areas outside that zone may not be visible.</p> + +<img src="{@docRoot}preview/tv/design/images/overscan.png" alt="Overscan borders for TV" /> + +<p>Build a 10% margin into your TV screen designs to account for overscan area the TV may not + display correctly. On a 1920 x 1080 pixel screen, this margin should be a minimum of 27px from the + top and bottom edges and a minimum of 48px from the right and left edges of the picture.</p> + + +<h2>Color</h2> + +<p>Color rendering on televisions can be imprecise compared to computer monitors or mobile + devices. LCD and Plasma TVs often apply smoothing and sharpening filters, and color rendering may + not match what you see on a computer screen.</p> + +<p>Subtle hue or brightness differences between elements may disappear or be over-emphasized on + TV screens. Some color gradient combinations will show bands. You should avoid pure whites on + large areas of the screen. For highly saturated colors (especially reds, greens and blues) you + should review them when used to fill significant areas of the screen. You + should also avoid using very dark or muddy colors, as TV settings may display these colors with + exaggerated contrast, causing them to be indistinguishable.</p> + + +<h2>Typography</h2> + +<p>The text and controls in a TV application's UI should be easily visible and navigable from a + distance. The minimum recommended font size for TV is 12sp. The default text size setting should + be 18sp. We recommend the following guidelines for TV apps:</p> + +<ul> + <li><strong>Card Titles:</strong> Roboto Condensed 16sp</li> + <li><strong>Card Subtext:</strong> Roboto Condensed 12sp</li> + <li><strong>Browse Screen Title:</strong> Roboto Regular 44sp</li> + <li><strong>Browse Category Title:</strong> Roboto Condensed 20sp</li> + <li><strong>Details Content Titles:</strong> Roboto Regular 34sp</li> + <li><strong>Details Subtext:</strong> Roboto Regular 14sp</li> +</ul> + +<p>Some TVs have strong sharpness and contrast settings as their defaults. These picture + settings make thin and light typefaces look jagged and make the text difficult for people to read. + Therefore you should avoid thin or light typefaces on TV.</p> + +<h2>Text</h2> + +<p>Use text in TV apps sparingly. The position of users relative to a TV screen + (typically about 10 feet away) makes it harder for users to read text. Users also don't expect to + read much in a TV environment. Follow these tips for the best handling of text in your app:</p> + +<ul> + <li>Break text into small chunks that users can quickly scan.</li> + <li>Use light text on a dark background. This style is easier to read on a TV.</li> + <li>Avoid lightweight fonts or fonts that have both very narrow and very broad + strokes. Use simple sans-serif fonts and anti-aliasing to increase readability.</li> + <li>Use layout-relative sizing rather than absolute sizing, and density-independent + pixel units instead of absolute pixel units.</li> +</ul> diff --git a/docs/html/preview/tv/games/index.jd b/docs/html/preview/tv/games/index.jd new file mode 100644 index 0000000..b9de3a4 --- /dev/null +++ b/docs/html/preview/tv/games/index.jd @@ -0,0 +1,70 @@ +page.title=Games on TV +page.tags="controller" + +@jd:body + +<p>This section complements the [larger best-practices guidance for designing for Android TV](TODO, use formal name of referenced doc, and add link). It assumes that you have read that guidance, and seeks to minimize repetition.</p> + +<h2>Overview</h2> +<p>Because of factors including its large size, its control scheme, and its nature as a shared display, the television screen presents a number of considerations that may be new to mobile developers. This document breaks these considerations down into five sections:</p> +<ul> +<li>Display</li> +<li>Control</li> +<li>Manifest</li> +<li>Google Play Game Services</li> +<li>Web</li> +</ul> +<h2>Display</h2> +<p>Large and centrally situated, the television screen imposes limitations, but also opens up new opportunities for immersive gameplay.</p> +<h3>A shared display</h3> +<p>A living-room TV poses design challenges for multiplayer games, in that all players can see everything. This issue is especially germane to games (such as card games or strategy games) that rely on each player’s possession of hidden information.</p> +<p>Some mechanisms you can implement to address the problem of one player’s “eavesdropping†on another’s information are:</p> +<ul> +<li>A player might place a "blinder" on the screen to help conceal information. For example, in a turn-based game like a word or card game, one player at a time might view the display. When the player finishes a move, the game allows him or her to cover the screen with a “blinder†that blocks anyone from viewing secret information. When the next player begins a turn, the blinder opens to reveal his or her own information.</li> +<li>A second screen, such as a handset or larger device, can enable a player to conceal information. For information on implementing second-screen support, see <a href="http://developer.android.com/reference/android/app/Presentation.html">Presentation</a> on the Android developer site.</li> +</ul> +<h3>No touch interface</h3> +<p>A television does not have a touch interface. Your game design, therefore, need not take into account the possibility that a player’s controlling fingers might block the on-screen action. You can assume constant visibility of the entire viewing area.</p> +<p>See the <a href=#control>Control</a> section in this document and in [Design for TV](TODO, use formal name of referenced doc, and add link) for more implications of the lack of touch interface.</p> +<h3>Landscape display</h3> +<p>In mobile-device terms, a TV is always “sideways.†You can’t turn it, and there is no portrait orientation. You should always be designing your TV games to be displayed in landscape mode.</p> +<a id=control><h2>Control</h2> +<p>Without a touch interface, it's even more important than usual to get your controls right, so that players find them intuitive and fun to use. The separation of controller from device also introduces some other issues to pay attention to, like keeping track of multiple players' controllers, and handling disconnects gracefully.</p> +<h3>D-pad</h3> +<p>Because of the lack of touch interface, you should be planning your control scheme based on a D-pad. Some key points to keep in mind include:</p> +<p>The player needs to use the gamepad in all aspects of the game–not just controlling core gameplay, but also navigating menus and ads. For this reason, you should also ensure that your Android TV game does not refer to a touch interface: for example, an Android TV game cannot tell a player to "Tap to skip".</p> +<p>You can avoid unhappy surprises (and resulting low ratings) by using your Play Store description to communicate to the player any expectations about controllers. If a game is better suited to a gamepad with a joystick than one with only a D-pad, you should make this clear. A player who uses an ill-suited controller for a game is likely to have a subpar experience–and penalize your game in the ratings.</p> +<p>You can also help ensure a good player experience by ensuring that button mapping is intuitive and flexible. For example, you can adhere to accepted custom by using the A button to <code>Accept</code>, and the B button to <code>Cancel</code>. You can also offer flexibility in the form of remappability. For more information on button mapping, see <a href="http://developer.android.com/training/game-controllers/controller-input.html">Handling Controller Actions</a>.</p> +<p>Your game can also contribute to a good match between controller and game by querying the controller about its capabilities. For example, you may intend for a player to steer an object by waving the controller in the air. If a player's controller lacks accelerometer and gyroscope hardware, however, waving will not work. But when your game queries the controller and discovers that motion detection is not supported, it can switch over to an alternative, available control scheme.</p> +<p>For more information on querying controller capabilities, see <a href="http://developer.android.com/training/game-controllers/compatibility.html">Supporting Controllers Across Android Versions</a>.</p> +<h3>Back-button behavior</h3> +<p>The Back button should never act as a toggle. For example, do not use it to both open and close a menu. Its behavior should only be linear. For example: Game play > Game pause screen > Game main screen > Android home screen.</p> +<p>With this principle of "linear navigation" in mind, you <b>may</b> use the back button to leave an in-game menu (opened by a different button) and return to gameplay.</p> +<h3>Handling multiple controllers</h3> +<p>When multiple players are playing a game, each with his or her own controller, it is important to map each player-controller pair. For information on how to implement controller-number identification, see <a href="http://developer.android.com/reference/android/view/InputDevice.html#getControllerNumber(">Input Devices</a>) on the Android developer site.</p> +<h3>Handling disconnects</h3> +<p>When a controller is disconnected in the middle of gameplay, the game should pause, and a dialog should appear prompting the disconnected player to reconnect his or her controller.</p> +<p>The dialog should also offer troubleshooting tips (e.g., "Check your Bluetooth connection").</p> +<h2>Manifest</h2> +<p>Games are displayed in a separate row from regular apps in the launcher. Android TV uses the <code>android:isGame</code> flag to differentiate games from non-game apps. You can assign it a value of either <code>true</code> or <code>false</code>. For example:</p> +<pre class="fragment"><application> + . . . + <meta-data android:name="isGame" android:value=["true" | "false"]/> +android:isGame=["true" | "false"] > + . . . +</application> +</pre><h2>Google Play Game Services</h2> +<p>If your game integrates Google Play Game Services, you should keep in mind a number of considerations pertaining to achievements, sign-on, saving games, and multiplayer play.</p> +<h3>Achievements</h3> +<p>Your game should include at least five (earnable) achievements. Only a user controlling gameplay from a supported input device should be able to earn achievements.</p> +<h3>Sign-on</h3> +<p>Your game should attempt to sign the user in on launch. If the player declines sign-in several times in a row, your game should stop asking.</p> +<h3>Saving</h3> +<p>We highly recommend using Play Services cloud save to store your game save. Your game should bind game saves to a specific Google account, so as to be uniquely identifiable even across devices: Whether the player is using a handset or a TV, the game should be able to pull the same game-save information from his or her account.</p> +<p>You should also provide an option in your game's UI to prompt the player to destroy save data. You might put the option in the game's <code>Settings</code> screen.</p> +<h3>Multiplayer experience</h3> +<p>A game offering a multiplayer experience must allow at least two players to enter a room.</p> +<h2>Web</h2> +<p>Android TV games do not support a full web browser. You should therefore avoid using generic URLs in your game.</p> +<p>Webviews will work for logins to services like Google+ and Facebook. </p> + diff --git a/docs/html/preview/tv/images/android-tv-remote.png b/docs/html/preview/tv/images/android-tv-remote.png Binary files differnew file mode 100644 index 0000000..d15fbc5 --- /dev/null +++ b/docs/html/preview/tv/images/android-tv-remote.png diff --git a/docs/html/preview/tv/images/home-recommendations.png b/docs/html/preview/tv/images/home-recommendations.png Binary files differnew file mode 100644 index 0000000..ef97145 --- /dev/null +++ b/docs/html/preview/tv/images/home-recommendations.png diff --git a/docs/html/preview/tv/index.jd b/docs/html/preview/tv/index.jd new file mode 100644 index 0000000..dd35908 --- /dev/null +++ b/docs/html/preview/tv/index.jd @@ -0,0 +1,22 @@ +page.title=Android TV Apps + +@jd:body + +<p>Android offers a rich user experience that's optimized for apps running on large screen + devices, such as high-definition televisions. Apps on TV offer new opportunities to + delight your users from the comfort of their couch.</p> + +<p>This guide helps you build apps for TV devices, including:</p> + +<ul> + <li>How to set up your development environment</li> + <li>How to build user interfaces for TV</li> + <li>Guidelines for building games for TV</li> +</ul> + +<p>Prepare your app for its big screen debut!</p> + +<p> + <strong><a href="{@docRoot}preview/tv/start/index.html">Get Started ></a></strong> +</p> + diff --git a/docs/html/preview/tv/start/hardware-features.jd b/docs/html/preview/tv/start/hardware-features.jd new file mode 100644 index 0000000..ddec496 --- /dev/null +++ b/docs/html/preview/tv/start/hardware-features.jd @@ -0,0 +1,183 @@ +page.title=Hardware Features on TV +page.tags="unsupported" + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + <h2>In this document</h2> + <ol> + <li><a href="#unsupported-features">Unsupported Hardware Features</a></li> + <li><a href="#workaround-features">Handling Unsupported Features</a></li> + <li><a href="#check-features">Checking Available Features</a> + <ol> + <li><a href="#no-touchscreen">Touch screen</a></li> + <li><a href="#no-camera">Camera</a></li> + <li><a href="#no-gps">GPS</a></li> + </ol> + + </li> + </ol> +</div> +</div> + +<p>TVs do not have some of the hardware features found on other Android devices. +Touch screens, cameras, and GPS receivers are some of the most commonly used hardware features +which are typically not available on a TV. When you build an app for TV, you must carefully +consider if your app can handle not having these features and, if necessary, work around them.</p> + +<p>This guide discusses the hardware features not available on TV devices and shows you how to +work around those limitations in your app. For more information on filtering and declaring +features in the manifest, see the +<a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">uses-feature</a> guide.</p> + + +<h2 id="unsupported-features">Unsupported Hardware Features</h2> + +<p>TVs have a different purpose from other devices, and so they do not have hardware +features that other Android-powered devices often have. For this reason, the Android system +does not support the following features for a TV device: + +<table> +<tr> +<th>Hardware</th> +<th>Android feature descriptor</th> +</tr> +<tr> +<td>Camera</td> +<td>android.hardware.camera</td> +</tr> +<tr> +<td>GPS</td> +<td>android.hardware.location.gps</td> +</tr> +<tr> +<td>Microphone</td> +<td>android.hardware.microphone</td> +</tr> +<tr> +<td>Near Field Communications (NFC)</td> +<td>android.hardware.nfc</td> +</tr> +<tr> +<td>Telephony</td> +<td>android.hardware.telephony</td> +</tr> +<tr> +<td>Touchscreen</td> +<td>android.hardware.touchscreen</td> +</tr> +</table> +</p> + + +<h2 id="check-features">Checking Available Features</h2> + +<p>To check if a feature is available at runtime, call {@link + android.content.pm.PackageManager#hasSystemFeature(String)}. This method takes a single string + argument that specifies the feature you want to check. For example, to check for a touch screen, + use {@link android.content.pm.PackageManager#hasSystemFeature(String)} with the argument + {@link android.content.pm.PackageManager#FEATURE_TOUCHSCREEN}.</p> + +<p>The following code example demonstrates how to detect the availability of a hardware features + at runtime:</p> + +<pre> +// Check if the telephony hardware feature is available. +if (getPackageManager().hasSystemFeature("android.hardware.telephony")) { + Log.d("Mobile Test", "Running on phone"); +// Check if android.hardware.touchscreen feature is available. +} else if (getPackageManager().hasSystemFeature("android.hardware.touchscreen")) { + Log.d("Tablet Test", "Running on devices that don't support telephony but "+ + "do have a touch screen."); +} else { + Log.d("TV Test", "Running on a TV!"); +} +</pre> + +<p class="note"> + <strong>Note:</strong> You can also use the {@link android.app.UiModeManager#getCurrentModeType + UiModeManager.getCurrentModeType()} method to detect the current platform type. For TV devices, + this method returns a value of {@link android.content.res.Configuration#UI_MODE_TYPE_TELEVISION + Configuration.UI_MODE_TYPE_TELEVISION}. +</p> + + +<h2 id="workaround-features">Handling Unsupported Features</h2> + +<p>Depending on the design and functionality of your app, you may be able to work around certain + hardware features being unavailable. This section discusses how to work around specific hardware + features.</p> + + +<h3 id="no-touchscreen">Touch screen</h3> + +<p>Android doesn't support touch screen interaction for TV devices, since most TVs don't have touch + screens, and using a touch screen is not consistent with a viewing environment where the user is + seated 10 feet away from the display.</p> + +<p>On TV devices, you should work around this limitation by supporting navigation using a directional + pad (D-pad) on TV remote control. For more information on properly supporting navigation using + TV-friendly controls, see <a href="{@docRoot}preview/tv/ui/navigation.html">Navigation for + TV</a>.</p> + +<p>You can explicitly declare if your application requires (or does not require) a touch screen + by including the following entry in your manifest:</p> + +<pre> +<uses-feature android:name="android.hardware.touchscreen" + android:required="false"/> +</pre> + + +<h3 id="no-camera">Camera</h3> + +<p>Although a TV typically does not have a camera, you can still provide a photography-related + application on a TV. For example, if you have an app that takes, views and edits photos, you can + disable its picture-taking functionality for TVs and still allow users to view and even edit + photos. If you decide that you want to enable your camera-related application to work on a + TV device without a camera, you can add an attribute to your app manifest declaring that + a camera is not required by your app:</p> + +<pre> +<uses-feature android:name="android.hardware.camera" android:required="false" /> +</pre> + +<p>If you enable your application to run without a camera, you should add code to your application +that detects if the camera feature is available and makes adjustments to the operation of your app. +The following code example demonstrates how to detect the presence of a camera:</p> + +<pre> +// Check if the camera hardware feature is available. +if (getPackageManager().hasSystemFeature("android.hardware.camera")) { + Log.d("Camera test", "Camera available!"); +} else { + Log.d("Camera test", "No camera available. View and edit features only."); +} +</pre> + + +<h3 id="no-gps">GPS</h3> + +<p>TVs are stationary, indoor devices, and do not have built-in global positioning system (GPS) + receivers. If your application uses location information, you can still allow users to search + for a location, or use a static location provider such as a zip code configured during the + TV device setup.</p> + +<pre> +LocationManager locationManager = (LocationManager) this.getSystemService( + Context.LOCATION_SERVICE); +Location location = locationManager.getLastKnownLocation("static"); +Geocoder geocoder = new Geocoder(this); +Address address = null; + +try { + address = geocoder.getFromLocation(location.getLatitude(), + location.getLongitude(), 1).get(0); + Log.d("Zip code", address.getPostalCode()); + +} catch (IOException e) { + Log.e(TAG, "Geocoder error", e); +} +</pre> + diff --git a/docs/html/preview/tv/start/index.jd b/docs/html/preview/tv/start/index.jd new file mode 100644 index 0000000..11d6ad3 --- /dev/null +++ b/docs/html/preview/tv/start/index.jd @@ -0,0 +1,233 @@ +page.title=Get Started with TV Apps +page.tags="leanback","recyclerview","launcher" + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + <h2>In this document</h2> + <ol> + <li><a href="#prerequisites">Prerequisites</a></li> + <li><a href="#dev-project">Setup a TV Project</a> + <ul> + <li><a href="#tv-activity">Create a TV Activity</a></li> + <li><a href="#tv-libraries">Add TV Support Libraries</a></li> + </ul> + </li> + <li><a href="#build-it">Build TV Apps</a></li> + <li><a href="#run">Run TV Apps</a></li> + + </ol> +</div> +</div> + +<p>This guide describes how to prepare your development environment and projects for building + TV apps, including updating your existing app to run on TV devices.</p> + + +<h2 id="prerequisites">Prerequisites</h2> + +<p>Before you begin setting up to build apps for TV, you must:</p> + +<ul> + <li><strong><a href="{@docRoot}preview/setup-sdk.html"> + Set up the Preview SDK</a></strong> + <br> + The preview SDK provides the developer tools needed to build and test apps for TV. + </li> + <li><strong><a href="{@docRoot}preview/setup-sdk.html#project"> + Create a Preview SDK Project</a></strong> + <br> + In order to access new APIs for TV devices, you must create a project that targets the preview + release level or modify an existing project to target the preview release. + </li> +</ul> + + +<h2 id="dev-project">Set up a TV Project</h2> + +<p>TV apps use the same structure as those for phones and tablets. This means you can modify + your existing apps to also run on TV devices or create new apps based on what you already know + about building apps for Android. This section discusses how to modify an existing app, or create a + new one, to run on TV devices.</p> + +<p>These are the main steps to creating an app that runs on TV devices. Only the first + is required:</p> + +<ul> + <li><strong>Activity for TV</strong> - (Required) In your application manifest, you must + declare an activity that is intended to run on TV devices.</li> + <li><strong>TV Support Libraries</strong> - (Optional) There are several Support Libraries + available for TV devices that provide widgets for building user interfaces.</li> +</ul> + + +<h3 id="tv-activity">Create a TV Activity</h3> + +<p>An application intended to run on TV devices must declare a launcher activity for TV + in its manifest using a {@code android.intent.category.LEANBACK_LAUNCHER} intent filter. + This filter identifies your app as being built for TV, enabling it to be displayed in the + Google Play store app running on TV devices. Declaring this intent also identifies which activity + in your app should be launched when a user selects its icon on the TV home screen.</p> + +<p class="caution"> + <strong>Caution:</strong> If you do not include the {@code LEANBACK_LAUNCHER} intent filter in + your app, it is not visible to users running the Google Play store on TV devices. Also, if your + app does not have this filter when you load it onto a TV device using developer tools, the app + does not appear in the TV user interface. +</p> + +<p>The following code snippet shows how to include this intent filter in your manifest:</p> + +<pre> +<application> + ... + <activity + android:name="com.example.android.MainActivity" + android:label="@string/app_name" > + + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + + <activity + android:name="com.example.android.<strong>TvActivity</strong>" + android:label="@string/app_name" + android:theme="@android:style/Theme.Leanback"> + + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="<strong>android.intent.category.LEANBACK_LAUNCHER</strong>" /> + </intent-filter> + + </activity> +</application> +</pre> + +<p>The second activity manifest entry in the example above specifies that activity as + the main one when your app launches on an TV device.</p> + +<p>If you have an existing app that you are modifying for TV use, your app should not use the same + activity layout for TV that it does for phones and tablets. The user interface of your TV app (or + TV portion of your existing app) should provide a simpler interface that can be easily navigated + using a remote control from a couch. For guidelines on designing an app for TV, see the + <a href="{@docRoot}design/tv/index.html">TV Design</a> guide. For more instructions on + developing a user interface appropriate to TV, see the + <a href="{@docRoot}preview/tv/ui/index.html">TV User Interface</a> guide. +</p> + + +<h3 id="tv-libraries">Add TV Support Libraries</h3> + +<p>The Preview SDK includes support libraries that are intended for use with TV apps. These + libraries provide APIs and user interface widgets for use on TV devices. The libraries are + located in the {@code <sdk>/extras/android/support/} directory where you installed the + Preview SDK. Here is a list of the libraries and their general purpose:</p> + +<ul> + <li><strong>v17 leanback library</strong> - Provides user interface widgets for TV, including + {@code BrowseFragment}, {@code DetailsFragment}, and {@code SearchFragment}. + <ul> + <li>SDK location: {@code <sdk>/extras/android/support/v17/leanback}</li> + <li>Gradle dependency: {@code com.android.support:leanback-v17:20.0.+}</li> + <li>Contains resources: Yes</li> + </ul> + </li> + <li><strong>v7 recyclerview library</strong> - Provides classes for managing display of long + lists in a memory efficient manner. Several classes in the v17 leanback library depend on the + classes in this library. + <ul> + <li>SDK location: {@code <sdk>/extras/android/support/v7/recyclerview}</li> + <li>Gradle dependency: {@code com.android.support:recyclerview-v7:20.0.+}</li> + <li>Contains resources: No</li> + </ul> + </li> +</ul> + +<p class="note"> + <strong>Note:</strong> You are not required to use these support libraries for your TV app. + However, we strongly recommend using them, particularly for apps that provide a media catalog + browsing interface. +</p> + +<p>If you decide to use the v17 leanback library for your app, you should note that it is + dependent on the <a href="{@docRoot}tools/support-library/features.html#v7-appcompat">v7 + appcompat library</a>, which is, in turn, dependent on the + <a href="{@docRoot}tools/support-library/features.html#v4">v4 support library</a>. This means + that apps that use the leanback support library should include all of these support + libraries:</p> + +<ul> + <li>v17 leanback support library</li> + <li>v7 recyclerview support library</li> + <li>v7 appcompat support library</li> + <li>v4 support library</li> +</ul> + +<p>Two of these libraries (v17 leanback and v7 appcompat) contain resources, which require + you to take specific steps to include them in app projects. For instructions on + importing a support library with resources, see + <a href="http://developer.android.com/tools/support-library/setup.html#libs-with-res"> + Support Library Setup</a>. +</p> + + +<h2 id="build-it">Build TV Apps</h2> + +<p>After you have completed the steps described above, it's time to start building apps for + the big screen! Check out these additional topics to help you build your app for TV: + +<ul> + <li><a href="{@docRoot}preview/tv/ui/index.html">User Interface</a> - The user interface of + TV devices is different from those of other Android devices. See this topic to find out how + to build TV user interfaces and to learn about the widgets provided to simplify that task. + </li> + <li><a href="{@docRoot}preview/tv/games/index.html">Games for TV</a> - TV devices are great + platforms for games. See this topic for information on building great game experiences for + TV.</li> + <li><a href="{@docRoot}preview/tv/start/hardware-features.html">Hardware features</a> - TV + devices do not contain hardware features normally found on other Android devices. See this + topic for information on unsupported hardware features and what to do about them. + </li> +</ul> + + +<h2 id="run">Run TV Apps</h2> + +<p>Running your app is an important part of the development process. The AVD Manager in the + Android SDK provides the device definitions that allows you to create virtual TV devices for + running and testing your applications.</p> + +<p>To create an virtual TV device:</p> + +<ol> + <li>Start the AVD Manager. For more information, see the + <a href="{@docRoot}tools/help/avd-manager.html">AVD Manager</a> help.</li> + <li>In the AVD Manager dialog, click the <strong>Device Definitions</strong> tab.</li> + <li>Select one of the Android TV device definitions, such as + <strong>Large Android TV</strong>, and click <strong>Create AVD</strong>.</li> + <li>Select the emulator options and click <strong>OK</strong> to create the AVD. + <p class="note"> + <strong>Note:</strong> For best performance of the TV emulator device, enable the <strong>Use + Host GPU</strong> option and CPU platform image that supports hardware acceleration. For + more information on hardware acceleration of the emulator, see + <a href="{@docRoot}tools/devices/emulator.html#acceleration">Using the Emulator</a>. + </p> + </li> +</ol> + +<p>To test your application on the virtual TV device:</p> + +<ol> + <li>Compile your TV application in your development environment.</li> + <li>Run the application from your development environment and choose the TV virtual device as + the target.</li> +</ol> + +<p>For more information about using emulators see, <a href="{@docRoot}tools/devices/emulator.html"> +Using the Emulator</a>. For more information about deploying apps to emulators from +Eclipse with ADT, see <a href="{@docRoot}http://developer.android.com/tools/building/building-eclipse.html"> +Building and Running from Eclipse with ADT</a>.</p> + diff --git a/docs/html/preview/tv/ui/browse.jd b/docs/html/preview/tv/ui/browse.jd new file mode 100644 index 0000000..d7a1fb6 --- /dev/null +++ b/docs/html/preview/tv/ui/browse.jd @@ -0,0 +1,199 @@ +page.title=BrowseFragment + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + <h2>In this document</h2> + <ol> + <li><a href="#layout">Media Browse Layout</a></li> + <li><a href="#lists">Displaying Media Lists</a></li> + <li><a href="#background">Updating the Background</a></li> + </ol> + +</div> +</div> + +<p>The <a href="{@docRoot}preview/tv/start/index.html#tv-libraries">Leanback support library</a> + provides several APIs for displaying and browsing media catalogs + on the TV devices. This guide discusses how to use the classes provided by this library to + implement a user interface for browsing music or videos from your app's media catalog.</p> + + +<h2 id="layout">Media Browse Layout</h2> + +<p>The {@code BrowseFragment} class in the Leanback support library allows you to create a primary + layout for browsing categories and rows of media items with a minimum of code. The following + example shows how to create a layout that contains a {@code BrowseFragment}:</p> + +<pre> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + > + + <fragment + <strong>android:name="android.support.v17.leanback.app.BrowseFragment"</strong> + android:id="@+id/browse_fragment" + android:layout_width="match_parent" + android:layout_height="match_parent" + /> +</LinearLayout> +</pre> + +<p>In order to work with this layout in an activity, retrieve the {@code BrowseFragment} element + from the layout. Use the methods in {@code BrowseFragment} to set display parameters such as the + icon, title and whether category headers are enabled. The following code sample demonstrates how + to set the layout parameters for a {@code BrowseFragment} in a layout:</p> + +<pre> +public class BrowseMediaActivity extends Activity { + + public static final String TAG ="BrowseActivity"; + + protected BrowseFragment mBrowseFragment; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.browse_fragment); + + final FragmentManager fragmentManager = getFragmentManager(); + <strong>mBrowseFragment = (BrowseFragment) fragmentManager.findFragmentById( + R.id.browse_fragment);</strong> + + // Set display parameters for the BrowseFragment + mBrowseFragment.setHeadersState(BrowseFragment.HEADERS_ENABLED); + mBrowseFragment.setTitle(getString(R.string.app_name)); + mBrowseFragment.setBadgeDrawable(getResources().getDrawable(R.drawable.ic_launcher)); + mBrowseFragment.setBrowseParams(params); + + } +} +</pre> + + +<h2 id="lists">Displaying Media Lists</h2> + +<p>The {@code BrowseFragment} allows you to define and display browsable media content categories and + media items from a media catalog using adapters and presenters. Adapters enable you to connect to + local or online data sources that contain your media catalog information. Presenter classes hold + data about media items and provide layout information for displaying an item on screen.</p> + +<p>The following example code shows an implementation of a presenter for displaying string + data:</p> + +<pre> +public class StringPresenter extends Presenter { + private static final String TAG = "StringPresenter"; + + public ViewHolder onCreateViewHolder(ViewGroup parent) { + TextView textView = new TextView(parent.getContext()); + textView.setFocusable(true); + textView.setFocusableInTouchMode(true); + textView.setBackground( + parent.getContext().getResources().getDrawable(R.drawable.text_bg)); + return new ViewHolder(textView); + } + + public void onBindViewHolder(ViewHolder viewHolder, Object item) { + ((TextView) viewHolder.view).setText(item.toString()); + } + + public void onUnbindViewHolder(ViewHolder viewHolder) { + // no op + } +} +</pre> + +<p>Once you have constructed a presenter class for your media items, you can build and attach an + adapter to the {@code BrowseFragment} to display those items on screen for browsing by the user. The + following example code demonstrates how to construct an adapter to display categories and items + in those categories using the StringPresenter class shown in the previous code example:</p> + +<pre> +private ArrayObjectAdapter mRowsAdapter; +private static final int NUM_ROWS = 4; + +@Override +protected void onCreate(Bundle savedInstanceState) { + ... + + buildRowsAdapter(); +} + +private void buildRowsAdapter() { + mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); + + for (int i = 0; i < NUM_ROWS; ++i) { + ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter( + new StringPresenter()); + listRowAdapter.add("Media Item 1"); + listRowAdapter.add("Media Item 2"); + listRowAdapter.add("Media Item 3"); + HeaderItem header = new HeaderItem(i, "Category " + i, null); + mRowsAdapter.add(new ListRow(header, listRowAdapter)); + } + + mBrowseFragment.setAdapter(mRowsAdapter); +} +</pre> + +<p>This example shows a static implementation of the adapters. A typical media browsing + application uses data from an online database or web service. For an example of a browsing + application that uses data retrieved from the web, see the + <a href="http://github.com/googlesamples/androidtv-leanback">Android TV</a> sample app.</p> + + +<h2 id="background">Updating the Background</h2> + +<p>In order to add visual interest to a media-browsing app on TV, you can update the background + image as users browse through content. This technique can make interaction with your app feel more + cinematic and enjoyable for users.</p> + +<p>The Leanback support library provides a {@link + android.support.v17.leanback.app.BackgroundManager} class for changing the background of your TV + app activity. The following example shows how to create a simple method for updating the + background within your TV app activity:</p> + +<pre> +protected void updateBackground(Drawable drawable) { + BackgroundManager.getInstance(this).setDrawable(drawable); +} +</pre> + +<p>Many of the existing media-browse apps automatically update the background as the user + navigates through media listings. In order to do this, you can set up a selection listener to + automatically update the background based on the user's current selection. The following example + shows you how to set up an {@link android.support.v17.leanback.widget.OnItemSelectedListener} + class to catch selection events and update the background:</p> + +<pre> +protected void clearBackground() { + BackgroundManager.getInstance(this).setDrawable(mDefaultBackground); +} + +protected OnItemSelectedListener getDefaultItemSelectedListener() { + return new OnItemSelectedListener() { + @Override + public void onItemSelected(Object item, Row row) { + if (item instanceof Movie ) { + URI uri = ((Movie)item).getBackdropURI(); + updateBackground(uri); + } else { + clearBackground(); + } + } + }; +} +</pre> + +<p class="note"> + <strong>Note:</strong> The implementation above is a simple example shown for purposes of + illustration. When creating this function in your own app, you should consider running the + background update action in a separate thread for better performance. In addition, if you are + planning on updating the background in response to users scrolling through items, consider adding + a time to delay a background image update until the user settles on an item. This technique avoids + excessive background image updates. +</p> diff --git a/docs/html/preview/tv/ui/details.jd b/docs/html/preview/tv/ui/details.jd new file mode 100644 index 0000000..8b8fa8b5 --- /dev/null +++ b/docs/html/preview/tv/ui/details.jd @@ -0,0 +1,214 @@ +page.title=DetailFragment + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + <h2>In this document</h2> + <ol> + <li><a href="#details-presenter">Build a Details Presenter</a></li> + <li><a href="#details-fragment">Extend the Details Fragment</a> + <li><a href="#activity">Creating a Details Activity</a></li> + <li><a href="#item-listener">Listener for Clicked Items</a></li> + </li> + </ol> +</div> +</div> + +<p>The media browsing interface classes provided by the + <a href="{@docRoot}preview/tv/start/index.html#tv-libraries">Leanback support library</a> + include classes for displaying additional information about a media item, such as a description + or reviews, and for taking action on that item, such as purchasing it or playing its content. This + section discusses how to create a presenter class for media item details and extend the + {@code DetailsFragment} class to implement a details view for a media item when it + is selected by a user. +</p> + +<p class="note"> + <strong>Note:</strong> The implementation example shown here uses an additional activity to + contain the {@code DetailsFragment}. However, it is possible to avoid creating a second activity + by replacing the current {@code BrowseFragment} with a {@code DetailsFragment} within the <em>same</em> + activity using fragment transactions. For more information on using fragment transactions, see the + <a href="{@docRoot}training/basics/fragments/fragment-ui.html#Replace">Building a Dynamic + UI with Fragments</a> training. +</p> + + +<h2 id="details-presenter">Build a Details Presenter</h2> + +<p>In the media browsing framework provided for by the leanback support library, you use + presenter objects to control the display of data on screen, including media item details. The + framework provides the {@code AbstractDetailsDescriptionPresenter} class for this purpose, which + is a nearly complete implementation of the presenter for media item details. All you have to do is + implement the {@code onBindDescription()} method to bind the view fields to your data objects, as shown in + the following code sample:</p> + +<pre> +public class DetailsDescriptionPresenter + extends AbstractDetailsDescriptionPresenter { + + @Override + protected void onBindDescription(ViewHolder viewHolder, Object itemData) { + MyMediaItemDetails details = (MyMediaItemDetails) itemData; + // In a production app, the itemData object contains the information + // needed to display details for the media item: + // viewHolder.getTitle().setText(details.getShortTitle()); + + // Here we provide static data for testing purposes: + viewHolder.getTitle().setText(itemData.toString()); + viewHolder.getSubtitle().setText("2014 Drama TV-14"); + viewHolder.getBody().setText("Lorem ipsum dolor sit amet, consectetur " + + "adipisicing elit, sed do eiusmod tempor incididunt ut labore " + + " et dolore magna aliqua. Ut enim ad minim veniam, quis " + + "nostrud exercitation ullamco laboris nisi ut aliquip ex ea " + + "commodo consequat."); + } +} +</pre> + + +<h2 id="details-fragment">Extend the Details Fragment</h2> + +<p>When you use the {@code DetailsFragment} class for displaying your media item details, you + extend that class to provide additional content such as a preview image and actions for the media + item. You can also provide additional content, such as a list of related media items.</p> + +<p>The following example code demonstrates how to use the presenter class you created in the + previous section, add a preview image and actions for the media item being viewed. This example + also shows the addition of a related media items row, which appears below the details listing.</p> + +<pre> +public class MediaItemDetailsFragment extends DetailsFragment { + private static final String TAG = "MediaItemDetailsFragment"; + private ArrayObjectAdapter mRowsAdapter; + + @Override + public void onCreate(Bundle savedInstanceState) { + Log.i(TAG, "onCreate"); + super.onCreate(savedInstanceState); + + buildDetails(); + } + + private void buildDetails() { + ClassPresenterSelector selector = new ClassPresenterSelector(); + // Attach your media item details presenter to the row presenter: + DetailsOverviewRowPresenter rowPresenter = + new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter()); + + selector.addClassPresenter(DetailsOverviewRow.class, rowPresenter); + selector.addClassPresenter(ListRow.class, + new ListRowPresenter()); + mRowsAdapter = new ArrayObjectAdapter(selector); + + Resources res = getActivity().getResources(); + DetailsOverviewRow detailsOverview = new DetailsOverviewRow( + "Media Item Details"); + + // Add images and action buttons to the details view + detailsOverview.setImageDrawable(res.getDrawable(R.drawable.jelly_beans)); + detailsOverview.addAction(new Action(1, "Buy $9.99")); + detailsOverview.addAction(new Action(2, "Rent $2.99")); + mRowsAdapter.add(detailsOverview); + + // Add a Related items row + ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter( + new StringPresenter()); + listRowAdapter.add("Media Item 1"); + listRowAdapter.add("Media Item 2"); + listRowAdapter.add("Media Item 3"); + HeaderItem header = new HeaderItem(0, "Related Items", null); + mRowsAdapter.add(new ListRow(header, listRowAdapter)); + + setAdapter(mRowsAdapter); + } +} +</pre> + + +<h3 id="activity">Creating a Details Activity</h3> + +<p>Fragments such as the {@code DetailsFragment} must be contained within an activity in order + to be used for display. Creating an activity for your details view, separate from the browse + activity, enables you to invoke your details view using an Intent. This section explains how to + build an activity to contain your implementation of the detail view for your media items.</p> + +<p>Start creating the details activity by building a layout that references your implementation + of the {@code DetailsFragment}:</p> + +<pre> +<!-- file: res/layout/details.xml --> + +<fragment xmlns:android="http://schemas.android.com/apk/res/android" + <strong>android:name="com.example.android.mediabrowser.MediaItemDetailsFragment"</strong> + android:id="@+id/details_fragment" + android:layout_width="match_parent" + android:layout_height="match_parent" +/> +</pre> + +<p>Next, create an activity class that uses the layout shown in the previous code example:</p> + +<pre> +public class DetailsActivity extends Activity +{ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + <strong>setContentView(R.layout.details);</strong> + } +} +</pre> + +<p>Finally, add this new activity to the manifest. Remember to apply the Leanback theme to + ensure that the user interface is consistent with the media browse activity:</p> + +<pre> +<application> + ... + + <activity android:name=".DetailsActivity" + android:exported="true" + <strong>android:theme="@style/Theme.Leanback"/></strong> + +</application> +</pre> + + +<h3 id="item-listener">Listener for Clicked Items</h3> + +<p>After you have implemented the {@code DetailsFragment}, you must modify your main media + browsing view to move to your details view when a user clicks on a media item. In order to enable + this behavior, add an {@code OnItemClickedListener} object to the BrowseFragment that fires an + intent to start the item details activity.</p> + +<p>The following example shows how to implement a listener to start the details view when a user + clicks a media item in the main media browsing activity:</p> + +<pre> +public class BrowseMediaActivity extends Activity { + ... + + @Override + protected void onCreate(Bundle savedInstanceState) { + ... + + // create the media item rows + buildRowsAdapter(); + + // add a listener for selected items + mBrowseFragment.setOnItemClickedListener( + new OnItemClickedListener() { + @Override + public void onItemClicked(Object item, Row row) { + System.out.println("Media Item clicked: " + item.toString()); + Intent intent = new Intent(BrowseMediaActivity.this, + DetailsActivity.class); + // pass the item information + intent.getExtras().putLong("id", item.getId()); + startActivity(intent); + } + }); + } +} +</pre> diff --git a/docs/html/preview/tv/ui/in-app-search.jd b/docs/html/preview/tv/ui/in-app-search.jd new file mode 100644 index 0000000..3dbfcd2 --- /dev/null +++ b/docs/html/preview/tv/ui/in-app-search.jd @@ -0,0 +1,111 @@ +page.title=Adding Search to TV Apps + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + <h2>In this document</h2> + <ol> + <li><a href="#add-search-ui">Add Search User Interface</a></li> + </ol> + +</div> +</div> + + +<p>Users frequently have specific content in mind when using a media app. A search interface can + help your users get to the content they want faster than browsing. The Leanback library provides a + set of classes to enable a standard search interface within your app that is consistent with other + search functions on TV and provides features such as voice input.</p> + +<h2 id="add-search-ui">Add Search User Interface</h2> +<p>When you use the BrowseFragment class for your media browsing interface, you can enable the + search icon by setting an OnClickListener to the BrowseFragment object. The following sample code + demonstrates this technique.</p> + +<pre> +@Override +public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.browse_activity); + + mBrowseFragment = (BrowseFragment) + getFragmentManager().findFragmentById(R.id.browse_fragment); + + ... + + mBrowseFragment.setOnSearchClickedListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(BrowseActivity.this, SearchActivity.class); + startActivity(intent); + } + }); + + mBrowseFragment.setAdapter(buildAdapter()); +} +</pre> + +<p class="note"> + <strong>Note:</strong> You can set the color of the search icon using the + {@code setSearchAffordanceColor()} method of {@code BrowseFragment}. +</p> + +<p>When a user selects the search icon, the system invokes a search activity via the defined + Intent. Your search activity should use a linear layout containing a SearchFragment. This fragment + must also implement the SearchFragment.SearchResultProvider interface in order to display the + results of a search. The following code sample shows how to extend the SearchFragment class to + provide a search interface and results:</p> + +<pre> +public class MySearchFragment extends SearchFragment + implements SearchFragment.SearchResultProvider { + + private static final int SEARCH_DELAY_MS = 300; + private ArrayObjectAdapter mRowsAdapter; + private Handler mHandler = new Handler(); + private SearchRunnable mDelayedLoad; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); + setSearchResultProvider(this); + setOnItemClickedListener(getDefaultItemClickedListener()); + mDelayedLoad = new SearchRunnable(); + } + + @Override + public ObjectAdapter getResultsAdapter() { + return mRowsAdapter; + } + + @Override + public boolean onQueryTextChange(String newQuery) { + mRowsAdapter.clear(); + if (!TextUtils.isEmpty(newQuery)) { + mDelayedLoad.setSearchQuery(newQuery); + mHandler.removeCallbacks(mDelayedLoad); + mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS); + } + return true; + } + + @Override + public boolean onQueryTextSubmit(String query) { + mRowsAdapter.clear(); + if (!TextUtils.isEmpty(query)) { + mDelayedLoad.setSearchQuery(query); + mHandler.removeCallbacks(mDelayedLoad); + mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS); + } + return true; + } +} +</pre> + +<p>This example code shown above is meant to be used with a separate {@code SearchRunnable} + class that runs the search query on a separate thread. This technique keeps potentially + slow-running queries from blocking the main user interface thread.</p> + diff --git a/docs/html/preview/tv/ui/index.jd b/docs/html/preview/tv/ui/index.jd new file mode 100644 index 0000000..c861ec2 --- /dev/null +++ b/docs/html/preview/tv/ui/index.jd @@ -0,0 +1,40 @@ +page.title=User Interfaces for TV + +@jd:body + + +<p> + Building an effective and engaging user interface for TV devices requires a firm understanding of what works well + in the context of a living room. Imagine a large screen that can be seen by many people at the + same time, controlled with a few buttons by users with limited attention, and you start to see the + challenges and opportunities of building an app for TV. Building apps for this environment + requires a different approach and different tools.</p> + +<p>This section discusses how to build a living room experience with your app, including + implementation instructions and creating user interface widgets built for TV. Also check out + <a href="{@docRoot}design/tv/index.html">Design for TV</a> for information and inspiration + on creating engaging user interfaces for TV devices.</p> + +<h2>Topics</h2> + +<dl> + <dt><b><a href="layouts.html">Layouts</a></b></dt> + <dd>Learn how to build app layouts for TV screens.</dd> + + <dt><b><a href="navigation.html">Navigation</a></b></dt> + <dd>Learn how to build navigation for TV devices.</dd> + + <dt><b><a href="browse.html">BrowseFragment</a></b></dt> + <dd>Learn how to use this fragment to build a browsing interface for media catalogs.</dd> + + <dt><b><a href="details.html">DetailsFragment</a></b></dt> + <dd>Learn how to use this fragment to build a details page for media items.</dd> + + <dt><b><a href="in-app-search.html">In-App Search</a></b></dt> + <dd>Learn how to use a built-for-TV user interface for searching within your app.</dd> + + <dt><b><a href="recommendations.html">Recommendations</a></b></dt> + <dd>Learn how your app can contribute to the list of recommendations appearing on the home + screen and get your content noticed by users.</dd> +</dl> + diff --git a/docs/html/preview/tv/ui/layouts.jd b/docs/html/preview/tv/ui/layouts.jd new file mode 100644 index 0000000..0659826 --- /dev/null +++ b/docs/html/preview/tv/ui/layouts.jd @@ -0,0 +1,298 @@ +page.title=Layouts for TV + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + <h2>In this document</h2> + <ol> + <li><a href="#themes">Themes</a> + <ol> + <li><a href="#leanback-theme">Leanback Theme</a></li> + <li><a href="#notitle-theme">NoTitleBar Theme</a></li> + </ol> + </li> + <li><a href="#structure">Layout Structure</a> + <ol> + <li><a href="#overscan">Overscan</a></li> + </ol> + </li> + <li><a href="#visibility">Text and Controls Visibility</a></li> + <li><a href="#density-resources">Screen Density and Image Resources</a></li> + <li><a href="#anti-patterns">Layout Anti-Patterns</a></li> + <li><a href="#large-bitmaps">Handling Large Bitmaps</a></li> + </ol> + +</div> +</div> + +<p> + A TV screen is typically viewed from about 10 feet away, and while it is much larger than most + other Android device displays, this type of screen does not provide the same level of precise + detail and color as a smaller device. These factors require that you create app layouts with + TV devices in mind in order to create a useful and enjoyable user experience.</p> + +<p>This guide provides direction and implementation details for building effective layouts inN + TV apps.</p> + + +<h2 id="themes">Themes</h2> + +<p>Android <a href="{@docRoot}guide/topics/ui/themes.html">Themes</a> can provide a basis for + layouts in your TV apps. You should use a theme to modify the display of your app activities + that are meant to run on a TV device. This section explains which themes you should use.</p> + + +<h3 id="leanback-theme">Leanback Theme</h3> + +<p>The Leanback library provides a standard theme for TV activities, called {@code + Leanback.Theme}, which establishes a consistent visual style for TV apps. Use of this theme is + recommended for most apps. This theme is recommended for any TV app that uses the Leanback + library classes. The following code sample shows how to apply this theme to a given + activity within an app:</p> + +<pre> +<activity + android:name="com.example.android.TvActivity" + android:label="@string/app_name" + <strong>android:theme="@style/Theme.Leanback"</strong>> +</pre> + + +<h3 id="notitle-theme">NoTitleBar Theme</h3> + +<p>The title bar is a standard user interface element for Android apps on phones and tablets, + but it is not appropriate for TV apps. If you are not using the Leanback library classes, + you should apply this theme to your TV activities. The following code example from a TV app + manifest demonstrates how to apply this theme to remove the display of a title bar: +</p> + +<pre> +<application> + ... + + <activity + android:name="com.example.android.TvActivity" + android:label="@string/app_name" + <strong>android:theme="@android:style/Theme.NoTitleBar"</strong>> + ... + + </activity> +</application> +</pre> + + +<h2 id="structure">Layout Structure</h2> + +<p>Layouts for TV devices should follow some basic guidelines to ensure they are usable and + effective on large screens. Follow these tips to build landscape layouts optimized for TV screens: +</p> + +<ul> + <li>Build layouts with a landscape orientation. TV screens always display in landscape.</li> + <li>Put on-screen navigation controls on the left or right side of the screen and save the + vertical space for content.</li> + <li>Create UIs that are divided into sections, using <a + href="{@docRoot}guide/components/fragments.html" + >Fragments</a>, and use view groups like {@link android.widget.GridView} instead of {@link + android.widget.ListView} to make better use of the horizontal screen space. + </li> + <li>Use view groups such as {@link android.widget.RelativeLayout} or {@link + android.widget.LinearLayout} to arrange views. This approach allows the system to adjust the + position of the views to the size, alignment, aspect ratio, and pixel density of a TV screen.</li> + <li>Add sufficient margins between layout controls to avoid a cluttered UI.</li> +</ul> + + +<h3 id="overscan">Overscan</h3> + +<p>Layouts for TV have some unique requirements due to the evolution of TV standards and the + desire to always present a full screen picture to viewers. For this reason, TV devices may + clip the outside edge of an app layout in order to ensure that the entire display is filled. + This behavior is generally referred to as Overscan.</p> + +<p>In order to account for the impact of overscan and make sure that all the user interface + elements you place in a layout are actually shown on screen, you should incorporate a 10% margin + on all sides of your layout. This translates into a 27dp margin on the left and right edges and + a 48dp margin on the top and bottom of your base layouts for activities. The following + example layout demonstrates how to set these margins in the root layout for a TV app: +</p> + +<pre> +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/base_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:layout_marginTop="27dp" + android:layout_marginLeft="48dp" + android:layout_marginRight="48dp" + android:layout_marginBottom="27dp" > +</LinearLayout> +</pre> + +<p class="caution"> + <strong>Caution:</strong> Do not apply overscan margins to your layout if you are using the + Leanback Support Library {@code BrowseFragment} or related widgets, as those layouts already + incorporate overscan-safe margins. +</p> + + +<h2 id="visibility">Text and Controls Visibility</h2> + +<p> +The text and controls in a TV app layout should be easily visible and navigable from a distance. +Follow these tips to make them easier to see from a distance : +</p> + +<ul> + <li>Break text into small chunks that users can quickly scan.</li> + <li>Use light text on a dark background. This style is easier to read on a TV.</li> + <li>Avoid lightweight fonts or fonts that have both very narrow and very broad strokes. + Use simple sans-serif fonts and anti-aliasing to increase readability.</li> + <li>Use Android's standard font sizes: +<pre> +<TextView + android:id="@+id/atext" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="center_vertical" + android:singleLine="true" + android:textAppearance="?android:attr/textAppearanceMedium"/> +</pre> + </li> + <li>Ensure that all your view widgets are large enough to be clearly visible to someone + sitting 10 feet away from the screen (this distance is greater for very large screens). The + best way to do this is to use layout-relative sizing rather than absolute sizing, and + density-independent pixel units instead of absolute pixel units. For example, to set the + width of a widget, use wrap_content instead of a pixel measurement, and to set the margin + for a widget, use dip instead of px values.</li> +</ul> + + +<h2 id="density-resources">Screen Density and Image Resources</h2> + +<p>The common high-definition TV display resolutions are 720p, 1080i, and 1080p. + Your TV layout should target a screen size of 1920 x 1080 pixels, and then allow the Android + system to downscale your layout elements to 720p if necessary. In general, downscaling + (removing pixels) does not degrade your layout presentation quality. However, upscaling can + cause display artifacts that degrade the quality of your layout and have a negative impact on + the user experience of your app.</p> + +<p> + To get the best scaling results for images, provide them as + <a href="{@docRoot}tools/help/draw9patch.html">9-patch image</a> elements if possible. If you + provide low quality or small images in your layouts, they will appear pixelated, fuzzy, or + grainy. This is not a good experience for the user. Instead, use high-quality images. +</p> + +<p> + For more information on optimizing layouts and resources for large screens see + <a href="{@docRoot}training/multiscreen/index.html">Designing for multiple screens</a>. +</p> + + +<h2 id="anti-patterns">Layout Anti-Patterns</h2> + +<p>There are a few approaches to building layouts for TV that you should avoid because they do not +work well and lead to bad user experiences. Here are some user interface approaches you +should specifically <em>not</em> use when developing a layout for TV. +</p> + +<ul> + <li><strong>Re-using phone or tablet layouts</strong> - Do not reuse layouts from a phone or + tablet app without modification. Layouts built for other Android device form factors are not + well suited for TV devices and should be simplified for operation on a TV.</li> + <li><strong>ActionBar</strong> - While this user interface convention is recommended for use + on phones and tablets, it is not appropriate for a TV interface. In particular, using an + action bar options menu (or any pull-down menu for that matter) is strongly discouraged, due + to the difficulty in navigating such a menu with a remote control.</li> + <li><strong>ViewPager</strong> - Sliding between screens can work great on a phone or tablet, + but don't try this on a TV!</li> + +</ul> + +<p>For more information on designing layouts that are appropriate to TV, see the + <a href="{@docRoot}design/tv/index.html">TV Design</a> guide.</p> + + +<h2 id="large-bitmaps">Handling Large Bitmaps</h2> + +<p>TV devices, like any other Android device, have a limited amount of memory. If you build your + app layout with very high-resolution images or use many high-resolution images in the operation + of your app, it can quickly run into memory limits and cause out of memory errors. + To avoid these types of problems, follow these tips:</p> + +<ul> + <li>Load images only when they're displayed on the screen. For example, when displaying multiple images in + a {@link android.widget.GridView} or + {@link android.widget.Gallery}, only load an image when + {@link android.widget.Adapter#getView(int, View, ViewGroup) getView()} + is called on the View's {@link android.widget.Adapter}. + </li> + <li>Call {@link android.graphics.Bitmap#recycle()} on + {@link android.graphics.Bitmap} views that are no longer needed. + </li> + <li>Use {@link java.lang.ref.WeakReference} for storing references + to {@link android.graphics.Bitmap} objects in an in-memory + {@link java.util.Collection}.</li> + <li>If you fetch images from the network, use {@link android.os.AsyncTask} + to fetch and store them on the device for faster access. + Never do network transactions on the application's UI thread. + </li> + <li>Scale down large images to a more appropriate size as you download them; + otherwise, downloading the image itself may cause an out of memory exception. + The following sample code demonstrates how to scale down images while downloading: +<pre> + // Get the source image's dimensions + BitmapFactory.Options options = new BitmapFactory.Options(); + // This does not download the actual image, just downloads headers. + options.inJustDecodeBounds = true; + BitmapFactory.decodeFile(IMAGE_FILE_URL, options); + // The actual width of the image. + int srcWidth = options.outWidth; + // The actual height of the image. + int srcHeight = options.outHeight; + + // Only scale if the source is bigger than the width of the destination view. + if(desiredWidth > srcWidth) + desiredWidth = srcWidth; + + // Calculate the correct inSampleSize/scale value. This approach helps reduce + // memory use. This value should be a power of 2. + int inSampleSize = 1; + while(srcWidth / 2 > desiredWidth){ + srcWidth /= 2; + srcHeight /= 2; + inSampleSize *= 2; + } + + float desiredScale = (float) desiredWidth / srcWidth; + + // Decode with inSampleSize + options.inJustDecodeBounds = false; + options.inDither = false; + options.inSampleSize = inSampleSize; + options.inScaled = false; + // Ensures the image stays as a 32-bit ARGB_8888 image. + // This preserves image quality. + options.inPreferredConfig = Bitmap.Config.ARGB_8888; + + Bitmap sampledSrcBitmap = BitmapFactory.decodeFile(IMAGE_FILE_URL, options); + + // Resize + Matrix matrix = new Matrix(); + matrix.postScale(desiredScale, desiredScale); + Bitmap scaledBitmap = Bitmap.createBitmap(sampledSrcBitmap, 0, 0, + sampledSrcBitmap.getWidth(), sampledSrcBitmap.getHeight(), matrix, true); + sampledSrcBitmap = null; + + // Save + FileOutputStream out = new FileOutputStream(LOCAL_PATH_TO_STORE_IMAGE); + scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); + scaledBitmap = null; +</pre> + </li> +</ul> + diff --git a/docs/html/preview/tv/ui/navigation.jd b/docs/html/preview/tv/ui/navigation.jd new file mode 100644 index 0000000..92b34cf --- /dev/null +++ b/docs/html/preview/tv/ui/navigation.jd @@ -0,0 +1,136 @@ +page.title=Navigation for TV + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + <h2>In this document</h2> + <ol> + <li><a href="#d-pad-navigation">D-pad Navigation</a></li> + <li><a href="#focus-selection">Focus and Selection</a></li> + </ol> + +</div> +</div> + +<p>TV devices provide a limited set of navigation controls for apps. Creating an effective + navigation scheme for your TV app depends on understanding these limited controls and the limits + of users' perception while operating your app. As you build your Android app for TVs, + you should pay special attention to how the user actually navigates around your app + when using remote control buttons instead of a touch screen.</p> + +<p>This guide shows you how to build an effective navigation scheme for your TV app.</p> + + +<h2 id="d-pad-navigation">D-pad Navigation</h2> + +<p>On a TV device, users navigate with controls on a remote control device, using either a + directional pad (D-pad) or arrow keys. This type of control limits movement to up, down, left, + and right. To build a great TV-optimized app, you must provide a navigation scheme where + the user can quickly learn how to navigate your app using these limited controls.</p> + +<p>Follow these guidelines to build a navigation system that works well with a D-pad on a TV device: +</p> + +<ul> + <li>Ensure that the D-pad can navigate to all the visible controls on the screen.</li> + <li>For scrolling lists with focus, D-pad up/down keys scroll the list, and the Enter key selects + an item in the list. Ensure that users can select an element in the list and that the list still + scrolls when an element is selected.</li> + <li>Ensure that movement between controls is straightforward and predictable.</li> +</ul> + +<p>The Android framework handles directional navigation between layout elements automatically, so + you typically do not need to do anything extra for your app. However, you should thoroughly test + navigation with a D-pad control to discover any navigation problems. If you discover that your + screen layout makes navigation difficult, or if you want users to move through the layout in a + specific way, you can set up explicit directional navigation for your controls. The following + code sample shows how to define the next control to receive focus for a + {@link android.widget.TextView} layout object:</p> + +<pre> +<TextView android:id="@+id/Category1" + android:nextFocusDown="@+id/Category2"\> +</pre> + +<p>The following table lists all of the available navigation attributes for Android user interface +widgets:</p> + +<table> + <tr> + <th>Attribute</th> + <th>Function</th> + </tr> + <tr> + <td>{@link android.R.attr#nextFocusDown}</td> + <td>Defines the next view to receive focus when the user navigates down.</td> + </tr> + <tr> + <td>{@link android.R.attr#nextFocusLeft}</td> + <td>Defines the next view to receive focus when the user navigates left.</td> + </tr> + <tr> + <td>{@link android.R.attr#nextFocusRight}</td> + <td>Defines the next view to receive focus when the user navigates right.</td> + </tr> + <tr> + <td>{@link android.R.attr#nextFocusUp}</td> + <td>Defines the next view to receive focus when the user navigates up.</td> + </tr> +</table> + +<p>To use one of these explicit navigation attributes, set the value to the ID ({@code android:id} + value) of another widget in the layout. You should set up the navigation order as a loop, so that + the last control directs focus back to the first one.</p> + +<p class="note"> + <strong>Note:</strong> You should only use these attributes to modify the navigation order if the + default order that the system applies does not work well. +</p> + + +<h2 id="focus-selection">Focus and Selection</h2> + +<p>The success of a navigation scheme on TV devices is strongly dependent on how easy it is for a + user to determine what user interface element is in focus on screen. If you do not provide clear + indications of what is in focus on screen (and therefore what item they can take action on), + users can quickly become frustrated and exit your app. By the same token, it is important + to always have an item in focus that a user can take action on immediately after your app starts, + and any time your app is not playing content.</p> + +<p>Your app layout and implementation should use color, size, animation, or a combination of + these attributes to help users easily determine what actions they can take next. Use a uniform + scheme for indicating focus across your application.</p> + +<p>Android provides <a href="{@docRoot}guide/topics/resources/drawable-resource.html#StateList"> +Drawable State List Resources</a> to implement highlights for selected and focused controls. The +following code example demonstates how to indicate selection of a button object: +</p> + +<pre> +<!-- res/drawable/button.xml --> +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" + android:drawable="@drawable/button_pressed" /> <!-- pressed --> + <item android:state_focused="true" + android:drawable="@drawable/button_focused" /> <!-- focused --> + <item android:state_hovered="true" + android:drawable="@drawable/button_focused" /> <!-- hovered --> + <item android:drawable="@drawable/button_normal" /> <!-- default --> +</selector> +</pre> + +<p> +This layout XML applies the above state list drawable to a {@link android.widget.Button}: +</p> +<pre> +<Button + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:background="@drawable/button" /> +</pre> + +<p>Make sure to provide sufficient padding within the focusable and selectable controls so that + the highlights around them are clearly visible.</p> + diff --git a/docs/html/preview/tv/ui/recommendations.jd b/docs/html/preview/tv/ui/recommendations.jd new file mode 100644 index 0000000..2c78064 --- /dev/null +++ b/docs/html/preview/tv/ui/recommendations.jd @@ -0,0 +1,209 @@ +page.title=Making Recommendations + +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + <h2>In this document</h2> + <ol> + <li><a href="#service">Create a Recommendations Service</a></li> + <li><a href="#build">Build Recommendations</a></li> + <li><a href="#run-service">Run Recommendations Service</a></li> + <li><a href="#DesignLandscapeLayouts">Design Landscape Layouts</a></li> + </ol> + +</div> +</div> + + +<p>Content recommendations appear as the first row of the TV launch screen after the first use + of the device. This row is intended to help users quickly find content they enjoy. Contributing + recommendations from your apps content catalog can help bring users back to your app.</p> + + +<img src="{@docRoot}preview/tv/images/home-recommendations.png" alt="" id="figure1" /> +<p class="img-caption"> + <strong>Figure 1.</strong> An example of the recommendations row. +</p> + + +<h2 id="service">Create a Recommendations Service</h2> + +<p>Content recommendations are created with background processing. In order for your application + to contribute to recommendations, you create a service that periodically adds listings from your + app's catalog to the system list of recommendations.</p> + +<p>The following code example illustrates how to extend the {@link android.app.IntentService} to + create a recommendation service for your application.</p> + +<pre> +public class RecommendationsService extends IntentService { + private static final int MAX_RECOMMENDATIONS = 3; + + public RecommendationsService() { + super("RecommendationService"); + } + + @Override + protected void onHandleIntent(Intent intent) { + MovieDatabase database = MovieDatabase.instance(getApplicationContext()); + List<Movie> recommendations = database.recommendations(); + + int count = 0; + + try { + for (Movie movie : recommendations) { + // build the individual content recommendations + buildRecommendation(getApplicationContext(), movie); + + if (++count >= MAX_RECOMMENDATIONS) { + break; + } + } + } catch (IOException e) { + Log.e(TAG, "Unable to update recommendation", e); + } + } +} +</pre> + +<p>In order for this class to be recognized and run as a service, you must register this service + using your app manifest. The following code snippet illustrates how to add this class as a + service:</p> + +<pre> +<manifest ... > + <application ... > + ... + + <service android:name=".RecommendationsService" + android:enabled="true" android:exported="true"/> + </application> +</manifest> +</pre> + +<h2 id="build">Build Recommendations</h2> + +<p>Once it starts running, your service must create recommendations and pass them to the Android + framework. The framework receives the recommendations as {@link android.app.Notification} objects + that use a specific style and are marked with a specific category.</p> + +<p>The following code example demonstrates how to get an instance of the {@link + android.app.NotificationManager}, build a recommendation, and post it to the manager:</p> + +<pre> +public class RecommendationsService extends IntentService { + + ... + + public Notification buildRecommendation(Context context, Movie movie) + throws IOException { + + if (mNotificationManager == null) { + mNotificationManager = (NotificationManager) + mContext.getSystemService(Context.NOTIFICATION_SERVICE); + } + + Bundle extras = new Bundle(); + if (mBackgroundUri != movie.getBackgroundUri()) { + extras.putString(EXTRA_BACKGROUND_IMAGE_URL, movie.getBackgroundUri()); + } + + // build the recommendation as a Notification object + Notification notification = new NotificationCompat.BigPictureStyle( + new NotificationCompat.Builder(context) + .setContentTitle(movie.getTitle()) + .setContentText(movie.getDescription()) + .setPriority(movie.getPriority()) + .setOngoing(true) + .setCategory("recommendation") + .setLargeIcon(movie.getImage()) + .setSmallIcon(movie.getSmallIcon()) + .setContentIntent(buildPendingIntent(movie.getId())) + .setExtras(extras)) + .build(); + + // post the recommendation to the NotificationManager + mNotificationManager.notify(movie.getId(), notification); + mNotificationManager = null; + return notification; + } + + private PendingIntent buildPendingIntent(long id) { + Intent detailsIntent = new Intent(this, DetailsActivity.class); + detailsIntent.putExtra("id", id); + + TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); + stackBuilder.addParentStack(DetailsActivity.class); + stackBuilder.addNextIntent(detailsIntent); + // Ensure each PendingIntent is unique + detailsIntent.setAction(Long.toString(id)); + + PendingIntent intent = stackBuilder.getPendingIntent( + 0, PendingIntent.FLAG_UPDATE_CURRENT); + return intent; + } +} +</pre> + + +<h3 id="run-service">Run Recommendations Service</h3> + +<p>Your app's recommendation service must run periodically in order to create current + recommendations. In order to run your service, you should create a class that runs a timer and + invokes it at regular intervals. The following code example extends the {@link + android.content.BroadcastReceiver} class to start periodic execution of a recommendation service + every 12 hours:</p> + +<pre> +public class BootupReceiver extends BroadcastReceiver { + private static final String TAG = "BootupActivity"; + + private static final long INITIAL_DELAY = 5000; + + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().endsWith(Intent.ACTION_BOOT_COMPLETED)) { + scheduleRecommendationUpdate(context); + } + } + + private void scheduleRecommendationUpdate(Context context) { + AlarmManager alarmManager = (AlarmManager)context.getSystemService( + Context.ALARM_SERVICE); + Intent recommendationIntent = new Intent(context, + UpdateRecommendationsService.class); + PendingIntent alarmIntent = PendingIntent.getService(context, 0, + recommendationIntent, 0); + + alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, + INITIAL_DELAY, + AlarmManager.INTERVAL_HALF_DAY, + alarmIntent); + } +} +</pre> + +<p>In order for the {@link android.content.BroadcastReceiver} class to execute after a TV + device starts up, you must register this class in your app manifest and attach an intent filter + in order for the device boot process to complete. This sample code demonstrates how to add this + configuration to the manifest:</p> + +<pre> +<manifest ... > + <application ... > + <receiver android:name=".BootupReceiver" android:enabled="true" + android:exported="false"> + <intent-filter> + <action android:name="android.intent.action.BOOT_COMPLETED"/> + </intent-filter> + </receiver> + </application> +</manifest> +</pre> + +<p class="important"> + <strong>Important:</strong> Receiving a boot completed notification requires that your app + request the {@link android.Manifest.permission#RECEIVE_BOOT_COMPLETED} permission. + For more information, see {@link android.content.Intent#ACTION_BOOT_COMPLETED}. +</p> diff --git a/docs/html/sdk/exploring.jd b/docs/html/sdk/exploring.jd index 7749060..b34c1cf 100644 --- a/docs/html/sdk/exploring.jd +++ b/docs/html/sdk/exploring.jd @@ -5,163 +5,6 @@ walkthru=1 @jd:body -<p>The Android SDK is composed of modular packages that you can download separately using -the Android SDK Manager. For example, when the SDK Tools are updated or a new version of -the Android platform is released, you can use the SDK Manager to quickly download them to -your environment. Simply follow the procedures described in <a -href="{@docRoot}sdk/installing/adding-packages.html">Adding Platforms and Packages</a>.</p> - -<p>There are several different packages available for the Android SDK. The table below describes -most of the available packages and where they're located once you download them.</p> - - -<h2 id="Packages">Available Packages</h2> - - -<table> - <tr><th>Package</th><th>Description</th><th>File Location</th></tr> - <tr> - <td><a href="{@docRoot}tools/sdk/tools-notes.html">SDK Tools</a></td> - <td>Contains tools for debugging and testing, plus other -utilities that are required to develop an app. If you've just installed the SDK starter package, -then you already have the latest version of this package. Make sure you keep this up to date.</td> - <td>{@code <sdk>/tools/}</td></tr> - <tr><td>SDK Platform-tools</td> - <td>Contains platform-dependent tools for developing and debugging -your application. These tools support the latest features of the Android platform and are typically -updated only when a new platform becomes available. These tools are always backward compatible with -older platforms, but you must be sure that you have the latest version of these tools when you -install a new SDK platform.</td> - <td>{@code <sdk>/platform-tools/}</td> - </tr> - - <tr> - <td>Documentation</td> - <td>An offline copy of the latest documentation for the Android -platform APIs.</td> - <td>{@code <sdk>/docs/}</td> - </tr> - <tr><td>SDK Platform</td> - <td>There's one SDK Platform available for each version of Android. It includes an {@code -android.jar} file with a fully compliant Android library. In order to build an Android app, you must -specify an SDK platform as your build target.</td> - <td>{@code <sdk>/platforms/<android-version>/}</td> - </tr> - <tr> - <td>System Images</td> - <td>Each platform version offers one or more different system images (such as for ARM -and x86). The Android emulator requires a system image to operate. You should always test your -app on the latest version of Android and using the emulator with the latest system image is a -good way to do so.</td> - <td>{@code <sdk>/platforms/<android-version>/}</td> - </tr> - <tr> - <td>Sources for Android SDK</td> - <td>A copy of the Android platform source code that's useful for -stepping through the code while debugging your app.</td> - <td>{@code <sdk>/sources/}</td> - </tr> - <tr> - <td><a href="{@docRoot}tools/samples/index.html">Samples for SDK</a></td> - <td>A collection of sample apps that demonstrate a variety of the -platform APIs. These are a great resource to browse Android app code. The API Demos app in -particular provides a huge number of small demos you should explore.</td> - <td>{@code <sdk>/platforms/<android-version>/samples/}</td> - </tr> - <tr> - <td><a href="http://developers.google.com/android">Google APIs</a></td> - <td>An SDK add-on that provides both a platform you can use to develop an app -using special Google APIs and a system image for the emulator so you can test your app using the -Google APIs.</td> - <td>{@code <sdk>/add-ons/}</td> - </tr> - - <tr> - <td><a href="{@docRoot}tools/support-library/index.html">Android Support</a></td> - <td>A static library you can include in your app sources in order to use powerful -APIs that aren't available in the standard platform. For example, the support library -contains versions of the {@link android.support.v4.app.Fragment} class that's compatible with -Android 1.6 and higher (the class was originally introduced in Android 3.0) and the {@link -android.support.v4.view.ViewPager} APIs that allow you to easily build a side-swipeable UI.</td> - <td>{@code <sdk>/extras/android/support/}</td> - </tr> - <tr> - <td><a href="{@docRoot}google/play/billing/index.html">Google Play Billing</a></td> - <td>Provides the static libraries and samples that allow you to -integrate billing services in your app with Google Play.</td> - <td>{@code <sdk>/extras/google/}</td> - </tr> - <tr> - <td><a href="{@docRoot}google/play/licensing/index.html">Google Play Licensing</a></td> - <td>Provides the static libraries and samples that allow you to perform license verification for -your app when distributing with Google Play.</td> - <td>{@code <sdk>/extras/google/}</td> - </tr> -</table> - -<p>The above table is not comprehensive and you can <a -href="#AddingSites">add new sites</a> to download additional packages from third-parties.</p> - -<p>In some cases, an SDK package may require a specific minimum revision of -another package or SDK tool. For example, there may be a dependency between the ADT Plugin for -Eclipse and -the SDK Tools package. When you install the SDK Tools -package, you should also upgrade to the required version of ADT (if you -are developing in Eclipse). In this case, the major version number for your ADT plugin should -always match the revision number of your SDK Tools (for example, ADT 8.x requires SDK Tools r8). -</p> - -<p>The development tools will notify you with debug warnings if there is dependency that you need to -address. The Android SDK Manager also enforces dependencies by requiring that you download any -packages that are needed by those you have selected.</p> - - - - - -<h2 id="AddingSites">Adding New Sites</h2> - -<p>By default, <strong>Available Packages</strong> displays packages available from the -<em>Android Repository</em> and <em>Third party Add-ons</em>. You can add other sites that host -their own Android SDK add-ons, then download the SDK add-ons -from those sites.</p> - -<p>For example, a mobile carrier or device manufacturer might offer additional -API libraries that are supported by their own Android-powered devices. In order -to develop using their libraries, you must install their Android SDK add-on, if it's not already -available under <em>Third party Add-ons</em>. </p> - -<p>If a carrier or device manufacturer has hosted an SDK add-on repository file -on their web site, follow these steps to add their site to the Android SDK -Manager:</p> - -<ol> - <li>Select <strong>Available Packages</strong> in the left panel.</li> - <li>Click <strong>Add Add-on Site</strong> and enter the URL of the -<code>repository.xml</code> file. Click <strong>OK</strong>.</li> -</ol> -<p>Any SDK packages available from the site will now be listed under a new item named -<strong>User Add-ons</strong>.</p> - - - - -<h2 id="troubleshooting">Troubleshooting</h2> - -<p><strong>Problems connecting to the SDK repository</strong></p> - -<p>If you are using the Android SDK Manager to download packages and are encountering -connection problems, try connecting over http, rather than https. To switch the -protocol used by the Android SDK Manager, follow these steps: </p> - -<ol> - <li>With the Android SDK Manager window open, select "Settings" in the - left pane. </li> - <li>On the right, in the "Misc" section, check the checkbox labeled "Force - https://... sources to be fetched using http://..." </li> - <li>Click <strong>Save & Apply</strong>.</li> -</ol> - diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd index e7f78e8..dc3b9dd 100644 --- a/docs/html/sdk/index.jd +++ b/docs/html/sdk/index.jd @@ -206,12 +206,10 @@ This is the Android Software Development Kit License Agreement <div id="next-steps" style="display:none;position:absolute;width:inherit"> - <p>Now that you've downloaded the Android SDK, you don't need to return here - for SDK updates. The SDK tools allow you to - install additional packages and future updates from the SDK Manager.</p> - <p>For instructions about setting up your Android SDK for the first time, - read <a id="next-link" href="{@docRoot}sdk/installing/bundle.html">Setting - Up the ADT Bundle</a>.</p> + <p>You're just a few steps away from building apps for Android!</p> + <p>In a moment, you'll be redirected to <a + id="next-link" href="{@docRoot}sdk/installing/index.html">Installing the + Android SDK</a>.</p> </div><!-- end next-steps --> @@ -232,7 +230,6 @@ This is the Android Software Development Kit License Agreement </div> - </div><!-- end TOS --> @@ -255,16 +252,30 @@ Android SDK components and a version of the Eclipse IDE with built-in <b>ADT (Android Developer Tools)</b> to streamline your Android app development.</p> -<p>With a single download, the ADT Bundle + +<!-- this appears when viewing the online docs --> +<div class="online" style="margin-bottom:85px"> + +<a class="big button subtitle" id="download-bundle-button" +href="" style="width:295px;display:block;margin:25px 0" ></a> + +<p id="not-supported">Choose the SDK package for your OS from the table below.</p> + + + <p>With a single download, the Eclipse ADT bundle includes everything you need to begin developing apps:</p> <ul> <li>Eclipse + ADT plugin</li> <li>Android SDK Tools</li> <li>Android Platform-tools</li> -<li>The latest Android platform</li> -<li>The latest Android system image for the emulator</li> +<li>A version of the Android platform</li> +<li>A version of the Android system image for the emulator</li> </ul> +</div> +<!-- end online --> + + <!-- this appears when viewing the offline docs --> <p class="offline"> @@ -277,52 +288,44 @@ href="http://developer.android.com/sdk/index.html">developer.android.com/sdk/</a <div class="col-7" style="margin-right:0;"> - <img src="{@docRoot}images/sdk-cube.png" alt="" height=264 /> - -<!-- this appears when viewing the online docs --> -<div class="online"> - -<a class="big button subtitle" id="download-bundle-button" -href="" style="display:none;width:265px;margin:0 auto;display:block" ></a> + <img src="{@docRoot}images/tools-home.png" alt="" height="347" width="400" /> +</div><!-- end col-7 --> -<p id="not-supported">Choose the SDK package for your OS from the table below.</p> -</div> -<!-- end online --> -</div><!-- end col-7 --> +<div class="col-7" style="background: #ddd; + padding: 30px 20px; width:350px; margin:20px 0 0 20px;"> + <h3 style="margin-top:0"> + <a href="/sdk/installing/studio.html">Get Android Studio Beta</a> + </h3> + <p> + Android Studio is a new IDE powered by IntelliJ that provides new features and improvements + over ADT. It's currently in beta but will be the official Android IDE once it's ready.</p> + <p style="margin: 0;"> + <a href="/sdk/installing/studio.html">Learn more about Android Studio</a></p> + </div> <!-- alternative SDK options --> -<div class="col-13" style="margin:0;"> - +<div class="col-13" style="margin:-70px 0 0;"> -<!-- this appears only when viewing the online docs --> -<div class="online caution"> -<h3 style="margin:0 0 10px 0;font-size:14px">Android Studio Early Access Preview</h3> -<p>A new Android development environment called Android Studio, -based on IntelliJ IDEA, is now available as an <strong>early access preview</strong>. -For more information, see -<a href="{@docRoot}sdk/installing/studio.html">Getting Started with Android Studio</a>.</p> +<p style="width:340px">If you prefer to use an existing version of Eclipse or another IDE, +you can instead download the stand-alone Android SDK Tools:</p> -</div> -<p>If you prefer to use an existing version of Eclipse or another IDE, -you can instead take a more customized approach to installing -the Android SDK. See the following instructions:</p> <h4 id="ExistingIDE"><a href='' class="expandable" onclick="toggleExpandable(this,'.myide');hideExpandable('.pax,.reqs');return false;" - >USE AN EXISTING IDE</a></h4> + >GET THE SDK FOR AN EXISTING IDE</a></h4> <div class="col-13 myide" style="margin:0 0 15px;display:none;"> @@ -335,13 +338,11 @@ the ADT plugin to it.</p> <a class="button subtitle" id="download-tools-button" href="" style="display:none" ></a> </p> - </div> - <h4 id="Requirements"><a href='' class="expandable" onclick="toggleExpandable(this,'.reqs');hideExpandable('.pax,.myide');return false;" >SYSTEM REQUIREMENTS</a></h4> @@ -361,23 +362,9 @@ the ADT plugin to it.</p> </ul> </div> -<div class="col-6 reqs" style="margin:0 0 15px 20px;display:none;"> -<h5>Eclipse IDE</h5> - <ul> - <li><a href="http://eclipse.org/mobile/">Eclipse</a> 3.7.2 (Indigo) or greater -<p class="note"><strong>Note:</strong> Eclipse 3.6 (Helios) is no longer -supported with the latest version of ADT.</p></li> - <li>Eclipse <a href="http://www.eclipse.org/jdt">JDT</a> plugin (included -in most Eclipse IDE packages) </li> - <li><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK 6</a> - (JRE alone is not sufficient)</li> - <li><a href="{@docRoot}tools/sdk/eclipse-adt.html">Android Development Tools plugin</a> -(recommended)</li> - <li><strong>Not</strong> compatible with GNU Compiler for Java (gcj)</li> - </ul> - +<div class="col-7 reqs" style="margin:0 0 80px 20px;display:none;"> -<h5>Other development environments</h5> +<h5>Development tools</h5> <ul> <li><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK 6</a> (JRE alone is not sufficient)</li> @@ -387,6 +374,4 @@ in most Eclipse IDE packages) </li> <p class="note"><strong>Note:</strong> Some Linux distributions may include JDK 1.4 or Gnu Compiler for Java, both of which are <em>not</em> supported for Android development. </p> -</div><!-- end col-7 reqs --> - - +</div><!-- end reqs --> diff --git a/docs/html/sdk/installing/adding-packages.jd b/docs/html/sdk/installing/adding-packages.jd index bba936e..e6c0118 100644 --- a/docs/html/sdk/installing/adding-packages.jd +++ b/docs/html/sdk/installing/adding-packages.jd @@ -1,63 +1,226 @@ -page.title=Adding Platforms and Packages +page.title=Adding SDK Packages @jd:body +<style> +ol.large { + margin-left:0; +} +ol.large > li { + list-style-position: inside; + list-style-type:none; + margin:30px 0 0 0; + padding:30px 20px; + background:#eee; +} +ol.large > li:nth-child(odd) { +} +ol.large > li:before { + display:inline; + left:-40px; + float:left; + width:20px; + font-size:20px; + line-height:20px; +} +ol.large > li > h2 { + font-size:20px; + line-height:20px; + padding:0 0 0 20px; + margin:0 0 20px 0; + display:inline-block; + font-weight:normal; +} +ol.large > li:nth-child(1):before { + content:"1. "; +} +ol.large > li:nth-child(2):before { + content:"2. "; +} +ol.large > li:nth-child(3):before { + content:"3. "; +} +ol.large > li:nth-child(4):before { + content:"4. "; +} +ol.large > li:nth-child(5):before { + content:"5. "; +} +ol.large > li:nth-child(6):before { + content:"6. "; +} +</style> -<p>The Android SDK separates tools, platforms, and other components into packages you can - download using the Android SDK Manager. The original -SDK package you've downloaded includes only the SDK Tools. To develop an Android app, -you also need to download at least one Android platform and the latest SDK Platform-tools.</p> -<ol> -<li>Launch the SDK Manager. -<p>If you've used the Windows installer to install the SDK tools, you should already have the -Android SDK Manager open. Otherwise, you can launch the Android SDK Manager in one of the following -ways:</p> +<p> +By default, the Android SDK does not include everything you need to start developing. +The SDK separates tools, platforms, and other components into packages you can +download as needed using the +<a href="{@docRoot}tools/help/sdk-manager.html">Android SDK Manager</a>. +So before you can start, there are a few packages you should add to your Android SDK.</p> + +<p>To start adding packages, launch the Android SDK Manager in one of the following ways:</p> <ul> - <li>On Windows, double-click the <code>SDK Manager.exe</code> file at the root of the Android -SDK directory.</li> - <li>On Mac or Linux, open a terminal and navigate to the <code>tools/</code> directory in the -Android SDK, then execute <code>android sdk</code>.</li> + <li>In Eclipse or Android Studio, click <strong>SDK Manager</strong> +<img src="{@docRoot}images/tools/sdk-manager-studio.png" +style="vertical-align:bottom;margin:0;height:17px" /> in the toolbar.</li> + <li>If you're not using Eclipse or Android Studio: + <ul> + <li>Windows: Double-click the <code>SDK Manager.exe</code> file at the root of the Android + SDK directory.</li> + <li>Mac/Linux: Open a terminal and navigate to the <code>tools/</code> directory in the + Android SDK, then execute <code>android sdk</code>.</li> + </ul> + </li> </ul> + +<p>When you open the SDK Manager for the first time, several packages will be selected by +default. Leave these selected, but be sure you have everything you need +to get started by following these steps:</p> + + +<ol class="large"> +<li> + <h2 id="GetTools" class="norule">Get the latest SDK tools</h2> + +<img src="/images/sdk_manager_packages.png" alt="" width="350" style="float:right;margin-left:20px" /> + + <p>As a minimum when setting up the Android SDK, + you should download the latest tools and Android platform:</p> + <ol> + <li>Open the Tools directory and select: + <ul> + <li><strong>Android SDK Tools</strong></li> + <li><strong>Android SDK Platform-tools</strong></li> + <li><strong>Android SDK Build-tools</strong> (highest version)</li> + </ul> + </li> + <li>Open the first Android X.X folder (the latest version) and select: + <ul> + <li><strong>SDK Platform</strong></li> + <li>A system image for the emulator, such as <br> + <strong>ARM EABI v7a System Image</strong></li> + </ul> + </li> + </ol> </li> -<li>The SDK Manager shows all the SDK packages available for you to add to your Android SDK. -As a minimum configuration for your SDK, we recommend you install the following: -<ul> - <li>The latest Tools packages (check the <strong>Tools</strong> folder).</li> - <li>The latest version of Android (check the first <strong>Android</strong> folder).</li> - <li>The Android Support Library (open the <strong>Extras</strong> folder and check - <strong>Android Support Library</strong>).</li> -</ul> +<li> + <h2 id="GetSupportLib" class="norule">Get the support library for additional APIs</h2> -<p>Once you've chosen your packages, click <strong>Install</strong>. The Android SDK Manager -installs the selected packages into your Android SDK environment.</li> -</ol> + <div class="sidebox"> + <p>The support library is required for:</p> + <ul> + <li><a href="{@docRoot}wear/index.html">Android Wear</a></li> + <li><a href="{@docRoot}tv/index.html">Android TV</a></li> + <li><a href="{@docRoot}google/play-services/cast.html">Google Cast</a></li> + </ul> -<p>With these packages installed, you're ready to start developing. -To get started, read <a href="{@docRoot}training/basics/firstapp/index.html" ->Building Your First App</a>.</p> + <p>It also provides these popular APIs:</p> + <ul> + <li><a href="{@docRoot}reference/android/support/v4/widget/DrawerLayout.html">Navigation + drawer</a></li> + <li><a href="{@docRoot}reference/android/support/v4/view/ViewPager.html">Swipe views</a></li> + <li><a href="{@docRoot}reference/android/support/v7/app/ActionBar.html">Backward-compatible + action bar</a></li> + </ul> + </div> -<img src="/images/sdk_manager_packages.png" alt="" height="396" /> -<p class="img-caption"><strong>Figure 1.</strong> The Android SDK Manager shows the -SDK packages that are available, already installed, or for which an update is available.</p> + <p>The <a href="{@docRoot}tools/support-library/features.html">Android Support Library</a> + provides an extended set of APIs that are compatible with most versions of Android.</p> + <p>Open the <strong>Extras</strong> directory and select:</p> + <ul> + <li><strong>Android Support Repository</strong></li> + <li><strong>Android Support Library</strong></li> + </ul> + <p> </p> + <p> </p> -<h3>Additional information</h3> +</li> -<ul> - <li>For more information about using the SDK Manager and some of the available packages, -see the <a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a> document.</li> - <li>This web site provides all information you need to develop Android apps, including <a -href="{@docRoot}design/index.html">design guidelines</a>, -<a href="{@docRoot}training/index.html">developer training</a>, <a -href="{@docRoot}reference/packages.html">API reference</a>, and information -about how you can <a href="{@docRoot}distribute/index.html">distribute your app</a>. We recommend -you begin by reading <a href="{@docRoot}training/basics/firstapp/index.html" ->Building Your First App</a>.</li> - <li>For additional resources about developing and distributing your app, see the -<a href="{@docRoot}support.html">Developer Support Resources</a>.</li> -</ul> + +<li> + <h2 id="GetGoogle" class="norule">Get Google Play services for even more APIs</h2> + + <div class="sidebox"> + + <p>The Google Play services APIs provide a variety of features and services for your Android + apps, such as:</p> + <ul> + <li><a href="{@docRoot}google/play-services/plus.html">User authentication</a></li> + <li><a href="{@docRoot}google/play-services/maps.html">Google Maps</a></li> + <li><a href="{@docRoot}google/play-services/cast.html">Google Cast</a></li> + <li><a href="{@docRoot}google/play-services/games.html">Games achievements and + leaderboards</a></li> + <li><a href="{@docRoot}google/play-services/index.html">And much more</a></li> + </ul> + </div> + + <p>To develop with Google APIs, you need the Google Play services package:</p> + <p>Open the <strong>Extras</strong> directory and select:</p> + <ul> + <li><strong>Google Repository</strong></li> + <li><strong>Google Play services</strong></li> + </ul> + + <p class="note"><strong>Note:</strong> Google Play services APIs are not available on all + Android-powered devices, but are available on all devices with Google Play Store. To use these + APIs in the Android emulator, you must also install the the <strong>Google APIs</strong> + system image from the latest Android X.X directory in the SDK Manager.</p> +</li> + + +<li> + <h2 id="Install" class="norule">Install the packages</h2> + <p>Once you've selected all the desired packages, continue to install:</p> + <ol> + <li>Click <strong>Install X packages</strong>.</li> + <li>In the next window, double-click each package name on the left + to accept the license agreement for each.</li> + <li>Click <strong>Install</strong>.</li> + </ol> + <p>The download progress is shown at the bottom of the SDK Manager window. + <strong>Do not exit the SDK Manager</strong> or it will cancel the download.</p> +</li> + +<li> + <h2 id="Build" class="norule">Build something!</h2> + +<p>With the above packages now in your Android SDK, you're ready to build apps +for Android. As new tools and other APIs become available, simply launch the SDK Manager + to download the new packages for your SDK.</p> + +<p>Here are a few options for how you should proceed:</p> + +<div class="cols" style="padding:10px 0"> +<div class="col-4"> +<h3>Get started</h3> +<p>If you're new to Android development, learn the basics of Android apps by following +the guide to <strong><a href="{@docRoot}training/basics/firstapp/index.html" +>Building Your First App</a></strong>.</p> + +</div> +<div class="col-4 box"> +<h3>Build for wearables</h3> +<p>If you're ready to start building apps for Android wearables, see the guide to +<strong><a href="{@docRoot}wear/preview/start.html">Building Apps for Android Wear</a></strong>.</p> + +</div> +<div class="col-4 box"> +<h3>Use Google APIs</h3> +<p>To start using Google APIs, such as Maps or +Play Game services, see the guide to +<strong><a href="{@docRoot}google/play-services/setup.html">Setting Up Google Play +Services</a></strong>.</p> + +</div> +</div><!-- end cols --> + + +</li> + +</ol> diff --git a/docs/html/sdk/installing/bundle.jd b/docs/html/sdk/installing/bundle.jd index 1f7da55..22bdd11 100644 --- a/docs/html/sdk/installing/bundle.jd +++ b/docs/html/sdk/installing/bundle.jd @@ -1,45 +1,3 @@ page.title=Setting Up the ADT Bundle @jd:body - - -<p>The ADT Bundle provides everything you need to start developing apps, including -a version of the Eclipse IDE with built-in <b>ADT (Android Developer Tools)</b> to -streamline your Android app development. -If you haven't already, go download the <a href="{@docRoot}sdk/index.html" ->Android ADT Bundle</a>. (If you downloaded the SDK Tools only, for use with an -existing IDE, you should instead read -<a href="{@docRoot}sdk/installing/index.html">Setting Up an Existing IDE</a>.)</p> - -<h3>Install the SDK and Eclipse IDE</h3> -<ol> -<li>Unpack the ZIP file -(named {@code adt-bundle-<os_platform>.zip}) and save it to an appropriate location, -such as a "Development" directory in your home directory.</li> -<li>Open the {@code adt-bundle-<os_platform>/eclipse/} directory and launch -<strong>eclipse</strong>.</li> -</ol> - -<p>That's it! The IDE is already loaded with the Android Developer Tools plugin and -the SDK is ready to go. To start developing, read <a href="{@docRoot}training/basics/firstapp/index.html" ->Building Your First App</a>.</p> - -<p class="caution"><strong>Caution:</strong> Do not move any of the files or directories -from the {@code adt-bundle-<os_platform>} directory. If you move the {@code eclipse} -or {@code sdk} directory, ADT will not be able to locate the SDK and you'll -need to manually update the ADT preferences.</p> - -<h3>Additional information</h3> - -<p>As you continue developing apps, you may need to install additional versions -of Android for the emulator and other packages such as the library for -Google Play In-app Billing. To install more packages, use -the <a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a>.</p> - -<p>Everything you need to develop Android apps is on this web site, including <a -href="{@docRoot}design/index.html">design guidelines</a>, -<a href="{@docRoot}training/index.html">developer training</a>, <a -href="{@docRoot}reference/packages.html">API reference</a>, and information -about how you can <a href="{@docRoot}distribute/index.html">distribute your app</a>. -For additional resources about developing and distributing your app, see the -<a href="{@docRoot}support.html">Developer Support Resources</a>.</p>
\ No newline at end of file diff --git a/docs/html/sdk/installing/create-project.jd b/docs/html/sdk/installing/create-project.jd new file mode 100644 index 0000000..c0d523a --- /dev/null +++ b/docs/html/sdk/installing/create-project.jd @@ -0,0 +1,86 @@ +page.title=Creating a Project + +@jd:body + +<p>Android Studio makes it easy to create Android apps for several form factors, such as phone, +tablet, TV, Wear, and Google Glass. The <em>New Project</em> wizard lets you choose the form factors +for your app and populates the project structure with everything you need to get started.</p> + +<p>Follow the steps in this section to create a project in Android Studio.</p> + +<h2>Step 1: Create a New Project</h2> + +<p>If you didn't have a project opened, Android Studio shows the Welcome screen. +To create a new project, click <strong>New Project</strong>.</p> + +<p>If you had a project opened, Android Studio shows the development environment. +To create a new project, click <strong>File</strong> > <strong>New Project</strong>.</p> + +<p>The next window lets you configure the name of your app, the package name, and the location +of your project.</p> + +<img src="{@docRoot}images/tools/wizard2.png" alt="" width="500" height="381"> +<p class="img-caption"><strong>Figure 1.</strong> Choose a name for your project.</p> + +<p>Enter the values for your project and click <strong>Next</strong>.</p> + + +<h2>Step 2: Select Form Factors and API Level</h2> + +<p>The next window lets you select the form factors supported by your app, such as phone, tablet, +TV, Wear, and Google Glass. For each form factor, you can also select the API +Level that your app requires. To get more information, click <strong>Help me choose</strong>.</p> + +<img src="{@docRoot}images/tools/wizard4.png" alt="" width="750" height="510"> +<p class="img-caption"><strong>Figure 2.</strong> Select the API Level.</p> + +<p>The API Level window shows the distribution of mobile devices running each version of Android, +as shown in Figure 2. Click on an API level to see a list of features introduced in the corresponding +version of Android. This helps you choose the minimum API Level that has all the features that +your apps needs, so you can reach as many devices as possible. Then click <strong>OK</strong>.</p> + +<img src="{@docRoot}images/tools/wizard3.png" alt="" width="500" height="480"> +<p class="img-caption"><strong>Figure 3.</strong> Choose form factors for your app.</p> + +<p>Then, on the Form Factors Window, click <strong>Next</strong>.</p> + + +<h2>Step 3: Add an Activity</h2> + +<p>The next screen lets you select an activity type to add to your app, as shown in Figure 4. +This screen depends on the form factors you selected earlier.</p> + +<img src="{@docRoot}images/tools/wizard5.png" alt="" width="720" height="504"> +<p class="img-caption"><strong>Figure 4.</strong> Add an activity to your app.</p> + +<p>Choose an activity type and click <strong>Next</strong>.</p> + + +<h2>Step 4: Configure Your Activity</h2> + +<p>The next screen lets you configure the activity to add to your app, as shown in Figure 6.</p> + +<img src="{@docRoot}images/tools/wizard6.png" alt="" width="450" height="385"> +<p class="img-caption"><strong>Figure 6.</strong> Choose a name for your activity.</p> + +<p>Enter the activity name, the layout name, and the activity title. Then click +<strong>Finish</strong>.</p> + + +<h2>Step 5: Develop Your App</h2> + +<p>Android Studio creates the default structure for your project and opens the development +environment. If your app supports more than one form factor, Android Studio creates a module for +each of them, as shown in Figure 7.</p> + +<img src="{@docRoot}images/tools/wizard7.png" alt="" width="750" height="509"> +<p class="img-caption"><strong>Figure 7.</strong> The default project structure for a mobile app.</p> + +<p>Now you are ready to develop your app. Fore more information, see the following links:</p> + +<ul> +<li><a href="{@docRoot}training/">Training Lessons</a></li> +<li><a href="{@docRoot}training/building-wearables.html">Building Apps for Wearables</a></li> +<li><a href="{@docRoot}tv/">Android TV</a></li> +<li><a href="https://developers.google.com/glass/">Google Glass</a></li> +</ul> diff --git a/docs/html/sdk/installing/index.jd b/docs/html/sdk/installing/index.jd index 6b63ba7..304b53d 100644 --- a/docs/html/sdk/installing/index.jd +++ b/docs/html/sdk/installing/index.jd @@ -1,19 +1,217 @@ -page.title=Setting Up an Existing IDE +page.title=Installing the Android SDK @jd:body +<style> +p.paging-links { + margin:0 0 40px; +} +.paging-links .next-page-link { + right:initial; +} +.procedure-box { + padding:20px 20px 5px; + margin-bottom:1em; + background:#eee; +} +.landing-button { + min-width: 155px; + text-align: center; +} +</style> + + + +<!-- ################### ADT BUNDLE ####################### --> +<div id="adt" heading="Installing the Eclipse ADT Bundle" style="display:none"> + + +<p>The Eclipse ADT Bundle provides everything you need to start developing apps, including +the Android SDK tools and a version of the Eclipse IDE with built-in ADT +(Android Developer Tools) to streamline your Android app development.</p> + +<p>If you didn't download the Eclipse ADT bundle, go <a href="{@docRoot}sdk/index.html" +><b>download the Eclipse ADT bundle now</b></a>, or switch to the +<a href="{@docRoot}sdk/installing/index.html?pkg=studio">Android Studio +install</a> or <a href="{@docRoot}sdk/installing/index.html?pkg=tools">stand-alone SDK Tools +install</a> instructions</i>.</p> + +<div class="procedure-box"> +<p><b>To set up the ADT Bundle:</b></p> +<ol> +<li>Unpack the ZIP file +(named {@code adt-bundle-<os_platform>.zip}) and save it to an appropriate location, +such as a "Development" directory in your home directory.</li> +<li>Open the {@code adt-bundle-<os_platform>/eclipse/} directory and launch +<strong>Eclipse</strong>.</li> +</ol> + +<p class="caution"><strong>Caution:</strong> Do not move any of the files or directories +from the {@code adt-bundle-<os_platform>} directory. If you move the {@code eclipse/} +or {@code sdk/} directory, ADT will not be able to locate the SDK and you'll +need to manually update the ADT preferences.</p> +</div> + +<p>Eclipse with ADT is now ready and loaded with the Android developer tools, but there are still +a couple packages you should add to make your Android SDK complete.</p> + +<p class="paging-links"> +<a href="{@docRoot}sdk/installing/adding-packages.html" class="next-page-link"> +Continue: Adding SDK Packages</a></p> + + +</div> +<!-- ################ END ADT BUNDLE ##################### --> + + + + + + +<!-- ################ STUDIO ##################### --> +<div id="studio" heading="Installing Android Studio" style="display:none"> + +<p>Android Studio provides everything you need to start developing apps, including +the Android SDK tools and the Android Studio IDE (powered by IntelliJ) to +streamline your Android app development.</p> + +<p>If you didn't download Android Studio, go <a href="{@docRoot}sdk/installing/studio.html" +><b>download Android Studio now</b></a>, or switch to the +<a href="{@docRoot}sdk/installing/index.html?pkg=adt">Eclipse ADT +install</a> or <a href="{@docRoot}sdk/installing/index.html?pkg=tools">stand-alone SDK Tools +install</a> instructions.</p> + + +<p>Before you set up Android Studio, be sure you have installed +JDK 6 or greater (the JRE alone is not sufficient). To check if you +have JDK installed (and which version), open a terminal and type <code>javac -version</code>. +If the JDK is not available or the version is lower than 6, +<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" class="external-link" +>go download JDK</a>.</p> + + +<div class="procedure-box"> + +<p id="instructions-toggle" +style="float:right;font-size:13px"><a href='' onclick='showAll();return false;' +>[ Show instructions for all platforms ]</a></p> + +<div class="win docs" style="display:none"> + +<p><b>To set up Android Studio on Windows:</b></p> + <ol> + <li>Launch the downloaded EXE file, {@code android-studio-bundle-<version>.exe}.</li> + <li>Follow the setup wizard to install Android Studio. + + <p>On some Windows systems, the launcher script does not find where Java is installed. + If you encounter this problem, + you need to set an environment variable indicating the correct location.</p> + <p>Select <strong>Start menu > Computer > System Properties > + Advanced System Properties</strong>. Then open <strong>Advanced tab > Environment + Variables</strong> and add a new system variable <code>JAVA_HOME</code> that points to + your JDK folder, for example <code>C:\Program Files\Java\jdk1.7.0_21</code>.</p> + </p> + </li> + + </ol> + + +<p>The individual tools and +other SDK packages are saved within the Android Studio application directory. +If you need to access the tools directly, use a terminal to navigate into the application and locate +the {@code sdk/} directory. For example:</p> +<p><code>\Users\<user>\AppData\Local\Android\android-studio\sdk\</code></p> + + + +</div><!-- end windows --> + + +<div class="mac docs" style="display:none"> + +<p><b>To set up Android Studio on Mac OSX:</b></p> + <ol> + <li>Open the downloaded DMG file, {@code android-studio-bundle-<version>.dmg}.</li> + <li>Drag and drop Android Studio into the Applications folder. + <p> + Depending on your security settings, when you attempt to open Android Studio, you might + see a warning that says the package is damaged and should be moved to the trash. If this + happens, go to <strong>System Preferences > Security & Privacy</strong> and under + <strong>Allow applications downloaded from</strong>, select <strong>Anywhere</strong>. + Then open Android Studio again.</p> + </li> + </ol> + +<p>The individual tools and +other SDK packages are saved within the Android Studio application directory. +If you need access the tools directly, use a terminal to navigate into the application and locate +the {@code sdk/} directory. For example:</p> +<p><code>/Applications/Android\ Studio.app/sdk/</code></p> + + +</div><!-- end mac --> + + +<div class="linux docs" style="display:none"> + +<p><b>To set up Android Studio on Linux:</b></p> + + <ol> + <li>Unpack the downloaded Tar file, {@code android-studio-bundle-<version>.tgz}, into an appropriate + location for your applications. + <li>To launch Android Studio, navigate to the {@code android-studio/bin/} directory + in a terminal and execute {@code studio.sh}. + <p>You may want to add {@code android-studio/bin/} to your PATH environmental + variable so that you can start Android Studio from any directory.</p> + </li> + </ol> + +</div><!-- end linux --> +</div><!-- end procedure box --> + +<p>Android Studio is now ready and loaded with the Android developer tools, but there are still a +couple packages you should add to make your Android SDK complete.</p> + +<p class="paging-links"> +<a href="{@docRoot}sdk/installing/adding-packages.html" class="next-page-link"> +Continue: Adding SDK Packages</a></p> + + +</div> +<!-- ################ END STUDIO ##################### --> + + -<p>You should have already downloaded the <a href="{@docRoot}sdk/index.html#ExistingIDE" ->Android SDK Tools</a>. (If you downloaded the ADT Bundle, you should instead read -<a href="{@docRoot}sdk/installing/bundle.html">Setting Up the ADT Bundle</a>.)</p> -<p>The SDK Tools package is not the complete SDK environment. It includes only the core SDK tools, which you can -use to download the rest of the SDK packages (such as the latest system image).</p> -<div id="win" class="docs" style="display:none"> -<h3>Getting started on Windows</h3> + + +<!-- ################ JUST SDK TOOLS ##################### --> +<div id="tools" heading="Installing the Stand-alone SDK Tools" style="display:none"> + + +<p>The stand-alone SDK Tools package does not include a complete Android development environment. +It includes only the core SDK tools, which you can access from a command line or with a plugin +for your favorite IDE (if available).</p> + +<p>If you didn't download the SDK tools, go <a href="{@docRoot}sdk/index.html" +><b>download the SDK now</b></a>, +or switch to the <a href="{@docRoot}sdk/installing/index.html?pkg=adt">Eclipse ADT +install</a> or <a href="{@docRoot}sdk/installing/index.html?pkg=studio">Android Studio +install</a> instructions.</p> + + +<div class="procedure-box"> +<p id="instructions-toggle" +style="float:right;font-size:13px"><a href='' onclick='showAll();return false;' +>[ Show instructions for all platforms ]</a></p> + +<div class="win docs" style="display:none"> + +<p><b>To get started on Windows:</b></p> + <p>Your download package is an executable file that starts an installer. The installer checks your machine for required tools, such as the proper Java SE Development Kit (JDK) and installs it if necessary. The installer then saves the Android SDK Tools into a default location (or you can specify the location).</p> @@ -21,15 +219,9 @@ use to download the rest of the SDK packages (such as the latest system image).< <ol> <li>Double-click the executable ({@code .exe} file) to start the install.</li> <li>Make a note of the name and location in which it saves the SDK on your system—you will need to -refer to the SDK directory later, when setting up the ADT plugin and when using +refer to the SDK directory later when using the SDK tools from the command line.</li> -<li>Once the installation completes, the installer offers to start the Android SDK Manager. -If you'll be using Eclipse, <strong>do not</strong> start the Android SDK Manager, -and instead move on to <a href="{@docRoot}sdk/installing/installing-adt.html" ->Installing the Eclipse Plugin</a>. -<p>If you're using a different IDE, -start the SDK Manager and read <a href="{@docRoot}sdk/installing/adding-packages.html" ->Adding Platforms and Packages</a>.</p> +<li>Once the installation completes, the installer starts the Android SDK Manager. </li> </ol> @@ -37,51 +229,37 @@ start the SDK Manager and read <a href="{@docRoot}sdk/installing/adding-packages -<div id="mac" class="docs" style="display:none"> +<div class="mac docs" style="display:none"> -<h3>Getting started on Mac</h3> +<p><b>To get started on Mac OSX:</b></p> -<ol> -<li>Unpack the ZIP file you've downloaded. By default, it's unpacked +<p>Unpack the ZIP file you've downloaded. By default, it's unpacked into a directory named <code>android-sdk-mac_x86</code>. Move it to an appropriate location on your machine, -such as a "Development" directory in your home directory. +such as a "Development" directory in your home directory.</p> <p>Make a note of the name and location of the SDK directory on your system—you will need to -refer to the SDK directory later, when setting up the ADT plugin and when using +refer to the SDK directory later when using the SDK tools from the command line.</p> -</li> -<li>If you're using Eclipse, move on to <a href="{@docRoot}sdk/installing/installing-adt.html" ->Installing the Eclipse Plugin</a>. Otherwise, if you're using a different IDE, -read <a href="{@docRoot}sdk/installing/adding-packages.html" ->Adding Platforms and Packages</a>.</li> -</ol> </div> -<div id="linux" class="docs" style="display:none"> +<div class="linux docs" style="display:none"> -<h3>Getting started on Linux</h3> +<p><b>To get started on Linux:</b></p> -<ol> -<li>Unpack the {@code .tgz} file you've downloaded. By default, the SDK files are unpacked +<p>Unpack the {@code .tgz} file you've downloaded. By default, the SDK files are unpacked into a directory named <code>android-sdk-linux_x86</code>. Move it to an appropriate location on your machine, -such as a "Development" directory in your home directory. +such as a "Development" directory in your home directory.</p> <p>Make a note of the name and location of the SDK directory on your system—you will need to -refer to the SDK directory later, when setting up the ADT plugin and when using +refer to the SDK directory later when using the SDK tools from the command line.</p> -</li> -<li>If you're using Eclipse, move on to <a href="{@docRoot}sdk/installing/installing-adt.html" ->Installing the Eclipse Plugin</a>. Otherwise, if you're using a different IDE, -read <a href="{@docRoot}sdk/installing/adding-packages.html" ->Adding Platforms and Packages</a>.</li> -</ol> -<h5 id="Troubleshooting"><a href='' class="expandable" +<h5 id="Troubleshooting" style="margin-bottom:15px"><a href='' class="expandable" onclick="toggleExpandable(this,'#ubuntu-trouble');return false;" >Troubleshooting Ubuntu</a></h5> @@ -122,38 +300,122 @@ sudo apt-get install libncurses5:i386 libstdc++6:i386 zlib1g:i386</pre> </div><!-- end ubuntu trouble --> +</div><!-- end linux --> +</div><!-- end procedure box --> + + +<p>The Android SDK tools are now ready to begin developing apps, but there are still a +couple packages you should add to make your Android SDK complete.</p> + +<p class="paging-links"> +<a href="{@docRoot}sdk/installing/adding-packages.html" class="next-page-link"> +Continue: Adding SDK Packages</a></p> + + +</div> +<!-- ################ END JUST TOOLS ##################### --> + + + + + +<!-- ################ DEFAULT ##################### --> + + +<div id="default" style="display:none"> + +<p>If you haven't already, <b><a href="{@docRoot}sdk/index.html">download +the Android SDK</a></b>. </p> + +<p>Then, select which SDK package you want to install:</p> + +<div class="cols" style="margin:30px 0 60px"> +<div class="col-4" style="margin-left:0"> +<a href="{@docRoot}sdk/installing/index.html?pkg=adt" class="landing-button landing-secondary"> +Eclipse ADT +</a> +</div> + +<div class="col-4"> +<a href="{@docRoot}sdk/installing/index.html?pkg=studio" class="landing-button landing-secondary"> +Android Studio +</a> +</div> + +<div class="col-4"> +<a href="{@docRoot}sdk/installing/index.html?pkg=tools" class="landing-button landing-secondary"> +Stand-alone SDK Tools +</a> </div> +</div> + + +</div> +<!-- ################ END DEFAULT ##################### --> + + + + -<p style="margin-top:2em;"><a href='' onclick='showAll();return false;'>Information for other platforms</a></p> <script> - var $osDocs; - if (navigator.appVersion.indexOf("Win")!=-1) { - $osDocs = $('#win'); - } else if (navigator.appVersion.indexOf("Mac")!=-1) { - $osDocs = $('#mac'); - } else if (navigator.appVersion.indexOf("Linux")!=-1) { - $osDocs = $('#linux'); - } - if ($osDocs.length) { - // reveal only the docs for this OS - $osDocs.show(); - } else { - // not running a compatible OS, so just show all the docs - $('.docs').show(); +// Show proper instructions based on downloaded SDK package +var package = getUrlParam("pkg"); +if (package == "tools") { + // Show the SDK Tools (other IDE) instructions + $("h1").text($("#tools").attr('heading')); + $("#tools").show(); +} else if (package == "adt") { + // Show the ADT instructions + $("h1").text($("#adt").attr('heading')); + $("#adt").show(); +} else if (package == "studio") { + // Show the Android Studio instructions + $("h1").text($("#studio").attr('heading')); + $("#studio").show(); +} else { + // Show the default page content so user can select their setup + $("#default").show(); +} + +// Show the proper instructions based on machine OS +var $osDocs; +if (navigator.appVersion.indexOf("Win")!=-1) { + $osDocs = $('.win'); +} else if (navigator.appVersion.indexOf("Mac")!=-1) { + $osDocs = $('.mac'); +} else if (navigator.appVersion.indexOf("Linux")!=-1) { + $osDocs = $('.linux'); +} + +if ($osDocs.length) { + // reveal only the docs for this OS + $osDocs.show(); +} else { + // not running a compatible OS, so just show all the docs + $('.docs').show(); +} + + +/* Shows all the machine OS instructions */ +function showAll() { + $('.docs').show(); + $("#instructions-toggle").hide(); +} + +/* Returns the value for the given URL parameter */ +function getUrlParam(param) { + var url = window.location.search.substring(1); + var variables = url.split('&'); + for (var i = 0; i < variables.length; i++) { + var paramName = variables[i].split('='); + if (escape(paramName[0]) == param) { + return escape(paramName[1]); + } } +} + + - function showAll() { - $('.docs').each(function() { - if (!$(this).is(':visible')) { - console.log('show') - $(this).show(); - } else { - console.log('hide') - $(this).hide(); - $osDocs.show(); - } - }); - } </script> diff --git a/docs/html/sdk/installing/installing-adt.jd b/docs/html/sdk/installing/installing-adt.jd index 7bf366c..1e87cd8 100644 --- a/docs/html/sdk/installing/installing-adt.jd +++ b/docs/html/sdk/installing/installing-adt.jd @@ -15,19 +15,28 @@ of Eclipse to let you quickly set up new Android projects, build an app UI, debug your app, and export signed (or unsigned) app packages (APKs) for distribution. </p> -<p>If you need to install Eclipse, you can download it from <a href= -"http://www.eclipse.org/downloads/">eclipse.org/downloads/</a>.</p> - - -<p class="note"><strong>Note:</strong> If you prefer to work in a different IDE, you do not need to -install Eclipse or ADT. Instead, you can directly use the SDK tools to build and -debug your application.</p> - +<p class="note"><strong>Note:</strong> You should install the ADT plugin +only if you already have an Eclipse installation that you want to continue using. If you do not +have Eclipse installed, you should instead <b><a href="{@docRoot}sdk/index.html">install +the complete Android SDK</a></b>, which includes the latest IDE for Android developers.</p> + +<p>Your existing Eclipse installation must meet these requirements:</p> + <ul> + <li><a href="http://eclipse.org/mobile/">Eclipse</a> 3.7.2 (Indigo) or greater +<p class="note"><strong>Note:</strong> Eclipse 3.6 (Helios) is no longer +supported with the latest version of ADT.</p></li> + <li>Eclipse <a href="http://www.eclipse.org/jdt">JDT</a> plugin (included +in most Eclipse IDE packages) </li> + <li><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK 6</a> + (JRE alone is not sufficient)</li>oid Development Tools plugin</a> +(recommended)</li> + <li><strong>Not</strong> compatible with GNU Compiler for Java (gcj)</li> + </ul> <h2 id="Download">Download the ADT Plugin</h2> - +<p>To add the ADT plugin to Eclipse:</p> <ol> <li>Start Eclipse, then select <strong>Help</strong> > <strong>Install New Software</strong>.</li> diff --git a/docs/html/sdk/installing/studio.jd b/docs/html/sdk/installing/studio.jd index a2c32f0..894514a 100644 --- a/docs/html/sdk/installing/studio.jd +++ b/docs/html/sdk/installing/studio.jd @@ -1,5 +1,5 @@ -page.title=Getting Started with Android Studio -page.tags=studio +page.title=Android Studio +page.tags="studio" @jd:body @@ -7,7 +7,7 @@ page.tags=studio <div style="position:relative;min-height:660px;"> -<h3 style="color:#f80">EARLY ACCESS PREVIEW</h3> +<h3 style="color:#FF4444;margin:-30px 0 20px">BETA</h3> <div id="tos" style="position:absolute;display:none;width:inherit;"> <div class="col-13" style="margin:0;"> </div><!-- provides top margin for content --> @@ -183,23 +183,21 @@ This is the Android Software Development Kit License Agreement - - <div id="main"> -<div class="figure" style="width:400px;margin-top:-20px"> -<img src="{@docRoot}images/tools/android-studio.png" height="330" width="400" style="margin-bottom:20px" /> +<div class="figure" style="width:400px;margin-top:-75px"> +<img src="{@docRoot}images/tools/laptop-studio.png" height="366" width="400" style="margin-bottom:20px" /> <a class="big button subtitle" id="download-ide-button" -href="" style="display:none;width:265px;margin:0 auto;display:block;font-size:18px" ></a> -<div style="width:290px;padding:10px 40px 0 60px;font-size:12px;line-height:16px"> +href="" style="display:none;width:368px;margin:0 auto;display:block;font-size:18px" ></a> +<div style="margin:20px 0 0 0"> <p style="margin-bottom:8px">This download includes:</p> -<ul> -<li>Android Studio <b>early access preview</b></li> -<li>All the Android SDK Tools to design, test, debug, and profile your app</li> -<li>The latest Android platform to compile your app</li> -<li>The latest Android system image to run your app in the emulator</li> +<ul style="margin-bottom:20px"> +<li>Android Studio Beta</li> +<li>All the Android SDK Tools to design, test, and debug your app</li> +<li>A version of the Android platform to compile your app</li> +<li>A version of the Android system image to run your app in the emulator</li> </ul> </div> @@ -208,36 +206,34 @@ href="" style="display:none;width:265px;margin:0 auto;display:block;font-size:18 <p>Android Studio is a new Android development environment based on IntelliJ -IDEA. Similar to Eclipse with the -ADT Plugin, Android Studio provides integrated Android developer tools -for development and debugging. On top of the +IDEA. It provides new features and improvements over Eclipse ADT +and will be the official Android IDE once it's ready. On top of the capabilities you expect from IntelliJ, Android Studio offers:</p> <ul> - <li>Gradle-based build support.</li> - <li>Android-specific refactoring and quick fixes.</li> - <li>Lint tools to catch performance, usability, version compatibility and other problems.</li> - <li>ProGuard and app-signing capabilities. </li> - <li>Template-based wizards to create common Android designs and components.</li> - <li>A rich layout editor that allows you to drag-and-drop UI components, preview layouts on - multiple screen configurations, and much more.</li> + <li>Flexible Gradle-based build system.</li> + <li>Build variants and multiple APK generation.</li> + <li>Expanded template support for Google Services and various device types.</li> + <li>Rich layout editor with support for theme editing.</li> + <li>Lint tools to catch performance, usability, version compatibility, and other problems.</li> + <li>ProGuard and app-signing capabilities.</li> <li>Built-in support for <a - href="http://android-developers.blogspot.com/2013/06/adding-backend-to-your-app-in-android.html" + href="https://developers.google.com/cloud/devtools/android_studio_templates/" class="external-link">Google Cloud Platform</a>, making it easy to integrate Google Cloud - Messaging and App Engine as server-side components. + Messaging and App Engine. </ul> -<p class="caution"><strong>Caution:</strong> Android Studio is currently available as -an <strong>early access preview</strong>. Several features -are either incomplete or not yet implemented and you may encounter bugs. If you are not +<p class="caution"><strong>Caution:</strong> Android Studio is currently in +<strong>beta</strong>. Some features +are not yet implemented and you may encounter bugs. If you are not comfortable using an unfinished product, you may want to instead -download (or continue to use) the -<a href="{@docRoot}sdk/index.html">ADT Bundle</a> (Eclipse with the ADT Plugin).</p> +download (or continue to use) +<a href="{@docRoot}sdk/index.html">Eclipse with ADT</a>.</p> -<h4 style="clear:right;text-align:right;margin-right:50px"><a href='' class="expandable" +<h4 style="margin-top: 20px;"><a href='' class="expandable" onclick="toggleExpandable(this,'.pax');return false;" - >DOWNLOAD FOR OTHER PLATFORMS</a></h4> + >VIEW ALL DOWNLOADS AND SIZES</a></h4> <div class="pax col-13 online" style="display:none;margin:0;"> @@ -290,6 +286,73 @@ download (or continue to use) the +<h2 style="margin-bottom: 0px;">Android Studio vs. Eclipse ADT Comparison</h2> + +<p> +The following table lists some key differences between Android Studio Beta and +<a href="{@docRoot}sdk/index.html">Eclipse with ADT</a>. +</p> + +<style> +td.yes { + color: #669900; +} +td.no { + color: #CC0000; +} +</style> + +<table> + <tbody><tr> + <th>Feature</th> + <th>Android Studio</th> + <th>ADT</th> + </tr> + <tr> + <td>Build system</td> + <td><a href="http://www.gradle.org/" class="external-link">Gradle</a></td> + <td><a href="http://ant.apache.org/" class="external-link">Ant</a></td> + </tr> + <tr> + + <td>Maven-based build dependencies</td> + <td class="yes">Yes</td> + <td class="no">No</td> + </tr> + + <td>Build variants and multiple-APK generation (great for Android Wear)</td> + <td class="yes">Yes</td> + <td class="no">No</td> + </tr> + + <tr> + <td>Advanced Android code completion and refactoring</td> + <td class="yes">Yes</td> + <td class="no">No</td> + </tr> + <tr> + <td>Graphical layout editor</td> + <td class="yes">Yes</td> + <td class="yes">Yes</td> + </tr> + <tr> + </tr> + + <tr> + <td>APK signing and keystore management</td> + <td class="yes">Yes</td> + <td class="yes">Yes</td> + </tr> + + <tr> + <td>NDK support</td> + <td class="no">Coming soon</td> + <td class="yes">Yes</td> + </tr> + </tbody></table> + + + <h2 id="Updating">Updating from older versions</h2> <p>If you already have Android Studio installed, in most cases, you can upgrade to the latest @@ -298,7 +361,7 @@ version by installing a patch. From within Android Studio, select Check for updates</strong>) to see whether an update is available.</p> <p>If an update is not available, -follow the <a href="#Installing">installation instructions</a> below and replace your existing +click the button above to download and replace your existing installation.</p> <div class="caution"> @@ -311,98 +374,6 @@ If you fail to copy these packages, then you can instead download them again thr the Android SDK Manager.</p> </div> - -<h2 id="Installing">Installing Android Studio</h2> -<p>Android Studio requires JDK 6 or greater (JRE alone is not sufficient). To check if you -have JDK installed (and which version), open a terminal and type <code>javac -version</code>. -If JDK is not available or the version is lower than 6, -<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">download -JDK from here</a>.</p> -<p>To install Android Studio:</p> -<ol> -<li>Download the <strong>Android Studio</strong> package from above.</li> -<li>Install Android Studio and the SDK tools: - <p><b>Windows:</b></p> - <ol> - <li>Launch the downloaded EXE file, {@code android-studio-bundle-<version>.exe}.</li> - <li>Follow the setup wizard to install Android Studio. - - <div class="caution"><p><strong>Known issue:</strong> - On some Windows systems, the launcher script does not find where Java is installed. - If you encounter this problem, - you need to set an environment variable indicating the correct location.</p> - <p>Select <strong>Start menu > Computer > System Properties > - Advanced System Properties</strong>. Then open <strong>Advanced tab > Environment - Variables</strong> and add a new system variable <code>JAVA_HOME</code> that points to - your JDK folder, for example <code>C:\Program Files\Java\jdk1.7.0_21</code>.</p> - </div> - </li> - - </ol> - <p><b>Mac OS X:</b></p> - <ol> - <li>Open the downloaded DMG file, {@code android-studio-bundle-<version>.dmg}.</li> - <li>Drag and drop Android Studio into the Applications folder. - - <div class="caution"><p><strong>Known issue:</strong> - Depending on your security settings, when you attempt to open Android Studio, you might - see a warning that says the package is damaged and should be moved to the trash. If this - happens, go to <strong>System Preferences > Security & Privacy</strong> and under - <strong>Allow applications downloaded from</strong>, select <strong>Anywhere</strong>. - Then open Android Studio again.</p> - </div> - </li> - - </ol> - <p><b>Linux:</b></p> - <ol> - <li>Unpack the downloaded Tar file, {@code android-studio-bundle-<version>.tgz}, into an appropriate - location for your applications. - <li>To launch Android Studio, navigate to the {@code android-studio/bin/} directory - in a terminal and execute {@code studio.sh}. - <p>You may want to add {@code android-studio/bin/} to your PATH environmental - variable so that you can start Android Studio from any directory.</p> - </li> - </ol> -</li> -</ol> - -<p>That's it! You're ready to start developing apps with Android Studio.</p> - -<div class="note"> -<p><strong>Note:</strong> On Windows and Mac, the individual tools and -other SDK packages are saved within the Android Studio application directory. -To access the tools directly, use a terminal to navigate into the application and locate -the {@code sdk/} directory. For example:</p> -<p>Windows: <code>\Users\<user>\AppData\Local\Android\android-studio\sdk\</code></p> -<p>Mac: <code>/Applications/Android\ Studio.app/sdk/</code></p> -</div> - -<p>For a list of some known issues, see <a -href="http://tools.android.com/knownissues">tools.android.com/knownissues</a>.</p> - - -<h2 id="Start">Starting a Project</h2> - -<p>When you launch Android Studio for the first time, you'll see a Welcome -screen that offers several ways to get started:</p> - -<ul> - <li>To start building a new app, click <strong>New Project</strong>. - <p>This starts the New Project wizard, which helps you set up a project using an app template. - </li> - <li>To import an existing Android app project, click <strong>Import Project</strong>. - <p class="note"><strong>Note:</strong> If you previously developed your Android project - with Eclipse, you should first use the new export feature in the ADT plugin to prepare - your project with the new Gradle build system. For more information, read - <a href="{@docRoot}sdk/installing/migrate.html">Migrating from Eclipse</a>.</p> - </li> -</ul> - -<p>For additional help using Android Studio, read <a -href="{@docRoot}sdk/installing/studio-tips.html">Tips and Tricks</a>.</p> - - <p>As you continue developing apps, you may need to install additional versions of Android for the emulator and other packages such as the <a href="{@docRoot}tools/support-library/index.html">Android Support Library</a>. @@ -599,8 +570,8 @@ for possible resolutions to known issues: <a href="http://tools.android.com/know if (os) { /* set up primary ACE download button */ $('#download-ide-button').show(); - $('#download-ide-button').append("Download Android Studio <span class='small'>v0.5.2</span>" - + "<br/> <span class='small'>for " + os + "</span>"); + $('#download-ide-button').append("Download Android Studio Beta <span class='small'>v0.5.2</span>" + + "<br/> <span class='small'>with the Android SDK for " + os + "</span>"); $('#download-ide-button').click(function() {return onDownload(this,true);}).attr('href', bundlename); } else { @@ -642,9 +613,13 @@ for possible resolutions to known issues: <a href="http://tools.android.com/know function onDownloadForRealz(link) { if ($("input#agree").is(':checked')) { - $("#tos").hide(); - $("#main").show(); - location.hash = "Updating"; + $("h1").text('Now redirecting to the install instructions...'); + $("#tos").slideUp(); + $("#jd-content .jd-descr").fadeOut('slow', function() { + setTimeout(function() { + window.location = "/sdk/installing/index.html?pkg=studio"; + }, 1000); + }); _gaq.push(['_trackEvent', 'SDK', 'Android Studio', $("#downloadForRealz").html()]); return true; } else { diff --git a/docs/html/tools/device.jd b/docs/html/tools/device.jd index e9caa44..89b3857 100644 --- a/docs/html/tools/device.jd +++ b/docs/html/tools/device.jd @@ -5,6 +5,7 @@ page.title=Using Hardware Devices <div id="qv"> <h2>In this document</h2> <ol> + <li><a href="#device-developer-options">Enabling On-device Developer Options</a></li> <li><a href="#setting-up">Setting up a Device for Development</a> <ol> <li><a href="#VendorIds">USB Vendor IDs</a></li> @@ -43,6 +44,29 @@ allow you to verify that your application functions properly on different versio platform, in different screen sizes and orientations, and more.</p> +<h2 id="developer-device-options" style="margin-bottom: 0px;">Enabling On-device Developer Options</h2> + +<img src="/images/tools/dev-options-inmilk.png" alt="" style="float:right;margin-left:30px"> + +<p>Android-powered devices have a host of developer options that you can +access on the phone, which let you:</p> +<ul> + <li>Enable debugging over USB.</li> + <li>Quickly capture bug reports onto the device.</li> + <li>Show CPU usage on screen.</li> + <li>Draw debugging information on screen such as layout bounds, + updates on GPU views and hardware layers, and other information.</li> + <li>Plus many more options to simulate app stresses or enable debugging options.</li> +</ul> +<p>To access these settings, open the <em>Developer options</em> in the +system Settings. On Android 4.2 and higher, the Developer options screen is +hidden by default. To make it visible, go to +<b>Settings > About phone</b> and tap <b>Build number</b> seven times. Return to the previous +screen to find Developer options at the bottom.</p> + + + + <h2 id="setting-up">Setting up a Device for Development</h2> <p>With an Android-powered device, you can develop and debug your Android applications just as you @@ -280,6 +304,10 @@ above.</p> <td><code>0fce</code></td> </tr> <tr> + <td>Sony Mobile Communications</td> + <td><code>0fce</code></td> + </tr> + <tr> <td>Teleepoch</td> <td><code>2340</code></td> </tr> diff --git a/docs/html/tools/help/adb.jd b/docs/html/tools/help/adb.jd index f980042..e2dd196 100644 --- a/docs/html/tools/help/adb.jd +++ b/docs/html/tools/help/adb.jd @@ -8,6 +8,7 @@ page.tags=adb <div id="qv"> <h2>In this document</h2> <ol> + <li><a href="#Enabling">Enabling adb Debugging</a></li> <li><a href="#issuingcommands">Syntax</a></li> <li><a href="#commandsummary">Commands</a></li> <li><a href="#devicestatus">Querying for Emulator/Device Instances</a></li> @@ -72,6 +73,19 @@ instances and handles commands from multiple adb clients, you can control any em instance from any client (or from a script).</p> +<h2 id="Enabling">Enabling adb Debugging</h2> + +<p>In order to use adb with a device connected over USB, you must enable +<strong>USB debugging</strong> in the device system settings, under <strong> +Developer options</strong>.</p> + +<p>On Android 4.2 and higher, the Developer options screen is +hidden by default. To make it visible, go to +<b>Settings > About phone</b> and tap <b>Build number</b> seven times. Return to the previous +screen to find <strong>Developer options</strong> at the bottom.</p> + +<p>On some devices, the Developer options screen may be located or named differently.</p> + <p class="note"><strong>Note:</strong> When you connect a device running Android 4.2.2 or higher to your computer, the system shows a dialog asking whether to accept an RSA key that allows debugging through this computer. This security mechanism protects user devices because it ensures @@ -80,6 +94,11 @@ device and acknowledge the dialog. This requires that you have adb version 1.0.3 SDK Platform-tools r16.0.1 and higher) in order to debug on a device running Android 4.2.2 or higher.</p> +<p>For more information about connecting to a device over USB, read +<a href="{@docRoot}tools/device.html">Using Hardware Devices</a>.</p> + + + <h2 id="issuingcommands">Syntax</h2> diff --git a/docs/html/tools/help/sdk-manager.jd b/docs/html/tools/help/sdk-manager.jd index 57271bb..b084237 100644 --- a/docs/html/tools/help/sdk-manager.jd +++ b/docs/html/tools/help/sdk-manager.jd @@ -3,7 +3,9 @@ page.title=SDK Manager <p>The Android SDK separates tools, platforms, and other components into packages you can - download using the SDK Manager.</p> + download using the SDK Manager. For example, when the SDK Tools are updated or a new version of +the Android platform is released, you can use the SDK Manager to quickly download them to +your environment.</p> <p>You can launch the SDK Manager in one of the following ways:</p> <ul> @@ -25,6 +27,14 @@ click <strong>Install</strong> to install the selected packages.</p> SDK packages that are available, already installed, or for which an update is available.</p> +<p>There are several different packages available for the Android SDK. The table below describes +most of the available packages and where they're located in your SDK directory +once you download them.</p> + + + + + <h2 id="Recommended">Recommended Packages</h2> <p>Here's an outline of the packages required and those we recommend you use: @@ -69,3 +79,77 @@ matches the API Level of the Android platform that you plan to use.</dd> <p class="note"><strong>Tip:</strong> For easy access to the SDK tools from a command line, add the location of the SDK's <code>tools/</code> and <code>platform-tools</code> to your <code>PATH</code> environment variable.</p> + + +<p>The above list is not comprehensive and you can <a +href="#AddingSites">add new sites</a> to download additional packages from third-parties.</p> + +<p>In some cases, an SDK package may require a specific minimum revision of +another package or SDK tool. +The development tools will notify you with warnings if there is dependency that you need to +address. The Android SDK Manager also enforces dependencies by requiring that you download any +packages that are needed by those you have selected.</p> + + + + + +<h2 id="AddingSites">Adding New Sites</h2> + +<p>By default, <strong>Available Packages</strong> displays packages available from the +<em>Android Repository</em> and <em>Third party Add-ons</em>. You can add other sites that host +their own Android SDK add-ons, then download the SDK add-ons +from those sites.</p> + +<p>For example, a mobile carrier or device manufacturer might offer additional +API libraries that are supported by their own Android-powered devices. In order +to develop using their libraries, you must install their Android SDK add-on, if it's not already +available under <em>Third party Add-ons</em>. </p> + +<p>If a carrier or device manufacturer has hosted an SDK add-on repository file +on their web site, follow these steps to add their site to the Android SDK +Manager:</p> + +<ol> + <li>Select <strong>Available Packages</strong> in the left panel.</li> + <li>Click <strong>Add Add-on Site</strong> and enter the URL of the +<code>repository.xml</code> file. Click <strong>OK</strong>.</li> +</ol> +<p>Any SDK packages available from the site will now be listed under a new item named +<strong>User Add-ons</strong>.</p> + + + + +<h2 id="troubleshooting">Troubleshooting</h2> + +<p><strong>Problems connecting to the SDK repository</strong></p> + +<p>If you are using the Android SDK Manager to download packages and are encountering +connection problems, try connecting over http, rather than https. To switch the +protocol used by the Android SDK Manager, follow these steps: </p> + +<ol> + <li>With the Android SDK Manager window open, select "Settings" in the + left pane. </li> + <li>On the right, in the "Misc" section, check the checkbox labeled "Force + https://... sources to be fetched using http://..." </li> + <li>Click <strong>Save & Apply</strong>.</li> +</ol> + + + + + + + + + + + + + + + + + diff --git a/docs/html/tools/sdk/tools-notes.jd b/docs/html/tools/sdk/tools-notes.jd index 9b06a9d..f490053 100644 --- a/docs/html/tools/sdk/tools-notes.jd +++ b/docs/html/tools/sdk/tools-notes.jd @@ -28,6 +28,39 @@ href="http://tools.android.com/knownissues">http://tools.android.com/knownissues <div class="toggle-content opened"> <p><a href="#" onclick="return toggleContent(this)"> <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img" + alt=""/>SDK Tools, Revision 22.6.4</a> <em>(June 2014)</em> + </p> + + <div class="toggle-content-toggleme"> + + <dl> + <dt>Dependencies:</dt> + + <dd> + <ul> + <li>Android SDK Platform-tools revision 18 or later.</li> + <li>If you are developing in Eclipse with ADT, note that this version of SDK Tools is + designed for use with ADT 22.6.3 and later. If you haven't already, update your + <a href="{@docRoot}tools/sdk/eclipse-adt.html">ADT Plugin</a> to 22.6.3.</li> + <li>If you are developing outside Eclipse, you must have + <a href="http://ant.apache.org/">Apache Ant</a> 1.8 or later.</li> + </ul> + </dd> + + <dt>General Notes:</dt> + <dd> + <ul> + <li>Fixed an issue with the x86 emulator that caused Google Maps to crash. + (<a href="http://b.android.com/69385">Issue 69385</a>)</li> + <li>Fixed minor OpenGL issues.</li> + </ul> + </dd> + </div> +</div> + +<div class="toggle-content closed"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" alt=""/>SDK Tools, Revision 22.6.3</a> <em>(April 2014)</em> </p> diff --git a/docs/html/tools/tools_toc.cs b/docs/html/tools/tools_toc.cs index b29b87c..93e5976 100644 --- a/docs/html/tools/tools_toc.cs +++ b/docs/html/tools/tools_toc.cs @@ -1,54 +1,38 @@ <ul id="nav"> <li class="nav-section"> - <div class="nav-section-header empty"> - <a href="<?cs var:toroot ?>tools/index.html"><span class="en">Developer Tools</span></a> - </div> - </li> - - <li class="nav-section"> <div class="nav-section-header"><a href="<?cs var:toroot ?>sdk/index.html"><span class="en">Download</span></a></div> <ul> - <li><a href="<?cs var:toroot ?>sdk/installing/bundle.html"> - <span class="en">Setting Up the ADT Bundle</span></a></li> + <li><a href="<?cs var:toroot ?>sdk/installing/index.html"> + <span class="en">Installing the SDK</span></a></li> - <li class="nav-section"> - <div class="nav-section-header"> - <a href="<?cs var:toroot ?>sdk/installing/index.html"><span class="en">Setting Up - an Existing IDE</span></a></div> - <ul> - <li><a href="<?cs var:toroot ?>sdk/installing/installing-adt.html"> - <span class="en">Installing the Eclipse Plugin</span></a></li> - <li><a href="<?cs var:toroot ?>sdk/installing/adding-packages.html"> - <span class="en">Adding Platforms and Packages</span></a></li> - </ul> - </li> - - <li class="nav-section"> - <div class="nav-section-header"> - <a href="<?cs var:toroot ?>sdk/installing/studio.html">Android Studio</a> - </div> - <ul> - <li><a href="<?cs var:toroot ?>sdk/installing/migrate.html"> - Migrating from Eclipse</a></li> - <li><a href="<?cs var:toroot ?>sdk/installing/studio-tips.html"> - Tips and Tricks</a></li> - <li><a href="<?cs var:toroot ?>sdk/installing/studio-layout.html"> - Using the Layout Editor</a></li> - <li><a href="<?cs var:toroot ?>sdk/installing/studio-build.html"> - Building Your Project with Gradle</a></li> - <li><a href="<?cs var:toroot ?>sdk/installing/studio-debug.html"> - Debugging with Android Studio</a></li> - </ul> - </li> - <li><a href="<?cs var:toroot ?>sdk/exploring.html"> - <span class="en">Exploring the SDK</span></a></li> - <li><a href="<?cs var:toroot ?>tools/sdk/ndk/index.html">Download the NDK</a> - </li> + <li><a href="<?cs var:toroot ?>sdk/installing/adding-packages.html"> + <span class="en">Adding SDK Packages</span></a></li> </ul> </li> + + <li class="nav-section"> + <div class="nav-section-header"> + <a href="<?cs var:toroot ?>sdk/installing/studio.html">Android Studio</a> + </div> + <ul> + <li><a href="<?cs var:toroot ?>sdk/installing/migrate.html"> + Migrating from Eclipse</a></li> + <li><a href="<?cs var:toroot ?>sdk/installing/create-project.html"> + Creating a Project</a></li> + <li><a href="<?cs var:toroot ?>sdk/installing/studio-tips.html"> + Tips and Tricks</a></li> + <li><a href="<?cs var:toroot ?>sdk/installing/studio-layout.html"> + Using the Layout Editor</a></li> + <li><a href="<?cs var:toroot ?>sdk/installing/studio-build.html"> + Building Your Project with Gradle</a></li> + <li><a href="<?cs var:toroot ?>sdk/installing/studio-debug.html"> + Debugging with Android Studio</a></li> + </ul> + </li> + <li class="nav-section"> <div class="nav-section-header"> <a href="<?cs var:toroot ?>tools/workflow/index.html"><span class="en">Workflow</span></a> @@ -174,7 +158,13 @@ class="en">Support Library</span></a></div> class="en">Tools Help</span></a></div> <ul> <li><a href="<?cs var:toroot ?>tools/help/adb.html">adb</a></li> - <li><a href="<?cs var:toroot ?>tools/help/adt.html">ADT</a></li> + <li class="nav-section"> + <div class="nav-section-header"><a href="<?cs var:toroot ?>tools/help/adt.html">ADT</a></div> + <ul> + <li><a href="<?cs var:toroot ?>sdk/installing/installing-adt.html"> + <span class="en">Installing the Eclipse Plugin</span></a></li> + </ul> + </li> <li><a href="<?cs var:toroot ?>tools/help/android.html">android</a></li> <li><a href="<?cs var:toroot ?>tools/help/avd-manager.html">AVD Manager</a></li> <li><a href="<?cs var:toroot ?>tools/help/bmgr.html">bmgr</a> @@ -244,6 +234,11 @@ class="en">Platforms</span></a></li> </ul> </li> + <li class="nav-section"> + <div class="nav-section-header empty"> + <a href="<?cs var:toroot ?>tools/sdk/ndk/index.html">NDK</a> + </div> + </li> <li class="nav-section"> <div class="nav-section-header"> diff --git a/docs/html/training/app-indexing/index.jd b/docs/html/training/app-indexing/index.jd index cb4135f..7e7241b 100644 --- a/docs/html/training/app-indexing/index.jd +++ b/docs/html/training/app-indexing/index.jd @@ -59,14 +59,6 @@ in your app by adding intent filters in your app manifest.</li> </li> </ol> -<p class="note"><strong>Note: </strong> -Currently, the Google Search app indexing capability is restricted to -English-only Android apps from developers participating in the early adopter -program. You can sign up to be a participant by submitting the <a -href="https://docs.google.com/a/google.com/forms/d/1itcqPAQqggJ6e4m8aejWLM8Dc5O8P6qybgGbKCNxGV0/viewform" -class="external-link" target="_blank">App Indexing Expression of Interest</a> form. -</p> - <p>This class shows how to enable deep linking and indexing of your application content so that users can open this content directly from mobile search results.</p> diff --git a/docs/html/training/articles/keystore.jd b/docs/html/training/articles/keystore.jd new file mode 100644 index 0000000..bbbda67 --- /dev/null +++ b/docs/html/training/articles/keystore.jd @@ -0,0 +1,107 @@ +page.title=Android Keystore System +@jd:body + +<div id="qv-wrapper"> + <div id="qv"> + <h2>In this document</h2> + <ol> + <li><a href="#WhichShouldIUse">Choosing Between a Keychain or the Android Keystore Provider</a></li> + <li><a href="#UsingAndroidKeyStore">Using Android Keystore Provider + </a></li> + <ol> + <li><a href="#GeneratingANewPrivateKey">Generating a New Private Key</a></li> + <li><a href="#WorkingWithKeyStoreEntries">Working with Keystore Entries</a></li> + <li><a href="#ListingEntries">Listing Entries</a></li> + <li><a href="#SigningAndVerifyingData">Signing and Verifying Data</a></li> + </ol> + </ol> + + <h2>Blog articles</h2> + <ol> + <li><a + href="http://android-developers.blogspot.com/2012/03/unifying-key-store-access-in-ics.html"> + <h4>Unifying Key Store Access in ICS</h4> + </a></li> + </ol> + </div> +</div> + +<p>The Android Keystore system lets you store private keys + in a container to make it more difficult to extract from the + device. Once keys are in the keystore, they can be used for + cryptographic operations with the private key material remaining + non-exportable.</p> + +<p>The Keystore system is used by the {@link + android.security.KeyChain} API as well as the Android + Keystore provider feature that was introduced in Android 4.3 + (API level 18). This document goes over when and how to use the + Android Keystore provider.</p> + +<h2 id="WhichShouldIUse">Choosing Between a Keychain or the +Android Keystore Provider</h2> + +<p>Use the {@link android.security.KeyChain} API when you want + system-wide credentials. When an app requests the use of any credential + through the {@link android.security.KeyChain} API, users get to + choose, through a system-provided UI, which of the installed credentials + an app can access. This allows several apps to use the + same set of credentials with user consent.</p> + +<p>Use the Android Keystore provider to let an individual app store its own + credentials that only the app itself can access. + This provides a way for apps to manage credentials that are usable + only by itself while providing the same security benefits that the + {@link android.security.KeyChain} API provides for system-wide + credentials. This method requires no user interaction to select the credentials.</p> + +<h2 id="UsingAndroidKeyStore">Using Android Keystore Provider</h2> + +<p> +To use this feature, you use the standard {@link java.security.KeyStore} +and {@link java.security.KeyPairGenerator} classes along with the +{@code AndroidKeyStore} provider introduced in Android 4.3 (API level 18).</p> + +<p>{@code AndroidKeyStore} is registered as a {@link + java.security.KeyStore} type for use with the {@link + java.security.KeyStore#getInstance(String) KeyStore.getInstance(type)} + method and as a provider for use with the {@link + java.security.KeyPairGenerator#getInstance(String, String) + KeyPairGenerator.getInstance(algorithm, provider)} method.</p> + +<h3 id="GeneratingANewPrivateKey">Generating a New Private Key</h3> + +<p>Generating a new {@link java.security.PrivateKey} requires that + you also specify the initial X.509 attributes that the self-signed + certificate will have. You can replace the certificate at a later + time with a certificate signed by a Certificate Authority.</p> + +<p>To generate the key, use a {@link java.security.KeyPairGenerator} + with {@link android.security.KeyPairGeneratorSpec}:</p> + +{@sample development/samples/ApiDemos/src/com/example/android/apis/security/KeyStoreUsage.java generate} + +<h3 id="WorkingWithKeyStoreEntries">Working with Keystore Entries</h3> + +<p>Using the {@code AndroidKeyStore} provider takes place through + all the standard {@link java.security.KeyStore} APIs.</p> + +<h4 id="ListingEntries">Listing Entries</h4> + +<p>List entries in the keystore by calling the {@link + java.security.KeyStore#aliases()} method:</p> + +{@sample development/samples/ApiDemos/src/com/example/android/apis/security/KeyStoreUsage.java list} + +<h4 id="SigningAndVerifyingData">Signing and Verifying Data</h4> + +<p>Sign data by fetching the {@link + java.security.KeyStore.Entry} from the keystore and using the + {@link java.security.Signature} APIs, such as {@link + java.security.Signature#sign()}:</p> + +{@sample development/samples/ApiDemos/src/com/example/android/apis/security/KeyStoreUsage.java sign} + +<p>Similarly, verify data with the {@link java.security.Signature#verify(byte[])} method:</p> + +{@sample development/samples/ApiDemos/src/com/example/android/apis/security/KeyStoreUsage.java verify} diff --git a/docs/html/training/basics/network-ops/connecting.jd b/docs/html/training/basics/network-ops/connecting.jd index 50a9e1b..1452ded 100644 --- a/docs/html/training/basics/network-ops/connecting.jd +++ b/docs/html/training/basics/network-ops/connecting.jd @@ -25,6 +25,7 @@ next.link=managing.html <h2>You should also read</h2> <ul> + <li><a href="{@docRoot}training/volley/index.html">Transmitting Network Data Using Volley</a></li> <li><a href="{@docRoot}training/monitoring-device-state/index.html">Optimizing Battery Life</a></li> <li><a href="{@docRoot}training/efficient-downloads/index.html">Transferring Data Without Draining the Battery</a></li> <li><a href="{@docRoot}guide/webapps/index.html">Web Apps Overview</a></li> diff --git a/docs/html/training/basics/network-ops/index.jd b/docs/html/training/basics/network-ops/index.jd index 89ab539..1f6493f 100644 --- a/docs/html/training/basics/network-ops/index.jd +++ b/docs/html/training/basics/network-ops/index.jd @@ -24,6 +24,7 @@ next.link=connecting.html <li><a href="{@docRoot}training/monitoring-device-state/index.html">Optimizing Battery Life</a></li> <li><a href="{@docRoot}training/efficient-downloads/index.html">Transferring Data Without Draining the Battery</a></li> <li><a href="{@docRoot}guide/webapps/index.html">Web Apps Overview</a></li> + <li><a href="{@docRoot}training/volley/index.html">Transmitting Network Data Using Volley</a></li> </ul> @@ -51,6 +52,14 @@ as a source of reusable code for your own application.</p> fundamental building blocks for creating Android applications that download content and parse data efficiently, while minimizing network traffic.</p> +<p class="note"><strong>Note:</strong> See the class <a href="{@docRoot} +training/volley/index.html">Transmitting Network Data Using Volley</a> +for information on Volley, an HTTP library that makes networking for Android apps +easier and faster. Volley is available through the open +<a href="https://android.googlesource.com/platform/frameworks/volley">AOSP</a> +repository. Volley may be able to help you streamline and improve the performance +of your app's network operations.</p> + <h2>Lessons</h2> diff --git a/docs/html/training/cloudsync/backupapi.jd b/docs/html/training/cloudsync/backupapi.jd index a5436c6..fd35ada 100644 --- a/docs/html/training/cloudsync/backupapi.jd +++ b/docs/html/training/cloudsync/backupapi.jd @@ -41,7 +41,7 @@ new devices using the Backup API.</p> <h2 id="register">Register for the Android Backup Service</h2> <p>This lesson requires the use of the <a - href="http://code.google.com/android/backup/index.html">Android Backup + href="{@docRoot}google/backup/index.html">Android Backup Service</a>, which requires registration. Go ahead and <a href="http://code.google.com/android/backup/signup.html">register here</a>. Once that's done, the service pre-populates an XML tag for insertion in your Android diff --git a/docs/html/training/cloudsync/index.jd b/docs/html/training/cloudsync/index.jd index eb7df3d..cf7117c 100644 --- a/docs/html/training/cloudsync/index.jd +++ b/docs/html/training/cloudsync/index.jd @@ -6,6 +6,16 @@ startpage=true @jd:body +<div id="tb-wrapper"> +<div id="tb"> + +<h2>Dependencies and prerequisites</h2> +<ul> + <li>Android 2.2 (API level 8) and higher</li> +</ul> +</div> +</div> + <p>By providing powerful APIs for internet connectivity, the Android framework helps you build rich cloud-enabled apps that sync their data to a remote web service, making sure all your devices always stay in sync, and your valuable diff --git a/docs/html/training/contacts-provider/retrieve-names.jd b/docs/html/training/contacts-provider/retrieve-names.jd index b034a6a..7106889 100644 --- a/docs/html/training/contacts-provider/retrieve-names.jd +++ b/docs/html/training/contacts-provider/retrieve-names.jd @@ -102,9 +102,9 @@ trainingnavtop=true <p> To display the search results in a {@link android.widget.ListView}, you need a main layout file that defines the entire UI including the {@link android.widget.ListView}, and an item layout - file that defines one line of the {@link android.widget.ListView}. For example, you can define - the main layout file <code>res/layout/contacts_list_view.xml</code> that contains the - following XML: + file that defines one line of the {@link android.widget.ListView}. For example, you could create + the main layout file <code>res/layout/contacts_list_view.xml</code> with + the following XML: </p> <pre> <?xml version="1.0" encoding="utf-8"?> @@ -250,7 +250,8 @@ public class ContactsFragment extends Fragment implements public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the fragment layout - return inflater.inflate(R.layout.contacts_list_layout, container, false); + return inflater.inflate(R.layout.contact_list_fragment, + container, false); } </pre> <h3 id="DefineAdapter">Set up the CursorAdapter for the ListView</h3> @@ -268,7 +269,8 @@ public class ContactsFragment extends Fragment implements super.onActivityCreated(savedInstanceState); ... // Gets the ListView from the View list of the parent activity - mContactsList = (ListView) getActivity().findViewById(R.layout.contact_list_view); + mContactsList = + (ListView) getActivity().findViewById(R.layout.contact_list_view); // Gets a CursorAdapter mCursorAdapter = new SimpleCursorAdapter( getActivity(), diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs index 0616b62..c5dc3c5 100644 --- a/docs/html/training/training_toc.cs +++ b/docs/html/training/training_toc.cs @@ -609,6 +609,35 @@ include the action bar on devices running Android 2.1 or higher." </li> </ul> </li> + <li class="nav-section"> + <div class="nav-section-header"> + <a href="<?cs var:toroot ?>training/volley/index.html" + description="How to perform fast, scalable UI operations over the network using Volley" + >Transmitting Network Data Using Volley</a> + </div> + <ul> + <li> + <a href="<?cs var:toroot ?>training/volley/simple.html"> + Sending a Simple Request + </a> + </li> + <li> + <a href="<?cs var:toroot ?>training/volley/requestqueue.html"> + Setting Up a RequestQueue + </a> + </li> + <li> + <a href="<?cs var:toroot ?>training/volley/request.html"> + Making a Standard Request + </a> + </li> + <li> + <a href="<?cs var:toroot ?>training/volley/request-custom.html"> + Implementing a Custom Request + </a> + </li> + </ul> + </li> </ul> </li> diff --git a/docs/html/training/tv/index.jd b/docs/html/training/tv/index.jd index a99e378..54f7016 100644 --- a/docs/html/training/tv/index.jd +++ b/docs/html/training/tv/index.jd @@ -1,5 +1,5 @@ page.title=Designing for TV -page.tags=input,screens +page.tags="input","screens" trainingnavtop=true startpage=true diff --git a/docs/html/training/volley/index.jd b/docs/html/training/volley/index.jd new file mode 100644 index 0000000..ba5b09f --- /dev/null +++ b/docs/html/training/volley/index.jd @@ -0,0 +1,133 @@ +page.title=Transmitting Network Data Using Volley +page.tags="" + +trainingnavtop=true +startpage=true + + +@jd:body + + + +<div id="tb-wrapper"> +<div id="tb"> + + +<!-- Required platform, tools, add-ons, devices, knowledge, etc. --> +<h2>Dependencies and prerequisites</h2> + +<ul> + <li>Android 1.6 (API Level 4) or higher</li> +</ul> + +<h2>You should also see</h2> +<ul> + <li>For a production quality app that uses Volley, see the 2013 Google I/O + <a href="https://github.com/google/iosched">schedule app</a>. In particular, see: + <ul> + <li><a + href="https://github.com/google/iosched/blob/master/android/src/main/java/com/google/android/apps/iosched/util/ImageLoader.java"> + ImageLoader</a></li> + <li><a + href="https://github.com/google/iosched/blob/master/android/src/main/java/com/google/android/apps/iosched/util/BitmapCache.java"> + BitmapCache</a></li> + </ul> + </li> +</ul> + +</div> +</div> + +<a class="notice-developers-video wide" href="https://developers.google.com/events/io/sessions/325304728"> +<div> + <h3>Video</h3> + <p>Volley: Easy, Fast Networking for Android</p> +</div> +</a> + + +<p>Volley is an HTTP library that makes networking for Android apps easier and most importantly, +faster. Volley is available through the open +<a href="https://android.googlesource.com/platform/frameworks/volley">AOSP</a> repository.</p> + +<p>Volley offers the following benefits:</p> + +<ul> + +<li>Automatic scheduling of network requests.</li> +<li>Multiple concurrent network connections.</li> +<li>Transparent disk and memory response caching with standard HTTP +<a href=http://en.wikipedia.org/wiki/Cache_coherence">cache coherence</a>.</li> +<li>Support for request prioritization.</li> +<li>Cancellation request API. You can cancel a single request, or you can set blocks or +scopes of requests to cancel.</li> +<li>Ease of customization, for example, for retry and backoff.</li> +<li>Strong ordering that makes it easy to correctly populate your UI with data fetched +asynchronously from the network.</li> +<li>Debugging and tracing tools.</li> + +</ul> + +<p>Volley excels at RPC-type operations used to populate a UI, such as fetching a page of +search results as structured data. It integrates easily with any protocol and comes out of +the box with support for raw strings, images, and JSON. By providing built-in support for +the features you need, Volley frees you from writing boilerplate code and allows you to +concentrate on the logic that is specific to your app.</p> +<p>Volley is not suitable for large download or streaming operations, since Volley holds +all responses in memory during parsing. For large download operations, consider using an +alternative like {@link android.app.DownloadManager}.</p> + +<p>The core Volley library is developed in the open +<a href="https://android.googlesource.com/platform/frameworks/volley">AOSP</a> +repository at {@code frameworks/volley} and contains the main request dispatch pipeline +as well as a set of commonly applicable utilities, available in the Volley "toolbox." The +easiest way to add Volley to your project is to clone the Volley repository and set it as +a library project:</p> + +<ol> +<li>Git clone the repository by typing the following at the command line: + +<pre> +git clone https://android.googlesource.com/platform/frameworks/volley +</pre> +</li> + +<li>Import the downloaded source into your app project as an Android library project +(as described in <a href="{@docRoot}tools/projects/projects-eclipse.html"> +Managing Projects from Eclipse with ADT</a>, if you're using Eclipse) or make a +<a href="{@docRoot}guide/faq/commontasks.html#addexternallibrary"><code>.jar</code> file</a>.</li> +</ol> + +<h2>Lessons</h2> + +<dl> + <dt> + <strong><a href="simple.html">Sending a Simple Request</a></strong> + </dt> + <dd> + Learn how to send a simple request using the default behaviors of Volley, and how + to cancel a request. + + </dd> + <dt> + <strong><a href="requestqueue.html">Setting Up a RequestQueue</a></strong> + </dt> + <dd> + Learn how to set up a {@code RequestQueue}, and how to implement a singleton + pattern to create a {@code RequestQueue} that lasts the lifetime of your app. + </dd> + <dt> + <strong><a href="request.html">Making a Standard Request</a></strong> + </dt> + <dd> + Learn how to send a request using one of Volley's out-of-the-box request types + (raw strings, images, and JSON). + </dd> + <dt> + <strong><a href="request-custom.html">Implementing a Custom Request</a></strong> + </dt> + <dd> + Learn how to implement a custom request. + </dd> + +</dl> diff --git a/docs/html/training/volley/request-custom.jd b/docs/html/training/volley/request-custom.jd new file mode 100644 index 0000000..7b669b9 --- /dev/null +++ b/docs/html/training/volley/request-custom.jd @@ -0,0 +1,163 @@ +page.title=Implementing a Custom Request + +trainingnavtop=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#custom-request">Write a Custom Request</a></li> +</ol> + +</div> +</div> + +<a class="notice-developers-video wide" href="https://developers.google.com/events/io/sessions/325304728"> +<div> + <h3>Video</h3> + <p>Volley: Easy, Fast Networking for Android</p> +</div> +</a> + +<p>This lesson describes how to implement your own custom request types, for types that +don't have out-of-the-box Volley support.</p> + +<h2 id="custom-request">Write a Custom Request</h2> + +Most requests have ready-to-use implementations in the toolbox; if your response is a string, +image, or JSON, you probably won't need to implement a custom {@code Request}.</p> + +<p>For cases where you do need to implement a custom request, this is all you need +to do:</p> + +<ul> + +<li>Extend the {@code Request<T>} class, where +{@code <T>} represents the type of parsed response +the request expects. So if your parsed response is a string, for example, +create your custom request by extending {@code Request<String>}. See the Volley +toolbox classes {@code StringRequest} and {@code ImageRequest} for examples of +extending {@code Request<T>}.</li> + +<li>Implement the abstract methods {@code parseNetworkResponse()} +and {@code deliverResponse()}, described in more detail below.</li> + +</ul> + +<h3>parseNetworkResponse</h3> + +<p>A {@code Response} encapsulates a parsed response for delivery, for a given type +(such as string, image, or JSON). Here is a sample implementation of +{@code parseNetworkResponse()}:</p> + +<pre> +@Override +protected Response<T> parseNetworkResponse( + NetworkResponse response) { + try { + String json = new String(response.data, + HttpHeaderParser.parseCharset(response.headers)); + return Response.success(gson.fromJson(json, clazz), + HttpHeaderParser.parseCacheHeaders(response)); + } + // handle errors +... +} +</pre> + +<p>Note the following:</p> + +<ul> +<li>{@code parseNetworkResponse()} takes as its parameter a {@code NetworkResponse}, which +contains the response payload as a byte[], HTTP status code, and response headers.</li> +<li>Your implementation must return a {@code Response<T>}, which contains your typed +response object and cache metadata or an error, such as in the case of a parse failure.</li> +</ul> + +<p>If your protocol has non-standard cache semantics, you can build a {@code Cache.Entry} +yourself, but most requests are fine with something like this: +</p> +<pre>return Response.success(myDecodedObject, + HttpHeaderParser.parseCacheHeaders(response));</pre> +<p> +Volley calls {@code parseNetworkResponse()} from a worker thread. This ensures that +expensive parsing operations, such as decoding a JPEG into a Bitmap, don't block the UI +thread.</p> + +<h3>deliverResponse</h3> + +<p>Volley calls you back on the main thread with the object you returned in +{@code parseNetworkResponse()}. Most requests invoke a callback interface here, +for example: +</p> + +<pre> +protected void deliverResponse(T response) { + listener.onResponse(response); +</pre> + +<h3>Example: GsonRequest</h3> + +<p><a href="http://code.google.com/p/google-gson/">Gson</a> is a library for converting +Java objects to and from JSON using reflection. You can define Java objects that have the +same names as their corresponding JSON keys, pass Gson the class object, and Gson will fill +in the fields for you. Here's a complete implementation of a Volley request that uses +Gson for parsing:</p> + +<pre> +public class GsonRequest<T> extends Request<T> { + private final Gson gson = new Gson(); + private final Class<T> clazz; + private final Map<String, String> headers; + private final Listener<T> listener; + + /** + * Make a GET request and return a parsed object from JSON. + * + * @param url URL of the request to make + * @param clazz Relevant class object, for Gson's reflection + * @param headers Map of request headers + */ + public GsonRequest(String url, Class<T> clazz, Map<String, String> headers, + Listener<T> listener, ErrorListener errorListener) { + super(Method.GET, url, errorListener); + this.clazz = clazz; + this.headers = headers; + this.listener = listener; + } + + @Override + public Map<String, String> getHeaders() throws AuthFailureError { + return headers != null ? headers : super.getHeaders(); + } + + @Override + protected void deliverResponse(T response) { + listener.onResponse(response); + } + + @Override + protected Response<T> parseNetworkResponse(NetworkResponse response) { + try { + String json = new String( + response.data, + HttpHeaderParser.parseCharset(response.headers)); + return Response.success( + gson.fromJson(json, clazz), + HttpHeaderParser.parseCacheHeaders(response)); + } catch (UnsupportedEncodingException e) { + return Response.error(new ParseError(e)); + } catch (JsonSyntaxException e) { + return Response.error(new ParseError(e)); + } + } +} +</pre> + +<p>Volley provides ready-to-use {@code JsonArrayRequest} and {@code JsonArrayObject} classes +if you prefer to take that approach. See <a href="request.html"> +Using Standard Request Types</a> for more information.</p> diff --git a/docs/html/training/volley/request.jd b/docs/html/training/volley/request.jd new file mode 100644 index 0000000..d8ccab2 --- /dev/null +++ b/docs/html/training/volley/request.jd @@ -0,0 +1,281 @@ +page.title=Making a Standard Request + +trainingnavtop=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#request-image">Request an Image</a></li> + <li><a href="#request-json">Request JSON</a></li> +</ol> + +</div> +</div> + +<a class="notice-developers-video wide" href="https://developers.google.com/events/io/sessions/325304728"> +<div> + <h3>Video</h3> + <p>Volley: Easy, Fast Networking for Android</p> +</div> +</a> + +<p> +This lesson describes how to use the common request types that Volley supports:</p> + +<ul> + <li>{@code StringRequest}. Specify a URL and receive a raw string in response. See + <a href="requestqueue.html">Setting Up a Request Queue</a> for an example.</li> + <li>{@code ImageRequest}. Specify a URL and receive an image in response.</li> + <li>{@code JsonObjectRequest} and {@code JsonArrayRequest} (both subclasses of + {@code JsonRequest}). Specify a URL and get a JSON object or array (respectively) in + response.</li> +</ul> + +<p>If your expected response is one of these types, you probably won't have to implement a +custom request. This lesson describes how to use these standard request types. For +information on how to implement your own custom request, see <a href="requests-custom.html"> +Implementing a Custom Request</a>.</p> + + +<h2 id="request-image">Request an Image</h2> + +<p>Volley offers the following classes for requesting images. These classes layer on top +of each other to offer different levels of support for processing images:</p> + +<ul> + <li>{@code ImageRequest}—a canned request for getting an image at a given URL and + calling back with a decoded bitmap. It also provides convenience features like specifying + a size to resize to. Its main benefit is that Volley's thread scheduling ensures that + expensive image operations (decoding, resizing) automatically happen on a worker thread.</li> + + <li>{@code ImageLoader}—a helper class that handles loading and caching images from + remote URLs. {@code ImageLoader} is a an orchestrator for large numbers of {@code ImageRequest}s, + for example when putting multiple thumbnails in a {@link android.widget.ListView}. + {@code ImageLoader} provides an in-memory cache to sit in front of the normal Volley + cache, which is important to prevent flickering. This makes it possible to achieve a + cache hit without blocking or deferring off the main thread, which is impossible when + using disk I/O. {@code ImageLoader} also does response coalescing, without which almost + every response handler would set a bitmap on a view and cause a layout pass per image. + Coalescing makes it possible to deliver multiple responses simultaneously, which improves + performance.</li> + <li>{@code NetworkImageView}—builds on {@code ImageLoader} and effectively replaces + {@link android.widget.ImageView} for situations where your image is being fetched over + the network via URL. {@code NetworkImageView} also manages canceling pending requests if + the view is detached from the hierarchy.</li> +</ul> + +<h3>Use ImageRequest</h3> + +<p>Here is an example of using {@code ImageRequest}. It retrieves the image specified by +the URL and displays it in the app. Note that this snippet interacts with the +{@code RequestQueue} through a singleton class (see <a href="{@docRoot} +training/volley/requestqueue.html#singleton">Setting Up a RequestQueue</a> for more discussion of +this topic):</p> + +<pre> +ImageView mImageView; +String url = "http://i.imgur.com/7spzG.png"; +mImageView = (ImageView) findViewById(R.id.myImage); +... + +// Retrieves an image specified by the URL, displays it in the UI. +ImageRequest request = new ImageRequest(url, + new Response.Listener<Bitmap>() { + @Override + public void onResponse(Bitmap bitmap) { + mImageView.setImageBitmap(bitmap); + } + }, 0, 0, null, + new Response.ErrorListener() { + public void onErrorResponse(VolleyError error) { + mImageView.setImageResource(R.drawable.image_load_error); + } + }); +// Access the RequestQueue through your singleton class. +MySingleton.getInstance(this).addToRequestQueue(request);</pre> + + +<h3>Use ImageLoader and NetworkImageView</h3> + +<p>You can use {@code ImageLoader} and {@code NetworkImageView} in concert to efficiently +manage the display of multiple images, such as in a {@link android.widget.ListView}. In your +layout XML file, you use {@code NetworkImageView} in much the same way you would use +{@link android.widget.ImageView}, for example:</p> + +<pre><com.android.volley.toolbox.NetworkImageView + android:id="@+id/networkImageView" + android:layout_width="150dp" + android:layout_height="170dp" + android:layout_centerHorizontal="true" /></pre> + +<p>You can use {@code ImageLoader} by itself to display an image, for example:</p> + +<pre> +ImageLoader mImageLoader; +ImageView mImageView; +// The URL for the image that is being loaded. +private static final String IMAGE_URL = + "http://developer.android.com/images/training/system-ui.png"; +... +mImageView = (ImageView) findViewById(R.id.regularImageView); + +// Get the ImageLoader through your singleton class. +mImageLoader = MySingleton.getInstance(this).getImageLoader(); +mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView, + R.drawable.def_image, R.drawable.err_image)); +</pre> + +<p>However, {@code NetworkImageView} can do this for you if all you're doing is populating +an {@link android.widget.ImageView}. For example:</p> + +<pre> +ImageLoader mImageLoader; +NetworkImageView mNetworkImageView; +private static final String IMAGE_URL = + "http://developer.android.com/images/training/system-ui.png"; +... + +// Get the NetworkImageView that will display the image. +mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView); + +// Get the ImageLoader through your singleton class. +mImageLoader = MySingleton.getInstance(this).getImageLoader(); + +// Set the URL of the image that should be loaded into this view, and +// specify the ImageLoader that will be used to make the request. +mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader); +</pre> + +<p>The above snippets access the {@code RequestQueue} and the {@code ImageLoader} +through a singleton class, as described in <a href="{@docRoot}training/volley/requestqueue.html#singleton"> +Setting Up a RequestQueue</a>. This approach ensures that your app creates single instances of +these classes that last the lifetime of your app. The reason that this is important for +{@code ImageLoader} (the helper class that handles loading and caching images) is that +the main function of the in-memory cache is to allow for flickerless rotation. Using a +singleton pattern allows the bitmap cache to outlive the activity. If instead you create the +{@code ImageLoader} in an activity, the {@code ImageLoader} would be recreated along with +the activity every time the user rotates the device. This would cause flickering.</p> + +<h4 id="lru-cache">Example LRU cache</h4> + +<p>The Volley toolbox provides a standard cache implementation via the +{@code DiskBasedCache} class. This class caches files directly onto the hard disk in the +specified directory. But to use {@code ImageLoader}, you should provide a custom +in-memory LRU bitmap cache that implements the {@code ImageLoader.ImageCache} interface. +You may want to set up your cache as a singleton; for more discussion of this topic, see +<a href="{@docRoot}training/volley/requestqueue.html#singleton"> +Setting Up a RequestQueue</a>.</p> + +<p>Here is a sample implementation for an in-memory {@code LruBitmapCache} class. +It extends the {@link android.support.v4.util.LruCache} class and implements the +{@code ImageLoader.ImageCache} interface:</p> + +<pre> +import android.graphics.Bitmap; +import android.support.v4.util.LruCache; +import android.util.DisplayMetrics; +import com.android.volley.toolbox.ImageLoader.ImageCache; + +public class LruBitmapCache extends LruCache<String, Bitmap> + implements ImageCache { + + public LruBitmapCache(int maxSize) { + super(maxSize); + } + + public LruBitmapCache(Context ctx) { + this(getCacheSize(ctx)); + } + + @Override + protected int sizeOf(String key, Bitmap value) { + return value.getRowBytes() * value.getHeight(); + } + + @Override + public Bitmap getBitmap(String url) { + return get(url); + } + + @Override + public void putBitmap(String url, Bitmap bitmap) { + put(url, bitmap); + } + + // Returns a cache size equal to approximately three screens worth of images. + public static int getCacheSize(Context ctx) { + final DisplayMetrics displayMetrics = ctx.getResources(). + getDisplayMetrics(); + final int screenWidth = displayMetrics.widthPixels; + final int screenHeight = displayMetrics.heightPixels; + // 4 bytes per pixel + final int screenBytes = screenWidth * screenHeight * 4; + + return screenBytes * 3; + } +} +</pre> + +<p>Here is an example of how to instantiate an {@code ImageLoader} to use this +cache:</p> + +<pre> +RequestQueue mRequestQueue; // assume this exists. +ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache( + LruBitmapCache.getCacheSize())); +</pre> + + +<h2 id="request-json">Request JSON</h2> + +<p>Volley provides the following classes for JSON requests:</p> + +<ul> + <li>{@code JsonArrayRequest}—A request for retrieving a + {@link org.json.JSONArray} + response body at a given URL.</li> + <li>{@code JsonObjectRequest}—A request for retrieving a + {@link org.json.JSONObject} + response body at a given URL, allowing for an optional + {@link org.json.JSONObject} + to be passed in as part of the request body.</li> +</ul> + +<p>Both classes are based on the common base class {@code JsonRequest}. You use them +following the same basic pattern you use for other types of requests. For example, this +snippet fetches a JSON feed and displays it as text in the UI:</p> + +<pre> +TextView mTxtDisplay; +ImageView mImageView; +mTxtDisplay = (TextView) findViewById(R.id.txtDisplay); +String url = "http://my-json-feed"; + +JsonObjectRequest jsObjRequest = new JsonObjectRequest + (Request.Method.GET, url, null, new Response.Listener<JSONObject>() { + + @Override + public void onResponse(JSONObject response) { + mTxtDisplay.setText("Response: " + response.toString()); + } +}, new Response.ErrorListener() { + + @Override + public void onErrorResponse(VolleyError error) { + // TODO Auto-generated method stub + + } +}); + +// Access the RequestQueue through your singleton class. +MySingleton.getInstance(this).addToRequestQueue(jsObjRequest); +</pre> + +For an example of implementing a custom JSON request based on +<a href="http://code.google.com/p/google-gson/">Gson</a>, see the next lesson, +<a href="request-custom.html">Implementing a Custom Request</a>. diff --git a/docs/html/training/volley/requestqueue.jd b/docs/html/training/volley/requestqueue.jd new file mode 100644 index 0000000..6858d91 --- /dev/null +++ b/docs/html/training/volley/requestqueue.jd @@ -0,0 +1,204 @@ +page.title=Setting Up a RequestQueue + +trainingnavtop=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#network">Set Up a Network and Cache</a></li> + <li><a href="#singleton">Use a Singleton Pattern</a></li> +</ol> + +</div> +</div> + +<a class="notice-developers-video wide" href="https://developers.google.com/events/io/sessions/325304728"> +<div> + <h3>Video</h3> + <p>Volley: Easy, Fast Networking for Android</p> +</div> +</a> + + +<p>The previous lesson showed you how to use the convenience method +<code>Volley.newRequestQueue</code> to set up a {@code RequestQueue}, taking advantage of +Volley's default behaviors. This lesson walks you through the explicit steps of creating a +{@code RequestQueue}, to allow you to supply your own custom behavior.</p> + +<p>This lesson also describes the recommended practice of creating a {@code RequestQueue} +as a singleton, which makes the {@code RequestQueue} last the lifetime of your app.</p> + +<h2 id="network">Set Up a Network and Cache</h2> + +<p>A {@code RequestQueue} needs two things to do its job: a network to perform transport +of the requests, and a cache to handle caching. There are standard implementations of these +available in the Volley toolbox: {@code DiskBasedCache} provides a one-file-per-response +cache with an in-memory index, and {@code BasicNetwork} provides a network transport based +on your choice of {@link android.net.http.AndroidHttpClient} or {@link java.net.HttpURLConnection}.</p> + +<p>{@code BasicNetwork} is Volley's default network implementation. A {@code BasicNetwork} +must be initialized with the HTTP client your app is using to connect to the network. +Typically this is {@link android.net.http.AndroidHttpClient} or +{@link java.net.HttpURLConnection}:</p> +<ul> +<li>Use {@link android.net.http.AndroidHttpClient} for apps targeting Android API levels +lower than API Level 9 (Gingerbread). Prior to Gingerbread, {@link java.net.HttpURLConnection} +was unreliable. For more discussion of this topic, see +<a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html"> +Android's HTTP Clients</a>. </li> + +<li>Use {@link java.net.HttpURLConnection} for apps targeting Android API Level 9 +(Gingerbread) and higher.</li> +</ul> +<p>To create an app that runs on all versions of Android, you can check the version of +Android the device is running and choose the appropriate HTTP client, for example:</p> + +<pre> +HttpStack stack; +... +// If the device is running a version >= Gingerbread... +if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + // ...use HttpURLConnection for stack. +} else { + // ...use AndroidHttpClient for stack. +} +Network network = new BasicNetwork(stack); +</pre> + +<p>This snippet shows you the steps involved in setting up a +{@code RequestQueue}:</p> + +<pre> +RequestQueue mRequestQueue; + +// Instantiate the cache +Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap + +// Set up the network to use HttpURLConnection as the HTTP client. +Network network = new BasicNetwork(new HurlStack()); + +// Instantiate the RequestQueue with the cache and network. +mRequestQueue = new RequestQueue(cache, network); + +// Start the queue +mRequestQueue.start(); + +String url ="http://www.myurl.com"; + +// Formulate the request and handle the response. +StringRequest stringRequest = new StringRequest(Request.Method.GET, url, + new Response.Listener<String>() { + @Override + public void onResponse(String response) { + // Do something with the response + } +}, + new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + // Handle error + } +}); + +// Add the request to the RequestQueue. +mRequestQueue.add(stringRequest); +... +</pre> + +<p>If you just need to make a one-time request and don't want to leave the thread pool +around, you can create the {@code RequestQueue} wherever you need it and call {@code stop()} on the +{@code RequestQueue} once your response or error has come back, using the +{@code Volley.newRequestQueue()} method described in <a href="simple.html">Sending a Simple +Request</a>. But the more common use case is to create the {@code RequestQueue} as a +singleton to keep it running for the lifetime of your app, as described in the next section.</p> + + +<h2 id="singleton">Use a Singleton Pattern</h2> + +<p>If your application makes constant use of the network, it's probably most efficient to +set up a single instance of {@code RequestQueue} that will last the lifetime of your app. +You can achieve this in various ways. The recommended approach is to implement a singleton +class that encapsulates {@code RequestQueue} and other Volley +functionality. Another approach is to subclass {@link android.app.Application} and set up the +{@code RequestQueue} in {@link android.app.Application#onCreate Application.onCreate()}. +But this approach is <a href="{@docRoot}reference/android/app/Application.html"> +discouraged</a>; a static singleton can provide the same functionality in a more modular +way. </p> + +<p>A key concept is that the {@code RequestQueue} must be instantiated with the +{@link android.app.Application} context, not an {@link android.app.Activity} context. This +ensures that the {@code RequestQueue} will last for the lifetime of your app, instead of +being recreated every time the activity is recreated (for example, when the user +rotates the device). + +<p>Here is an example of a singleton class that provides {@code RequestQueue} and +{@code ImageLoader} functionality:</p> + +<pre>private static MySingleton mInstance; + private RequestQueue mRequestQueue; + private ImageLoader mImageLoader; + private static Context mCtx; + + private MySingleton(Context context) { + mCtx = context; + mRequestQueue = getRequestQueue(); + + mImageLoader = new ImageLoader(mRequestQueue, + new ImageLoader.ImageCache() { + private final LruCache<String, Bitmap> + cache = new LruCache<String, Bitmap>(20); + + @Override + public Bitmap getBitmap(String url) { + return cache.get(url); + } + + @Override + public void putBitmap(String url, Bitmap bitmap) { + cache.put(url, bitmap); + } + }); + } + + public static synchronized MySingleton getInstance(Context context) { + if (mInstance == null) { + mInstance = new MySingleton(context); + } + return mInstance; + } + + public RequestQueue getRequestQueue() { + if (mRequestQueue == null) { + // getApplicationContext() is key, it keeps you from leaking the + // Activity or BroadcastReceiver if someone passes one in. + mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext()); + } + return mRequestQueue; + } + + public <T> void addToRequestQueue(Request<T> req) { + getRequestQueue().add(req); + } + + public ImageLoader getImageLoader() { + return mImageLoader; + } +}</pre> + +<p>Here are some examples of performing {@code RequestQueue} operations using the singleton +class:</p> + +<pre> +// Get a RequestQueue +RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()). + getRequestQueue(); +... + +// Add a request (in this example, called stringRequest) to your RequestQueue. +MySingleton.getInstance(this).addToRequestQueue(stringRequest); +</pre> diff --git a/docs/html/training/volley/simple.jd b/docs/html/training/volley/simple.jd new file mode 100644 index 0000000..942c57f --- /dev/null +++ b/docs/html/training/volley/simple.jd @@ -0,0 +1,169 @@ +page.title=Sending a Simple Request + +trainingnavtop=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#manifest">Add the INTERNET Permission</a></li> + <li><a href="#simple">Use newRequestQueue</a></li> + <li><a href="#send">Send a Request</a></li> + <li><a href="#cancel">Cancel a Request</a></li> +</ol> + +</div> +</div> + +<a class="notice-developers-video wide" href="https://developers.google.com/events/io/sessions/325304728"> +<div> + <h3>Video</h3> + <p>Volley: Easy, Fast Networking for Android</p> +</div> +</a> + +<p>At a high level, you use Volley by creating a {@code RequestQueue} and passing it +{@code Request} objects. The {@code RequestQueue} manages worker threads for running the +network operations, reading from and writing to the cache, and parsing responses. Requests +do the parsing of raw responses and Volley takes care of dispatching the parsed response +back to the main thread for delivery.</p> + +<p> This lesson describes how to send a request using the <code>Volley.newRequestQueue</code> +convenience method, which sets up a {@code RequestQueue} for you. +See the next lesson, +<a href="requestqueue.html">Setting Up a RequestQueue</a>, for information on how to set +up a {@code RequestQueue} yourself.</p> + +<p>This lesson also describes how to add a request to a {@code RequestQueue} and cancel a +request.</p> + +<h2 id="manifest">Add the INTERNET Permission</h2> + +<p>To use Volley, you must add the +{@link android.Manifest.permission#INTERNET android.permission.INTERNET} permission +to your app's manifest. Without this, your app won't be able to connect to the network.</p> + + +<h2 id="simple">Use newRequestQueue</h2> + +<p>Volley provides a convenience method <code>Volley.newRequestQueue</code> that sets up a +{@code RequestQueue} for you, using default values, and starts the queue. For example:</p> + +<pre> +final TextView mTextView = (TextView) findViewById(R.id.text); +... + +// Instantiate the RequestQueue. +RequestQueue queue = Volley.newRequestQueue(this); +String url ="http://www.google.com"; + +// Request a string response from the provided URL. +StringRequest stringRequest = new StringRequest(Request.Method.GET, url, + new Response.Listener<String>() { + @Override + public void onResponse(String response) { + // Display the first 500 characters of the response string. + mTextView.setText("Response is: "+ response.substring(0,500)); + } +}, new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + mTextView.setText("That didn't work!"); + } +}); +// Add the request to the RequestQueue. +queue.add(stringRequest); +</pre> + +<p>Volley always delivers parsed responses on the main thread. Running on the main thread +is convenient for populating UI controls with received data, as you can freely modify UI +controls directly from your response handler, but it's especially critical to many of the +important semantics provided by the library, particularly related to canceling requests. +</p> + +<p>See <a href="requestqueue.html">Setting Up a RequestQueue</a> for a +description of how to set up a {@code RequestQueue} yourself, instead of using the +<code>Volley.newRequestQueue</code> convenience method.</p> + +<h2 id="send">Send a Request</h2> + +<p>To send a request, you simply construct one and add it to the {@code RequestQueue} with +{@code add()}, as shown above. Once you add the request it moves through the pipeline, +gets serviced, and has its raw response parsed and delivered.</p> + +<p>When you call {@code add()}, Volley runs one cache processing thread and a pool of +network dispatch threads. When you add a request to the queue, it is picked up by the cache +thread and triaged: if the request can be serviced from cache, the cached response is +parsed on the cache thread and the parsed response is delivered on the main thread. If the +request cannot be serviced from cache, it is placed on the network queue. The first +available network thread takes the request from the queue, performs the HTTP transaction, +parsse the response on the worker thread, writes the response to cache, and posts the parsed +response back to the main thread for delivery.</p> + +<p>Note that expensive operations like blocking I/O and parsing/decoding are done on worker +threads. You can add a request from any thread, but responses are always delivered on the +main thread.</p> + +<p>Figure 1 illustrates the life of a request:</p> + + <img src="{@docRoot}images/training/volley-request.png" + alt="system bars"> +<p class="img-caption"><strong>Figure 1.</strong> Life of a request.</p> + + +<h2 id="cancel">Cancel a Request</h2> + +<p>To cancel a request, call {@code cancel()} on your {@code Request} object. Once cancelled, +Volley guarantees that your response handler will never be called. What this means in +practice is that you can cancel all of your pending requests in your activity's +{@link android.app.Activity#onStop onStop()} method and you don't have to litter your +response handlers with checks for {@code getActivity() == null}, +whether {@code onSaveInstanceState()} has been called already, or other defensive +boilerplate.</p> + +<p>To take advantage of this behavior, you would typically have to +track all in-flight requests in order to be able to cancel them at the +appropriate time. There is an easier way: you can associate a tag object with each +request. You can then use this tag to provide a scope of requests to cancel. For +example, you can tag all of your requests with the {@link android.app.Activity} they +are being made on behalf of, and call {@code requestQueue.cancelAll(this)} from +{@link android.app.Activity#onStop onStop()}. +Similarly, you could tag all thumbnail image requests in a +{@link android.support.v4.view.ViewPager} tab with their respective tabs and cancel on swipe +to make sure that the new tab isn't being held up by requests from another one.</p> + +<p>Here is an example that uses a string value for the tag:</p> + +<ol> +<li>Define your tag and add it to your requests. +<pre> +public static final String TAG = "MyTag"; +StringRequest stringRequest; // Assume this exists. +RequestQueue mRequestQueue; // Assume this exists. + +// Set the tag on the request. +stringRequest.setTag(TAG); + +// Add the request to the RequestQueue. +mRequestQueue.add(stringRequest);</pre> +</li> + +<li>In your activity's {@link android.app.Activity#onStop onStop()} method, cancel all requests that have this tag. +<pre> +@Override +protected void onStop () { + super.onStop(); + if (mRequestQueue != null) { + mRequestQueue.cancelAll(TAG); + } +} +</pre></li></ol> + +<p>Take care when canceling requests. If you are depending on your response handler to +advance a state or kick off another process, you need to account for this. Again, the +response handler will not be called. +</p> diff --git a/docs/html/tv/images/hero.jpg b/docs/html/tv/images/hero.jpg Binary files differnew file mode 100644 index 0000000..e951167 --- /dev/null +++ b/docs/html/tv/images/hero.jpg diff --git a/docs/html/tv/index.jd b/docs/html/tv/index.jd new file mode 100644 index 0000000..5c48e49 --- /dev/null +++ b/docs/html/tv/index.jd @@ -0,0 +1,254 @@ +page.title=Android TV +page.viewport_width=970 +fullpage=true +no_footer_links=true +page.type=about + +@jd:body + +<style> +.fullpage>#footer, +#jd-content>.content-footer.wrap { + display:none; +} +</style> + + +<div class="landing-body-content"> + + <div class="landing-hero-container"> + + <div class="landing-section tv-hero"> + <div class="landing-hero-scrim"></div> + <div class="landing-hero-wrap"> + <div class="vertical-center-outer"> + <div class="vertical-center-inner"> + + <div class="col-10"> + <div class="landing-section-header"> + <div class="landing-h1 hero">Android TV</div> + <div class="landing-subhead hero">Your apps on the big screen</div> + <div class="landing-hero-description"> + <p>Engage users from the comfort of their couches. + Put your app on TV and bring everyone into + the action.</p> + </div> + </div> + + <div class="landing-body"> + <a href="{@docRoot}preview/tv/start/index.html" class="landing-button + landing-primary" style="margin-top: 40px;"> + Get Started + </a> + </div> + </div> + </div> + </div> + </div> <!-- end .wrap --> + <div class="landing-scroll-down-affordance"> + <a class="landing-down-arrow" href="#reimagine-your-app"> + <img src="{@docRoot}wear/images/carrot.png" alt="Scroll down to read more"> + </a> + </div> + </div> <!-- end .landing-section .landing-hero --> + + <div class="landing-rest-of-page"> + + <div class="landing-section" style="background-color:#f5f5f5" id="reimagine-your-app"> + <div class="wrap"> + <div class="landing-section-header"> + <div class="landing-h1">Reimagine Your App</div> + <div class="landing-subhead"> + Design your app to shine on the biggest screen in the house. + </div> + </div> + + <div class="landing-body"> + <div class="landing-breakout cols"> + + <div class="col-3-wide"> + <img src="{@docRoot}tv/images/placeholder-square.png" alt=""> + + <p>Simple</p> + <p class="landing-small"> + Smooth, fast interactions are key to a successful TV app. Keep navigation simple + and light. Bring your content forward to let users enjoy it with a minimum of + fuss. + </p> + <p class="landing-small"> + <a href="{@docRoot}design/tv/index.html">Learn about TV design</a> + </p> + </div> + + <div class="col-3-wide"> + <img src="{@docRoot}tv/images/placeholder-square.png" alt=""> + + <p>Cinematic</p> + <p class="landing-small"> + What would your app look like if it were a film? Use movement, animation and sound to make your app into an experience. + </p> + <p class="landing-small"> + <a href="{@docRoot}design/tv/index.html">Learn about TV design</a> + </p> + </div> + + <div class="col-3-wide"> + <img src="{@docRoot}tv/images/placeholder-square.png" alt=""> + + <p>Beautiful</p> + <p class="landing-small"> + Apps on TV should be a pleasure to look at, as well as enjoyable to use. Use + made-for-TV styles to make your app familiar and fun. + </p> + <p class="landing-small"> + <a href="{@docRoot}design/tv/index.html">Learn about design for TV</a> + </p> + </div> + </div> + + </div> + </div> <!-- end .wrap --> + </div> <!-- end .landing-section --> + + <div class="landing-section landing-gray-background"> + <div class="wrap"> + <div class="landing-section-header"> + <div class="landing-h1">Build to Entertain</div> + <div class="landing-subhead"> + Android TV lets you engage your users in a new, shared environment.<br> + Find out how to get your app ready for its big-screen debut. + </div> + </div> + + + <div class="landing-body"> + <div class="landing-breakout cols"> + + <div class="col-3-wide"> + <img src="{@docRoot}tv/images/placeholder-square.png" alt=""> + + <p>Made for TV</p> + <p class="landing-small"> + Take advantage of pre-built fragments for browsing and interacting with media + catalogs. + </p> + <p class="landing-small"> + <a href="{@docRoot}preview/tv/ui/browse.html">Learn pre-built fragments</a> + </p> + </div> + + <div class="col-3-wide"> + <img src="{@docRoot}tv/images/placeholder-square.png" alt=""> + + <p>Get Found</p> + <p class="landing-small"> + Help users find your content quickly with in-app searching. + </p> + <p class="landing-small"> + <a href="{@docRoot}preview/tv/ui/in-app-search.html">Learn about app search</a> + </p> + </div> + + <div class="col-3-wide"> + <img src="{@docRoot}tv/images/placeholder-square.png" alt=""> + + <p>Recommend</p> + <p class="landing-small"> + Suggest content from your app to keep your users coming back. + </p> + <p class="landing-small"> + <a href="{@docRoot}preview/tv/ui/recommendations.html">Learn about + recommendations</a> + </p> + </div> + + </div> + + </div> + </div> <!-- end .wrap --> + </div> <!-- end .landing-section --> + + <div class="landing-section landing-red-background"> + <div class="wrap"> + <div class="landing-section-header"> + <div class="landing-h1 landing-align-left">Get Started with Android TV</div> + <div class="landing-body"> + <p>Begin building TV apps right away using these developer resources:</p> + </div> + </div> + + <div class="landing-body"> + <div class="landing-breakout cols"> + <div class="col-8" style="margin-left: -8px;"> + <p style="font-size: 24px;">L-Preview SDK</p> + <p> + The preview SDK includes all the tools you need to build and test apps for TV. + Download it and start creating your big-screen app. + </p> + + </div> + + <div class="col-8"> + <p style="font-size: 24px;">ADT-1 Developer Kit</p> + <p> + Request an ADT-1 Developer Kit, a compact and powerful streaming media player + and gamepad, ideal for developing and testing apps for TV. + </p> + + </div> + + </div> + </div> + + <div class="landing-body"> + <div class="landing-breakout cols"> + + <div class="col-8"> + <a href="{@docRoot}preview/setup-sdk.html" class="landing-button landing-primary"> + Download the Preview SDK + </a> + </div> + + <div class="col-8"> + <a href="{@docRoot}preview/tv/adt-1/request.html" class="landing-button landing-primary"> + Request ADT-1 Developer Kit + </a> + </div> + </div> + </div> + + </div> <!-- end .wrap --> + </div> <!-- end .landing-section --> + + </div> <!-- end .landing-rest-of-page --> + + <div class="content-footer wrap" itemscope="" itemtype="http://schema.org/SiteNavigationElement" + style="border-top: none;"> + <div class="layout-content-col col-16" style="padding-top:4px"> + <style>#___plusone_0 {float:right !important;}</style> + <div class="g-plusone" data-size="medium"></div> + </div> + </div> + <div id="footer" class="wrap" style="width:940px;position:relative;top:-35px;z-index:-1"> + <div id="copyright"> + Except as noted, this content is + licensed under <a href="http://creativecommons.org/licenses/by/2.5/"> + Creative Commons Attribution 2.5</a>. For details and + restrictions, see the <a href="/license.html">Content + License</a>. + </div> + </div> + + </div> <!-- end .landing-hero-container --> + + <script> + $("a.landing-down-arrow").on("click", function(e) { + $("body").animate({ + scrollTop: $(".tv-hero").height() + 120 + }, 1000, "easeOutQuint"); + e.preventDefault(); + }); + </script> + +</div> <!-- end landing-body-content --> + diff --git a/docs/html/wear/css/wear.css b/docs/html/wear/css/wear.css deleted file mode 100644 index fe9eef2..0000000 --- a/docs/html/wear/css/wear.css +++ /dev/null @@ -1,447 +0,0 @@ -/** - * UTILITIES - */ - - -.border-box { - box-sizing: border-box; -} - -.vertical-center-outer { - display: table; - height: 100%; - width: 100%; -} - -.vertical-center-inner { - display: table-cell; - vertical-align: middle; -} - -/** - * TYPE STYLES - */ - -.wear-h1 { - font-weight: 300; - font-size: 60px; - line-height: 78px; - text-align: center; - letter-spacing: -1px; -} - -.wear-pre-h1 { - font-weight: 400; - font-size: 28px; - color: #93B73F; - line-height: 36px; - text-align: center; - letter-spacing: -1px; - text-transform: uppercase; - -} - -.wear-h1.hero { - text-align: left; -} - -.wear-h2 { - font-weight: 300; - font-size: 42px; - line-height: 64px; - text-align: center; -} - - -.wear-subhead { - color: #999999; - font-size: 20px; - line-height: 28px; - text-align: center; -} -.wear-subhead.hero { - text-align: left; - color: white; -} - -.wear-hero-description { - text-align: left; - margin: 1em 0; -} - -.wear-hero-description p { - font-weight: 300; - margin: 0; - font-size: 18px; - line-height: 24px; -} - -.wear-body .wear-small { - font-size: 14px; - line-height: 19px; -} - -.wear-body.wear-align-center { - text-align: center; -} - -.wear-align-left { - text-align: left; -} - -/** - * LAYOUT - */ - -#body-content, -.fullpage, -#jd-content, -.jd-descr, -.wear-body-content { - height: 100%; -} - -.wear-section { - padding: 80px 10px 80px; - width: 100%; - margin-left: -10px; - text-rendering: optimizeLegibility; -} - -#extending-android-to-wearables { - padding-top: 30px; -} - -.wear-short-section { - padding: 40px 10px 28px; -} - -.wear-gray-background { - background-color: #e9e9e9; -} - -.wear-white-background { - background-color: white; -} - -.wear-red-background { - color: white; - background-color: hsl(8, 70%, 54%); -} - -.wear-subhead-red { - color: hsl(8, 71%, 84%); - text-align: left; -} - -.wear-subhead-red p { - margin-top: 20px; -} - -.wear-hero-container { - height: 100%; -} - -.wear-hero { - height: calc(100% - 70px); - min-height: 504px; - margin-top: 0; - padding-top: 0; - padding-bottom: 0; - background-image: url(/wear/images/hero.jpg); - background-size: cover; - background-position: right center; - color: white; - position: relative; - overflow: hidden; -} - -.wear-hero-scrim { - background: black; - opacity: .2; - position: absolute; - width: 100%; - height: 100%; - margin-left: -10px; -} - -.wear-hero-wrap { - margin: 0 auto; - width: 940px; - clear: both; - height: 100%; - position: relative; -} - -.wear-section-header { - margin-bottom: 40px; -} - -.wear-hero-wrap .wear-section-header { - margin-bottom: 16px; -} - -.wear-body { - font-size: 18px; - line-height: 24px; -} - -.wear-button { - white-space: nowrap; - display: inline-block; - padding: 16px 32px; - font-size: 18px; - font-weight: 500; - line-height: 24px; - cursor: pointer; - color: white; - -webkit-user-select: none; - -moz-user-select: none; - -o-user-select: none; - user-select: none; - -webkit-transition: .2s background-color ease-in-out; - -moz-transition: .2s background-color ease-in-out; - -o-transition: .2s background-color ease-in-out; - transition: .2s background-color ease-in-out; -} - -.wear-primary { - background-color: hsl(8, 70%, 54%); /* #dc4b35 */ - color: #f8f8f8; -} - -.wear-button.wear-primary:hover { - background-color: hsl(8, 70%, 44%); /* #bf3722 */ -} - -.wear-button.wear-primary:active { - background-color: hsl(8, 70%, 36%); /* # */ -} - -.wear-button.wear-secondary { - background-color: hsl(8, 70%, 44%); -} - -.wear-button.wear-secondary:hover { - background-color: hsl(8, 70%, 36%); -} - -.wear-button.wear-secondary:active { - background-color: hsl(8, 70%, 30%); -} - -a.wear-button, -a.wear-button:hover, -a.wear-button:visited { - color: white !important; -} - -.wear-video-link { - white-space: nowrap; - display: inline-block; - padding: 16px 32px 16px 82px; - font-size: 18px; - font-weight: 400; - line-height: 24px; - cursor: pointer; - color: hsla(0, 0%, 100%, .8); - -webkit-user-select: none; - -moz-user-select: none; - -o-user-select: none; - user-select: none; - -webkit-transition: .2s color ease-in-out; - -moz-transition: .2s color ease-in-out; - -o-transition: .2s color ease-in-out; - transition: .2s color ease-in-out; -} - -.wear-video-link:before { - height: 64px; - width: 64px; - display: inline-block; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAFuklEQVR42u2dXWgcVRSAV9LWtBBTTZVWUhNqEQtq1QeroDRKFRFsROqTYPuo+JCiIoJKFC0USqlUfCiowRcfrBgVUUElefAPkW5T8aeaGn9aRbFsjP0x2cx8PuRMvFxmdjeb2Z17Z8+B85DsZPbO+eaec3/OPSkABdXsVI2gABSAqgJQAKoKQAGoKgAFoKoAFICqAlAAqgpAAai6DqDRAiwDeoFtwB7gPaAInABKwKToCWAMeB/YDdwJrAWWNLh9+QMAXABsBQ4A3wFTwAxQBmaBAAhjNJDPy3L938BXwAvArUCHAkh+kCXAVcA+YBw4bRg7MngtkgTlDPA98CywHmhTAP8/xCbgVeAvMZZpwDQllN7xB/AysKGlAQAXAvuBkzW85UVgCBgENlfQQbmuWAXELPAnsAvoaikAQBtwh/j3coLhS2LIfqCzzu/plL8fkvvFgZiR4L2lHrfkHQBgpQTFUwmGnwC212v0KjC2y/3jQPwDPA+05xYAcBHwubx1YZzhC02QBBBRbxgBzssdAOBy4JgRZE0ZTPuNr7FHDCbEhqNAd24AAN0yUbID7QSwsZChABut3hANXY8Bq70HIMb/Ocb4w81+66v0hmGrN0QQ1ngLQJYRvpWHMWWo4KDIaMnuCcVKgdlZAGL8t2J8vpPGrwChDLyWBMFlAA8D0z4ZvwKEs8D93gCQEc9Jy/jFgkdizaRDGUSs8wXAu1bQLQE9ngHosWbPAXDQeQAypT9rBd3+gociyxi2K9riLABZUj5iuZ6RgsciM2OzFxw2A7JrAO6VwGtKTwpG+Anoy9AVmb3gDHCPcwCAFcChRox6jPu9CazMeFQUAKNRL3AJwE2yopjq228BQPZ/d2bcCyaBTa4BeNGa8Q6naIA4GQWubiKEYWvBbp8zAGQt5VfL/fQ3GEAkTzXDLVkjokA2k5a7AuA2GaLNj/tTfvhq0pQgbcwLQtlQusYVALtlzSR191MjADNI9zbJDZWBR10BMGr5/4GMADQ0SAMDlht62xUAxy0AmzMEEMnhtIO0ZF2YAH5wITd0hQw/5wE04M1bjDyXZpC2hqMlYGnWAHqBf40APOEYgChI35VSWyasWfGqrAH0WVkOIw4CSC1IG2tDoSy7XJE1gPs8ArDoIG0BmJGk30wBDHgGYFFBOgbAtqwB7GxxAHerC8rOBU0Dt2gQzjYIb8gawDor+6HVhqFdrkzEwhabiAVOTMSkUb+06FLEUVfWgj5q0cW4g64AeNo66ZLlcnTDNmesBN4y8KArAG6QU42ttCEzBVzpCoAO4EfLDeV5SzIEvgHaXdqUP2BlQud1Ux55zj2uZUX02cPRnKalRLmu17qYmPWF5YbymJgVAh8Ay5wCII3ZEZOYm6fURGT2u9X43Mnk3CDHybmfmRVYXExPv9nKEcpLejqSC3SjdY2TBzTesHqB7wc0onTEV2KucxLApXKkJy9HlAI5anuJFwCkYQ/EuCJfD+mdBnYkXOssgHY53un7MdVZ4CVgqVcADAhjMafkfTioHc14P04yvvMApIEXy5F/+7S8y6UKolPyR4BVVf7Wi2IdawwIPhTrmAW+rmZ8bwBIQ7vloXwoVzNWS6UUrwAYy9YfOlqwKZDkgneA5Qu4l3cly84F9sqGhislywLmaozuYoGFXr0DII1ukxP1hxJ6QzR7HqLxRfumZaRzXZ3f4XXZyi7gCeB3kqsnzs+kSb9s5XHgMeD8RTxDLgq3rmeuYuFvNYCoR8wqujNi+L3UWBcu9wAMt3QZ8LiMlk5RuU50teq6kcEDgTolveIRYHUQBOek1O5cFu/ukLz7/ZJgNSm+OirebWpgaPS7slxfAr4EngGuX8jopqUBxGzyrAVuB54EXgc+lV4yLhO8cfn5E+ZqUD8kBu9sQvv0Hzj4rmoEBaAAVBWAAlBVAApAVQEoAFUFoABUFYACUFUACkC1CfofXVRJocowZVYAAAAASUVORK5CYII=); - background-size: contain; - position: absolute; - content: ""; - opacity: .7; - margin-top: -19px; - margin-left: -64px; - -webkit-transition: .2s opacity ease-in-out; - -moz-transition: .2s opacity ease-in-out; - -o-transition: .2s opacity ease-in-out; - transition: .2s opacity ease-in-out; -} - -.wear-video-link:hover { - color: hsla(0, 0%, 100%, 1); -} - -.wear-video-link:hover:before { - opacity: 1; -} - -.wear-social-image { - float: left; - margin-right: 14px; - height: 64px; - width: 64px; -} - -.wear-social-copy { - padding-left: 78px; -} - -.wear-scroll-down-affordance { - position: absolute; - bottom: 0; - width: 100%; - text-align: center; - z-index: 10; -} - -.wear-down-arrow { - padding: 24px; - display: inline-block; - opacity: .5; - -webkit-transition: .2s opacity ease-in-out; - -moz-transition: .2s opacity ease-in-out; - -o-transition: .2s opacity ease-in-out; - transition: .2s opacity ease-in-out; - - -webkit-animation-name: pulse-opacity; - -webkit-animation-duration: 4s; -} - -.wear-down-arrow:hover { - opacity: 1; -} - -.wear-down-arrow img { - height: 28px; - width: 28px; - margin: 0 auto; - display: block; -} - -.wear-divider { - display: inline-block; - height: 2px; - background-color: white; - position: relative; - margin: 10px 0; -} - -/* 3 CLOLUMN LAYOUT */ - -.wear-breakout { - margin-top: 40px; - margin-bottom: 40px; -} - -.wear-breakout img { - margin-bottom: 20px; -} - -.wear-partners img { - margin-bottom: 20px; -} - -.wear-breakout p { - padding: 0 23px; -} - -.wear-inset-video-container { - position: relative; -} - -.wear-inset-video-container img.gif { - max-width: 222px; - position: absolute; - top: 40px; - left: 40px; -} - -img.wear-bezel-only { - height:302px; - width:302px; -} - -.wear-breakout.wear-partners img { - margin-bottom: 20px; -} - -.col-3-wide { - display: inline; - float: left; - margin-left: 10px; - margin-right: 10px; -} - -.col-3-wide { - width: 302px; -} - -/** - * ANIMATION - */ - -@-webkit-keyframes pulse-opacity { - 0% { - opacity: .5; - } - 20% { - opacity: .5; - } - 40% { - opacity: 1; - } - 60% { - opacity: .5; - } - 80% { - opacity: 1; - } - 100% { - opacity: .5; - } -} - - - -/** - * VIDEO - */ - -#video-container { - display:none; - position:fixed; - top:0; - left:-10px; - width:102%; - height:100%; - background-color:rgba(0,0,0,0.7); - z-index:99; -} - -#video-frame { - width:940px; - height:526.4px; - margin:80px auto 0; - display:none; -} - -.video-close { -cursor: pointer; -position: relative; -left: 940px; -top: 0; -pointer-events: all; -} - -#icon-video-close { -background-image: url("../images/close.png"); -background-position: 0 0; -height: 36px; -width: 36px; -display:block; -} diff --git a/docs/html/wear/images/hero.jpg b/docs/html/wear/images/hero.jpg Binary files differindex 40cc03c..0b4debb 100644 --- a/docs/html/wear/images/hero.jpg +++ b/docs/html/wear/images/hero.jpg diff --git a/docs/html/wear/images/kitchen_still.jpg b/docs/html/wear/images/kitchen_still.jpg Binary files differdeleted file mode 100644 index 4afe359..0000000 --- a/docs/html/wear/images/kitchen_still.jpg +++ /dev/null diff --git a/docs/html/wear/index.jd b/docs/html/wear/index.jd index 659e9f2..bc08aa0 100644 --- a/docs/html/wear/index.jd +++ b/docs/html/wear/index.jd @@ -2,7 +2,7 @@ page.title=Android Wear page.viewport_width=970 fullpage=true no_footer_links=true -page.customHeadTag=<link rel="stylesheet" type="text/css" href="/wear/css/wear.css"> +page.type=about @jd:body @@ -14,8 +14,6 @@ page.customHeadTag=<link rel="stylesheet" type="text/css" href="/wear/css/wear.c </style> - - <div id="video-container"> <div id="video-frame"> <div class="video-close"> @@ -23,28 +21,28 @@ page.customHeadTag=<link rel="stylesheet" type="text/css" href="/wear/css/wear.c </div> <script src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script> <div id="ytapiplayer"> - <a href="http://www.youtube.com/watch?v=0xQ3y902DEQ"><img width=940 - src="https://i1.ytimg.com/vi/0xQ3y902DEQ/maxresdefault.jpg"></a><!--You need Flash player 8+ and JavaScript enabled to view this video. --> + <a href="http://www.youtube.com/watch?v=0xQ3y902DEQ"><img width="940" src="https://i1.ytimg.com/vi/0xQ3y902DEQ/maxresdefault.jpg"></a><!--You need Flash player 8+ and JavaScript enabled to view this video. --> </div> </div> </div> -<div class="wear-body-content"> - <div class="wear-hero-container"> - <div class="wear-section wear-hero"> - <div class="wear-hero-scrim"></div> - <div class="wear-hero-wrap"> +<div class="landing-body-content"> + <div class="landing-hero-container"> + <div class="landing-section wear-hero"> + <div class="landing-hero-scrim"></div> + <div class="landing-hero-wrap"> <div class="vertical-center-outer"> <div class="vertical-center-inner"> <div class="col-10"> - <div class="wear-section-header"> - <div class="wear-h1 hero">Android Wear</div> - <div class="wear-subhead hero">Information that moves with you</div> + <div class="landing-section-header"> + <div class="landing-h1 hero">Android Wear</div> + <div class="landing-subhead hero">Information that moves with you</div> </div> - <div class="wear-hero-description"> + <div class="landing-hero-description"> + <p>Small, powerful devices, worn on the body. Useful information when you need it most. Intelligent answers to spoken questions. @@ -52,222 +50,150 @@ page.customHeadTag=<link rel="stylesheet" type="text/css" href="/wear/css/wear.c Your key to a multiscreen world.</p> </div> - <div class="wear-body"> - <a href="/wear/preview/start.html" class="wear-button wear-primary" style="margin-top: 40px;"> - Get the Developer Preview - </a> - <a id="watchVideo" href="https://youtube.googleapis.com/v/0xQ3y902DEQ"> - <div class="wear-video-link">Watch the video</div> + <div class="landing-body"> + <a href="{@docRoot}training/building-wearables.html" class="landing-button landing-primary" style="margin-top: 40px;"> + Get Started </a> -<script> -$("#watchVideo").on("click", function(e) { - $("#video-container").fadeIn(400, function(){$("#video-frame").show()}); - - var params = { allowScriptAccess: "always"}; - var atts = { id: "ytapiplayer" }; - swfobject.embedSWF("//www.youtube.com/v/0xQ3y902DEQ?enablejsapi=1&playerapiid=ytplayer&version=3&HD=1;rel=0;showinfo=0;modestbranding;origin=developer.android.com;autohide=1;autoplay=1", - "ytapiplayer", "940", "526.4", "8", null, null, params, atts); - - e.preventDefault(); -}); -$("#icon-video-close").on("click", function() { - ytplayer = document.getElementById("ytapiplayer"); - try { - ytplayer.stopVideo(); - $(ytplayer).hide(); - $("#video-container").fadeOut(400); - } catch(e) { - console.log('Video not available'); - $("#video-container").fadeOut(400); - } -}); -</script> </div> </div> </div> </div> </div> <!-- end .wrap --> - <div class="wear-scroll-down-affordance"> - <a class="wear-down-arrow" href="#extending-android-to-wearables"> - <img src="/wear/images/carrot.png" alt="Scroll down to read more"> + <div class="landing-scroll-down-affordance"> + <a class="landing-down-arrow" href="#extending-android-to-wearables"> + <img src="{@docRoot}wear/images/carrot.png" alt="Scroll down to read more"> </a> </div> - </div> <!-- end .wear-section .wear-hero --> - </div> <!-- end .wear-hero-container --> + </div> <!-- end .landing-section .landing-hero --> - <div class="wear-rest-of-page"> - <div class="wear-section" id="extending-android-to-wearables"> + + <div class="landing-rest-of-page" style="margin-top:80px"> + <div class="landing-section" id="extending-android-to-wearables"> <div class="wrap"> - <div class="wear-section-header"> - <div class="wear-h1">Extending Android to Wearables</div> - <div class="wear-subhead"> - Android Wear extends the Android platform to a new generation of wearable devices. <br> - The user experience is designed specifically for wearables. + <div class="landing-section-header"> + <div class="landing-h1">Extending Android to Wearables</div> + <div class="landing-subhead"> + Android Wear extends the Android platform to a new generation of devices, <br> + with a user experience that's designed specifically for wearables. + </div> </div> - <div class="wear-body"> - <div class="wear-breakout cols"> + <div class="landing-body"> + <div class="landing-breakout cols"> <div class="col-3-wide"> - <div class="wear-inset-video-container"> - <img class="wear-bezel-only" src="/wear/images/screens/bezel.png" alt=""> - <img class="gif" src="/wear/images/screens/reservation_animated.gif"> + <div class="framed-wear-square"> + <img src="{@docRoot}wear/images/screens/reservation_animated.gif"> </div> - <p class="wear-small"> + <p class="landing-small"> Say “Ok Google†to ask questions and get stuff done. </p> </div> <div class="col-3-wide"> - <img src="/wear/images/screens/circle_message2.png" itemprop="image" alt="" > - <p class="wear-small"> - Get glanceable, actionable information at just the right time throughout the day. + <img src="{@docRoot}wear/images/screens/circle_message2.png" itemprop="image" alt=""> + <p class="landing-small"> + Get glanceable, actionable information at just the right time with notifications + that are synced from your handheld device. + </p> </div> <div class="col-3-wide"> - <img src="/wear/images/screens/fitness-24.png" alt=""> - <p class="wear-small"> - A wide range of sensors is available to your applications, from accelerometers to heart rate monitors. + <img src="{@docRoot}wear/images/screens/fitness-24.png" alt=""> + <p class="landing-small"> + Design apps that can access a wide range of sensors and other hardware + directly on the wearable. + </p> </div> </div> <p> - The Android Wear Developer Preview lets you create wearable experiences for your existing Android apps and see how they will appear on square and round Android wearables. - </p> + Before you start building, check out the + <a href="{@docRoot}design/wear/index.html">Android Wear Design Principles</a> + to understand how to create great experiences for this exciting, new form factor.</p> - <p> - Later this year, we’ll be launching the Android Wear SDK, enabling even more customized experiences. - </p> </div> </div> <!-- end .wrap --> - </div> <!-- end .wear-section --> + </div> <!-- end .landing-section --> - <div class="wear-section wear-gray-background"> + <div class="landing-section landing-gray-background"> <div class="wrap"> - <div class="wear-section-header"> - <div class="wear-h1">Developer Preview</div> - <div class="wear-subhead"> - Your app’s notifications will already appear on Android wearables. <br> - With the new Android Wear APIs you can customize and extend those notifications. + <div class="landing-section-header"> + <div class="landing-h1">Developing for Android Wear</div> + <div class="landing-subhead"> + The Android Wear APIs are delivered in the Android v4 support library and Google Play services. + This lets Android handhelds, old and new, communicate with Android wearables. </div> </div> - - <div class="wear-body"> - <div class="wear-breakout cols"> - <div class="col-3-wide"> - <img src="images/screens/14_circle_voicereply.png" alt=""> - <p>Receive Voice Replies</p> - <p class="wear-small"> - Add actions to your notifications to allow users to reply by voice or touch. The system delivers the text to your app on the phone. - </p> - <p class="wear-small"> - <a href="/wear/notifications/remote-input.html">Learn about input actions</a> - </p> - </div> - <div class="col-3-wide"> - - - <div class="wear-inset-video-container"> - <img class="wear-bezel-only" src="/wear/images/screens/bezel.png" alt=""> - <img class="gif" src="/wear/images/screens/pages_animated.gif"> - </div> - - <p>Add Notification Pages</p> - <p class="wear-small"> - Add additional pages to your notification that are visible on the wearable device to provide detailed information on the wrist. + <div class="landing-body"> + <div class="landing-breakout cols"> + <div class="col-4"> + <img src="{@docRoot}wear/images/features/ts2.png" alt=""> + <p>Synced Notifications</p> + <p class="landing-small"> + Notifications on handhelds can automatically sync to wearables, so design them + with both devices in mind. </p> - <p class="wear-small"> - <a href="/wear/notifications/pages.html">Learn about pages</a> + <p class="landing-small"> + <a href="{@docRoot}training/wearables/notifications/index.html">Build notifications</a> </p> </div> - <div class="col-3-wide"> - <img src="images/screens/11_stack_B.png" alt=""> - <p>Stack Multiple Notifications</p> - <p class="wear-small"> - Your app should consolidate similar notifications. On a wearable, you can stack them together so the details for each are immediately available. - </p> - <p class="wear-small"> - <a href="/wear/notifications/stacks.html">Learn about stacks</a> + <div class="col-4"> + <img src="{@docRoot}wear/images/features/ts1.png" alt=""> + <p>Wearable Apps</p> + <p class="landing-small"> + Create custom experiences with activities, services, sensors, and much + more with the Android SDK. </p> - </div> - </div> - - <p> - You can also trigger your notifications contextually using existing Android APIs. For example, use <a href="{@docRoot}training/location/geofencing.html">geofences</a> to provide glanceable information to your users when they are at home, or use the <a href="{@docRoot}training/location/activity-recognition.html">activity detection APIs</a> to send messages to your users’ wrists while they are bicycling. - </p> - - <p>See the <a href="{@docRoot}wear/design/index.html">Android Wear Developer Preview Design Principles</a> for more suggestions on creating great wearable experiences.</p> + <p class="landing-small"> + <a href="{@docRoot}training/wearables/apps/index.html">Create wearable apps</a> - </div> - </div> <!-- end .wrap --> - </div> <!-- end .wear-section --> - - <div class="wear-section" style="background-color:#f5f5f5"> - <div class="wrap"> - <div class="wear-section-header"> - <div class="wear-pre-h1">Coming soon</div> - <div class="wear-h1">The Android Wear SDK</div> - <div class="wear-subhead"> - The Developer Preview is just the beginning for Android Wear. - </div> - </div> - - <div class="wear-body"> - <p> - In the coming months we’ll be launching new APIs and features for Android wearables to create even more unique experiences for the wrist: - </p> - - <div class="wear-breakout cols"> - <div class="col-4"> - <img src="/wear/images/features/ts1.png" alt=""> - <p>Build Custom UI</p> - <p class="wear-small"> - Create custom card layouts and run activities directly on wearables. </p> </div> <div class="col-4"> - <img src="/wear/images/features/ts2.png" alt=""> + <img src="{@docRoot}wear/images/features/ts2.png" alt=""> <p>Send Data</p> - <p class="wear-small"> - Send data and actions between a phone and a wearable with data replication APIs and RPCs. + <p class="landing-small"> + Send data and actions between handhelds and wearables with + data replication APIs and RPCs. </p> - </div> - <div class="col-4"> - <img src="/wear/images/features/ts3.png" alt=""> - <p>Control Sensors</p> - <p class="wear-small"> - Gather sensor data and display it in real-time on Android wearables. + <p class="landing-small"> + <a href="{@docRoot}training/wearables/data-layer/index.html">Work with the Data Layer</a> + </p> </div> <div class="col-4"> - <img src="/wear/images/features/ts4.png" alt=""> + <img src="{@docRoot}wear/images/features/ts4.png" alt=""> <p>Voice Actions</p> - <p class="wear-small"> - Register your app to handle voice actions, like "Ok Google, take a note." + <p class="landing-small"> + Register your app to handle voice actions, like "Ok Google, take a note," + for a hands-free experience. + </p> + <p class="landing-small"> + <a href="{@docRoot}training/wearables/apps/voice-actions.html">Integrate voice actions</a> </p> </div> </div> - </div> </div> <!-- end .wrap --> - </div> <!-- end .wear-section --> + </div> <!-- end .landing-section --> - <div class="wear-section wear-white-background"> + <div class="landing-section landing-white-background"> <div class="wrap"> - <div class="wear-section-header"> - <div class="wear-h2">Building an Ecosystem</div> - <div class="wear-body wear-align-center"> - <p class="wear-small"> - We’re working with several partners to bring you watches powered by Android Wear later this year! + <div class="landing-section-header"> + <div class="landing-h2">Building an Ecosystem</div> + <div class="landing-body landing-align-center"> + <p class="landing-small"> + We’re working with partners around the world to build watches powered by Android Wear! </p> </div> </div> - <div class="wear-partners cols"> + <div class="landing-partners cols"> <div class="col-4"> <img src="/wear/images/partners/asus.png" alt="Asus"> </div> @@ -303,67 +229,78 @@ $("#icon-video-close").on("click", function() { </div> </div> </div> <!-- end .wrap --> - </div> <!-- end .wear-section --> + </div> - <div class="wear-section wear-red-background"> + + <div class="landing-section landing-red-background"> <div class="wrap"> - <div class="wear-section-header"> - <div class="wear-h1 wear-align-left">Start working with Android Wear</div> - <div class="wear-subhead wear-subhead-red"> - <p> - Your app’s notifications will already appear on Android wearables. <br> - With the new Android Wear APIs, you can customize and extend those notifications. - </p> + <div class="landing-section-header"> + <div class="landing-h1 landing-align-left">Get Started with Android Wear</div> + + <div class="landing-subhead landing-subhead-red"> <p> - We’re excited about wearables and the experiences developers can create with them. <br> - We can’t wait to see what you do next.</p> + Set up your development environment and start working with the APIs. + We’re excited about the experiences you'll create and can't + wait to see what you do next.</p> </div> </div> - <div class="wear-body"> - <a href="/wear/preview/start.html" class="wear-button wear-secondary" style="margin-top: 20px;"> - Get the Developer Preview + <div class="landing-body"> + <a href="{@docRoot}training/building-wearables.html" class="landing-button landing-primary" style="margin-top: 20px;"> + Get Started </a> </div> </div> </div> - <div class="wear-section"> + <div class="landing-section"> <div class="wrap"> <div class="cols"> - <div class="wear-body"> + <div class="landing-body"> <div class="col-3-wide"> <a target="_blank" href="https://www.youtube.com/playlist?list=PLWz5rJ2EKKc-kIrPiq098QH9dOle-fLef"> - <img class="wear-social-image" src="//www.google.com/images/icons/product/youtube-128.png" alt=""> + <img class="landing-social-image" src="//www.google.com/images/icons/product/youtube-128.png" alt=""> </a> - <div class="wear-social-copy"> + <div class="landing-social-copy"> <p>DevBytes</p> - <p class="wear-small"> - Learn how to optimize your app notifications for wearable devices in this <a target="_blank" href="https://www.youtube.com/playlist?list=PLWz5rJ2EKKc-kIrPiq098QH9dOle-fLef">DevBytes video</a> using the Android Wear Developer Preview. - </p> + <p class="landing-small"> + Learn the basic concepts of Android Wear + development with videos from the product team. + </p> + <br> + <p class="landing-small"> + <a target="_blank" href="https://www.youtube.com/playlist?list=PLWz5rJ2EKKc-kIrPiq098QH9dOle-fLef">DevBytes videos</a> + </p> </div> </div> <div class="col-3-wide"> - <a target="_blank" href="http://android-developers.blogspot.com/2014/03/android-wear-developer-preview.html"> - <img class="wear-social-image" src="/wear/images/blogger.png" alt=""> + <a target="_blank" href="http://android-developers.blogspot.com/2014/03/android-landing-developer-preview.html"> + <img class="landing-social-image" src="{@docRoot}wear/images/blogger.png" alt=""> </a> - <div class="wear-social-copy"> + <div class="landing-social-copy"> <p>Blog Post</p> - <p class="wear-small"> - Read more about the Android Wear Developer Preview announcement - at the <a target="_blank" href="http://android-developers.blogspot.com/2014/03/android-wear-developer-preview.html">Android Developers Blog</a>. + <p class="landing-small"> + Read more about Android Wear development + on our blog. Just search for "Android Wear". + </p> + <br> + <p class="landing-small"> + <a target="_blank" href="http://android-developers.blogspot.com">Android Developers Blog</a> + </p> + <p></p> </div> </div> <div class="col-3-wide"> <a target="_blank" href="http://g.co/androidweardev"> - <img class="wear-social-image" src="//www.google.com/images/icons/product/gplus-128.png" alt="+Android Wear Developers"> + <img class="landing-social-image" src="//www.google.com/images/icons/product/gplus-128.png" alt="+Android Wear Developers"> </a> - <div class="wear-social-copy"> + <div class="landing-social-copy"> <p>G+ Community</p> - <p class="wear-small"> - Follow us on Google+ to stay up-to-date on Android Wear development and join the discussion! + <p class="landing-small"> + Follow us on Google+ to stay up-to-date with Android Wear development and to join the discussion! + </p> - <p class="wear-small"> + <p class="landing-small"> <a target="_blank" href="http://g.co/androidweardev">+Android Wear Developers</a> </p> </div> @@ -371,10 +308,8 @@ $("#icon-video-close").on("click", function() { </div> </div> </div> <!-- end .wrap --> - </div> <!-- end .wear-section --> - </div> <!-- end .wear-rest-of-page --> - - + </div> <!-- end .landing-section --> + </div> <!-- end .landing-rest-of-page --> <div class="content-footer wrap" itemscope="" itemtype="http://schema.org/SiteNavigationElement"> <div class="layout-content-col col-16" style="padding-top:4px"> <style>#___plusone_0 {float:right !important;}</style> @@ -386,20 +321,20 @@ $("#icon-video-close").on("click", function() { Except as noted, this content is licensed under <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. For details and - restrictions, see the <a href="/license.html">Content + restrictions, see the <a href="{@docRoot}license.html">Content License</a>. </div> </div> - - - </div> <!-- end wear-body-content --> + </div> <!-- end .landing-hero-container --> <script> - $("a.wear-down-arrow").on("click", function(e) { + $("a.landing-down-arrow").on("click", function(e) { $("body").animate({ - scrollTop: $(".wear-hero").height() + 76 + scrollTop: $(".wear-hero").height() + 120 }, 1000, "easeOutQuint"); e.preventDefault(); }); </script> +</div> <!-- end landing-body-content --> + diff --git a/docs/html/wear/license.jd b/docs/html/wear/license.jd deleted file mode 100644 index b07dacf..0000000 --- a/docs/html/wear/license.jd +++ /dev/null @@ -1,142 +0,0 @@ -page.title=Developer Preview License Agreement - -@jd:body - - -<div class="sdk-terms" style="height:auto;border:0;padding:0;width:700px"> -This is the Android Wear Developer Preview License Agreement. - -1. Introduction - -1.1 The Android Wear Developer Preview Kit (referred to in this License Agreement as the “Developer Preview†and specifically including the Android system files, packaged APIs, Developer Preview library files, and the Developer Preview companion app, if and when they are made available) is licensed to you subject to the terms of this License Agreement. This License Agreement forms a legally binding contract between you and Google in relation to your use of the Developer Preview. - -1.2 "Android Wear" means the Android Wear devices and the Android Wear software stack for use on Android Wear devices. - -1.3 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. - -1.4 "Google" means Google Inc., a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States. - -2. Accepting this License Agreement - -2.1 In order to use the Developer Preview, you must first agree to this License Agreement. You may not use the Developer Preview if you do not accept this License Agreement. - -2.2 By clicking to accept, you hereby agree to the terms of this License Agreement. - -2.3 You may not use the Developer Preview and may not accept the License Agreement if you are a person barred from receiving the Developer Preview under the laws of the United States or other countries including the country in which you are resident or from which you use the Developer Preview. - -2.4 If you are agreeing to be bound by this License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to this License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the Developer Preview on behalf of your employer or other entity. - -3. Developer Preview License from Google - -3.1 Subject to the terms of this License Agreement, Google grants you a limited, worldwide, royalty-free, internal-use, non-assignable and non-exclusive license to use the Developer Preview solely to develop applications to run on the Android Wear platform for Android Wear devices. - -3.2 You agree that Google or third parties own all legal right, title and interest in and to the Developer Preview, including any Intellectual Property Rights that subsist in the Developer Preview. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. - -3.3 You may not use the Developer Preview for any purpose not expressly permitted by this License Agreement. Except to the extent required by applicable third party licenses, you may not: (a) copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the Developer Preview or any part of the Developer Preview; or (b) load any part of the Developer Preview onto a mobile handset or wearable computing device or any other hardware device except an Android Wear device, combine any part of the Developer Preview with other software, or distribute any software or device incorporating a part of the Developer Preview. - -3.4 You agree that you will not take any actions that may cause or result in the fragmentation of Android Wear, including but not limited to distributing, participating in the creation of, or promoting in any way a software development kit derived from the Developer Preview. - -3.5 Use, reproduction and distribution of components of the Developer Preview licensed under an open source software license are governed solely by the terms of that open source software license and not this License Agreement. - -3.6 You agree that the form and nature of the Developer Preview that Google provides may change without prior notice to you and that future versions of the Developer Preview may be incompatible with applications developed on previous versions of the Developer Preview. You agree that Google may stop (permanently or temporarily) providing the Developer Preview (or any features within the Developer Preview) to you or to users generally at Google's sole discretion, without prior notice to you. - -3.7 Nothing in this License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. - -3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the Developer Preview. - -3.9 Your use of any Android system files, packaged APIs, or other components of the Developer Preview which are part of the Android Software Development Kit is subject to the terms of the Android Software Development Kit License Agreement located at http://developer.android.com/sdk/terms.html. These terms are hereby incorporated by reference into this License Agreement. - -4. Use of the Developer Preview by You - -4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under this License Agreement in or to any software applications that you develop using the Developer Preview, including any intellectual property rights that subsist in those applications. - -4.2 You agree to use the Developer Preview and write applications only for purposes that are permitted by (a) this License Agreement, (b) the Google Play Developer Program Policies located at https://play.google.com/about/developer-content-policy.html, and hereby incorporated into this License Agreement by reference), and (c) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). You agree to use reasonable efforts to comply with the Android Wear Platform Design Guide available on the Android Wear developer website - -4.3 You agree that if you use the Developer Preview to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. - -4.4 You agree that you will not engage in any activity with the Developer Preview, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google. - -4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android Wear and/or applications for Android Wear, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. - -4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under this License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach. - -4.7 Unless otherwise specified in writing by Google, Google does not intend use of Android Wear to create obligations under the Health Insurance Portability and Accountability Act, as amended, (“HIPAAâ€), and makes no representations that Android Wear satisfies HIPAA requirements. If you are (or become) a Covered Entity or Business Associate under HIPAA, you agree not to use Android Wear for any purpose or in any manner involving Protected Health Information unless you have received prior written consent to such use from Google. - -4.8 The Developer Preview is in development, and your testing and feedback are an important part of the development process. By using the Developer Preview, you acknowledge that implementation of some features are still under development and that you should not rely on the Developer Preview, Android Wear devices, Android Wear system software, or Android Wear services having the full functionality of a stable release. You agree not to publicly distribute or ship any application using this Developer Preview as this Developer Preview will no longer be supported after the official SDK is released. - -5. Your Developer Credentials - -5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials. - -6. Privacy and Information - -6.1 In order to continually innovate and improve the Developer Preview, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the Developer Preview are being used and how they are being used. Before any of this information is collected, the Developer Preview will notify you and seek your consent. If you withhold consent, the information will not be collected. - -6.2 The data collected is examined in the aggregate to improve the Developer Preview and is maintained in accordance with Google's Privacy Policy lcoated at http://www.google.com/policies/privacy/. - -7. Third Party Applications - -7.1 If you use the Developer Preview to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. - -7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. - -7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, this License Agreement does not affect your legal relationship with these third parties. - -8. Using Google APIs - -8.1 Google APIs - -8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. - -8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so. - -9. Terminating this License Agreement - -9.1 This License Agreement will continue to apply until terminated by either you or Google as set out below. - -9.2 If you want to terminate this License Agreement, you may do so by ceasing your use of the Developer Preview and any relevant developer credentials. - -9.3 Google may at any time, terminate this License Agreement with you if: -(A) you have breached any provision of this License Agreement; or -(B) Google is required to do so by law; or -(C) the partner with whom Google offered certain parts of Developer Preview (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the Developer Preview to you; or -(D) Google decides to no longer provide the Developer Preview or certain parts of the Developer Preview to users in the country in which you are resident or from which you use the service, or the provision of the Developer Preview or certain Developer Preview services to you by Google is, in Google's sole discretion, no longer commercially viable. - -9.4 When this License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst this License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely. - -10. DISCLAIMER OF WARRANTIES - -10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE DEVELOPER PREVIEW IS AT YOUR SOLE RISK AND THAT THE DEVELOPER PREVIEW IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. - -10.2 YOUR USE OF THE DEVELOPER PREVIEW AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE DEVELOPER PREVIEW IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. - -10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - -11. LIMITATION OF LIABILITY - -11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING. - -12. Indemnification - -12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys’ fees) arising out of or accruing from (a) your use of the Developer Preview, (b) any application you develop on the Developer Preview that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with this License Agreement. - -13. Changes to the License Agreement - -13.1 Google may make changes to the License Agreement as it distributes new versions of the Developer Preview. When these changes are made, Google will make a new version of the License Agreement available on the website where the Developer Preview is made available. - -14. General Legal Terms - -14.1 This License Agreement constitutes the whole legal agreement between you and Google and governs your use of the Developer Preview (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the Developer Preview. - -14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in this License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. - -14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of this License Agreement is invalid, then that provision will be removed from this License Agreement without affecting the rest of this License Agreement. The remaining provisions of this License Agreement will continue to be valid and enforceable. - -14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to this License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of this License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to this License Agreement. - -14.5 EXPORT RESTRICTIONS. THE DEVELOPER PREVIEW IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE DEVELOPER PREVIEW. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. - -14.6 The rights granted in this License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under this License Agreement without the prior written approval of the other party. - -14.7 This License Agreement, and your relationship with Google under this License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from this License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. -</div> diff --git a/docs/html/wear/preview/signup.jd b/docs/html/wear/preview/signup.jd deleted file mode 100644 index 8e8ec9a..0000000 --- a/docs/html/wear/preview/signup.jd +++ /dev/null @@ -1,169 +0,0 @@ -page.title=Sign Up for the Developer Preview - -@jd:body - -<p>To get started with the Android Wear Developer Preview, you must agree to the - following terms and conditions and provide the email address for your Google account. -After signing up, you’ll have access to:</p> -<ul> - <li>New APIs that allow you to build enhanced notifications for wearables.</li> - <li>Sample code using the new APIs.</li> - <li>The Android Wear Preview app that delivers your notifications to the Android Wear emulator.</li> -</ul> - -<div class="sdk-terms" style="width:678px" onfocus="this.blur()"><div class="sdk-terms-padding"> -This is the Android Wear Developer Preview License Agreement. - -1. Introduction - -1.1 The Android Wear Developer Preview Kit (referred to in this License Agreement as the “Developer Preview†and specifically including the Android system files, packaged APIs, Developer Preview library files, and the Developer Preview companion app, if and when they are made available) is licensed to you subject to the terms of this License Agreement. This License Agreement forms a legally binding contract between you and Google in relation to your use of the Developer Preview. - -1.2 "Android Wear" means the Android Wear devices and the Android Wear software stack for use on Android Wear devices. - -1.3 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time. - -1.4 "Google" means Google Inc., a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States. - -2. Accepting this License Agreement - -2.1 In order to use the Developer Preview, you must first agree to this License Agreement. You may not use the Developer Preview if you do not accept this License Agreement. - -2.2 By clicking to accept, you hereby agree to the terms of this License Agreement. - -2.3 You may not use the Developer Preview and may not accept the License Agreement if you are a person barred from receiving the Developer Preview under the laws of the United States or other countries including the country in which you are resident or from which you use the Developer Preview. - -2.4 If you are agreeing to be bound by this License Agreement on behalf of your employer or other entity, you represent and warrant that you have full legal authority to bind your employer or such entity to this License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the Developer Preview on behalf of your employer or other entity. - -3. Developer Preview License from Google - -3.1 Subject to the terms of this License Agreement, Google grants you a limited, worldwide, royalty-free, internal-use, non-assignable and non-exclusive license to use the Developer Preview solely to develop applications to run on the Android Wear platform for Android Wear devices. - -3.2 You agree that Google or third parties own all legal right, title and interest in and to the Developer Preview, including any Intellectual Property Rights that subsist in the Developer Preview. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you. - -3.3 You may not use the Developer Preview for any purpose not expressly permitted by this License Agreement. Except to the extent required by applicable third party licenses, you may not: (a) copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the Developer Preview or any part of the Developer Preview; or (b) load any part of the Developer Preview onto a mobile handset or wearable computing device or any other hardware device except an Android Wear device, combine any part of the Developer Preview with other software, or distribute any software or device incorporating a part of the Developer Preview. - -3.4 You agree that you will not take any actions that may cause or result in the fragmentation of Android Wear, including but not limited to distributing, participating in the creation of, or promoting in any way a software development kit derived from the Developer Preview. - -3.5 Use, reproduction and distribution of components of the Developer Preview licensed under an open source software license are governed solely by the terms of that open source software license and not this License Agreement. - -3.6 You agree that the form and nature of the Developer Preview that Google provides may change without prior notice to you and that future versions of the Developer Preview may be incompatible with applications developed on previous versions of the Developer Preview. You agree that Google may stop (permanently or temporarily) providing the Developer Preview (or any features within the Developer Preview) to you or to users generally at Google's sole discretion, without prior notice to you. - -3.7 Nothing in this License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features. - -3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the Developer Preview. - -3.9 Your use of any Android system files, packaged APIs, or other components of the Developer Preview which are part of the Android Software Development Kit is subject to the terms of the Android Software Development Kit License Agreement located at http://developer.android.com/sdk/terms.html. These terms are hereby incorporated by reference into this License Agreement. - -4. Use of the Developer Preview by You - -4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under this License Agreement in or to any software applications that you develop using the Developer Preview, including any intellectual property rights that subsist in those applications. - -4.2 You agree to use the Developer Preview and write applications only for purposes that are permitted by (a) this License Agreement, (b) the Google Play Developer Program Policies located at https://play.google.com/about/developer-content-policy.html, and hereby incorporated into this License Agreement by reference), and (c) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries). You agree to use reasonable efforts to comply with the Android Wear Platform Design Guide available on the Android Wear developer website - -4.3 You agree that if you use the Developer Preview to develop applications for general public users, you will protect the privacy and legal rights of those users. If the users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If the user provides your application with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, the user has given you permission to do so. - -4.4 You agree that you will not engage in any activity with the Developer Preview, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of any third party including, but not limited to, Google. - -4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android Wear and/or applications for Android Wear, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. - -4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under this License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach. - -4.7 Unless otherwise specified in writing by Google, Google does not intend use of Android Wear to create obligations under the Health Insurance Portability and Accountability Act, as amended, (“HIPAAâ€), and makes no representations that Android Wear satisfies HIPAA requirements. If you are (or become) a Covered Entity or Business Associate under HIPAA, you agree not to use Android Wear for any purpose or in any manner involving Protected Health Information unless you have received prior written consent to such use from Google. - -4.8 The Developer Preview is in development, and your testing and feedback are an important part of the development process. By using the Developer Preview, you acknowledge that implementation of some features are still under development and that you should not rely on the Developer Preview, Android Wear devices, Android Wear system software, or Android Wear services having the full functionality of a stable release. You agree not to publicly distribute or ship any application using this Developer Preview as this Developer Preview will no longer be supported after the official SDK is released. - -5. Your Developer Credentials - -5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials. - -6. Privacy and Information - -6.1 In order to continually innovate and improve the Developer Preview, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the Developer Preview are being used and how they are being used. Before any of this information is collected, the Developer Preview will notify you and seek your consent. If you withhold consent, the information will not be collected. - -6.2 The data collected is examined in the aggregate to improve the Developer Preview and is maintained in accordance with Google's Privacy Policy lcoated at http://www.google.com/policies/privacy/. - -7. Third Party Applications - -7.1 If you use the Developer Preview to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources. - -7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners. - -7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party. In that case, this License Agreement does not affect your legal relationship with these third parties. - -8. Using Google APIs - -8.1 Google APIs - -8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service. - -8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so. - -9. Terminating this License Agreement - -9.1 This License Agreement will continue to apply until terminated by either you or Google as set out below. - -9.2 If you want to terminate this License Agreement, you may do so by ceasing your use of the Developer Preview and any relevant developer credentials. - -9.3 Google may at any time, terminate this License Agreement with you if: -(A) you have breached any provision of this License Agreement; or -(B) Google is required to do so by law; or -(C) the partner with whom Google offered certain parts of Developer Preview (such as APIs) to you has terminated its relationship with Google or ceased to offer certain parts of the Developer Preview to you; or -(D) Google decides to no longer provide the Developer Preview or certain parts of the Developer Preview to users in the country in which you are resident or from which you use the service, or the provision of the Developer Preview or certain Developer Preview services to you by Google is, in Google's sole discretion, no longer commercially viable. - -9.4 When this License Agreement comes to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst this License Agreement has been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall continue to apply to such rights, obligations and liabilities indefinitely. - -10. DISCLAIMER OF WARRANTIES - -10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE DEVELOPER PREVIEW IS AT YOUR SOLE RISK AND THAT THE DEVELOPER PREVIEW IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. - -10.2 YOUR USE OF THE DEVELOPER PREVIEW AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE DEVELOPER PREVIEW IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. - -10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - -11. LIMITATION OF LIABILITY - -11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING. - -12. Indemnification - -12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys’ fees) arising out of or accruing from (a) your use of the Developer Preview, (b) any application you develop on the Developer Preview that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you with this License Agreement. - -13. Changes to the License Agreement - -13.1 Google may make changes to the License Agreement as it distributes new versions of the Developer Preview. When these changes are made, Google will make a new version of the License Agreement available on the website where the Developer Preview is made available. - -14. General Legal Terms - -14.1 This License Agreement constitutes the whole legal agreement between you and Google and governs your use of the Developer Preview (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the Developer Preview. - -14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in this License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google. - -14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of this License Agreement is invalid, then that provision will be removed from this License Agreement without affecting the rest of this License Agreement. The remaining provisions of this License Agreement will continue to be valid and enforceable. - -14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to this License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of this License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to this License Agreement. - -14.5 EXPORT RESTRICTIONS. THE DEVELOPER PREVIEW IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE DEVELOPER PREVIEW. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. - -14.6 The rights granted in this License Agreement may not be assigned or transferred by either you or Google without the prior written approval of the other party. Neither you nor Google shall be permitted to delegate their responsibilities or obligations under this License Agreement without the prior written approval of the other party. - -14.7 This License Agreement, and your relationship with Google under this License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from this License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. - - -</div></div> - - -<p class="caution"> - <strong>Important:</strong> Your email address is used to provide your Google account - access to the Android Wear Preview app Beta Preview on Google Play Store. As such, the - email address you provide below must be for the account you use to download apps on Google Play Store. - We may also use your email address to provide you with updates about the Android Wear - platform release. -</p> - -<iframe src="https://docs.google.com/forms/d/1iSJ084kEkV242cZisNMnj6G8qpi9r_zdEyfXA-hB1ao/viewform?embedded=true" width="100%" height="540" frameborder="0" marginheight="0" marginwidth="0" id="signupform">Loading...</iframe> - - - - -</body> -</html> diff --git a/docs/html/wear/preview/start.jd b/docs/html/wear/preview/start.jd deleted file mode 100644 index f8f0129..0000000 --- a/docs/html/wear/preview/start.jd +++ /dev/null @@ -1,254 +0,0 @@ -page.title=Get Started with the Developer Preview - -@jd:body - - -<div class="cols"> - - <div class="col-5"> -<p>The Android Wear Developer Preview includes tools and APIs that allow you to -enhance your app notifications -to provide an optimized user experience on Android wearables.</p> - -<p>With the Android Wear Developer Preview, you can:</p> - -<ul> - <li>Run the Android Wear platform in the Android emulator.</li> - <li>Connect your Android device to the emulator and view notifications from the -device as cards on Android Wear.</li> - <li>Try new APIs in the preview support library that enhance your app's notifications -with features such as voice replies and notification pages.</li> -</ul> - -<p>To get access to the Developer Preview tools, -click the sign up button on the right, then follow the setup instructions below.</p> - </div> - - <div class="col-7"> -<img src="/wear/images/laptop-bridge.png" width="400" height="222" alt="" /> - -<a href="/wear/preview/signup.html" class="button" style=" - width: 370px; - margin: 10px 0 20px; - font-weight: bold; - font-size: 16px; -">Sign Up for the Developer Preview</a> - -<p>Signing up provides you access to:</p> -<ul> -<li>New notification APIs in the preview support library.</li> -<li>Sample apps using the new notification APIs.</li> -<li>The <em>Android Wear Preview</em> app for your mobile device, which connects -your device to the Android Wear emulator.</li> -</ul> - - </div> -</div> - - -<p class="caution"><strong>Caution:</strong> -The current Android Wear Developer Preview is intended for <b>development and testing purposes only</b>, not for production apps. Google may change this Developer Preview significantly prior to the official release of the Android Wear SDK. You may not publicly distribute or ship any application using this Developer Preview, as this Developer Preview will no longer be supported after the official SDK is released (which will cause applications based only on the Developer Preview to break).</p> - - - - -<h2 id="Prereq">Prerequisites</h2> - -<p>Before you begin the setup, you must:</p> - -<ol> - <li><a href="{@docRoot}sdk/index.html"><b>Install the Android SDK</b></a>. - <p>The Android SDK includes all the developer tools required to build -apps for Android (optional IDEs are also available for download).</p></li> - <li><a href="{@docRoot}wear/preview/signup.html"><b>Sign up for the Android Wear Developer Preview</b></a>. - <p>You must sign up with a Gmail or other Google account in order to download the -preview support library and receive access to the -<em>Android Wear Preview</em> beta app on Google Play Store.</p></li> -</ol> - -<p class="note"><strong>Note:</strong> -If you're using the ADT plugin for Eclipse, you must update to version 22.6.1 or higher. -If you're using Android Studio, you must update to version 0.5.1 or higher</p> - - - -<h2 id="Install">1. Install the Android Wear System Image</h2> - - -<ol> - <li>Launch <a href="{@docRoot}tools/help/sdk-manager.html" - >Android SDK Manager</a>. - <ul> - <li>From Eclipse, select <b>Window > Android SDK Manager</b>.</li> - <li>From Android Studio, select <b>Tools > Android > SDK Manager</b>.</li> - </ul> - </li> - <li>Below Tools, verify that you have Android SDK Tools revision 22.6 or higher. - <p>If your version of Android SDK Tools is lower than 22.6, you must update:</p> - <ol> - <li>Select <strong>Android SDK Tools</strong>.</li> - <li>Click <strong>Install package</strong>.</li> - <li>Accept the license and click <strong>Install</strong>.</li> - <li>When the installation completes, restart Android SDK Manager.</li> - </ol> - </li> - - <li>Below Android 4.4.2, select <strong>Android Wear ARM EABI v7a System Image</strong>. -<p class="note"><strong>Note:</strong> Android Wear is designed to support multiple processor architectures. -</p></li> - <li>Below Extras, ensure that you have the latest version of the -<a href="{@docRoot}tools/support-library/index.html">Android Support Library</a>. - If an update is available, select <strong>Android Support Library</strong>. If you're using Android Studio, also select <strong>Android Support Repository</strong>.</li> - <li>Click <strong>Install packages</strong>.</li> - <li>Accept the license and click <strong>Install</strong>.</li> -</ol> - - - -<h2 id="SetupEmulator">2. Set Up the Android Wear Emulator</h2> - -<ol> -<li>Launch the <a href="{@docRoot}tools/help/avd-manager.html" - >Android Virtual Device Manager</a>. -<ul> -<li>From Eclipse, select <b>Window > Android Virtual Device Manager</b>.</li> -<li>From Android Studio, select <b>Tools > Android > AVD Manager</b>.</li> -</ul> -</li> -<li>Click <strong>New</strong>.</li> -<li>For the AVD Name, enter "AndroidWearSquare" or "AndroidWearRound", depending on whether -you want to create an emulator with a square or round display.</li> -<li>For the Device, select <strong>Android Wear Square</strong> or - <strong>Android Wear Round</strong>.</li> -<li>For the Target, select <strong>Android 4.4.2 - API Level 19</strong> (or higher).</li> -<li>For the CPU/ABI, select <strong>Android Wear ARM (armeabi-v7a)</strong>. -<p class="note"><strong>Note:</strong> Android Wear is designed to support multiple processor architectures. -</p></li> -<li>For the Skin, select <strong>AndroidWearSquare</strong> or -<strong>AndroidWearRound</strong>.</li> -<li>Leave all other options set to their defaults and click <strong>OK</strong>. - <p>Although real Android wearables do not provide a keyboard as an input method, - you should keep <strong>Hardware keyboard present</strong> selected so you can - provide text input on screens where users will instead provide voice input.</p> -</li> -<!-- -<li>Click <strong>Device Definitions</strong>.</li> -<li>Select <strong>Android WearSquare</strong> then click <strong>Create AVD</strong>.</li> -<li>Click <strong>OK</strong>.</li> ---> -<li>In the list of AVDs, select the one you just created and click - <strong>Start</strong>. In the following window, click <strong>Launch</strong>.</li> -</ol> - -<p>The Android Wear emulator now starts. To begin testing your app's notifications, -you must now pair the emulator to your development device -that has the <em>Android Wear Preview</em> app installed.</p> - -<p class="note"><strong>Tip:</strong> To improve the emulator startup time, edit your AVD -and enable <strong>Snapshot</strong> under Emulator Options. When you start the emulator, -select <strong>Save to snapshot</strong> then click <strong>Launch</strong>. Once the emulator -is running, close it to save a snapshot of the system. -Start the AVD again, but select <strong>Launch from snapshot</strong> and -deselect <strong>Save to snapshot</strong>.</p> - -<p class="caution"><strong>Caution:</strong> Do not install apps on the Android Wear emulator. -The system does not support traditional Android apps and the result of running such apps is -unpredictable.</p> - - - -<h2 id="SetupApp">3. Set Up the Android Wear Preview App</h2> - -<p>To view your app's notifications on the Android Wear emulator, you must have the -<em>Android Wear Preview</em> app installed on your Android device (a phone or tablet).</p> - -<p>To receive the Android Wear Preview app, you must <a -href="{@docRoot}wear/preview/signup.html">sign up for the Developer Preview</a> using the same -Gmail or Google account you use with Google Play Store.</p> -</p> - -<p class="note"><strong>Note:</strong> The <em>Android Wear Preview</em> app is compatible with - Android 4.3 and higher and is not available for the Android emulator.</p> - -<p>After you've signed up for the Developer Preview, - you'll receive a confirmation email that includes a link to opt-in to the - <em>Android Wear Preview</em> app beta program. Once you opt-in, it may take up to 24 hours for the - app to become available in Google Play Store.</p> - -<p>After you install the <em>Android Wear Preview</em> app, you can set up - your device to communicate with the Android Wear emulator:</p> - -<ol> -<li>Open the <em>Android Wear Preview</em> app. You should see a notice that the app is currently - not enabled as a notification listener. Tap the message to open the system settings, - then select Android Wear Preview to grant it notification access.</li> -<li>Connect your device to your development machine over USB. Be sure that no other - Android devices are connected to the machine.</li> -<li>Ensure that the Android Wear emulator (created in the previous section) is running. -The emulator should show the time and an icon that indicates no device is connected.</li> -<li>Open a command line terminal, navigate to your Android SDK's <code>platform-tools/</code> -directory, then execute: -<pre style="margin-top:.5em">adb -d forward tcp:5601 tcp:5601</pre> -<p class="note"><strong>Note:</strong> You must execute this command each time you connect your -device over USB.</p> -</li> -<li>Return to the Android Wear Preview app. It should now indicate that it is connected to - the emulator. The Android Wear emulator should now show the 'g' orb icon, indicating - that is is connected to your device. -</ol> - -<p>Now, notifications from your device also appear in the Android Wear emulator.</p> - - - - -<h2 id="AddLibrary">4. Add the Support Library to Your Project</h2> - -<p>The Android Wear preview support library includes several APIs that allow you to -optimize your app's notifications for the Android Wear user experience.</p> - -<p>To receive the preview support library, you must <a -href="{@docRoot}wear/preview/signup.html">sign up for the Developer Preview</a>. The -confirmation email you receive after you sign up includes a link to download a ZIP file, -which contains the preview support library and some sample apps.</p> - -<p>After you download and unzip the package, add the preview support library -sto your Android project:</p> - -<p><b>If you're using Eclipse:</b></p> - <ol> - <li>In your Android app project, create a <code>libs/</code> directory in your project root - (the same location as the <code>AndroidManifest.xml</code> file).</li> - <li>Copy the v4 support library JAR file from your Android SDK directory (e.g., - <code><sdk>/extras/android/support/v4/android-support-v4.jar</code>) into your - project <code>libs/</code> directory. - <li>Also save the <code>wearable-preview-support.jar</code> file in the <code>libs/</code> directory. - <li>Right click each JAR file and select <strong>Build Path > Add to Build Path</strong>.</li> - </ol> - - <p><b>If you're using Android Studio:</b></p> - <ol> - <li>In your Android app project, create a <code>libs/</code> directory in your project root - (the same location as the <code>AndroidManifest.xml</code> file).</li> - <li>Save the <code>wearable-preview-support.jar</code> file in the <code>libs/</code> directory. - <li>Open the <code>build.gradle</code> file in your app module.</li> - <li>Add a dependency rule for both the v4 support library and the Android Wear - preview support library: -<pre> -dependencies { - compile "com.android.support:support-v4:18.0.+" - compile files('../libs/wearable-preview-support.jar') -} -</pre> - </li> - <li>Click <strong>Sync Project with Gradle Files</strong> in the toolbar.</li> - </ol> - -<p>To start optimizing your notifications for Android Wear, - read <a href="{@docRoot}wear/notifications/creating.html" - >Creating Notifications for Android Wear</a>.</p> - - - -</body> -</html> diff --git a/docs/image_sources/brand/Google_Play_Store.ai b/docs/image_sources/brand/Google_Play_Store.ai deleted file mode 100644 index 51f07c6..0000000 --- a/docs/image_sources/brand/Google_Play_Store.ai +++ /dev/null @@ -1,1419 +0,0 @@ -%PDF-1.5
%âãÏÓ
-1 0 obj
<</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R]/Order 6 0 R/RBGroups[]>>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<</Length 44072/Subtype/XML/Type/Metadata>>stream
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> -<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00 "> - <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> - <rdf:Description rdf:about="" - xmlns:dc="http://purl.org/dc/elements/1.1/"> - <dc:format>application/pdf</dc:format> - <dc:title> - <rdf:Alt> - <rdf:li xml:lang="x-default">ggp_googleplay_apps1</rdf:li> - </rdf:Alt> - </dc:title> - </rdf:Description> - <rdf:Description rdf:about="" - xmlns:xmp="http://ns.adobe.com/xap/1.0/" - xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"> - <xmp:CreatorTool>Adobe Illustrator CS5</xmp:CreatorTool> - <xmp:CreateDate>2012-06-25T18:52:36-07:00</xmp:CreateDate> - <xmp:ModifyDate>2012-06-25T18:52:36-07:00</xmp:ModifyDate> - <xmp:MetadataDate>2012-06-25T18:52:36-07:00</xmp:MetadataDate> - <xmp:Thumbnails> - <rdf:Alt> - <rdf:li rdf:parseType="Resource"> - <xmpGImg:width>256</xmpGImg:width> - <xmpGImg:height>248</xmpGImg:height> - <xmpGImg:format>JPEG</xmpGImg:format> - <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA+AEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYqptOoNB8TeA3OKredy32YwB4sf6VxV3+meEf3n+mKurdjqEPyJ/iMVd60i/bjIH
iN/1YqvSVHFQcVX4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVO
WZYxvUnsBuTiqz0XloZSVX+QdfpIxVWREQURQo8BiqjcX9lbU+sXEcRPQOwUn5AnFUG/mXRENDc1
P+SkjD71U4qqR69o8gqLuNf9c+n/AMT44qjIpoZkDxOsiHoyEMPvGKtS20MhqRR/512OKqRaW3qX
q8f8w6j5jFVdHV1BU1BxVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqjP
cBKKu7t9le5xVbEvE83PKQ9T2HsMVQeoa7BasYo1a4uu0Mfb/Wb9nFUIIta1Chnka2hO/pQkp97D
4jiqtbeWNNiFfSBYmpJJqcVRg0iwAoIhiq19E09xvEMVQcnlizVvUtw0Mo6PGzK33gjFVpl1ywr/
AMfkKj7L7PQDs4H664qjrHVre8FF5RzD7UMg4uP6j3GKr3V4nEkJ+D9uL+K/0xVEQzxypyQgj2xV
UxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVSuJhFGW6mmwxVBo2/N/7w9fYeAxV
KrvV57u7bTtNajRtxurkCoQ90T/K8T2+fRVM9M0WC0Sv2nO7MepOKpmAAKDFXYq7FXYq7FXEAihx
VLNR0dJyskbGOZN0ddiDiqHs9Rk9U2t3RblSQrAUDgdx7+IxVEeqIJDKo+Bj+8Udv8r+uKpkjh1D
DoRXFW8VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqU3dzzuWAPwx7U9yMVY75r1+ey
torOyNdSv2EVsB1XkaF/xoPfCFZH5f0SDTNPhgUAug+Nz1ZjuWPuTgVNcVdirsVdirsVdirsVdiq
T+YdMe4spHtqJdx/HBIKVDqar+PXFUv0fWI9T02K6A4s44zR/wArrs6/fhVN9MuACYCSeI+GvhgV
McVdirsVdirsVdirsVdirsVdiriaDFUO1w+5UKVBoSSBv9OKtC6b/I/4Nf64q0btgein35r/AFxV
31x/5V/4NP64q764/wDKv/Bp/XFXfXH/AJV/4NP64qslvZAhoq1/10/5qxVJHnYuS1AxPxU33+Yw
qxqy0jWrvztDql5bUsIGb0SXjpxRT6e3Ku7fFir0Nbs0+yB/sl/rgVv657L/AMEv9cVd9c9l/wCC
X+uKu+ujwH/BL/XFV/rTf76P4f1xV3rTf76P4Yq71pv99H8MVd603++j+GKtC4k/30w+jFXNKzKQ
Y2ofbFWB6VZ6lpuuatBJbSpp88pntpSpEfJjUqD06N+GFU/spZfrkbRqXFCHpuadjgVPhO9P7tvu
xVr60f8Afb/8C2Ku+tH/AH2//AtirvrR/wB9v/wLYq4XJP8Aut/+BOKrvXP8jf8AAnFWxOD1Uj5g
jFVQYq7FXYqozXCr8Kgu56Ku5xViH5gMlh5O1K4uLiOKcOt1axM1GdouJaFRX4mdFZR2Fa++IV55
FqUE0SSxOGjkUOjDoVYVBySF/wBdTxxV311PHFXfXU8cVd9dTxxVSub5RCxB3ptirO57tba0kkrR
YYy3jQKtf4YFYDZXoMCknegwqiPrqeOKu+up44q766njirvrqeOKu+up44q766njirvrqeOKu+up
44q766njirvrqeOKqum6l6es2ZB2dyhH+uCv8cCsi8zTD9EvIT/dujfewX/jbFWLi9SnXCrf11PH
FXfXU8cVd9dTxxV311fHFV/6Uk/363/BHFXonlO7tZvKw+qTi5uUk5XMaHk6NzpRl6j4RgKQyi1n
SWJSprgVWxVD3EtJo4uXH1DSo69CcVSDzNeecLdGtvLWkCZ2HxahNLCFBI/ZjZwzEeLbexwhXlet
fl7+aGryTXN9avdXUisA8lxbmla0VR6lFFT0G2SsISzyn+V35qWejx2d/pqxvbkpETc27Vj6r9l2
6dMiqc/8q3/ML/lhT/kfF/zVjau/5Vv+YX/LCn/I+L/mrG1d/wAq3/ML/lhT/kfF/wA1Y2rv+Vb/
AJhf8sKf8j4v+asbVSufy98+xR+pLZosakF29eI0A67BsbVk+omWfT7qGIVllikSMVpVmUgbn3xV
i1n+XX5gNAhWxShAp+/i/wCasbVX/wCVb/mF/wAsKf8AI+L/AJqxtXf8q3/ML/lhT/kfF/zVjau/
5Vv+YX/LCn/I+L/mrG1d/wAq3/ML/lhT/kfF/wA1Y2rv+Vb/AJhf8sKf8j4v+asbV3/Kt/zC/wCW
FP8AkfF/zVjau/5Vv+YX/LCn/I+L/mrG1d/yrf8AML/lhT/kfF/zVjau/wCVb/mF/wAsKf8AI+L/
AJqxtXf8q3/ML/lhT/kfF/zVjarV8i+eLG9tLu6tES3gmjkmcTRNRFYFtg1emNqnuu2t7qWlTWVk
oe6l4ekpIUEq6t1NB0GKpGn5cfmCVBFin/I+L/mrG1b/AOVb/mF/ywp/yPi/5qxtXf8AKt/zC/5Y
U/5Hxf8ANWNq7/lW/wCYX/LCn/I+L/mrG1d/yrf8wv8AlhT/AJHxf81Y2rv+Vb/mF/ywp/yPi/5q
xtVll+X35mafei8sbVre5UkiWO4gHU1of3m4PgclYV6b5Zn86TD0df0xbSdRUahDJCyOR/vyJXYg
nxX7hkSlklvOWZo2I5oaNTAqHvjxu7Vq0+MD79sVR+KuxV2KuxV2KuxV2KoLWRXT5h/kN+rFXmUM
9ZkFerAfjhQ9Q03/AHkj/wBUfqwJRWKuxV2KuxV2KuxV2KuxV2KuxVJ/M7BdMmJ7I36sVYPos3PV
Lda9W/UDhQ9Oi/u1+WBK7FXYq7FXYq7FXYq7FUt08lr+7JNf3hH3bYqv1ID1Lc+Esf8AxIYqj8Vd
irsVdirsVdirsVSnzVqtlpHl6/1O9JFrZwvLLShJCj7Kg03Y7D3xV49LrAt7J7+ICT0ozPGpNA3F
eYFR45JD1/ylq1vq/l6x1K3BWK5iDBT1Uj4WU/6rAjIpTjFXYq7FXYq7FXYq7FXYq7FXYqwL80/N
Y0iPT9OijEt1qkvpnkaKkIKh3+fxfCP9rCFYHf8AmlvLtq2sLALk2hVvQJ48gzBGoe1FYnCh7dpF
/b6jpVnqFsSba8gjuICRQlJUDrUfI5FKLxV2KuxV2KuxV2KuxVK9JWlxdnxmkP8Aw5xVW1OgWNia
UdTX5HFUdirsVdirsVdirsVdiqV+aNAtvMPl7UNFuWKRX8LQmQCpRiPhcCorxajUxV4Bd/lJ+baP
Hotnbxvp6cYhqL3MYg4ig5emW9biPDgflhtXvXk3y4vlvyzp+iiY3DWkdJJ225yOxeRgOwLsaDww
KnOKuxV2KuxV2KuxV2KuxV2KuxVgf5qeQbnzNbWt1YMBf2XIBDQc0eh2JI3Uj9eNq8uH5V/mDrMg
sLiN4rcnhJdXDERorfCzBW4s5Ck0oPpGG1fQek6bb6XpVlpltU29jBFbQlt24QoEWvvRcCorFXYq
7FXYq7FXYq7FUt0kHlOx7yOfvY4qqavtbFuvHenyxVHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUt0WphZq1qSa+NTiqrqwraP8sVRo6DFXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqlugj/Qk
+WKojUh/oz/LFVeEgwxkbgqKH6MVX4q7FXYq7FXYq7FXYq7FXhf5n/mT5ms/Oc2nadcva2OncEMU
Z4mVmQO7Mw+L9qg3ptXN1pNHCWKzzLzvaOsyeIYxJiB3Mh8o/mtPNbob8fW4Ds0q0WZD4MNlb8Pn
mvz6cwlRYabtecNsnqHf1ekabqun6lB61lOsqftAbMvsyncfTmMQ7/DnhkFxNovA3OxV2KuxV2Ku
xV2KuxV2KuxV2KuxV2KuxV2KuxV2KtOQEYnoATiqB0ZaWafLFVe+Fbdvliq6yINnAQagxoQf9iMV
VsVdirsVdirsVdirsVdir5m/NOOvn/WD/wAWJ/yaTOj0R/dReS7QP7+X46JFpl7cWFwJoTUHaSM9
GHgcszYo5I0XCt6Joeql1S90+ZopBseJoynurZzufHLHKi2YpGJuJos/0Xz4Txh1VN+n1mMfiyD/
AI1+7KOJ3mm7U6ZPmy+3uYLmJZoJFlibo6moyTuITEhYNhUxZOxV2KuxV2KuxV2KuxV2KuxV2Kux
V2KuxV2KqdywS3lY9FRiaewxVDaSCLRPliqteisDfLFVumf8c21/4wx/8RGKonFXYq7FXYq7FXYq
7FXYq+cPzNjr581Y/wDFif8AJpM6DRn90HkO0T+/l+OjGhFmRbg2jtLvbjT7kTQnY7SRnow8DlGf
DHJGimM6egabdW1/bLPAag7Mp6qfA5zOfFLHKpOXCpCwm2n3l7YS+paytGf2gN1b5jocpGSnIxZJ
YzcTTMNL83W89I71fQl/34N4z/FctjmB5u4wa8S2lsfsT9WVlDKQyncEbgjLnYg23irsVdirsVdi
rsVdirsVdirsVdirsVdiqhqDqlhcu32Vicn5BTiqnpv+8yfLFVa6/uW+WKrNN/459t/xiT/iIxVE
Yq7FXYq7FXYq7FXYq7FXz1+ZEdfO+qn/AIsT/k0mb3Sn92Hje0j+/l+OjHBFl9uDa8Q4LRaP0u9u
dPuRNCag7SRnow8DmPqMEcsaLOGQxNh6Dpt3bX9ss8BqDs6nqp8DnLajFLFLhk7XFITFhGrDmOZN
vCmGn6hfWJHovWPvE26n6O30ZKGcx5ORhyyhyZNYa7a3VFk/cy/ysdj8jmZj1MZeRdni1UZc9imW
ZDkuxV2KuxV2KuxV2KuxV2KuxV2KuxVC6tvpd4P+KJP+IHFXacKWyfLFVW6/uW+WKqWl1/R1vX/f
a/qxVFYq7FXYq7FXYq7FXYq7FXgn5hx1856mf8tP+Ta5utMf3YeL7TP+ES/HRj4hy63AteIcFrao
sOC0WjtLvbnT7kTQnY7SRnow8DmPqcEcseGTZizGBsPQ9Nu7a/tlngNR0ZT1U+BzktThlilwyd9h
yRyRsI0Q5jGTfwrxDkTJPCmFlqN1bUWvqRD9hu3yPbL8WslDzDk48so+5N7bV7CeYQCVVuaV9BiA
1PbxzZ4dTDJy5uzhCUocYB4e9GZkMXYq7FXYq7FXYq7FXYq7FXYqhdV/45l3/wAYX/4icVXWP+86
/LFVSf8Au2+WKqWmEGwgp/KB92KonFXYq7FXYq7FXYq7FXYq8O8+x1836kf8tP8Ak2ubfTn0B4nt
Q/4RL8dEiEOW24FqghwWi14hwWi14hwWi0fpd7c6fciaE7HaSM9GHgcxtTp45o8Mv7G7BqJYpWHo
Wm3dtf2yzwHboyHqp8DnH6nBLDLhk9Pp80cseKKNEOYpk5HCl2s6rHYp6UdGumGw7KPE4Ru7nsvs
o5zxS2xj7fIMV/ePIZWYmQnkXrvXxwmT2gEYx4QKAZPo/m6/tgsV3W6hG3I/3g+nv9OZeHtGUdpb
j7XU6rsyE94ek/YzCw1Oyvo+dtIGP7SHZh8xm3w6iGQXEuhzaeeM1IIrLml2KuxV2KuxV2KuxV2K
oTVyRpd1T/fTD7xTFVSy/uF+WKqk/wDdn5Yqh9I/450PyP8AxI4qi8VdirsVdirsVdirsVdirxjz
vHXzXqB/y1/5Nrm0wH0B4ftQ/wCET/HRJRDlluvtUEOC0WvEOC0WqCHBa2vEOC0Wj9LvbnT7kTQn
Y7SRnow8DmLqtPHNHhl/Y36bVSwy4osqufM9qbQG0Ia5cbxnrGf8ofqzkM+mlimYyfRexdH+ciMn
LH9/l+1jpDyO0khLOxqzHqTlJk9vECIobAKqRZAyYGSukWVmTWZImD1InDxsUdejKaEfdkRkMTYN
FqnRFFlmg6zcXLm3uaM4WqSAUrTsaZvOztfLJLglz73SazSxgOKPJO83DrnYq7FXYq7FXYq7FUJq
wrptyP8Ais4qq2gpCvyxVfP/AHZ+WKofSP8AjnQ/I/8AEjiqLxV2KuxV2KuxV2KuxV2KvI/OUdfM
98f8tf8AiC5sMJ9IeF7VP+Ez/HRKFhyy3XWvWHBaLVBDgtbVFhwWi16w4LRaT+Yteh0yP0YqPeuP
hXqEB/ab+AzHzZuEbc3r/Zf2Xnr5+JkuOnif9N5D9J+A35RDTdbvrK+N4rmR3P79WOzj3/hmj1EO
Pm+2x0mMYxjiOGMRQro9O0fULTU7Rbm2ao6Oh+0jfysM0uSJiaLqM8JYzRTNIspMnGMldIsrMmsy
Rtnp1zctxhQtTq3QD5nJ4cE8pqItx8ueMBuWTaVo8dlWRm5zEUqOgHtnR6Hs8YfUTcnUajVHJsOS
Y5snEdirsVdirsVdirsVQessV0y4I/lp95AxVXtf7lfliq6f+7PyxVD6R/xzofkf+JHFUXirsVdi
rsVdirsVdirsVeW+bIq+Yr0/5S/8QXM3EfSHg+1j/hM/x0CWLDk7dba9YcFraosOC0WvWHI2i0j8
z+Y4dJi9CGkl+4+FeoQH9pv4DISlT13sx7Mz18/EyenBH/ZeQ/Sflvy51LNLNK0srF5HPJ3bcknM
LI+3YMUMcBCA4Yx2ADhmHNyoploms3ek3i3Fuag7SxH7Lr4H+BzAzYxIUVzYI5Y0XsHl69g1y2Se
wBkJ2eL9pG7hvDNV4EzLhAsvK6uBwGp7MusPLaLR7s8j/vpen0n+mbfTdjjnkPwdJm15O0U6jjjj
QJGoRR0UCgzdwgIigKDr5SJNldkkOxV2KuxV2KuxV2KuxVBa3/xy7j5D/iQxVEWv9yvyxVdP/dn5
Yqh9I/450PyP/EjiqLxV2KuxV2KuxV2KuxV2KvOPM0Vdeuz/AJS/8QGZUDs8D2uf8Jn+OgS4Q4bd
ZaosOC1tesOC0Wx/zZ5og0eL6vARJqMg+FOojB/ab+AyURb1nsz7NS10/EyenBH/AGXkP0n9PLmU
s808zzTOZJZDyd2NSSchMPteDFHHAQgOGMdgA0MxJuVFXtre4uZ0gt42mnkPGOKNSzMT2AG5zEmG
0zERZNAPTvKX5KX91wuvMEhs4DQizjIMzD/LbdU/E/LGOlv6nn9b7Rxh6cI4j3nl+165o+h6To1o
LTTLVLaEUqEHxMRtV2PxMfcnMuGOMRQDyeo1WTNLiyEyKOybjuxV2KuxV2KuxV2KuxV2KuxVBa3/
AMcu4+Q/4kMVRFr/AHK/LFV0/wDdn5Yqh9I/450PyP8AxI4qi8VdirsVdirsVdirsVdirA/MEVdZ
uj/lD/iIy6J2fPu2D/hM/f8AoCBEOG3W2vEYGC0Wxvzh5ut9FhNvb0k1KQfAnURg/tv/AAGXYsRl
ueT1fs17Ny10/EybYB/svIfpP6eXKZp5riZ553MkshLO7GpJPfMiQp9owYo44iEBwxGwAaUEmg3J
6DMSbkxeheUfye8waxwudSrpdgd/3i/v3H+TGacfm33HMWQt1mr7bxYtoeuX2fN7L5a8m+X/AC5B
6emWwWUikl0/xTP/AKz/AMBQYiIDy2r1+XOfWdu7oneFw3Yq7FXYq7FXYq7FXYq7FXYq7FXYqgtb
/wCOXcfIf8SGKoi1/uV+WKrp/wC7PyxVD6SCNOhrtsf1nFUXirsVdirsVdirsVdirsVYVrv/AB1r
j5j/AIiMsjyfPe2P8an7/wBAQGF1jGPOPnKHRYTbWxEmpyD4E6iMH9t/4DMvT6Yz3P0vVezns5LW
y48m2Af7LyH6T+nlyaa4muJ3nncyTSEs7sakk9zmfKIAoPseDFHHERiKiOQZb5R/LLzN5j4TRxfU
9Obc3s4IUj/itftP9G3vmDmygNOp7Sx4djvLuD2zyl+Wnlry2Elhi+t6gvW+nAZwf+K1+yn0b++Y
MpkvO6vtLLm2JqPcGV5B17sVdirsVdirsVdirsVdirsVdirsVdirsVQWt/8AHLuPkP8AiQxVEWv9
yvyxVufaJvliqlpu9hB/qDFUTirsVdirsVdirsVdirsVYVrv/HWuPmP+IjLI8nz3tj/Gp+/9AYR5
z85waJCba2Ik1OQfAnURg/tv/AZn6TRnIbP0u19nvZ6Wtlxz2wj/AGXkP0n9PKBeXvJ/mrzbevJZ
wPMHetxfzErEpPUs56n2Wp9s2WfNDEKPyfVzlw6aAiKiANgHtPk/8m/Lui8LnUQNU1BaHlKv7hD/
AJEff5tX6M0ubVyny2DqNT2nkntH0x+16AAAKDYDoMxHWOxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku
xV2KuxVBa0CdLuAP5QfuIOKoi1/uV+WKuuv7lvliqzTRTT7b/jGn6sVRGKuxV2KuxV2KuxV2KuxV
ifnDQtdnSWfQlie8motJ24KhpTn0NaDtmRpzDi9f0uly9iY82q8SZ/dn6h1NfrYz5X/JCziuDqPm
m5/Sl87c2t0LCDkd6uxo8n4D2OZ2o7TJHDjHDF6qWu4YiGIcERsHp1vb29tCkFvEkMEY4xxRqERR
4BRQDNUSSbLgEkmyqYEOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoXVf+Obc/8Yziqra/
3K/LFWrs0gb5Yqt03fTrU+MMf/ERiqIxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku
xV2KuxV2KuxV2KuxV2KuxV2KoXVhXTLr/jE5+4VxVfZf3C/LFWr80t3+WKqlspW2iU9Qig/QMVVM
VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqF1X/jmX
ftDIf+FOKrrA1t0+WKtagpa3YDqRiqiutacqgczsKfZb+mNK79N6d/vw/wDAn+mGld+m9O/34f8A
gT/TGld+m9O/34f+BP8ATGld+m9O/wB+H/gT/TGld+m9O/34f+BP9MaV36b07/fh/wCBP9MaV36b
07/fh/4E/wBMaV36b07/AH4f+BP9MaV36b07/fh/4E/0xpXfpvTv9+H/AIE/0xpXfpvTv9+H/gT/
AExpXHXNPH7ZP+xONKt/T1h4v/wONK79PWHi/wDwONK79PWHi/8AwONK79PWHi//AAONK79PWHi/
/A40rv09YeL/APA40rv09YeL/wDA40rv09YeL/8AA40rv09YeL/8DjSu/T1h4v8A8DjSu/T1h4v/
AMDjSu/T1h4v/wADjSu/T1h4v/wONK79PWHi/wDwONK79PWHi/8AwONK79PWHi//AAONKp3WsWE1
tLD8R9RGShX+YUxpUZYIVt1B60wKiGUEUOKoc6bZk1MSf8CMVa/Rll/vlP8AgRirv0ZZf75T/gRi
rv0ZZf75T/gRirv0ZZf75T/gRirv0ZZf75T/AIEYq79GWX++U/4EYq79GWX++U/4EYq79GWX++U/
4EYq79GWX++U/wCBGKu/Rll/vlP+BGKu/Rll/vlP+BGKu/Rll/vlP+BGKu/Rll/vlP8AgRirv0ZZ
f75T/gRirv0ZZf75T/gRirv0ZZf75T/gRirv0ZZf75T/AIEYq79GWX++U/4EYq79GWX++U/4EYq7
9GWX++U/4EYq79GWX++U/wCBGKu/Rll/vlP+BGKu/Rll/vlP+BGKu/Rll/vlP+BGKu/Rll/vlP8A
gRirv0ZZf75T/gRirv0ZZf75T/gRirv0ZZf75T/gRira6dZqaiJK/IYqiQABQYq//9k=</xmpGImg:image> - </rdf:li> - </rdf:Alt> - </xmp:Thumbnails> - </rdf:Description> - <rdf:Description rdf:about="" - xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" - xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" - xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"> - <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass> - <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID> - <xmpMM:DocumentID>xmp.did:F87F1174072068118A6DF333610584B2</xmpMM:DocumentID> - <xmpMM:InstanceID>uuid:15a3ab41-6703-e944-a5ec-63770d002408</xmpMM:InstanceID> - <xmpMM:DerivedFrom rdf:parseType="Resource"> - <stRef:instanceID>uuid:52d3fbd8-d8d7-2543-8e0c-81d9ea137ecb</stRef:instanceID> - <stRef:documentID>xmp.did:8CF5709C0E20681188C6A12CE4B46A4D</stRef:documentID> - <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID> - <stRef:renditionClass>proof:pdf</stRef:renditionClass> - </xmpMM:DerivedFrom> - <xmpMM:History> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <stEvt:action>saved</stEvt:action> - <stEvt:instanceID>xmp.iid:F87F1174072068118A6DF333610584B2</stEvt:instanceID> - <stEvt:when>2012-06-25T18:52:34-07:00</stEvt:when> - <stEvt:softwareAgent>Adobe Illustrator CS5</stEvt:softwareAgent> - <stEvt:changed>/</stEvt:changed> - </rdf:li> - </rdf:Seq> - </xmpMM:History> - </rdf:Description> - <rdf:Description rdf:about="" - xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"> - <illustrator:StartupProfile>Web</illustrator:StartupProfile> - <illustrator:Type>Document</illustrator:Type> - </rdf:Description> - <rdf:Description rdf:about="" - xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" - xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" - xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"> - <xmpTPg:NPages>1</xmpTPg:NPages> - <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency> - <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint> - <xmpTPg:MaxPageSize rdf:parseType="Resource"> - <stDim:w>11.111111</stDim:w> - <stDim:h>8.333333</stDim:h> - <stDim:unit>Inches</stDim:unit> - </xmpTPg:MaxPageSize> - <xmpTPg:PlateNames> - <rdf:Seq> - <rdf:li>Cyan</rdf:li> - <rdf:li>Magenta</rdf:li> - <rdf:li>Yellow</rdf:li> - <rdf:li>Black</rdf:li> - </rdf:Seq> - </xmpTPg:PlateNames> - <xmpTPg:SwatchGroups> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <xmpG:groupName>Default Swatch Group</xmpG:groupName> - <xmpG:groupType>0</xmpG:groupType> - <xmpG:Colorants> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>White</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>255</xmpG:green> - <xmpG:blue>255</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>Black</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>RGB Red</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>RGB Yellow</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>255</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>RGB Green</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>255</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>RGB Cyan</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>255</xmpG:green> - <xmpG:blue>255</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>RGB Blue</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>255</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>RGB Magenta</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>255</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>193</xmpG:red> - <xmpG:green>39</xmpG:green> - <xmpG:blue>45</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>237</xmpG:red> - <xmpG:green>28</xmpG:green> - <xmpG:blue>36</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>241</xmpG:red> - <xmpG:green>90</xmpG:green> - <xmpG:blue>36</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>247</xmpG:red> - <xmpG:green>147</xmpG:green> - <xmpG:blue>30</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>251</xmpG:red> - <xmpG:green>176</xmpG:green> - <xmpG:blue>59</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>252</xmpG:red> - <xmpG:green>238</xmpG:green> - <xmpG:blue>33</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>217</xmpG:red> - <xmpG:green>224</xmpG:green> - <xmpG:blue>33</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>140</xmpG:red> - <xmpG:green>198</xmpG:green> - <xmpG:blue>63</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>57</xmpG:red> - <xmpG:green>181</xmpG:green> - <xmpG:blue>74</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>146</xmpG:green> - <xmpG:blue>69</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>104</xmpG:green> - <xmpG:blue>55</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>34</xmpG:red> - <xmpG:green>181</xmpG:green> - <xmpG:blue>115</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>169</xmpG:green> - <xmpG:blue>157</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>41</xmpG:red> - <xmpG:green>171</xmpG:green> - <xmpG:blue>226</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>113</xmpG:green> - <xmpG:blue>188</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>46</xmpG:red> - <xmpG:green>49</xmpG:green> - <xmpG:blue>146</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>27</xmpG:red> - <xmpG:green>20</xmpG:green> - <xmpG:blue>100</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>102</xmpG:red> - <xmpG:green>45</xmpG:green> - <xmpG:blue>145</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>147</xmpG:red> - <xmpG:green>39</xmpG:green> - <xmpG:blue>143</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>158</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>93</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>212</xmpG:red> - <xmpG:green>20</xmpG:green> - <xmpG:blue>90</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>237</xmpG:red> - <xmpG:green>30</xmpG:green> - <xmpG:blue>121</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>199</xmpG:red> - <xmpG:green>178</xmpG:green> - <xmpG:blue>153</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>153</xmpG:red> - <xmpG:green>134</xmpG:green> - <xmpG:blue>117</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>115</xmpG:red> - <xmpG:green>99</xmpG:green> - <xmpG:blue>87</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>83</xmpG:red> - <xmpG:green>71</xmpG:green> - <xmpG:blue>65</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>198</xmpG:red> - <xmpG:green>156</xmpG:green> - <xmpG:blue>109</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>166</xmpG:red> - <xmpG:green>124</xmpG:green> - <xmpG:blue>82</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>140</xmpG:red> - <xmpG:green>98</xmpG:green> - <xmpG:blue>57</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>117</xmpG:red> - <xmpG:green>76</xmpG:green> - <xmpG:blue>36</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>96</xmpG:red> - <xmpG:green>56</xmpG:green> - <xmpG:blue>19</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>66</xmpG:red> - <xmpG:green>33</xmpG:green> - <xmpG:blue>11</xmpG:blue> - </rdf:li> - </rdf:Seq> - </xmpG:Colorants> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:groupName>Grays</xmpG:groupName> - <xmpG:groupType>1</xmpG:groupType> - <xmpG:Colorants> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>26</xmpG:red> - <xmpG:green>26</xmpG:green> - <xmpG:blue>26</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>51</xmpG:red> - <xmpG:green>51</xmpG:green> - <xmpG:blue>51</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>77</xmpG:red> - <xmpG:green>77</xmpG:green> - <xmpG:blue>77</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>102</xmpG:red> - <xmpG:green>102</xmpG:green> - <xmpG:blue>102</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>128</xmpG:red> - <xmpG:green>128</xmpG:green> - <xmpG:blue>128</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>153</xmpG:red> - <xmpG:green>153</xmpG:green> - <xmpG:blue>153</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>179</xmpG:red> - <xmpG:green>179</xmpG:green> - <xmpG:blue>179</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>204</xmpG:red> - <xmpG:green>204</xmpG:green> - <xmpG:blue>204</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>230</xmpG:red> - <xmpG:green>230</xmpG:green> - <xmpG:blue>230</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>242</xmpG:red> - <xmpG:green>242</xmpG:green> - <xmpG:blue>242</xmpG:blue> - </rdf:li> - </rdf:Seq> - </xmpG:Colorants> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:groupName>Web Color Group</xmpG:groupName> - <xmpG:groupType>1</xmpG:groupType> - <xmpG:Colorants> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>63</xmpG:red> - <xmpG:green>169</xmpG:green> - <xmpG:blue>245</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>122</xmpG:red> - <xmpG:green>201</xmpG:green> - <xmpG:blue>67</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>147</xmpG:green> - <xmpG:blue>30</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>29</xmpG:green> - <xmpG:blue>37</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>123</xmpG:green> - <xmpG:blue>172</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>189</xmpG:red> - <xmpG:green>204</xmpG:green> - <xmpG:blue>212</xmpG:blue> - </rdf:li> - </rdf:Seq> - </xmpG:Colorants> - </rdf:li> - </rdf:Seq> - </xmpTPg:SwatchGroups> - </rdf:Description> - <rdf:Description rdf:about="" - xmlns:pdf="http://ns.adobe.com/pdf/1.3/"> - <pdf:Producer>Adobe PDF library 9.90</pdf:Producer> - </rdf:Description> - </rdf:RDF> -</x:xmpmeta> - - - - - - - - - - - - - - - - - - - - - -<?xpacket end="w"?>
endstream
endobj
3 0 obj
<</Count 1/Kids[7 0 R]/Type/Pages>>
endobj
7 0 obj
<</ArtBox[94.0 7.0 707.0 595.0]/BleedBox[0.0 0.0 800.0 600.0]/Contents 8 0 R/Group 9 0 R/LastModified(D:20120625185236-07'00')/MediaBox[0.0 0.0 800.0 600.0]/Parent 3 0 R/PieceInfo<</Illustrator 10 0 R>>/Resources<</ColorSpace<</CS0 11 0 R/CS1 11 0 R>>/ExtGState<</GS0 12 0 R/GS1 13 0 R>>/Properties<</MC0 5 0 R>>/Shading<</Sh0 14 0 R/Sh1 15 0 R/Sh2 16 0 R/Sh3 17 0 R/Sh4 18 0 R/Sh5 19 0 R>>/XObject<</Fm0 20 0 R/Fm1 21 0 R/Fm2 22 0 R>>>>/Thumb 23 0 R/TrimBox[0.0 0.0 800.0 600.0]/Type/Page>>
endobj
8 0 obj
<</Filter/FlateDecode/Length 2230>>stream
-H‰Œ—ËŽ$·E÷ùübóýت%{%‚Ö¾`kÝ䘿÷¹Á¬ª¬ì1`
TI2^7n_þñê^~~
î‡_Ýö×\Á
þ¿èá?ÿÚþéþ@þò÷_ƒûýëöò·÷à~üsûe{yErýê¢ýs_¯hQÔ¢¿þE—Cð¹ÍæjŒ>õ<Ýõ}Ó§÷d?suuøÐ‡‹!ûžx
>–è¾m±7?ÚpZ†K!ú̺ßSäuøÙº»¤á+ë¯Û%JCÒYQÝÛv™|*±šAß¶<ÞŸÒÄŽÜ’uºKAagŸ!³1q@ŒHRj,6eÚ;ƶÈÑãºK)øž±fbrBKBgÕÅæËĹ^8ººR}Â’-fŒ¬ÝuÅ »9|guÇÅ&ßk—:Ðãd3©ŠC艽M8+Vb¶lëX[}åÄK~X{–}ɶQ‰u UÈ_$š‘ÃñiŽd¢^}žQçuŸIÀ%ކ¶ê;™øØ2OuÌ%J¶/c´íª™à»s´?¶ƒœàk›N¿Q¿£,ô<PSIv)=»Ò'V¹;j.żLšsô8\$EŠMá¼Lè -‡°§½1|‰Ã#«i&7ˆBX®6Ü(Óñ'6 RHžC„¼ªÈñ:xRaGeðm˜‚ˆï3DíÆl“”Mº -ÙB6›oÉ$àŒæ&‡
3‹ÈÒ7„AKSΆ¥Þ쬷ú (`0H‚ -xübA=”á#1S&h)C@ß㈇Aµ¸KSù ·ÏüÈÓˆ(¨¹,ØZ‡ -n9-”2¿Puú ê)¶xsò -£?!^êÛâŠjÔ~‰œ›E—´Š¡ò§
ν?gK¡l½fy×âOº -‡~ö¼gG$üûqfŽkfþn“®Št¥=Ñ*e÷x`ÔTµ‡}VÁæú…&zˆ[^hnÙÆŸ½©«ÙEãa\4vk›²ï[—–uǪd.HóÖÀâx3¯&Æ5,Än&õu>k*ņœlD`ÒeòÒrŠ•k:%³2¦Ö¨±ú`aL!$…”U©²‰9pn™Ì?D*5ØÄäq*Mg AkºZà-˜®t_ Á6kX¼™ Ïb”¸A$fá4›½§ªÁç,aSAß%…9=¼
Í -5'ÉÛCRëºÔ®04Vö3R*xg‰ö°–Ú)3ýÙ«ï׫¢Î³€æ\ŠÁb¶é¤Î„!«.QLy–¼mE¬LÑ+‘Âaò -ü w”!“‰Ž‰øøüXÁýÍ@˜áW’¸~y}M¯ñizMªlZ].‰¥SMA7\ìOêøC9g¤ç á–©Û!î$̲¹»ÝI¢ÎUsÍÕ4‡l-SçvLÉAäþzÝNJmjLwIšƒH{×Dr¶ôS”4òGÆ""pæLô¤ãó¾$§•kî~êE‰F`‡ò#Lé)Lç ¼[Pºú¦¨Ö†3KI2Û´U`°t‚ž“Õ3л½3”TÝ}‡£Ó³d>ü#øç›L¤ùýYÏÓJ3öó˾NÇû¬17³ÉåªY§µp¼âäg¬ÜeŠ¿AHïKB’ÈQ1ŒßxÈJ@Á]²¹AUK]aLƒšHÂu{~[Ñ•Š®]q´‚‡[®% vb7ĉî&ezvvg?¢,ƒˆöaó6üK¡Ì§çÃA¡74ê‚3áì§"*ŸŠèáÏ»5…Ao£átæªM|ÝŠ‡ØtÃñI°r®§¶>G茆\”ÖÐ!–K&X´}›iχ%¤0',
©ø'5âðð°Þ=üéçW‡›ÿ` -8;ZDo4a*;['SVmH.]]4a"c]In"BYY'W"&B_"uWn*W!HPAUd-Pr8ni5hFd_XX^-P.R -&jM#',fKGKkB"k;2tq_V8B2M*h\6%E")-<!M)_-rr*1"Ug]//^]90Oi[Bd/VUbRB- -kPc+S\miA\f!2(u"LGOK\7-EaB+8@7X!a6jUE[3%(q-t')8TL6e+2%q!@c6+EkL7J -1aue$:Y^CSLH,@FO;tW5\''fd_gi#)T\/_-9eLp6Q7Fb[ceoiOf.idg!T3.g-VVmK -lh$@qW9;?/bBH*/\sA,b7m6.oK_LFEgMlW7RW\#WYk@#r%QHLU'7(s`LI2KKI224N -@`5rI0fh7e%tn-+T?s\=#aj/H*E)()T)@[QK/Bs>(7sckFH#-[JAh%Bj[KD*9HkVh -m20mdQ>)a?*j"-Y<)5J)dorid(bpY(7W=`[?Xf,8e$'D=$fP/KrIgG+;tZ:s#Y -;4rG`a_o%mh(n<6Z;%&aiW@]$;,R+o$;dCQ,12l'$)kp6>e/XVm2bKd@9YqKQ=]Ll -nln\7@.5\;#ioFIp9K5*b-Ig(hX=;(W!R5=4Ad*?LBdiTW[O/J"[\O:8I)PmN-bIg -<abCFRXqOf6dC,j8iPWd\-Xi/%u3NqNMu,9&GUgIVk;H:VP_]S+Y&@\'pOkHJt%9o -3n3&fC4;D^$M*gZ\d&I2Zn[[-K7^G:k4lC4QiIVj#k0XkdMrQ.LXl`NVYCFL!nNh` -`!R&TH'YAh^%MTgONPERL].G3LSWRW=dWjT,RK_**!B\PE=D,/s*Uo`YmnGZLN;i[ -iLlp,3$q9@N[W\;gBeOHG`KXS8d<]nMC))Cc[*A+f4rU_V9TWHr\*q[!2KK+LB~>
endstream
endobj
25 0 obj
[/Indexed/DeviceRGB 255 26 0 R]
endobj
26 0 obj
<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
-8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1 -VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH< -PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
20 0 obj
<</BBox[94.0 595.0 707.0 7.0]/Group 27 0 R/Length 40/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 28 0 R>>/ExtGState<</GS0 29 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 30 0 R>>>>/Subtype/Form>>stream
-q -/GS0 gs -613 0 0 588 94 7 cm -/Im0 Do -Q -
endstream
endobj
21 0 obj
<</BBox[495.0 491.0 545.0 389.0]/Group 31 0 R/Length 42/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 28 0 R>>/ExtGState<</GS0 32 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 33 0 R>>>>/Subtype/Form>>stream
-q -/GS0 gs -50 0 0 102 495 389 cm -/Im0 Do -Q -
endstream
endobj
22 0 obj
<</BBox[251.0 494.0 301.0 389.0]/Group 34 0 R/Length 42/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 28 0 R>>/ExtGState<</GS0 35 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 36 0 R>>>>/Subtype/Form>>stream
-q -/GS0 gs -50 0 0 105 251 389 cm -/Im0 Do -Q -
endstream
endobj
34 0 obj
<</I false/K false/S/Transparency/Type/Group>>
endobj
36 0 obj
<</BitsPerComponent 8/ColorSpace 28 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 105/Intent/RelativeColorimetric/Length 139/Name/X/SMask 37 0 R/Subtype/Image/Type/XObject/Width 50>>stream
-H‰ì×»€ DÑÝÿÿi+•}
’8SßSA"ŸLÏauµy¢\à˜¨7MZ’…Á”@‡Pt])Ê Cè:€ÿŠ¢. -H‰Ì×çWSÙ -Ébs-ÀàrØæ:…DÀa@„Ñ -¸=Ʀ¿OO˜š†ò
u¼²þi×Àøô÷oC&^Õ‚ ¡Žƒ†z7_Z0E¡j¨Áñoÿž‡øÑ‚݃s -ÐP¡¼r{¾BÕæª¦}Ö=Ä÷Šïÿ—b>y,ðY-ü}ü³w¾ÀºZhí.¼?þQšêsCaj/™MìW“3û•I¡µ'Ï-Œì»cs ý½}jlàI¡~LÁ¢uVapF
Ž™†ç 8k§&çxªæ¬= Ÿµc““£s -ø“ -Îsø0:?¡i†–®Os–º\ÿômÿ—‰‰¹„öm ïÈøÄ—O*±Ç¸@hÝÈÊo>îèùÔÕÚpÅ„€o}ªr¿týá›Þ¡ÑÑáþ·-°H™EhÊ}cöá¿ßù~`däs_çÓúËðÅÒˆ˜)^¯åñÛ¿vçy×ÇÁ¡ªËknrt€TÄ6"TÅ·ußé«
OÞ¼ÿØß×ý²ùFÙ1cË™âµÈBV§*ŠË¯ßÞÙó¡§ãÙÝÚÒ#»6EùªÂ¯0 jÓŽÃ%Õ
ÛÞt´·=j¨>_髾Šj õK§°…N>áë3òO”Õ66·<k}Ôt½òÔþmñ+|,² -u¿‰f–¾9Y|[Wß0ù†Ôí»öäçïÍÍÞ’¸&ÜßÍÖJïKmÑïZŽÐÎÍwéÊØÉé[Ó6ÇÇ„º;Zs$ÝG¥YOar…vRÏ€ÐHyìºõëâbV†x8‹y,*AçU³,$„% -™L$à±D0ñ#Œ -a±8‡Ãa1h…œ
¨Ã˜!`„‚ FC -̇s0Ô -ÿÿÿ#
endstream
endobj
39 0 obj
<</Filter/FlateDecode/Length 2574/N 3>>stream
-H‰œ–yTSwÇoÉž•°Ãc
[€°5la‘QIBHØADED„ª•2ÖmtFOE.®cÖ}êÒõ0êè8´×Ž8GNg¦Óïï÷9÷wïïÝß½÷ó - -V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚ó -€x¯Íú·¶Ò- -¨ê‡†¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r9‹\A&‘GÈ”ˆrQ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½ÄÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…寒°d¬VÖë(ëk–Íe‹Øél
»—½‡}Ž}ŸCâ¸qâ9 -N'çÎ)Î].ÂuæJ¸rî -î÷wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â*6X[ݱF=3ë·YŸ±~dó ·‘ÛtÛ´¹iÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö -n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=G</zÁ^Á^j¯^—¼ Þ¡ÞZïQïBº0FX'Ü+œòáû¤útøŒû<öuñ-ôÝà{Ö÷µ__•ߘß-G”,ê}çïé/÷ñ¿ÀHh8ðm W 2p[àŸƒ¸AiA«‚Ný#8$X¼?øAˆKHIÈ{!7Ä<q†¸Wüy(!46´-ôãÐaÁa†°ƒa†W†ï ¿¿@°@¹`lÁݧYÄŽˆÉH,²$òýÈÉ(Ç(YÔhÔ7ÑÎÑŠèÑ÷b<b*böÅ<Žõ‹ÕÇ~ûL&Y&9‡Ä%ÆuÇMÄsâsã‡ã¿NpJP%ìM˜IJlN<žDHJIÚtCj'•KwKg’C’—%ŸN¡§d§§|“ꙪO=–§%§mL»½Ðu¡váx:H—¦oL¿“!È¨ÉøC&13#s$ó/Y¢¬–¬³ÙÜìâì=ÙOsbsúrnåºçsOæ1óŠòvç=ËËïÏŸ\ä»hÙ¢óÖê‚#…¤Â¼Â…³‹ãoZ<]TÔUt}‰`IÃ’sK—V-ý¤˜Y,+>TB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßYÕ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø
Ú†žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝèþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_pß¶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMÅ›Î
nßLÝlÜ<9”úO -¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿
æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ -q -/GS0 gs -50 0 0 105 251 389 cm -/Im0 Do -Q -
endstream
endobj
43 0 obj
<</CS 11 0 R/I false/K false/S/Transparency/Type/Group>>
endobj
45 0 obj
<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 50>>/Filter/FlateDecode/Height 105/Intent/RelativeColorimetric/Length 2256/Name/X/Subtype/Image/Type/XObject/Width 50>>stream
-H‰Ì×çWSÙ -Ébs-ÀàrØæ:…DÀa@„Ñ -¸=Ʀ¿OO˜š†ò
u¼²þi×Àøô÷oC&^Õ‚ ¡Žƒ†z7_Z0E¡j¨Áñoÿž‡øÑ‚݃s -ÐP¡¼r{¾BÕæª¦}Ö=Ä÷Šïÿ—b>y,ðY-ü}ü³w¾ÀºZhí.¼?þQšêsCaj/™MìW“3û•I¡µ'Ï-Œì»cs ý½}jlàI¡~LÁ¢uVapF
Ž™†ç 8k§&çxªæ¬= Ÿµc““£s -ø“ -Îsø0:?¡i†–®Os–º\ÿômÿ—‰‰¹„öm ïÈøÄ—O*±Ç¸@hÝÈÊo>îèùÔÕÚpÅ„€o}ªr¿týá›Þ¡ÑÑáþ·-°H™EhÊ}cöá¿ßù~`däs_çÓúËðÅÒˆ˜)^¯åñÛ¿vçy×ÇÁ¡ªËknrt€TÄ6"TÅ·ußé«
OÞ¼ÿØß×ý²ùFÙ1cË™âµÈBV§*ŠË¯ßÞÙó¡§ãÙÝÚÒ#»6EùªÂ¯0 jÓŽÃ%Õ
ÛÞt´·=j¨>_髾Šj õK§°…N>áë3òO”Õ66·<k}Ôt½òÔþmñ+|,² -u¿‰f–¾9Y|[Wß0ù†Ôí»öäçïÍÍÞ’¸&ÜßÍÖJïKmÑïZŽÐÎÍwéÊØÉé[Ó6ÇÇ„º;Zs$ÝG¥YOar…vRÏ€ÐHyìºõëâbV†x8‹y,*AçU³,$„% -™L$à±D0ñ#Œ -a±8‡Ãa1h…œ
¨Ã˜!`„‚ FC -̇s0Ô -H‰ìÔA€ DÑáþ—v+ÚÚ)htºþ/í‚ -H‰Ä—ù?ÔûÇ/³ïÃ,Æ0c7û2²kÊM!•R–¢+-“¥R—´ˆJ7…ŠÄE%KÑB¡Ev 3c‰[÷ù¾ßŸË,¡¾ûþa–Çã<ç}Þçõ>ç¼ûí?X:*kֺʵ&¥´EÁ…F>QJl{`ŠÆ`0Xdh4¤´#@k,'ˆ`x‹Œ67ˆ40'’È*••J!-n€=™J×g0Yl°XL†J&ⱈ¨ºº -lí„B;[¥ŸkÀ ‘µ pOX™ÎäðÌB'WO//O7g{¾!“‹Žª4O¢1
ù–Bg‘·_PÈæÍ¡Á¾^®Ö¦\@°h'::ÐEŸÃ·²w÷‡ïˆŽ‰ÙâçélcÆeÒHȾT6…Á‘h,#¡»ohø®=‰É©©)Iûã£~ÚèbcjÈ ¨9ž¬Ç1±qñØ}0-S’“-É<’·=x£“5M‡NT¸)×ÜÞ30|wÒ±ìó…WŠ®^º“™¿=ÐÓÞœœ¬ÜK¤2œ¼Åщ¹…%·Ë++Ên^É;‘¶ÉUÀcшp[ªÅ¸úm‹?œuñFEM}cC]UYQ^fâÎO¡G„[ˆ’àÛ¸D$dœ+.¯mzÞÞÞö¤æÎÕÜ´ø0_'K®>¿2e"pGâñüÒê§]==o;šÞÊ?‘à&à1©U…%PY<H<YXV×Öõ¡¿ÿSwGceQvê®PO;6€]:8]ˆ\àˆS—î6´÷ŒŒ
÷½m©¹™w4~ëF{3ºZè †‘•«DâÉ»/?OŒ½ï¨/+ÈLØæëd®}¥Jpd}®¥ó¦ðýÇ/ÞixùqtR:5Ö÷æIÅåS‰~.0ô•G¢s̽Ãöfüy»¾ããè”\öuà]󃢬¤nÖFpXÇË6nïNÏ+mÿ0:5-Ÿîi}X’›ì.0fPÔŽ†ÎâÛŠBbŸ¹^ÓÖ;<9==5òþÅ£gÄ„ˆlxL5Bº±µ[àÎäìkU-ÝCòiéè‡öº[yéq›=íø,Õ„ ÀÐ]ÀaI®Ükz;ðcŸ^Öÿuáø-„Š„¨$=Cs'ßm ' -ËŸ¼ù<.›–~é{ÕP–Ÿ±$Ä”
´ˆR9,–H70³‡u,¿¬áUß©¯ïdîóv@R¨Nhl¡—x÷Ñý¯tüó›'å…Ƕù8šqT“ބޖghlÚ¹ÒÚïG&Ñßù´âÒ‰ýᾎæ:IƒÀS˜<]‡ÏܨyŽW&èjª¼|êÀöMN†ª2Y:^{PTJnÉöžá HúÛg÷®H€Lœ-5 ]PFŠ„Wµ‚„ -bz -H±¶ô\Zl¨ÈV«—‰{ -B:ö±ãï[çÓãÄ^ÚÅ« ¶/Ó3²/Ÿ^Õß^]¼N›‰Ééùøç×?¯&1+ÿÚÿæñ݂̽ˆx×"†&gf§'ú;Ÿ”_<¾ïwmr×$æf&ºžVž€r7×»1ˆÉA ÞK'µË]“˜ýˆ·@î'„ê¸bvrÈ]yAÖGL
½DI¨_ÕˆD—ð?&$«KJü¹Í¿H\ýbñÖ6w¯—X¬ë$–«OKϰtnmBYáe]«jí‘ÎͯFÀšˆ'냎¸3)»¸ºµwT67?·*RÖ]P©s@¥~?*û6?'~×|©íÁÑ© Ù¾ø0&Ÿ_ -§I(€h «ê6@ÌÿþmjTj¤îªWÑå!È*·¤ûÂüÌèÈ(£Q©)W9ÅU-°©ÍÍÊÀH¬c ¨wƒ•DJvÑý¦Î¾±)™ôë`ÏóG¥çÿ -Bc&EìKËÊ/¾]YU]Uy»¤ +}_d¾rÈ8ÜÙ|‹¯8ú@º$¯°¨äzIQaž$}”ØÇ<×hDw -_k"ÿ°è„ÔIÎÙ³grNe¤ì‹Úêç!D^kjmÙ–ßÚÑÓKdÜþ¤Ô´´#©‡b#Å~"Kø"ÄcÔæ]4ŽHeš -E¾ÁaQ1q»ãb¢¶o
òñp°æsô¡•AnO¦3¹¦Öö®^¾Á›Å[Ä¡Áþ>"¡%ßAS¸P}Ú¢q€ò-öÎn"¯
6xz¸: Íy]¬Øâ…ÃÀˆof%°ÚÛíl-Íx\¶> -q -/GS0 gs -50 0 0 102 495 389 cm -/Im0 Do -Q -
endstream
endobj
50 0 obj
<</CS 11 0 R/I false/K false/S/Transparency/Type/Group>>
endobj
51 0 obj
<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 50>>/Filter/FlateDecode/Height 102/Intent/RelativeColorimetric/Length 2342/Name/X/Subtype/Image/Type/XObject/Width 50>>stream
-H‰Ä—ù?ÔûÇ/³ïÃ,Æ0c7û2²kÊM!•R–¢+-“¥R—´ˆJ7…ŠÄE%KÑB¡Ev 3c‰[÷ù¾ßŸË,¡¾ûþa–Çã<ç}Þçõ>ç¼ûí?X:*kֺʵ&¥´EÁ…F>QJl{`ŠÆ`0Xdh4¤´#@k,'ˆ`x‹Œ67ˆ40'’È*••J!-n€=™J×g0Yl°XL†J&ⱈ¨ºº -lí„B;[¥ŸkÀ ‘µ pOX™ÎäðÌB'WO//O7g{¾!“‹Žª4O¢1
ù–Bg‘·_PÈæÍ¡Á¾^®Ö¦\@°h'::ÐEŸÃ·²w÷‡ïˆŽ‰ÙâçélcÆeÒHȾT6…Á‘h,#¡»ohø®=‰É©©)Iûã£~ÚèbcjÈ ¨9ž¬Ç1±qñØ}0-S’“-É<’·=x£“5M‡NT¸)×ÜÞ30|wÒ±ìó…WŠ®^º“™¿=ÐÓÞœœ¬ÜK¤2œ¼Åщ¹…%·Ë++Ên^É;‘¶ÉUÀcшp[ªÅ¸úm‹?œuñFEM}cC]UYQ^fâÎO¡G„[ˆ’àÛ¸D$dœ+.¯mzÞÞÞö¤æÎÕÜ´ø0_'K®>¿2e"pGâñüÒê§]==o;šÞÊ?‘à&à1©U…%PY<H<YXV×Öõ¡¿ÿSwGceQvê®PO;6€]:8]ˆ\àˆS—î6´÷ŒŒ
÷½m©¹™w4~ëF{3ºZè †‘•«DâÉ»/?OŒ½ï¨/+ÈLØæëd®}¥Jpd}®¥ó¦ðýÇ/ÞixùqtR:5Ö÷æIÅåS‰~.0ô•G¢s̽Ãöfüy»¾ããè”\öuà]󃢬¤nÖFpXÇË6nïNÏ+mÿ0:5-Ÿîi}X’›ì.0fPÔŽ†ÎâÛŠBbŸ¹^ÓÖ;<9==5òþÅ£gÄ„ˆlxL5Bº±µ[àÎäìkU-ÝCòiéè‡öº[yéq›=íø,Õ„ ÀÐ]ÀaI®Ükz;ðcŸ^Öÿuáø-„Š„¨$=Cs'ßm ' -ËŸ¼ù<.›–~é{ÕP–Ÿ±$Ä”
´ˆR9,–H70³‡u,¿¬áUß©¯ïdîóv@R¨Nhl¡—x÷Ñý¯tüó›'å…Ƕù8šqT“ބޖghlÚ¹ÒÚïG&Ñßù´âÒ‰ýᾎæ:IƒÀS˜<]‡ÏܨyŽW&èjª¼|êÀöMN†ª2Y:^{PTJnÉöžá HúÛg÷®H€Lœ-5 ]PFŠ„Wµ‚„ -bz -H±¶ô\Zl¨ÈV«—‰{ -B:ö±ãï[çÓãÄ^ÚÅ« ¶/Ó3²/Ÿ^Õß^]¼N›‰Ééùøç×?¯&1+ÿÚÿæñ݂̽ˆx×"†&gf§'ú;Ÿ”_<¾ïwmr×$æf&ºžVž€r7×»1ˆÉA ÞK'µË]“˜ýˆ·@î'„ê¸bvrÈ]yAÖGL
½DI¨_ÕˆD—ð?&$«KJü¹Í¿H\ýbñÖ6w¯—X¬ë$–«OKϰtnmBYáe]«jí‘ÎͯFÀšˆ'냎¸3)»¸ºµwT67?·*RÖ]P©s@¥~?*û6?'~×|©íÁÑ© Ù¾ø0&Ÿ_ -§I(€h «ê6@ÌÿþmjTj¤îªWÑå!È*·¤ûÂüÌèÈ(£Q©)W9ÅU-°©ÍÍÊÀH¬c ¨wƒ•DJvÑý¦Î¾±)™ôë`ÏóG¥çÿ -Bc&EìKËÊ/¾]YU]Uy»¤ +}_d¾rÈ8ÜÙ|‹¯8ú@º$¯°¨äzIQaž$}”ØÇ<×hDw -_k"ÿ°è„ÔIÎÙ³grNe¤ì‹Úêç!D^kjmÙ–ßÚÑÓKdÜþ¤Ô´´#©‡b#Å~"Kø"ÄcÔæ]4ŽHeš -E¾ÁaQ1q»ãb¢¶o
òñp°æsô¡•AnO¦3¹¦Öö®^¾Á›Å[Ä¡Áþ>"¡%ßAS¸P}Ú¢q€ò-öÎn"¯
6xz¸: Íy]¬Øâ…ÃÀˆof%°ÚÛíl-Íx\¶> -H‰ìÖŽêV -Lh<²K`Bã'»&4¾I -Óÿ -ÓÉÓÙ‡;¦0}°#“ÙG::1™}œ‰ÄtöQƓ٧MLfŸ`º°¿M/Òt]ÿš^•é²þkz4¦»úbzìoº©;¦WÂΦƒºkz)ìiº¦M/†ÝL§ôÓ«aÓ=0½v0ÑCÓâ]Ó=ezI¼e:Ÿ'M¯‰7LÇó¼éM±Ñt8/™^›Lgó¢éu±Át4¯›Þ¯š.f‹éñ’é\6š^/˜Že³éÅñ´éTÞ1½;ž3ÝÉ{¦·Ç3¦+y×ôþxh:‘L¯¦ÙÅôùé<ö2½G~6ÝÆ~¦7ÉO¦ËØÓô.¹oº‹}Mo“{¦«ØÛô>ùnº‰ýMo”¯¦‹(Lï”ÿ›î¡1½Uþkº†Êô^ùåøƒò‹_”A“gNûñÏs38›Ae§pšÛ6ƒ¨ìÎuÖ`•Í;ßIÏ7ï9ç=Ï9Ûœ÷˜§Œû§Ž'ÿŠgŸGöº`zÂóOÈïìs¿ü€—’ûv9Þ!׻ʜ|µÇå;Ý…Få—Îvèá.5,ÿxÿhG_íbãrÁÆTv5Ll‡±GfþXmLeWrÑÄÞ}pîsáÆTvWNìÝù§gÿoìLþ).ߘÊNoÆTvv+4öÎ+¦'ÿk4v{ã!Óƒ€E»mÉôÜë[§1•ÕJ©ì¤–jlós¦Ç^Ûb©ìŒVkl닦§^Ùz©ìtlLd'³bc*;™%Ûø¬é¡WµhcÛ6=óª–Leç±lc›ž6=òšņì,ņì$–nlËó¦'^ÑÚù”ÂêWXüy—°¡±‹]añç]Áòù”Íû€¬ÿ“{½±ž`ý>iä©»â >à‰mºõ¬é•½dí×=%HàÓ½¿à™*{ï—³Óã4Æ!4Æ4FOd@côDFNdôDFOcäDFOdäDFNdäDFOdäDFNcä4FNcä$FObä4FObô$FOc@bô$Æ$Æ4FOc@b@cô4Æ4FOdô4Æ4FOdäDFOcôDFNdôDFNcäDFOdäDFNdôDFNdäDFNdäDFNdäDFNdäDFNdäDFNdÔn7•9‘‘9‘‘9‘‘9‘‘9‘‘9‘‘9‘‘9‘‘¹›Ê¨‰ŒœÈȉŒÚMdÔDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFî¦2j"#'2r"#'2r"#'2j7‘Q9‘‘9‘‘9‘‘9‘‘9‘‘9‘‘9‘‘»©ŒšÈȉŒœÈȉŒœÈȉŒœÈȉŒÚMdÔDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdän*£&2r"#'2r"#'2r"#'2r"#'2r"#'2j7‘Q9‘‘9‘‘9‘‘9‘‘9‘‘9‘‘9‘‘»©ŒšÈȉŒœÈȉŒœÈȉŒœÈȉŒœÈȉŒœÈȉŒœÈȉŒœÈ¨ÝDFMdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdä¾F¦2v'2r"#'2r"#'2r"#'2r"#'2r"#'2r"#'2r"#'2r"#'2r"#'2jß{9‘‘9‘‘9‘‘9‘‘9‘‘9‘‘9‘‘9‘‘9‘‘9‘‘¹ï‘©Œ‰ŒœÈȉŒœÈȉŒœÈȉŒœÈȉŒœÈȉŒœÈȉŒœÈȉŒœÈȉŒœÈȉŒœÈȉŒœÈȉŒœÈ¨ÝiLdìKdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNcäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFOdäDFNdäDFNdäDFNdäDFNdäDFNcäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdä4FOdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNdäDFNcäDFNdäDFÎr"#'2r"£vµ¯‘©ŒÝ‰ŒœÈ¨}kLeìMdÔî4¦2vu·1‘±§û‘©ŒýüÐ˜ÌØËω©Œ}ü¶1™ñ¾G‰ ·<Àõü)À -H‰ì—y8ÕéÀçÞæVÄ9ö}—c©c_"»ƒ²%2QY²¥ÒŒ[3’"’†RdIE&×Ò‘’d9öýX²tuÿºïû;‹ƒšgžûܹJ¿Ï_ç÷žóÇ9çù<Ÿïûýæ”Êßþ$ëý=Q¾Hèúû‚ª†òß@çÖ&„o?ùíMô¶÷—Gùü¡ù…¸õÀf2[VC9‡¡èFSm½ÊçU0$]À®-[¶ne```ddÜöqÀ;Œ[·Bã×Ȧ¡¢¡|zÁ@¼ ^ŒÛ˜˜˜1,–ºä‹Å`˜™™€nÐ5¨4
e
«ƒ~1c°¬lìœ\ÜÜ<Þ• gÜÜ\\œìl¬,XE5hhëýÓP>–
ƒ -†øÅÁÉÍÃÇ/ ($,"*&&&¾p**"",$(ÀÇË]ƒªÓ h h¨g((†Á„Qcae‡~ ‰ˆm—”’‘•“WÀá?§ //+#-)!.&"$ÈTƒ¦a˜)¢ ¡ž}õ#
ÛÆ -ãå~IHÉÊã”Tvªªkhjiëèè®EGG[[KS]
¿SE '/+-!.*LãædgEІz†B‹4ILT\RF§¼SMSGÏÀÐØÔÌb¥•ÕÞµXYYî±0751Ú¯«©†WQR€¦‰Ñ8ØX°Ì«<[ïß‹òg9b aÌ0>A(˜âU
]»MÌ-¿³ßçäìzÀí »»»ÇJÀÉA·®.Nûìl÷î171Ô×ÕRÇ«(ÊËHŠ‹òñÀ Q=ƒ÷3T³¯
²bäˆ1aX€a aÛ¥åUT5u
ŒÍ,mì÷»¸y|ï}Ô×ïx@PPpàÄ2ð18((ð¸¿ï±#^žîn.Žö¶{-L
õu4TUå¤%D…øy¸è=C§æ×M11,˜’|B¢2òJx
}#s+Û}În‡¼Žùž8öãÙÈ¨è˜Ø¸sk‰‹‰Žú)"ü‡Ó¡!þǼ=Ý]ím,ÍŒ€hxeI1a~^²g[Ñœ}]P£DŒ‹W@d»´‚2^SÏÐÔÒÖÁù ç¿À§ŒŒ9w>)9%õJZúÕŒŒŒÌ•€“«éiWRS’NLˆ‹Ž;|ÜÇÛÓÍÙÁÖÒÔPOKU'=s“ÃDŸ³õþPþjèòrpó‰IÉ)AÃÌ÷Ú9ºÁ‚BÏDDÇ'&_JËȺ‘{ëö‚»……E€âeàcaáÝ‚üÛ·r;–‘–šœ”è{ÄÓÍÉÞÚÂh—¶š -NFBLˆì0g¨f_4Å9ÉÉ"&ƒÛ¡®kh¶×ÞÙý°O -p³c™‘ -ò°³ 1û⡌J°T‚ÛÈ^ÇØÚñßÉÈó©YyP1˜“Ãã¤p£F™{”ÖÌôirb||lttt„xŸ˜œ$MMÏ@Ùæ¡j´ªQ=÷³ñ‘bçëuO fÏ…‡sßoe¤ƒW -¡¶½C%í€FÚoZmm¬,ÎNà:›¿–çHˆxéé`ŽÔV…ʘ3ãúÉ<¥¡Ê³,lœ|b2PÙ¸ù†Å¥æ–Õ4wáÆ¦ -F^YÛ -ˆÉÞF˜Ú{D&e– ›:qÒ -X”Tû÷Q‡m}[[Yš›ž$Œâú»±u5U¥Eù9™éi)ï߯ÇÅÆÆÄļy^bcãâ“’ß§¥gfç–”VTÕÔ64C¤
&H3 -ð÷÷ó¥ÅÏÏÿe@PpHXDdtlBRJÚǬ¼ÂO_jj[;ºûp# -måg°š}7“€ëj‚Ê,2ÐÓÁÔ -*°ƒ¨ÆvàƒWôÌ¡›"Ž@„U–dHŽ~éƒrwq°±4{ü©¯§sOqWC]]uu»Í{Ú÷õô?1·²±wv{îå—”ú1§°ôsu]sG÷ -7d¤$ÅÅDE® Âo„¯]—”’¹!S鎊:B[WßÐÄÌÊÎÉÕóÅËàð7 )é9EåèºlßÐTgÀÎv÷(?~ü€ËlDÄ6T|ˆõv¶@jÝ‘»ÊËëÿtý?Éu0ÍJ!É›êzOìQ¯Þ¤æWÖwâˆ3K`Tþø ;88DŒDîÃ6a*KrÓßžöû—›£¹ ò6BMð%-).zMHà -ÿåK|¼<<ÜGáááåã»t™ÿª€ 0€íº´¬¼âmuM=$¨4['7”O`XT|rznqEMC[÷Àèøô<™z5P(»ÐÏŽw7W—d&†û¹>5b&.ÈG×ÿÚ¬ŒY)¥¨¡oæè—^TÕÔ
ŸÊí=Pc ¿ö)àd-Ï“C½í
Õå…Yï¢Bü½ÜÍÜ×TWV’—•’¼Ê‰—ç"'û…llçÂÆÆvƒ“ë"7ß%þ« -JwÔÚzMì]ž{„FŧdäúRÛŒí&€«¹úmkÔvÁù)|¦<'9*ÀÈ™‚¤¤ÿŒt1;Á¡1v–åÂEþkÒJsça %5}£S‡§Flwkƒ†X=º4ÿã»ØðÀN€0}„ê-Y)q!À7'û…ó¬çXX˜™™˜Î3˹s¬çmœ\ -Àx ¿Ø0^,,ÌÌL0[¿ô‰™™¸!kˆH‚HCÐvªk뙑m¹8u&$<:î~FNQÎëfkkk+ØÊ|Ùö¢4'5ö· 7[3]5829áÈd(Û„C7Æ/*¨®¿ßþØék ™UM=PÇÞCûŒˆ¡2övz´¿³±ºäIFÒí¨Ë§=ݬ÷“ô´Ôˆò2Râ"‚ü¼Ü(À¶ƒ/ÄkëÖŸÐüë/ƒ}ü Ó†SCÒ8¹ Ò -ªš{F^Ñ-/¢rÝö¢,7=!:ô¬ÏQ2iº²œ$=Äþ¹WQAœmÛ[“_Xœ -òr±ãÄþ©ûêeÈÜLhk"f°4Uµ
öp>á{>âvJÖӪƮÁñX™ láíôHosUAÆÝ«Á>®Ö$-e‚(cb,ÌÌËv^i%Mc+ïàÈ»™…Õ-}c3ïÀÄØÇUÊ;X•õåù™÷n@Œ±·0†MIâãbg]'ö]^‡ÞGgÝLVi×ncû#>f÷2òžÕµ¿ÅVæeaöÕhoKuaÆÝÈ`o+cM%i^Ží,e<tcÂRІ–ÎÞA°+«[_޽~·´F56?3ö²¶4'íÎÕ?ˆ13=
´)ù¹9X·}ObÔnÁ·&ÎLTjQCÏÌÚÙÃ7$2îAvqMKïȺ2—(‹s¯Fû²øÈ ogKC
E)a†²
êaÉÎ#$© n@vò -Œ€>ÆÆ‘1¬Ž¼Ÿƒ5Ôò¼(+9&<èäQ{#Ui1A^(c,Ìß™þH:3v.^A1‚‚ªŽ -³À°[I«šº‡&ßP•ÍŒ²‚Œøˆ@/'²º‚¤û6FùßÐÁ±qJÈ«é™;zž K/¨jcË4c³SÃÝM•™÷¢/x¹Ø1&+!̇ÊvQ~gbØ3©ÌX¶±rpC5“U†0³qñü÷¥ë y
ƒ¯çÑ‘‰+«ÊO?ãéh®§&/!ÈÍÆP¶‘ƒ–l\ârªºû<ÂbÓòªšûÆÖ-¾êj(ÏK -ñ=~È’´bLnJê¦üÄð—bÌàÒÄv¦4„™1ÙÑýôùÈ;iOÊê:Ö•ö6Wæ¥Å†x8ìÓU•àbcœ˜7È–\üb²*»ÍìÜýCcRs+š{¡Q-/¾ì¨+ËI>yÄn¿&QN’cø¦üqEÌðÉaFÔ4ØwÐÍ'0üöƒìÒíýã4eÐþ›*rScBýÝíÌv«ÈŠñ3N̼ô³rò‰ÊuLmú^º™’SÞØ3:Cëc`lb ãEivJLØYo×fº» b‚<?6ÆèïÝBÛ™<bÅ]{Lm\¼Î\¹•ü¸¤öKe#=å9)7/ùµ5Ñ&Dø8壆vXŠH+i‘lÜN]ˆ¾Ÿ]ÖÐ=23O7öfb ½¶äÑý›¡žÎV°*å¥à¨üñ1F{1¾3Q˜ñ‹HîØ©clyè„ÿåIYÅ5mTe”ÅÙéá®ú²Ç÷£/œ:lm¬©$˜ŒZ¶C?,¥5Œ¬\|Î]K|TR×5<=OYûˆ[x3Ñß^[œ•tã’¿‡#ÙHKENBŽÊˆ1ê›éaÆÉ+$+ÓÐÂá¸ßÅèĬ¢š¶—˜²%ÊÔÈκ’¬Äkç|\,
é'&#Ê~ø`¥?,wX8ý™ðGqmÇÐÔeuÝX[MQVbôE_ws
elUnPŒÑŸ‡7¬L%uýýÿe¿Ìÿ¡Þ÷8~=î=-”eÈšAe‹l)FRÉp¤²dZ[mD¡IY -e)ÂQ¨)!¡²$JTvYÆ3côÜ÷ç33tº?Ýsï÷õ|>Ïëóz=_.^áqiys€dMéÝëÑÁ~{í-´Èþ‰Âœsa èÇÃÒŽæsúRrΣꦎÞ&gúûËK‹ðr±µ4ÑÕPAU9o1&88/Ìpeªë[P=ÂþLE.ã5æ$“ŽŽ^õ0'9êLLŠ†Ëæ\< CІåÁ‰·K^¼ýØ3Ì`sÿæ±Ô?Ãü=©F:êÊrÒ¨*ç/ÆøGçÍ̥ˤä”Ô´(TgÿŸ\66ÔýáMeIöµ‹A^ÎÛÍ -<6ßÇÿßeâ’$²¦9Ïeiùkš:z¾Ë&£Ÿ[ëžþ• -ð¿ÙX›À²9.K ©+56ô‡Ä¦”½jý<06 ›æ²Ã…‚Ƕ›h’ùÅ—ü²0<Æw3’‚*¸l;rY\Zþ“—ÍŸz‡Ç'Àe#ýhbæÝˆ>ãG³³ÀX&ޱl¾þÿ"\–â’²Ê -v™vdY@øåô‚²Ú–ξä241›ªå$Ež8èbc¦·JI–(Ì9ŠEP–Šêº¶9z^¼vûAU#–\ð›1ÜÛÑTÃëJÇd–Çø¿x©Àe°1ÏÅß*,¯ƒ@e€ËÐÄ|[Yœ•p>Àc÷Öõ:j -2DaÎøe)¯ªe¼ÙÁíXx|Æýg¯?ð†åw.›9Òû©¹æq~â±-€YùwaüŸqlL¯À ™÷+Ú¾ò'æ×¶†ŠÂ›€eûí-4¡0%ˆÂœ#!ê_´—%ÅŽæ“VP^÷þëËéï\s´¯³ùå“ü´8´+±Çäù›ïYù“~t™!…êr0(âZvqå›Ýßèà2€ÿw¯–öq¥šë¯R& -s΄ž—åÚ
ÖNÞ'¢’sK_¶t
Ð1ôs&Fû»ÞÕ–¤_ÿOÍ÷ÑÒ¬ËÈZFv®>§¢’sV7uô3&Y“Œ‘>À²‡w#=·™êÎæ|Ÿû_ˆú‹Ã²Deù›ÿ¹„¬’}<蟚üÜZW^x3þ\€§“Í‚öجËH -dmcKû½~g¢oä=®}×50Ê—–½y^”vôÀT˜r’⋉(¾xe¹œ¤´JßÜ–æ›^XÑÐÞlzŠ5ŽAæ^Æ•óǽœm(?ðØ‚|žËÄ—“ÕtL¬ K/|Zßöuˆ>ÁbMЇ¾¾¯//H>㳇j¦§¡D"Ø.Ä£~iy²Žé6G/(Ë»k[?޳¦¦Ñ°üÖýáÍó⬫ƒ¼]¨Ãî±—IÊ*©¯5ݺÛ=à|BVqåÛ¨0Ù,À²®–šG9P˜»·˜h“å¥ ö¾Ô¯²ÆpÓŽGï@Y6}ê›@ãÀ°ìh¬zp'1òäï®¶†Zäî±Y—É)¯Ò7Ûîì}"2)çQMKgÿ(“Åf1àBo+‹2.‡Ù÷«…Áj‚ýçB˜ú%dÔ×n´Ùãs&&í¯§
í=ÃL6w ¬¿³¹¦47åÓ¾´_-´É -¤î1Þ·+d®1 ØÒ|ÏĤ”×½‡Âœd³Ë¾¶Õ—çßøãÔAgë
ÀþÒûY8ÈàÛ¯Ô4¶Úé~übbNéËw¨,ÁcS,úà—ÖWeù©±!‡÷ïØl¢£¦HZ.¾À=†þ
ÜiÉ2iyU˜2ÎañEÏ¡0G,6{bæÃÛWÏû»9XQ‘“$¢LÈÂA¶LFQCÏÌ–vèlܢʷhY -€¬ ÿÖå°£n;·¬×UW’•\øÃ…‰¶ŒŒ¢š.`™g`Dâ(Ì®± 6‡ðñͳ{é±Á¾®6ת+ÊQ&\Í™–É–ÝžAQ)yeumxY¢²íëh|Q’}õÂqÇmô4”EÂc|—!øGXFÝãs: -³¾ûÛ8.Ì!ˆçǹIÇ=vZk®$¢LÈš 2}s»½‡Ãâ³Jªš»èhY¢²ìjyYš›uò ‹ùºÕ*rRðéEá=xð°LÓÐÒ~ÿ‘°øÌâÊFHh&›ÃžíÿÔøØÿì!ÕLˆ2!ëÇ sô:qéFÁÓ†=#~Y"¤Åûíµ³0Ô\¹B{LžCŒ÷{¤È:ëqa&å–Ö¶~¤Or8,Æ0\¬,/%*Ès— Ê“ M?Ù¾#aW²Ô´ð©—åÛÊ¢Œøð£nVÆ0,e–-Y„<& -Ï¿ÏÒå$%
(LWßàØôŠ×zG Ê8“ô®æª’ÌøÐC4[ˆ2˜‹ÿõO‘¸–( -¿ŸÈ¼N¢ {ý±—Gý¸,kå$Fz:n3ÕU‡a ì²ðŒ/–IÉÔ4²ÜávìÜÕì‡ÕÀþ(ÊØÌ‘žö†òüëQA»¬Œ4Ud—/%úRXƒ‡QT×3·"»’ý°æÝç!Dý\s¸»Ê25úŒ+Õ\†~Ññ˜ 0e`aZ;yÃÊ/¯oïf°P”
v5WC”=SWM^ -®&271Á;@¥Èªh[íò<Á²>dS“cˆŽ‹3ãÃŽØai@&%! -ÃrVü„…¹Žb·ïp(°USçÀØl”å¥Dº;X®V&-#Ð_HBϰX\Z^míF*íPh|Ödã(ÈØŒ¡/µ¥¹I¨,·®×QC@&R›)̪<ƒ"SòÊêÚº‡l~”UgÄ…øºX›ê¨®Ú¡»‰Žx…BR^mh¹Ó=0òz>LKLd\ þÞ¯+ -Ócƒ}qY*É" )ͦ¢†ž•æ—Qô‚eS8ÊêžÜMºàÀž¢¯¡(#Aô¥p„úD\r…ªŽ©µ‹oH\fIZNaê¯~p,Å‹\¡ˆñ.ˆØóN÷ãÉwŸ (c²§ÐÀìlª¼ŸsÊÛq‹1B¢/…"Ü–€ýúöü/&Ý-0™àp¹læpPþõK'½`YŠbY"á(“V -Cø 0öoqô>só~%zÖw -ÿs þË¡‡÷ÚQÖVÁ²D°¿ÊCK‡ßP”á„£l¬¿ãMEÁõ(@ÿM«”ˆ¾Žp™HÉ“uû‡'Ü)}º„;ÅfÀ7bIŽôصÅDKU°,çûÄÿµ0ûKü›ý2
‡ºÝãøé‘l3Ö±ïadß²ÄÊV3²FÙE‰Tö,i±>vɾ"TH˜“6Y’–#‘S$E$Œ-êyuî{hy®žCó\3ÓU×ù¼óÂÌÿÏ÷óýýnpµ‘Uß«,§êZgïЛÉiâäØË¾{ÍÕ91®xéÿÏKê°nü8ø%tÌ}O¤—5´=[ñ´¼§ƒp!;&ÐÃÊHÖbãÏXdÿ ¥V™ -ï›SÝ|¯ïåøÙpÿƒ[µÅ)>fz`ëG±23¬ÿù62ȲI`+“Õ0´òŠÏ»ßrlr®þ=íåÑ~{Ít$~åûåJª~[áÛ¼Q°‘‘Ž_NÓØÖ;,©¸î6ií'~*²s1î»
5äÄ@‘ŒîÓÃýè##‹/[™’žÅ>¿èØ×£ÓÓ“ãÃO»®WçÆ¸á±¿ò¼\‰d=Ýg~£àIƒDRQ×|¯_tfySG¸xI¯‡`#K‰<äh®§,%62F2Ú:ð7ùö€—]ÃhÛx…&\¾ù ÿÕøÔôÔÄÈóG-uÅ`^Ú|5/2‰Öž -ÐÄ -BÇ“¡±IÒ´ìp³¦(9ÜÇÁ\_UV\€›“
‰`!)@+ÈaÃ×Sà/ΘÉÉ'ŽÑ4²öIÈ¿tã~ÿð—y¹|¿Ô€ÕÉİ -}çD… ÁŒAǘ¬ìœ\Ü<<¼ -ÐÊ -¡2'.ØËÞÜ@CAFRTXP€ŸÀM+ÈÂ¶ŠŸ;Û`—ÓáèŒóà~98únš8çesun\ »•¡¦¼„ ©²ijÀ— ’BHGZ -)2˜1$;ŠWPTBj£,F€ÁÈÉÊl”–’B£Ñ’Ô––‘STÓ1Âí=–WÝÜÙ÷r|jf–89:ØÓÞt!;.ä€#ÎHW]##–”ˆÐÊ - -¤6AÁ!Ç#OÆ%gUÖßììy7³°¸ø~ž8ñúùã»7ê/e%ÇŒ<pìè?_š@...ÎNûVS -´¶0‡æ¦;
t5”1h~.6FŠT=#‚ƒO£ n<>Á§’Îæ—”•WT”Ÿ/+-).*,,(ȧ.…E%¥åU5
×[»zž
ƒS¿ôñã‡EPe#ƒ};n®\ºpþŸÅ…àIòrs²ÏeefÐÈ -gºMW}“´'V…B†ä@+ê˜Øí8™’[Z]{µ‰@ 456Ô_©««¡:µuõ
MÍ·Zï=êx569»°ôñ?>.½Ÿ=ø´»«ív3¡¡¾<ÉåK—.VWUV”ÓÊ -OÌ9_ÓtóNû]@G{[ë––ÛÔ§åNkÛÙ/都Ò4Œ÷ÐAzšˆÒ5¨¨("E†AFÄ‚k»°2²ÂŒe„eí aYEG‘QÀCd%´„%„„ôÐq¿ïÞ ¸ê!ç,yþŽææò{Ê›-.Ã×’š©„±¾>@E§RHµø²bl~^.x’¬¬×¯33ÒÓRÅè -òQƒA§w -ªn±~ -éK£¥¾,÷ÕƒÈÐÀý›ÝVb¬Ìu5T@˜Áe6jg~Д†&sæ¦ôؼÛ70äbäß^dæ—V“Z;X¼®^IMM
ö÷¾$°Iw®†Ý³ÉÍq‘ù=-f"t&ºÆdd†nJÒ”N‹¸ùàÉï9Øò2ÂXOŸ$Ȧ¦¾°;šëÊòRݼrúèžÍîNö¶¦†ºšªÓä„Àç0CªÄØðM¹ -mÊ3aÑ÷¿Ì|[‚¯oj£1&lJ -½/;©äªâœ—o\Øç³ÞÅccn¬¯>Zg¢U ¿†ŽÒ”k<¶|çrñúíøgio -ËkHÍí¶„±)-a”Ñ[ð…Y/Þû9ðÐ/·Uöó-ÍŒ¾‚)÷ùÎD«¬15-=pSb–9»{ƒ¦ü 6eRJvA)ØÔÖÁäð%ŒMi
"QÆcÑšë+°Y/ãoE„?²gëú5+Í›cb £¡ª:ó3a†2¦¨¬bÌÂvÉ*×
ÈM)lÊâÊ:r“Ít÷"ŒI ›ªB£ŒÛÙN”e'?޼|ìÐNï¯W/[hmn¬§>| -RÖßÛÓÅcw‚0«(ÊM{û:8 -)“—…ëd2ò ÈÌæ-sÝ´ïØ™ˆÛ“³±°)Û›RÒ”
k®P™H˜µ6ÖáKÞ êRHàá^®+í¬Í -´¥¬‚ж‘ÆÉs§pXÌã”7Eøú‘M)AL¢‘fŒÿ²_çßPÿ{ -R„©O™„¼†¡Õ.¿°KY…•z>0ÆÁôçýf˜²Ž¦êÒ?2.†Úkc¢¥(M$ O;d—o=ÓÑûydõ ÿƒX - ƒ8 -C6Œ!+!§œ;êaI³-`†-!¥•t6Ø{=—B.©m¡Ð†ÄA“×eKMInJt‡™¶¢4‘&2~¢´¢¶™GPtrnI
†ì ƒðÇD6@y_ó$'9:ÈC&%<™°”¢–év÷À¨äœ'5ï?
-¹¤¶…Bdî0d#ƒÝmõOóÓâŽ{ïØ¬«"#2?QZQÛÌÎ#(:%·¤CöAx›ø>Ρu·Ö•å]=æå¸i2I„0™°†Ì=(:9çIÍûO€Â¥µ¶”œ¼ßa£Ž‰Hà]¼h2-ÓíîQ€â8Ù0ÒR[BN9wÔÓ~ƒŽ’4‘°![0ÙJ„Ì-0*)çq5 ƒ8 -!û‚!«)ÉM‰ò°3ÓV”&ò³Efbë™tAÆD6@y_ó$'9:ÈC&%<†LÓÄÖ5 2!kžDÊ \±}b"‹ -tßnªÅÙ2IMWÿˆÄ;ůš»ú„¿iÈ’¢Ý²•ó [cl³Ï?üÙ ƒp÷YõE¶Cf´mï‘ð„ÛªÞ!dc_„³)dï&E¸Ùš°AÆ…I¬Xm´uÏá³Wo=|Ùô±!ûÈ |ÍA¦É™B¶Þz÷¡3W²¼hêì£2w“Èš²ÄÈ -rRãÂ<˜:…LÒÕV•ÌÍ—Íå@20&D²~©¸UX!ÈN‰
õwg2h²>J¦õG2{7ßHÆ%ûF$««(ÊNŽÙ¹aÅÂY4ŠáÉôMÌ&ËDÉš&ƒe -øÜhMÉf/Z¹q×Án<xÑÞE$‚d@#üd$#S+;gïàÈÄŒüÒšÆö.Ù€’?“5£d™Üè"™¹ºdTK['¯ ˆ„ô¼’ê†6‰LÉ -Áô‹KÍT -EbH°Œ$û¢Lv>)j‡ëUÉ´P2}2…Æ`ºû‡Æ¦d*„bi?$P²ï_Q²7Ïî];—t`ûz"Ù•É)´YWlØ“œ]TQG$ûÉ€fÃÃ?P²ž÷MOï^={lÿ¶u.ógLAÉtT%3± ’±c’³ŠÊëZĽàIÖ×ÓÑôäΕ3G÷m]»%3VŸÌa¹›ÃË*DÉ:!À¢LÖÝñúñí˧ìݲfé¼éfê“Y£d,É -™¤«
ÉÀßB$ë—Š[…‚ì”ØPw&ƒF!ë£dZ*’™ÉB¢¹™(Y3$xP²oD²ºŠ¢ìä˜V,œE£ªL¦g8IU2X4IÖ+n©+/ÊJŽaÉ,LÔ'›iïêu<óúýçÍ>A2€C™¬%+ÌâqØ~ËFO¶ÀÕgGTÒye²/`ø-ŸÇa¡dÖj“M ’¹¬ß~ éܵ{ÏÞ d_¿C2 ~2”lÊŒù.ë¶í?vöêݧMï{P²hò{2.‡å;j2c”lÙÚûŽž¹rçISGO$þ›ÌÍ~´dfÓç-]³eï‘Ó—o?~ÝÑ
É -øÜèÑ’ië’È:ƒé—š#¨ŠÄàÀM¦…’é“)4ÓÝ?46%[P!lKû!Ðìg²f”,“B$3W›ÌBû‡]:Šùà -’¹H²º_$Ù»'×ÏLX=?ÌŸIÖÉ€ƒá7IVú9ûñµÓ¶š7ÙP¯.$™K²±TŽd`6c²ÊÒ‚ìGWOíߺrî¤Q$™=[2Q ’/¦d%o^IMÚ;gâÈnNH41ɪ+K>½yqrßæ³'ŒÐÓÉÞÖÚª%’%Ædß¿~|}ÿò‰½›–Ï?¼ÎlÛ Pch`’翺wéøžËfŽÖÉ€.’¬¶º¢8ÿåÝ‹ÇvoX:cìP¯îÚÛ˜‘ìæ3$³0ɪ*Š>¼¸sáè®õK¦‡éÛÍÉ€&CC}mUyQÞóÛçì\·xZˆ_WG’E¦dú¼¬[é‡w¬]4uŒ¯§«P`Óºk²xyÊ9$31É~–ëßgiÓÕ‰kNíëé"´%ÉZ ÐA’Õ0ÉtZZ)‹‰ -öñpÚý=YW&Yt¼<™$ËA20‡1Y™>W—©Q)e&™³Ãß’YÛul*–+S²B’,M¥J"ƒ¼9’õ„GÇmO>{ãiΗoHÜ%KQHÅ$™;G²Ááâ™’ý@2àÄ/Y;&™ØüÕ Ï\òŽ$ûU‡dÀ¡q2¹TÁ–ÌŠ$ëÒkÿäy«¶8}íqöçR’ì7’»?“ŠX“Ù“d£&Í]¹uÿ©«²J+‘8ñMæä6päÄ9±[’R¯<|[P‚dÀG²–VÖ¶öN=Œ˜0{Åæ}'3¼ùTRYdÀ…W²6¶:÷è?|ü¬å›öž¸|ÿõǯߑ8ñOÖoظ™Ë6î9~éÞ«üb&Y’+~ÉlÚwêî5t쌥v»x÷e~qEu-’¾É»õ:}Éú]G/Üyñ¡¨¢ -É€ÏdG×>~!Ó¯ÛyäüíçyEåUµõHìø$kÕÚF tõô3uÑÚ‡Óoeå鑸ý›ìÙM®d-H²¶¡‹§ïè)×$ªÓµYïõå?‘¸ðLf'tñð ŽŠ‘)ÕŽIVƒdÀo2g&™D¦Ti2u¹ú2$Nÿ%;—"7+™wP¤DªP¥‘d…HÜø's'ÉÄRE -’™þI–C’%Ë㣙d]‘h24•¬£5{²±TŽd`&S²o_ržÞ8›¼=.:<@Ô›+™(É€c²¦d‡â„F2 ‹$«ûE’½{rýÌÁ„ÕóÃü™díè1~“d¥Ÿ³_;}`Ûªy“ýõêB’Y!ÐbLVYZýèê©ý[WÎ4Š$³G2 È”¬¤àíÃ+©I[bçL9ÐÍ É€&&Yueɧ72NîÛ¼bö„z:ÙÛZ[µD2 Ęìûׯï_>±wÓòYã‡÷ïѹƒm$j
L²âüW÷.ß³qÙÌqÃú!ÐE’ÕVW翼{ñØî
KgŒêÕ½S{$z˜dUE^ܹpt×ú%ÓC‡ôíæˆd@“¡¡¾¶ª¼(ïùíóGv®[<-į«£ -É€&ÙÏrýû,mº:qÍÂ)£}=]„‚¶$ÙÿC2h’¬†I¦ÓjÔJYLT°‡‹ÐÉ€"c²2}®.S£RÊ$L2g3“Ý|†d`S²B’,M¥J"ƒ¼‘(k”,E!“dîHt57Y¼<å’Y'“KÅHÔý™,PÄ•¬+“,:^žL’å pã™ÌÚ®cSɰX4#YoQ@xtÜöä³7žæ|ù†dÀ¥9É„/ˆK8dJöÉ€ßdí˜dþaóW'<sýÉ;’ìW’+~ɬH².½ùOž·jÛÓ×g.%É~#°áÌž$5iîÊûO]}”]PZ‰dÀ2'·#'Ήݒ”zåáÛ‚$.¼’µ´²¶µwê9`Ä„Ù+6ï;™ñàͧ’Êj$v<“µ±íйGÿáãg-ß´÷Äåû¯?~ýŽdÀ¡9Éú
7sÙÆ=Ç/Ý{•_Ì$k@2`Á7™MûNݽ†Ž±tÃîcï¾Ì/®¨®E2`Å?™c·¾CB§/Y¿ëè…;/>UT!°ãLàèÚÇ/dÚâu;œ¿ý<¯¨¼ª¶É€
¿dZÛ„®ž¾c¦.Z»ãpú¬<=’>ÉZdmBOßÑS®IT§k³ÞëË"°ãÌNèâá#Sª5Z“¬É€ÿdÎL2‰L©ÒdêrõeHš•Ì;(R"U¨ÒH²B$.ÍIæN’‰¥Š$³ü›ìÙM$if²±TŽd`žf%"˜ï¿dçRäñH€d`qÿ$Ë!É’åñÑL²®H4šJÖÑÎÉ€S²o_ržÞ8›¼=.:<@ÔÉ€*c²¦d‡â„F2 ‹$«ûE’½{rýÌÁ„ÕóÃü™díè1~“d¥Ÿ³_;}`Ûªy“ýõêB’Y!ÐbLVYZýèê©ý[WÎ4Š$³G2 È”¬¤àíÃ+©I[bçL9ÐÍ É€&&Yueɧ72NîÛ¼bö„z:ÙÛZ[µD2 Ęìûׯï_>±wÓòYã‡÷ïѹƒm$j
L²âüW÷.ß³qÙÌqÃú!ÐE’ÕVW翼{ñØî
KgŒêÕ½S{$z˜dUE^ܹpt×ú%ÓC‡ôíæˆd@“¡¡¾¶ª¼(ïùíóGv®[<-į«£ -É€&ÙÏrýû,mº:qÍÂ)£}=]„‚¶$YÇšƒ$«a’é´µRìãá"´C2 Ș¬LŸ«ËÔ¨”2 “ÌÙÉ€&S²B’,M¥J"ƒ¼‘(k”,E!“dîHt!X\ãdr©8É€º?“Š(C2°8$‹C2°8$‹C2°8$‹C2°8$û»ôþSóãp|DJ‡8Ê܉\æRîÌ5wcîå:ÆÜ -c“ÊeŒ¹¥0ÆÜ‹aîr¿—{.‰pJQ¢}ßïú~÷5«÷ûœ³^û|~x>þƒçö„8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8Û&kÚÉ`1['ëïÂd°“AœM“ÕV&ó g2X¶ɚuà©Lfb2è°a2£›:ÙøÀЈÈè˜W¦4&ƒ6ë'3Ý<¼:
œ0oUDTt¬:Y6“A‹U“Q&s0Ý=¼:š8õŽ¨Ë±ñ¦´L&ƒ&+'³+î`pq¯Ó¼ËàIÖì<våA|“A‡õ“•r©\·E×!“®ÝuüêÃ×Ié™Ù¿™l˜¬\•z-»
²hÝî×%$§g14Y=™céòUë·ê>lêâõ{N^œü%ë'“A‹M“5hÝcø´%öžºñäÍGu23“¡`ÖNfïèìZa›ž#¦/ݸïôͧoS2˜Ú¬›¬¨}Ig×êÚö9cÙ¦ýgn=KLÉøÎdÐdÃdj4n×{ÔÌ囜½—˜ÊdÐaýde”ɼûŒžµbËÁswâÞ¥~e2h³r²bÊdk6ñî;fvÐÖCçï>ÿI™,‡É ÁêÉœÔÉ||ÇÎ ÚvøÂ½Êd?~1´Ø4™§ï¸9+Ãò&ûÆdÐfËdµ<Û÷778ìÈÅû/>|f2è°v²Neó›ìŸÎÀ¿Ùß“uhª;Y%u2¿¹ÁÛ•É^2tý9YH€_&C¡³y²€àíG™–øc²ð -Wîd)oŸÞ<½oãÒé#z¶iXÍÕÙÑ^k²ÚÊdþ!áL‹¨“}ÏHI|vëÌþMËfŒìÕ¶QuWç’övE5&kÖq€`hx¤2™‰É 'o²ÔĸÛgl^>sTïvkTМÌè¦N6>04"2:æ•)É #w²¯©ïâîœ;¸eŬÑ}¼•ÉÊhLf0ºyxu8aÞªˆ¨èXu²l&ƒ&³9G™ìÓûçwÏÚ4{L_ï&5+*“Ëg²"Êd£»‡WçAç¯Þu96Þ”–ÉdЦLöë‡2Ù‹{oš3Ö×GÌ©€ÉìŠ;\Üë4ï2xÒ‚5;]yŸÄdГ;Ù·¼ÉÂVÎçëã©=Y)—Êu[t2yáÚ]ǯ>|”ž™ý›É %o²Ï^Ü¿x$,xî¸~í=kiOV®J½–݆NY´n÷‰k’Ó³˜:ò›¬¬S‰‚&s,]¾jýV݇M]¼~ÏÉë’¿dýd2hûïd/•ɶÏõS'«¤3YƒÖ=†O[²aï©OÞ|T'33´X7™½£³kµ†mzŽ˜¾tã¾Ó7Ÿ¾MÉ`2èùÿdG·hOVÔkõFm{œ±lÓþ3·ž%¦d|g2è°z² -5·ë=jæòÍÎÞŽKLe2è²v²2ÊdÞ}FÏZ±åà¹;qïR¿2ôüo²˜KLVL™¬bÍ&Þ}ÇÌÚzèüÝçï?)“å04Y9™“:™ïØ9AÛ_¸÷B™ìÇ/&ƒ6&óôñ7geXÞdߘz¬Ÿ¬–gû~ãæ‡¹xÿŇÏL]ÖMV©l¥|&û§#ðïfÛd~sƒ·+“½d2XÀ†Éš2¬ò÷dšêOÖ¡¿_@Èö£—˜ùs² -žÌÞÑÙµZÃ6=GL_ºqßé›Oߦd0tåN–‘òöéÍÓû6.>¢g›†Õ\í󙬨}Ig×êÚö9cÙ¦ýgn=KLÉøÎdУNö=#%ñÙ3û7-›1²WÛFÕ]KÚÛͲ -5·ë=jæòÍÎÞŽKLe2èË›,51îöÙ›—ÏÕ»]ã -ž¬Œ2™wŸÑ³Vl9xîNܻԯL]¹“}M}wçÜÁ-+fîãLV&ÿÉŠ)“U¬Ùħï˜ÙA[¿ûüý'e²&ƒ6³9G™ìÓûçwÏÚ4{L_ï&5+*“Ëw2'e2Oß±ÿa¿þé¾â8ާs¿_×u/®Ë¸s/eÜ^WuTô^Ú©ãÒLÓÒpÝ®3å^ISieZ_–¥]Ûà®é–ÆX¹ºX›nÆ%[LŒkë–Rt³öv1ELÅ—Òdç|¨¤s?÷£?.y?þ†gÞçuôõ&³eE¶´‘ -(²•%™ÅÜR_¡ÏÒ¨qd\²Èb_e”F§¯4nDÏ% €žK"²Q‹ÙT_©×iÔJòȘ\Š,Yg¨2¶v‘¡M†NdH¡<ž®Ï%ŽÌˆ#‹RúÚ,$*ùèó‘áÊ -bj¹ÖxõrÍù3'ò2Ą˥b#Ófdt6Oè!Û±ûuMú;ÇO–}ðÑÇ5uõÆO°Ïh¬«¾t®âtq^Vjœj§¿7ÚýLô¹´ËÑÙ]²'6%ýX^щSïŸ-¯¬€JeEyYiIqANfjBt˜\†^K6ƒ¶i’¡åï@crœ\=¥A¡ªØ¤ƒoçä½WX¤7Å -?o‘3—ec÷¯2–£@äå¹/NóÖ¡ôm–Nw -º,mæ‘é) 1ª0…¿D,ćló$[{/Ñ)º{û*Ã"£cÞˆ3I£I€’&)1!nÿ^UøN¹ŸÄÃ…¿vÈlDFœ2.ªìeŸíAÁ¡a‘{Ôê( -0 -q -/GS0 gs -613 0 0 588 94 7 cm -/Im0 Do -Q -
endstream
endobj
56 0 obj
<</CS 11 0 R/I false/K false/S/Transparency/Type/Group>>
endobj
57 0 obj
<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 613>>/Filter/FlateDecode/Height 588/Intent/RelativeColorimetric/Length 26318/Name/X/Subtype/Image/Type/XObject/Width 613>>stream
-H‰ì—y8ÕéÀçÞæVÄ9ö}—c©c_"»ƒ²%2QY²¥ÒŒ[3’"’†RdIE&×Ò‘’d9öýX²tuÿºïû;‹ƒšgžûܹJ¿Ï_ç÷žóÇ9çù<Ÿïûýæ”Êßþ$ëý=Q¾Hèúû‚ª†òß@çÖ&„o?ùíMô¶÷—Gùü¡ù…¸õÀf2[VC9‡¡èFSm½ÊçU0$]À®-[¶ne```ddÜöqÀ;Œ[·Bã×Ȧ¡¢¡|zÁ@¼ ^ŒÛ˜˜˜1,–ºä‹Å`˜™™€nÐ5¨4
e
«ƒ~1c°¬lìœ\ÜÜ<Þ• gÜÜ\\œìl¬,XE5hhëýÓP>–
ƒ -†øÅÁÉÍÃÇ/ ($,"*&&&¾p**"",$(ÀÇË]ƒªÓ h h¨g((†Á„Qcae‡~ ‰ˆm—”’‘•“WÀá?§ //+#-)!.&"$ÈTƒ¦a˜)¢ ¡ž}õ#
ÛÆ -ãå~IHÉÊã”Tvªªkhjiëèè®EGG[[KS]
¿SE '/+-!.*LãædgEІz†B‹4ILT\RF§¼SMSGÏÀÐØÔÌb¥•ÕÞµXYYî±0751Ú¯«©†WQR€¦‰Ñ8ØX°Ì«<[ïß‹òg9b aÌ0>A(˜âU
]»MÌ-¿³ßçäìzÀí »»»ÇJÀÉA·®.Nûìl÷î171Ô×ÕRÇ«(ÊËHŠ‹òñÀ Q=ƒ÷3T³¯
²bäˆ1aX€a aÛ¥åUT5u
ŒÍ,mì÷»¸y|ï}Ô×ïx@PPpàÄ2ð18((ð¸¿ï±#^žîn.Žö¶{-L
õu4TUå¤%D…øy¸è=C§æ×M11,˜’|B¢2òJx
}#s+Û}În‡¼Žùž8öãÙÈ¨è˜Ø¸sk‰‹‰Žú)"ü‡Ó¡!þǼ=Ý]ím,ÍŒ€hxeI1a~^²g[Ñœ}]P£DŒ‹W@d»´‚2^SÏÐÔÒÖÁù ç¿À§ŒŒ9w>)9%õJZúÕŒŒŒÌ•€“«éiWRS’NLˆ‹Ž;|ÜÇÛÓÍÙÁÖÒÔPOKU'=s“ÃDŸ³õþPþjèòrpó‰IÉ)AÃÌ÷Ú9ºÁ‚BÏDDÇ'&_JËȺ‘{ëö‚»……E€âeàcaáÝ‚üÛ·r;–‘–šœ”è{ÄÓÍÉÞÚÂh—¶š -NFBLˆì0g¨f_4Å9ÉÉ"&ƒÛ¡®kh¶×ÞÙý°O -p³c™‘ -ò°³ 1û⡌J°T‚ÛÈ^ÇØÚñßÉÈó©YyP1˜“Ãã¤p£F™{”ÖÌôirb||lttt„xŸ˜œ$MMÏ@Ùæ¡j´ªQ=÷³ñ‘bçëuO fÏ…‡sßoe¤ƒW -¡¶½C%í€FÚoZmm¬,ÎNà:›¿–çHˆxéé`ŽÔV…ʘ3ãúÉ<¥¡Ê³,lœ|b2PÙ¸ù†Å¥æ–Õ4wáÆ¦ -F^YÛ -ˆÉÞF˜Ú{D&e– ›:qÒ -X”Tû÷Q‡m}[[Yš›ž$Œâú»±u5U¥Eù9™éi)ï߯ÇÅÆÆÄļy^bcãâ“’ß§¥gfç–”VTÕÔ64C¤
&H3 -ð÷÷ó¥ÅÏÏÿe@PpHXDdtlBRJÚǬ¼ÂO_jj[;ºûp# -måg°š}7“€ëj‚Ê,2ÐÓÁÔ -*°ƒ¨ÆvàƒWôÌ¡›"Ž@„U–dHŽ~éƒrwq°±4{ü©¯§sOqWC]]uu»Í{Ú÷õô?1·²±wv{îå—”ú1§°ôsu]sG÷ -7d¤$ÅÅDE® Âo„¯]—”’¹!S鎊:B[WßÐÄÌÊÎÉÕóÅËàð7 )é9EåèºlßÐTgÀÎv÷(?~ü€ËlDÄ6T|ˆõv¶@jÝ‘»ÊËëÿtý?Éu0ÍJ!É›êzOìQ¯Þ¤æWÖwâˆ3K`Tþø ;88DŒDîÃ6a*KrÓßžöû—›£¹ ò6BMð%-).zMHà -ÿåK|¼<<ÜGáááåã»t™ÿª€ 0€íº´¬¼âmuM=$¨4['7”O`XT|rznqEMC[÷Àèøô<™z5P(»ÐÏŽw7W—d&†û¹>5b&.ÈG×ÿÚ¬ŒY)¥¨¡oæè—^TÕÔ
ŸÊí=Pc ¿ö)àd-Ï“C½í
Õå…Yï¢Bü½ÜÍÜ×TWV’—•’¼Ê‰—ç"'û…llçÂÆÆvƒ“ë"7ß%þ« -JwÔÚzMì]ž{„FŧdäúRÛŒí&€«¹úmkÔvÁù)|¦<'9*ÀÈ™‚¤¤ÿŒt1;Á¡1v–åÂEþkÒJsça %5}£S‡§Flwkƒ†X=º4ÿã»ØðÀN€0}„ê-Y)q!À7'û…ó¬çXX˜™™˜Î3˹s¬çmœ\ -Àx ¿Ø0^,,ÌÌL0[¿ô‰™™¸!kˆH‚HCÐvªk뙑m¹8u&$<:î~FNQÎëfkkk+ØÊ|Ùö¢4'5ö· 7[3]5829áÈd(Û„C7Æ/*¨®¿ßþØék ™UM=PÇÞCûŒˆ¡2övz´¿³±ºäIFÒí¨Ë§=ݬ÷“ô´Ôˆò2Râ"‚ü¼Ü(À¶ƒ/ÄkëÖŸÐüë/ƒ}ü Ó†SCÒ8¹ Ò -ªš{F^Ñ-/¢rÝö¢,7=!:ô¬ÏQ2iº²œ$=Äþ¹WQAœmÛ[“_Xœ -òr±ãÄþ©ûêeÈÜLhk"f°4Uµ
öp>á{>âvJÖӪƮÁñX™ láíôHosUAÆÝ«Á>®Ö$-e‚(cb,ÌÌËv^i%Mc+ïàÈ»™…Õ-}c3ïÀÄØÇUÊ;X•õåù™÷n@Œ±·0†MIâãbg]'ö]^‡ÞGgÝLVi×ncû#>f÷2òžÕµ¿ÅVæeaöÕhoKuaÆÝÈ`o+cM%i^Ží,e<tcÂRІ–ÎÞA°+«[_޽~·´F56?3ö²¶4'íÎÕ?ˆ13=
´)ù¹9X·}ObÔnÁ·&ÎLTjQCÏÌÚÙÃ7$2îAvqMKïȺ2—(‹s¯Fû²øÈ ogKC
E)a†²
êaÉÎ#$© n@vò -Œ€>ÆÆ‘1¬Ž¼Ÿƒ5Ôò¼(+9&<èäQ{#Ui1A^(c,Ìß™þH:3v.^A1‚‚ªŽ -³À°[I«šº‡&ßP•ÍŒ²‚Œøˆ@/'²º‚¤û6FùßÐÁ±qJÈ«é™;zž K/¨jcË4c³SÃÝM•™÷¢/x¹Ø1&+!̇ÊvQ~gbØ3©ÌX¶±rpC5“U†0³qñü÷¥ë y
ƒ¯çÑ‘‰+«ÊO?ãéh®§&/!ÈÍÆP¶‘ƒ–l\ârªºû<ÂbÓòªšûÆÖ-¾êj(ÏK -ñ=~È’´bLnJê¦üÄð—bÌàÒÄv¦4„™1ÙÑýôùÈ;iOÊê:Ö•ö6Wæ¥Å†x8ìÓU•àbcœ˜7È–\üb²*»ÍìÜýCcRs+š{¡Q-/¾ì¨+ËI>yÄn¿&QN’cø¦üqEÌðÉaFÔ4ØwÐÍ'0üöƒìÒíýã4eÐþ›*rScBýÝíÌv«ÈŠñ3N̼ô³rò‰ÊuLmú^º™’SÞØ3:Cëc`lb ãEivJLØYo×fº» b‚<?6ÆèïÝBÛ™<bÅ]{Lm\¼Î\¹•ü¸¤öKe#=å9)7/ùµ5Ñ&Dø8壆vXŠH+i‘lÜN]ˆ¾Ÿ]ÖÐ=23O7öfb ½¶äÑý›¡žÎV°*å¥à¨üñ1F{1¾3Q˜ñ‹HîØ©clyè„ÿåIYÅ5mTe”ÅÙéá®ú²Ç÷£/œ:lm¬©$˜ŒZ¶C?,¥5Œ¬\|Î]K|TR×5<=OYûˆ[x3Ñß^[œ•tã’¿‡#ÙHKENBŽÊˆ1ê›éaÆÉ+$+ÓÐÂá¸ßÅèĬ¢š¶—˜²%ÊÔÈκ’¬Äkç|\,
é'&#Ê~ø`¥?,wX8ý™ðGqmÇÐÔeuÝX[MQVbôE_ws
elUnPŒÑŸ‡7¬L%uýýÿe¿Ìÿ¡Þ÷8~=î=-”eÈšAe‹l)FRÉp¤²dZ[mD¡IY -e)ÂQ¨)!¡²$JTvYÆ3côÜ÷ç33tº?Ýsï÷õ|>Ïëóz=_.^áqiys€dMéÝëÑÁ~{í-´Èþ‰Âœsa èÇÃÒŽæsúRrΣꦎÞ&gúûËK‹ðr±µ4ÑÕPAU9o1&88/Ìpeªë[P=ÂþLE.ã5æ$“ŽŽ^õ0'9êLLŠ†Ëæ\< CІåÁ‰·K^¼ýØ3Ì`sÿæ±Ô?Ãü=©F:êÊrÒ¨*ç/ÆøGçÍ̥ˤä”Ô´(TgÿŸ\66ÔýáMeIöµ‹A^ÎÛÍ -<6ßÇÿßeâ’$²¦9Ïeiùkš:z¾Ë&£Ÿ[ëžþ• -ð¿ÙX›À²9.K ©+56ô‡Ä¦”½jý<06 ›æ²Ã…‚Ƕ›h’ùÅ—ü²0<Æw3’‚*¸l;rY\Zþ“—ÍŸz‡Ç'Àe#ýhbæÝˆ>ãG³³ÀX&ޱl¾þÿ"\–â’²Ê -v™vdY@øåô‚²Ú–ξä241›ªå$Ež8èbc¦·JI–(Ì9ŠEP–Šêº¶9z^¼vûAU#–\ð›1ÜÛÑTÃëJÇd–Çø¿x©Àe°1ÏÅß*,¯ƒ@e€ËÐÄ|[Yœ•p>Àc÷Öõ:j -2DaÎøe)¯ªe¼ÙÁíXx|Æýg¯?ð†åw.›9Òû©¹æq~â±-€YùwaüŸqlL¯À ™÷+Ú¾ò'æ×¶†ŠÂ›€eûí-4¡0%ˆÂœ#!ê_´—%ÅŽæ“VP^÷þëËéï\s´¯³ùå“ü´8´+±Çäù›ïYù“~t™!…êr0(âZvqå›Ýßèà2€ÿw¯–öq¥šë¯R& -s΄ž—åÚ
ÖNÞ'¢’sK_¶t
Ð1ôs&Fû»ÞÕ–¤_ÿOÍ÷ÑÒ¬ËÈZFv®>§¢’sV7uô3&Y“Œ‘>À²‡w#=·™êÎæ|Ÿû_ˆú‹Ã²Deù›ÿ¹„¬’}<蟚üÜZW^x3þ\€§“Í‚öجËH -dmcKû½~g¢oä=®}×50Ê—–½y^”vôÀT˜r’⋉(¾xe¹œ¤´JßÜ–æ›^XÑÐÞlzŠ5ŽAæ^Æ•óǽœm(?ðØ‚|žËÄ—“ÕtL¬ K/|Zßöuˆ>ÁbMЇ¾¾¯//H>㳇j¦§¡D"Ø.Ä£~iy²Žé6G/(Ë»k[?޳¦¦Ñ°üÖýáÍó⬫ƒ¼]¨Ãî±—IÊ*©¯5ݺÛ=à|BVqåÛ¨0Ù,À²®–šG9P˜»·˜h“å¥ ö¾Ô¯²ÆpÓŽGï@Y6}ê›@ãÀ°ìh¬zp'1òäï®¶†Zäî±Y—É)¯Ò7Ûîì}"2)çQMKgÿ(“Åf1àBo+‹2.‡Ù÷«…Áj‚ýçB˜ú%dÔ×n´Ùãs&&í¯§
í=ÃL6w ¬¿³¹¦47åÓ¾´_-´É -¤î1Þ·+d®1 ØÒ|ÏĤ”×½‡Âœd³Ë¾¶Õ—çßøãÔAgë
ÀþÒûY8ÈàÛ¯Ô4¶Úé~übbNéËw¨,ÁcS,úà—ÖWeù©±!‡÷ïØl¢£¦HZ.¾À=†þ
ÜiÉ2iyU˜2ÎañEÏ¡0G,6{bæÃÛWÏû»9XQ‘“$¢LÈÂA¶LFQCÏÌ–vèlܢʷhY -€¬ ÿÖå°£n;·¬×UW’•\øÃ…‰¶ŒŒ¢š.`™g`Dâ(Ì®± 6‡ðñͳ{é±Á¾®6ת+ÊQ&\Í™–É–ÝžAQ)yeumxY¢²íëh|Q’}õÂqÇmô4”EÂc|—!øGXFÝãs: -³¾ûÛ8.Ì!ˆçǹIÇ=vZk®$¢LÈš 2}s»½‡Ãâ³Jªš»èhY¢²ìjyYš›uò ‹ùºÕ*rRðéEá=xð°LÓÐÒ~ÿ‘°øÌâÊFHh&›ÃžíÿÔøØÿì!ÕLˆ2!ëÇ sô:qéFÁÓ†=#~Y"¤Åûíµ³0Ô\¹B{LžCŒ÷{¤È:ëqa&å–Ö¶~¤Or8,Æ0\¬,/%*Ès— Ê“ M?Ù¾#aW²Ô´ð©—åÛÊ¢Œøð£nVÆ0,e–-Y„<& -Ï¿ÏÒå$%
(LWßàØôŠ×zG Ê8“ô®æª’ÌøÐC4[ˆ2˜‹ÿõO‘¸–( -¿ŸÈ¼N¢ {ý±—Gý¸,kå$Fz:n3ÕU‡a ì²ðŒ/–IÉÔ4²ÜávìÜÕì‡ÕÀþ(ÊØÌ‘žö†òüëQA»¬Œ4Ud—/%úRXƒ‡QT×3·"»’ý°æÝç!Dý\s¸»Ê25úŒ+Õ\†~Ññ˜ 0e`aZ;yÃÊ/¯oïf°P”
v5WC”=SWM^ -®&271Á;@¥Èªh[íò<Á²>dS“cˆŽ‹3ãÃŽØai@&%! -ÃrVü„…¹Žb·ïp(°USçÀØl”å¥Dº;X®V&-#Ð_HBϰX\Z^míF*íPh|Ödã(ÈØŒ¡/µ¥¹I¨,·®×QC@&R›)̪<ƒ"SòÊêÚº‡l~”UgÄ…øºX›ê¨®Ú¡»‰Žx…BR^mh¹Ó=0òz>LKLd\ þÞ¯+ -Ócƒ}qY*É" )ͦ¢†ž•æ—Qô‚eS8ÊêžÜMºàÀž¢¯¡(#Aô¥p„úD\r…ªŽ©µ‹oH\fIZNaê¯~p,Å‹\¡ˆñ.ˆØóN÷ãÉwŸ (c²§ÐÀìlª¼ŸsÊÛq‹1B¢/…"Ü–€ýúöü/&Ý-0™àp¹læpPþõK'½`YŠbY"á(“V -Cø 0öoqô>só~%zÖw -ÿs þË¡‡÷ÚQÖVÁ²D°¿ÊCK‡ßP”á„£l¬¿ãMEÁõ(@ÿM«”ˆ¾Žp™HÉ“uû‡'Ü)}º„;ÅfÀ7bIŽôصÅDKU°,çûÄÿµ0ûKü›ý2
‡ºÝãøé‘l3Ö±ïadß²ÄÊV3²FÙE‰Tö,i±>vɾ"TH˜“6Y’–#‘S$E$Œ-êyuî{hy®žCó\3ÓU×ù¼óÂÌÿÏ÷óýýnpµ‘Uß«,§êZgïЛÉiâäØË¾{ÍÕ91®xéÿÏKê°nü8ø%tÌ}O¤—5´=[ñ´¼§ƒp!;&ÐÃÊHÖbãÏXdÿ ¥V™ -ï›SÝ|¯ïåøÙpÿƒ[µÅ)>fz`ëG±23¬ÿù62ȲI`+“Õ0´òŠÏ»ßrlr®þ=íåÑ~{Ít$~åûåJª~[áÛ¼Q°‘‘Ž_NÓØÖ;,©¸î6ií'~*²s1î»
5äÄ@‘ŒîÓÃýè##‹/[™’žÅ>¿èØ×£ÓÓ“ãÃO»®WçÆ¸á±¿ò¼\‰d=Ýg~£àIƒDRQ×|¯_tfySG¸xI¯‡`#K‰<äh®§,%62F2Ú:ð7ùö€—]ÃhÛx…&\¾ù ÿÕøÔôÔÄÈóG-uÅ`^Ú|5/2‰Öž -ÐÄ -BÇ“¡±IÒ´ìp³¦(9ÜÇÁ\_UV\€›“
‰`!)@+ÈaÃ×Sà/ΘÉÉ'ŽÑ4²öIÈ¿tã~ÿð—y¹|¿Ô€ÕÉİ -}çD… ÁŒAǘ¬ìœ\Ü<<¼ -ÐÊ -¡2'.ØËÞÜ@CAFRTXP€ŸÀM+ÈÂ¶ŠŸ;Û`—ÓáèŒóà~98únš8çesun\ »•¡¦¼„ ©²ijÀ— ’BHGZ -)2˜1$;ŠWPTBj£,F€ÁÈÉÊl”–’B£Ñ’Ô––‘STÓ1Âí=–WÝÜÙ÷r|jf–89:ØÓÞt!;.ä€#ÎHW]##–”ˆÐÊ - -¤6AÁ!Ç#OÆ%gUÖßììy7³°¸ø~ž8ñúùã»7ê/e%ÇŒ<pìè?_š@...ÎNûVS -´¶0‡æ¦;
t5”1h~.6FŠT=#‚ƒO£ n<>Á§’Îæ—”•WT”Ÿ/+-).*,,(ȧ.…E%¥åU5
×[»zž
ƒS¿ôñã‡EPe#ƒ};n®\ºpþŸÅ…àIòrs²ÏeefÐÈ -gºMW}“´'V…B†ä@+ê˜Øí8™’[Z]{µ‰@ 456Ô_©««¡:µuõ
MÍ·Zï=êx569»°ôñ?>.½Ÿ=ø´»«ív3¡¡¾<ÉåK—.VWUV”ÓÊ -OÌ9_ÓtóNû]@G{[ë––ÛÔ§åNkÛÙ/都Ò4Œ÷ÐAzšˆÒ5¨¨("E†AFÄ‚k»°2²ÂŒe„eí aYEG‘QÀCd%´„%„„ôÐq¿ïÞ ¸ê!ç,yþŽææò{Ê›-.Ã×’š©„±¾>@E§RHµø²bl~^.x’¬¬×¯33ÒÓRÅè -òQƒA§w -ªn±~ -éK£¥¾,÷ÕƒÈÐÀý›ÝVb¬Ìu5T@˜Áe6jg~Д†&sæ¦ôؼÛ70äbäß^dæ—V“Z;X¼®^IMM
ö÷¾$°Iw®†Ý³ÉÍq‘ù=-f"t&ºÆdd†nJÒ”N‹¸ùàÉï9Øò2ÂXOŸ$Ȧ¦¾°;šëÊòRݼrúèžÍîNö¶¦†ºšªÓä„Àç0CªÄØðM¹ -mÊ3aÑ÷¿Ì|[‚¯oj£1&lJ -½/;©äªâœ—o\Øç³ÞÅccn¬¯>Zg¢U ¿†ŽÒ”k<¶|çrñúíøgio -ËkHÍí¶„±)-a”Ñ[ð…Y/Þû9ðÐ/·Uöó-ÍŒ¾‚)÷ùÎD«¬15-=pSb–9»{ƒ¦ü 6eRJvA)ØÔÖÁäð%ŒMi
"QÆcÑšë+°Y/ãoE„?²gëú5+Í›cb £¡ª:ó3a†2¦¨¬bÌÂvÉ*×
ÈM)lÊâÊ:r“Ít÷"ŒI ›ªB£ŒÛÙN”e'?޼|ìÐNï¯W/[hmn¬§>| -RÖßÛÓÅcw‚0«(ÊM{û:8 -)“—…ëd2ò ÈÌæ-sÝ´ïØ™ˆÛ“³±°)Û›RÒ”
k®P™H˜µ6ÖáKÞ êRHàá^®+í¬Í -´¥¬‚ж‘ÆÉs§pXÌã”7Eøú‘M)AL¢‘fŒÿ²_çßPÿ{ -R„©O™„¼†¡Õ.¿°KY…•z>0ÆÁôçýf˜²Ž¦êÒ?2.†Úkc¢¥(M$ O;d—o=ÓÑûydõ ÿƒX - ƒ8 -C6Œ!+!§œ;êaI³-`†-!¥•t6Ø{=—B.©m¡Ð†ÄA“×eKMInJt‡™¶¢4‘&2~¢´¢¶™GPtrnI
†ì ƒðÇD6@y_ó$'9:ÈC&%<™°”¢–év÷À¨äœ'5ï?
-¹¤¶…Bdî0d#ƒÝmõOóÓâŽ{ïØ¬«"#2?QZQÛÌÎ#(:%·¤CöAx›ø>Ρu·Ö•å]=æå¸i2I„0™°†Ì=(:9çIÍûO€Â¥µ¶”œ¼ßa£Ž‰Hà]¼h2-ÓíîQ€â8Ù0ÒR[BN9wÔÓ~ƒŽ’4‘°![0ÙJ„Ì-0*)çq5 ƒ8 -!û‚!«)ÉM‰ò°3ÓV”&ò³Efbë™tAÆD6@y_ó$'9:ÈC&%<†LÓÄÖ5 2!kžDÊ \±}b"‹ -tßnªÅÙ2IMWÿˆÄ;ůš»ú„¿iÈ’¢Ý²•ó [cl³Ï?üÙ ƒp÷YõE¶Cf´mï‘ð„ÛªÞ!dc_„³)dï&E¸Ùš°AÆ…I¬Xm´uÏá³Wo=|Ùô±!ûÈ |ÍA¦É™B¶Þz÷¡3W²¼hêì£2w“Èš²ÄÈ -rRãÂ<˜:…LÒÕV•ÌÍ—Íå@20&D²~©¸UX!ÈN‰
õwg2h²>J¦õG2{7ßHÆ%ûF$««(ÊNŽÙ¹aÅÂY4ŠáÉôMÌ&ËDÉš&ƒe -øÜhMÉf/Z¹q×Án<xÑÞE$‚d@#üd$#S+;gïàÈÄŒüÒšÆö.Ù€’?“5£d™Üè"™¹ºdTK['¯ ˆ„ô¼’ê†6‰LÉ -Áô‹KÍT -EbH°Œ$û¢Lv>)j‡ëUÉ´P2}2…Æ`ºû‡Æ¦d*„bi?$P²ï_Q²7Ïî];—t`ûz"Ù•É)´YWlØ“œ]TQG$ûÉ€fÃÃ?P²ž÷MOï^={lÿ¶u.ógLAÉtT%3± ’±c’³ŠÊëZĽàIÖ×ÓÑôäΕ3G÷m]»%3VŸÌa¹›ÃË*DÉ:!À¢LÖÝñúñí˧ìݲfé¼éfê“Y£d,É -™¤«
ÉÀßB$ë—Š[…‚ì”ØPw&ƒF!ë£dZ*’™ÉB¢¹™(Y3$xP²oD²ºŠ¢ìä˜V,œE£ªL¦g8IU2X4IÖ+n©+/ÊJŽaÉ,LÔ'›iïêu<óúýçÍ>A2€C™¬%+ÌâqØ~ËFO¶ÀÕgGTÒye²/`ø-ŸÇa¡dÖj“M ’¹¬ß~ éܵ{ÏÞ d_¿C2 ~2”lÊŒù.ë¶í?vöêݧMï{P²hò{2.‡å;j2c”lÙÚûŽž¹rçISGO$þ›ÌÍ~´dfÓç-]³eï‘Ó—o?~ÝÑ
É -øÜèÑ’ië’È:ƒé—š#¨ŠÄàÀM¦…’é“)4ÓÝ?46%[P!lKû!Ðìg²f”,“B$3W›ÌBû‡]:Šùà -’¹H²º_$Ù»'×ÏLX=?ÌŸIÖÉ€ƒá7IVú9ûñµÓ¶š7ÙP¯.$™K²±TŽd`6c²ÊÒ‚ìGWOíߺrî¤Q$™=[2Q ’/¦d%o^IMÚ;gâÈnNH41ɪ+K>½yqrßæ³'ŒÐÓÉÞÖÚª%’%Ædß¿~|}ÿò‰½›–Ï?¼ÎlÛ Pch`’翺wéøžËfŽÖÉ€.’¬¶º¢8ÿåÝ‹ÇvoX:cìP¯îÚÛ˜‘ìæ3$³0ɪ*Š>¼¸sáè®õK¦‡éÛÍÉ€&CC}mUyQÞóÛçì\·xZˆ_WG’E¦dú¼¬[é‡w¬]4uŒ¯§«P`Óºk²xyÊ9$31É~–ëßgiÓÕ‰kNíëé"´%ÉZ ÐA’Õ0ÉtZZ)‹‰ -öñpÚý=YW&Yt¼<™$ËA20‡1Y™>W—©Q)e&™³Ãß’YÛul*–+S²B’,M¥J"ƒ¼9’õ„GÇmO>{ãiΗoHÜ%KQHÅ$™;G²Ááâ™’ý@2àÄ/Y;&™ØüÕ Ï\òŽ$ûU‡dÀ¡q2¹TÁ–ÌŠ$ëÒkÿäy«¶8}íqöçR’ì7’»?“ŠX“Ù“d£&Í]¹uÿ©«²J+‘8ñMæä6päÄ9±[’R¯<|[P‚dÀG²–VÖ¶öN=Œ˜0{Åæ}'3¼ùTRYdÀ…W²6¶:÷è?|ü¬å›öž¸|ÿõǯߑ8ñOÖoظ™Ë6î9~éÞ«üb&Y’+~ÉlÚwêî5t쌥v»x÷e~qEu-’¾É»õ:}Éú]G/Üyñ¡¨¢ -É€ÏdG×>~!Ó¯ÛyäüíçyEåUµõHìø$kÕÚF tõô3uÑÚ‡Óoeå鑸ý›ìÙM®d-H²¶¡‹§ïè)×$ªÓµYïõå?‘¸ðLf'tñð ŽŠ‘)ÕŽIVƒdÀo2g&™D¦Ti2u¹ú2$Nÿ%;—"7+™wP¤DªP¥‘d…HÜø's'ÉÄRE -’™þI–C’%Ë㣙d]‘h24•¬£5{²±TŽd`&S²o_ržÞ8›¼=.:<@Ô›+™(É€c²¦d‡â„F2 ‹$«ûE’½{rýÌÁ„ÕóÃü™díè1~“d¥Ÿ³_;}`Ûªy“ýõêB’Y!ÐbLVYZýèê©ý[WÎ4Š$³G2 È”¬¤àíÃ+©I[bçL9ÐÍ É€&&Yueɧ72NîÛ¼bö„z:ÙÛZ[µD2 Ęìûׯï_>±wÓòYã‡÷ïѹƒm$j
L²âüW÷.ß³qÙÌqÃú!ÐE’ÕVW翼{ñØî
KgŒêÕ½S{$z˜dUE^ܹpt×ú%ÓC‡ôíæˆd@“¡¡¾¶ª¼(ïùíóGv®[<-į«£ -É€&ÙÏrýû,mº:qÍÂ)£}=]„‚¶$ÙÿC2h’¬†I¦ÓjÔJYLT°‡‹ÐÉ€"c²2}®.S£RÊ$L2g3“Ý|†d`S²B’,M¥J"ƒ¼‘(k”,E!“dîHt57Y¼<å’Y'“KÅHÔý™,PÄ•¬+“,:^žL’å pã™ÌÚ®cSɰX4#YoQ@xtÜöä³7žæ|ù†dÀ¥9É„/ˆK8dJöÉ€ßdí˜dþaóW'<sýÉ;’ìW’+~ɬH².½ùOž·jÛÓ×g.%É~#°áÌž$5iîÊûO]}”]PZ‰dÀ2'·#'Ήݒ”zåáÛ‚$.¼’µ´²¶µwê9`Ä„Ù+6ï;™ñàͧ’Êj$v<“µ±íйGÿáãg-ß´÷Äåû¯?~ýŽdÀ¡9Éú
7sÙÆ=Ç/Ý{•_Ì$k@2`Á7™MûNݽ†Ž±tÃîcï¾Ì/®¨®E2`Å?™c·¾CB§/Y¿ëè…;/>UT!°ãLàèÚÇ/dÚâu;œ¿ý<¯¨¼ª¶É€
¿dZÛ„®ž¾c¦.Z»ãpú¬<=’>ÉZdmBOßÑS®IT§k³ÞëË"°ãÌNèâá#Sª5Z“¬É€ÿdÎL2‰L©ÒdêrõeHš•Ì;(R"U¨ÒH²B$.ÍIæN’‰¥Š$³ü›ìÙM$if²±TŽd`žf%"˜ï¿dçRäñH€d`qÿ$Ë!É’åñÑL²®H4šJÖÑÎÉ€S²o_ržÞ8›¼=.:<@ÔÉ€*c²¦d‡â„F2 ‹$«ûE’½{rýÌÁ„ÕóÃü™díè1~“d¥Ÿ³_;}`Ûªy“ýõêB’Y!ÐbLVYZýèê©ý[WÎ4Š$³G2 È”¬¤àíÃ+©I[bçL9ÐÍ É€&&Yueɧ72NîÛ¼bö„z:ÙÛZ[µD2 Ęìûׯï_>±wÓòYã‡÷ïѹƒm$j
L²âüW÷.ß³qÙÌqÃú!ÐE’ÕVW翼{ñØî
KgŒêÕ½S{$z˜dUE^ܹpt×ú%ÓC‡ôíæˆd@“¡¡¾¶ª¼(ïùíóGv®[<-į«£ -É€&ÙÏrýû,mº:qÍÂ)£}=]„‚¶$YÇšƒ$«a’é´µRìãá"´C2 Ș¬LŸ«ËÔ¨”2 “ÌÙÉ€&S²B’,M¥J"ƒ¼‘(k”,E!“dîHt!X\ãdr©8É€º?“Š(C2°8$‹C2°8$‹C2°8$‹C2°8$û»ôþSóãp|DJ‡8Ê܉\æRîÌ5wcîå:ÆÜ -c“ÊeŒ¹¥0ÆÜ‹aîr¿—{.‰pJQ¢}ßïú~÷5«÷ûœ³^û|~x>þƒçö„8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8&ƒ8Û&kÚÉ`1['ëïÂd°“AœM“ÕV&ó g2X¶ɚuà©Lfb2è°a2£›:ÙøÀЈÈè˜W¦4&ƒ6ë'3Ý<¼:
œ0oUDTt¬:Y6“A‹U“Q&s0Ý=¼:š8õŽ¨Ë±ñ¦´L&ƒ&+'³+î`pq¯Ó¼ËàIÖì<våA|“A‡õ“•r©\·E×!“®ÝuüêÃ×Ié™Ù¿™l˜¬\•z-»
²hÝî×%$§g14Y=™céòUë·ê>lêâõ{N^œü%ë'“A‹M“5hÝcø´%öžºñäÍGu23“¡`ÖNfïèìZa›ž#¦/ݸïôͧoS2˜Ú¬›¬¨}Ig×êÚö9cÙ¦ýgn=KLÉøÎdÐdÃdj4n×{ÔÌ囜½—˜ÊdÐaýde”ɼûŒžµbËÁswâÞ¥~e2h³r²bÊdk6ñî;fvÐÖCçï>ÿI™,‡É ÁêÉœÔÉ||ÇÎ ÚvøÂ½Êd?~1´Ø4™§ï¸9+Ãò&ûÆdÐfËdµ<Û÷778ìÈÅû/>|f2è°v²Neó›ìŸÎÀ¿Ùß“uhª;Y%u2¿¹ÁÛ•É^2tý9YH€_&C¡³y²€àíG™–øc²ð -Wîd)oŸÞ<½oãÒé#z¶iXÍÕÙÑ^k²ÚÊdþ!áL‹¨“}ÏHI|vëÌþMËfŒìÕ¶QuWç’övE5&kÖq€`hx¤2™‰É 'o²ÔĸÛgl^>sTïvkTМÌè¦N6>04"2:æ•)É #w²¯©ïâîœ;¸eŬÑ}¼•ÉÊhLf0ºyxu8aÞªˆ¨èXu²l&ƒ&³9G™ìÓûçwÏÚ4{L_ï&5+*“Ëg²"Êd£»‡WçAç¯Þu96Þ”–ÉdЦLöë‡2Ù‹{oš3Ö×GÌ©€ÉìŠ;\Üë4ï2xÒ‚5;]yŸÄdГ;Ù·¼ÉÂVÎçëã©=Y)—Êu[t2yáÚ]ǯ>|”ž™ý›É %o²Ï^Ü¿x$,xî¸~í=kiOV®J½–݆NY´n÷‰k’Ó³˜:ò›¬¬S‰‚&s,]¾jýV݇M]¼~ÏÉë’¿dýd2hûïd/•ɶÏõS'«¤3YƒÖ=†O[²aï©OÞ|T'33´X7™½£³kµ†mzŽ˜¾tã¾Ó7Ÿ¾MÉ`2èùÿdG·hOVÔkõFm{œ±lÓþ3·ž%¦d|g2è°z² -5·ë=jæòÍÎÞŽKLe2è²v²2ÊdÞ}FÏZ±åà¹;qïR¿2ôüo²˜KLVL™¬bÍ&Þ}ÇÌÚzèüÝçï?)“å04Y9™“:™ïØ9AÛ_¸÷B™ìÇ/&ƒ6&óôñ7geXÞdߘz¬Ÿ¬–gû~ãæ‡¹xÿŇÏL]ÖMV©l¥|&û§#ðïfÛd~sƒ·+“½d2XÀ†Éš2¬ò÷dšêOÖ¡¿_@Èö£—˜ùs² -žÌÞÑÙµZÃ6=GL_ºqßé›Oߦd0tåN–‘òöéÍÓû6.>¢g›†Õ\í󙬨}Ig×êÚö9cÙ¦ýgn=KLÉøÎdУNö=#%ñÙ3û7-›1²WÛFÕ]KÚÛͲ -5·ë=jæòÍÎÞŽKLe2èË›,51îöÙ›—ÏÕ»]ã -ž¬Œ2™wŸÑ³Vl9xîNܻԯL]¹“}M}wçÜÁ-+fîãLV&ÿÉŠ)“U¬Ùħï˜ÙA[¿ûüý'e²&ƒ6³9G™ìÓûçwÏÚ4{L_ï&5+*“Ëw2'e2Oß±ÿa¿þé¾â8ާs¿_×u/®Ë¸s/eÜ^WuTô^Ú©ãÒLÓÒpÝ®3å^ISieZ_–¥]Ûà®é–ÆX¹ºX›nÆ%[LŒkë–Rt³öv1ELÅ—Òdç|¨¤s?÷£?.y?þ†gÞçuôõ&³eE¶´‘ -(²•%™ÅÜR_¡ÏÒ¨qd\²Èb_e”F§¯4nDÏ% €žK"²Q‹ÙT_©×iÔJòȘ\Š,Yg¨2¶v‘¡M†NdH¡<ž®Ï%ŽÌˆ#‹RúÚ,$*ùèó‘áÊ -bj¹ÖxõrÍù3'ò2Ą˥b#Ófdt6Oè!Û±ûuMú;ÇO–}ðÑÇ5uõÆO°Ïh¬«¾t®âtq^Vjœj§¿7ÚýLô¹´ËÑÙ]²'6%ýX^щSïŸ-¯¬€JeEyYiIqANfjBt˜\†^K6ƒ¶i’¡åï@crœ\=¥A¡ªØ¤ƒoçä½WX¤7Å -?o‘3—ec÷¯2–£@äå¹/NóÖ¡ôm–Nw -º,mæ‘é) 1ª0…¿D,ćló$[{/Ñ)º{û*Ã"£cÞˆ3I£I€’&)1!nÿ^UøN¹ŸÄÃ…¿vÈlDFœ2.ªìeŸíAÁ¡a‘{Ôê( -0 -%!PS-Adobe-3.0
%%Creator: Adobe Illustrator(R) 15.0
%%AI8_CreatorVersion: 15.0.2
%%For: (Dustin Rinehart) ()
%%Title: (Untitled-2)
%%CreationDate: 6/25/12 6:52 PM
%%Canvassize: 16383
%%BoundingBox: 94 -593 707 -5
%%HiResBoundingBox: 94 -593 707 -5
%%DocumentProcessColors: Cyan Magenta Yellow Black
%AI5_FileFormat 11.0
%AI12_BuildNumber: 399
%AI3_ColorUsage: Color
%AI7_ImageSettings: 0
%%RGBProcessColor: 0 0 0 ([Registration])
%AI3_Cropmarks: 0 -600 800 0
%AI3_TemplateBox: 400.5 -300.5 400.5 -300.5
%AI3_TileBox: 22 -588 756 -12
%AI3_DocumentPreview: None
%AI5_ArtSize: 14400 14400
%AI5_RulerUnits: 0
%AI9_ColorModel: 1
%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
%AI5_TargetResolution: 800
%AI5_NumLayers: 1
%AI9_OpenToView: -133 17 1.69 1805 1060 18 0 0 -1873 98 0 0 0 1 1 0 1 1 0 1
%AI5_OpenViewLayers: 7
%%PageOrigin:0 -600
%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9
%AI9_Flatten: 1
%AI12_CMSettings: 00.MS
%%EndComments
endstream
endobj
76 0 obj
<</Length 9743>>stream
-%%BoundingBox: 94 -593 707 -5
%%HiResBoundingBox: 94 -593 707 -5
%AI7_Thumbnail: 128 124 8
%%BeginData: 9614 Hex Bytes
%0000330000660000990000CC0033000033330033660033990033CC0033FF
%0066000066330066660066990066CC0066FF009900009933009966009999
%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
%6666006666336666666666996666CC6666FF669900669933669966669999
%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
%9933009933339933669933999933CC9933FF996600996633996666996699
%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
%000011111111220000002200000022222222440000004400000044444444
%550000005500000055555555770000007700000077777777880000008800
%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
%524C45FDBCFFA8FFFFFFA8FD78FFA8FD0BFFA8FD6EFFA8FFA8FD0FFFA8FF
%A8FFA8FDE7FFA8FD19FFA8FDE1FFA8FFA8FD07FFA8FFFD04A87DA87DFD04
%A8FD0BFFA8FD66FFFD05A8FFA8FFA8FFFD07A8FD64FFA8FD07FFFD05A8FD
%0BFFA8FFFD05A8FD07FFA8FD60FFA8A8A8FD13FFFD04A8FD5DFFA8FFFFFF
%A8FFA8A87DA8A8FFA8FD13FFA8FFA8A8A8FFFFFFA8FFA8FD54FFA8FD06FF
%A8A8FD1BFFA8A8A8FD05FFA8FD52FFA8FFA8FFFFFFA8A8A8FFCBFD1BFFA8
%A8A8FFA8FFFFFFA8FD50FFA8FD05FFA8A8A8FD21FFA8FD05FFA8FD4EFFA8
%FFA8FFA8FFA87DA8FFCBFD1FFFA8A8A8FFA8FFA8A8A8FD4EFFA9FFFFFFA8
%A8A8FD24FFA8A8FFFFFFA8FD4EFFA8FFA8FFA87D7DFD25FFA8A8A8FFA8FF
%A8FD4CFFA8FFAFFFFFA87DFD27FFA8A8A8FFFFFFA8FD4AFFA8A8A8FFA8A8
%52A8FD28FF7DA8A8FFA8A8A8FD4AFFA8FFA8FF7D7DA8FD28FFA87DFFA8FF
%A8FD4AFFA8A9A8FFA87D53FD29FFA87DA8FFA8A8A8FD38FFCAFFFFFFCAFF
%FFFFCAFFFFFFCAFFFFFFA8FFA8FFA8A87D7EA8FD29FF77A8A8FFA8A8A8FD
%2CFFA8FFFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF
%FD05A8A9A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF
%A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFFD07A8FFA8FFA8FFA8FFA8FFA8FF
%A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FD12FF7DA87DA87DA87DA8
%7DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FFA8A87DA87DA87DA87DA8
%7DA87DA87DA87DA87DA87DA87EA87DA87EA87DA87EA87DA87EA87DA87EA8
%7DA87EA87DFD04A8FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E
%A87DA8A8A884A8A8FFA8FD10FFA8FFA87D7DA87D7D7DA87D7D7DA87D7D7D
%A87D7D7DA87D7D7DA87D7DFD04A8FD057DA87D7D7DA87D7D7DA87D7D7DA8
%7D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA8FD057DA8A8A9
%A87D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7DA87D7D7D847D7D7DFFFFFF
%A8FD12FF7D7D7DA87D847DA87D847DA87D847DA87D847DA87D847DA87DA8
%A8FFA87D7DA87D847DA87D847DA87D847DA87D847DA87D847DA87D847DA8
%7D847DA87D847DA87D847DA87D847DA87D847D7DA8A9A8A87D7D7DA87D84
%7DA87D847DA87D847DA87D847DA87D847DA87DA8FFFFA8FD0EFFA8FFFFFF
%A85352FD177DFD04A852FD2D7D52A8A8A87EFD1A7DA8FFFFA8FFA8FD0EFF
%7D7D5252FD177DA8A8FFFD317DA9A8A8FD1A7D527DA8FD0AFFA8FFFFFFA8
%7DFD0452F852527D527D527D527D527D527D527D527D527D527D527DA8A8
%A87D5259527D527D527D527D527D527D527D527D527D527D527D527D527D
%527D527D527D527D527D527D527D527D527D527DA8A87D7D527D527D527D
%527D527D527D527D527D527D527D527D527D525352537DFFA8FFA8FD08FF
%A87D527D597D5252527D597D7D7D597D7D7D597D7D7D597D7D7D59FD047D
%A8A8A8FD047D597D7D7D597D7D7D597D7D7D597D7D7D597D7D7D597D7D7D
%597D7D7D597D7D7D597D7D7D597D7D7D59FD047DA8A8A8537D7D7D597D7D
%7D597D7D7D597D7D7D597D7D7D59FD057D597D527D53A8FD07FFA8FFFFFF
%A8FFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFA8
%7DA87DA8A8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FF
%FFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFA8A87DA87DA8A8FFFFFF
%A8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFA8FFA8FD
%26FFFD05A8FD2FFFFD05A8FD21FFA8FD04FFA8FD20FFA87DA87DA8A8FD2D
%FFA8A87DA87DA8FD20FFA8FD26FFA8A87DA8A8FD2FFFA8A87DA8A8FD21FF
%A8FD04FFA8FD1FFFCAA97D847DA8A8FD2DFFA8A87D847DFD21FFA8A8A8FD
%04FFA8FD1FFFA8A87DA8A8FD2FFFA8A87DA8FD22FFA8FD04FFA8FD21FF7D
%7D7DA8A8FD2DFFA8FD047DA8FD20FFA8A8FD05FFA8FD1FFFA87D7DA852A8
%FD2DFF7D52A87D7D27FD21FFA8FD04FFA8FD20FF5252A87D5352FD2DFF28
%7D7D847D277DFD1FFFA8FD06FFA8FD1FFF52527D7D5252FD2CFFA852527D
%7D7D277EFD20FFA8FD04FFA8FD20FF7D2752272752FD2DFFFD0652A8FD1F
%FFA8FD06FFCBFD20FFA8275252FD2FFF7D7D527D7EFD21FFA8FD04FFA8FD
%23FFA8FD31FFA8A8A8FD21FFA8FFA8FD04FFA8FD79FFA8FD04FFA8FD79FF
%A8FD06FFA8FD7EFFA8A8A8FD77FFA8FD06FFA8FD7FFFCBA8FD77FFA8FD06
%FFA8FD79FFA8FD04FFA8FD79FFA8FD06FFA8FD26FFAF84FD56FFA8FD26FF
%840D363B84A8FD4DFFA8FD06FFA8FD25FF2F300D603B6084FD54FFA8FD23
%FFA8360D2F0D363B3B3BAEFD4AFFA8FD06FFA8FD25FF2F362F362F605F60
%5F8AAEFD50FFA8FD23FFA8360D360D360D5A5F605F5F5FAFFD46FFA8FD06
%FFA8FD25FF2F3635362F362F605F8A5F5F5F8AAFFD4AFFA8FFA8FD23FFA8
%360D360D360D360DFD075F84FD43FFA8FD06FFA8FD25FF35363536353635
%3635605F8A5F8A5F8A5FAFFD49FFA8FD23FFA8360D3635360D3635360D60
%5F835F8A5F835F8AA8FD3FFFA8FD06FFA8FD25FF35363536353635363536
%3560838A5F8A838A5F8A83FD3DFFA8FD08FFA8FD23FFA8360D360D363536
%133635360D605F835F895F835F895F8AA8FD3AFFA8A8FD06FFA8FD25FF36
%363536363635363636353C3660838A838A838A838A838AAEFD39FFA8FD08
%FFA8FD23FFA8363536353635363536353635363560838983898389838983
%8983AEAEFD36FFA8A8FD2CFF35363636353C3636353C3636353C3660838A
%838A83AE838A83AE83AEAEFD35FFA8FD06FFCAFFA8FD23FFA83613363536
%35363536353635363536356083898389838983898389838983FD35FFA8FD
%2CFF353C363C3560363C3660363C3660363C368A89AE83AE89AE83AE89AE
%89AE89AEAEFD31FFA8FD08FFA8FD23FFA93635363536353C3536353C3536
%353C353C3584838983AD83AD83AD83AD83AD83ADA7FD31FFA8FD06FFA8FD
%25FF363C353C363C3560363C3560363C3560363C368AADAD83AE89AD89AE
%ADAD89AEADADADCFFD2EFFA8FD08FFA8FD23FFA83C3536353C3536353C35
%3C353C353C353C353C358483AD83AD83AD83AD83AD83AD83AD89C9C3FD2C
%FFA8A8FD2CFF363C366036603660366036603C6036603C603C603C8AADAE
%ADAEADAEADAEADAEADAEADC9C2C2C2CFFD2AFFA8FD08FFA8FD23FFA83C35
%3C353C353C353C353C353C363C3560363C35603684FD04ADA7FD06ADC9BC
%C3C2C2C2C9CAFD28FFA8A8FD2CFF3660363C36603C6036603C6036603C60
%3C603C603C603C8AADAEADADADAEADADADC9C2C3C2C3C2C3C2C9C9FD27FF
%A8FD08FFA8FD23FFA83C353C353C353C353C353C353C3560353C35603B3C
%35603C8AFD04ADA7ADADC9BCFD0AC2C9CAFD24FFA8A8FD2CFF3C603C603C
%603C603C603C603C603C603C603C603C603C603C8AADCEADCFADC9C2C3C2
%C3C2C9C2C9C2C9C2C9C2C9C9FD23FFA8FD08FFA8FD23FFAF3C3560363C35
%603C3C35603C3C3B603C603B603C603B603C603C8AADADADC9C2C2C2C3C2
%C2C2C9C2C8C2C9C2C8C2C8C8CFFD22FFA8FD2CFF3C603C603C603C603C60
%3C603C603C603C603C663C603C663C603C8AADC9C2C3C2C3C2C9C2C9C2C9
%C2C9C2C9C8C9C8C9C8CFFD20FFA8FD08FFA8FD23FFA860353C35603B3C35
%603C3C3B603C603B603C603B603C603B603C3C3CA7FD07C2C8C2C8C2C8C2
%C8C2C8C2C8C2C8C9FD20FFA8A8FD2CFF3C603C603C603C663C603C663C66
%3C663C663C6660663C6660663CA194C2C2C9C2C9C2C9C2C9C2C9C8C9C8C9
%C8C9C8C9C8CFFD20FFA8FD08FFA8FD23FFA8603C603B603C603B603C603C
%603C603C663C603C663C603C663C7D93B693C2C2C9C2C8C2C9C2C8C2C9C2
%C8C2C9C8C8C8CEFD21FFA8A8FD2CFF3C603C603C663C603C663C663C663C
%663C6660663C6660663CA194B693BC93C2C2C9C2C9C2C9C8C9C8C9C8C9C8
%C8C9CFFD22FFA8FD08FFA8FD23FFA8603B603C603B603C603B603C603B66
%3C603C663C603C663C7D8D94939493B693C2C2C8C2C8C2C8C2C8C2C8C8C9
%C9FD24FFA8A8FD2CFF3C6660663C6660663C6660663C6660666066606660
%67667D94BC94BC94BC94BC93C2C8C9C8C9C8C9C8C8C8CFFD26FFA8FD08FF
%A8FD23FFAF603C663C603C663C603C663C663C663C663C663C663C7DFD06
%9493B693B593C2C8C8C2C8C8C8C9FD28FFA8A8FD2CFF60663C6660663C66
%60663C6660663C6666666066667D949B949494BC94BC93BC93B693C2C8C8
%C8CECFFD29FFA8FD08FFA8FD23FFA8663C603C663C663C663C663C663C66
%3C663C66427DFD06949394939493B693B58CC2C9CFFD2BFFA8A8FD2CFF60
%666066606660676666606766666667666666A2949594BD949A94BC94BC93
%BC93B693BCCAFD2DFFA8FD08FFA8FD23FFAE663C663C663C663C663C663C
%6660663C66427D8E95FD069493B6939493B593C3FD2FFFA8A8FD2CFF6066
%66666066666660FD08667E9495949B949494BC949A94BC93BCA1FD31FFA8
%FD08FFA8FD23FFAE663C663C663C663C663C6660663C66427D6A95709470
%FD079493C3CAFD32FFA8A8FD2CFF6667666666676666666766666667667E
%949B959B949B949B94BD94949BFD35FFA8FD08FFA8FD23FFAF663C666666
%3CFD0766427E9495709594959495949493BDA8FD36FFA8A8FD2CFF666666
%676666666766666667667E71959595949B9495949494CAFD38FFA8FD08FF
%A8FD23FFAE6642663C66666642666666427E6B957095709570957094A1FD
%3AFFA8A8FD2CFF66666667666766676667667E9595719B959B949594C4CB
%FD3BFFA8FD08FFA8FD23FFAEFD0A667E6B957195709570959BFD3EFFA8A8
%FD2CFF6667666666676666667E7195719B7195709CCAFD3FFFA8FD08FFA8
%FD23FFAF66426666664266667E6B957171709571CAFD41FFA8A8FD2CFF66
%6766676667667E719C7195719CA2FD43FFA8FD08FFA8FD23FFAF66426666
%66427E6BFD0471A2CAFD44FFA8A8FD06FFA8FD25FF66666667667E6B9671
%729CFD47FFA8FD08FFA8FD23FFAE666666427E6B716B9CA8FD48FFA8A8FD
%06FFA8FD25FF6666667E6C7278CBFD4AFFA8FD08FFA8FD24FF8B427E6B78
%A2FD4CFFA8A8FD2CFFAFA99CA3FD4EFFA8FD06FFCAFFA8FD25FFCBFD51FF
%A8FD7EFFA8FD08FFA8FD77FFA8FD06FFA8FD77FFA8FD08FFA8FD76FFA8A8
%FD06FFA8FD77FFA8FD08FFA8FD77FFA8FD06FFA8FD77FFA8FD06FFA8FFA8
%FD77FFA8FD06FFA8FD77FFA8FD06FFA8FD79FFA8FD06FFA8FD77FFA8FD08
%FFFD79A8FD08FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
%FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
%FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
%FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
%FFA8FFA8FFA8FDFCFFFD87FFFF
%%EndData
endstream
endobj
77 0 obj
<</Length 65536>>stream
-%AI12_CompressedDataxœì½i“ÛF²(úê?ð}p„}cšFa‡=ñ".¾¾W^Âòœã'n(¨nJê3ݤn/c{~ýËÌʬ ->ûõúáfŸþcý€¯®.â¯ä™ÐÉlù -&x»|ik1ù^ǯêÇ뛫o_¯`êIUáåäuù{èºÅ×x¹xõý-\y¹z€åyÄõüå»Ú\¤öåý²z{MË«ó¾ânï6ïo—wÿÄ{GyJøÌ‡¿®nßßÀ2ÒœÓ(g£‹„þóßðwa.ô½8†%)ËQ‘壛OÝú¬þu½úý›Ñ›õÊ,Âäîá¥ÙŒz5Í'¿<Þ¬îþ±¾~0›|_™UøasµºïÛû7Kš<5íþš/üº¼{»z€-ÜÜ<>t•òXåË?W¸UÚ<à§÷«õ¯›ÿ 1^è$éb¤Çy5Òe”t”C×%=áB—E2ªJûXíþšÞ±/ìIQÀæüÛõÓÝõÛëõ7f½Í6~ww}åv±ˆG¥ùCÓ—Þo%¿f¼0õ‡‡ÕšÇÐ3ýÁƒ†hüÃKxè|}5ÝÜâúß#°¬Bn6oÍgö5}·?¾7 ÷¯`«~¾»^cŸêGú¤|õóÍ#|ôÝÝæñý÷ë7õ¥9à¿Þ-/ák£Ÿ^ÿ÷ê)_p¯^>^?¬ÆËë÷_íì¦u·™áfz+ÿï¿{¶z§ÊÝn®Î×ÿZÝlÞ{ÝÚ+ËõÕè?—wï÷wýóÍr½¼ÑuÛó‹ëÁ'KX#×·»v@§ -6f -éX':S:™èZà -ªD±Ž“8‹ -+Ã# Ys wS | ‚%Pö0…UŒaôÎ9Ð)Ò ÕJm-€Æf°E ¬†Ñ, -H~+ðM-ÔGÞÖ+対
1 =UÙ07Ú!"$±ÄÊÄ´¬Ød»ÜæÔfÜäÇ0RnÀ)ÛFŒSI¤¯ 1-ã–r#ŠBÄ2¦Ý2-2Íð6жoN[h?²–Ÿ ·Š[Éà–sËLSĦ´ÿ¦ÅÜ47î…msn3n2_z®¢ÿä§²äVØ–Û–qK½–HS>ñ°Céè‹Wõ°ÝÑ .ÔÛDeE/"U•ÆQ”f¨Î‰bØsÔçÄU¤«^äx!æ]òQ/a—/Õ¯ÎÙe}#L3äßHÇH$Ã/ã˲„.P÷4.» ß™æcdðP7ž§v -šüj
û)
{I^EÚ€)jô‚ô1ln -k“V ‚GÕ -K‘ó+2b‰«â,E¾0Í¢ªÜÂ`>¹ä'ñy¨ -Z§Äš¶ô³_3K\åß‹]¡š°(lª -ç¬_j© -é‡"Ö=EUx¢0T†JB§"Œ!ë•§å ‘ØD1˜[¥ 浜±.ÐX‡r«×¶ 9Ëp+Å+OL’œ±ïu‡Œ:)¥S1è -zFªg<†%2ú9ЄÌIv3’í&F¶cCMBH ò‚Œ›¨Iž‘6yÊvÏ i•+Ò,—¤].°C)?¶R><QyB¾óEПx¾÷s2ב?!å´‘ú5jÅ•‹ÿ3VÖ¤˜½5©PPÐé2¦b§y+ë[U l
•¬¡nÕiUCmªÕ¢í·²ÚS§7©Ó•:©(GZÔ©CI
ª¬TTŸNåé¢àD•&îd =:ù±Ù’--m6ÅœAwË;[·¤ÁªZeu¶%3Ýû§n7âtµYg›w´…ß”¼%u£éÎw6R‹(«O¬ÃD»e®…BØ)Fö:K -Ôz‚—ƉqœÆÓÈfÀßGÛ”Ð'ôAZgäOsú:°ó J¤ÆÉÑܧ©Oiœéq -8È×:?µƒ“¤„N¥óYtÎF%jT Žw¾I–ÉÍås2ž/È#}2Pflì%©cP!3%…ÌŒ2óL(…äF)£H+3!YfFŽ*"Ë¿œý&N7c5oF–1ÒLNˆ"a†´4¤²Ù«£ ¯Ž)É-FfA‰5W(«1%&ÏŽŒ¸)ä»jĶДeš\<DS£GEˆÕcV41‚‰Ñˆ9ÑÄN”‘OŒílî5qñ‘F¼&·$hiG#Cžq -ò[ÞÑ -nÝWÿsÕq¹`Ò&ä}Õo•×འ->ôG"ôQhdìôâ¤_ð2Í<⿪A!
:™[:™ZzËBií“d£T†nÒþÖå ϧ´V易¨†§Ö¤Œý!щ̀ F@=§€ÌKÅjøˆðòP>ªß`]Põ^ÀdÀ-` -ÑâÿpN±’tI”g%Ùe'é´’44ˆd&QÙIBK‰g'1šCßP¢Z–’¦pʼËVâ¬%l,!Õ ò¬%M{IêÙKœÅ¤Ëf"Ž¿%ú(‘ïoÈ'ç°KeFŽY3k›¥ZÈÚ"óS/ãm,òÓng:n zIŒ«$ªŒUà1Ô‡u\¥:x1Ž5º}ø:ô§upwœTUŒ—}¹áƒ%ʃϜv¥$žO4,FÇ¢Éa-tÇš(¶¬‰KYæ+]Œ®lj¼³HùR±^ÌhÃŒ>,1Š0•»…çèô^5˪¥mNç—Íþ(ûÏ¿§)jêŠ}
|ÁC¯é€6½ÊHq¤è4Gx®ÉÞï†;a5]E8À9QGÊ”pb -vi?JE -»)Ë‘ÆZQZgÊÂjÛ4fEQöilC÷9Ñ|Â_»Uf›ðoÅ3.íœñרçyÒŠf5%7áyOxÞaÁ4p y³³^„>¤"ÐTÖ‰ÔÈ:Y0ï¤cÖÔ3 ÿkܬ¾mÊŽž%)ÜRÏi:b_Îûpúþ›ä½™[§i S‹;Û¯àÇànk|›Îøù¶MÞÆ¥¨†8èyKn…Îf%V«(°\%ŠuUN%(œZú$§;Ú¢.RöÍ»/Ân*›µçŽSW–غ¹gLq‹`æÓŽ™{ó–I«ŽYûsnÎv›*¬ -:tÊŽ¥7–‘t3’nFÒÍHºI7#îf„ʲ}Ú¹z$p:7ÐìlÃsžat<×s¯ÝqÌ÷«
eëz{?úë·ëÕÃà - ¸ë*úB`X8‡´H
ø"EE‘Bã~®S¶!þŸ;C`œQ,à÷wq¬7èuFÁýšéŸ".j¨ˆ¡!â9op&PE“Ýæ=º!44âh¤˜›ñ_JØ“IÒdŸ¦Êåð¾$f“غ?Å™Ò8 - ö¼6'*’ÿŽ•‹È¦;ª¿bGcfÇ#?3îpÄÑCÓñ©é´äp>b€ -ã´œ1û
7Ïs°¦(òV°Þƒ±%^â·`}mä®ñ!ÌT#v·¶±žÆ‹AüŒ'ƒø2„QŸA\”²n
ƱA\<çê#¹›ZD;3°MªaŠè2A‰Ë›#+L+LW¹€)6¿¸PQÑØ`)ÑŸ˜Ý4û¨íæ§…àªÃ¼K -Á¥P{|KŽÀU]~%†ßvê¢ÔUTwèíöÀ[’”—:®îºõCnkÖ²xê‘¿+?uI¾¤™¼¤éºº™Ù,%ʦ'q–ñ:ÓÄ} -§eÏB׳’£^·3ø‰Æ”À~BG äH?iNxjø~¥òÂbºcœwFÑÓŒŽÉU+@¦"ã4õb¯`m½1ǧDéÍO$Í8³Áœm/S6àUìc]p~³œMõØbÑÄãAÉÆa[h˜qäž°}Bòž¹˜èÿÜjêaÞ* IÍ8ŒÇÅH"áúáK¨†ûÿ1ºã/
€|J#ã7¯½äƒÆû}Bë5{ -êS§;Ö…¨OàV׉úÔžäG£¾Ýzø¨ÏHfž1;0aÁ'è’Üì6‰“ÉD1Q^ä®ËÝ9#x áF^o;„W‚xsűSÛH8Ñ'ëÇ%Û§Éø9eÛÉŒ£²æÆÙÜf -pWG.¾½¶ºi–,4±JÚðøÚãñ2Z…9$Y9}¤¨¡+cSŠ}Ÿs]ÝRBWÞ³¿°Ñðq¯ËTç( úL›²_¼áôÅ`š*O-ñ -Pƒˆ@*W$Š -W”T¶bF.ö<[ª-zêÖnn³!uÅæ©D{›m›¬ÓhfjªÃƶÍ&Wmi©Oyo¶Y ÛöÄ)çÚèhj«Ír›zfÛBójYQ·Y]=ˬ(ë\öû‰µHÀ¹lÎR˜Sö‡ªþ”ŒU±j)ù}SÁ¯t*ø%sZŽY1ųBD5QòO9=YÕÀ´9ò[Ê~’ÝTÃÃ"i§Ég7©ü[Å¿”1W}ÅBˆu¹ï`j;H]©éàÂ4ÂÀº l톦¿¾sˆmcèž¶³^쯩°· ‚ꨨ°µžÂ!¢¼:,AÚᢼê–åŸ.Ê·c4ÚvŸ£Dyµ/5Z—(ï•ó¹2âE”ÀdÆÛSÑö ê
2"·29ãSRâ™|âÆ”‡ ®É£fÑ’SÚç&•ØÀê9¹IÙÀjë&%ÙcÉ6n3i_üÀêfhµ\òùÞUýešMÔÞò/rê›çÞT})š'_ÙR/sÎ4!°ü8]³ùfë9'žÙ÷Èf:Ÿ4”7+o¬ÕEøë’ÈwHÀ3+›æÖ¸Q9¯é\#AGÜ’ Ñ7©ò<U]•²„PFÊgé9rÀG#èƒ0œjx©ºÈ‡ÜSÃWÿ¨?7™`$¡ÏLqr˜Y«5åz?E ´Ž;Uãc×¶édºt.žZEy”¦J$(1ÐvY$‡E¤ªž9Ýœ¼»/Ö6éœËç"îŒèÝ–ŽÜXØSNR"¾Ÿ1)è5y:2Eæß9¡X÷;cQ -ž’·ÜÔþ‰ÔüV„‘'$)”Öbo~sKÚͯñ.M 1ár5es¾Pü‰&Æõ´&v¶$\Q’“YGTvE-"Ek=#×J“¨´âÔ¤9ù樂Ôd]@|Ps?¢€”’ˆs껢³ž“__ÊŽ”:ÞÆ‰²$‚Ç_Ü…Zrª ÀqÙ¥i,HaNTrÔVq‘›Ì¢B3§Ö‹1#Z‰ÈxF¾ŒÚð”oÔsÈhm¥š®]¡¤˜¡Õ©õlÌ$Ï;ëV„SJÜ ©UÅÁ1·Ñˆ€çT«Œ•xcô&Œ®j“º™úm¥õm`ꦂ,.xÂ…Q¥M?µ¤Aëšx§'gøWçqzr†u§'gøWçqzr†u§'çó¤uzwÄ.Ñj§$Õ-59Ùi«ŒÄ¹ý–-ZaêªIÚå²Ñª …)Q›‰;§®)öªtmÞh‚¼!s‡“£»Ÿ$haꑬÑò ®):.a«‚Æ_qAœÛ]aU–Zµ°Ž¥•]Ÿ©u/Û‰ÂÊND-ÓqwSq8åäû¦P¥-&“X×ÓLyù+ÅÕU’ÙREÆf´Ìl1qIW”‘š2~U™®º2bü?UñT9‡?9IΉÅEa»ÖŒx®–VmX[ÿÕ™Urµ£8´"ª œÔ¹¢"»·²zÜd§ -h‹âÇÓö´Ü²}¯m_³[£ÓB.žæ¦CC>?Ua³”$ Ìm -ä }ÔÚ ´;Ìþª 1Zg¤Vv𸺃a; +v|7ëƒÓ«íLœb²íó¡fÃtÁ%Ð]ªìĤ©:Ú¢çl‰N„'dE2ög1;³½™Á"c“ÒÄ -SxÖ™°r’_;) òï/æÊ -Ê“h=©–½ˆç¶Ìzö%dØFd2%ß¾Úzó•d&…Yò?!Ü‘H#éÒ)ÙÊ‚]±L‰‘œŒ¹õè3õE'äkSŸ>¬ÞkÜúb‚óœ<oJBÆ5ùßL A\'?qóË—Û%!ø!Ü8ýI2Z¿ŠoDXqMJð.bH1†gh)
Q1Vc‘©=+ÍÔ³ÞÌÄ“C³ÏÜ™„8Qˆg3§C±)I˜GJ(µ°>`aN\õ1UlÉòä þÕä¦xF±í’s)ʬv¨ôT?øt™HS6pÒ´ (®hL‚uàÕU‰dJè9a¸³ž]¬ÿOLME(wJN¤‘-jSzEm´-iS//òÞ‹IàÛÊ¥}ÆèÏñè5¥˜Y°ƒ§Éb#ªû›ýBÁXßÒ†ÃÕ
·ff¿7Ž'gu;Á§ŸÕí¤Z¨óº ¥í¬n'H©Ïêv‚JùÝNDó2a×$¿5µúEÐBƒ@`,PìÙäZhihþ„fŠP^¯(±p4¡md´¦YÅ3¹(Î$i¯ ‹h†¦žÐD´FyV¢Ð†´;óIháôÌVª#»IG6“È+Á=±þsâA—[¿WÏ á{Óíz£:|oÄ·n›ßxÙuºÝ(ö»‰½šžAÆüÀÿ¦´A÷¹Mu$Éñ¹zŒ²Åa¤ò‹d?ª?‡pnë«$t\Ø/ÏzæI^$ʧ[ÛSPZ'=É«›ZÐÕÆzn!¯¶šk'e!G $±î{Ún÷üÃ8|¥6>I\÷%vIêÙš -åé#ë&â;Tt»TluªPÝ~vBÇŠN׊йBYïŠNÿŠ@óe,†|WG$}ñ”š„Æ)(áƒÀ}7€…ç`ðµfLí{Z/ -FŽÅí0sDʉ8%h‚ùœê
6½“Ë+‰"¦sÏ]'X/m½3'ì.Ÿ¹X†¹Õ;‘Ò?Oœ¬ÈÚ¤-8¦Œ?ÅVQRp+N²ç$õIÇÏÇïÐÈ3g²°‹]mui|¢?£ÚæÐ¸ÍŸÑÔ -»*AÙœ.írH’Îen}Ø‹@‰¢œ3AaSCIV¨©çT n‘•P¬kbï‚00B²=±û†§o8ì§>õ0´ÃE~f!ÑP¬&Œ=Šaè…À†P -Ñú6}§)œ108£þ"0êW¤6!½1ÙNrë+àÁšXvº¡-¬°Ö4ò÷÷áÌA™”×Îø„Zg\›i&VW©Å×8t'pÊJQUJ¸*Ŷ|Ú(ñTµjS«ª¶ªUŸ˜–G«TÝftßÿ¬\Õ¢ºÛMïûµ¸@|ÕEnKÚd»¹µœû¶s%⛽‚$÷®¦´Ÿç^ij$A¤¦q6u?«0ݬ1
k8 -Ð/4ÝUjZâ›\¢1½;Ï‚-® £{ñók÷!—S"ç(¶ÒOó7µ…lf¢{½üˆµF½Š=5-£ò´O‰§Ÿr+_“Y¯—hné --»"C¤ù1š3Ñ£Éd|]kߘõl$‚q9K[pGÊF¸t0¤¬±º"§-J”¥×PµôBò›·4EÞ¯òôPÚ*‹œúiÎú«©äia-QF:¢Œf¥-´#b6œ enAÐNibÚE³¬ã›Œ3„ `ØÜèP‘Q:3“…aFÞÖ1{?UÆ>ǾN¹9UœjAr½d6ÕBÙ¹ žM)ëNä³cÊ£B!g[SîUdÞé2ª8醫=*ü˜0ʰaÈtºÍpÚån/‰.2ë¤Rr.¸Y਒)ë©2ÃŒnÌÕäœÍbÊVO³¼&ÅœÖWÕX:g”àÄf°P’À‚xL\2'NÂd¯0ŒJLLJéå®ÈyÚ²gÄpæ -äµ6¾…š_‘¯ó˜óVÞŠ°Ú³ŸbÀ¯ÝБa ò)”M0 ô@(B³‚CXæQl|ʹ© -Ò¸J€]Ù’ »ÀÜšþÄøGÒ±²U 9¹€“ÃÜ…–ŸÕ(Óm–if8Ÿ”µÌ(Ï4Ómœé4Ï´
4bŸQ[L4Fš-fš-†šnSM`¬Ó›>CFƒ¿<£«ñ4’nFÒÍHºq7#éf$Ýp5ª"ç‘ÎFE2L»BWçïšêqØí¸´í -ÞQcSÒTÄývyvhn83[E‰•ä%æÄú1+ëȬ);®ë%ÛäÆ5¹
Dm"Í3Vhv¥GŸrë¹b;’p¸ˆ«T`ò—.¬a!±6,)žE¡‰ŠýžÃpW?Ô5t5Îë©1q°¥"ÉŒÃCÄNå[¨šÖ)£¶íRR¿¤e’Rl•2)ß.U{Ît~…’fu’´«:IÑQ¤Y¥ÄÕ)‘J%®Z‰W³D’ª7Qº2Sêí-T89õ’Kå™F]iT}·{I¦j½V$ùŠf§ã²’±'~Eâ¤ñÇŸ²»Êœ„M1¹9·
[¯G\T$²ªfç²ÆY_ð §„6ÊBI=!QxJBñ]¤\ÌUlýOŒ÷Ia=O&öLÌPÞ&•bDxbÓG£`g¤ )]2zøÑV]‰<šV†2cßÝ…âÀ‘¯Jl„UNŽÀŽD©m>à9‡[-8u$UNQ/¡( -Å´ÂKì§–¬øœõŸƒêæàûU+Vj†¾åig˶7²íiŒÙZPÔ”b›* -dÊ)tÉ„*E6DiwD‚5ž)k=kÚÏBšoC³V4/:ÁÒ”gKKƒÇ¹µtÕèÆ®ØFN¸ªX»ä›¾‘^ÒU—vµ#¶Ñ$kTAy5?Ûô`?òÀ“\5œÉ;¹Ëåh²9Mªó*7ÕÄÆ-\¤¬‹¹¸™Gsq6‡sq:ŸX×óÊ: K£¡+ó™ëüÖõ“no&jp¶a0Ìü 5àúe²ó Ç\äEÞ6¡ÐÙr]Œ›sU£vÅâº=ño•ͺ;Ê6¶°Ø®ó@£ -Ò" C!2„É] `é…84áÒ‡Ì.Ø$èT
-Ú¦ûq‚MᚪüŸÚk3¯ Æ—Øi±×ØéHy…fS˜ ð‰·†juKôFžÏ;±{dAŽ‘ŽõŸ‘7d)Y-BÖFBŽRü9å`#NO1Ë&Æ(§ÿÖN0LnsÀÏl@VBéßgŠ…éX%ñ;‚æ}Q è„Ò½§”óÞdy/F¤.)4¥ªsŠzõc^©P…=”œ)Æßb?³‚Ÿ<Ñ/Oég›yÊ‹H«½æ`å5ÿ§°-wMðzÍ?~ª?„ÇK(e•Òf^›zæ´ÉWOO3ßj¨žžf¾;ÔP==Í|wL‘:.Í|C³¾7eAª˜-rF•`¸ xQÀüõVEÄîfýGžkXxd ’ð,ߙЋNN6@{c®ÇÆç?úiðÓ݃Ý#fNçIÅ7gf¸ÀÜh|ÕÅ+>åÞÓXž¤êäyà²o¹4MSÛª¹B§9` “|L|Ù¥Uã[fÅÂoŒË¸v|é´5H“Î5€Ën
¬åÌYoý¶ -X®m‘f~¬`Åè£<BÔ"ޤo&8#VÊ0Ã%6•l3(l®ð8ýêò…WYžQ†ENßãg'ö’ŠùÔþ˜8Ã0ÒÙmåqÜRÔx}Î;ç@ÒFV'n-¾ÊdgW>wq,M#ªPý\ee§L<ô}ã~µò`ã겕¾¨V¨DH]’êÒ—…Q^°D˜òÀ‡fºƒ¹ ßüO¼©ò`¨æz¥sËq¶!©h¤ª«m"ƒ”ò¢WµÇ7¦låÌ"–
›xpÆMM¦6Ûá àÊ -~ð1D€#”‡$|@œ
»ØŒNFCu -a„ii‘‰e=p0ø„Óø*äºsŸ‹:–è^ô¢3å‰N°°hFæ‡P”-!Ä0Ì|Ô*¹gè°«ÀG·SH€ÝTr눯ö¢«]¾\—Qœ–jUm¼•JöÉXX僔î^Pae£zhVÔR -ZV; ‚¦)§;¥(,SN×+¦k#’f”/*¦LQíh¤d–¢M¨+I@˜"à`ÿ†ó-ªã#ƒw«Ý‡4Ù] ŠQA´ªQõQsÄ÷ -( 0€‚ -;?H¤ÃÚîrûp_2ÎÔYD.î9jLŒ~sÔ?÷<å|×vtzöü¦ŸvÿibwÖ-vÃegoÄîAìÄîAìÄîAìÄîAìÄîÁdP@á©b÷ßU+KœH"…ÔÖSVJHs^³…-`)›1Îåí‹|ùûÂ~»ÓHá§:røE®\žãxˆ˜¨°p¡ØÝÆ9H§6bg/ttÁ‡ -œ¤çäœä'ˆNØIÉA…!DPÆ"eá¡
|HØ•h†\RíÕ‘vYícÉ`oÜýÒEKú„u{V2Ïš‡;—2Ã+›;èï¡D–,ry{©Y~p ÛQ9í~Íù·«^º4Õ8øa®´®ãºÁ·á±0ÁŽÍÞ•¢ª¨n æÖÛÍ·E
LL`ƒ+#žÚ¶”…æO<ÙùùbŠ^œ@c÷^ñæÛœÞöÏÙÿ± -Е¤×Ðþ®š )•<D‚ÔQ\$Ȉ©èʶ» ,ýÆ´"oá7‡½ª:Ý@˜Û¤âÇ<
9-¶) 2e_ÐŒ‘+.¯A¬¦*Hlë‚àzâÑr‰÷iÕ6d,áÄÒVYC·Š®ZHÖ¹þàbô‡êPÔí„“–féàÒêÑ.wQuŠ¿h—»¨:Å_´³4ÅvQ/‡¿_z|Oµ³üøÞ,þTÛTŸšZãŠJÇT>6£zª%„©,ë|±@a -Iw¡íb.»iOj.¿öô„e8›S¬ø¥ÛùBêí¿)óÿ" d^ƒwʾ̃²Æ×Sû¿ì± -\’ZwŸY²é‰u—S[¼åœx´Û=ÎwóÝã&&÷›K@:ÆùÎq‹;ÉyÞ_±ÏÚ9š¦[¿ZN„ªËëˬŒÁ[Ý¿²N÷¯Jy¾<ΰÒ4»´\¿Ìä¤ ïÝä;»ùIf¿ì8fñxã©+öq -go€¢².”nòž{Skâ4yx9uù9NâG“³g/Å™”4IMç63GN™K±\Ïœ²”†©9¨Î j”ìI¥d–)Ù3á’=igÉž)ÃüÂ2_ÅÕû4—ëñÅm¶¨Ý´ÍÎ\%ä:ÔN¶ã€(MžCR¥m`¦Éwji©vLíÀ/áôÔa%^šÓ3;w† -6þÕ9*ØøÓS‡V° §×RÞ$‘Ñ_”˜Øˆ2 -VžÙÉ.œ«Ã“v'½ÉµÄ†€!À†!`ˆ -CÀpüÏ0D -MÉþØ{·{ilMqw&»[ÂsÛâWo¼êrª?È7{âíÒnoÜý{ëŽì¸‡8‘ÐAÎ`}îη3¡+iw¢(/Ì‹Œ?ÎÓ~hÄ"‰UæYœÎÖeWÈýI Ïd5J»ŽHÚVBéN%”Ó8„Ž)9‰lqüSèŒæ›ë_ÃIIu–I¤°Ù5Úî; -[ø©_²…¦¯Ì„™(Lro™dbä3£]šZgç #.9™Í{/ž7ìkãy×ÌTùÊùÍt¹VžkU«Â
ù¸¨Î7í"7zg›ÚyT©F‘›v™q§rUÍ*77•ÚîLµ%>×:RùѹΊCüÜþ,œ“sòj¶:g½NVÍza>V[\¬:‹ó¨þUÓçª=¥yÔ¡µyv:UynUj{mž.UÎ,àÊJØ2Êx÷5$¿()È܃+l›r<p©LI¢{gÙ°w†‚àÉ]}4¹0ëây³€çJÐ
%è†tC º¡ÝG*AׯÂj'óÆsrO'Ѿ¼‹öåFt }íhß@ûÚ÷‘h_¿hMßhñÓi_ÑEûŠÁávp¸n‡ÛÁávp¸n‡ÛÁáöù[
/ËP@ap¸ýK
«‰ÉÊs8æ-gBæ›Õ] çÌ8ïu “ß¶]ÛuŽ_©N÷9—2ª©rn¨÷;Éë¶Ó˜ŒH7ø;ÏiÌgùB÷±¦Ë˜ç<vnG)N'¬NCmûƒ\Öž¦sPÓ5h!CÕéäô€M× †îõ/wˆ9À¦¡^Ìr -Éâ´BB:Áܨ%MMYDYI*Á4‹ªrn:¹§†©ª.LUŠ©ÚùNÛ‚Ñ^·çIWug<íÊyJr¾ -ÓžÒ9
òž*°¶Ñ[ÔBrºÜ<ìây‡>¨>êË<ŸSÏØ¤:Œm¾¡mB¸ç¯qÓ<1½ÚÇXmGXûPVi9FåY8ö{4¶×îdqU—åÈÇq!žëÂxmÌ×…ë®$lm´ØFÝéÙiæÍ¢Î-ïXIR–h‰ <–Kr’R\Ùª½Û¶`ÄS:ù«á.Vw€ÿÌÿps&(rç´Ó%ïü„U F 2Ç}¤ÀÍÁ9 ”Æ=bšðÎ4áéYŸ˜ævpÂsÓe¬ÏDfI ŸÕQ.Z<„ìºã0Ÿãq^ï¢Ñª<sª´˜¹iØqw‰3
ÆÔÐØ-Jí¤‚ú<[)¦l˜Xp¶gMÖ„r>§dyÍI}UR.*QbMÉjk@cÓŠ¬» ÙzS>¹D¡L„(îÈXe5Ð5çàŠÉNeTwb¥š£xÅ6*³=3µ»bxê@Eh|fž¯BLi]—‚!ˆF]hÈ¡³Yr¨HŸkÕÞçÕÅ2±S;-`Áž>f÷wÚßk·Û¾èìï9–2±ò3IÐ&î<NÊ?RÆ÷̳ -CnÈ^«<GšŠ]e&7UÛTΦ±™.´üp0‰Ð©"îÔ4ÀYæŠWRÌéž5½wwÊõÄú)%¶G#š›ÄЙ v5Ï>Xžg²Fw½O½wYãSz§øEÎÁ\òAaß›ÿKŽ-lÐ×–ïûbÿ戟3m0ê«ÔÑ -«=àÔiꪎpšKëü#@.é¯qrq*µµ—VÜJn…ˬ¼èã'äÒ!ç3ä'ÞZNÙòt®@]Xœ®´'_0`†4¨RÇuêTXªÎøUµýš^@M_ ¦GPú¡:|ƒÚq »¯PÃcHµbCš"íÔ»a´H#fD…¡#>±Ø!oÓÖí¬ùqHèoèñÐåƒêÙºÛ20²„ݵ?Äó¡å÷Àî2ä0£Ú3ÏÝî»ýGÃê±jËÿÛ5“muöt¢q '£‰3ÅžN=úž:¢èjHÀ¨ÐÆ€>*ë™+áÅSb,æLÎ]w&^<öZçBeÕ".Ž[úœ=¡RcîÉú¡b£ -Ät'‰§›Z…:ë̪9&×f¨£mäÆWã:ìêé´á.;ñ0bÑÐ ¤ÚQݺßnío ûØ¢ê õRÇ¥žßª ¶Ž³ê€äóݾ³[²Ï+Ï–÷"T -DãìYåhÍBÉ<#+–K¸ÚÈŒ^•ã²ÈS§d9OwäÚZ&YFIh¬ô}Æ)°N¤Á‰r2¸QZ9e±Åµ®¯¢gp -¼¡§?“ŽèO‰³‹Ê2§lµQ™ä™è”*L K¡•E°}d1<³ˆ=âiýÐX`¥SmfQ¢} Ÿì¹›Ve”zKg9êÿÇ€…ËÈSoezHÃÛÂ3õ÷¡TfpáÕ›õÏw×ë‡ëõÛ‹O“æ ~|Ÿ$擟—«»õ7£/g×ËÛÍúj4}|½ºÿJ5Þòq´n¤õö!•Ù8‰t9*ªqpƒ~¤sñ€ÑoÒÛÿ/ÿ.þ>JG?ŒþëÿD£+ºþÛ/ð_£Ë[w‰{½€K'×äÖíÞðÒºãöÛÃo?p0kšÑO&ÃN‘U š—t•T -FSé|–¢/<>.ÎÆÃkI<.á¨Ú{_tô‡×Þxדtx§žÇã")ûÏñ¯ÉsäÞýÉsòlŒL«½Ÿ“Uã(ƒõñWYî÷¯Á9jÏnö×|ެ‡ÿSÑ1N¾&Ïñײٟ<§¹ø]Á™Nó}€¤“±Ž“½«û¦cwý§ø#ç§ø—ø)û`Ňã2` /Ǻ”ëßï_{_tô×ܺ?Iƒ½Ù«²7þ³›ýÉsäXúg§(ÇEíßÛ"†S[„ãiö×|Žvä9û`UžãŸ“fÍçøû#ÏÙº|MžãïE³¿&´Éý>´ùsghó/1´íƒ–7†t– ÒI -ݵ†à~RHæA:¦ -5yœPtoU–Uf2V…„Ñ—ÈMXÙˆ4ú£y«Â„ýæE› zX£•Té*°VO†WlÝ:MÝþ6Áj<£ßqq…˜ã˜óqT”fºÀ$LÀ¿ü¢q¹£œö¢ÑG÷UÛÅë°“RWf…Ý÷år£„sUÍ‘l¹ì:yÝÐ.ÀvMåv{·[Ñ=ñ®Ezþ¡ªÑ—_~ûÏS¶™i8]Á!|E[ðŒÇp[ê]60šŽÓ¸Šq9ÊqR•©¹Œt¬2«ä_n÷mvÌë=‡*›ÆŽÉåÆª -˜°€£:˜Ñ¥iÀkéÑäý!—f†«‘¶•CâX'ySˆ:ÑØ¶\¶\Wd†ÂÏ© -ÊECl8”qˆòôP¶7l¹ì2?¢Wi”¶ Ø -¹X¤©·)ã`ÀÒÚî£0'2ÚGðaUçÞ>æ%6³@RJÅóÊJ‹Â58óNÚ'V8专©y#H·“1SÍã‚e'3¾HJv2.%™x;i.fe•Ê>Æóàv»)“·…Ú\AÜXÈn¥HqühÚBa7º-ŒyJ@Ü2¡2±@NþÜ[(Ó%äú¶%Ä,abC̆•Šœ)[ž% s3qQ1µ‚E²ó<73„~áqä0¦°_±ðcp+ƒbùyQ™òÅ*µ,)Ièj™ýF¾«Œù¢ -ËaÐ6fü=R•¸}ŒårbY媨¤Oy>î£.øùE‘xû˜0M¢H:dã*Š+pæ}Œ…Æ8ä¹…(o´åUaõòЉ!=Ùǘ/¦ed/¢%]$ÖîcZ²,‘&©ÛÉLD©$ÎìNÆr1M·“Ì»Ãå¬HíNšÓ½"”cZ–æ"aS·“ZDœ8OíN -Í%qçœ{'å‰UIæë³“hÖŠ]ZŸ“!Îü*l©!„À¥VF÷c_,ü÷d‰ˆp¹0ø -žD —|’éb—ËQ\0›¦ZŽ4p©Qưœf -9¦âsøR: ±ÆŒ ªrÛA€ÇÜuœdü]8Œp‹8—^kp΄γˆ9ÖÌØ&?ØNæ/n•øËU vv#…‹M"m/– 3¬ÞF -og…ÝÈTxÓ<K»‘)ô</3o#cùnQÉž•UÅíp#uÎ,sœÅÞF&2Ú”e'ÜÈœ!¡Ê´è'Â%8ó>¦BOJñ‡ÚGà’„ádÆØj.°†$_ÎYäO€+¨˜6’k¬ÐÈ
â¼=G"«ÎßÍt$’KUJ§€ùb¦µ ÖÄfš,ff D¼\³0!€kE*pp -ŽÑòêúñPwS=îW"üqŒ÷§ƒÖúô1 µçžŽÌúo2ûd|R_÷‹c?Õ#¥W“9å¼÷k[Úþ`—Ú‹ž¹¢þyä9¢õ?ô–œÿºgä䌱úýšÙycõûåƒö¹Åê?¾öŒ,@`ûu²öj*›div}ÿþfy¹º]~X¾ï#m:‡ïñmè?Ü ¨oàÕöÿùÏ|¿`¬ÍTÿ1}·\¯W7/W7«ËÃ57¿ôjZíI„“üói“œôj’íI4x†#|ñû•÷â„1šbÔÎKøÒ}$DGI·2‰þlÈéâQ¿$ðSU<ý:.§£~íK›Ñ -ßýÅ)=ü‡/××·Ë~ºþ¿¹¾¹9XµZý»_Z(3úp§—WW××ÿ:”xÜH$ëÕ´ÜZäayw°ÇÍïË?÷`‚¿žŒ˜ 4çÝæöYº2›‡“Vìò‡ÍÕ¡ðws½^-ûåœëfÐІbA–C)K¿ -ÊqöK/:¸Ã<CÂt‰íÖøìÝa.ûeå:Õ¦oàu‚;Ì'tæûcƒ;Ìàƒ3ë—ˆ4¸Ã|jî0—ýÒž¨äé?õk_Îí£w˜…ðû=cýÒ œŠûz†1NÀ}ýÚ—£Åï!ÞÓ¹õmï×OÙûg¿}³À~ž»ÐÇ|§û¢œ×›åðÀûž¥˜;¡ôO¿&rZ2Cݳmùl’E^üÓÍæ¦îŸ#þ´ñCà!سJõT>~© -Uùö|zƒæ÷ ‡§3r÷”åbÚ¿)‹ïf¦šæ®¢ü—ëdf×T^ü«3{‡r†ªCݳŒk¿ü÷õíãáªð¤_zG;úpR«È1iUûÖè
ÿÜv¨£ø…>ÖÕT½Þž6‚¹¼{³¼\½¼\,øõÇ„'wÃDòâ -2noàöçöúZúÓçødåŸ5jOâ3âeòó?ÞoÖ«Ãw°_˜¨=‹Ï„Ûý,Ï
ߞߟšþ¿¯xt…„O)HÕô^íÇ©¡—в“±ÁòîúáÝíªoÙ~NÆ -ÏÉ3òŸ{o]<D¯&‚ÃnLd'M_'’¶&²G*ê©ô„ÃnLäPìÖ³‰ÚÙ§ý8•vö—Gèç3ÃHgÏõ@:û6‘§“Ξֱ¤s(ÒØ‘ àSq} -,<û]é1í:Ý2wÄn™ˆ>ô¦žœ‰è×~&Õ=_>¢O;mÏLoŸ[B¢4ƒŸ -ûÿE]Äù8‰t2Š‹qY¥£[º¢‹8%Ñ8ª¢dt§ã8/òQ¢ÇeYÄp!Gy‘ÚSEWrwå…¢›rwõª+Û+¼«ª”çBL&+GÙ8’»¸èº÷…zó˜)޳Xg#Œuœd0
{F'éHgc]åÉHkó
Ãuüœß_*¸R¦yá¾Q4z(ÂgL•\‰3³b/ܘ]ÓS¨O.}Cž*ïá©<.û´ÑC>cÚš+®A‰ÊØ›¿½Â£‡›tš»ùfãÄ|nç”gQj¯äòÆ3¦J®¸ùÛ+<zéSf'Ouó—qÉ•¤ÑCÒxÆ´5WœÿEsp·Þ%ÿ&Ü”/ÚkpÃÉ<0¹h®ãEóñSuÑãïOÃv,ó¼h/… ýNs9/š+>mÏœ–ƒà0X
¹"Ó È,¼Å ÐÖ€fé}%mô‘OÁðo!äŠÌ@:µsäçzË Cs_)}ÁS¦ùâüànæyU£xœ¥išà:”€)áÕ…çU8Äjœg•.¯Ó´‚n€åG ØÆ4Ë¢Ò»‚ÓIª„Æ)ײqVÁ‘¹žòqé¨ÑãhŠq’¥€ï`°€Õt¥Sü0OJø:ÂK¾…%"í®]àsŠq‘”1¿Éù„?˜9 H]ætoŒót…ÐËý$ü1>G^à&e è)ñî—Y‰Ç0Ž’\ã|ãJW¸„åQkI§ˆ}¼ÁæÇº4s—ù -GgÎ]¸)бƒô¥ Ê?‘Ê•KÜ®4ÅpßJÇi\ÚëÉ^ñh¯ÙqÙždìÍù]ìóõÅ+`LÞó‹WÂÇó—üÜåênY -ï~efö‹WYû+¿ - -x36 ¨5s|w¿ò–^MÀ4Ñ z%Ÿû_ÄÏñdªèœïcÿ>þ6œ3êÿ…òžé}Ço*ã|¡ê×J‚7êw€M¾üÇ¥ «È>W×+Øæü+ü€ -Ž:rð@™â8yEäoýVÁáÏŠÒ\¸7EQéQQ( -y -øÉ Œr ǤÊR"W€ã1<AU&fÓ´…M,a™U•÷‚?ÇÿyéµÐìÇþ}ümØHï)/
"µcÀA&nŒnS<ç]‡»ø -O -éxh+:ÝIžvœn$møƒ\g\#1_ùÈ]- -`›á°Ã1.`¿ÝÚ[41YRdÝ·$À-àÙ©/~J}ðS@Èö¸Ÿú2À@jGt®p—€h#?xË\4 Ê–»Ñļxßz±muã„–7Ä¥y}#dyÒ(¦eÅ‹ -rNäÿbq[¤WÖ©Ñ*þØëÝcã -?Ñ«ñÂ}Äyaâ¶uU¢Â‚7ƒX£ÒVñ ç3HReÌÈ´#:×Q„x<á -„æÖeg)Õ©6¦`Râî<å±õáEšÌY‘ð{8´dC2u²ñyÇzªÀ
ýlèã‹Q™BFôXV]ùùpˆd1ÌTº.ÊÜ|RŽË8F”*"ŒÆ—7öc¹÷o–nñÍTÑ»ˆR› -u_i‰UeYGbhÑÑò¦Œú7]”Ò1Öy{|WfcJ`…I©<ôèÉWð§e$§-Ò”±8ƒ‹x -U‰:x`¢Kå`]hïŒâAñþT‡É;¦tмs’:p}ÞA3&0rV@žIø(£¢†£«#så7Ò4>s¤pÞ(Séˆ(_®J™–o*`ÞãþÇiUh‚po¹ÍE0·êæ¢]ú‚ذäÿgï½²ZIš€ÁÙ -¼\ôG²êìæ“âaçµý-í›ØÍ²mzÒM¾åBù>ÜP3ÞN!°?ÄKÞ"Ûób,ë7ÙVФ›²ë“Tub0EX‚.5Ú±VF±}®˜µJ‰Ñhý›*²ÈJßûZÖ¡EØ_ùhßñoéÛ@ÅO4G»¥@}Õq£F2TÔ¹Z*2çȵ<;9¨Ðå™hæŽÂìÏ|¢e>Ñ - »€ô)þÛ~g8y¢ÉÆRUÓ¦Ö¾&ÂÞöÃC½;ߎ¢V{ÙëŠrFy¥ÝlsÛ×Üf}@m -æôµKî£|+¨ú˜|böøTϪ¡><µ[ð6?Ô¹4ï }CšÒ
å`”yMq=Q/ >fçòÇŒ÷ÑE—²Ý¤g~XIÂŽSJ.—=…ƒ-uÚc?ˆƒ±K¢.pƒe™Qø[8¨séÉv½ûæ†)?|«sêä?2øƒÑ§÷{õ9¤ét»DŠÄð/Cd?ð‚€Ïºa”ÎÿÖlãU|ýry™æ™Ž†w)„e!¢*…ŽO)¾í"t‚¢€¡Yc×<˜hfȇRœRÄ`¡&Ë»‰ÂE*#Ñ cifò8 -»'F¢
vü·óÁ¨¡Ýð-¼ DS²÷”1º
E^1¿›S‰ZÑu§ÊýnwÂr¿;PðÄñ"ÝÑÁ!
Ó`¨„†’åc·ž“ŸZ£Là-aœ¬º˜zÑ‚õÀ«Û òZЯn¢å%QÊ{Õ3NÜ“×Ч—8ðœÛv-lÁ»58™Ì-’tgFfÏ2&ùQ$·È@žc¨Ô#ÐÈ<ꃟDQƸcü-„€ -2fÖgdâCtÃn#LÐA"y!vI‚.M
ô¸µ´ˆˆ%—©€]7 GнI_#QìA™`h´Õ‘EÄž$°Ð°Ä<šA‘8ôˆ0†Æâl`è´`K‚Q1«Hõ¡!Š^‚C·KU^ïéÀVt•µ"ËTÀÉšõÄòÕsÒײGTÑ•¦ÁÐÜÑЈÑ;dŠâbñ¦ë¼
Msbxæ3v¦õYðyR¯«ˆ,J¾eŸ‚‰ü);poýÛ÷GYñ®Uk
Þ*$ü¼[…pK4™ôW(º?
,e¥ãæ:»ù—@ÿ¢%å)~l“ú«Œˆ|ñR -»Ày¶¿q?±›µ[µû$8OÉ@å¡Öºgâ2Æ= -¸úí¿€“¥I´ö(¸
üð}0 =EáÁêáÁ1öɤ+F -T¥pc]‰ 'Tf—x肉–3ŒOŽƒ’¥¦A—xàEb„0¯Uº3¯×ÐUv‹‡v8r&UW$‘îÁHRìG1p³˜úÁ;”`“¨løJ’BÈ}ñª¨ªºO°ÖUKbÆSdŠNÊÌ)üè+ S j„mHÂB Äâý8˜. àÒ T¾*|Âñ¶œ.@iN(ŠuæÚÁT„e¾‹À<àt‰¢KmIé&»ƒä¸F*fB4˜†BŠÉ´w†ãÒtH“HT#ØÝVvÁ‘N±"ìAC·è<*ÅòBÃF#,F\¤¨%¤7!¤š$²{qPQœ"Ôtd &ÔÄ((· -¥Œö/Qø-q¼
çÑéÅ)á€8
Ø
ùyt vF‚üŠC³ný×Êt½£Ñ0ІgîQÚ<`§#ÀÆÁèfÙóõYA³C5 -·FSÈé20ŒÏÖ5…5+ tú%¼_+™¬ˆ±ò²GºÖÉ󗽯ß&ÆžKž¯‡ wI¨gI$»ë€y‰Ým@:X@6«Äñ~W†,P¨uЧèeẬܳ]ÌB®Kþ#ƒ?ØmUÞìÕçp…üèe’Y[AiŽ2GAö -5A ~PàMm0BªÇ@ߥÈh4t¼@;“‘—jïJé°º`œ$~=t-.Nš!óg@…jv UôZ¹]x}"+"=JÕ}vhÅé6ºè»‡ÓÔtÃ) -ÓתûµSàéÁSÆÁpÚa`Úà÷Fa¡ÆILÒ…N„ó/² -O‡¼N,Û -3Ýð^‘Ž|c”-×Þñ&p§€yáHÍöTÒA£6TO;NïŒ%•åeNš§!Óvؽñæ×â 9•¨†Çöýè9#bÄ+‹„å”Ù ¤@X<K¨êŒS6`ôh û ^w‹LŒS@žÃ¡H?º—Ù0™ÏJ6T§€aÊPLÍS}ò 5ÜVxÝSqÆ)›_åG€X+R„_ºj÷d0ä4n¯ÛÊÀ˜¾³è\Q†¶³èœ ¸>¼K·/U¼‰¡Ð/á!dTsJpÑJB<‰_…^3hÄ`îF^€ž5Ù9êAE°NMCd.UÞŽ§ˆwF>/§L!_Šs~€òÜãQ§;» -œn0ƒ¥],}Év+¨&«‹e Žœ‚âŒ
‹SäÀÏÏ f -"sü7fÈT@ ÊhB›ÞîeÆd90
̅ר’¨ðkäénôR“_^ -“)´ý \E´¢Ù˜‘È81ÜÍzI·âá¡Æ ºÍ"(¤²ˆáLãÀíen~Rh³ÄäÛ(z§qŽàC¶`*4TW‘C(t˜ô6Ü×Á¬tñ]#¯é˜±^ByKÛ›Š‰‡à H¦mNÛ -p $KTËÔ0ÓˆLÑÑ,ÙÝø–Iû%§„„¾ -2$EGbp'`ñº3ƒˆMšbÛô@œ³JG@:í¨1•´Ûâ.¢BdÈ o£¶C–<ëLq¡¸|FèQ±ÇJÐÉ4tÿ‘Ab_¢²©«,¡sßÌDT܆Cb“éh…)Š2<TdýÛ¸Juè,B3O•÷¬áN+…>²a°8wvðx¬ -€ŽÑ1ìšL3º³³áª"cx¬9âk æBc!@0Àæ%Dhœ¶
€¹Ú6«`N×qœBß<õUÒ‡¾Ã;ÛAu \ô˜!„˜Î”ðÅj¸9ŒJ‹!Óû÷“…‚"ˆß{ßæ·Ìà¯Ç5Ä>žÁvûÉQ†Q1tµ—f˜LÕñ(ô ëx¸ -iM
†)!ªˆ%sY -Õ§SÃd¾j*"Ê,¯Ž±»¨„HhàÙÀ•f( -ú´`â”ÿD1ÐÇ+Ó¡2RFeŽ’sG}:ªã8“M’¬é,òK”¥‘ŸšÃ4±UˆýL 30°šL™X2 -¿Lï=DÖ0îï»í—N䝯Gè2iƒåú #îׄIHy’XÂ,›Ã`ž–=ÐKtF
·Ñˆ¿€8ÆøOxVÑk¡Å´¹e0wÚÅ*UÄ»TñÔ") -sS‘K„ú)0ÐdKUfo0T(Þµ‘ï_©Ž‰¡—[³Üá¬Gxô –q.¨3ÂSY-™?𻇅˜S‚"l™‡„« Á(àYÄCÈF4z¾!Ä}³¶¡P -Ú˜¯MÚ!ÂðE]ÒÐmÄÒ(ln/2çiåÓõMw^ɺ.Ü»¡Èã>Å£& - -ØH€XmܵZ³…öênÆc2³p«IMŠbÉ=™Æ05r7’·±“G¤=HIÆheÂ×:p(ÐÂØ‘ýþTÍì:þÑ®
…ïÞóø<ïw‹
‡¨’§p -R¨Ôo &vmÇGÈ Àú‚›ªì]MdúúiIüíZe Ù˜“:=°ršËõTq²þ„cb,ã+Àpw™_@Æ‹”ˆM'²¢êaš"sÈ*ïo)ižËv«èým8ϼ¶mCEt4œ<¬
쾯»€Ÿ9W(m¯cÃê428\k£Iìê0s¾—òZ*VÛE˜mé1è[§CH’ -‹f™£cû&¥Ðå‡Åñ´Iàþr9‚ÊÀB÷±A$±¤iÛ+ãEa<Úƒ†Z†BixšrܼPéX8æËÐé -|ìBbhPBOӢɞ’¿[÷ÖÂhVÔa0˜‰©,XÄ0tæâ%xÆÙÐ9ЬÌ&“ÌŒdçVÑñô7õª‹¸7&¾ÑyÁI˜ùTGKqeŸ"bî‘þâlS±Ê‚áþ–Ó¦9+ß.V†òøý´„Aä‘G5‰’›“$ÀãèŸÈ‚û°®AN@–"ÇT$2h¥ãb@÷™Œ‰:Eøcúj´>À:¢0hž‡šggVðŽ•Ðõ‡]€1ìt2€å7§º€ùÚnЬ¨ÄOtnYÄZü-Ô'8Å$9¯s.%±°x2–@¬Õè°‚€9r ¯P¢3¦=mÜÍA~iFh‡±S#š:£bŽ?ÒãÿÇùC8õâ“¡¹a…žºÙkp~°ðf>ž#(ü–YÂÛÆæ ?<S#°…-¡9'ìÓ´½yì¾aBÐ%‡FáþÁ“ÞQzc å -1ÌÕV4ÇuƒWhrla™Ž>ÙП»êŒ.p«æç¥3Ñ.‰²ø%ktXDUÝ"Qa^T,ÑÁb’ˆ@/‰ŽY%$#"‘*‹[¤2"‚’‚°Ñ`ðÐ>9U‘I
Ú4Aù„~_Ì`‚›É?„¢:9ìç¦HQUMsJ*‘h*$P)|Rg^Uv'®a'"¡("*ˆ¦l°S -E´P¾(Êœï^¡€ ¡<W†™‰%ŽŒCÄ›ÀË.'-êÕgðü9tí" ~5 -C9<b`áã@Sx6=ØÎœ&G7h ;TQ3é4•Nî~ÿ ævÄCìšs<(Š’%C‹ÆÀ0Þ¡Heû$DÁý/û¾íowDÏЦÈTÜ7®ÀãˆæéîYÀâ¼àá¶àS*}gtL»¬h$<ØÉ(÷˲ÿº·ahžªÂèXö-~(‹vÑ‹«Q<ŒMaÈir5ò°iÿ€¹Àp/‡!)Ä(³“´-¤|÷7Åä§3#äí7)%Œ!Áä×è,»Èüɹ¡”
òI;ödC
¶OùG5‰Îx*7‡gó$:åvJ.OTx=°Ña'Œ†yÑÈÌ0ÆÆf‡gí‚F¢³‹A𚺮ռ¤qaš¨ -aô…‚ªj‰ -nitÞÓÐUæPÆ9¼ ÅDK
õ+<‚‹Ö;å3ý¥¡0o¨óÛ4Š¿¹Óø”â”NþoØžÎôú¿Gê"‚«h¾b³Þjö%_§’oY¾z³äÍ4Ù>‚º™G|€¾Yá -TÕ¾SANïü¨zx–™?êCz!𑤕0DÄÓ-ö¤²Ãx¦Œ¼¿"Ýz%tH†|½ÞGäfžšaoaoëxˆ‰:ÍÌØÇ°)•Ø^KFÙéÙ6ž,bÂ}àè–^UóèlxÑ‘`ÖÆc®S5"¤¾þFÓ¸6Xüx?ñéû1t Yjƒ·Sô¼˜Æ|8ô¤ÛwÅh¢“(ç±Òt\[c·Qêa•˜ÑT>:M0ËÂA‡âñ{åSõ¹-ýÌ0‘y×ñ1ìm"ìm'ØÓu†=ÚPQ#ªÁÀí×;÷ÂËL¦ºÛ¹ªiN¾^¤1DµÒj”3¸éˆÁýW˜`|›J¡¨£¾Ás¾&;óùÑnâÓwƒ'ZÙeòýTðÞ–ì -r—bà•…ÏxÇ[8L?$r
Ñs¢8VÈ„KOTj;<µ6-knpP“hmÔµªÞwEª÷\ˆÝ#1Köd*AaDn—)<
ÏàËÅ»”3ýË»®¨ÍÓŒ[Àûµì -û-°Ý¡Meh²g/ ÀϾ™Ü&ÂNãŠiõ¬1»¨°Ú¾a½ãˆø(ÐyE™ÍW?²Uæ!PÏŽ™¥ ý
q'ù‡û‰OßÞ»MI†h`XIfük5e‡Ê}UYÅÇÇ£fã¸]mt¡¯p˜“í}1sÔÂ7{s\ëÁ¿ÙÂt<Ã"Ë}ñv¯Sñæùg«í˶KV;8ù½Läkµ*¬ŽV¥Zä5Ï`ˆ«>É×êF|Ùßòð{¸*¬"hÂ[_XDUj"]Ëwß/SýSôò÷×¥&F| û`¸.ˆ¨Ä˜m -„À Ãz˜˜CöÅöãíj§[³è³Lµ -¨j«ÕN´lp¸…\7_|ý@ñ|§Zt?g“žë¶›¯–/[.w,!âøïù{µZE›íH¾Õ‚!3ÔÂGüR_£¾ —*£êµÏª]jN¢~jÙ6¯ -ÖöŒÍæÎâwþ(w–¾¸ówþRƒ¿ÔàI¼VúRƒ¿›ÑÊ_Œö‹ÑþŽDEsCÿßáçЇ9²þï`É_ž‰ïgÉÊKþbÉS°äoÅć©þ;xª0ÈS_“§JÿOÕ´_KÍý7lû0¡Ð˜}ékßÿïS×mWJ¼2RsgŠ{DÁ;øpBEL†¡8Éó -\1ï´Ô÷*i=·-kd'Wý…ùF©Y¯þe
dÃæ[í"0^|©ðÔÙjã¸Yeeƒ\x?p^Õ›¿á›ngxxýÃc0Ñ›LµÁà×%o;»v;&§Ñ«'šª5vŸé¿À±÷ð®vßNù»oµÿbÓ_lúdÓ.÷å_Þ¦¦ãÔ?ó˜Ì³{ñ¬çîŸ-Â݈Ël¤;
†®…ù¯ò¸,ˆªgË·~³jÿ±ˆ -õøIØã¦>¨>•ɸc±ÞXöµ5úG¨Uë¤R8‹®ÜézÝK£Ûšrý\Ã÷—
YE?…©‰šl²•Q;séÒÜäôÞ¯n:v _šÈ -S\}øŸfÍV» -ÛùV¥ZôÅÛ½NÅw´=yÁ³¨6V»ê‡ÿ±d‹«‚ªS¬7ü•¸Q.Ò§øCÁ¨ð §Þ$<ö&~,˜Àá@É*”ðîÞcJÕé$P}'ÛèÛyq^_äÛÕ<Ž–Âp âK×òHËçj±Y²ÆF*¬îd/§ -8r.ÈnåÃü3¬ð<¯/j¦FYgLÝ0u™²–èÙ‚¦+ôCW5æŒsÒ°sjrS4eßΦlú⛊j£M€O5B±¨H´ñ®Ë’Œ%‚ ˜ -½ÂÆTÑ>ü-*¸Ï›• -¡=‘Í5ó€¨rÀìkŠv6A5rÛ£íHM£ø -nƒ’H§$C1°eCeAe
¢3_jt¸µ_Y”é¼AD€ã›ªi7òWæð€Eg(¼%ÌDeø?"#B¦Ý’„¨“ w²=Ó†#b“Mr»@#D!ƒcÎй¿µ¿9‘f¦ÑÓœ*À´‘kV 1àT²ÁˆZUê6æ¸åÉ Fp &‚§ÙíéŠ&ª"©9H*ØŒ$á”b{6¥Hƒ¬=•& -“=1 -†H<¨P£ãÏð’gc-¼³‰#6¦!¥1*&yeÁÐ%¢™¯{}>›iH6þLÁ•¸:²kœA±—‚+{…®t$¯i$Ñ–r’kV¯"ÿª0)Ûä¡¡¤ g—#§L"ZƒhßÁpeÊÕ«@›2£^Ñ…fÄÃ5VJCA¢qp¯¢èÿ¸:u‡5Êlâ -KK§1
J‘çx8¸†ðQw’gv‰T–‰Í4eQ5)ƒbŠcÜ2H/"Ó0šŽ…±„ž%ýfíj¸ŒE9†d7«I2£]¨YCà7IM¤É¶%lËZ.;¼’‡ÃüdPªhº4Ø5ÉEhžŽÄÁâÝ9G±ÃiJìŸ.$Q’ÛŽfs$Ó·Ð6C->Ó« -xLÆû1ûïÖÓÒ½¯5øIK;íüŸû|üü!† Nd‡ŽP’T¶25M#Þ -vŠ)Òâ#@d¢ŽgÖüÁy,…„¤æÈrÍT·aÛ,NZ¿*#DUîÿ¹†ŠìEµ¹´¦Ê:I´v’Ž uâT -'&IT¹_8
F\RÂ#¹L{¹fF€î\—0ðƒ·¨3qGŠn³Á&¢:¥ÓU涨áüŸÓ… G.ÿÚ& ^K–Ì!ÑhºƖÁ¶4È2Aú•\« óF‘-'©LâÚ?ð{ÎÑûÿÚ6) -N,ük¯K«àK4kÍ6ÝÍ^ËYeÛcüRvôeÉÑÚ€}ºí uAJ—ºº-Ó%Ö¢M*L"¬; -ÑÔédÖ©C§oêmtOGv€Åº¢]–@àó;æUÇÑ©n/% VºJT%éˆ,ì^Ó5®‘1YÉIËkñІéÒ—È;Ž;'Û¯äzš¼.¨™£sVÑÛ]•©vº^_›8päeø”ßÄ“ÚâW†<f»N³Cö*÷g½Ð¬a3ÿËÌÒn³²oiתµàO<ßyµÖœ•@‚(†€Q>.ærX¥W´ù ? <· Ùü½á}ÎXå¾÷ç-ïS$úïùvÉ[–n¶yQ¶]À:äx‚÷Ý.ìgÉ-8Ëú<¯rÝ|ÛybH -üÏñÃðwbaÝS¬Tk¥¶ÕàuÈÖS1߅ν.;¤¯V†Ç²ÖÉãÖ.‰¿yb§R?ÄøÍû`.-4:Å^§Û¬¯©ìYú{§ÁÃðtЋµß¦Ðaç³Ç°2
9~#ÔšÅW«ô>žÍ†õùPdC?b=æÛ°h -ñGÉ5{í¢ÇžO9¦~ÿ|İjÊv\×'!ó?G -»wGb*ŸlŒÇïÕE‚Nú±>×`8ÜêXüÀÅäávßç‘
øð -M°4ëhÈfÛU0ßœsþç“mx -ËCfAYÌNÚYó”Q2 -Õ¥ãf§ŠÒ[‘}b‚/¬ Ó'9øb\é8v:€Á½Ž
-wüy´Ã›)ŠûÎ<êº)útÃ=pPß§½šÕî_|íNkýÍ'ÚÍV¬måÙ6.TUV90}y£EòM‹¾¶m,Ènæ7¬˜íu[½®ï4ßéZíê_ç;µ:ÍZÏñ†Á«}ßZÊ;_}g£¯ -µò]ËWÀ@Gâ>¶òklœ& -Ðø¡»|LQ
}œü¡¾wFKæ‘Í:<o<a"èr<¶©Ñ>t‹cVW±Vm‚€ÛT€6ó|”ëSº«Kô}Ñ&)ü›…IŽ} ¸LFñh\ãCð¤—G:ñeXžËIàØ‹½C‡M9$Ò1Ízw©spÁcpØ{RS4sWT"BDðè´ Î¤{µšÕ^À·€)x;y8-Ûžlþfµ[¸mnïL
zúŒôœUÛÍw¡³L€BU¹ã±vÆÔÌ[í½¤·¦÷õîªb¯“5ÔÒ -UäT|€c -kv^«-PD¯“«Ù@NòQ= tDlj]Ķç«~¶³ß,ìÍáa:ºÞOxP×m!ê;>O\ÎäéXºõ\Páóä•ú 5ýq2ýxØØsì¥Q¸µk²üjÃÕ‡%d_Ý3‰;¶U<íñ TDœó® °³J¯^h䫵 ‰èÇoÎ;M֙Ǭ˜„¾âÎ<,ïæð¹÷Û§ƒ«qÇö•Ô÷°€[Ã{H£† -0·ZÖd<*XÑö¾íY»ZǘªIªl?¡8:—8ÒïfWv}îärï,rñ6æ1‘T -‚·×H’¹é6ÃzkÀìtͲÛ}µãë5^1!ad:ÜBÓÅvµ5à&µ¸§ŒWéÏtø#°i zÐô~o¶_ãÛУß
ö<EÔãäÓÏFÀ<y©}DBZs]ÐHñõ´ëjü.¹$òá{hðÆ -Íߦ`@v(r¬ØnòÝLþOË–FÊT|k$V&ƒÛ?ƒÐ~ŒvýbÒ §¯ß}|n@;ÀHÒÇ]~ô±1œºN‡1C¼¡‚<ƒ{%àUÕrÕV¢•‰Ë - %a¡ósP¬Ü?œ>ÆeôFå$µá#òß^õù”bB,‘o±³U[®Œ–3“·©úÔÃ>¾ÿ޶‡+7Öþ®Uò>ù -mz¤±˜ -5øŠ]ºÇ§¹ôRÓþÒ.õP´|6ðUiÛ¿àŸ]¸_óÏ$üóR¨àè°t6³*Ðþâš°ã_Ú®Ýúƒ©\Ó¿|°ñ‡Nfãþ•‹‡ø.õâÂAÿêsuÓ/ÔOübG·üò\wÞ/÷Î5¿º°±ï×VæüºøØöÑCÙo¦•]ÿÚ¹ÿÁ¿^,Âù7.uÿÖÖ~Ö¿}±ùì6Ä?¾¶œô'nçý©…ö¼?}üõïZwþ½lkÎîÅü™|àÑ´ -ú´=ÿI!Võçöÿ¹puî¿è½Ìú¯š+)ÿÍãfz¹»:×ý'µ;ÿÓ™ºâ/\œæü¥«Ö¼¿\ÚÊø+Í|×ÿº ìúëk×oþf6²ã+^¾ù»+Òî¬/ß›kÅgâs³K•«óÙPb[˜
wO³Âa~}Vë3YõemÖ8Z\š]_kÜÍn-æ7f£íë·ÙDå47›~8Pf÷î÷j³™»Ýìl¶t¨ÌžÖN³çÝ‹³ÙkÚ¹‹ÕfgsþÇÙBz.¯ïI³Õsh >׺Ÿm{ÐKwñ\››Íµçç”íÊ\°Z¸œç´Ý9Q¾6æÔ94gÔó¹§õò\ôôåf.y´ŸÛÍ é¹ÌåëæÜñ݉2wö²ž»ž.Îݛٹüq¾=g=çês/ÒÁËL`®qš¨ÌubÏó³ÙíòüâJây>ô°S™Ö^æUÿy}Þ¼{|›ß:hùçIqq~WŽ…çC—êüéJgsþ2²¶3·zq<Ÿ_›»/Tæ_Ÿ:½ùVw'ð¯÷6g…«£L Ô[¼ˆGùF@ëÆB£…@\(ç;•“Jàð`3Èé‘hàz¶{x¨½¾J/U-ðòøth•‹õ)¯,,¾–N"õÖ‚¢Ï®/¬‹·Ñjli&°°£],^½6ÎV6nNv -y¡ª,<[êíB#yYè…ƒ—‹ËðbØZ½ZT.î#‹ë'ëw‹ñƒ¦²¸—͕ﶶ/«KŇ^åp±¬]‡ë™½ÇÅîktøßâÖ¦)R6¯–4S[[Ú|1ºK©ôúÕÒ!pÅ¥³Fnaéî._\*í·2Kµ¸ -uã³ÁŸU®&BÇA=“Ù -n?t"Á·d'xy-¯ö—Á§¦ÿ XÝ:ƒ^‚o5C]$ßBË‘…Û¹eí>ù¶¼½«¼.ïÊóÖòÉB3¿|Ý´–µüÝòkõþv¹Û|¼
ƒÏ÷!Éh>†Öwg¡ä“P$k¡Ëëv(?Û „^H¨;{ªÏV–çâ+Rzïhe#ܼ]IuÒÕ•l±3·r},¯ŸäÔJ½ðzžmœ½†ÃPX_DZ£·ËðAÜ_¨wrøéîò0ü9„{Ï7B$¿=Œh…Z$ZiA/‘ƒ‹¥ËÈEfc>’?8ßÔöµÕÙ}yc5|zZX5Jsêj¢·û°š]ëÊ«7çû«@ˆêêÛñCAXZŠmòùÜ«°æÓÂ~÷xN¸xN^ -…YЯØ[ÊÌDñ(¸*næ‚q//ŠçM]b¢)6v/¤À[5&I›‹!i«™ªI‰‡kéj9²#¨Ko™¹E9˜Ì5dM >É õé\>Öãûò½9•_2φ2{™fÊj7R67ôeÿ:4«\-Ïwëz¾£täùŽz]îªæ¥>«î$õ|5T‹ágA}[YÖµååø¶fˆO»Z:¾šÓÎNsZ¡¶TÓÞÌë}ùNÑt3XJƒ<Ûy8¸Ò/¶¤W½Ôn.ëÊ–Ã쥱±»Û2qŸÙZ?2ªÑs.•LÉ:86ã-ó$UÙ0Ÿ¬yXïÆÆÊÚrõúdm-=ëžµ½³vmUZkÕ³ÍäL`}þ Ö\W;éõdr±³~–¼Ï¬—.÷×»yárCXšS7¢‰—êÆq¥¸·‘7î‚oå›§Íðöubsk¹Ü<ÊWŠ›ó›}UÞZÙ9hom&÷[GË{[7‡0û[jka;N¼noµï·³Ìñv>½’Ün·òft5»³éòb4·ðGKõ×VÌÿpÿ“ó·ÕXªtý»|¾,Ç^ó•øâÆëKÜ<éÕã-¡ˆïÌÅ[íbh&ˆ-ˉ˜”ÙJäºÝýD¹°s‘œ¿ê•’zö¨“ÜÏF"ÉûËJ,Ùz:Ì¥V¶ª©¸±Lßùc©êrý:½xùÒI¯¯VÌô‘õzž.d»ÿZpsG
;{Á#èeç>P<ÜyÛ»‚yØM·_w¯*©Ýúríyoåì`k/¾ìß{/æN{?Ø“Žö·¬¹Ð~î¬r¿_¹°¶–²·ƒÍ›‡‹0"Mà—ÕnfÉh_g6¥øL “[Œ-g*·/‡AÑq¸U'ÏΫÒáK|ÝÒŸ+G1-u{t©ÎÕ7î’ÙÈaz=›|¤ìílo%û–z]<–*ù¹ã½í»Þñc÷¡{â¿/÷NŒtsö$k.f'å<]Z=N·åýôÂXÝ>ïçV…óÜÎêi!÷
¶Îü³w¡3ãl{ãìxm){öÜ-Η‹sçñÛƒµó›\ôä¼}¶þz¡>lЇ•ËòBêå2Ï)3ËØsùüòÆÌ^¶Ë[©+m÷þå*ZZ¿z~=,^‡žæõëäýyáúþV2nüùjùf’Ù¾9[YkÞÔSÁÌXî,ßÈÏ·¥‡ÂÖ]p³è¿Kª7ww…ÖÖ½ÿ>²0¸_?Z+ÜŸŸä2÷ͳšþ äµ¹‡¬ÿ¦üPÕ—Ï#çç©Ç½%Q,^UBOAe¯÷”hˆ¯O·Ýb~~¯p—ߎ^\æo¢Ç¹|oïø¤°~z|\¸(]ÚË…Ó¢qÔ½˜ sñ¶Ø<ØË—´•ç—ÒIQh—ê·AKÙTëxó&nÕë§ey÷XÎ^^õʯå¨ü,KòÞs6·ðøüÚiú+òIc½r¼Z¿¨Ô^Ûíªr\¯žœ¯ÝVGÐ>_´ãâÞKî.Ti=ïm¾šµÒëE2¦¿v^ZùÚFêĨ]÷D«>{UߪG7rõúƒ”Þo,.™‹Ô¢x×(® -›Í=ÒmîïÊ—ÍJak£% Ù¹Öqîñ©Õù÷goÆÓ–úv¹—ŸmûåˆÕŽFî/ÚËúN'(›ÿc˱zG˜´IJkùž½ªlgnC—›‹ëù«•}y!ŽGÛ;õÊÚsÿŸö¯,-&ªùHg^;ßMiskÑóCe{-s·xm÷Šz:%°¯ç¡“|I>¯óÑõ‡Èrtc¥Õ‰v¤Õ™@t=ãoÛ•ö»ñçÝ“LtC±r`Ml“‘ÈâóPW™Ò5ô§'Ó5ýf§›|¹+7á0G2Ø^®[ mis½tR™¿Œ¿Ô/gɲ°_ÙØ¼n–õ‹“Û»ØY"r1¾So½µûèÆkú>ºÖ‰ÔCÉ•@/½´S*ÏYé§Çl/Y¾¿ÔѹZ+Ç+ÝDE¿ûÐñ´,Š™·èh*¬ -¯Xñš~\g#¸Î¢‰½¹ËÔŠ©‚”ܻտ¶ôDó!´qQº]“ -s÷ÔìV# -ç'æqàê<–MÄ“å\õ-úv¿ö¶r}öÈy£•nRbè"®\ŲéäËåc¢ú¢®—ëçt¢¼,·žtý´Ôtû3roõƒX6³|NK76¢íÃìw[‘“ÐöEþ
hK3òÑõ³îlìl¿ÛÚ -¯ÌQSb¾Z‰™@ìì°³e&ã™ë×QÐRMO½k½‹&% ÒŽr8L9Ýãt𸶞Nª7Rhkç)Öž3.U±œN%U=®…³Äp"âîÅ -uš\}j-Ç_º¥z¼Ö¸hÆÎ*WóÐÄAÈi •ZiIé…°~;-Wá³û…¸ÊT·¢ÇMh›ÆSW»6‡îÏätôyó -üS² T.cçb§¿ÞBìôì¶f¼ÔÂÄÑ\A -À€½°aR‹(µ¬Œ7F£¢^ðëA9 všÙà¸öh,·Ûž¯÷»Ù
¨t¾
ÿÜÆ¼¨¤î—¢67N<(`ø¼Y<²[yˆ¹˜…^ú'jôÔ~t"¦ÁéEòïØÈ@yõÛ-O}è`õÜGF/D9Øó0cÆ2Í”ÐØ/»Eþ¶ïÉçeaL ‹Æ;*—T†‘E/°—QÈbc%LØèðŒ+D*цgÌÆG
ßðþœ&ú¡ñ,R6ÜÛ¾N±=ÖéÕw¶úg•á[dÕ£– -_ø. -Ó„k}…†qhÌdî³}^]ŨEÚ»|ί\?ºÚ“ëâÉmêßeY!mÛS»wɃ¸¶ñ“èírü$pß%uXØßõxòÚ"Dö[ÚA$¹÷¢ç]´eˆãè5võ‹Zæ,–=? -6ˉj§ª¡W!|úCê-1ÐâV¾§Ù?Hn{õÊâNâ FUÖDÃk?x}Ü\‹%6›G¥d©n®ØÄ·4vú¶LìÎ1anú·"ÌÀ¼g—›êšõ´`q<í¯Æk‘SÍ5Hí˜ °ÎûÔãCà€öGßâKŽÄª8t\W› -(›«É½ÛÌ2*§T¸óFnðÆÙÂ|.ý8·p,¾â5c~%¹¿\"åÆYû¤I<^&ÌÙõò|®2¢S„èi'ZÖÊ^ñ†sÕzŒ?D/æ»]§çLñ³_ëfÒ`ñÅÕ³H¸ïÕ¢_Ø»ÝÙàM8ò•<´‡/åòZuñäTº•X:y½»<jh}õÔÐL`ý¾y{7©ÒŲ~T\ÏTY·‚¯äG[;z^¯¦Vš7"pFUŒåÔôýN½»¼ˆõ^l3DEs%‡¦ÈlkW;‰£ÄÅö -{K&Û}çê×ëòω}uë×Ü´wNkEÊ:¹yu=¶¶<jYÙ=K Z…;3²Ü-Úz;ÞúSGëûñUïNQG™î¿ˆ<Ö -M–«jÏW;&ÚÛc@ËiQÈÇŽÆ×Ôå·J»éÕŽƒ¼Åç¤_´GÂo@më×¢ÎÎÕ£œÅàëÈ¢AXW¼D:Ú^o«Ø\[«šœ˜Ÿ¬©nnïnߘ]Ë‘wX9-
#å}}
9‘‡Åñÿ™h–ó;[êç'D³³zÄãõïŠZ~fSäÜS»£[•'c*áå©–÷TNG_o¹(ö¹m»Fjø©ýðLõøâÑv–Küf{cÇéʪœ†â£¹3UM{Eâ.¨h/ÐX
•ÆHý©šÂuR¨;ÝTç{[ªs:´wĆ̷Wí4ˆÖønÞBI´s³nmmu¼Î¿\4ܶUâïšš™Úçå°-Ú›ü•Á…•£ÀÒüцöÞ¸voT²]<^¡ýÉöÊùkC/‡—•œ'~¢°u{åôA¤n‹Yâ‚ÿœ–uïXÄ,vR4^ŽÄœv‰jmä(úi°ŒlŸ¨»ÚÍ–³ýbÏό鲔Gyé¤HQ»ÞƒVoÃà®®OT;Xm
ãEgÊVЧûÚZkŠ{äòòψ}Ñ®ÕHƒÈìȇON¨…×)Sm«C}Ýòqééiyü1›4’#’Ãúlýòɳâó¬+ÐY»s¦sajcBT8%Ó¿¾T514{6TÃôæL—pÖït®V¹+ÛÜî3ÕÛ=#y'ß="òþ@ @缙ΒéšÓm'ËKtgÿÌBñéÖñŽƒ¢ª½¾åæFqo\(n®|±ë‹,¥¨Q\/+u›óg¦su-²í¶^äœsf‹(ißhY+éèÙj?—ò½þ‘¹Ü@a_[8/Ã3Å;ºý鯊ÔgäýgeçÊxge´fŒYóŒl8t¯iÖá’™ZOEÞ#—{×bû\ê:——ηn7g– -çýòb˜ëèÍ>ån^xÙ‹õ=CÝ£UuS+b_Ö¡&¢(j¡Ú¢×{Zœ}ÑÌs‹Ìéûê«êrçm½ZTY»èéðÔŠ«ÎS,®¡ñƒÎÕ¦n±¨‰üݼډÎÙ¼ÚÓ'Å=²Ø²nÙ/_ºÐ:¾±z(·1æå7ý˜´è{oõ‰ãÐê#ó…ÇN[-ާ³–_*þ,Kü§ÿ‰á;tž¦Ê¥jOóäJ™·Ì3PìiÞ8,—óW4ŒÔ•G>‰üMû ¾¼yü°M´º6»sG—eS¾)ò©ßÓ8Zµ‘í.ïnÌ.)+wðÙž¦Í†l÷àLmvñÆñÑÒ©ÒlÏQÝXvñÀTGv‰wÀï-kœ.ÔV_™Ýî©8ðˆDTÙ±YÑ<´ÔTÞVS^#ŠÝ¹K+ÑO½Ý‹ëíY®ýý¦Æ•ÖâÝÁÞ–¾Úƒ¦šî†“¥™ŠÉÎý¹oÇL`z<ÐØÚ¸ê-†íÐZÊóF<í%E£b}ýUf»Ü¡ÒòþÚ<qÄ~©ÿ`¿þ`\¬¤¸Ç[V1Üè–Ô'ý;›ùÞµ|Ÿ¶æ¡èb÷ç½
bÙ5Gž¦®ì|mǵóÒ±YZvPÓUQ³WVü³kKü×Ó±+ÛŸ˜1^iWõBe]ÏB©áJòEû:nµÑ•Véër¯´!»pÿÀçÚ7^é°o®"Ç_W]i–+ºÚƒ‚â“•Vn.Lw¯´Â=çiðŸ6ÞÓœÀBE–+wbw«ßh_½¶¾“•Våæmï»MV:½à
œ‹®T{ç4²Ú®ì†|_ïâ¸áJ»ºý㦇×?Ó4¾¤T”Å•ÎØszR”ä¹£¦~¹ZwâY-œ.ŸÝò¹ÅJ+vŠR¿·-´Òá‚‚¸•VVž[Ü®4Z’ƒ«]ÜŸßØ7YiËrUu Ïg¸Ò…æ¥Q³•vg¹òÊëçŒ÷µ!{þ wc}Ôx¥#í¼sýF+õÔoÕ5EW*ÎKlQ*jži2^iÅô´7Pë4\iNàtuÞè9ÿÑJÅ]o`~>`²¯U¹®Íív³•.{»Š—&WÚåm-X/¬žÖVšåŠ?À‡¹ÅÍ¡•N—ÆàæÁŠÆÐáíœÛĬt¦ÁÛ_]â“+-Š[i–ë §{}§jt¹Ä/V[½_~ûgg–MVZ•[½¹X0[i‡w h¾V[©,cqûÚ³W×rvpÔp¥cõå¦+í[+÷TÖü³%Þ±EwŽÑ¾äôu¯Îθ
W:Y°}Út¥c#K+ÚJ³\‰û:ÛåìÛm0^i¹k"ÐÒÐh¼ÒÝÞ£•Š:Y®vr±+çÐä -µÖ—«b7ª{"a§ÎôÓéß¹I³O7¼ÝK®£è§ 5¿¨z;òMþkqò=íáí:»^÷iUoq<ôéÁfMÂUYµ½‘3eôy°Rî©›3ý´Æ_4ºdþéÆòBAäˆ%~ÞêÏŸY5ý´ß³Ýì7ÿteèT}ôÓ¸#V•;”³ºÒmò_×tçw7L?=U°W÷ßNx΄§§|9u Glb¥wlÛèó`-×áÙÜ7ýô¤k¥,ÛüÓ¹ŽºÆð3ø|ɵPgúéÙÃáÝnÓO7'ým#ÑOŽØ¹Í@Ó‚Ù-6i¤¾ÒôÓ^EÓ”ùsn¯Œõ›ý×ùÙù=sE¦Ÿv¶¬¬›~ÚëoÎñ™±Ölž»ÎäÓÊnogcQxŸë -ëã>õŒ4‡>m/mˆ¿*»Ç—ºŠZ£ŸWTÆÞµ{× -fÛCõÏ’kK~ºº
,V«ž¶ƒÁàßbê1ÿaž¼ÃlÏ.éw˜gÇå¥ògìâŽÑvùÇIíþ-r÷¬#Bë[m×|û9þ‚Æá’P}.îsbÚcM¹åâ?ì=§]òNGwE”
ÔlˆûØ©#Qµæä‹õjˆ¬/·ìLãŠ[ÔN9ûGK¥%1Õí~N–+ºZíNÇd¥U¹ò>gÖx¥Ó3¦+Iä¬/®=¦ßWíNÇt¥2åštM¿ÒŠ1q¬[mÍ`Û˜n¥kùù¹Ñ•jÿÈJËã¯lýGö´k+f¥îiíîU¿Ú˜Üè7]©Öú7Y©¸ÿ…èJžÄìë¼éJÅ>¨0_©lý›®4Ë%ÛÿÆûÚ]jµÒþÓ•jmŠèJåµ³ZÙ¦9«ëµáÕkwûÌÚ9;¿·ptn[í›üfUîÞBçÔò÷*7Bå.T[´‰}žk
Õ– —îRá9ytFu4M£ýPå’?ÖwÅË'=ÅÑ?švׯC7ë²N -Þï7íºv#K,ÔÑTÛwVÛŠ¦Ú®ÙQq-wÊ5—G«¦Ðê›:]¡?ŠvB+КÀáDÚ–b{ÄÎ5î)®÷IT{meë®È£ús¨Ïl(òËr-]úÝ]êmõ)‰Mž?È—
Ú£¢ðÑ ¶ÛCÕ±n†óc`¤ÇMl°··ÒåÒþòdì]’ÑFmÖöÄm”~“ -DÑ(ö4{uýhqÝÚ!µåüQ[Ÿê Ë?B¼™7Ø¿‚lÓýËrE÷PûÃô†ÏßXŽúüåFö¯(TÆŒöP6^',–ý󷣕Ïà…̓e±0_QÛـ颲ì÷ðÁª/IªdEËULF–¬®¹½ä¼áq›™PINûÈûÛfj{{–ùÁŠz܉UÏBglÕSnZõd©Šnç\Ͼþ -lò,{=¦ îψoÉGûúÎöȇz'3Q¨:}ó]Ñš!æ]8Ó{rQö7Êí–ÏÐ+«ƒeÿ7½íÑî’ÄÁJò9X‘K\û/Êój7Ëb/ð^¹/±—¸á]·ºwI”Ú{=$V} ½ñ]²ñ[cÕ%×Cr®7¶orS¬î’»¦»Bg?én’^ù^€ÝîÈ]Rü¦ôŦåº7D9Øók;¤½©’p¶ìŸ«¸œjÒï“å²ê¥;×+îN§Õï#‹º¯/®*0鯑G§ÊVIÖÕ›1=
»1Mé–£ø¦´(扡:ÙFcZå¾ø¦t2Ç.ØÓ¶Çe½=vûÊ›'ªâJ„î^,©DØ×Níz©q[œ÷E“_$¿¤Ð½ÛŸ÷Ìv(ËeQÒEÙ‰Mz©T -í¬Y§¼,Ûˉ½‘LnkBÏăËI÷ -.%r7]J¸NNf9Éç½Èý¾ÁÂbž&—DcŸh‹âÂØg»öšjFž0´k/Ÿf¹Ô—¡t#æ/MúŸI#B¾ËYdëPꚟu{1Y,¾F;Øt'Ôh›ñðlÔh†=$íâÀ´ì¥[£MDk´ðÝk2-øø…©k´,›OäÂR¯Ñ"We×äNj4qÖŒj´¤¯}±œäk´„¾‹àrÒ¯ÑäRÒöª-ÇâiPq[aä)NY–˨5“„&w¬î õÛ(Å£±ï[Š{ž„¾qù³tÀ†óË©‚=ójÈfˬ]\çC‡Fs°>¹jV,l2;©J6ËeZͦøöCìÅ<©ÝKÇ܉§Ò@g-î¥&³F½{M{Ó¥hý0b9é¿¡-Åä†:îÉ»z9±Ýmv/<MЖ‰¾ê`.ûç‘‹Øl(~Z’Nû^WH—sFÒ¾ã›:i·7K×waš
O&Õ¾·îƒ•K¿}?·g”“Íbò¬%ߥ•˜ÅärÒißë–É…©g1m9í{£¥Dî^M–c7ZçB†™ÛK;ÆäÂÅøçÄÚZÄO3ò:’¬ßà -åʘ—§¢¯a˜¶÷-N‰þPÛxú65•N_u\?¿XXºW·n»®mëw-Ž˜ænøLʵ˜Ý‰sYjë:·xzÚ.Žçd™EÏ•×éâ6É´Dhïö(/¯øÄÔ^Z’–ÚKËlÝWÚHLþ¶©5Ó×óÌß\3¹ß[æ·w(m\\+™{ÛV,ÌôÙM¤·Çîõbaåyõ}ý™è!G¬:¹&†É;ˆòL.–Úêƒ
.ÌäbŸ¶|ù6X"²Âý÷¶6Êf‰H¸¸B9xéFóYSåÀ¶áEèh£åNg—l,ÊÙw;³KZË丹N£tÁonI>‹%Ž ‹1”ò:ëtZœ1t¦+ÕFЙŽLrõ:ýhÁtÆÐY ‹iõ¥1†Îz]ÌhÁ4ÆÐY ³-˜Ô:ëtÚhÁŒ¡³þ½ÐØê´ÇÐ%\¸1#è"wiŽ¡³A§µÇÔcèb^H¶a6\0jm›¿o>(îe›dØÓÛ¡~q»ÈÞx©@Ü=rÊ/ÃvÄ·~
:ìöôÎvÄfûäNî_Gü)§ú¢˜â;V4’ãí[?»>©êD‰}Ægµ0ë÷°ìíŸÖ×§9g{ÿâz®¯û½,ùM2ù¨è¹²Ú$£!sr_’4g«®éŒ{$únOr¨“z$øþ˜áË Éw›ukß–vÕtI®õ®eÙìû&d²ƒZIç<Ýãà`7³Ç6±wIªÁnæ÷§Ötµe§åË 1·¦ªÛθÑ1#…í-,ö,_â›ÿžj䣽:k9ÔM¯vUšÝö®”›¿B™ÔSmìÛ€ÍQ‡ê{{q°ŒžeGÚc‰]gªŽÃ͚ݸnñßN¾4›Â«.Óf—é(0]K)~˜²Ùe{ß‘êø$Æñ¨Æ¿äÆtZ™M3cÝ”N|¾ q#×l£ZŒ†hšŸ?å;ð¶ß"XëŠíÁ4<vÇñÕì«ÆÄX†Ø·ÓåÂ26Bt?úäÃldJ2S—xûG,¶ƒ5Í#¦&j'£5ZJG,¶ã×ß65]û¢SwÜ‹õ#¹ìµeú|o³"—ú¨q¿¥õx¹¸E˜,`3'6#,bÉ¿à“,Y^ÝÝ6nö"w|Š›½ÓݶoöÌÿŽb -‹P}5Š8Ï‘oÕ°7T.¥3´èUç—p“Æø²CÜÔY–]ÒrTšÉM\B±·#—¥ælã‘§¶CÖ_y’•p{eÑŽ¬;Hx•¿°ãÐÆ!×=1+Ég{’ëÞ1¸U -¶”äjóQ‡†Ù<…öXÝ+>z½›¶ÇÎö$×½c>Ì.þ
¢”Ó†¢§!+îV¼$Ù#³I1ã‘ÅFù“éþ°Ø¤Ø‹YÅ,ŽS…ÝM²~;]=(Îj“â¿»£4®ÿ78$)=2½ZLšo©‰–pž™Ð3>Å𜼺Òützdt÷û½é÷ȈZ¼Ý‘Ä0´TzdF¦ß##‡¡ÅõȘHUÏ«HªGưŸ¿×Æð{ƒsä=qÁ©K²½×÷äTÞØÆr_´±lþÞ¸Æryó„'×Fa°“¸Û—™7äy©)ÈL§ŽØµºBÅ;½v†¡¥ø»>¿Èdæ½KIKxuÁp´ j\]Ò/Í&¾¡ª«³ù¾žå¸:ÝÐQ‹‘ÂêNÐ>Ë/©Ò]½º¶¥å«zÉßE*f3хǼ›½˜”™ñpr-™x§Îz<\òß?–Êx8£· ‡Ïez<\ã,’gõ†jæÆÃÉ^ë4¯@ãá¾ÔtWêãábÞ† -ÿ7™ÿ½£Áq™§ü–€ŒŒ‡‹ybeãUËÔÆÃÅß‹™=Ö‘#ÙÒY/\ÆÞ‰‹Š}'Ò¬miçÈÉ[ïDª®ýƒÍòt›íÚéF×–S¬:û6—cg‰éR‚í1m9É•ð&ƒÅ;ðêM®3ïK|ßY7—ÉÏ{E o<ì)NDÜEhÚÛ35™Îe|¤ëUH÷2³üZ£zÌô2œÞµ{Z´ÆåñNî~Ѱ eæÛ€µå$wù˜ŒGËÉÈ@ÈŽ2{YL¹ó¯6ù6-³×¬¿Xùmh±½ÒqßÖè.NìÃ’ƒÏ¬¿ØIyC‘êËIõÝ>›}±pJ#R—sm"µ9"u9gÅN—b¨_FF¤ÎíefDª\N&F¤ÊñbéH•KÉĈT¹{_wKlô^Ÿv˜ijÒ/¹KBg?ö2œJû2Œ -g\ez(œö>¿å=™ -gx^2>.õ~ËØ#f}ïžÄ}eCáôßA¤
†;/CázÎÃP8ãþ1›÷gÓV
C}U ÿþd«O¦ïªÚùFøØöX{©â¶Èî‹^rQ•¶zmt Ë…™³]’m˜„/Nöá‚n4ú´ÍG8VßÎ+ªr£”]‹zpsü¸º9ӯÉOáÞQƒô½~å¬qÅFëmŠË¦¡®ÉåŎܵ£Î@m^ËB`¼i¸³¥ì°@ÔüñæêimÚðŽ™Îý–ÖîªñÞö¶ÒÕöö¶²>9 ÁØn8¹¶b79Ôã;ËhÔ™¼K -Qš5wV3R7¬/^±ƒÝêW‡ôϺ•Vn¹²wÌFØULOY
v[+3]©70Þf5ÂÎ5tf`Ùl¥K+í*©Õ4~,Vç@×?Øbj£?23aܰœB«Án¾Ò¸•ÆÎÇWÎl„]Unî^ÕÑœÙ`·Y«Qgç¬GØíŒ›®4¿}cÍl¥ëÖóñL™¯´sp¶Ëôðæm—×/št$v„vVÅÚkío¡r^gó÷ê~/Ø«ó›sý¶–Xáþ^(uöW4DÃwIM£ø„jÕwlã•ÛØ¬g;¸/1ψ†ów23´Gý†j|¯‰ù<V{66I÷\Ìb£T/§ªÞóÞ½fr&9£iG¾SÅFï’ÕLrIõÂÍvØ~ER1RûNÈ$ÞëSM"gù^Ÿýò¤˜DÎtÿŒæ}SM6bwÿÔs
Ø>èªyFâ¾K-ùãì_/]ëæ™¾îjw:ëžÞTFÓ¥Ö“ìh:£û€ð\œ™MgóûaÒMgÔ'½¤?šÎh,]ª#ÍGÓõÅ¿iŸÎhº˜Ãºf
¿,ÑtF‹R|CH -£éRÌÈIަ3zNÉ•Mg4–N¿Ÿ™ÑtFcél¾Û“Äh:£¾öðì™MgtvµžÞŒŽ¦3jÜèßÍÌh:£±t&ß6ŸÆhºÄMÚÈ5o)¥:šÎ¨qšåÊôh:£ógð6Tš£é⥜S8¥ÑtfmËÌŽ¦³ÄÒM·¨øgâM—ÒKz4嫌¦3[éÑtFkÉðh:£§%qïÀg`4Qõ{÷š‰ÑtŠ'#M§Î/™Mgt0¢ñL¦SäÊÌh:£±t¦óñ¥X½Œ™_,©¯n2ŸÅ+q’Êø¹9l|ÚS\ì1¿bÇl.›Ôç«KؤCù”'ÓóÕ™·.ì§COARÇ)z”bÞ„”c2•
›E f€‚ɨg³ŠÛ$»UÙåbL¥´Iòˆ‰JjÚe«M2~‘´†±8NÓ.›T™2‹ÅÞ5ûzâîˆÊójw›[÷ÌEf˲šè.íiîtßse³IžÊ4w¦³ËõÙ«dsš;³‘\öÒÙzAÂúýäèDwé«®é];³ÌXöRÙšæNÙ£(LÚÓÜ…Ú0ÖÝ¥=Í]pì›b¢;{vû2ð=WåÍ>ë“hœE_Æ^QÚí‹6¹SË#vÑm·|š>å‘Ô)ß=T•O9ŒNÞ<[öÀÛHgçæ,õCó—8l/k±xí0‰—ÈäÑ1íú‹-ÉöfØkÎ-ˆO$¿4ÕtŸ¾ÊìyO×ð¹vż
% -•â}pÛoC‰E)ß³ý6”X˜½7º_lÖ꾌Œ|LÿQˆœQÐâëÀCgßærlÍíj´Ý›]c™¸µ¥$Œd7)¬Ë®-ÌÖÀZ³9 âÖŽm'¬ÛÎÜ·Ê…ed"cŒ‰µS™és—é¡7:”Êù^Þ¡.J|¤+Gâ%¾Amy'nöõúÁfFF¦D¾ù8ù–Dâ¢ú25ƒ¡ø`Øü±ík"©‰ªÍž¾É‰×ÒnN—bõVgËÉÀ·—“îlÕÁ¥„/B£o8Lî]Õ ’zÂëö\†“62ØêO{†»ðøJ³9îR¸
^®HuÞêäf¸³ù˜Æe.h¡î22Sžr<‘½™òÒO™)/ýËÐb†»ØqIvƇ¤2ÃÕ|¯rŽ»äg¸³ûærôSúkçö¢Í³»WÛkÅÂÔÍœ,;
àÜt©
¬ùX™nÿ‘_8`8:¹ï¹Ò–“B½™ðr9Ï9àµw/¦\ŽùXظALYª¯™Ð¦ËKf|»Ñ &ýSQYA'\†u…Ša£_+<ï›ÍaLv14.Ä߉겘aL±;©è;.*r^L‡1ÕÚ¡nyÛ¹*ë -í\•v14nÇ7¾S½¯œJj“ÙDrîD‹L›\Ãp*4†7oåk|YâÔtpˆLŒqm/5ÿV1yÿ’ìŒtIM÷¨JóöØt澚jZ{ú–¡1®Ó¦_M•|få ©é3å•¥8ÆUw}F^ð1êY=ÆUl’íQÏVc\C=@òDôW¯/Üô“#ÞºÇ;6}íme½';r×{Dz\Íž±ñÆ%O•ø[×°6º/05Xó4åtÖµ«ë;ý-fÞ`ó¨~¥1ãá²\¹“ÓÃú®ªØyØêÚg§MÆÃ¹Íáí-Õùbëä¸axÞ"³±U¹yÕ£îy³Axs¦+û’Ø-7ÝWoWîÌ„éJzVJO›ÍÃæŽ®42’+z€‡+ýº•ÆM;(¨ÎÎ#X7ÊÑ]Ø<»e´Ò,—<ÀñsÎÅÃ[Žû§?¼}
Ã&+ÊuUv,Eû`ãGÄ-Z¬´+¯Ê|¥]#¹3F+Õæ}«éŽZ¿ÒQ«yû&ÍWÚÙ9ˆy³K¬6O~^ù[hæQQcYìÙ7ù½òv¯éïéÇWz—ŠêZm,ÑS·sØM“bŸ§+⑇5¡ÞžØäÙnÑOIt6_›µÒ=
Š™ÅLýâ¤Ü,–Ý?°IÙCb>$)ñÕ*ÓM’%Ù|£ÚímRl:ÈÔÌ,Z‡®bf»=IÖ¯V™žº„™YÄ -Æ’yÍjÔ]Ü7O¦1*Mñ†fð(eÙ+Oq½’Ý¿H¯µw—ô,‹&›”ð–Vüõbû 'õ–V–Ëj£Ìû‰“Û$Q[š¿§Úž„wc㪫ι¦¢Ø‡×‰s¦¤v+!–Ýc㫯}°™úòÆé’l{ßphc4’e÷²Ý§<é|mtLbÂWÆ¥4ØÍø‘uRßk½Ð™bÏrì·hÊQ€é~ ÑwÅ™ŽSݵ$~WœÅ
qÿXìK#X—IÍw`^Ã2v¼ˆ¯aR}êpgvkO¬ÔÓ×ÅlY|?¿ºËN›Ï´W¥b/á‚ÍšýäÛ#&s?4N™?Ln YÂ|iLËf=’)©1VµI}Ïn“âÆ¿¬uYõ+[ã1›¤{U?ô´ZwÕ&9p3ÏÆPNý÷\YTMi¬8Ñ'ïk]ê:¶CܼƆ³Ì$±0Õ,:ñ£k-—UÒ;bʱ<öw2öÉešGL9ŸNRG¬¿bÎda Ã…Z‡¡#–â(@»c -ÐîÀÄþädFÚ¨ÿ†ÃäGÚ¨õZ§< -0¦¨XÜaÆ¿›Ü(@»c -ª0&C–îDŒ·lh½*r<cîDûäØ7ÿÁF¶H+½ÙžÙÁ<oÙÔfuð—äxªì¼¦žRoávvÙêìnEùþFo ik¾vd¢¨°äœ» m¯ÍÛ}z°5wï¨*{ny\üm©ÅUYSß?0´7Z¹·9=›åª®,XL•ö•îgWöwU,µnN4¯
TÜ_¬Ü›,\?•w²Õ]Ñq6g|´o³n«ajg½¹p{o±zϵ߲]5˜}r°¹ ¯¼°«Êuj¶§Ç}´‘;[±3·^ºöµ±Mãc“Ù¥ž…–lÿé½IOCyA‹7ÐÖ׿
œZíõvUåîï/ÕîÔœì9È]¨Z9¨\™ŽŒ´÷4–•œ,-ï¯Í {;[¶0·#'›«Í
ŽN¬CbÆ—ÖÏô/Ö¶®ŽìÊêÈr>É£%Ÿ«¨µ¥¿×è`iCìîa¾</åyÙ¦ûªh,\.XΜoÊÛÞ/äû+Nåne¯É‘¤½áÁ¡ÙGÅ»ƒò}µmmLbvk`|ÜåÍ[_Óî÷‡wb›ì»q—صávÝ ¹h«n×Dµftšª\íGY®Ž™Àú”6fû|×èTÕ`ûZNKÙaCoKÙÁZ} 6ws¸ódKù‚8lÛM][“SsÝUÙ+b9“{áŧÏ,ôy6«åPÆé…–úþì}m¯ZÏíÈ’ÜÚwò䢧srª[þMìððV©´[¼oªœÞ×e‡…òm„ÅÃ`M\VYZþ›¯Pë;G¤z[ü³ºHõ+*œž]ñÏÆb†É-Ylv_ü ½4üÊþ±Øn¯§£Øu(ìîéñlœë\ÝÜ«õ–5U»µ
•7ï+j÷Õ·ŸY.ó‰=º–óÚ³\áÚK¢ùÛf&šÃôDÖ×§__I^ÏFøÀºE•±³éëêÏYŽüÌýå,—¯k¡t5òQ‰n9]»u^ù³²Pû¨rÐ+GóuWõûå?ýÁe¯,¸"Ëñee×'[è#%º>Ø<AS¡|Ýj¤4øK«Uír9#^ùrؾoµ{Hûgh±«3³¾Ð¹šxÊÆ6ËŧãÅÚ§~wUÝZx¥ã¥áµxÝy5^ÿÖ˜«³¸Ö-J‡w2O¿¿Tz,, ýG¡.±Ä²`a7X^ì{ãö—èÕ-ÑW–{Ðà™¨ß¯jš¨lž_+”W]›ß=3–yĦgý‘¿Tž×аXtÏöùÝGk›á]?Y=aþŽîFY¦O–QÇLO&ò<ÇêPeèo[þÐߎfBmK§{y1ô7ÿéJ¹ˆÊà"gZägJåxÿâV¿7ø_/†–½äžŠ”¶¿nk–ê×ÎjhGl¦"rU®èöeédv»Ì4õò5…ѶÒÓEë§ú;úz²Ç¢IäaN{¤s _×ç}’ØVî:êYoÏ|™¶åùþ‰ -mkËóëg+CëX>ù½òÐïMžkßš¡öñù@ÇVÎjëèø\A–«s¥¤åd´æ7¯-C-ôþ:ý£ïØ;_-»Í޲‹7ÎNeO.tfœœÊre»g -³KÊ -DF>ª–¹¹;»ØÝ<ží>³Õ”]²=2—íY-•é(/²Øü`WN°:jœ.ÔöÔ×9×Z(k¬¢ðu<¶î…+[Þ+ WŠ…ÑJ1RÈ7K÷ä%ùísÝní•ýÚ?ÅÓ;¥ÁÚ° %{^;§²á[¬ËöÏ5ôÈ·:§Kƒ§ìL±H]²ISžWßÙkôB†¸íì^ö‘?äb-Õû 5¨VE‹ÊSÔüºêS«©E½)·¬Ð?°²Ù¶•³ð/TGʆ¨2›ª'»Û—6[×ÄJwÛBµjW[^ÛZ{L”»š`9÷uMÖÛÉ•åyµçµÒ&+Ï’`½¬fwëÊBUfhÙëbõkb±£¾È.”7OdŶۣwoZ~qmE›oÚª:/®A}“s¡RTL£‡²i7óýòg%Ú<¼5GÁ_Ï_éÓ5sµŸeD1œ°ˆŠ¢®ÒŠîÖsÞ5×vÇþ~ãN‘¾%¤M›ÝPþÆ!à/¬.6^ƒíW[^Gx«ù ‹h+ˆ.À˜êòEZÌòˆ”žÓʹ¶–í²3MZkF´&¤‡6¹þÙô~Ù™¡mO´ÒŠ\LCîs…[~óEmvtjgy½³ÃßÄQ›šV{kbP‹ M,wèh©Qæ³ðÛ-'‹–ŵè ç‘–›™ø²¯/øÚ9(¯Ú5JýG¾h{T›Ë[¶êsäÖLÇ~E‡;zĦ²wÊ:ƒÀý¶éÙpû¯r#ËU¸’7:'.•Š®øyC“ ‚þ øODÁŒþÄÍ,®M}'hÁжm¹'f–ñ¥ðA¨(‹¹5›ñsMY‚æºÍmíhßÝQ7tI´‰\i¨%¬’ÐA°:‡á²”QÆ´í©8˜Í·Sšë†C»ÍÝ9Ýó¥9g'‡@«<ôå æ[΂݃E©ÎgR”¡ïÒ&–Å,—ÝÒúÂÔ¶!ÔR -}Y[:»¡un™\RÚ¸WõnLÔ•%6b®ÊâÚÃÈÁL¥LûŠÛ]ÃDŽƒv½Xl…ìP)QíÆrÃ`tå³[¾ývÛ½òŸÕVXJy{áÓpÓÕÝæ‰|ÍMÑì~ù^ÌëjÛs‡~3pÖç1øBœP9_^,H³Œ‰Jaze¬¿¢ÔtÑ2f¹ˆ…oºe¬`£0½2æÝv[/@+c–‹è÷+ˆ~ …t¡º4ZÆR9¾âÓe6ê»0\„¸ãU_®VÛ |žhKi7DëÐøPœÎ`ÏUÂÙè:]¡¼â·a·NW°µ#–ìntçµ”%U*ƒýnt—Òº6dŸƒ/nBGÌöµÑÝ<êWlÃ~S™/²€îŠÃÒ‰}F–]é倕ÓÑ6d¹¬·B¿ˆ]ŸíB·
¡ÚÒ·šW]’Öõ¹ZÒXjz(#µ¥e&Zj·s‰[Õ–«Í=Íú%vµèÿ92ѪÝ,h]zþ¶i_¶»‰ZW¢8bç·3Qû§6{éùìLÔ>÷/çµ3QëJÌrçÎD+QŽ9¯‰ZG8bç·31T’Ïsg¢Ö•¨ë!9?‰¡÷ÇÎsg¢ü BwUžŸÎDí -¼e›9¥egr†óµî)¯·°ô töEu¤Õ0Ó%Úû‘ân“AT³-òŸu‘ãÏÊΑîâÈ‘ÿŤ¼f»Kµ§°r \©öÞ¼Îå{AÝe¦ß×í58Àòƒ¾BGQ6T—"]qEÁ‹TÜ D~VúÙ„v/ÒíQ[“û¢«¸ú½ÞÊ•>yjû|ú -§mO>ò<=$+—¢HG¥Üñ¹Vù3_øajuè8t´C·¿ qtOÖ–]ýeáeËêJn¨®¢õaøy¬8ÿÜ”U]]ë;Q]#þ(=ÚZßÚ?súÌö‰â¬ú¬²ÖŸob{m'°¿¾>¾þ´ÃŽÕ£sëÛ‡'êN”µŽµ÷ôÔTv¬¯î¬ŸÐ^*ª\ªŽÔuÅ¡G¸¡^ãr³îdœµuœªíÚìÎm\î8ånŠïl.Øß“Í¢Á!û]ÙÅ‹k³ÙÅþÀXva÷A±üçt°Ç'²g‰8—D–¨*ÊíXßo;êôôŸŒ»À´¦@íÒxWc–«ódÛúhKÙÁ醲îÖ™¾Ž™ÀäXKÙ¡wGËÅ¡çŠ1OñuOŸ
Vïïûó³Ý
ƒ²w|RvŒ‹zv^GMYv±»¥%Ôg>’3(÷oP~М]ÒZ¾–]<0Õ]´—»/{½kôuù~OèR‹æÐÀâbø4ïh™1+Øu.îMNË+er/”Oäe§UáË®Lû§¼«-ýíìºü~¯î`úÔ÷žkÿ¬+”Ù;Ø…,_òî¯-âÔDÝaøîñF··{ù°6\þ“lhm -?¥Þ£„j¹Àbß}®Z>^*Ô^‘9í•Íwè§Ë{E¡ŸmæxäóåÊHé^‹9ò"½ÛìâufÅ÷)k·*‘'‘÷Óæõ·&ÍzbjZ=+݉{fã)XÌ—†È{½tºÌ‚ßð<c‘C0§=ÀŽ„£Ù¡ÈAˆ›'¡Ø£~ZÞ2RX:ËÍCq¯“Ö˜>¶õ(P›øÞªãQõà'ø%©?.ÐjÚÐ#ÌÐs\£¢d¹í›¡ÕeQ¶a̱œÓåIg¢…AìKŠ‹ˆ<Z¶qI§…ˆ_„¬åËÒ8…Ñ'üZ™–G,\ªm–éBýÙÐ_æÇ!+î yaô`ÚxÈnðˆ½0z¢ÛHÃVý-ØÞ•ÈüÛq¯4[!Á¹6ÆÛF¢Glz>îäD3ÅsS/c"%”ÚÝ“2–æ_¨?)–1}ö‰©zMPÆôW¼i1Õ/"~7ô—køP”1«#‘ÔÙˆ.@÷Š¿ÛÖ‘°z%GÅÇlCl³\„Éoçtï+Ýѳ‘â›Eúdœx(ÃùÅzºšình_A>¡)î†QÅ·
b_,·ÂÆõ™]Ð17Z€ÿ`!vE¡?i‰¢h©´Þ†HFNÜŠ¸L”ü6DKeªµe‘Riý²W‘u¹4ßíöpýìzYèV?<S¼{M¢k0ÅŽAy÷šD×`ŠƒÁ^8Û]ƒ)v†úúìv
¦Ø1(Kr]ƒ)vʳŸD×`ŠƒÑ¯¾²Õ5˜bÇ Ü—$ºSì”ç%‰®Á;³’ëL±c0ríÛëL±cPîK]ƒÁÑI¿çþ*Ÿóûž¿6)HCÏy~Ï_{}!¶â:ïùËÞž‰ÂšÈ“ÃÐcÈ®Óòˆ
–†:àòZÂý]CÞ`ý¤«»&üá'[ÿÜ”U/*ÇŸo±s{Mÿì/Ëå?[?<Ú•¿P¹Ø¶~úÌvÿòÓ×÷³|'‚ÿóŠÿÉ?«kOøü5'ü••â•ò§ý+Y…Úïžð¹Oô‹£³XÖºØqfõðÌÎöòþÓOÔÉM
ôOôtœ¨;üÝEñ»õ' -ÅÖxÅo‹Üòã¢ØÂÅ,ï‰VñSOÍ:Òþ'V[ZÚ€©§‹OzÅ_ÏŠ<õ„Ï{bàÄì¼÷ÄšüFƒ[8³µ^§Û‘ÑåƒC±'…nùßwe•u¬?åÌêúhWÛ‰©Á¬ÙȾÕVœ(©<1¢ÊW~¢²¦FüljÃàcù¯ð¯„ÿ͉ryªµ_®ÿ¿$ª¶öŽåÃå:±¡5¾òòʬ©žÿAAAAqÁDî“O8Âéý&‚ Óp*9’@ ‚ ˆ<σdO‚ âÂÇ“©“ ‚¸0Ãñ¤Fê$‚ .Ìp<y‘: ‚ ˆ6ÏS§OAq…ãYéÂçô)"‚ œÇÓÐEÇé3FA<páxÒ¹8} ‚ ˆóŽg™KŒÓç“ ‚Èp8žY.aNŸ[‚ "áx69>œ>ÕAD*áxú8žœ>íA„Ýp<eÀé"@AX…ãizN‚ ">O
0ãtÑ ‚ d8ž ät!‚8îáx"€}N‚ ˆãŽWþHÓ‡ â…ãu>Òátñ!‚¸ôÃñª™âtQ"‚¸dÃñ™åt"‚¸ÔÂñŠçÓ…‹ â ÇësœoN1‚ ˆ‹;¯Æñ@rº¸A\”áxížÓ…Ž â"Çëm8ÈéÒGq„ãu5.NC‚ ˆ:¯¥qápº0A\ áxýŒÓ¥’ â -Ç«e\°œ.›AD8^ãÂçt!%‚p8¯‡q±pº¨A8Ž×À¸è8]f ‚ èp¼âÅEÊé’KñÀ…ãU..jN—_‚ ˆóŽ×´¸48] ‚ Îc8^ÇâRâtq&‚8/áxíŠK’Óåš "“áx¥ŠK˜Ó¥› "3áxuŠKžÓeœ "Ýp¼"Å1átI'‚H=¯Bq¬8]Þ ‚ R Ç+OCN—z‚ ˆäÂñjÇ–ÓeŸ Ân8^aâ˜sú - ‚P‡ãU%KÆ$âÂÇ+É‹GõB8¼Ap8^=^˜8æ—êÁ'‚H!¯/NŸ -ÎÅ…u:‚ "áx•è8§Ï€i8~d.NŸ‚ ŽW†TÂ6Ãñ#ÆÉ"â8‡ã5!o -áøaä¬q¬Âñjú6ÍpüÀr ‚¸äÃñ -j6ƒáøqæTqI†ãUUëy -Ç<§• ˆK&¯ô¨Q€püDp~ ‚¸¨ÃñꎊôÇO -g™ ˆ‹4¯î¨Bøpüqº ‚¸¸ÂñŠŽšÓÁpüdqÞ ‚¸(Âñ*Ž -óBÇO€ ˆ9¯Ü¨*/¨püR‚¸0ÃñšòÇÏ&… ˆ*¯Ö¨/ØpüœR$‚¸@Âñ -ZñÂÇÏ/eƒ gÃñªŒúðb ÇÏ2%„ ÃñzŒjðâ -ÇÏ8å„ ˆ>¯Ä¨/Æpü¼SZ‚x Ãñꋪï¢ÇË -Š -현ã%‡FD:áxíDUv|ÂñòC#"µp¼j¢;náx)¢¤‘B8^/QƒÃp¼,QØ‚H*¯”¨¾Žm8^¢(rAØÇk$*®cŽ*JA6ÃñêˆZ똇ãE‹²G„p¼.¢¾"/`?‚ ¬ÃñŠˆÊŠ†ãÅŒH„E8^QY‘p¼¤Q ‚0Çk!ª)BŽ—7Ê!A‰áxDEÄ…ãEŽÒHDb8^ÿP;‰áxÁ£@¡Ç+ª&Â,/~”I‚ "áxåC½D˜…ã%’ID$¯y¨‘‹p¼R8 ‚øŸµ.¢F"ôáxQ¤páxµCuD(ÃñÒH%Âñ:‡Šˆ°Ž—IJ)Açp¼Â¡""ì‡ãÅ’RJ\˜A>¯áxUÃy$’
Ç‹%•¸pÂñ“ӓ¸ ÂñrHÉ$.„p¼Øxà]UÄù« BŽu -‘ñL–¯¬Ë.ØÃñÈG>êÑyÌce<.6´Ÿ=æ1~ô£ùˆ‡?ìŠË/5YÒtÍé]#.ˆˆ–0™!eÓÊ×#õ˜Ç>þ O|Ò•O>‘“““›â§Ù'N<ùÊ'=ññ{¬,k²¨‰’&š¨Ñ(gD(B%LVa¡vÅÃ!Ëׯ<‘“—_à.ò—”––EiiIqq‘»0ß•›sâÊ'=A5YÒ.Ë -4Q¡QÎŽ}+1Y‡Éö‡ŠL°Ç=A”/WAQq©×_QUS[WßÐØØ”
õu5Õ•~oiqQ¡+7ûÉ¢¤=æQx˜V£QΈH%&K˜V…=ü‘²€eçæ»‹K}ÕuÍmîž¾þÁÁ¡Äèïëíîêlomj¨«®ô{KdI;q¥(h|ø—gÅ•3§÷—xÀ#Z‰‰:,ë2Q…=öñO:!XYyUmcK{WïÀðØÄÉ™Ùù…Å¥åå啨?YZ\˜Ÿ›™šêïíêhmª¯©ô—»ósO<éñ•Z¸œÉöÅì¸E°ˆ+±‡^v…(a¢ -Ë+ô”ù«êšÚ=#Ss‹+ëgÏmïî‰xJ4ä?öwwÎmž9½¶¼87=1:Ô×ÝÑÚX[å/󺲯|Âc/gdÍã‘"&+±ËE–|ü•Ù.w±·²¶±µ³wpôäìâêéÍý§<ý™ÿü/Ï}Þó_ð½81^ôÂ<ÿyÿû9Ïþ§g<õhgscmy~zbd §S´J_‰;?çÉOx\°œ=è©ÎŽW„‹X¨{ôãžx"¯°ÄWY×ÜÑ=0:9»´vf{ÿ)Ïøçç¾àÅ/{Å«^óÚ×_õ†7¾éMozslˆŸ¼ñ
W½þµ¯yÕ¿½ü¥/zþsŸý̧înm¬-ÎNŽtw4×WùK‹d9yóŠËª¯Îœ> -Úïwß½¿ºûç?ù±(gßüê—>û‰½çmW½òÅÏyúîéÅÉÁ@Sµ×{åãõ°¬‡ÈÊìï¨Ì.Wc¢Áÿ‘)ÝeÕÍ]ÃÓ+›‡¢ˆ½þmïùȧ¾ð•¾ýýÛîuؽ÷Ýÿû?þI+`ÿ-`áêêo±™RûÑßJšVÐDêüM°œ}ïÛ7|å×^ó¾ÿxã«_ú\QÌ&:*K²Ÿø˜G\þÐk7 -6¼D„üÚ?þj¯Å¤ÔP&2§VÎî¼ý–›oüÚ—>ó±¼ãM¯ÅlçÔüx_[]y±È™÷™áN3§‘F„o*µj,·ÈWÛÚ;6zï™Ï{ùëÞöÞk>ýE‘'oýñÏîúÕo~*a¡Š)X{iM-Q3i·÷߯ïÀÿü}ðÎ3|s)jVh²œÝûË»~vÇß¿é×î|ç›^ó’ç<u{mv¤»¥FäÌ'=öWP™]ôJ•â¦R´ÆD5VÙž^Ý~Ús_öÚ·¾G±›DžüùÝ¿¾ï~Ñ‹”°PÞµ°dÿ„ìûÕ/ùËhO¬øÇ¯dÚoÂÝ’E-R«…Ë™hŸýúžŸßù£|熯|^³W¿øÙG›ËSƒ•%â>óÑÁÊŒÛÌ‹7‚©2xS©Ucm}‹gŸýâW¿ù]¾V+bwþâž{{¸‹°¿D;%~uÏÝwiÝúwÞqGô¡ÒwÜyçO´§wßóKÙa+ïHu%-tÏùç?«³ŸŠ¬ùMQÌ>ðŽ7¼ò…ÿ´¿± rf¯HVfÑÛL§‘B„R僳®xÔãž,ª±¦®áÙõÝg>ÿßÞðŽ~ò_ýÖ÷Dûå½2Oþ5’ëÂìþßi^ZGþí·ýð–|ÿ{ß½ù;º¸ùæï~ïû?øá·Ýþã;ò³Ÿß%;oÃkáÎPóì÷¿ûͯîúéo¹ù†ë?÷ñ÷¿ýõ/ÞÓwÖf†»šde&Zf²ÏŒ”yqF(U>䲇?ú‰9n¯¬Æ–6Ÿòœ—½ömïûØç¾rãwoEì7¿û}8O†«0Ù”ºïÞ_iÝ÷¢xý@>ý¾áë_ûϯ\ÿå/)_þòõ_ùϯ~ýß¼Q>DÿÁo»]{¥=&·¨Žôáj‹üÝ}¿º[³ïÜðåÏ|ô=oý÷—üËÑÙ¥Éþ`eö˜`eFʼøBkŽý¯¿ÐCd‹?ÏSÞžÕØ_ù¦w}äÓ_¾áæÞñó{îE,t;,aú£ÖÉuÏ/~öíAä·åË_¾îóŸýô§>ññ}ôškÂï,^sÍG?öñO|òÚOöó×}éú¯~ý†¿=P¿ã'?¿ëž_Ýû›˜‚&ëÆ?Ü/‹Ùí?øö׿xí‡ßùÆW¾à™»§fG´ÊìÉ{ÔY&e^|!›cÚ]å-þÒê–ÞñųGÏyÙëÞþO^÷µ›~pûÏD[,\Ä‚Íô?ÉnÔ_‹ÛAQÀnùÞw´W*>ÿ™O}üš}@¾þúö«ßöÖ·¼%øêõ[ÞòÖ·¾íêÿxÇ»Þó¾|èš}âÚÏ~þ‹×õ7Þtó÷xÛïUÚ¯t5Ú_µ{ˆ?Ȥù“}ÿ[_ýü'Þõë^öœ§l.MŠ–™×óÄG?\¶ÿ)eWDšc{ôrܾºöÁ©Õg¼à•oz÷5Ÿ½þÆïÝö“»Äe°-ö·H¦=’¿sã7þóËòå°|à½ï|û[ßtÕë^óª{Å¿¾ì¥/}ÉK^òâ‹?^úÒ—ýëËÿ핯þ÷×]õ¦·\ýŽw¿÷‘/9Ê’öï|ï–ÛnMÔh²ëM»øk¨möË_Üyëw¿yýg®y÷›_õÂgí®ÏÊ=y²ýÿÉ»LfMD›câ®ÒSÞØ52·qðì—¾öjQ}ý;"Sþò7÷ÿáÏÑZçÿõ_ÁF“¨Ã~zÇm·|÷¦¾* -Ø'®ù (_oyÃk_ýÙ;€¨’l
¯;cAr( Hê$*" -ŠI‚ŠY0GL`ΊTsÎ1#‚ QPLˆ ˆiò{Uu»ÉÂí†Ü9ß¾·ÃötuŸ{ï_§NU×9µbi䈹³fLŸ6eÊdqFÜäÉS¦N›1köÜù/Y¾jí†h¼]ûÀáã§Î]¼rýVr*ÚÓÑÏTDg_É/…ùo^<MO½yéÔØ™ôõêiÏ·Bñ¿Š"™eB`ö³ Ö -Çt-yv=½‡…N™¿bóî£ ×’=yþ:¿ð5RRNìca~öaé÷ïÞ¾v9áÔ±ƒ{ãbñ†ý%‹"fϘ6aN®@%ö
:fÜ„°ÉÓfΉXµ|ÕºM[·ïÚ{ðèɳ®\Gíõƒ{©ÎHhö™“¯%`g¶púØ@÷®˜f†Újm!0ûyÀ¶”SPÑÔï`-ptó 7cñÚ˜}'‰{™G”$&§žû›Üœ¬ôHa—Î8¼oWìæõ«–‘Ô£‰cCC‚ü}Išxß>žž½{£ÿòôìÓ×Ë»ÿ€AC|ýƒGŽ7q2N¡‹Z¾zÃæäÒŽž<w1ñÆT¼±#h…ɾ¡/dT~›û,ãÞ-âÌ–Ìž2س»-ÛÍ2!0ûiO+åUµP8æì1(x✥w:›xç!vcˆ+³†…ùIM -;´wç¶k–-Ž˜55'Q< __7×Ýœ»::ØÛÛ‰°·wpìêÔ»‹«[ï>^ý<jÌ„ðé³#/]µ>:&nïÁc§Ï_Á[Ô2Ä¿Œ~úüùËg"ê×ϱ3;wt÷æ•ó§„óîidz4ÖŨìg@¼ÊOBþŽl›î}†Žœ±rKü±ó7RÒ˸1"±Âü·/sðoØxKÎá½;·nXµdÁœiaãF
÷2À»»kw'G;[Rº‡Íb2"˜L›Íåñ…mº8tuîáêîéå3Ø7 8t\ØÔYó!¡mÞ¾{ÿÑS WnܹGöxˆÜÙçg†"³“ûbÖ.ž1.ÐÇÍQ`Ý -Ì üoôˆ–.ð´²]{sNo¿ÑÓ®‰Ùêòíû™9%nL$1ò»"Þƒ7nÛ°*jþ¬)FûññòèÕÃÉ¡K'—Ô…23í`blddD•¿C›˜t0íh.*/Õ™*Ðâé=`ˆÿð‘c'M¹|í¦˜]ûž¾xëîìÎÈV¢OxÇ6vf9™ï$ž=´sãÒ9ƒy8wfšh«*ºl£G¼t§•F<{×þãfF®ßqèÌÕäGY/Ф’üLùí›Xb™Rn%&œ<·I/˜5yü¨ a½=zuïjgCJôt4512$åµµ´J‹yjii·ÃU
Û#±YZ“RSöN=\=Kó>j\Øô¹‹–Ù»ûÀñ³—®'ÝK{’KšÅŸðšorŸ¦¥\?,~ËʈÉ#‡öAYÇöí üoôˆ7]´QBÓJ+¾ƒÛ€ ³—nÚu$á:*Éò+^´ÂK£o_fg>¼{óòÙcûã¶®[¾hö” £‚|ôuwq²·p˜V梲vZê¸X§²’RiUb%%Q=Y
Mv:zHjfÖ,® ³]×½|†„Œ™8m΢ek7ïØsøÔùÄ[)ѨùúÝ{²kƒÄ‚Ùïß¾trÌšEÓFû¡ÀŒka„ÃÿV˜5bJ–Ç”5ôL¬]ÝOš»|süñ‹·î=•Dbßç‰$væèÞÑ«—DLÇ©kúºõèÚEÈeZuì`dHÊ&ªQ¥`q‰k¹²ÕÕåÄ•±qõb5uM\þ³½1òi—g¿A~Á£'M›»xņm»?wùæÝ‡Å2+*ÅÿwÏÚ±>jæ¸Àþ½ø$ü‡If#¦dy/]0„NƒG„G¬Üºïäå¤OÄC%ƨŪG)HbGöÄn\¹xΔq#üy¹÷èj+à0,L‘À´¨° -òH[¤X‹ògE´ jü·&u²I!cMmäÓŒ:`¡ lì{âò!cÃgÎ_ºfóŽ}dîƒR™á=@¹OÓS®'Ùµ fúwE῞&L2/âå1ük¥)³³³çБS¬Ž9p:ñΣ§¹yxë+^%ËîYé©·®œ=º'vÊ…³ÂÇÚ—r¬Í;éëh#)‰JY·Ñ´Â‘7¢ÓJÜZ–”dWQñЬX<\(È£ßà€‘¦Î\Iò (™‘ØìãG¼A
™÷n^<¾gËŠya!ƒ=œ:1LÑ$SM2Ae©j˜±lº÷õ
ºhíöƒg¯ÞEáØ;Ž}ùJýN×îãM7{c7,_8sRhà`/7RIÀ¢.ÄI*Ë‹j¥‹Ž T†’c—°Öš‹Šÿ+("—†„¦ghl†KžÙ;»öññ
>gFÅF2ÃûØrßäc™}ÀCfæƒÛ—OîÛ¶j>ÿ»uf™háI&¨¬ñA–`›vdÛöðò3}ñú‡Ï]OÍÈ&áÖXq)3&_ÃÛ7@å?°¯«S)ñ¤ƒK‰)–)ÆÿkÙ#“*S¢¶²§L`¡©áò Xg<ÇîÞCqŽçòõ1ñGÈŽÜ'9¯ÞæãÊØ«>BÙØµ(üæÕM2
K–2@e ‘ÆDËcv=ûùµ!îÈùâÿåÆÞ¼xš† >ˆ7BÏÂëÓ³«
anB«ÃEKN{øå¿?>j°¢Ö¨ó¾ˆKÃBkK•¡5îhÅÚ9÷ꋳՑÌ6àÜ‚+·RÓŸâЬ«fiw¯Cá䌱þÞ=»pÌÉR¨¬‘AÆJ‘Æ,¸ö®ýÇÏZºi÷±·îg>ƒBþÏøwÃ8z”xöHüÖ5‘³ÃCzº8væZ›ë·Ó¤Ên¶lѬYyÕøÝ%J¹4êÔ Jgzí;X wFênP2Û¾ïxÂÕ;$4Ë/(,D*{ù,#õF‘¸Kfìïjϵ©FÌF„(Ã3²à9ôò š8gÙæøã—nãie¥1âÆ²ÒRn\8±oû†¥ó¦Œ Ô§§cgŽ•i{=muª€°¸ ºÄ'p•wiÔÑ -R,d48ÔY«6ÊZ9ö½‡Ï_³ýйë©sÞàå±ÏÅŸ>ä¿!Ëê§l_…ÜØ¾.öh¤4Ô!…5K%&ëHG±ÌPlfÔ‘)°wé;$9³u±ûÉŽp2d¾Ïû2;#åú¹C±kæ‡èeÏéh ¥Ü¦,—54%ÓÔ7cwqõ Ccå¡s7î=ÆËc"½ÎÁ+Ç÷l]µ`êäÆœ:³ÍE¥›ZÊRb"Åç8™ië›X°;;¹ùøž:åæø£ç¯§¤?ųÌ÷x)##«lõü°`×.l3}MPYƒ#^ SÒÐ3eÙöì4)ÅcHc¢%XjåâÙê·iÙܰCûºØñMË¡“õnç22“WTVoghjÍ·ÃÎlÒœ¥v:KöSŠT–ó©ì`ìêˆIAý{Ú²Lõ4”DËe²´¨ñ™ºnFçÞæ®Œ9xö:ÒY‚%{ù4-ùꙃÛ×EÎ4°·3rcFºš*Tmàú)tRæ$R|ÛÈ93÷$‰*vÿé+I8ÁO2)•=³rî„@ïtÕÅËe²6¨jb)§¨¦clÝ©›—ÿø9+¶î?{-õq©ÆòrŸ>ºsåÔþ˜Õ§Žöëçê @nLÍ)ë·Ê¹Hf¤823
3³§ÒAWmÝ{ÿ2Q¢²Œ”kgöo]1g¼¿W·NÖÆ:jd!ÌkM,UÛY -œú;kÙ–}§¯¥ xL¤±‚¼Ü¬‡ÔRzDøˆ!}ºÛr,ŒõDn¬~Ïkh".,ŠË¼#gfÁ±íæ98D¼u÷~¦Xe(ú¿zzß–e³Æëã$°4j§ -S̆ƒ -ú[+¨h··àwõ:zÆ’è=§ïfäˆã1¤±'n_<½lÎÄà½p®v;œEÛõÍËXAªY1…]Ý©$Ñ/ùb•¥ßM<µ'zÉŒÑC=yx!‚ÿ†¢Ìâ×Á}ðÈi‘ãO\INÏy]¢±OܺplÙÞàÓË$7–T«ÿ§Vrô޼¢ª–.6äÚ/€ìI:zþ¦Heùy/Ÿ¥Ý¹|b÷ÆÈi#¹á…2Å„°¬!(™Xê›±íz
™¼hý®c—î¤={OÖ.Š -Þ¾xrÿÖ…£q¢ÈF-;.•¦Ý€Ç4”:3R6Í‚ÓÅﮌ\wäüÍ{Deïñ³GI—ŽÅ_49d€k—’)&¸²z‡ýÔÄ’iëÒxØüµ;Ž^¸ýèé+j
–ÒØÍóGâÖGN§¶œš·oWRp¢¡žX‰3kÓ
™Y6Ýûø†N[¼~g9•¡@ò‘kæ‡õs±a˜èâàÌzGôk5±ìî0qÞªØÃço=Èzùÿ–Tª±ëOõíÓ͆…3´Ksgêy‰2õM™œ=‡†N]´«Œ1ñ¯åÈô„C±«æN@SL¡ þ!,«w¨€ýxbé7nöŠmÎݸÿ$—ìí)£±u‹¦ŽêéL¥5Š* -úîÛuürrzöë÷HcŸÈú˜HcSƺ -¬ŒuI‘‰FSʤ$0SR×A*ëŠU¶x}ܱ‹·få¾Í2ðsçÚù“‚¼»w"aµZÖЦÿ[ ƒ%^!C™s_ÿ óVo?r!éÑ3<±iìÁ-‘Æ÷ÆÓQW"!£)ÊTZ㊨ù²Ði‘v¿”ôèéK¬2<żuþpìÊ9ãüú8ñÍ
5•aÀ¬G°h†K
}3®Cï¡cf-ßv0á&™X!æåf=¸u+ÅkÛ¸4V¶Z¥24Çœµ‰¬&gã]ŒùxŠyãìþ-Kg„q·g›ê©·…³þ
–j:&L[×#§EEï=}í5±$û.ð2ÓѸõ8+ÑX#˜V–§IIB2VšcúŽ™¹tóÞSWñž^jŠù8åê©ø(,óq±a—¬c4´åÿ¨eX2X -»{…-X¿ëÄ•»xçEѧâ¢ï^=}tûⱸõ‹ñ¼’h¬4»Q= ²*³:÷ñ;{ùÖýx§Ò‹7xC6 -þï\ÆaÙÄ -Í,ñ`9hÔô¥[œ»ùà)ô|ÿ:ÍýOÄoŒš:ÔéQk¬TeJøÇ1—~A“æ¯ÝyôÒ´ìWxG^ˆ¹~f_tÔÔzâS/É6Æùƒ,å•4
-ݼƒÂnˆ?u55“dŸ>¼%Ù(ãëé$,5ÊG#ÊQ öwq2eñ†ø“‰xK\~AAþ›çï&žØµnþ¤€¾Î|sM%ˆýë*êWTÓ5å8ôöEƒåŽ£—’ÓsÞ|ü„'–/2ï]?³ŸÚòç,´nä+— Ó‘cï>8tÆÒ-ûÏ޸̖¥%]8‹Ì!îv,¼$±¿ìGýÚFÖ{1m ,o=$Û{>¡ ÿeÖƒ› cÄ›—Mt¹ÆJU¦¢ehÁïê9lÜœ•±‡É¢ß»‚‚<tA7ÎœÒ¿G'«öû×Ôæ‹¶êúyN}&-X¿ûäÕÔ'¹ï -‹>áä·gn_8²}uÄÄ@ï68
C©‘k¬d9 -2¬„ݼ'-XGÍ–ß¼/,DaÙã”Äqk#&øy:rQì¯ØbCêö팙]z
=kEì‘‹wð`‰4ö±àMNFòåãqë†ûˆÊÿÎe¼öO¥Ã ©òÎS£¢÷AæË¼‚ÂÂü×xÀ<´mÙŒQ]mFÚ*mÀ•Éñò…9¿›÷ðÉ‹7í;{Ï,ÅY* -ú7EN1°—ÝO“[R]MCÏ…eCÇÌ^ƒÌ´ì×ù… -Ppÿúé=†z9ñ:êk´W&[J™ ËÎ}èØ¹«w¿’Bf–x°|õôÁÍs¶.›9zHo®ùO“äOՉĿŢ°Ì¹oÀÄùhÀLLÉ|ñ–˜Ï‘{>º}åìÑCzuaâepe2¥Ä‘Yº÷žµå@Âí´l¼¿‡–iIl_5w¼Î%k¯MÊ•üÏ£Ié®kŸ©Q›÷ŸÅkï -?æ¿zöðæ9ûOîíÌ7W&cÊ:²Þ¾ãæÝuòê½'/ó?ˆK"ïZ¿ ,¨_÷NÖÆíT‰Æ~†ÇAm&—ST×5e“såö#xaæÍû -òrÑ…ß¹zîØ¡nbW"“eYÿ©K¶¼$ŠúÉ`‰'ûQÓFtíÂ$ùý8óú'pdÿ)³Äl€L¯À0¼Ä|í^ÖKäÊ>¼“v;áÀæ¨)ý»!W†&˜Íý姸¬ŸjŒŠÈ|ÇcGví~õ“Á’Z¶$¿óé—T*ù9–) i3æçÀ‘Ó—m=tžü ûáCá»—OR¯žˆ[3wì·.cmeù–0^Ê -ò«eë¶úæ‚n("[²õÐ…;éÏqÔ_ôá]nfªèÑŽQæÅOò,Df[u4Ãtô†zP܉ÄÔ'¹yØ•å¤Ý>\Ùäáh‚i¦§¦ -»÷ž‚bÿ„[²_—º²«çŒìjcÝ^K 6cÈ -üš·RTÓëÈsö>%jËAìÈÞbGV˜‡æù—Ž y>,Ò]¤¢SU‡Zž™S²<#re û£‡öqä˜ê¨¶i…W1ÚâÿE¨EI«½µM¯Ác欉CSK‘¡¨?ëþµSñdÅ–?ã~ø&eš½ƒÂGï;G¹²Ä•]9¶cåÌQ\„m[Ãx)¨õUSŽcŸÀðÅ›$ˆ¦–ÔÙùƒ[—N9P4Xþ„™=¥?™1l{
={ÕŽcØ•½+üˆ'˜nÝ»aÁ„a½í˜8ô‡ñR&Ѳ5^¿èä2`Ô¬•;Ž£Àøeþ‡¢¢Âw¹OPÔ·fÞøaewþdOATyA]ÿøºÑ&âÊÞW–›y÷Ò‘mK§{;óÌtQèã¥, €„ýv½‡M\°qïYü ->}$ýEý‘S‚ûuZþ´ûaı¿¶‘µë ìÊH?"®ìõ³×OíZ3…þ5a¼”
d0QPÓ5Cað´¥1G.ÝÅcIÑÇÂ<ÔÍQIJjΘ!nv,Ÿ6«‡ÄþÑÔÆŒÛ»²èý ·ÓrÞ|À;~ӓΈ^æïiÏ2ñR6ˆÉ4
:»3wÍ®S×<CQqѲ|qvï¦EáA^x²FÛŸ¶Èªh‘F»²Á£ÑóšÛ¼Ì/üX˜OBÿØåÓGôïÆï¨÷¿>^V>¿¶~¾”ܼÚïàé¶8úÀù$¼û9²ïâm -³B¹Úг-~¾ˆCõ$•™ñœ¼‚&Gm9ˆ¯ò-YÍ~xãtüÚyc‡¸ÚXþ/Ï/ËžŠüãC“eµµÅünýGL_¾ýØö;²‹ÂûR®Ä‡«ÕW¨;J£2†ÛбóÖbýôu>þ™üEÆ6/ðtø_/›ˆO
Å'ÔþRBÅàeÂ/¿Pëáx‘lÈØyëâÏÜ|ˆS-ÉÄ+¯!Í=¸—-“¬õSµëµHIåLõ%}s~·~!Ó–n;|éîc¼ [˜ÿ*+5ñØv4^ö+3^þd¨FšˆŽ£úµiÓ¦Í(š~š’SìqŽ^$‹Ü|ðÂŒx´,†ãíVÝÔ¡WÍ©#êë«HÁD÷ßÒe{¿‰6Psè÷d¼|t“Œ—¢ù%Y¥‘iGj‘C5ðA¡-Z¶l…i‰hh^´hÙJNQE»½^$›‰Éðj?-ÉbÿÉ]kÉ·£¾¦Š‚\«–Í›‹º@½ô -®¢®ghÜÁÌÜanÞÑÌ´ƒ‰±±‘‘Q{ÙbddbÚÑšÓÙÙcȨéK¶8›Úø±àõ³‡7ÎìÝ9uä`g®µ¹©‰Q{CCÔtë«H€F½º. ¤¬¢†Ï^"õýDë±âèÏ/ñz Ûi¨*×qª±ˆuØûÐfäPíºrfâ² ¨‡é™Z08<°S§NB!ŸÇå°Y,&“°–èÙ,¿³CÏÁ!á8Úü6þñSqþQïÆÙ}›—ÎëßßÍÙ®ÍbX[YYZÔ_CÔªí”Óf<}ÇÎÁ[1¨} -&ßÎÅÛüÜÕd¿NÈ*úðîÅã䋇cVÌãÛ§›-qÚÆuÜjìDˆê(Wn« ßËì—:ÊǦ¥ojÍïâìêáí3pÐàÁƒðéçíÕ·§§‡‡GoâááÙÇ«ÿÀaÃÇL‰X$ެøËçO¨{§%]Äç'Í
: __OÞîn½\{ºô¨Ÿ )¶¶6Õt†ÈkÛˆ½vÜñ2^û)N&߸xꨡ}]m³®ûOM=€Ò¡¾n;-
5eEùÖuWiD”¯¥¡×ÁZàгÏÀaA#BÇŒ;ftè¨!ÁÃüeK@@àð¡ã'Ï^´jËž—qù‹ÂO_¾~)þ‡’Þ³6jî´‰cFøû
æ;dð úêâ^} ^ÛÑÙÅÍkpи™K6íÁ©q¯Púü ]kú‹Gv¬Y0y”Ÿ‡k·®öuܪï%:47ë`d £…¦ru¥2js}r®¤C¯~ÃBÆ…OŸ=wÞ¼ysçÌš9cÚÔ)“'‡ËšÉS¦Î˜¹bCì¾—n?|úê}Ñ—oß¾~þ˜ÿ2ëÁ‹'öÆnX1{ÆÔ)áaa“&N?vL½õ -#‘‰3ÐŒ'tÊüåë·îØ¿gOüî]q;¶ÇÆÄlÛ¶U¶lÛ»#.~ÿ‘S®Ýyøäºë_¿ÿþûoß+{õ,=åæå³Çíݽs{²dËæèM7¬[[O=@B/ª± ·=}Ö¼EË×m‹?vþæ}Ô¥>~þúíêQ¯³Óî\9u`Ǧ•Qóç̘6¥.;½€e8ÈÇË£gW®¥‰®(‡ºŽDF¶Òuvñ ‹X¹9îÀÑ“gΞ={æô©Ç;zôˆÌ9zìÄ©3ç/_KJMšû¶àÓ—ï¿ÿñÇïß¿~*Ì{ù,ãþëWΟ=uâ²äð¡Cìß·'¾¾z€$lÙRcˆÂ~{ùʵ·Æí?~þzJzö|¹¿}Ç=êåÓGwÏÙ³}óúÕ+Pó:î?5ô -Z] 1± -¿ý'‰Þ½zž•þ %én^Ï= -]*îP_‰ã–Eª±
>öøþ¸„Òh’n JÏ«Ä(ɵUÇç̈öjÞNþî£(WP\‚‡Ä#*û$8b)åŠzì’@¯`Çý„U9nYu šz@aÁû¼×9S¯Ž§Ê¿0Œ¨riReXbh¬DSPÕÆ§Kö&eÁ’çæúú›(ø®WD7ûÿJßýrü%¢¾{-huÊoÓsÜõØýð`qþà–¨É}Ù&íj•J$ök³æ8OHË -?ÿ㯿«~ä
L=ê½6Ð’#õÖ*.¯¡z -Ê‚ÈyOê¥åG$tc¢‘RUSר#SèèÚÏoô´Åëw%ç}“Ѳ¡o -P¿•ýñýsá›§÷ïX9+]‡·b •5•$§D$12Rªh´34µâuéæ10hÜŒÈu;'àCòò‹¾ü"û7‚Töço_>æåÄ©ýû:ñ-Úk«*â}Ø´Y“Š#¥»s×^Þ¾#Ãæ,ݰóð¹ë©Ÿç} sK-ÿ}`‘ýþõS~îã䋸ÎÐÁnö\óöíÔÚ¶iS—hÉŒ’XÙ‘R`ïÒgððqӬܼûhÂõÔŒœ7Ÿ¾‚#û—BÆËâÂ×Oï_;µ{=>¾ÖÕŽcnDm÷oÞŒNf¹‘RÇÐÔ”½}üCÃç.Y»ïÄÅ›÷ç¼y_ôåûàÈþüóÏ_àñòy:>ÊjÕÜ ý]íy–&zZªÈ™Ñ3E?"ášÔœ’CFÊg.^½e÷‘³‰I2Ÿýþ'8²'d¼üö 'N]?³ËòÙ}Ü…³ö:*ŠòDé¾?”™èG¤¥sJj¤œ¿bÓÎ'/ÞHIÃÛëÅ‘ý+¡æ—òžgÜM<¹gó²9‡òèf˱4Ñצ1«3Åër -ÊêíÈHÙ½÷€€ÐÉs—¬‹Ù{,áê™9¯Þ‘mš ±/"WF§.ŸØ³yżð‘¾^®BfG#]M<f¶øñ˜I
•-HY4§ätvrë‡FÊYx¤<|æÊí{éÏrß¾ÿXü4ö¯†Z*ûR”ÿêéäË'÷n]½pÚØÀÝ»ð¬M
Û©++ʵjñ#gFi¬u%äÆÌ—¾dN))ï>ÊzþgpP[Ÿÿ‘ýk¡\Ùçï^"•]9}`ûú%sÂFë׫kg¶…‰¾–šRé ²#ûµi‹Ö -ʺÆÛnh¤=yîÒõ±{“‘2ûU^Éàøƒl=iè+âÊ~ûVŒU––|õܑݛW.œ>nøà>.ö‚2€ÊCfªYe
=+¾}O¯¡x¤\³Í)ÑH™A”_Jvi6ô…
¥2œú*;#õæÅ“û·¯_:wr¨¿Oïn¶\Ëx@-ÍV2q½ªr‰µ°«›OÀ˜©xNyðžS–Œ”¿ÿù×ß0Tþëùçï¿q.bñÇü×Ï3ÜI<w$~ëêÅ3'ŽêíêØ‰…& -5Öaÿ5PÊ'+UJVª¼ÿú2ì¿$£¦d¥2"#û¯·‘RS²’xÿ5Ùäï›ü)¨)Y©Ìþë.î%›üAd -€Z@¯JÔ) - -DH
ÝÊQ 2@jèVŽ‘RC·rˆº•£ ¬ 5t+GÈ -DH
ÝÊQP; -º•£@d€ÔÐÊ - -”RC·r(¤†nQ(PHd"ƒe€ÐÊ - -”R#©È @ 1ˆ -”Ò!‘È @
’‹ -”"™È @ ’Š -”#¡È @ 9’ˆ -”RA·Ðâ @ -Š -”’#©È @ 1´«yB2@Z$ÔŽ$„vÉX %ôKÆB2@Jè—Œ…b€”Ð/"¤„~ÉX %ôKÆ‚È -‰EG’ -IN"‘R!ÉI„ 2@*$9‰DH…$'‚È -IN"‘R!ÉI„ 2@*$9‰DH…$'‚È -÷÷ - - -:u¶µí -èýŽþ -˜<lú>‡>‰Íåc#ð{XV2Œþ%—ÉAWÅáZñ¸lú$– -ÝjŽ>‡/Ý5K6~\ü 8økðãD_ƒãõ¹&ºxù(‡ÇG/Ñ×ò„Ôcfñx<t_Xž›EîºY.¹1,!ÃJÀââчð8L¦~eË ›;zË{ËõMÍô}ú£¿ˆåy¢ˆn8\¡ -529\.þƒÃðùèSÀÑ\ž€Çâ“?Ð]ãà?6“ƒ…ޝƒÃÁWÆd¡À`qÑMáùVL>]}ƒÙÏAO]À@_dÉE—‰>¾Ÿ<‡Ç@O=5~h|¦~¨<‡ÅEßK–Ýô)—ÉÅ7ŠÍD’Áů¡ƒ:#—‹¾}O(º)H³Hmè+Q‡à…ú,ÔxL,½ËúɳпeX¤3!Q1øãÐE™ú8tK±%l.]î`è± -˜\!1…d(DÈb#ÁqyÄb¶ºô>d:êä5$\ªÃ²Ùèa°É•ñpÿá’çÏf¡ÇŠî~ÌLôè3„L~
ÅB’*cshU·8”(²‚ϩ܉FWÕ‰B«èD¡4;Qx(”n'ªÂå…VåòB«¸rÁVL}&ú'r2l"QtEèmè6XaE’×Jÿàr„HLèÎPFc¯G¬f3ØøÖT¾<ôÍHüÙ–\ÿElDnËôb¥ÏÄF"Ñ˨±y,òU\d3_ȧ®œÁäñÈW¡ž/àñ©{ÄyäSYXÑœò/’?¤9‰›/$/"%WE_*ïè†)Sï1cüFêOð4fvòfD?BJB””¨ÿv–·D7ƒ|ÛŠÁB_ÄÅæòðýÇÿ}!“É«x>£E-Ù\>º»È\ä ~Ø–ÏÂêçðøö:HûµŽ’}-i+¾Cè[qgrtDC:õ&‡ð8èýlü›! NÇæ -‰úøè0«ø÷Aä̘B.ö/,ú&‹tBäüøâ§Ïå“§^2¢ÂæRÏ;G._XþÅʉ…öÎå²PÇ~Çgcó9èf’ë@}•Oú‡ºèŸ4TテƒCuä.,f™[;ºœüæYlAyM– -µ[ùKe -¸\ÑåW¾T¤~0+\jÅÖ¤Ké;ŒÃW†ì'£ƒÃ ìG•òb&¹VÜóÉ,ñ5RÎ -Éå‹ß…½—Yö“J^!n'z…¢4ôòôK?‰ÅdPãPé–¼„Z–ØUú¾ëK?òURò&·=^ñ< ßLä@YøãÉ¿bqø.¾Ï,,‹’â;ÈC‹Å"7}6 -ñD]L dó°
|Üvø*ш' C¡Šøf°9”a(Üă ~ù]r‹P×ÃãJ_2] -z©±…¢W|™,—pñ‡Þ†n?9„©X½u¢4.=>Wt©,>Z™×ЕaŸ‹d1 —XV|tÿÑKhÔâñYe^ - A<‹É”}º\ƒÇ,ûi¥/‰¾µ,y
ߺú¥Æb¢ -
(GÁzÀe¿_9î],‘V¸èšª0d* Gx(±‚„‚û -…$šæ0ÐÕãc‘*÷‡ÁÄ#% -2„êçäH‡BBC½’EúŠîù,|ç™ÔÔÂlü
èY8tc
ð/GúD—‚æmòñDÍdH$…ýG¤(. -8Ôk<(àC6Pã1ø;Y(ÜgrEý+`ã†èyã˜ÙÁD.=JÒ/‘,¥—†g¢ž@Ԓăø¢Aè]l*E¯à!
*XsÄWN‰Ba.jØMϲх&h:M¦âÝF„u¢þt -1F4/GC!zOwyk§ ðA}º;êû¸Ë*‰l8äV x}„>…‡h
©ú
øÑ›Dÿè³q¬Ä'ïF3=üyccb -¬j´†U?»U
kXVU`ÕÏbU£5¬«À*° -¬«À*° -¬«À*° -¬«‰I`XVU`տǪ†5 ¬«À*° -¬«Öª†5ìG&UÿV5”aÕ›ÔhªÃè˜TÏVÑ4©ž
“Ȫú1LR“dm˜töÈÔ¶Ú›T·¶Õ¡=µ´P¦–üËiªc’ÕX½véOÑ{©òÅ¿Ô\‘–¼ÿ—²Uµk(”Ü„:R i³æ-¨bï5Õ寧v£··j-‡Ï @´¡ÊÊ7¯º¬<õèýrm•”UTÕä´ƒ6rª>í -›—?E\EkUíöæÛnîýû 6È«W×NLS}MÑá–Mʵh!×VCϔٹ›ÇÀ€QãçN›>~¤ÿ€ÞN¬MðQ…åö%çFË+kQGú›:gaä’¨Es§>¨·#ß‚œ YÖ,rX+|Ò´uçÞþc§/\¾nÓæèõ«"gO>Àµ«ƒŽªB«²gnR-Tu:°ìܘ²`eôŽø½{vŬ_2{¼_g>>o¸u¹£`E-ð‘é¾cg-ÛwðøÉ“ÇöïØ5}Ô W[k#-%¹rÇ`—¶pìã?!buìSç/_¾pêàö5ý=ØtÈéìe[üÒ¬eUÜ"`ÒÂõ»Ž¿zëÖõK§ön^25¤_7~G=5…–ÍÊ^:>þ]y6j¶hãž“WnßMM¾qáÈŽU³GêÙÉÂ@]±Â¥£ç!¯¬m̲÷ðŸ´pãÞÓW“ï?¼'ñTüúùã}Ýl
E—^V%Íå”´Œ]܇MX°aÏék)ÒÓRoœÛ½8ÌßÃŽ‰/½l|éÍ[+jZuv2vÞºøS×RÒg<¸}ñð¶%S‚ú8²M´•Ñͪt{ÕôÍ…=†Î^wòjJZæãGÉ—n_>=ØÛ‰Ó¡]…SÆ©KWÕ5ã9÷1cÅŽcW’ef¦ÝM<±såÌ‘ýy¦:*ZP—Þ΄íØwøÔ¥1G.Ýyø83=åêÉ]kf‡èÎ飼ZþÁ—ÎD7+<rËÁ· ©×Oǯ;f‹Ðœz Z´n«ihmëæ;qá¦ýçnÞÏÈL¿wãÌžõc£¢¯†´øK¹›õK³VŠêèf‹X¿çÌ{éQ‹³{7Ì?Ôµ³%y„[´TPÓ3ô8zîÚÝäö¦ß¿ynÿ¦…|Ýl¬4Ê?tréäfñ»ùŒšµ:îDâÝG¨Å„Ñ‹&s·µ2ÔPl]©EyS®s¿3Vî8ŽnoFúýÛçn^æ×»‹u{Íò2)¹½8]½‚§/ß~ìròÃôÐ/ÚŽdÂ0ªÜâ¿È7(kSdYÌQô@P‹$,“ÉžöUKô@ŒY}‚¦,ÝväRjñðÎ¥#1K‘°XÆÚT‹ -„<BÏÀÉK¶¾Hµ¸|4vÙ´á^b)Vñq‹€ÉQ[I$Å+Ƕ¯˜R•KZ0ì<£¶B-?IqD?gn%)Š[´G-°¨™iHŠq«gòéÆ3«RŠ¥-¶P-ÒS¯Ú½fN耂ªÅKµè-n‘ù$ãÞõ3ñëªo{ë.â2Ÿ<¾óìÞ‹·r‹¬ÇnÛ·qþø!D¼5µ¸óèIVæÃ[ û7-˜0´—MUr¯Üâ铇·Ïˆ^8Ëݰ’Ü+µHC-%!ñ.šTµÜ+·Èz†Z\@rŸä玽"Yî ¹‹:½iw.¢"jQ±ƒT׿ÊNØÀ-«mQ¢D ZþqXÂQ´÷Ú×’é¶{š-J½Ï‘ËÉéOkn!òpS–ƽ|7ýivu-°Ol!§„FtǾAS—Ž’’ñ4ûiµ-~ù]ä©§!O˜’ñ,ûizòÅÃ[«iA|»“wlO\M}œƒZ\ª¾?Ðð<r檸“×îefç<«¡5Fu÷5{õ®S×ï?ÉyN£…^GjŒ?sãAj‘QM<Ö’0£çà±óÖï={ëáÓç/²3îÖÐBÝÀÎãçoÜ—pûÑÓ5´@¡~lp}à|Rú³¹5´w(¿I‹7º˜œ‘››ó˜´¨²R-¬ÄÒ½›‘ƒZdü°E“J²JyœóµH¾ôƒ~^*28cY=Fß‘TRêá*· -°Æ¡ñ£âhP¶EðÔ%[&ÜHMËHtùøÎÕsÆ Ù²BŒ\Ò‚ÓµoPøâM{N]¹r/õε³·-›1Ò§‡À¼Â8HZÈã0ÜÁÓoBÄš‡Ï^¹qóFbÂÑ]…y9áñ¼\ä^†3»¸
=siô®Ã§Î'œ>¿eùì±¾öìíÈì ÂóPÒjoÕÙ¥ÿð°ˆÑ;÷:|h_Üæ•óÃ}zÚ Hù¸„jÑVÃÀœ×Õcè¨)ËÖmŽ‰Ù¼nùü)¡C=»òð,G®y¹$pWÓíÀ´íáí>{á’å+–/Y8;<t˜W&š®)´ª4/jÙÏÖxö®Þ¾!cç͜9cZØØà¡^=í¸æd¶Va$f©ëšXñí]< -5jdH ¯Ï¯ÇSáæÚ(kêw°âÙ:¹zxõ0p@¯Þ?<‰œ:MžµôM,X[§î=\zt«îXiò%x¾©Û¾ƒƒÍ…B>—õã3‚ÅszEeum]ãfæhRoRͯ•Ö
ôõõõª=½³üÚ„ªššºzMG1–¬´Äë - -äX½êÏÕ£ÖX~¥ÖXZµ¢±ÈRv§Y3š'^‰–ÄG]Ñ:¾¨ÂzͳhÁÁ"5û¯¹Ê?.MÉ©:½,6©ûIŠ÷3˜Ô‹B×ÎÅu…|Rù“˶2Hõ~\ß”Tˆ²q™Q\°ž*ß˨ãùTmlR®“K*ñsp
_Ô¦Šo'‚Xû½Nk*R5n<qMEnÅšŠeÞPRS‘+þšŠ|.ÔT¬/Ïo
ê§™FøcVÿÊVKÛdaO-m“µIÒV?VIdX½™Dß°z6©ÑZU£a
bR£µªzÃÀ*šV5 IÖªVÑ´ªÁM«ÀªU?‹[ -¬úY¬jp“§U?Ëã«À*° -¬«À*° -¬«À*° -¬«À*° -¬«ÀªFnUƒVU`XVU`Uc3¬«êÙª4¬ZU½IÖª1ì絪ž
£iR=֒Ȥz3L -«dm›Ô&ÉΰZš$Ûêʤº2OöHm^=CÇÔ†¶â_DCdçÿ§L -0ü¨,fÓfÍ[¶j-''///''×Ål†«6TÕ7hÚ¬EËÖò -Šm•”JmÚÈ·n…UUHBT£µ¼¢’ªº†–6BKSCMEY‘ª¤ùk¥zⲘJªšíôÚ›˜µ7ÐÓÑRWiÛWÐøµê²˜ -ÊíŒÍ,¬™,‹imÑѤ½žv••4ÉWˆÊbv´æmìììíl:ñX–âJš -{‚‡Ú(kè™Xr:;twu÷ðôèÝ«‡S!ËÂXOS¥RñQI5cKž]÷ÞÞƒ|ýüý‡
öéÛËÙ–ge¢§¡Ô¦Uó_+¹lÕFEËЂkßÓkHШq'M?&Ä`ûªŠ £Z+ªë™²º¸x5iúÜùDÌž:~„¯—KNGM¥ò…VˆQòJZí-…Î}‡ž±dÕº
Ö®ˆœ>Ê·o·NÖÆíTÛ´*[S\’TÅ9eÁÊM±»âããb6,˜<b»=ÇTWë,××:R×ïÈwö -œ8oå–øCÇO<v .zùÜ ^Î‚Š…4›ˆë#Zuî9pÔŒ¥ÑñÇÎ]J¼rñÌá¸
‘SGpélÕ^³\!MqÝc¦]ïaã#Öì<rþZRròijcVÎ3¤W¥Ò›%uˆØŽ}Ã#£÷¹šüàÑ£{·/ßµ.b¼¯»£Š¤âϹ_ÈtRUèÁã¬'é©×Ïìݸp¢_oªÆe™Š•¥¥§º5kÕθ„VNö“·öG/šT¶*f“Ò›K•žr4fîÚøÓ7d=ÏUGZ< }Gʼn¢ÒSúTaÈ
{ÏÝzô,÷ÕËìô¤¸ž’Ÿ{åšMÔã0°´é5tü‚MûÏ'¥ç¼zý*'}Çê)‰‹UÙRŪ.ÜÉÈyõæúŽ\Áoh¯Jå'q\ÛÓÚÖ}ؤśþ?{wU¾ÿüîÝ»wW×î[D‘žA±»ÁîVìn]»»»×îîîÄ»À@±6î/þ¿ÿ÷{Î`~QC¼ÞçïþvYG`æs>Ÿï93óCn>|"ná{vßgv ÔnaÙÞª÷Ø…›_”·¸wýÌžÕ3‡unXÑ\ {ºdw"Œ¸_\ïqr{+íw¯Ú½jÆŽõ+˜>Üñƒ½Ü¶ñ¹õðÉÿ»WOî\1í“ÛFØ™•¶3›ÏGâw®œØ±|Ê OíóøáZG/É[<º}ùøöe“x×.óá^’îÌ¶íØ¥ÛÚ-.Û¶tRÿ¶µäî“¢¬þõÏ÷‹=|g¶íÇ/[nqt«u‡Ë÷÷Äühg¶Wîø‹[Üò·ÛEóãmº,;{ÊÙN^½«ßâÈ–Åú¶’·øx+0}«ÕòÚÎl»O]»ðÔr‹ñ}Z}¼·§õÌt:sõžÓ×ï=Öo±yÑxm7зÓ÷4•‡ÇðYköžñ½ÿøÙÓ/ÝÂr@,R¹qWyxœõ{ðÄz¹ÑÚgn¶—›vx¼w‹OP?†P=FÏ“‡ÇçOý¿t‹»¿™¿ñà…›ž>ó¿ýÅ[h›åÊjŒ8 .FöâlÑK; n=zö<·?}nù+o!(Ë-Æ-ÜÙ[èÛBʃöˆÏmq‹À¯¼E`¬¼Ed~¯¼¯¾þñø¶Çü+ëêkk÷ëo:¿tœjëÂÏ÷’ÏÝâ£~`íW_¼E„žxW}‹Oô݇ª[|ØÛ?¼yñ‹·øp~<–·øÜ擟˜Q·~ñÏA1k¨n¡mW©í›*gí͇”·ßÍU¬ -ºW¨çÝo윕[ö:rxß¶5ó'h_¿¢»MúäÝ"lÿæ]‡Lš¿rã¶;¶¬]2}d¯Ör£ÎìŸØŸ]üê©3ç.,7Þì5lÒÜ¥+׬^±hæ¸A›ÖÛø§M–èý[ü ?%!e›®¥ª7j×kȸi³çÍ›=mÜàmêUò(œ;óŸ`þ¹íÝËz6öî>`ØèqãÆØ£]ãeLv92~ðááÛhfÏçP¤\-;tëݯ_ßžÛ4®YÁÃ1_¶ÎÔþ~^›1G~Ç"¥«Ôjؼµ·wÛVMë{V(îb—3SšdïßUÖm4M‘6SŽü…ÝŠ•\£V]í"Ês-”'kú”IÞߨóaççâ&6yìM%Ë”¯P¾\ébfyêœ!µvüÁ-¬ÛhÊOºÈöIŽ…låé¹8×þàS+"Ü$yªt³ÚäÊ«šFÞ\6Y2¤þø|Þòsi×2´K2eÑwÞÌš9CÚOoÔùðm4å唩ҤÕwÞÔ7Þ”×%>úÖm4Ò?zDÛy3EòäI“„mÔù©9ú·Ñn$?ÝäW¹õ¦vMæóûh¾¿õæÏá×}¾|yɲõæ¿ô|éÚRąIبó½}ËΛÆlÓ©åû÷êt2»Ú;8¹;Ë3ìÝÌ.6“:¹™íÍNNò‹Žîö®ÎfG›Nâ‹.öâŸÌr¯N'{w““üsnÎÚv›îŽöNŽ&g›ºâot¶wpp7¿·W§“ÙÁ^îqYÈÑÙÝÞlßåßX¹U§üu>±hgñEWñ×›åV ®âŸL.6®ŽŽöfwG¹µ¨³ƒ½ƒÙä.þ~Wñ»j¿˜ƒ‹øœm\Ìîâ»;‰ÍÅUüdâ.â?9¸»˜l -9›í]Í®.6e’:»ˆ_ÞÁEü¦â/ssßÉÙÁÁÞÙÍ]üýf³½ÉÉÍQûÕÅ7wu’¿ºƒ»øóÎâ.2‹¿Ìì¨m{j£³ø1"ÜEâï?š¼;>º×äƒãdorw“¿–»xœLf'“«½“»«åK&'¹Ã©“›Iü9gwý‹î®n®6òKÎn®Ú6ªNönnîîòïsµ“““~79›ÅÝáÏ9‰ÝAü“øûLŽâ‡1k¿‡“½“³£øs&“½‹³YÜM&ù›‰;ÎÙÑdïê(ïqǹ‰"±i•ÔÙU|ͬmÉ*JÄAüÎârt“¼ü>âNíŸÔÅYü!'í·r‘?¶‹ü\\Ä}äâ,þJù#賋øLâ'w¬«“£xŒåÍÜåÃ"‚þIåf±úžª¢†œœÅýaûXgyWˆ¿µ¶Í¬µ<ä–åñþ6³ÎÚßfµc2Yï[“£ÜcÖíý/ÉŸÍù£?÷qUöOZºeRG›üuºtiѹMkï-Z·oÓ¥—‹›vô¹ëǤ~lêÿ[Ú;i!Q¬2fGñ軹»ÈÇ\”šÙÍd£ÿ'Gyà9ZHëOP¿³å¦Î®f³|ÐMnŸ¿øéÍÎâ¨5¹¹¸Ù”nö}M6ò>’;ÍFîû–þÊï+ëÅA/ñ]ÛŠcºtéÏë.nnöâ‘G‹›è.²99‹CK|QüüNâ5‰;ªªøš8ðœÜä—Löâ[»ŠÃS”°“³‹ü’›øSŽ&'w“ü'ýO™\Ä?•Iêâä&Ž'wy°»Ù;;Šúªú©ï[õs¦£³x4E¹˜åCèbu`#š¡»ì=âšÿ¯Ðûÿjr1Ë{ÄYügggñÍä-µ]ÁÝQþ›»ø½ÌâØ•}ÂÝ,:‹³³<\Åq%~n7wQf…œåñíêâ¬U€¸øm]\mÌ®âÐus2}â¶N²Ù¸8;j½K|'³èJ²¾éÛ–Žô·•¿®É¤µ8ÑLÜ\"V€¼ËM&Ù×ä#":“IÛ3ZöX³|Ä-Ä}ä.Wgqï:»k?‚£½øž&›_ßÃUtE›7ÝÅÍÁÕU>Øòq5¿ÿ°~¶ -‰Ešìäî”ÉŽœöfggù¸Š¢ßU¹ÆtpÕÿœIäáÃC>ÒN– vW¹Ü‰p´ö±þàö±–mA<Ö⛹ºj}A¬ÿœÄcí,–æo~¬\ä¦÷rq*Ž -w'mMc/Ž`Ñpeçqw’ûÉ›äMþ>îbüºŠËGÛlrÍÛÍÉQ[ÖËE¡üÝÚÝIÜ3ÚZÆ$[¹˜ëÚ£ý߸t俱“x\´®"VèâÖŽæ÷VáçÿSžf½-ÿ÷ánþÍ"îçßì£ýó4³î韧Ùû»úçi¾m¿\кÚ4±q“íK>xrWÿOýùoÖ?dýÿŸÞÖ¿Ùûû‹SQºlíO!„B!„»}ïGŒåo5#„B>£†#”BH,áséI!$vÆðaÇè$„;cøPctB‰1|x1: !„ÄÚ>§b£B!±(†O¥ØÏ臈Bˆ‘1|Å9F?b„Bb.†xÀèÇBH4Æð)ÏýxB‰â>Yâ1£[B!QçIÂaôCM!ä[bøøH˜Œ~Ø !„D6†]„B¾ÃÇ"2º!„|ÃG>ÇèÒ „"cø8€’Ñ5B! =†DžÑÅB! 1†7|£‡BPïùøF—!„ÄÿÞêUŒ.%B‰·1¼Ã#j]P„ßbxcGô1º¸!$žÄð~Žèft‰BHÜŽám1Éèr#„8û7bžÑEG!q,†÷mÈèê#„8Ã{5b£ËBbuïÒˆ=Œ.FB‰¥1¼?#2º* !$vÅð¶ŒXËèÚ$„Xû1b?£‹”BŽá}q…Ñ¥J!†ÅðŒ8Çèš%„˜Žáq”Ñ•K!1Ã[.â4£ë—B¢=†wZÄF2!„DcﱈOŒ.gB‰–Þ]/]ׄ•1¼©"3ºº !$jbx;E¼gtBÈ÷ÆðFŠÂèJ'„oá- ŠÑõN!ßÛ' £«žB¾.†·M$XF×>!„D6†7L$pF„¢ŽáÈÅÄ$„ÄîÞ$ãîÕØp÷BHÇðö;qŸÇ×;ŸB¾!†7ÆØÃ臂Ç"v=„Ã[¢áŒ~>Ãï™ØÀèBdo†4áHÆð{Œ‹’cx'¤ñ~C¿yÔ! *†·AúíwÆð;–Gïcx¤ÍFa¿Ÿy( !ñ2†·>Zk4Åð{ž‡•obxÓ££Æ@ x| !q:†·;iLÆð…G™Gcx»£…Æ|€x¸ !q+†7::§1üÁâq'„ĉÞâh˜±!†?p -$„|!†7"š ‹á•FB>ûmŠDŒáõFB>Žá-ˆE>ˆá%G5B>Žáý‡îD>Žá…GAB"ÆðæCk"Ÿ‹áåGMBÂbxó¡/‘ÏÅð -¤2 !a1¼óБÈbxRœ„ÿ‹½ˆŽD"ÆðR¤8 !†·ÚQÆðj¤D !†÷‰L¯Iª”„ÈD>†—%UJbg(àhá†Ç‘|m/K -•Äž^üˆŒ.L+bxR™$6Äð²óâG‹ˆ¾ÆHHÄ^ê -bø} -|”LÖWÒdÉS¦J&MÚtéÓgÉø~´¯¥OŸ.]Ú4©S¥L‘<™¥Ôd¥E(4£5+^arBÊÓê+MÚô2eÎ’5[v›9sæÌõqÄWsØØdÏ–5K¦ŒdÉR•&Mt4êŒXb©0ÙÂ,–"ejY_Y²ÙäÌ7Ÿm»‚…ìí*öö… -,`›?ož\9m²eÍ,JMVZ²¤–B
:KðÑ›˜ìa²Â~M":˜(°Œ™E}åÉW ½ƒ“‹›Ù½HQbÅŠœbÅ<<Š1›\]œìÈŸ'WŽì¢ÒÒ§MRëhÔ kb²Â´–*,°¹òÚ´wt1)V¢tÙò+U©Zzõ§zõjU«T®X¡\™RÅ=Š˜\ -ÉJ³É& --MªÉ“~PgFÿ¾$ÆÞÄDKšL´°™²ÚÈ+ììæ^¬d™ -•«yÖªS¯a£&M›5oÑ¢EË÷#¾Ò¼YÓ&Ö¯[»fª•+”-U¼¨ÙÕ©pAÛ¼¹l²fÊ šµÎäúŒ2KhÑKLobI’¥&ZXîüv…ÜŠ/]¾R5¯:õ7kÙ¦]‡Î]ºuïÙ³Wo‘>á‘ÿÚ«gÏݺvîØÞ»u‹fÔ©Y£Jإй»9¶ËŸ'G¶ÌÒE¬3¦fÂJX‰É&–\LÉLÙrä±-èàê^¬T¹ÊÕkÖkÔ¬•wÇ®=úô8xèð‘£F;îãŒ3zÔÈÆü6 oï];¶kÝ¢Iƒ:^Õ*•…æêXÈ6oÎì™3êu–èÚYеÄ,M,]Æ,6¹órt-R¢lÅj5ë6jÞº}—}>zÜÄ)ÓgΞ;oþ‚….z?â+æÏ›;{æô©“'Œ5|ÈÀ~½ºuj׺Y£º5«U,[¢¨›“}Ygbn¦H–$b;3ú ш%–<ešô™³åÌgç +¬rÚ
š‰ëÙwаQã'OŸ5oá’å+W¯]·aã¦M›E¶„Gþë¦M7¬_»zåïË/œ7{ú” cGØ·Gçö›5¬ãY¥\I““½mžœÙ2‰ó -~©˜¬¯ÿüç¿Âò™ûoZ¥i…öêepPàÿwE?utÿÎMk–Λ6nXÿnÞÍêV/_Üä`›+[Æ´)“þ*›Ù4³xkþÔbRÚ6•¨àÙ eÇ^¢Äæ.]³e÷¡ç.]¿uOô° àÐWoÞjöŸð³¶«¿ßŸ”Ú—þþ¨Ò´B£ó…^g×.;qhÏÖu¿/˜1a¸(³¦uª•õpµÏ—#KúÔÉ“$ÖN -ñ†ø×Wú™§õä ¬ÔþÖš¬³ gÝ»yÝçìñ;7®\8sü°¾]Z7òªXÒ,ffÖ©SÐÌâ|,£RœTŠÕ˜hc®ÅÊ{6hÕ¥ßð‰³—¬‘%æ#æ¤ÿ“çÁ¡bVa–¹gYaÉëòbXà³gϯĊ ”×Ð^X/s¼•¥ÖÕ¬u&ÖgÏŸúß¿í{ù܉ƒ²ÌfŒÒ»c‹úÕËs-$Î3ÓéÍŒÓ̸}Tê'•Z+]¥N³½†Œ›±hÕæ=Z‰ÝxjmbaöGøE‰À§Ok—õïß»þ¤Ò½{÷ï?О
xòô™¼`+ÏH#TšåœóÝ[½=Só¼(³
+æOó[vMÅÌtw, ›Yøi¦Ñwù†XFeâ¤)ÒfÌ.ÚXñ -žÚt8jêüw:uñš(±gArNþ6ë¬úR»è¥]È¿s놟ïõkW¯\Ž+W®^»î{ãæ;wï?xäÿX^¼µ^\³^ü°,Ï^½|øøá]¿+çŽØ±~ùÜÉ#ûwmÝгBqÙÌÄÊL^3cdÆÍXFå¯ÉR¥Ë’ÓÖA¶±æû›8{éºíN\¸zS”Ø‹—¯¬sÒÚÂäR*8(P»|/ÊËW>û}îÌé“'Ž;v4,ÇŽ?qòÔ™³ç/È'Ñ}oܺ£=
¥=M OQß…]ÃÕþÊ—ÁOD™]>wlß¶5KfÚ»CóºUõf–^ofŒÌ¸m9öÓ¿ý*Wü¹íœ=Ê{6mlÌ´…«¶ì=vîÊ{þOƒD‰YN'õ -{ûF»Èõ4àÑí‰ÈKòÅÇÜ¿w÷ÎÛ·mÝj}ÍâÖÛ¶ïØ¹kÏÞý=~ê̹—´'Ôï=ðü40èÅ{…&{ãëPYfw|/9²góÊÓFìÖ¶‘—Ö̲gL›"ibFfÜ‹\Žig•)Òˆ¿½©dåÚÍ:ô6qÎò
»Ÿöñ½óH¬Å¬%¦/ÓßÊ˨ÏÅé (0¿k—µ—TÜ·{ÇÖMäË_—/[ºdñbý¥×‹/Y²tÙï+VY·aÓÖí;÷ì?xäø©³|®\¿qëî}ÑÒ#t´?µsˆ×rh>¸}ý⩃;×/›3qXŸŽÍ늕™ƒmÎ,éRÉõ?U·¶K™.sN[Ç"eª×oÕuÀèiWoÝüµ[‹3J}-öwXÓž’O<^¾pöä1ùâ°-Ö®\¾dá¼93§O2iâ„ ãÇ7NüÏ„ 'Mž:mƬ9ó.^¶bõÚ
[ä‹e¥]¼|ÍïÖQh¢£ÉKoÚÉÀŸ–µÙ³€û7¯ž?¾oëêEÓÇêÖ¦¡gyg»Ürýÿk"y–ÉÂ,Î$|9&Î*휋UðjÜ®ç ³—‰6v沘”Ï^„¾~÷‡¶:ÿë/}Ñ$zØÃ{·ü®úœ;% -lçÖ¢¾ÏŸ=cÊÄq£G<hà€~ýúZß×·o¿þ
2läè±&O›9g¾|¹ö†ÍÛwí;tôä™—D¡Ý}`yšJ«³?´gB‚ž>ºëwéôá]–ËfÖ¡YíÊ%MöbýŸ&…v–ÉÂ,®ÄZcb9–-O!·•ë4ïÔo䔫¶î?qáúí‡O‚B^ë“Rob¡!A²‡ù]¹xöÄ‘ý»¶m\»b©|Áþ„1#†ê×»G7ùæÊ¶mZ·j¥¿±·U«ÖmÚz·ëЩK·½ûømèˆ1ã'O›5oѲ•k7nݹ÷àÑ“¢£]ןp¯3miö\ÌÌkNì—ÍlôÀ®ëW/SÄÑ6gæt)Y˜ÅX®À&J’<MF›|…Í¥«ÕoÝmÐØ™KÖíÔÚX@ >)µ5¹þ¸?õpÇ直°Ãûvl^·ré‚ÙÓ&io=êÙµS»6-›io¯UÓËËÓÓ³F
ñ?^^5kÕ®S¯A£&ÍZ´öîй[Ͼò-tã'OŸ³`‰hi[wî;tìÔùKò…þbª½nè6•Ÿùß»qùŒÖÌ&éÕ®±W…bÎvâ,“…Yœ‰õ´2IŠ´™rˆåX9ÏFÞ=‡Nœûû¦½ÇÎ_“mì¥ÖÆ"\Ã’Ïü\:'+lÓÚßÏ1iìˆÁý{Ë7Q6oÜ n-ÏjU*–/W¦t©’%KXR²d©ÒeÊ–¯P©Jµ5k×kؤy+ïŽ]zô8dÄØ‰ÓfÏ_²bíÆm»•/Q»a}fôõÛ·ïÞjEýä¡lfû¶®Z0ud¿NÍëT.áV(O6¹0£ÊâB¬Wùµ%g -5›vè;bêÂÕÛœòñ‹ÐÆ´ zð@>‡-_’³yíï‹æL›0jè€ÞÝ:¶mÙ¤AšÕ«T([ºD1mëg'GGKœ]ÝLîE=Š—*S®b•ê^µë7nÖÊ»S·Þý# -mÁ²Uë·îÚôÔùËÚk<,íìmX3+³ë–Ì;¨[ëúÕJ›çÓf,ÿc},—.äie–\v.Å+ÕiÑyÀèKÖï:röÊamÌRbÚóŠòÕ8òÅ…‹çL?rp¿½[6©_Û³jŲ¥Š1»jûBÙæÏ—7OîܹõíïÄ?äÉ›7_þv–í¥Šê´xÕiФeÛ]{õ<bÜä™ó–¬\¿u÷Ácg.^•íL{)ÑkùŠmÙÌܺvþØÞM¿Ï8´§w#ÏrEmsdN›‚ë²±>ÖKò´2wA·’UêµêöÛ¸ÙË7í9~áúGâ¤R{šòÏ?%vëºÏ™cûwnZ-_&=jpßîÛ4oXdzj…2%<´-z -äÏ›;§¶bæL™Â7óÌ”)s¹cŽœ¹òˆb+TXÛjªdÙŠU<EKkѶc·Þ‡™4cÞÒU¶ï=|òÜeßÛ÷ýõ©ùæµ|Bó©ÿ]_Ÿ“¶^8uDßMkŠ…Y\YXþÇúX_t‘,•8´7•ªÖ M!çܲÿ¤6*µË¯ò¢•¼4ú,àþkOÙ»mýŠE³&Ò¯GÇ6ÍÔª^©lI³‹£½e[»LÒËÍ:S§J¾+qªT–ýd3dÌ”%kö¢Ôlvr5-Q¦B•µë7iÕ®KÏCÇLš¹`ùšÍ»;ãsMLÍ'Ï_h¯ÚÐÖ‚÷o^9{xçú%3ÆèÜB,Ì\æ–ËÿÄ,ÌbqÂ.¥Î=oas™ê
½{
›¼`õöCg.ß´ŽJÄB_ZJlÏÖµËçOŸ0b |ëZƒZÕ*–)îîêh_ _îœÚ¶‰éô`å×I"ĺ3¶Ü½8]úŒrûÏ\yDOsp1ÉB«êU·Qïν;eÎâ•¶ï;rúâµ›Ö2{õʲþ?lϦå³ÇÿÖu½ª¥LÚòŸ“ÌXœ°ËcòÒ…ƒ{YÏÆíûŒ˜ºhÝÎ#ç®Þ¶ŽJ¹Ó/V]÷%¶eÍÒ¹SÇí×}ËFµ«W,SÌìâP0Q`™ô
`“'µ¥mÖÿËûŸñ‹¾Çÿ¯Ú>Ù)´Œ3f=-w>Yhf’å*Ëí5ÚuíóÛȉ3,_§½ -÷jx™É× -æÖªŒuYì‰uÍ/k¬[©j
¼{
›²píÎ#ç®ÝÑN+ßj¯å«±›WÎݳyåü©£v÷nR»JIJeJaïà¿ý#ÞÂ[Zx¥J“>³¾Z)Qf-;ö<vúÂU›÷=«½üù‹à`ù’Ù[WÎÞ!N2‡õònP”[!Ye¬þcOÂÎ+e™JWkèÝ{ÄÔÅëv=ý®¼Ê/kìuè‹gÚó8·¯]2süùFŽj効%–1]ªvAÿž‡õÃ:Ó6ØÎ”-WþBÎE´=8:÷6aÖ’µÛœÔ›Y¨2íºì¹#»Ö-š:¢·wÃj¥M²Ê8ÇŒ=ѯÁŠóJ±s+]½Q»>#§/Y¿ûØß{ŸË“/|’× -ÎݳiżÉ#ûw‘oI+ar°ÍMÛa'Š?Ï!bÉ -H‘*]Æl9ór)RºrÆmº9eþŠM²™É·L‰föâ¹<ɼpl÷ú%ÓGöiרzi7±.ç˜úUÙïÿ‰È÷E<žÚuþ´™E•ª¦ÕØÒ{O\ô»VcÁrq}úÐŽuKfŽÜ³]ÓÚ•K¹;Y7q%ååVg¢%J,wÚ묒ܾQ¦jfí{7S4³ƒ§||Åifà‹¢ÊäIæñ=–jU&&fÁ\™Ój×þie†G»x!ŸKÊ”ÓεTµ†íúŒš!kÌç†véâÍ[}TŠ>q|ß–•ó§Œè×¹eýêå<\ -åÍaÙŽîçèùPšðÏ Ó>3 •¶Ãca·båkÔoչ߈ÉóWl–¯£¼õ@ŒLQeÏüïùùœØ»qéŒQ}Ú5¬VÊÕ.g¦4¢Ê¸axôd‰“¥Î”£€Kɪ
¼ûŒœ±lÓ¾“—n>x*/½}óúeÐSí²ú®
Ëfm¬IJ%Ť̙UÛX3¼Ä¢å§Óöx´–™X›å.àh.Y©V“v¢™ÍZº^{E¸62_=¸Ãçä¾MKgŒìãÝ jI—92¥N–˜ËeF'¬Æ2ÚØ:¯Rß»·˜•›öº|S^³ÔØ“ò -Áö5‹¦êßE´±²Eí,[7%ŠÎ³ü„ÖÏqÒÊ,³MÞ‚ÎEËV«ß²sÿ‘S¬Þzà¤ß]y–ùB^ʸqIVÙô‘½½ëW)îlk“‘*3<Öd©2dÏïT¬r½6½Fˆõ˜¨1Ë%XýÊÅ=í¥+æMÖ»}ÓZ•J˜ -ç¸ ]t¿Ú9B™%M‘:}–œù›JÈfÖkèÄ9¿oÚ«½žÒRenŠ*Û¸túˆ^mêU.æ”?{†T–ËeÑù’/Åz,}¶|E+ÖiÝcØÔ%÷ž5¦]‚Õj,à®ï…ã{6.›5î·îmÖ('ÚXîlÓè{ÇÌF'> EÛ|;·hfÕho¢Zº~÷Ñsò
.ò$S¯²½–LÖ£uŠEòeKo½\Ý?$ùtôË$)ÒeÍS¸HùÚ-»²hýÞ—n†×X ÿÝëçîZ¿dúèþ[ÔRÊ,ÚXfqN³»œ[ÊLÛYÌÌ¢™•Ôß:mÑÚò™‰°*»ásbÏúES†voY»|‘Ây²¦Ó.d00
Ь1qb™"m–Ü…Ìek6ï:xÒÂu»Oøˆõ˜¥Æ‚ýï\Ó/¥èÓ¾IÍ -Å\ -æÉnic1ûy
?X7•Û¼‹fVÐ¥Xy¯Æí¬/ݽrËZebõ|÷º…“wm^³¬¹Pî,i9Å4.ú¢ÿ×äi2ç*h*ãÙ´ó ó×ì:vñÆëzLÔØí«gm_=ÒОÞ
k”•ïÕÎ"ßEkÄþæ>°BÛÍÊѽLuýM–gòUæwñØ®5ó'êÜÔ³´[Ay!ƒÅ¿Q‰pñµTõÆŒ›»zÇÑ~ž„ÕØ£ÛWÏܶR{yCýª¥´77†í:óZØGï$M‘6Sv¹ÙP•º´×$m=pÚReA÷|ÏÙ±jî¸U“2´SL–eF$ìÄÒÆÖ¹DÕíúŽ™½rÛáó¾÷ži×.^?{tûÊ™ƒ[W̯½P«„«þ6m?¦!¼™iÛ¦t)^I¾ºrÜì[œ¾¬UÙù³ëço[1{Lßv
ª;Ť•Åx´E¿~béX¬R½¶½GÎ\¾õàÙëwë×`õ;}`ËŠÙãê/9µË•%là £±°f–,¥™œ<*ÔlÖiÀØÙ¿¿Web!ypËò#{·©[ÉÃ!o6¹øg`Æx,Ï&é'–ê´ê9|ÚÒÍÎ\½ð\>—^c¿Ï; S³šå=œä;´Ãß;kÔãemfÚÈ´ÉïX¤œWÓNýÇÌ’U¦OLùl¹øÑ÷oZ:mXqŠén¯-þY–Åxô™\ôËË݆LY¼aß©+·ýµ×öD¨±YcúwlêUNP¬ØÀrš©m;”=Ÿƒ{9¯&?¨²'o]>¹wâɃ»6ó*c‹–e1Ÿ~ÐdÅ¢¿t
qb9qÁº='.Ýzô,øÕ›7ÔXϲîï¿¡ÑØÇÊúñò]ÈÙòv/ëi²3Wn?|ªUÙy!cí‚ ;5®^ÒÅÖ†eYŒG¿B&dÙó‹EÃýÇÍ[³ó˜Ï
yìõ5ÖA«±¼±êÙáû)¤Ï–ÇÞ¬WÙì[ž¹z[>Ã$ŸÆô»ptçª9cû‰Å1Ç|,Ëb<–+di³äq(*ý}FÏZ¹ýÈ¿ûO^ˆ{]³ÔX?QceÌöy²i›LÄšLÂf©ÒgUVFVÙØÙ+¶:{íŽÿ³ òB†<Åü}æÈ^mêT(¢-Ëô«eFÿè %Ú°”WÈÄ‚¬\–=†O_¶åà¹ë÷䉥¥Æ®ž±ÔXã²Æ²¦O¥-ùcͦLá{\iU&zY§ãæ¬Ü~øÜõ»²Êä)æ™›—NÚEͲ&»œS30c0²
ü[Ë6¶®¥j4í2xòâûOk'–¯D…úß¹zæ >+5–2vÕXÄÝúô*ç˜ÇÏÓ®&ß—¯b’§˜§ö®_8qP§&ÕK:çÏž>%3æb–鲿u,V¥a‡ãç¯Ý}â²~b©½îB^fÚºb¶\…ÕX,8|??„½!YV™8ÇlÖå·‰Öî:._Ó«ŸbÞô9¾kõ\±,«_ÉÃ!OØu£ò„ý2¬6,Ý+ÔiÓ{Ôì•;Ž^”¯¼xõúÍ«—Ïß½~öж³ÇÊóJÆÂß« ˆUVؽ\Í]‡L^´^¾RéÑSù‚l±ø?D.Ëz¶ª]Î,¯c00c*ÚeX9,¸–ölÞmØ´e[ó½ÿT[ô¿z|Ï÷üáí+çŒðqý£ð*˖סH…Úz›¶t“¼¤ì(Ÿ+¸+–e›–LÒ¥iR.¶aÓèŸ;þG®úN,Î,å°lÔqàÄ…ö¾zW_ô‡¾xò@œûïX=wüÀNM=ËÆê¯²TòÉ1JuÛô9ó÷‡ÏûÞ,_‘!/ĜܳnþøþíT–3¼$‘x}X&M•1gAsù:múŒž³z×ñK·´ÙëÐàgÚBF{¡L3¯²îÖc±ò¡±¼GAýxñ*
Úõ;gõÎcò%qAÁÁAOÞ¼xlÇÊY#{µªUÎd—#c*Öþ1}ÕŸ"]¶ü.¥j4ÃrùÖÃü<}-O,ݺ|rÏzý%åÜÇò{ï0\JVoÜiÐÄ…ë÷žº"fH°X–ùž;¸y©˜Mª—p’—dYûG¬«þÌ¹Ü ý€ bXž¹¦½¼çµXôܹzzÿÆ%Ö/çÍËk,¼ÊÒdÊYÐTÆ«y·¡S—nÖ.ú= ¿Ð©½ëæë×®^Å"ö¹XûÇDô_¤LoSÀlV½FÍ^µóø¥ÛþÏC^½–o~»wýìÁ-˦èÙºNEù6ŒT±¼ÆÂ^D.™¹íÝË×iÝkÔ,ýlù鋱,»éslÇŠ™#z´ð*í*Öþ)~eíÍÑ™8ì³äq,^µqçÁS–n9t^KQc¡ÁOܸpdûŠY£ûx×·¾¡,ö¿rY^û×ß#NeDwî?~þº=b`‡„=‘sÓâIƒ:6¬âá;sšd´²hŽõòE;Sù:mûŽ·nï)yfi]]‹þyãú·oXµDœyklØîj²ÛŠeYÓ.C¦,Ó÷þ“ —Ábpåäî5sF÷n]»¬[›)ieÑ›°F–שDõ¦]‡Mÿ}ûQíÌRËÇw¯žÞ·aѤß:7©QÊÕ.μÉ_ß'R>+–eåjµê9RÌc>·=ÓæCÑž·.›:¤s“ªÅåeZY´&¬‘4W¨ëÝüÂ
ûÏúÞ—¯ïц¥ï¹C[–MÖ½…|/Y®ÌÚv%qáñø!üU%…=*Õo×ü‚õ{嵿ç!/C‚ß»vzŸXû÷m[§œÉŽV͉ØÈj4ë6|æÊÇ/ßzi–b‰¼rö¨ÞmêV(R8O–´)´‹‡þbò$)ÒgËï¬
̩˶È3O_¼|è/~±í¿OÖµi5k+£È¢-Y½vý',ÚxðœeÕ¯
Ky²?~@û†UŠ;jïï—.ì.1ç³vëÞòó‰ËwD+{ùâé}ß³û7,߯mò¢•‰ÌŸÿõcœøµâbôkdúЬYwÙÈN\¹£¯úµa©_¶Ôžç³ Û©$n<ú²,¹8mvð¨Ü°ÃÀI‹6О}ù2äyÀíKÇw¬˜1¬k“jÅòdN4ó2º¢=kùkÊ6væòbE6aѦƒçýÊUÿ«—Ïýo]²<cyÅ‚åqä±°Ì”éÅfiÏæâZ±ãØ¥ÛþÁ²•=ð={@´²¾mÅ ¦mötÉy3Ú"_«˜(iêÌy‹WkÚModúå‹ÐOäêxý‚°§’ãÜ{È,Sœar¯PÏ»ŸXûï?sýþ“ðVöûô¡]Wñ(œ+S*^Œ]‘ÃωS¤Ë^À\¶ýÆ/Ü(Ù3ÙÈBÅyþá-â<_Ë8ú*RËÀL›U¿<34ìòŒ¥•í_?lŸÖ5K»äÏš6YbyÃèŸ8>F(©2å*ìQµq—¡3VˆSKmEöJ¬úï\9±kµvÅR˸øzø"\h.W§MŸ±ó×íÓ[Y¨ÖÊŽn[>õ·Ž
*¹Ì‘!å¯ÌËè‰~ý"mÖü.¥k¶î3vÁ†ý–SKýÙ‹&ìÐÐ2,ãà;{Ÿ2s(Vµqç!Ó–o“ìyH¨<Á¼~fïÚ9£z4¯QÂQ.ý™—ÑmZþ*¯_©Ô ãà©Ë·‹…q@ÐËW¯Bžûß«þ3†woîñ¤qìQ°ì¼>»|ò_Fó´VöTkeþ·.Þ²xâ -Ÿ—úù¥Y¾@6i"ùI°1y|¢£ºÆä1&?í8Uê´éÒ¥I—.mš4©S§J•*e´G|Óô™säw”¯N0qÑfq×û?ù*4D¿€´p€ö
ªw.+kÆtiR¥L‘B1u|e,SàÓ‡À/òÓäRË]±J{µì5zîº}g|„Ÿ_®’ç—ÕäItºI'ŠâcHu¼WˆÿŒâϵn˜$yÊ4é3fΚ-»LölY³fÉœ9S¦ŒÑžL™³Úä¶u,R®fË«ï>yúJ,ÉÄRE÷kƒª%ÝìóçÊž5s¦Œä6¦Ž€¯I -™ä_8ÂzvIíæ«,×奚çlX0®OëÚeMsʈJõ‡Ð€ðBÔŠðÇ(ÝŒK{ªÜ<MúÌÙsæÉgkWPÄή€mþ|yóäÉ;w®èMîÜyó(ìR´œg“Ž',Üpà¬þjÅÐà'÷®Ú³vÞ¸þ{–óp-l—?oî\9sæG@¶˜:¾"dÒéH•:M:ùÙKÚþ~–ë±ÖÕ§<¿”×å g–iSGñ¤<¬u˜HöÐkªUÍ̺-ˆ8²çÎ_ÐÁÅÍì^¤Hww“›«‹³““££ƒHáh‹øË\LEKUôjÜ®|‡µöÜxèë7¯ä“z§ö®[0ñ·®-ëU+W¢ˆ›³“Ca{ûBcîøºäGÀ½i;¸—õjÖu¨|)†þ: -åË•-SºTÉ’%DŠG[Ä_^²T™ò•kÔmÖ¾÷ð©K68ë{ÿYÈk¹_¿¼»ãâ©Ãûth^ϳJ…²¥J–(^Ì£hwsÌ_q|ñÈ-&EAGS‰JuZv6]{½|CÖ«—Ïݼphó’)ƒ»4«Y¾˜Ö´óDñ¤<´BL/ã©S&Oú«,³£èý`ÖcËd“¿°©x¹*žuê7lÔ¸q£†
ê×S»VM//OOÏÑOO¯šµë5lÞ¶K¿SäÇ
jìÍ»·¯Åáí{îüü¤!½;µnÚ n-/ÏÕ«UR¹RŘ9¾6ÅŠy|áp°tmk×^±=B×¾+ßL>wlÿŽMkU*íavqrŒêãGuèuh“-K¦éR§HúkÔí4by¿V†ìù -›KU®Ù°y›öºtíÚ¥s§ŽíÛy·mÓºU«–Ñ›VZ·mß©{ß!c¦-\³ãˆÜþ"äõ»?Þ½y(7$Û½~ÉÌñÃôìÒÁ»M«–-š7oÖ¤q£˜:¾2Õ¿|h]»t¹JÕj7nÓí· óÖÈ·Æ=GÔÛ×âwõ;hËò£úvlQß³Jù2¥JFññóå# ¬ílóåΑ5“8õHUU¦¿¸>™ö¹’¥ªÖmÞ®[ŸC†
>|ØÐÁ¿
п_ß¾}¢;}ûõ4dĸ)s–®Ûqøìµ»_¼z÷矼
-¸sõÌ¡k—Ι2nÄAýûõéÝ»WÏÝ»v‰±#àkÒ¢E‹æÍš~éÿîU«NýÆ-Úu8zÆÒûO_g—¯Þ¾{ûêÅã;WNíݰxڨݼ›7ªW»¦W?Š#ÀR‡EÌnÎ…íòæÌª}æ^Ô|xµåµé²åw*V©N‹N¢ŸLœ6cÖìY³fLŸ6eò¤‰&Œ?~\4füø 'M™>{þÒÕ›w9{õ¶ÿó—oþüëï¿Þ½–[ù\:updž•‹çÍœ6yâ„ñãÆŽ3zäˆáC‡ÄÔéôé¥<ÂÛöôE¢m_x¯m_<¶kÝâã†öëѹ}Û6Q{ -–ˆ¨ˆØ’¨ÑØK4Qc7F£ÆÞ½ÅÞbï-jbŒÑ—æ÷{gvÙ™uÕ<Ïï½è:ìÝ9sçÛ2ç‰Îþ´Žä%ðxs-@Šš -¡¨ Èý¶²Žû
¶ -Šä(¿ÕÎå½ -ZJ~Ü?g%y˜éFÊ¢%Ê„ÃHÙ¸u縤áã§/ø~Ã΃§R®ß{ôôùË?±#{?yõêï?Éxy#™le5exḂõ«Ša!Å@g¦`Ì4ÿ‰x^ÈkJžŽ”=ú}2fêœïÖü°÷È™‹7¨Æþø;²÷:^¾ø•$Ný¸eùœICbZ7Œ4Ê–,ßÇ+9Ý7S™™‰”+mMYM)GNžùíŠ;œ8O¯·hEö^"¯/~pãÂñ½—Ξ8¬_×vMjEða!ºÂr"¦£1Óò½…§·_Á"t¤¬Ý¸M—¸ÃÇO›¿lݶ}GÏ\¼~ç!}L5öþbîÊhâÔî
KgOþ,飨õ«™˜r¥‚ -‘13Wæc¦<T梶*°¦ä+ÖhØ -FÊOÉH¹z˞ç’¯Þºÿè—g¿£ÆÞkä¯Êž?ýéΕ³Gvo\6wê¨Á½cÚ6©]Y/S¢HA?Ï<¹2ëÌdyäõ…n¬¬AªV·9]SšGÊãç.߸K28äGŸ_¡ÈÞ[ä®ì·ŸÞ•íÙ¼â›éã‡õÿ¨S«Õ+råCtþ¾i -Ò.?Àt%Ä%¤]~€éJˆK(I»´IWZ‹éJˆ -”¤]bºâJÒ.1] q %i—vD†ù#ÊQ’v™>])i,æÄ!ªP’v™.] sâµ(I»D‘!.¡$íÒ"2{9qo;~ä_€’´ËÔt%L¼D´ $í/—P’v‰‰—ˆK(I»ÄÄKÄ%”Š/ÍX‹Œ¤]:&^"Ú°Éíµ“‡‰—ˆK(&^"ÚQ,2L¼D´¢$/—P.2L¼D4¢Ä¥ -9âÊ\ -Pdˆ(s)@ŸÄ”¹ OâÊ\ -Ч -m¨ú ªQæ·‚>ˆ¨ú P%2ô)@´ ÌÔ} -P*2ô)@4£Ì9êô)@4£Ð9êô)@4£Ð9êô)@4£Ô9 -SÈÍ(uŽB‘!šQê…>ˆf”:GÙf÷¢È…(uŽB‘!šQê…"C4£Ô9 -E†hF©sŠÑŒRç(´õA4£Ô9 -E†hF©sŠÑŒRç(ôŽB4£Ô9 -E†hF©s”!šQê…eˆf”:G¡A¢¥¦>hP†hFÈРрRç(4(C4£Ô -
Êͨ”!ªQ!24(C´¡JdhP†hA½ÈÐ Q‰:‘¡A¢µ"Cƒ2D5*E†eˆzÔˆ
ÊM(5Zü -DÖ%iÜ<¢m"cª6í2`ü¼µ ²û(2Ä DæHD3`üüµ{O]½ÿŠqŒz‘yú³ÕšÅœ0ÝÞÓDd ÈG¨YY.OßÂÁldó®ƒ&.X·ïôµû¿üŽ"C¢RdY³çòô+ÂUoÑmð¤oÖï?síŠq‚z‘yù)Í×hÙýãÉ7üxöúƒ§¿ÿñ7Šq€‘å/ZF¨ÙªÇ'Sm:pîÆÃ§/PdˆCT‹,wÞAeÅZ{ºxóÁó7þúâOâM"+'Õi7ì«%[%ßü‰ˆìŠÉµ"Ë‘ÛÛ¿X¨©n»øÏ¦-ÝzøÂGÏPdˆcÔ‰ì?Ysäñöו¯P¯}ï3¾ßv$åö£g/QdˆC4ˆ¬`ñ°Šõ;ôùõòíG/Þ~Œ"Cœ ^d> ²J
:&Œš¹bDZ‹wÿ†"C£RdÙ@d%ô•Fõ=kåÎã—î>‘ýƒ"C ZdDd:%Žž½j×‰Ë 2òûq’9šDÑ(:qÌYdÏQdˆc´ˆŒä‘D÷;gõî“—ÍÏ,¢ÈÌQ+²œùì‰ìm_ò.“QdUNE&gÄõ;D†O_#αٸ¤ÎMPdÈkG³ÈHÚ%ŠQ‚•ÈæKê"+…"C^/²ÈîƒÈÖÎ? KÓªŠyÍP‘ýrÿꩽkçCDè«Td˜v‰(DöÙé½ëæOÛ¬èë‰"C^#Dd¿ÿrÿÚé}ëLÔµy$\Ø×3ˆÌŽÊPdˆd‘=¸vfÿúo&
îÖ¢:RØÏ3Wö¬(2äuñꟿÿøýéƒëgܰpòÇÝ[ÖàKñóB‘!¯"²OÞ8w`Ó¢)ŸôhUS(S4¿3‘¡=¢ÙŸ/~}xãüÁÍ‹§íÙº–X6¨@ÞÜÎD†ÎQˆr^½""ûéfò¡-K¾×¦ŽTE†¼^¨Èž=ºuáðÖ¥Ó>‹oW×ZÌß;wG"C{2DDd/Ÿ=ºrdÛ÷3Fôn_¯By¿wžYí}Q†ödˆd‘=¾}ñèöå_ìÛ¡~ŰâŠíÉ•P‘ýöøÎÅc;V̕бA%™‘¡=¢–W¯þ‘=¹{éøÎ•³F÷‹jXI_" -3´'C´¡RdhO†¨GƒÈОQ‡z‘¡=¢u"³$+¡=¢m"Cç(DDf@‘!ªPaµh“¬„"C¡Â3âm¨fÄ!*Qaµ˜!#n
fÄ!ÊPaµˆqˆ6TX-bF¢
åV‹˜‡hD¹Õ"fÄ!QnµˆqˆF”[-bF¢åV‹˜‡hD¹Õ"fÄ!QnµˆqˆF”[-bF¢åV‹˜‡hD¹Õ"fÄ!Qnµ˜šqˆ*”[-Z%+aF¢‹Õ⥻V:¶Z¤"£ÛÜ[eÄÈp¸Dœ -J3¼ÞhâtœÉ¤gD$œUäôÓ8ÁH‚!ïbõ„ÈÁ†‡kä½(pý4V‚ðXJ9½(käõ“ -“à“L+… YP½ÕUÄÙ¿q©c…ÍŒÁ¶Oèe¿Oˆ³Û'Ä)î’ìö qjú;½{œýÞ=Îî•¥VƒžáyøtøzRŽÊ®Þ -•£'j¦ÇÒ^¼ HëK¾ÒÅÓkàœ\a¶Lc -p
F“Q®#ŠæÓBG&‰F¹þ8É$š?Ÿ%‚Ïx˜þC¢ÂC1šÌ‡¡5ØÈÈN äpdg¹ciÝ+6F×-!:¦Gl|"ëÊRÍ™dÙÉò“ÿŒì… ò Ðirz'HDrÈàÄ#f¼žÖ½RËr‚¤ƒº‡Ð¡ïÍ´´‘%‡7ê
¤â#»h?u¤ÚSÓÒ–Ú¢g–cd¤yjo€¶ÄðFRPä¡G^p‰v¯"'˜¨Vpk;/äv]&cHßŲpN‰57dèf}F³>à¨É ™Û'Xî-銣)ãaÛ¶È2“yÚ›&>ݸÆd×…ŒŒo¢‘#•ËÃM§µ}‘¶qžÎ’ào æVä'0¼¥ÑCwh`+ôÊÐp 岜”±=Y7³Zk€‘!µ^ìÕ -]†dâD‘|€< ×3Iæ––Êáx9HXOÈC*9£
4èFÈèjçTƒÌ—C®T4 -ôJa(gaJ!ßWÍy‘F3(|©9¸z>–)òé`…#õ,,SÈe³0£È˜o„ÛÂ@g7È¢öצGƒÛË -æ‹g²ŽÂuÑ ’ -†Ë‚¥<OÁ,€¬ËaYr¢óNÒûð©z`:ÅËG
dÐ!‘È
9/Ë*F0·\Aâä¢ ²h(àÆÈêh;†HXVÖ/ÐàÈ—QJ-KgÒäâ ,x'OèᙜÀ EIûÚ„aY!ТµÌ³¢#Á<e£_+Ò¯(kõˆ‹`ùGdl·ñ©ßXÂ4 -£Â¨0*Œ -£Â¨0*Œ -£Â¨0*Œ -£zGB¨0*Œ -£Â¨ÞŸ¨ÞnHF…QaTFõv£z»eFõ?ÕÛ -ÌqHïlTo>0%!½á¨†ô†SÕ› LmHîL[<nÍõ^ol¯1#tk$ï9oÅŸQùmŠM’Íï•Þ³:÷î¦ïÏj½ÿ€Kù,òæ+ÙsäÌ%o‹ál§yx{O²[WÞ€#§ý
8äÀû=óúøúå/àÐ}aòz汿/œ -äöÌ›/¿¡ÂEƒŠAE -øûåËkw»¢,t÷ÈÜžÞ~ƒŠ—*]¶\hh9²‹VP`A?»»hÑ}r{úä(Z¢th8Im—Œg(_¦dP¡ü>P$ÃændëÀì¹<¼ó -*j+V©^³víZ5ªEHlXˆ.°€'Ý¡7‹u r -/߀ àò|ÅÈ:šµüðÃV-šÔ¯YÅh(S<0¿·GÎôûÒ«ðð.P¸d(Q«Q«ö»vïÞ-¶S»
ªW`Êè -™·Î’®D.Ï|ÅÊ0k5iÛ¥gߤAƒ%õý¨s›Æ5*„‡M]ÓoNv@Ìíå(o~ÛgаQcÇ=|pß®íGËÓ½†Ã¢{&æÉ›¿HpxÅ:-;÷2jÒ´™³gMŸ2vh¿®mêWfK-àÇzwb¹„w¢¥Ù*
Ûõøù³.Y¶tñüéã‡öíܼ¦‘ìÌî‘nÓls‰ 2|µ&Q½?8sÑÊõ7®[¾pƸ!=ÛÕ/èë™ËúBÒJD6ëœ0bê‚›¶ïÞ½cÓÊo¾Ñ¯sÓj\é¢ùóæN_"kŽÜy%%º$Žš¾xÝö}‡ý¸kÓ²ÙãuoUËX®˜¿wîÖ—N6Ї+/ÍA‰þ£¿^ºqÏáã'رfᔡ½ÚÕ«P¾xAŸ—÷Ã˯p0[µIçÄQ_/Û¼ïØé³§îÝ´dúȾQ
#ÂK˜/ÝZ%9=}K*7ê”ðùŒ¥›÷Ÿ8—|þäËgéß¹I†\ºu ré9=|Jè+ÖïÐû³iK6í?q>å™Ã;WÏ?0¶Y$RØ*˦zýu¡¦:mã†N]´q߉óSÎÛ½ö›ICºµ¬Á—.âç•¡zÉ¥*+Öü°ÇÇ“®ÛsìÜÅ‹çïÝðíŸ|ôaM±LÑüJÈ—^$„‹lÞuЄùkv=›r1ùľ‹¿×¦¶±\Pô7„^¹t*+i윕;Ÿ'ܼä«áñíêšBå’¡„G¾B%Â#Fõ5sùÖƒ§/\L>u`ËÒé#z·‡¢ó-fMWYYsäñ)X¼<TVŸÓ—n9p*9Jü°lÆÈ¾ëW£·0c‰ÜÞþÅB¥:m{
ÿê;Z½É§n]>sTBTÃJúâéo:½tZYÆZ{~:uц½ÇÏA‰CÛVÌݯS£}‰ -6R´”( %@Xr‰‹çAŠ‹¦~Ú³u-±¬])¦•˜#—H>¹Ów_‹kSG²/^¹DcK‰‹—.œúqË’iŽÅ[2¼²¥Ä¹‹—RNüaYæâµ-q9åÌ¡ß=²o*^g%Žž»tùâÙCÛ–Ïü<¡cƒJöän[âÊ¥³‡·¯˜5ª‘{ ¹Û”8%Î
endstream
endobj
79 0 obj
<</Length 4920>>stream
-ñŽN´/wÛ—¯B‰ ÷ÄèF¤WTRâò¹£ wsQVâüÑÐ@Ì%26G%:Ûm„o¹D’éJTQ‚¶Õ*KŒSQÂÒjWï:¦´„¥gPX"÷Y³ûXòç%Ì=\ÌÀ ó×î>ž|嚣¤OÌåé#zdóØA¬Ýsâ•kW–Èjîw¡§=õÞ®^»’|lçê¹Jо½FËî0ØnØw2åÚu(±Ëq ?`xþè“)‹6î?uñÚõ«NJÈcTíÖ=‡N]¼éÇÓ—®ßPP¢X9y\²åÀ™ËP₃d¬¥ÓŒzí{6}Ù‡Î^¹qóÚ…ãNJ,£sß‘_¿íð¹+7”€©™üT"3€Y+¶I¾zó–“–8föªÇ.\»uëz --a·
Ê%@Vé¿pJ\È´DYH¹~JÛ•I;O œ‰¬Rà×@%i=œm yÐdµ`”¸vóæÕóG §¦ýnÆ^4m’²2iûõk—ÎÂøA§26=µ|ËÍ%Oœ¿†jW._€)L°úÀø‘q4°.ÑmÐø¹+·8yþBò™#»×;uX<Ì‘Ã2Ì‘SKðÕ›Ç&™¹tÓžÃ'N<ºÿ‡•ó&~üQë:Rh†q–ð"ÓðjM£F|¹põ{<°wÛÚÅ3F'Ŷ¨AÆót3÷Ôi8S¹a‡^ŸL˜µxõ¦mÛ·m^³dΤ¡½£šTåJ¡«ƒ÷Ã7°¤¾bÝ»ö1yַ߯Z½êûE³¿™Ôu½J°I?/‘Kä(*VoÒ±çÀ§Íž¿`þìi“FŒëØ´ºHV9ž9Ó• wÿ ÒLD–ÑqICGŸ4yÒøQC“â:µ¨S‰åšw›uQî¼dµ&Vß2ª{ï¤ÁŸ|òñàþ½»ulQ¯ŠJWk†AVÁ ½±jݦm:ÅvïÙó£î1Q›Ö©"†•"+Â\Ù3Ìw³å̓ׯ®´^Œ¨Q¿I‹Û´móa‹ÆõªWÂB‚|É)ÒMdHX¹`ñ¨)ÏJÕjÔ®S·NU+‰Lh© B~Þò)Ò/m³å$ëíBA%K—7p¢d2™Œ›ùnê–5½_ÁÂAŃK—
-_õ!¶Æ¶ùÞ@§Ós¸Ïqúï& -øû,èlÓÚÔï?r“ï?¼½é¤Žw •¿cÉ&Ç’'‚/Y¬¿ÇÉ‘CáÞ€æ/–,›*Úè-Ã÷Q -wíz¶`R³-ŠÒ½Pˆ©¥Hœ”eã`–3{ˆÒ= Œ|ØÄò²‡/ñŠ4©¨ÀéMº ñN¥^Û&Ž—ÊûÈ»@k{rØhq§æŸÝÎ'®ÂPÎNIV>ÊNw¿xg¯€˜/¿
XsոͦR¶#6ˆ›JÁÖ¦Òê-©6•‚å/e6•Fm*ßïίoÞ©ßv½ƒ¿|í¿¸t16wÄãblîI[`o&*U½±”ö†Czg£rØ[ éÊq`•¨ÞbHïlT™†Q)Œê‡„QaTïOTÿ–n£Â¨0*ŒêßÕ[éÝŒêßrû0*Œ -£Â¨0*Œ -£Â¨0*Œ -£Â¨0*Œ -£Â¨0*Œêê†QaTF…QaTÕ»F…Q½á¨Þb`ï`TŽCzg£z+ý{£zÃ)é
öF¥*¤7˜†¨Ü›æÜ˜‹!¹#¶×Òë -Ïñhï
£$Ô·Å{ÄÛ0<øÀÊvAÝ»•³Ø@dMu5»A8(j5ššSdK5œÈìýðöì9räÌ™‹’3'qµ0{Zdæ4š=GÎÜy<<=½¼¼<===ˆÏhb„a¯)=G®Ü^Þ>ù|ý -)V¼dpHHp©’Å‹
,˜?_^bJ’;Ө·_@‘âÁeˇ3,Ë2áåË…”,VØ®9)=…Ùi´\8oªT¥jµªU*UÙ0‹9i¯ê!™'¯_@±0¾bµÚõ5iÚ¤qƒ:5*›ØòÁÅ -å·ñc1»Äø
«Ônܲ]TtçÎÚ·nÞ f„¨)à›7OÎl}CóäÍX¢¼Pµ^‹±=ûôKLìß½sÛfu«Úó•¡Ayø,V†\·e§ž‰C†õùˆ¡ƒúöˆjQ·2_®x!ßôÞ54(/ßÀ’a¦šÍ;õ8bü”i3f|5yì°¤žQÍkU.R okT‹¥'5ýhàç_Ì\°xÉ’EógL1 G»FUù2ňjºÄ>ª ®œ±f‹˜~Ÿ}1gɪõ›6®[±hÖ¤á ]ZÔ”2z“f±XNê+ÖkÛóã ³–¬Ûºkïž[V/š1vP6u+êKJçMj± -fª4îÔwė߮پÿȱc‡öþ°rþCã;4°q3Mµvâ"›Ç$õý–}ÇΜ;wêð®õ‹§èÕ¨ŠÁN j¢$ÖlÕ}5j:“rùRòÉ·,ûzT¿èƲm¨• hš›Wí6=?òíâJvýÚ¥3‡¶-Ÿ5:ÑÚh4KZåÊn^uÛÅÿjÉæg.߸e6œ“çÈè9ivóÒÉ^›3–m=tîê;·¯%ÙA,ª¢ÙÚ`É·£xX¥û~>sùö#É×ïܽs=Α‰E•Åÿ+BöÿÚqôÂõ;÷îÀ9¶SÄŽ
l=I b—ѨSâ˜Ù+wK¹qJœ?¼5ãEZÂìÖÌœU»Ž“·¯ž;´eÉWÃ{µ#•+æŸ×ÚÜÑÚ‚¯ÿXâFK\9{`ów_íÙº¶1£åd{¼5»O\¼q÷î+g~ܸhŠ]‡U+³».ÔìîÄÅ›PâòéýNþØžufFW²='I‰›—Ní[ÿͤÁÝZTÏhÏ™ÑìnÝÞ“—h‰“{×-˜8¨ksbè ²ÊöŸôbO3»[¿ï”¹ÄžµÓÐô6£6fwûO_¾%.ž€©Æ¤¶Îgf³Tbv÷ã™+r‰ÝkæÐ…”°uW“ÝkkQ³»ÍÎ^½}Ï\b\R[»TK‰rR6qþZ²å๫wä«çŽ£«¶n²M,iŸM[úáó×îܿ稄¹A•¯P¯}oÒ<'_¿k)A¼ë2)‘jG›GºvTÖÔ•0j&i7î=¸wËQ +C½Ñ³Vî8–róÞƒû·.9,Aý‡Iƒ
ê¸ÒУiƒºxóþC%Òšà‰‹·œ–€e.1vÎj¥%d§MÒhwŸ¸%¨,ñà,¡ä:TÖ•úû¡íž«Ô•ZíªošÚ £vnÏ
2ó¾$³6ýÕmKå°„UŸxÅy ;ýî
g%2öíwn¤wX"ãøq‡”ÈÌÏÓÎuñ†Ã¶ã Œµwn;+A@©-kSnܾ}Ýi‰4ƒ\˜\WVÂ܉/©óVMjöÊG“ÓœL»¥FØqKÍÄû4«ÕŒLvd½qójæN¦i³>*÷éK8xæÒõëW’œ—í”0˽m¯a_~·iÿ©”«W/[ü º×ÖjýÑ'Ô/ý<ñΦ“Wb±nãîl6
%Ƥ-ºš0wÕöƒ§Î'Ÿ;±Ë²ŸÛ›X¦š††°Õšïþ¥›ö9yúäáÝõYŸ²÷©GÆ@Xp#tˆ6eÁªö<|hïÖU¾ ûdô>ýÀâÝ_¼¼©ö‡ÝŽ™±xÍ–»wm]·tÖøÁ=Z×1…ê -zÛ”HÝ¡Sï¡g-^¹nã†5ËæO™C¼O‹Ù±¼‡K÷+\*œx™&Ÿøõ‚ÅK—,šûÕØ{ulLvF(7wúYÈÆùtå„jÚuO:vÊô™3§OûiBì‡u+…—*œaSˆ´]!JéM5š´ïÖwððQcÇŽþlHB÷ö«C‹Ê°_Cš3i±Ò† -5·éüQŸþè×+¶}³Ú•˜ÒAVj¤k/ÃTˆ¬ß¼m§˜nݺvéØºIíÊ|h‰ÀüyÓW•Å™Ôç@`ñ2ábDz›·¢{nԈ‚‹Ìç™ÞûôƒÔõ9ч2ÆJU«×ª]«fd„D–Î~tœ¡„Å™”l’ºyV–,Ïaa#«"Þ¾þ…ŠêJ†È”„”Ô ð³]Ï›ã¢ßeЯ&‹Èf¦E°ï}úAš3)ùú#Ÿoþ²™©ìeJ¾—°9…Å™4»¼›53õñööòLõ>µ÷EŽ|ZˆlãAÜLéw2™[“¦w3Í™ö½ã¯—Ìn¦Ùd}·d](ÍÌÔ‰÷iºBZÌLߎó)Åö§¬$è
¬‰#Ö½hxjÊŠ’^bYr˜1éNb¨÷'+òzx-óPVo0Yy§ÈQïO£g#GÍCY‰Ó&)ƒy(+ôÄÿ2ŒáLzÉg³€*÷ÓwõÞ
óSYvœ\©C,#ÀµHÄÉU€WF¯F/™âËôÉh¢# ŽZ›êÕÀéxÉËBMðTááGoÔ…q’^^WŠr<Ô¸‡ê…y8g0è9Ñç$½‘s}CKêÛ`‚Ü >Pb¨ƒ>šáh0Vw>B$÷ÀæfÉâfõF“H.Ð"`’Ž5 -zÖ$˜yV¶ªeE#¼“3ɇM‚(èÈ!N¨+.«E“IþLNÀ²¬\iœ•fõNTg€Wô3%Ñ+bõ,ÇÀ;F=ÏIPiFrPcÔ©¨FtªëB*M€£õØ•àr8‹‰îȹ ’I,<océõñ$|O®Žç¡Æx>Ö "ß~1BPÑ:eàΓ‚&r«à¦P+dÖ¤—]kAÈ,µeåÌ‘jON2{[„CÞ@„“ÞCØÀ™?Q]–Ú62:b,¦?$ÇÈÙ¼ÓVµä3#;ËjoÝ+6F×-!:¦Gl|¢ŽËÒ~Í$÷wr¿'ÿÙ
Ê„ i#zÑÄ5€%Ѩ“ÄÞ€±Ü^K{¥æI'9£˜yi¸ -‰ƒÎÄ(ò¢.²‹Õ¹:RcÄÙWÙ¹#UŸ›(É ‹‡ž¹+í"#ùGcÃÿHïŸn(䬆BžáÞò&"@QÏ1¢<QàEb“NÈ‹0Žó¼®å¨Q°9lûä0k}6Ë^Y“=2¦"Ðá@–wó&¦-“ŒŽgò!$n£@TEÞ -ñ±¢|µÐ? ЖAã,Ç“C"©!£ÎNUUÏ<’LnC¦C -rûáY¸"^dá"ŒÔ‰‘ŒO¶ÅáÂyè’èdÂXæ]ZO©âä‚Àè餈'Ctpï]r(%MÈÎHIñС™ó0Ã’ca^ “`¸ãd%o0Ò‚)'Á<´:ÝÁa:¿0F!¦wòpjuæ—ù -\2œVh·Ë<.™ƒuƒäB3ay²‘¬D¡{1±t¡¢‡q¦G¤ë2±d›#Y‘+3ÁJW€ârC‘Œ˜n‰,C¿X$+?r›ò&ê‰.OŒdê‹wsCÑxòH5'gá¶ðt<ƒE9”g¤÷µ8–Ž’Ö’ñ»ç´5%O5€·›¿{o=(6!,Ì+8¸It·Ø Ñ=âb¼ºõ‹NŠÕEÇÇ÷NŒNŒí?ðbû%öNˆÕõëÞ{ -0000000016 00000 n
-0000000144 00000 n
-0000044293 00000 n
-0000000000 00000 f
-0000122924 00000 n
-0000270588 00000 n
-0000044344 00000 n
-0000044851 00000 n
-0000047150 00000 n
-0000123337 00000 n
-0000052618 00000 n
-0000123110 00000 n
-0000123224 00000 n
-0000120651 00000 n
-0000120794 00000 n
-0000120937 00000 n
-0000121080 00000 n
-0000121223 00000 n
-0000121366 00000 n
-0000048770 00000 n
-0000049060 00000 n
-0000049355 00000 n
-0000047211 00000 n
-0000270553 00000 n
-0000048209 00000 n
-0000048257 00000 n
-0000064648 00000 n
-0000050071 00000 n
-0000093545 00000 n
-0000064711 00000 n
-0000058513 00000 n
-0000061516 00000 n
-0000058576 00000 n
-0000049650 00000 n
-0000055355 00000 n
-0000049713 00000 n
-0000050114 00000 n
-0000052653 00000 n
-0000052707 00000 n
-0000055469 00000 n
-0000055532 00000 n
-0000055562 00000 n
-0000055824 00000 n
-0000058401 00000 n
-0000055897 00000 n
-0000058926 00000 n
-0000061630 00000 n
-0000061693 00000 n
-0000061723 00000 n
-0000061985 00000 n
-0000062058 00000 n
-0000066976 00000 n
-0000093659 00000 n
-0000093722 00000 n
-0000093752 00000 n
-0000094009 00000 n
-0000094082 00000 n
-0000121509 00000 n
-0000122705 00000 n
-0000122389 00000 n
-0000122180 00000 n
-0000121970 00000 n
-0000121757 00000 n
-0000121544 00000 n
-0000121639 00000 n
-0000121852 00000 n
-0000122065 00000 n
-0000122275 00000 n
-0000122506 00000 n
-0000122615 00000 n
-0000122800 00000 n
-0000122994 00000 n
-0000123025 00000 n
-0000123411 00000 n
-0000123629 00000 n
-0000124612 00000 n
-0000134406 00000 n
-0000199994 00000 n
-0000265582 00000 n
-0000270611 00000 n
-trailer
<</Size 81/Root 1 0 R/Info 80 0 R/ID[<52D8D36F9F0F4093A63E37ACF2897B45><5FF1FD3406B84938948F332CEEC035D6>]>>
startxref
270795
%%EOF
\ No newline at end of file diff --git a/docs/image_sources/training/volley/volley-request.graffle b/docs/image_sources/training/volley/volley-request.graffle new file mode 100644 index 0000000..1d79b3d --- /dev/null +++ b/docs/image_sources/training/volley/volley-request.graffle @@ -0,0 +1,2259 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>ActiveLayerIndex</key> + <integer>0</integer> + <key>ApplicationVersion</key> + <array> + <string>com.omnigroup.OmniGrafflePro</string> + <string>139.18.0.187838</string> + </array> + <key>AutoAdjust</key> + <true/> + <key>BackgroundGraphic</key> + <dict> + <key>Bounds</key> + <string>{{0, 0}, {576, 733}}</string> + <key>Class</key> + <string>SolidGraphic</string> + <key>ID</key> + <integer>2</integer> + <key>Style</key> + <dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + </dict> + <key>BaseZoom</key> + <integer>0</integer> + <key>CanvasOrigin</key> + <string>{0, 0}</string> + <key>ColumnAlign</key> + <integer>1</integer> + <key>ColumnSpacing</key> + <real>36</real> + <key>CreationDate</key> + <string>2014-03-24 22:38:51 +0000</string> + <key>Creator</key> + <string>Katie McCormick</string> + <key>DisplayScale</key> + <string>1 0/72 in = 1 0/72 in</string> + <key>GraphDocumentVersion</key> + <integer>8</integer> + <key>GraphicsList</key> + <array> + <dict> + <key>Bounds</key> + <string>{{68.798424333456921, 309.90064645900816}, {70.999998092651367, 24}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>Vertical</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>1990</integer> + <key>Rotation</key> + <real>88.863800048828125</real> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Align</key> + <integer>0</integer> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 + +\f0\fs24 \cf0 cache miss}</string> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{164.31081962585449, 233}, {59, 24}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>1989</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Align</key> + <integer>0</integer> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 + +\f0\fs24 \cf0 cache hit}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Bounds</key> + <string>{{109, 567.5}, {72, 24}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FitText</key> + <string>YES</string> + <key>Flow</key> + <string>Resize</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Helvetica</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>1987</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Align</key> + <integer>0</integer> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 + +\f0\fs24 \cf0 round-robin}</string> + </dict> + <key>Wrap</key> + <string>NO</string> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>209</integer> + </dict> + <key>ID</key> + <integer>1986</integer> + <key>Points</key> + <array> + <string>{362.483096786499, 520.41741752624512}</string> + <string>{439.59458923339844, 165.16970062255859}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>213</integer> + <key>Info</key> + <integer>7</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>209</integer> + </dict> + <key>ID</key> + <integer>1985</integer> + <key>Points</key> + <array> + <string>{362.483096786499, 461.33483529090881}</string> + <string>{439.59458923339844, 165.16970062255859}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>204</integer> + <key>Info</key> + <integer>7</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>209</integer> + </dict> + <key>ID</key> + <integer>1984</integer> + <key>Points</key> + <array> + <string>{362.48308152770994, 402.2522608306885}</string> + <string>{439.59458923339844, 165.16970062255859}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>203</integer> + <key>Info</key> + <integer>7</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>209</integer> + </dict> + <key>ID</key> + <integer>1983</integer> + <key>Points</key> + <array> + <string>{294.65540856933592, 227.99996948242188}</string> + <string>{381.3049268594778, 164.77353614247437}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>210</integer> + <key>Info</key> + <integer>6</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>4</integer> + <key>Info</key> + <integer>6</integer> + </dict> + <key>ID</key> + <integer>1982</integer> + <key>Points</key> + <array> + <string>{94.216227905273399, 165.16970062255859}</string> + <string>{92.966230102539043, 227.99999237060547}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>157</integer> + <key>Info</key> + <integer>5</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>213</integer> + <key>Info</key> + <integer>9</integer> + </dict> + <key>ID</key> + <integer>1980</integer> + <key>Points</key> + <array> + <string>{179.26087951660151, 462.43391850741568}</string> + <string>{224.48312730407713, 514.92974541704564}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>1973</integer> + <key>Info</key> + <integer>3</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>204</integer> + <key>Info</key> + <integer>8</integer> + </dict> + <key>ID</key> + <integer>1979</integer> + <key>Points</key> + <array> + <string>{179.76073189455099, 462.42177007636207}</string> + <string>{224.48312730407716, 461.33483529090881}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>1973</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>203</integer> + <key>Info</key> + <integer>8</integer> + </dict> + <key>ID</key> + <integer>1978</integer> + <key>Points</key> + <array> + <string>{179.26087951660151, 462.43391850741568}</string> + <string>{224.48311204528804, 402.2522608306885}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>1973</integer> + <key>Info</key> + <integer>3</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>1973</integer> + </dict> + <key>ID</key> + <integer>1975</integer> + <key>Points</key> + <array> + <string>{92.966230102539043, 286.16969299316406}</string> + <string>{92.966239929199205, 356.41910654608148}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>4</integer> + <key>Info</key> + <integer>5</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>LineGraphic</string> + <key>Head</key> + <dict> + <key>ID</key> + <integer>210</integer> + <key>Info</key> + <integer>8</integer> + </dict> + <key>ID</key> + <integer>1974</integer> + <key>Points</key> + <array> + <string>{150.81081933593748, 257.08484268188477}</string> + <string>{236.81081933593748, 257.08481979370117}</string> + </array> + <key>Style</key> + <dict> + <key>stroke</key> + <dict> + <key>HeadArrow</key> + <string>FilledArrow</string> + <key>Legacy</key> + <true/> + <key>TailArrow</key> + <string>0</string> + </dict> + </dict> + <key>Tail</key> + <dict> + <key>ID</key> + <integer>4</integer> + <key>Info</key> + <integer>7</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{391, 540.66744232177734}, {137.99996948242188, 23.499996185302734}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>214</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.49144199999999999, 0.26006299999999999}</string> + <string>{0.50711799999999996, -0.22408600000000001}</string> + <string>{0.50711799999999996, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27977999999999997, -0.47847800000000001}</string> + <string>{0.29393799999999998, 0.54304399999999997}</string> + <string>{-0.28623199999999999, 0.55380399999999996}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.2</string> + <key>g</key> + <string>0.733333</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0.328823</string> + <key>g</key> + <string>0.328823</string> + <key>r</key> + <string>0.328823</string> + </dict> + <key>Fuzziness</key> + <real>1.5349206924438477</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.131021</string> + <key>g</key> + <string>0.363196</string> + <key>r</key> + <string>0.725948</string> + </dict> + <key>CornerRadius</key> + <real>2</real> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 network threads}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{224.48312730407713, 508.66741943359375}, {137.99996948242188, 23.499996185302734}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>213</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.49144199999999999, 0.26006299999999999}</string> + <string>{0.50711799999999996, -0.22408600000000001}</string> + <string>{0.50711799999999996, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27977999999999997, -0.47847800000000001}</string> + <string>{0.29393799999999998, 0.54304399999999997}</string> + <string>{-0.28623199999999999, 0.55380399999999996}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.2</string> + <key>g</key> + <string>0.733333</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0.328823</string> + <key>g</key> + <string>0.328823</string> + <key>r</key> + <string>0.328823</string> + </dict> + <key>Fuzziness</key> + <real>1.5349206924438477</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.131021</string> + <key>g</key> + <string>0.363196</string> + <key>r</key> + <string>0.725948</string> + </dict> + <key>CornerRadius</key> + <real>2</real> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 HTTP...}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{23.966230102539043, 498}, {137.99998474121094, 58.169700622558594}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>212</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.49144199999999999, 0.26006299999999999}</string> + <string>{0.50711799999999996, -0.22408600000000001}</string> + <string>{0.50711799999999996, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27977999999999997, -0.47847800000000001}</string> + <string>{0.29393799999999998, 0.54304399999999997}</string> + <string>{-0.28623199999999999, 0.55380399999999996}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.2</string> + <key>g</key> + <string>0.733333</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0.328823</string> + <key>g</key> + <string>0.328823</string> + <key>r</key> + <string>0.328823</string> + </dict> + <key>Fuzziness</key> + <real>1.5349206924438477</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.131021</string> + <key>g</key> + <string>0.363196</string> + <key>r</key> + <string>0.725948</string> + </dict> + <key>CornerRadius</key> + <real>2</real> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 Request dequeued by NetworkDispatcher}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{23.966245361328106, 432.24999237060547}, {137.99998474121094, 58.169700622558594}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>211</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.49144199999999999, 0.26006299999999999}</string> + <string>{0.50711799999999996, -0.22408600000000001}</string> + <string>{0.50711799999999996, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27977999999999997, -0.47847800000000001}</string> + <string>{0.29393799999999998, 0.54304399999999997}</string> + <string>{-0.28623199999999999, 0.55380399999999996}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.2</string> + <key>g</key> + <string>0.733333</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0.328823</string> + <key>g</key> + <string>0.328823</string> + <key>r</key> + <string>0.328823</string> + </dict> + <key>Fuzziness</key> + <real>1.5349206924438477</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.131021</string> + <key>g</key> + <string>0.363196</string> + <key>r</key> + <string>0.725948</string> + </dict> + <key>CornerRadius</key> + <real>2</real> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 Request dequeued by NetworkDispatcher}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{236.81081933593748, 227.99996948242188}, {115.68917846679688, 58.169700622558594}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>10</real> + </dict> + <key>ID</key> + <integer>210</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.49144199999999999, 0.26006299999999999}</string> + <string>{0.50711799999999996, -0.22408600000000001}</string> + <string>{0.50711799999999996, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27977999999999997, -0.47847800000000001}</string> + <string>{0.29393799999999998, 0.54304399999999997}</string> + <string>{-0.28623199999999999, 0.55380399999999996}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0.8</string> + <key>r</key> + <string>0.6</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0.328823</string> + <key>g</key> + <string>0.328823</string> + <key>r</key> + <string>0.328823</string> + </dict> + <key>Fuzziness</key> + <real>1.5349206924438477</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0.6</string> + <key>r</key> + <string>0.4</string> + </dict> + <key>CornerRadius</key> + <real>2</real> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 Request read from cache and parsed}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{380.5, 107}, {118.18917846679688, 58.169700622558594}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>209</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.49144199999999999, 0.26006299999999999}</string> + <string>{0.50711799999999996, -0.22408600000000001}</string> + <string>{0.50711799999999996, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27977999999999997, -0.47847800000000001}</string> + <string>{0.29393799999999998, 0.54304399999999997}</string> + <string>{-0.28623199999999999, 0.55380399999999996}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.898039</string> + <key>g</key> + <string>0.709804</string> + <key>r</key> + <string>0.2</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0.328823</string> + <key>g</key> + <string>0.328823</string> + <key>r</key> + <string>0.328823</string> + </dict> + <key>Fuzziness</key> + <real>1.5349206924438477</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.93512</string> + <key>g</key> + <string>0.472602</string> + <key>r</key> + <string>0.333854</string> + </dict> + <key>CornerRadius</key> + <real>2</real> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 Parsed response delivered on main thread}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{391, 508.66740417480469}, {137.99996948242188, 23.499996185302734}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>10</real> + </dict> + <key>ID</key> + <integer>207</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.49144199999999999, 0.26006299999999999}</string> + <string>{0.50711799999999996, -0.22408600000000001}</string> + <string>{0.50711799999999996, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27977999999999997, -0.47847800000000001}</string> + <string>{0.29393799999999998, 0.54304399999999997}</string> + <string>{-0.28623199999999999, 0.55380399999999996}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0.8</string> + <key>r</key> + <string>0.6</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0.328823</string> + <key>g</key> + <string>0.328823</string> + <key>r</key> + <string>0.328823</string> + </dict> + <key>Fuzziness</key> + <real>1.5349206924438477</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0.6</string> + <key>r</key> + <string>0.4</string> + </dict> + <key>CornerRadius</key> + <real>2</real> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 cache thread}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{391, 476.6673583984375}, {137.99996948242188, 23.499980926513672}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>206</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.49144199999999999, 0.26006299999999999}</string> + <string>{0.50711799999999996, -0.22408600000000001}</string> + <string>{0.50711799999999996, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27977999999999997, -0.47847800000000001}</string> + <string>{0.29393799999999998, 0.54304399999999997}</string> + <string>{-0.28623199999999999, 0.55380399999999996}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.898039</string> + <key>g</key> + <string>0.709804</string> + <key>r</key> + <string>0.2</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0.328823</string> + <key>g</key> + <string>0.328823</string> + <key>r</key> + <string>0.328823</string> + </dict> + <key>Fuzziness</key> + <real>1.5349206924438477</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.93512</string> + <key>g</key> + <string>0.472602</string> + <key>r</key> + <string>0.333854</string> + </dict> + <key>CornerRadius</key> + <real>2</real> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 main thread}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{224.48312730407713, 421.74998497962952}, {137.99996948242188, 79.169700622558594}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>204</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.49144199999999999, 0.26006299999999999}</string> + <string>{0.50711799999999996, -0.22408600000000001}</string> + <string>{0.50711799999999996, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27977999999999997, -0.47847800000000001}</string> + <string>{0.29393799999999998, 0.54304399999999997}</string> + <string>{-0.28623199999999999, 0.55380399999999996}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.2</string> + <key>g</key> + <string>0.733333</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0.328823</string> + <key>g</key> + <string>0.328823</string> + <key>r</key> + <string>0.328823</string> + </dict> + <key>Fuzziness</key> + <real>1.5349206924438477</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.131021</string> + <key>g</key> + <string>0.363196</string> + <key>r</key> + <string>0.725948</string> + </dict> + <key>CornerRadius</key> + <real>2</real> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 HTTP transaction, response parse, cache write (if applicable)}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{224.48311204528807, 390.50226273803713}, {137.99996948242188, 23.499996185302734}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>203</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.49144199999999999, 0.26006299999999999}</string> + <string>{0.50711799999999996, -0.22408600000000001}</string> + <string>{0.50711799999999996, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27977999999999997, -0.47847800000000001}</string> + <string>{0.29393799999999998, 0.54304399999999997}</string> + <string>{-0.28623199999999999, 0.55380399999999996}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.2</string> + <key>g</key> + <string>0.733333</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0.328823</string> + <key>g</key> + <string>0.328823</string> + <key>r</key> + <string>0.328823</string> + </dict> + <key>Fuzziness</key> + <real>1.5349206924438477</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.131021</string> + <key>g</key> + <string>0.363196</string> + <key>r</key> + <string>0.725948</string> + </dict> + <key>CornerRadius</key> + <real>2</real> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 HTTP...}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{23.966245361328106, 366.5}, {137.99998474121094, 58.169700622558594}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>200</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.49144199999999999, 0.26006299999999999}</string> + <string>{0.50711799999999996, -0.22408600000000001}</string> + <string>{0.50711799999999996, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27977999999999997, -0.47847800000000001}</string> + <string>{0.29393799999999998, 0.54304399999999997}</string> + <string>{-0.28623199999999999, 0.55380399999999996}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.2</string> + <key>g</key> + <string>0.733333</string> + <key>r</key> + <string>1</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0.328823</string> + <key>g</key> + <string>0.328823</string> + <key>r</key> + <string>0.328823</string> + </dict> + <key>Fuzziness</key> + <real>1.5349206924438477</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.131021</string> + <key>g</key> + <string>0.363196</string> + <key>r</key> + <string>0.725948</string> + </dict> + <key>CornerRadius</key> + <real>2</real> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 Request dequeued by NetworkDispatcher}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{35.121640869140606, 227.99999237060547}, {115.68917846679688, 58.169700622558594}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>10</real> + </dict> + <key>ID</key> + <integer>4</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.49144199999999999, 0.26006299999999999}</string> + <string>{0.50711799999999996, -0.22408600000000001}</string> + <string>{0.50711799999999996, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27977999999999997, -0.47847800000000001}</string> + <string>{0.29393799999999998, 0.54304399999999997}</string> + <string>{-0.28623199999999999, 0.55380399999999996}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0.8</string> + <key>r</key> + <string>0.6</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0.328823</string> + <key>g</key> + <string>0.328823</string> + <key>r</key> + <string>0.328823</string> + </dict> + <key>Fuzziness</key> + <real>1.5349206924438477</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0.6</string> + <key>r</key> + <string>0.4</string> + </dict> + <key>CornerRadius</key> + <real>2</real> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 Request dequeued by CacheDispatcher}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{35.121638671874962, 107}, {118.18917846679688, 58.169700622558594}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>157</integer> + <key>Magnets</key> + <array> + <string>{1, 1}</string> + <string>{1, -1}</string> + <string>{-1, -1}</string> + <string>{-1, 1}</string> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + <string>{-0.5, -0.233518}</string> + <string>{-0.49144199999999999, 0.26006299999999999}</string> + <string>{0.50711799999999996, -0.22408600000000001}</string> + <string>{0.50711799999999996, 0.267179}</string> + <string>{-0.27431, -0.474028}</string> + <string>{0.27977999999999997, -0.47847800000000001}</string> + <string>{0.29393799999999998, 0.54304399999999997}</string> + <string>{-0.28623199999999999, 0.55380399999999996}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.898039</string> + <key>g</key> + <string>0.709804</string> + <key>r</key> + <string>0.2</string> + </dict> + </dict> + <key>shadow</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.35</string> + <key>b</key> + <string>0.328823</string> + <key>g</key> + <string>0.328823</string> + <key>r</key> + <string>0.328823</string> + </dict> + <key>Fuzziness</key> + <real>1.5349206924438477</real> + <key>ShadowVector</key> + <string>{0, 1}</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.93512</string> + <key>g</key> + <string>0.472602</string> + <key>r</key> + <string>0.333854</string> + </dict> + <key>CornerRadius</key> + <real>2</real> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 +\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc + +\f0\b\fs24 \cf0 Request added to queue in priority order}</string> + <key>VerticalPad</key> + <integer>0</integer> + </dict> + </dict> + <dict> + <key>Class</key> + <string>Group</string> + <key>Graphics</key> + <array> + <dict> + <key>Bounds</key> + <string>{{20.00199264625337, 331.00000000000006}, {145.92853034472586, 25.419100784950434}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.65</string> + <key>b</key> + <string>0</string> + <key>g</key> + <string>0</string> + <key>r</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-Condensed</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>1972</integer> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + </dict> + <key>Text</key> + <dict> + <key>Pad</key> + <integer>2</integer> + </dict> + </dict> + <dict> + <key>Bounds</key> + <string>{{6.671600341796875, 356.41910654608148}, {172.58927917480466, 212.02962392266838}}</string> + <key>Class</key> + <string>ShapedGraphic</string> + <key>FontInfo</key> + <dict> + <key>Color</key> + <dict> + <key>a</key> + <string>0.65</string> + <key>w</key> + <string>0</string> + </dict> + <key>Font</key> + <string>Roboto-BoldCondensed</string> + <key>Size</key> + <real>12</real> + </dict> + <key>ID</key> + <integer>1973</integer> + <key>Magnets</key> + <array> + <string>{0, 1}</string> + <string>{0, -1}</string> + <string>{1, 0}</string> + <string>{-1, 0}</string> + </array> + <key>Shape</key> + <string>Rectangle</string> + <key>Style</key> + <dict> + <key>fill</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>shadow</key> + <dict> + <key>Draws</key> + <string>NO</string> + </dict> + <key>stroke</key> + <dict> + <key>Color</key> + <dict> + <key>b</key> + <string>0.578326</string> + <key>g</key> + <string>0.578615</string> + <key>r</key> + <string>0.578453</string> + </dict> + <key>CornerRadius</key> + <real>5</real> + <key>Pattern</key> + <integer>1</integer> + </dict> + </dict> + <key>Text</key> + <dict> + <key>VerticalPad</key> + <integer>10</integer> + </dict> + <key>TextPlacement</key> + <integer>0</integer> + </dict> + </array> + <key>ID</key> + <integer>1971</integer> + </dict> + </array> + <key>GridInfo</key> + <dict/> + <key>GuidesLocked</key> + <string>NO</string> + <key>GuidesVisible</key> + <string>YES</string> + <key>HPages</key> + <integer>1</integer> + <key>ImageCounter</key> + <integer>1</integer> + <key>KeepToScale</key> + <false/> + <key>Layers</key> + <array> + <dict> + <key>Lock</key> + <string>NO</string> + <key>Name</key> + <string>Layer 1</string> + <key>Print</key> + <string>YES</string> + <key>View</key> + <string>YES</string> + </dict> + </array> + <key>LayoutInfo</key> + <dict> + <key>Animate</key> + <string>NO</string> + <key>circoMinDist</key> + <real>18</real> + <key>circoSeparation</key> + <real>0.0</real> + <key>layoutEngine</key> + <string>dot</string> + <key>neatoSeparation</key> + <real>0.0</real> + <key>twopiSeparation</key> + <real>0.0</real> + </dict> + <key>LinksVisible</key> + <string>NO</string> + <key>MagnetsVisible</key> + <string>NO</string> + <key>MasterSheets</key> + <array/> + <key>ModificationDate</key> + <string>2014-03-24 23:38:43 +0000</string> + <key>Modifier</key> + <string>Katie McCormick</string> + <key>NotesVisible</key> + <string>NO</string> + <key>Orientation</key> + <integer>2</integer> + <key>OriginVisible</key> + <string>NO</string> + <key>PageBreaks</key> + <string>YES</string> + <key>PrintInfo</key> + <dict> + <key>NSBottomMargin</key> + <array> + <string>float</string> + <string>41</string> + </array> + <key>NSHorizonalPagination</key> + <array> + <string>coded</string> + <string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG</string> + </array> + <key>NSLeftMargin</key> + <array> + <string>float</string> + <string>18</string> + </array> + <key>NSPaperSize</key> + <array> + <string>size</string> + <string>{612, 792}</string> + </array> + <key>NSPrintReverseOrientation</key> + <array> + <string>int</string> + <string>0</string> + </array> + <key>NSRightMargin</key> + <array> + <string>float</string> + <string>18</string> + </array> + <key>NSTopMargin</key> + <array> + <string>float</string> + <string>18</string> + </array> + </dict> + <key>PrintOnePage</key> + <false/> + <key>ReadOnly</key> + <string>NO</string> + <key>RowAlign</key> + <integer>1</integer> + <key>RowSpacing</key> + <real>36</real> + <key>SheetTitle</key> + <string>Canvas 1</string> + <key>SmartAlignmentGuidesActive</key> + <string>YES</string> + <key>SmartDistanceGuidesActive</key> + <string>YES</string> + <key>UniqueID</key> + <integer>1</integer> + <key>UseEntirePage</key> + <false/> + <key>VPages</key> + <integer>1</integer> + <key>WindowInfo</key> + <dict> + <key>CurrentSheet</key> + <integer>0</integer> + <key>ExpandedCanvases</key> + <array> + <dict> + <key>name</key> + <string>Canvas 1</string> + </dict> + </array> + <key>Frame</key> + <string>{{159, 135}, {899, 874}}</string> + <key>ListView</key> + <true/> + <key>OutlineWidth</key> + <integer>142</integer> + <key>RightSidebar</key> + <false/> + <key>ShowRuler</key> + <true/> + <key>Sidebar</key> + <true/> + <key>SidebarWidth</key> + <integer>120</integer> + <key>VisibleRegion</key> + <string>{{-94, -1}, {764, 735}}</string> + <key>Zoom</key> + <real>1</real> + <key>ZoomValues</key> + <array> + <array> + <string>Canvas 1</string> + <real>1</real> + <real>1</real> + </array> + </array> + </dict> +</dict> +</plist> |