blob: 3d12b49d82285b8846015d1377c02b4a53ba0f29 [file] [log] [blame]
Roman Nurike577d722010-04-16 15:57:34 -07001var ANDROID_TAGS = {
2 type: {
3 'article': 'Article',
4 'tutorial': 'Tutorial',
5 'sample': 'Sample',
6 'video': 'Video',
7 'library': 'Code Library'
8 },
9 topic: {
10 'accessibility': 'Accessibility',
11 'accountsync': 'Accounts & Sync',
12 'bestpractice': 'Best Practices',
13 'communication': 'Communication',
14 'compatibility': 'Compatibility',
15 'data': 'Data Access',
16 'drawing': 'Canvas Drawing',
17 'gamedev': 'Game Development',
18 'gl': 'OpenGL ES',
19 'input': 'Input Methods',
20 'intent': 'Intents',
21 'layout': 'Layouts/Views',
22 'media': 'Multimedia',
23 'newfeature': 'New Features',
24 'performance': 'Performance',
25 'search': 'Search',
26 'testing': 'Testing',
27 'ui': 'User Interface',
28 'web': 'Web Content'
29 },
30 misc: {
31 'external': 'External',
32 'new': 'New'
33 }
34};
35
36var ANDROID_RESOURCES = [
37
38//////////////////////////
39/// TECHNICAL ARTICLES ///
40//////////////////////////
41
42 {
43 tags: ['article', 'performance', 'bestpractice'],
44 path: 'articles/avoiding-memory-leaks.html',
45 title: {
46 en: 'Avoiding Memory Leaks'
47 },
48 description: {
49 en: 'Mobile devices often have limited memory, and memory leaks can cause your application to waste this valuable resource without your knowledge. This article provides tips to help you avoid common causes of memory leaks on the Android platform.'
50 }
51 },
52 {
53 tags: ['article', 'compatibility'],
54 path: 'articles/backward-compatibility.html',
55 title: {
56 en: 'Backward Compatibility'
57 },
58 description: {
59 en: 'The Android platform strives to ensure backwards compatibility. However, sometimes you want to use new features which aren\'t supported on older platforms. This article discusses strategies for selectively using these features based on availability, allowing you to keep your applications portable across a wide range of devices.'
60 }
61 },
62 {
63 tags: ['article', 'intent'],
64 path: 'articles/can-i-use-this-intent.html',
65 title: {
66 en: 'Can I Use this Intent?'
67 },
68 description: {
69 en: 'Android offers a very powerful and yet easy-to-use message type called an intent. You can use intents to turn applications into high-level libraries and make code modular and reusable. While it is nice to be able to make use of a loosely coupled API, there is no guarantee that the intent you send will be received by another application. This article describes a technique you can use to find out whether the system contains any application capable of responding to the intent you want to use.'
70 }
71 },
72 {
73 tags: ['article', 'input'],
74 path: 'articles/creating-input-method.html',
75 title: {
76 en: 'Creating an Input Method'
77 },
78 description: {
79 en: 'Input Method Editors (IMEs) provide the mechanism for entering text into text fields and other Views. Android devices come bundled with at least one IME, but users can install additional IMEs. This article covers the basics of developing an IME for the Android platform.'
80 }
81 },
82 {
83 tags: ['article', 'drawing', 'ui'],
84 path: 'articles/drawable-mutations.html',
85 title: {
86 en: 'Drawable Mutations'
87 },
88 description: {
89 en: 'Drawables are pluggable drawing containers that allow applications to display graphics. This article explains some common pitfalls when trying to modify the properties of multiple Drawables.'
90 }
91 },
92 {
93 tags: ['article', 'bestpractice', 'ui'],
94 path: 'articles/faster-screen-orientation-change.html',
95 title: {
96 en: 'Faster Screen Orientation Change'
97 },
98 description: {
99 en: 'When an Android device changes its orientation, the default behavior is to automatically restart the current activity with a new configuration. However, this can become a bottleneck in applications that access a large amount of external data. This article discusses how to gracefully handle this situation without resorting to manually processing configuration changes.'
100 }
101 },
102 {
103 tags: ['article', 'compatibility'],
104 path: 'articles/future-proofing.html',
105 title: {
106 en: 'Future-Proofing Your Apps'
107 },
108 description: {
109 en: 'A collection of common sense advice to help you ensure that your applications don\'t break when new versions of the Android platform are released.'
110 }
111 },
112 {
113 tags: ['article', 'input'],
114 path: 'articles/gestures.html',
115 title: {
116 en: 'Gestures'
117 },
118 description: {
119 en: 'Touch screens allow users to perform gestures, such as tapping, dragging, flinging, or sliding, to perform various actions. The gestures API enables your application to recognize even complicated gestures with ease. This article explains how to integrate this API into an application.'
120 }
121 },
122 {
123 tags: ['article', 'gamedev', 'gl'],
124 path: 'articles/glsurfaceview.html',
125 title: {
126 en: 'Introducing GLSurfaceView'
127 },
128 description: {
129 en: 'This article provides an overview of GLSurfaceView, a class that makes it easy to implement 2D or 3D OpenGL rendering inside of an Android application.'
130 }
131 },
132 {
133 tags: ['article', 'ui', 'layout'],
134 path: 'articles/layout-tricks-reuse.html',
135 title: {
136 en: 'Layout Tricks: Creating Reusable UI Components'
137 },
138 description: {
139 en: 'Learn how to combine multiple standard UI widgets into a single high-level component, which can be reused throughout your application.'
140 }
141 },
142 {
143 tags: ['article', 'layout', 'ui', 'performance', 'bestpractice'],
144 path: 'articles/layout-tricks-efficiency.html',
145 title: {
146 en: 'Layout Tricks: Creating Efficient Layouts'
147 },
148 description: {
149 en: 'Learn how to optimize application layouts as this article walks you through converting a LinearLayout into a RelativeLayout, and analyzes the resulting implications on performance.'
150 }
151 },
152 {
153 tags: ['article', 'layout', 'ui', 'performance', 'bestpractice'],
154 path: 'articles/layout-tricks-stubs.html',
155 title: {
156 en: 'Layout Tricks: Using ViewStubs'
157 },
158 description: {
159 en: 'Learn about using ViewStubs inside an application\'s layout in order to inflate rarely used UI elements, without the performance implications which would otherwise be caused by using the <code>&lt;include&gt;</code> tag.'
160 }
161 },
162 {
163 tags: ['article', 'layout', 'ui', 'performance', 'bestpractice'],
164 path: 'articles/layout-tricks-merge.html',
165 title: {
166 en: 'Layout Tricks: Merging Layouts'
167 },
168 description: {
169 en: 'Learn how to use the <code>&lt;merge&gt;</code> tag in your XML layouts in order to avoid unnecessary levels of hierarchy within an application\'s view tree.'
170 }
171 },
172 {
173 tags: ['article', 'ui', 'performance'],
174 path: 'articles/listview-backgrounds.html',
175 title: {
176 en: 'ListView Backgrounds: An Optimization'
177 },
178 description: {
179 en: 'ListViews are very popular widgets within the Android framework. This article describes some of the optimizations used by the ListView widget, and how to avoid some common issues that this causes when trying to use a custom background.'
180 }
181 },
182 {
Roman Nurika35f6562011-02-04 14:28:22 -0800183 tags: ['article', 'ui'],
Roman Nurike577d722010-04-16 15:57:34 -0700184 path: 'articles/live-folders.html',
185 title: {
186 en: 'Live Folders'
187 },
188 description: {
189 en: 'Live Folders allow users to display any source of data on their home screen without launching an application. This article discusses how to export an application\'s data in a format suitable for display inside of a live folder.'
190 }
191 },
192 {
Roman Nurika35f6562011-02-04 14:28:22 -0800193 tags: ['article', 'ui'],
Roman Nurike577d722010-04-16 15:57:34 -0700194 path: 'articles/live-wallpapers.html',
195 title: {
196 en: 'Live Wallpapers'
197 },
198 description: {
199 en: 'Live wallpapers are richer, animated, interactive backgrounds that users can display in their home screens. Learn how to create a live wallpaper and bundle it in an application that users can install on their devices.'
200 }
201 },
202 {
203 tags: ['article', 'input'],
204 path: 'articles/on-screen-inputs.html',
205 title: {
206 en: 'Onscreen Input Methods'
207 },
208 description: {
209 en: 'The Input Method Framework (IMF) allows users to take advantage of on-screen input methods, such as software keyboards. This article provides an overview of Input Method Editors (IMEs) and how applications interact with them.'
210 }
211 },
212 {
213 tags: ['article', 'performance', 'bestpractice'],
214 path: 'articles/painless-threading.html',
215 title: {
216 en: 'Painless Threading'
217 },
218 description: {
219 en: 'This article discusses the threading model used by Android applications and how applications can ensure best UI performance by spawning worker threads to handle long-running operations, rather than handling them in the main thread. The article also explains the API that your application can use to interact with Android UI toolkit components running on the main thread and spawn managed worker threads.'
220 }
221 },
222 {
223 tags: ['article', 'ui', 'search'],
224 path: 'articles/qsb.html',
225 title: {
226 en: 'Quick Search Box'
227 },
228 description: {
229 en: 'Quick Search Box (QSB) is a powerful, system-wide search framework. QSB makes it possible for users to quickly and easily find what they\'re looking for, both on their devices and on the web. This article discusses how to work with the QSB framework to add new search results for an installed application.'
230 }
231 },
232 {
233 tags: ['article', 'ui'],
234 path: 'articles/touch-mode.html',
235 title: {
236 en: 'Touch Mode'
237 },
238 description: {
239 en: 'This article explains the touch mode, one of the most important principles of Android\'s UI toolkit. Whenever a user interacts with a device\'s touch screen, the system enters touch mode. While simple in concept, there are important implications touch mode that are often overlooked.'
240 }
241 },
242 {
243 tags: ['article', 'performance', 'bestpractice'],
244 path: 'articles/track-mem.html',
245 title: {
246 en: 'Tracking Memory Allocations'
247 },
248 description: {
249 en: 'This article discusses how to use the Allocation Tracker tool to observe memory allocations and avoid performance problems that would otherwise be caused by ignoring the effect of Dalvik\'s garbage collector.'
250 }
251 },
252 {
Roman Nurika35f6562011-02-04 14:28:22 -0800253 tags: ['article'],
Roman Nurike577d722010-04-16 15:57:34 -0700254 path: 'articles/ui-1.5.html',
255 title: {
256 en: 'UI Framework Changes in Android 1.5'
257 },
258 description: {
259 en: 'Explore the UI changes that were introduced in Android 1.5, compared with the UI provided in Android 1.0 and 1.1.'
260 }
261 },
262 {
Roman Nurika35f6562011-02-04 14:28:22 -0800263 tags: ['article'],
Roman Nurike577d722010-04-16 15:57:34 -0700264 path: 'articles/ui-1.6.html',
265 title: {
266 en: 'UI Framework Changes in Android 1.6'
267 },
268 description: {
269 en: 'Explore the UI changes that were introduced in Android 1.6, compared with the UI provided in Android 1.5. In particular, this article discusses changes to RelativeLayouts and click listeners.'
270 }
271 },
272 {
273 tags: ['article', 'ui', 'bestpractice'],
274 path: 'articles/timed-ui-updates.html',
275 title: {
276 en: 'Updating the UI from a Timer'
277 },
278 description: {
279 en: 'Learn about how to use Handlers as a more efficient replacement for java.util.Timer on the Android platform.'
280 }
281 },
282 {
283 tags: ['article', 'ui', 'accessibility'],
284 path: 'articles/tts.html',
285 title: {
286 en: 'Using Text-to-Speech'
287 },
288 description: {
289 en: 'The text-to-speech API lets your application "speak" to users, in any of several languages. This article provides an overview of the TTS API and how you use to add speech capabilities to your application.'
290 }
291 },
292 {
293 tags: ['article', 'ui', 'web'],
294 path: 'articles/using-webviews.html',
295 title: {
296 en: 'Using WebViews'
297 },
298 description: {
299 en: 'WebViews allow an application to dynamically display HTML and execute JavaScript, without relinquishing control to a separate browser application. This article introduces the WebView classes and provides a sample application that demonstrates its use.'
300 }
301 },
302 {
303 tags: ['article', 'ui'],
304 path: 'articles/wikinotes-linkify.html',
305 title: {
306 en: 'WikiNotes: Linkify your Text!'
307 },
308 description: {
309 en: 'This article introduces WikiNotes for Android, part of the Apps for Android project. It covers the use of Linkify to turn ordinary text views into richer, link-oriented content that causes Android intents to fire when a link is selected.'
310 }
311 },
312 {
313 tags: ['article', 'intent'],
314 path: 'articles/wikinotes-intents.html',
315 title: {
316 en: 'WikiNotes: Routing Intents'
317 },
318 description: {
319 en: 'This article illustrates how an application, in this case the WikiNotes sample app, can use intents to route various types of linked text to the application that handles that type of data. For example, an app can use intents to route a linked telephone number to a dialer app and a web URL to a browser.'
320 }
321 },
322 {
323 tags: ['article', 'ui', 'performance'],
324 path: 'articles/window-bg-speed.html',
325 title: {
326 en: 'Window Backgrounds & UI Speed'
327 },
328 description: {
329 en: 'Some Android applications need to squeeze every bit of performance out of the UI toolkit and there are many ways to do so. In this article, you will discover how to speed up the drawing and the perceived startup time of your activities. Both of these techniques rely on a single feature, the window\'s background drawable.'
330 }
331 },
332 {
333 tags: ['article', 'performance', 'bestpractice'],
334 path: 'articles/zipalign.html',
335 title: {
336 en: 'Zipalign: an Easy Optimization'
337 },
338 description: {
339 en: 'The Android SDK includes a tool called zipalign that optimizes the way an application is packaged. Running zipalign against your application enables Android to interact with it more efficiently at run time and thus has the potential to make it and the overall system run faster. This article provides a high-level overview of the zipalign tool and its use.'
340 }
341 },
342
343///////////////////
344/// SAMPLE CODE ///
345///////////////////
Robert Ly3f9b6442011-01-19 18:14:50 -0800346
347 {
348 tags: ['sample'],
349 path: 'samples/AccelerometerPlay/index.html',
350 title: {
351 en: 'Accelerometer Play'
352 },
353 description: {
354 en: ''
355 }
356 },
357 {
358 tags: ['sample'],
359 path: 'samples/AccessibilityService/index.html',
360 title: {
361 en: 'Accessibility Service'
362 },
363 description: {
364 en: 'Illustrates an accessibility service that provides custom feedback for the Clock application which comes by default with Android devices'
365 }
366 },
Roman Nurike577d722010-04-16 15:57:34 -0700367 {
368 tags: ['sample', 'layout', 'ui'],
369 path: 'samples/ApiDemos/index.html',
370 title: {
371 en: 'API Demos'
372 },
373 description: {
374 en: 'A variety of small applications that demonstrate an extensive collection of framework topics.'
375 }
376 },
377 {
Robert Ly3f9b6442011-01-19 18:14:50 -0800378 tags: ['sample', 'data', 'newfeature', 'accountsync'],
Roman Nurike577d722010-04-16 15:57:34 -0700379 path: 'samples/BackupRestore/index.html',
380 title: {
381 en: 'Backup and Restore'
382 },
383 description: {
384 en: 'Illustrates a few different approaches that an application developer can take when integrating with the Android Backup Manager using the BackupAgent API introduced in Android 2.2.'
385 }
386 },
387 {
388 tags: ['sample', 'communication'],
389 path: 'samples/BluetoothChat/index.html',
390 title: {
391 en: 'Bluetooth Chat'
392 },
393 description: {
394 en: 'An application for two-way text messaging over Bluetooth.'
395 }
396 },
397 {
398 tags: ['sample', 'accountsync'],
399 path: 'samples/BusinessCard/index.html',
400 title: {
401 en: 'BusinessCard'
402 },
403 description: {
404 en: 'An application that demonstrates how to launch the built-in contact picker from within an activity. This sample also uses reflection to ensure that the correct version of the contacts API is used, depending on which API level the application is running under.'
405 }
406 },
407 {
408 tags: ['sample', 'accountsync'],
409 path: 'samples/ContactManager/index.html',
410 title: {
411 en: 'Contact Manager'
412 },
413 description: {
414 en: 'An application that demonstrates how to query the system contacts provider using the <code>ContactsContract</code> API, as well as insert contacts into a specific account.'
415 }
416 },
417 {
Robert Ly3f9b6442011-01-19 18:14:50 -0800418 tags: ['sample', 'ui'],
419 path: 'samples/CubeLiveWallpaper/index.html',
420 title: {
421 en: 'Cube Live Wallpaper'
422 },
423 description: {
424 en: 'An application that demonstrates how to create a live wallpaper and bundle it in an application that users can install on their devices.'
425 }
426 },
427 {
Roman Nurike577d722010-04-16 15:57:34 -0700428 tags: ['sample'],
429 path: 'samples/Home/index.html',
430 title: {
431 en: 'Home'
432 },
433 description: {
434 en: 'A home screen replacement application.'
435 }
436 },
437 {
Roman Nurika35f6562011-02-04 14:28:22 -0800438 tags: ['sample', 'new', 'newfeature', 'ui'],
439 path: 'samples/HoneycombGallery/index.html',
Alexander Lucasd8472542011-01-19 12:15:38 -0800440 title: {
441 en: 'Honeycomb Gallery'
442 },
443 description: {
Roman Nurika35f6562011-02-04 14:28:22 -0800444 en: 'An image gallery application using APIs that are new in Android 3.0 (a.k.a. Honeycomb).'
Alexander Lucasd8472542011-01-19 12:15:38 -0800445 }
446 },
447 {
Roman Nurike577d722010-04-16 15:57:34 -0700448 tags: ['sample', 'gamedev', 'media'],
449 path: 'samples/JetBoy/index.html',
450 title: {
451 en: 'JetBoy'
452 },
453 description: {
454 en: 'A game that demonstrates the SONiVOX JET interactive music technology, with <code><a href="/reference/android/media/JetPlayer.html">JetPlayer</a></code>.'
455 }
456 },
457 {
Roman Nurike577d722010-04-16 15:57:34 -0700458 tags: ['sample', 'gamedev', 'media'],
459 path: 'samples/LunarLander/index.html',
460 title: {
461 en: 'Lunar Lander'
462 },
463 description: {
464 en: 'A classic Lunar Lander game.'
465 }
466 },
467 {
468 tags: ['sample', 'ui', 'bestpractice', 'layout'],
469 path: 'samples/MultiResolution/index.html',
470 title: {
471 en: 'Multiple Resolutions'
472 },
473 description: {
474 en: 'A sample application that shows how to use resource directory qualifiers to provide different resources for different screen configurations.'
475 }
476 },
477 {
478 tags: ['sample', 'data'],
Robert Ly3f9b6442011-01-19 18:14:50 -0800479 path: 'samples/NFCDemo/index.html',
480 title: {
481 en: 'NFC Demo'
482 },
483 description: {
484 en: 'An application for reading NFC Forum Type 2 Tags using the NFC APIs'
485 }
486 },
487 {
488 tags: ['sample', 'data'],
Roman Nurike577d722010-04-16 15:57:34 -0700489 path: 'samples/NotePad/index.html',
490 title: {
491 en: 'Note Pad'
492 },
493 description: {
494 en: 'An application for saving notes. Similar (but not identical) to the <a href="/resources/tutorials/notepad/index.html">Notepad tutorial</a>.'
495 }
496 },
497 {
498 tags: ['sample', 'accountsync'],
499 path: 'samples/SampleSyncAdapter/index.html',
500 title: {
501 en: 'SampleSyncAdapter'
502 },
503 description: {
504 en: 'Demonstrates how an application can communicate with a cloud-based service and synchronize its data with data stored locally in a content provider. The sample uses two related parts of the Android framework &mdash; the account manager and the synchronization manager (through a sync adapter).'
505 }
506 },
507 {
Scott Main183ecbc2010-11-19 10:20:45 -0800508 tags: ['sample', 'ui', 'search'],
Roman Nurike577d722010-04-16 15:57:34 -0700509 path: 'samples/SearchableDictionary/index.html',
510 title: {
511 en: 'Searchable Dictionary v2'
512 },
513 description: {
514 en: 'A sample application that demonstrates Android\'s search framework, including how to provide search suggestions for Quick Search Box.'
515 }
516 },
517 {
Robert Ly3f9b6442011-01-19 18:14:50 -0800518 tags: ['sample'],
519 path: 'samples/SipDemo/index.html',
520 title: {
521 en: 'SIP Demo'
522 },
523 description: {
524 en: 'A demo application highlighting how to make internet-based calls with the SIP API.'
525 }
526 },
527 {
Roman Nurike577d722010-04-16 15:57:34 -0700528 tags: ['sample', 'layout', 'ui'],
529 path: 'samples/Snake/index.html',
530 title: {
531 en: 'Snake'
532 },
533 description: {
534 en: 'An implementation of the classic game "Snake."'
535 }
536 },
537 {
Robert Ly3f9b6442011-01-19 18:14:50 -0800538 tags: ['sample', 'input'],
539 path: 'samples/SoftKeyboard/index.html',
540 title: {
541 en: 'Soft Keyboard'
542 },
543 description: {
544 en: 'An example of writing an input method for a software keyboard.'
545 }
546 },
547 {
Scott Main183ecbc2010-11-19 10:20:45 -0800548 tags: ['sample', 'testing'],
Roman Nurike577d722010-04-16 15:57:34 -0700549 path: 'samples/Spinner/index.html',
550 title: {
551 en: 'Spinner'
552 },
553 description: {
554 en: 'A simple application that serves as an application under test for the SpinnerTest example.'
555 }
556 },
557 {
Scott Main183ecbc2010-11-19 10:20:45 -0800558 tags: ['sample', 'testing'],
Roman Nurike577d722010-04-16 15:57:34 -0700559 path: 'samples/SpinnerTest/index.html',
560 title: {
561 en: 'SpinnerTest'
562 },
563 description: {
564 en: 'The test application for the Activity Testing tutorial. It tests the Spinner example application.'
565 }
566 },
567 {
Adam Cohenfca67c52011-02-10 18:57:45 -0800568 tags: ['sample', 'new', 'newfeature'],
569 path: 'samples/StackWidget/index.html',
570 title: {
571 en: 'StackView App Widget'
572 },
573 description: {
574 en: 'Demonstrates how to create a simple collection widget containing a StackView.'
575 }
576 },
577 {
Scott Main183ecbc2010-11-19 10:20:45 -0800578 tags: ['sample', 'newfeature'],
Roman Nurike577d722010-04-16 15:57:34 -0700579 path: 'samples/TicTacToeLib/index.html',
580 title: {
581 en: 'TicTacToeLib'
582 },
583 description: {
584 en: 'An example of an Android library project, a type of project that lets you store and manage shared code and resources in one place, then make them available to your other Android applications.'
585 }
586 },
587 {
Scott Main183ecbc2010-11-19 10:20:45 -0800588 tags: ['sample', 'newfeature',],
Roman Nurike577d722010-04-16 15:57:34 -0700589 path: 'samples/TicTacToeMain/index.html',
590 title: {
591 en: 'TicTacToeMain'
592 },
593 description: {
594 en: 'Demonstrates how an application can make use of shared code and resources stored in an Android library project.'
595 }
596 },
597 {
Roman Nurike577d722010-04-16 15:57:34 -0700598 tags: ['sample', 'ui'],
599 path: 'samples/Wiktionary/index.html',
600 title: {
601 en: 'Wiktionary'
602 },
603 description: {
604 en: 'An example of creating interactive widgets for display on the Android home screen.'
605 }
606 },
607 {
608 tags: ['sample', 'ui'],
609 path: 'samples/WiktionarySimple/index.html',
610 title: {
611 en: 'Wiktionary (Simplified)'
612 },
613 description: {
614 en: 'A simple Android home screen widgets example.'
615 }
616 },
Gilles Debunne3eb9b662010-06-23 16:53:35 -0700617 {
Robert Ly3f9b6442011-01-19 18:14:50 -0800618 tags: ['sample', 'layout'],
Gilles Debunne3eb9b662010-06-23 16:53:35 -0700619 path: 'samples/XmlAdapters/index.html',
620 title: {
621 en: 'XML Adapters'
622 },
623 description: {
624 en: 'Binding data to views using XML Adapters examples.'
625 }
626 },
Roman Nurike577d722010-04-16 15:57:34 -0700627
628/////////////////
629/// TUTORIALS ///
630/////////////////
631
632 {
633 tags: ['tutorial'],
634 path: 'tutorials/hello-world.html',
635 title: {
636 en: 'Hello World'
637 },
638 description: {
639 en: 'Beginning basic application development with the Android SDK.'
640 }
641 },
642 {
643 tags: ['tutorial', 'ui', 'layout'],
644 path: 'tutorials/views/index.html',
645 title: {
646 en: 'Hello Views'
647 },
648 description: {
649 en: 'A walk-through of the various types of layouts and views available in the Android SDK.'
650 }
651 },
652 {
653 tags: ['tutorial', 'ui', 'bestpractice'],
654 path: 'tutorials/localization/index.html',
655 title: {
656 en: 'Hello Localization'
657 },
658 description: {
659 en: 'The basics of localizing your applications for multiple languages and locales.'
660 }
661 },
662 {
663 tags: ['tutorial', 'data'],
664 path: 'tutorials/notepad/index.html',
665 title: {
666 en: 'Notepad Tutorial'
667 },
668 description: {
669 en: 'A multi-part tutorial discussing intermediate-level concepts such as data access.'
670 }
671 },
672 {
Scott Main183ecbc2010-11-19 10:20:45 -0800673 tags: ['tutorial', 'testing'],
Roman Nurike577d722010-04-16 15:57:34 -0700674 path: 'tutorials/testing/helloandroid_test.html',
675 title: {
676 en: 'Hello Testing'
677 },
678 description: {
679 en: 'A basic introduction to the Android testing framework.'
680 }
681 },
682 {
Scott Main183ecbc2010-11-19 10:20:45 -0800683 tags: ['tutorial', 'testing'],
Roman Nurike577d722010-04-16 15:57:34 -0700684 path: 'tutorials/testing/activity_test.html',
685 title: {
686 en: 'Activity Testing'
687 },
688 description: {
689 en: 'A more advanced demonstration of the Android testing framework and tools.'
690 }
691 }
692];