text: var _RESOURCES = [
        {
          "title":"UI Overview",
          "titleFriendly":"",
          "summary":"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 Suggest and Demand . Your application will have an important role to play in both of these spaces. The context…",
          "url":"wear/design/user-interface.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"wear/images/screens/bezel.png",
          "lang":"en",
          "type":""
        }, 
        {
          "title":"Design Principles of Android Wear",
          "titleFriendly":"",
          "summary":"Android wearables provide just the right information at just the right time, allowing you to be connected to the virtual world and present in the real world. Here you’ll find some guidelines for designing great user experiences on the Android Wear platform…",
          "url":"wear/design/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"wear/images/05_images.png",
          "lang":"en",
          "type":""
        }, 
        {
          "title":"ADT-1 Developer Kit",
          "titleFriendly":"",
          "summary":"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…",
          "url":"tv/adt-1/index.html",
          "group":"",
          "keywords": ["emote","e-mote","adt"],
          "tags": ["emote","e-mote","adt"],
          "image":"tv/images/android-tv-remote.png",
          "lang":"en",
          "type":""
        }, 
        {
          "title":"Regulatory Disclosures for ADT-1",
          "titleFriendly":"",
          "summary":"Disclosures for the ADT-1 device. Model: W2 FCC ID: A4R-W2 IC: 10395A-W2 U.S. Federal Communications Commission Notices To satisfy FCC and IC exposure requirements, a separation distance of at least 20 cm should be maintained between the antenna of this…",
          "url":"tv/adt-1/regulatory.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":""
        }, 
        {
          "title":"Important Safety Instructions for ADT-1",
          "titleFriendly":"",
          "summary":"Safety information for the ADT-1 device. WARNING: Read all safety information below before using this device to avoid injury. Do not install near heat sources, such as heaters and other devices. Use in a well-ventilated area and plug power adapter into…",
          "url":"tv/adt-1/safety.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":""
        }
  ];
  
  var ABOUT_RESOURCES = [
        {
          "title":"Legal Notice",
          "titleFriendly":"",
          "summary":"Android is an open platform that&#39;s freely available to you as an app developer. You can immediately download the Android SDK, develop apps, and distribute them to the world without any registration or fees. Android is developed by Google Inc. and …",
          "url":"legal.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"about"
        }, 
        {
          "title":"Android Auto",
          "titleFriendly":"",
          "summary":"Let drivers listen to and control content in your music and other audio apps. Allow drivers to hear and respond to your messaging service via the car&#39;s controls and screen. Write your apps without having to worry about vehicle-specific hardware differences…",
          "url":"auto/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/android-auto_2x.png",
          "lang":"en",
          "type":"about"
        }, 
        {
          "title":"Android Wear",
          "titleFriendly":"",
          "summary":"Small, powerful devices, worn on the body. Useful information when you need it most. Intelligent answers to spoken questions. Tools to help reach fitness goals. Your key to a multiscreen world. Before you start building, check out the Android Wear Design…",
          "url":"wear/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/android-wear_2x.png",
          "lang":"en",
          "type":"about"
        }, 
        {
          "title":"Developer Support",
          "titleFriendly":"",
          "summary":"Resources available to help you report and resolve issues while you are developing apps for Android.",
          "url":"support.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/android-support-card.png",
          "lang":"en",
          "type":"about"
        }, 
        {
          "title":"Dashboards",
          "titleFriendly":"",
          "summary":"page.metaDescription=Charts that give you an overview of device characteristics and platform versions that are active in the Android ecosystem.",
          "url":"about/dashboards/index.html",
          "group":"",
          "keywords": ["android","dashboard","platforms","versions"],
          "tags": ["ecosystem","versions","whatsnew"],
          "image":"//chart.googleapis.com/chart?chl=GL%202.0%7CGL%203.0%7CGL%203.1&chf=bg%2Cs%2C00000000&chd=t%3A63.0%2C35.0%2C2.0&chco=c4df9b%2C6fad0c&cht=p&chs=400x250",
          "lang":"en",
          "type":"about"
        }, 
        {
          "title":"Android Lollipop",
          "titleFriendly":"",
          "summary":"Welcome to Android 5.0 Lollipop—the largest and most ambitious release for Android yet! This release is packed with new features for users and thousands of new APIs for developers. It extends Android even further, from phones, tablets, and wearables, …",
          "url":"about/versions/lollipop.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/home/l-hero_2x.png",
          "lang":"en",
          "type":"about"
        }, 
        {
          "title":"Ice Cream Sandwich",
          "titleFriendly":"",
          "summary":"Welcome to Android 4.0! Android 4.0 delivers a refined, unified UI for phones and tablets and introduces innovative features for users and developers. This document provides a glimpse of the many new features and technologies that make Android 4.0 simple…",
          "url":"about/versions/android-4.0-highlights.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"sdk/images/4.0/home.png",
          "lang":"en",
          "type":"about"
        }, 
        {
          "title":"Honeycomb MR1",
          "titleFriendly":"",
          "summary":"Welcome to Android 3.1! Android 3.1 is an incremental platform release that refines many of the features introduced in Android 3.0. It builds on the same tablet-optimized UI and features offered in Android 3.0 and adds several new capabilities for users…",
          "url":"about/versions/android-3.1-highlights.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"sdk/images/3.1/home.png",
          "lang":"en",
          "type":"about"
        }, 
        {
          "title":"Gingerbread",
          "titleFriendly":"",
          "summary":"The Android 2.3 platform introduces many new and exciting features for users and developers. This document provides a glimpse at some of the new features and technologies in Android 2.3. For detailed information about the new developer APIs, see the Android…",
          "url":"about/versions/android-2.3-highlights.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"sdk/images/2.3/home-menu.png",
          "lang":"en",
          "type":"about"
        }, 
        {
          "title":"Jelly Bean",
          "titleFriendly":"",
          "summary":"Welcome to Android 4.3, a sweeter version of Jelly Bean! Android 4.3 includes performance optimizations and great new features for users and developers. This document provides a glimpse of what&#39;s new for developers. See the Android 4.3 APIs document…",
          "url":"about/versions/jelly-bean.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/jb-android-43.jpg",
          "lang":"en",
          "type":"about"
        }, 
        {
          "title":"Honeycomb",
          "titleFriendly":"",
          "summary":"Welcome to Android 3.0! The Android 3.0 platform introduces many new and exciting features for users and developers. This document provides a glimpse of some of the new features and technologies, as delivered in Android 3.0. For a more detailed look at…",
          "url":"about/versions/android-3.0-highlights.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"sdk/images/3.0/home_hero1.png",
          "lang":"en",
          "type":"about"
        }, 
        {
          "title":"Android KitKat",
          "titleFriendly":"",
          "summary":"Welcome to Android 4.4 KitKat! Android KitKat brings all of Android&#39;s most innovative, most beautiful, and most useful features to more devices everywhere. This document provides a glimpse of what&#39;s new for developers. Find out more about KitKat…",
          "url":"about/versions/kitkat.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/kk-devices.png",
          "lang":"en",
          "type":"about"
        }, 
        {
          "title":"About Android TV",
          "titleFriendly":"",
          "summary":"Bring your apps, games, and content to the biggest screen in the house.",
          "url":"tv/index.html",
          "group":"",
          "keywords": ["tv","leanback"],
          "tags": ["tv","leanback"],
          "image":"images/cards/android-tv_2x.png",
          "lang":"en",
          "type":"about"
        }
  ];
  
  var DESIGN_RESOURCES = [
        {
          "title":"Material Design for Android",
          "titleFriendly":"",
          "summary":"Material design is a comprehensive guide for visual, motion, and interaction design across platforms and devices. Android now includes support for material design apps. To use material design in your Android apps, follow the guidelines defined in the …",
          "url":"design/material/index.html",
          "group":"",
          "keywords": ["material","design"],
          "tags": ["material","design"],
          "image":"images/cards/design-material-for-android_2x.jpg",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Android devices",
          "titleFriendly":"",
          "summary":"The device-centric UI principles, overviews, and detailed guidelines described here build on the core Android Design Principles to provide more specific design guidance for different form factors.…",
          "url":"design/devices.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/android-devices_2x.jpg",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Design",
          "titleFriendly":"",
          "summary":"",
          "url":"design/index.html",
          "group":"",
          "keywords": [],
          "tags": ["beautifulapps","design","ux","patterns","holo","appquality","landing"],
          "image":"design/media/hero-material-design.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Android Design Principles",
          "titleFriendly":"",
          "summary":"These design principles were developed by and for the Android User Experience Team to keep users&#39; best interests in mind. For Android developers and designers, they continue to underlie the more detailed design guidelines for different types of devices…",
          "url":"design/get-started/principles.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/media/principles_delight.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Creative Vision",
          "titleFriendly":"",
          "summary":"Android design is shaped by three overarching goals for users that apply to apps as well as the system at large. As you work with Android, keep these goals in mind.…",
          "url":"design/get-started/creative-vision.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/design-creative-vision_2x.jpg",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Designing for Auto",
          "titleFriendly":"",
          "summary":"Building Apps for Auto Android Auto provide a standardized user interface and user interaction model that works across vehicles. As a designer, you do not need to worry about vehicle-specific hardware differences. This page describes some of the key screens…",
          "url":"design/auto/index.html",
          "group":"",
          "keywords": ["design","auto"],
          "tags": ["design","auto"],
          "image":"auto/images/ui/gearhead_overview.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Android Wear",
          "titleFriendly":"",
          "summary":"Designing apps for wearable devices 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…",
          "url":"design/wear/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"wear/images/screens/stream.gif",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"App Structure for Android Wear",
          "titleFriendly":"",
          "summary":"Users are used to tapping icons to launch apps. Android Wear is different. A typical Wear app adds a card to the stream at a contextually relevant moment. It might have a button that opens a full screen view for a fast micro interaction, but it just as…",
          "url":"design/wear/structure.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/media/wear/bridgednotifications.jpg",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Context Awareness on Android Wear",
          "titleFriendly":"",
          "summary":"Some of the most powerful user experiences with Android Wear are based on context-aware notifications and actions. By using device sensors and other contextual cues, your app can reveal information and functionality precisely when the user needs it, at…",
          "url":"design/wear/context.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/media/wear/ContextualExample.005.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Design Principles for Android Wear",
          "titleFriendly":"",
          "summary":"These design principles provide some simple heuristics about how you should plan and assess your Android Wear app design. A watch is a perfect form factor for a device that you can use while doing something else, such as cooking, eating, walking, running…",
          "url":"design/wear/principles.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/media/wear/five_seconds.gif",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Style for Android Wear",
          "titleFriendly":"",
          "summary":"Here are a number of design considerations to bear in mind that are particular to Android Wear. 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…",
          "url":"design/wear/style.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/media/wear/circle_message2.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Watch Faces for Android Wear",
          "titleFriendly":"",
          "summary":"Creating Watch Faces Android Wear supports custom watch faces with designs that can show contextually relevant information to users. Designing a watch face requires a careful blending of data and visual elements that informs users without requiring close…",
          "url":"design/wear/watchfaces.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/media/wear/Render_Next.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"UI Patterns for Android Wear",
          "titleFriendly":"",
          "summary":"Android Wear is used for micro-interactions, and so adhering to consistent design patterns that users are already accustomed to is paramount. Cards in the stream can take slightly different forms: App icons appear in a fixed position overhanging the edge…",
          "url":"design/wear/patterns.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/media/wear/Bluebird.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Creative Vision for Android Wear",
          "titleFriendly":"",
          "summary":"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: Most people are used to launching apps by clicking an…",
          "url":"design/wear/creative-vision.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/media/wear/vision_traffic.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Downloads",
          "titleFriendly":"",
          "summary":"For icons, sticker sheets, and other downloadable resources, visit the Design site or use the links below. The toolkit contains detailed specs and measurements of all of the primary Android Wear UI components. Available in PDF and Illustrator formats.…",
          "url":"design/downloads/index.html",
          "group":"",
          "keywords": ["icons","stencils","color swatches"],
          "tags": ["icons","stencils","colorswatches"],
          "image":"design/media/downloads_wear_toolkit.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Swipe Views",
          "titleFriendly":"",
          "summary":"Efficient navigation is one of the cornerstones of a well-designed app. While apps are generally built in a hierarchical fashion, there are instances where horizontal navigation can flatten vertical hierarchies and make access to related data items faster…",
          "url":"design/patterns/swipe-views.html",
          "group":"",
          "keywords": ["viewpager","navigation","tabs"],
          "tags": ["viewpager","navigation","tabs"],
          "image":"design/media/swipe_views.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Confirming &amp; Acknowledging",
          "titleFriendly":"",
          "summary":"In some situations, when a user invokes an action in your app, it&#39;s a good idea to confirm or acknowledge that action through text. Confirming is asking the user to verify that they truly want to proceed with an action they just invoked. In some cases…",
          "url":"design/patterns/confirming-acknowledging.html",
          "group":"",
          "keywords": ["dialog","toast","notification"],
          "tags": ["dialog","toast","notification"],
          "image":"design/media/confirm_ack_confirming.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Notifications in Android 4.4 and Lower",
          "titleFriendly":"",
          "summary":"The notification system allows your app to keep the user informed about events, such as new chat messages or a calendar event. Think of notifications as a news channel that alerts the user to important events as they happen or a log that chronicles events…",
          "url":"design/patterns/notifications_k.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/media/notifications_pattern_anatomy.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Navigation with Back and Up",
          "titleFriendly":"",
          "summary":"Consistent navigation is an essential component of the overall user experience. Few things frustrate users more than basic navigation that behaves in inconsistent and unexpected ways. Android 3.0 introduced significant changes to the global navigation…",
          "url":"design/patterns/navigation.html",
          "group":"",
          "keywords": ["navigation","activity","task","up navigation","back navigation"],
          "tags": ["navigation","activity","task","upnavigation","backnavigation"],
          "image":"design/media/navigation_between_siblings_gmail.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Action Bar",
          "titleFriendly":"",
          "summary":"The Action bar is an essential design element for all apps. Learn about what the action bar can do and how to use it in your apps.",
          "url":"design/patterns/actionbar.html",
          "group":"",
          "keywords": ["actionbar","navigation"],
          "tags": ["actionbar","navigation"],
          "image":"design/media/action_bar_pattern_overview.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Full Screen",
          "titleFriendly":"",
          "summary":"Some content is best experienced full screen, like videos, games, image galleries, books, and slides in a presentation. You can engage users more deeply with content in full screen by minimizing visual distraction from app controls and protecting users…",
          "url":"design/patterns/fullscreen.html",
          "group":"",
          "keywords": ["full screen","immersive","leanback"],
          "tags": ["fullscreen","immersive","leanback"],
          "image":"design/media/fullscreen_landing.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Backwards Compatibility",
          "titleFriendly":"",
          "summary":"Notes on how Android 4.x adapts UI designed for older hardware and OS versions.",
          "url":"design/patterns/compatibility.html",
          "group":"",
          "keywords": ["support"],
          "tags": ["support"],
          "image":"design/media/compatibility_virtual_nav.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Notifications",
          "titleFriendly":"",
          "summary":"Notifying the User DevBytes: Notifications in the Android L Developer Preview The notification system allows users to keep informed about relevant and timely events in your app, such as new chat messages from a friend or a calendar event. Think of notifications…",
          "url":"design/patterns/notifications.html",
          "group":"",
          "keywords": ["notifications","design","l"],
          "tags": ["notifications","design","l"],
          "image":"images/android-5.0/notifications/basic_combo.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Accessibility",
          "titleFriendly":"",
          "summary":"Design an app that's universally accessible to people with visual impairment, color deficiency, hearing loss, and limited dexterity.",
          "url":"design/patterns/accessibility.html",
          "group":"",
          "keywords": ["accessibility","navigation","input"],
          "tags": ["accessibility","navigation","input"],
          "image":"design/media/accessibility_contentdesc.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Pure Android",
          "titleFriendly":"",
          "summary":"Most developers want to distribute their apps on multiple platforms. As you plan your app for Android, keep in mind that different platforms play by different rules and conventions. Design decisions that make perfect sense on one platform will look and…",
          "url":"design/patterns/pure-android.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/design-pure-android_2x.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Buttons",
          "titleFriendly":"",
          "summary":"Some content is best experienced full screen, like videos, games, image galleries, books, and slides in a presentation. You can engage users more deeply with content in full screen by minimizing visual distraction from app controls and protecting users…",
          "url":"design/patterns/buttons.html",
          "group":"",
          "keywords": ["buttons"],
          "tags": ["buttons"],
          "image":"design/media/fullscreen_landing.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Widgets",
          "titleFriendly":"",
          "summary":"Design guide to creating widgets that are easy to use and look great.",
          "url":"design/patterns/widgets.html",
          "group":"",
          "keywords": ["appwidget","home"],
          "tags": ["appwidget","home"],
          "image":"design/media/widgets_info.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"App Structure",
          "titleFriendly":"",
          "summary":"App Structure Apps come in many varieties that address very different needs. For example: Your app&#39;s structure depends largely on the content and tasks you want to surface for your users. A typical Android app consists of top level and detail&#47;…",
          "url":"design/patterns/app-structure.html",
          "group":"",
          "keywords": ["navigation","layout","tablet"],
          "tags": ["navigation","layout","tablet"],
          "image":"design/media/app_structure_overview.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Help",
          "titleFriendly":"",
          "summary":"This page covers design patterns for making help accessible in your app and tips for creating help content for users who are eager for assistance.…",
          "url":"design/patterns/help.html",
          "group":"",
          "keywords": ["settings","preferences"],
          "tags": ["settings","preferences"],
          "image":"design/media/help_cling.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"New in Android",
          "titleFriendly":"",
          "summary":"A quick look at the new patterns and styles you can use to build beautiful Android apps… Material design is a comprehensive guide for visual, motion, and interaction design across platforms and devices. Android 5.0 provides a new theme, new widgets for…",
          "url":"design/patterns/new.html",
          "group":"",
          "keywords": ["kitkat","android 4.4"],
          "tags": ["kitkat","android4.4"],
          "image":"images/cards/design-new-in-android_2x.jpg",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Phones &amp; Tablets",
          "titleFriendly":"",
          "summary":"Android&#39;s system UI provides the framework on top of which you build your app, whether you&#39;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…",
          "url":"design/handhelds/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/media/ui_overview_home_screen.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Designing for Android TV",
          "titleFriendly":"",
          "summary":"Guidelines to help you create a great leanback experience on Android TV.",
          "url":"design/tv/index.html",
          "group":"",
          "keywords": ["tv","leanback","designguidelines"],
          "tags": ["tv","leanback","designguidelines"],
          "image":"design/tv/images/apps-games-rows.jpg",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Creative Vision for TV",
          "titleFriendly":"",
          "summary":"Users bring a specific set of expectations when watching TV, versus interacting with a phone or tablet. The Android User Experience Team has developed the following guidelines for creation of the Android TV platform and the apps that run on it. The TV…",
          "url":"design/tv/principles.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Style for TV",
          "titleFriendly":"",
          "summary":"Follow these style guidelines to create beautiful, functional apps for TV. 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…",
          "url":"design/tv/style.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/tv/images/overscan.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"UI Patterns for TV",
          "titleFriendly":"",
          "summary":"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. Users typically navigate TV devices using a directional pad (…",
          "url":"design/tv/patterns.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/tv/images/focus.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Devices and Displays",
          "titleFriendly":"",
          "summary":"Take advantage of Android's flexible layout system and create apps that gracefully scale from phones to tablets and beyond.",
          "url":"design/style/devices-displays.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/media/devices_displays_main.png",
          "lang":"en",
          "type":"design"
        }, 
        {
          "title":"Style",
          "titleFriendly":"",
          "summary":"Build visually compelling apps that look great on any device.…",
          "url":"design/style/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/media/design_elements_landing.png",
          "lang":"en",
          "type":"design"
        }
  ];
  
  var DISTRIBUTE_RESOURCES = [
        {
          "title":"Developer Stories",
          "titleFriendly":"",
          "summary":"Android developers, their apps, and their successes with Android and Google Play.",
          "url":"distribute/stories/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Developer Stories: The Opportunity of Android Tablets",
          "titleFriendly":"",
          "summary":"More&quot; and more, developers are investing in a full tablet experience for their apps and are seeing those investments pay off big. The increased screen area on tablets opens up a world of possibilities, allowing for more engagement with the user —…",
          "url":"distribute/stories/tablets.html",
          "group":"",
          "keywords": [],
          "tags": ["googleplay","developerstory","journal","tablets","pure"],
          "image":"images/distribute/rememberthemilk.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Developer Stories: Google Play Game Services",
          "titleFriendly":"",
          "summary":"How game studios are using Google Play game services to deliver new gaming experiences for their users.",
          "url":"distribute/stories/games.html",
          "group":"",
          "keywords": [],
          "tags": ["googleplay","story","stories","games","global"],
          "image":"images/distribute/glu-ew-gpgames.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Developer Stories: Localization in Google Play",
          "titleFriendly":"",
          "summary":"Hear from Android developers who have successfully used the Google Play App Translation Service.",
          "url":"distribute/stories/localization.html",
          "group":"",
          "keywords": ["stories","video","case study"],
          "tags": ["googleplay","developerstory","localization","global"],
          "image":"images/distribute/zombie-ragdoll-n5-land.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Distribute Your Apps",
          "titleFriendly":"",
          "summary":"The most visited store in the world for Android apps. Cloud-connected and always synced, it's never been easier for users to find and download your apps.",
          "url":"distribute/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"TV App Quality",
          "titleFriendly":"",
          "summary":"TV is a growing segment of Android devices that requires specific attention to app design and functionality in order to create a great experience.",
          "url":"distribute/essentials/quality/tv.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"distribute/images/gp-tv-quality.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Wear App Quality",
          "titleFriendly":"",
          "summary":"Wearables are smaller devices that are built for glanceability and require unique apps to provide just the right information at the the right time.",
          "url":"distribute/essentials/quality/wear.html",
          "group":"",
          "keywords": ["wear","wearables","quality","guidelines"],
          "tags": ["wear","wearables","quality","guidelines"],
          "image":"distribute/images/gp-wear-quality.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Tablet App Quality",
          "titleFriendly":"",
          "summary":"Tablets are a fast-growing part of the Android installed base that offers new opportunities for your apps.",
          "url":"distribute/essentials/quality/tablets.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"distribute/images/tablet-guidelines-color.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Core App Quality",
          "titleFriendly":"",
          "summary":"App quality directly influences the long-term success of your app—in terms of installs, user rating and reviews, engagement, and user retention.",
          "url":"distribute/essentials/quality/core.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"distribute/images/core-quality-guidelines.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Auto App Quality",
          "titleFriendly":"",
          "summary":"Auto apps integrate with the vehicle's input controls and display and minimize driver distraction to create a great experience.",
          "url":"distribute/essentials/quality/auto.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"distribute/images/gp-auto-quality.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Essentials for a Successful App",
          "titleFriendly":"",
          "summary":"A focus on quality should be part of your entire app delivery process: from initial concept through app and UI design, coding and testing and onto a process of monitoring feedback and making improvement after launch.…",
          "url":"distribute/essentials/index.html",
          "group":"",
          "keywords": ["guidelines","tablet","quality"],
          "tags": ["landing","quality"],
          "image":"",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Optimize Your App",
          "titleFriendly":"",
          "summary":"A look at how to get the most visibility and the highest ratings possible for your app or game. Optimizing the quality of your apps is a key strategy.",
          "url":"distribute/essentials/optimizing-your-app.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"distribute/images/gp-optimize-card.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Cross-Sell with House Ads",
          "titleFriendly":"",
          "summary":"Tap into your existing user base to increase downloads and increase conversions.",
          "url":"distribute/users/house-ads.html",
          "group":"",
          "keywords": ["google","identity","signin"],
          "tags": ["google","identity","signin"],
          "image":"distribute/images/advertising.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Create a Great Listing",
          "titleFriendly":"",
          "summary":"Make your listing page compelling and integrate it into your marketing campaigns.",
          "url":"distribute/users/your-listing.html",
          "group":"",
          "keywords": ["listing","google play","users","growth"],
          "tags": ["listing","googleplay","users","growth"],
          "image":"distribute/images/create-listing.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Promote Your App with Ads",
          "titleFriendly":"",
          "summary":"Promote your app with AdWords to find new users at the right moment.",
          "url":"distribute/users/promote-with-ads.html",
          "group":"",
          "keywords": ["users","ads","adwords"],
          "tags": ["users","ads","adwords"],
          "image":"images/cards/adwords_2x.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Build Community",
          "titleFriendly":"",
          "summary":"Build a loyal following with great support and communication.",
          "url":"distribute/users/build-community.html",
          "group":"",
          "keywords": ["users","growth","community"],
          "tags": ["users","growth","community"],
          "image":"images/cards/card-build-community_16-9_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Get Users",
          "titleFriendly":"",
          "summary":"You’ve published your app, now how do you acquire users? Every app and game is different, but there are some common themes from successful Google Play developers. These best practices are critical to your app or game’s success.…",
          "url":"distribute/users/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Smarter App Invites",
          "titleFriendly":"",
          "summary":"Tap into your existing user base to increase downloads and increase conversions.",
          "url":"distribute/users/app-invites.html",
          "group":"",
          "keywords": ["google","identity","signin"],
          "tags": ["google","identity","signin"],
          "image":"images/cards/card-app-invites_16-9_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Expand Into New Markets",
          "titleFriendly":"",
          "summary":"Tap fast-growing markets in Japan, Korea, India, Brazil, and many other countries around the world.",
          "url":"distribute/users/expand-to-new-markets.html",
          "group":"",
          "keywords": ["users","growth","global"],
          "tags": ["users","growth","global"],
          "image":"distribute/images/expand-into-new-markets.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Drive installs from Google Search",
          "titleFriendly":"",
          "summary":"Surface the content of your apps in Google Search and link it to app installs.",
          "url":"distribute/users/appindexing.html",
          "group":"",
          "keywords": ["app indexing","search","get users"],
          "tags": ["getusers","search","appindexing"],
          "image":"images/cards/google-search_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Drive installs from YouTube",
          "titleFriendly":"",
          "summary":"Bring users from videos to your store listing with a merchandise card available on YouTube.",
          "url":"distribute/users/youtube.html",
          "group":"",
          "keywords": ["users","youtube","cards","videos"],
          "tags": ["users","youtube","cards","videos"],
          "image":"images/cards/card-instals-from-youtube_16-9_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Know Your User",
          "titleFriendly":"",
          "summary":"It\'s essential to understand your users and listen to their input. Here are some ideas.",
          "url":"distribute/users/know-your-user.html",
          "group":"",
          "keywords": ["users","growth","global"],
          "tags": ["users","growth","global"],
          "image":"distribute/images/know-your-user.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Offer Over-the-air Installs",
          "titleFriendly":"",
          "summary":"Let users send your app directly to their devices when they sign in with Google.",
          "url":"distribute/users/ota-installs.html",
          "group":"",
          "keywords": ["google","identity","installs"],
          "tags": ["google","identity","installs"],
          "image":"images/cards/google-sign-in_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Build Buzz",
          "titleFriendly":"",
          "summary":"Generate interest and demand for your app. Here are some ways to help users find, download, and install your apps.",
          "url":"distribute/users/build-buzz.html",
          "group":"",
          "keywords": ["users","growth","promotion"],
          "tags": ["users","growth","promotion"],
          "image":"distribute/images/build-buzz.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Understand User Behavior",
          "titleFriendly":"",
          "summary":"Use Google Analytics to learn what your users like and what keeps them coming back.",
          "url":"distribute/engage/analytics.html",
          "group":"",
          "keywords": ["analytics","user behavior"],
          "tags": ["analytics","userbehavior"],
          "image":"images/gp-analytics.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Integrate Google Cloud Messaging",
          "titleFriendly":"",
          "summary":"Keep your users in sync with your latest content by delivering lightweight messages over Google's infrastructure.",
          "url":"distribute/engage/gcm.html",
          "group":"",
          "keywords": ["gcm"],
          "tags": ["gcm"],
          "image":"images/cards/card-google-cloud-messaging_16-9_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Engage Your Community",
          "titleFriendly":"",
          "summary":"Building a community has many benefits, including improving your app and bringing users back to it.",
          "url":"distribute/engage/community.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/gp-engage-9.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Add Quick and Secure Google Sign-in",
          "titleFriendly":"",
          "summary":"Increase conversion rates while helping users minimize typing by letting users sign in with Google+.",
          "url":"distribute/engage/easy-signin.html",
          "group":"",
          "keywords": ["google","identity","signin"],
          "tags": ["google","identity","signin"],
          "image":"images/cards/google-sign-in_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Engage & Retain Users",
          "titleFriendly":"",
          "summary":"Engaging and retaining active users are the keys to success. Here are some resources to help you build an active user base.",
          "url":"distribute/engage/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Delight Users with Videos",
          "titleFriendly":"",
          "summary":"Videos are one of the most effective ways to get users excited about your apps. ",
          "url":"distribute/engage/video.html",
          "group":"",
          "keywords": ["engagement"],
          "tags": ["engagement"],
          "image":"images/gp-engage-smule.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Increase Usage with Android Intents",
          "titleFriendly":"",
          "summary":"Use Android Intents to make your app available to users as they perform tasks in other apps. ",
          "url":"distribute/engage/intents.html",
          "group":"",
          "keywords": ["engagement","intents"],
          "tags": ["engagement","intents"],
          "image":"images/distribute/engage-intents.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Encourage Competition",
          "titleFriendly":"",
          "summary":" Bring out the competitor in your users with cloud save, multiplayer game play, and more.",
          "url":"distribute/engage/game-services.html",
          "group":"",
          "keywords": ["games"],
          "tags": ["games"],
          "image":"images/google/gps-play_games_logo.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Increase Usage with Search",
          "titleFriendly":"",
          "summary":"Use search to bring your existing users back into your app.",
          "url":"distribute/engage/deep-linking.html",
          "group":"",
          "keywords": ["engagement","app indexing","search","deep linking"],
          "tags": ["engagement","appindexing","search","deeplinking"],
          "image":"images/cards/google-search_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Drive engagement with AdWords Ads",
          "titleFriendly":"",
          "summary":"Keep users coming back. AdWords offers re-engagement tools to help your app stay top of mind with users.",
          "url":"distribute/engage/ads.html",
          "group":"",
          "keywords": ["engagement","adwords"],
          "tags": ["engagement","adwords"],
          "image":"images/cards/adwords_2x.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Use Rich Notifications to Keep Users Informed",
          "titleFriendly":"",
          "summary":"Use Android's notifications to keep users in touch with your content and services &mdash; even when the app is not in use.",
          "url":"distribute/engage/notifications.html",
          "group":"",
          "keywords": [""],
          "tags": [""],
          "image":"design/media/notifications_pattern_anatomy.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Update Your Apps Regularly",
          "titleFriendly":"",
          "summary":"Keeping your content fresh gives users a reason to come back.",
          "url":"distribute/engage/app-updates.html",
          "group":"",
          "keywords": ["updates"],
          "tags": ["updates"],
          "image":"images/gp-your-user-0.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Build Useful Widgets",
          "titleFriendly":"",
          "summary":"Use home screen widgets to remind users about important information in your apps and games, even when your apps are closed.",
          "url":"distribute/engage/widgets.html",
          "group":"",
          "keywords": [""],
          "tags": [""],
          "image":"images/gp-engage-0.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Launch Checklist",
          "titleFriendly":"",
          "summary":"Essential overview of the complete process of delivering your app to users. Read this checklist early in development to help you plan for a successful launch on Google Play.",
          "url":"distribute/tools/launch-checklist.html",
          "group":"",
          "keywords": ["launch","publishing","google play"],
          "tags": ["localizing","publishing","disttools"],
          "image":"distribute/images/launch-checklist.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Tools &amp; Reference",
          "titleFriendly":"",
          "summary":"Here you’ll find resources to help you publish your apps and games, acquire users, and monetize your investment.…",
          "url":"distribute/tools/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Localization Checklist",
          "titleFriendly":"",
          "summary":"Take advantage of the worldwide audience offered by Android and Google Play. Read this checklist to get an overview of how to deliver your product to markets around the world.",
          "url":"distribute/tools/localization-checklist.html",
          "group":"",
          "keywords": ["local","l10n","translation","language"],
          "tags": ["localizing","publishing","disttools"],
          "image":"distribute/images/localization-checklist.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Brand Guidelines",
          "titleFriendly":"",
          "summary":"Guidelines and downloads for the Android and Google Play brands.",
          "url":"distribute/tools/promote/brand.html",
          "group":"",
          "keywords": ["brand","bugdroid","assets"],
          "tags": ["brand","bugdroid","assets"],
          "image":"assets/images/resource-card-default-android.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Device Art Generator",
          "titleFriendly":"",
          "summary":"Drag and drop screenshots of your app into device artwork, for better looking promotional images and improved visual context.",
          "url":"distribute/tools/promote/device-art.html",
          "group":"",
          "keywords": ["device","deviceart","nexus","assets"],
          "tags": ["disttools","promoting","deviceart","marketing"],
          "image":"images/device-art-ex-crop.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Linking to Your Products",
          "titleFriendly":"",
          "summary":"Learn how to build links that take users to your published apps in Google Play from browse or search.",
          "url":"distribute/tools/promote/linking.html",
          "group":"",
          "keywords": ["linking"],
          "tags": ["promoting"],
          "image":"images/gp-linking-ex-crop.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Google Play Badge Generator",
          "titleFriendly":"",
          "summary":"Build badges for your app in just a few clicks, or download hi-res badge assets localized for a variety of languages.",
          "url":"distribute/tools/promote/badges.html",
          "group":"",
          "keywords": ["badge","google play"],
          "tags": ["disttools","promoting","deviceart","marketing","googleplay"],
          "image":"images/gp-badges-set.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Alternative Distribution Options",
          "titleFriendly":"",
          "summary":"With Android you can distribute apps to users in any way you want, using any store or distribution approach.",
          "url":"distribute/tools/open-distribution.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"distribute/images/alt-distribution.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Understand the Value of Your Users",
          "titleFriendly":"",
          "summary":"Understand what makes users come back to your app and improve retention.",
          "url":"distribute/analyze/understand-user-value.html",
          "group":"",
          "keywords": ["analytics","user behavior"],
          "tags": ["analytics","userbehavior"],
          "image":"distribute/analyze/images/active_users.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Analyze",
          "titleFriendly":"",
          "summary":"Understanding what your users do inside your app is the key to engaging and monetizing them.",
          "url":"distribute/analyze/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/analytics-mobile_2x.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Act Across Google Services",
          "titleFriendly":"",
          "summary":"Find your Analytics reports where you need them within Google Play, AdMob, and AdWords.",
          "url":"distribute/analyze/google-services.html",
          "group":"",
          "keywords": ["analytics","user behavior"],
          "tags": ["analytics","userbehavior"],
          "image":"distribute/analyze/images/admob_integration.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Get Started with Analytics",
          "titleFriendly":"",
          "summary":"Unlock the power of Analytics by choosing the implementation that works best for your app.",
          "url":"distribute/analyze/start.html",
          "group":"",
          "keywords": ["analytics","user behavior"],
          "tags": ["analytics","userbehavior"],
          "image":"images/cards/card-analytics_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Improve Your Marketing ROI",
          "titleFriendly":"",
          "summary":"Combine the power of Analytics with other data sources to understand the performance of each of your marketing channels.",
          "url":"distribute/analyze/improve-roi.html",
          "group":"",
          "keywords": ["analytics","user behavior"],
          "tags": ["analytics","userbehavior"],
          "image":"distribute/analyze/images/adwords_reporting.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Measure What Matters",
          "titleFriendly":"",
          "summary":"Customize Analytics to meet your business needs and get meaningful data on your app's performance.",
          "url":"distribute/analyze/measure.html",
          "group":"",
          "keywords": ["analytics","user behavior"],
          "tags": ["analytics","userbehavior"],
          "image":"distribute/analyze/images/realtime.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Build Better Apps",
          "titleFriendly":"",
          "summary":"Get actionable insights to optimize your app and learn what works best for your business.",
          "url":"distribute/analyze/build-better-apps.html",
          "group":"",
          "keywords": ["analytics","user behavior"],
          "tags": ["analytics","userbehavior"],
          "image":"distribute/analyze/images/flows.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Monetize with Subscriptions",
          "titleFriendly":"",
          "summary":"Sell subscriptions to your products to create continuing revenue streams.",
          "url":"distribute/monetize/subscriptions.html",
          "group":"",
          "keywords": ["in-app","iap","monetizing","free","trials"],
          "tags": ["in-app","iap","monetizing","free","trials"],
          "image":"images/cards/card-monetize_subscriptions_16-9_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Monetize Premium Apps",
          "titleFriendly":"",
          "summary":"Charging users to download your apps is a simple, convenient monetization model.",
          "url":"distribute/monetize/premium.html",
          "group":"",
          "keywords": ["monetizing","paid"],
          "tags": ["monetizing","paid"],
          "image":"images/cards/card-monetize-premium_16-9_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Earn",
          "titleFriendly":"",
          "summary":"There are many ways to make money with your apps on Google Play, and we offer a variety of tools to make it easy. Take advantage of Google Play’s phenomenal growth by using one or more of the business models available. To get started, set up your Merchant…",
          "url":"distribute/monetize/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Convenient, Frictionless Purchasing",
          "titleFriendly":"",
          "summary":"Users can purchase instantly with a choice of payment methods.",
          "url":"distribute/monetize/payments.html",
          "group":"",
          "keywords": ["google play","payments","gift card"],
          "tags": ["googleplay","payments","giftcard"],
          "image":"images/cards/card-frictionless-purchasing_16-9_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Earn Revenue from AdMob Ads",
          "titleFriendly":"",
          "summary":"Gain insights about your users, drive more in-app purchases, and maximize your ad revenue.",
          "url":"distribute/monetize/ads.html",
          "group":"",
          "keywords": ["monetizing","ads","admob","ads"],
          "tags": ["monetizing","ads","admob","ads"],
          "image":"distribute/images/advertising.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Monetize Freemium Apps",
          "titleFriendly":"",
          "summary":"Use Google Play In-app Billing and other tools to monetize your free apps.",
          "url":"distribute/monetize/freemium.html",
          "group":"",
          "keywords": ["in-app","billing","iap","monetizing"],
          "tags": ["in-app","billing","iap","monetizing"],
          "image":"images/cards/card-monetize-freemium_16-9_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"E-commerce",
          "titleFriendly":"",
          "summary":"With Android Pay, you&#39;ve the added flexibility of selling physical goods and services, such as clothing or movie tickets, through your apps using the Android Pay API (US Only) . You can use this option where your app is the store-front for retail …",
          "url":"distribute/monetize/ecommerce.html",
          "group":"",
          "keywords": ["monetizing","physical goods","payments","androidpay"],
          "tags": ["monetizing","physicalgoods","payments","androidpay"],
          "image":"images/cards/card-ecommerce_16-9_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"The Google Play Opportunity",
          "titleFriendly":"",
          "summary":"Billions of downloads a month and growing. Get your apps in front of users at Google's scale.",
          "url":"distribute/googleplay/about.html",
          "group":"",
          "keywords": ["play","apps","distributing","publishing"],
          "tags": ["visibility","growth","distributing"],
          "image":"images/cards/google-play_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Distribute to Android TV",
          "titleFriendly":"",
          "summary":"Distribute your apps, games, and content to Android TV.",
          "url":"distribute/googleplay/tv.html",
          "group":"",
          "keywords": ["tv","publish","googleplay"],
          "tags": ["tv","publish","quality"],
          "image":"design/tv/images/atv-home.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Google Play for Education",
          "titleFriendly":"",
          "summary":"Distribute your educational app directly to educators and schools.",
          "url":"distribute/googleplay/edu/about.html",
          "group":"",
          "keywords": ["education"],
          "tags": ["gpfe","googleplay","distribution","edu"],
          "image":"distribute/images/about-play-education.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Publish Education Apps",
          "titleFriendly":"",
          "summary":"Join Google Play for Education in just a few simple steps.",
          "url":"distribute/googleplay/edu/start.html",
          "group":"",
          "keywords": ["education","addendum"],
          "tags": ["education","guidelines","quality"],
          "image":"distribute/images/play-education.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Video Resources",
          "titleFriendly":"",
          "summary":"Watch video resources from Google and successful educational developers.",
          "url":"distribute/googleplay/edu/videos.html",
          "group":"",
          "keywords": ["education"],
          "tags": ["education"],
          "image":"http://i1.ytimg.com/vi/vzvpcEffvaE/maxresdefault.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Google Play",
          "titleFriendly":"",
          "summary":"The premier store for distributing Android apps and games, with global reach and tools to help you gain traction in the marketplace.…",
          "url":"distribute/googleplay/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/program-edu_2x.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Distribute to Android Wear",
          "titleFriendly":"",
          "summary":"Distribute your apps, games, and content to Android Wear.",
          "url":"distribute/googleplay/wear.html",
          "group":"",
          "keywords": ["wear","publish","googleplay"],
          "tags": ["wear","publish","quality"],
          "image":"design/media/wear/ContextualExample.008_2x.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Get Started with Publishing",
          "titleFriendly":"",
          "summary":"Start publishing on Google Play in minutes by registering for a developer account.",
          "url":"distribute/googleplay/start.html",
          "group":"",
          "keywords": ["google play","publishing","register","signup"],
          "tags": ["publishing"],
          "image":"distribute/images/getting-started.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Finding Success on Google Play",
          "titleFriendly":"",
          "summary":"A guide to help you find success with your app or game business on Google Play.",
          "url":"distribute/googleplay/guide.html",
          "group":"",
          "keywords": ["google play","business","monetize","engagement"],
          "tags": ["distribute","bestpractices"],
          "image":"distribute/images/play_dev_guide.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Google Play for Work",
          "titleFriendly":"",
          "summary":"Distribute your apps directly to enterprises and business users.",
          "url":"distribute/googleplay/work/about.html",
          "group":"",
          "keywords": ["enterprise","emm","business","administrator","profile"],
          "tags": ["enterprise","emm","business","administrator","profile"],
          "image":"images/distribute/gpfw.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Developer Console",
          "titleFriendly":"",
          "summary":"Learn about the Developer Console, your home for app publishing on Google Play.",
          "url":"distribute/googleplay/developer-console.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/dev-console_2x.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Build VR with Google Cardboard",
          "titleFriendly":"",
          "summary":"Build apps and games with VR, for a viewer anyone can buy.",
          "url":"distribute/googleplay/cardboard.html",
          "group":"",
          "keywords": ["vr","carboard","games"],
          "tags": ["vr","carboard","games"],
          "image":"images/distribute/cardboard.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Stream Your Content with Google Cast",
          "titleFriendly":"",
          "summary":"Let users stream your video and audio content to their TVs and speakers.",
          "url":"distribute/googleplay/cast.html",
          "group":"",
          "keywords": ["cast","video","chromecast"],
          "tags": ["cast","video","chromecast"],
          "image":"images/distribute/cast.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Designed for Families",
          "titleFriendly":"",
          "summary":"Designed for Families helps you make your apps and games more discoverable to families.",
          "url":"distribute/googleplay/families/about.html",
          "group":"",
          "keywords": ["families"],
          "tags": ["families","googleplay","distribution"],
          "image":"distribute/images/about-dff-sm.jpg",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Opt-In to Designed for Families",
          "titleFriendly":"",
          "summary":"Join Designed for Families in just a few simple steps.",
          "url":"distribute/googleplay/families/start.html",
          "group":"",
          "keywords": ["families","addendum"],
          "tags": ["families","guidelines","quality"],
          "image":"images/gp-dff-optin.png",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Google Play for Families FAQ",
          "titleFriendly":"",
          "summary":"Questions and answers about Designed for Families",
          "url":"distribute/googleplay/families/faq.html",
          "group":"",
          "keywords": ["families","addendum"],
          "tags": ["families","guidelines","quality"],
          "image":"",
          "lang":"en",
          "type":"distribute"
        }, 
        {
          "title":"Distribute to Android Auto",
          "titleFriendly":"",
          "summary":"Distribute your apps and content to Android Auto.",
          "url":"distribute/googleplay/auto.html",
          "group":"",
          "keywords": ["auto","publish","googleplay"],
          "tags": ["auto","publish","quality"],
          "image":"design/auto/images/auto-overview.png",
          "lang":"en",
          "type":"distribute"
        }
  ];
  
  var GOOGLE_RESOURCES = [
        {
          "title":"Google Services",
          "titleFriendly":"",
          "summary":"",
          "url":"google/index.html",
          "group":"",
          "keywords": [],
          "tags": ["google","play","services","maps","location","gcm","messaging","places"],
          "image":"images/google/hero-play-services_2x.png",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Authorization",
          "titleFriendly":"",
          "summary":"Google Play services offers a standard authorization flow for all Google APIs and all components of Google Play services. In addition, you can leverage the authorization portion of the Google Play services SDK to gain authorization to services that are…",
          "url":"google/play-services/auth.html",
          "group":"",
          "keywords": ["accountmanager","oauth2"],
          "tags": ["accountmanager","oauth2"],
          "image":"",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Google Play Services",
          "titleFriendly":"",
          "summary":"With Google Play services, your app can take advantage of the latest Google-powered features such as Maps, Analytics, and more: platform updates are distributed automatically as an APK through the Google Play Store.",
          "url":"google/play-services/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/google/gps.png",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Setting Up Google Play Services",
          "titleFriendly":"",
          "summary":"To develop an app using the Google Play services APIs , you need to set up your project with the Google Play services SDK. If you haven&#39;t installed the Google Play services SDK yet, go get it now by following the guide to Adding SDK Packages . To …",
          "url":"google/play-services/setup.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/sync-project.png",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"APK Expansion Files",
          "titleFriendly":"",
          "summary":"If your app needs more than the 50MB APK max, use free APK expansion files from Google Play.",
          "url":"google/play/expansion-files.html",
          "group":"",
          "keywords": ["apk size","apk max","large assets"],
          "tags": ["apksize","apkmax","largeassets"],
          "image":"",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"In-app Billing API",
          "titleFriendly":"",
          "summary":"The In-app Billing Version 3 API makes it easier for you to integrate In-app Billing into your applications. The features in this version include improved synchronous purchase flow, APIs to let you easily track ownership of consumable goods, and local…",
          "url":"google/play/billing/api.html",
          "group":"",
          "keywords": ["billing","inapp","iap"],
          "tags": ["billing","inapp","iap"],
          "image":"images/in-app-billing/v3/iab_v3_purchase_flow.png",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Administering In-app Billing",
          "titleFriendly":"",
          "summary":"In-app billing frees you from processing financial transactions, but you still need to perform a few administrative tasks, including setting up and maintaining your product list on the Google Play Developer Console, registering test accounts, and handling…",
          "url":"google/play/billing/billing_admin.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/in-app-billing/billing_product_list.png",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"In-app Billing Reference",
          "titleFriendly":"",
          "summary":"This documentation provides technical reference information for using the In-app Billing Version 3 API. The following table lists all of the server response codes that are sent from Google Play to your application. Google Play sends the response code …",
          "url":"google/play/billing/billing_reference.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"In-app Subscriptions",
          "titleFriendly":"",
          "summary":"Create a steady revenue stream by selling subscriptions to your content.",
          "url":"google/play/billing/billing_subscriptions.html",
          "group":"",
          "keywords": ["subscriptions","billing","inapp","iap"],
          "tags": ["monetization","inappbilling","subscriptions"],
          "image":"images/play_dev.jpg",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"In-app Billing",
          "titleFriendly":"",
          "summary":"Sell digital content as one-time purchases inside your app.",
          "url":"google/play/billing/index.html",
          "group":"",
          "keywords": ["billing","inapp","iap"],
          "tags": ["monetizing","inappbilling","subscriptions"],
          "image":"images/play_dev.jpg",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"In-app Billing Overview",
          "titleFriendly":"",
          "summary":"This documentation describes the fundamental In-app Billing components and features that you need to understand in order to add In-app Billing features into your application. Your application accesses the In-app Billing service using an API that is exposed…",
          "url":"google/play/billing/billing_overview.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Testing In-app Billing",
          "titleFriendly":"",
          "summary":"The Google Play Developer Console provides several tools that help you test your In-app Billing implementation: To test In-app Billing in an application you must install the application on an Android-powered device. You cannot use the Android emulator…",
          "url":"google/play/billing/billing_testing.html",
          "group":"",
          "keywords": ["inapp","billing","iap"],
          "tags": ["inapp","billing","iap"],
          "image":"images/billing_test_flow.png",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Implementing In-app Billing",
          "titleFriendly":"",
          "summary":"In-app Billing on Google Play provides a straightforward, simple interface for sending In-app Billing requests and managing In-app Billing transactions using Google Play. The information below covers the basics of how to make calls from your application…",
          "url":"google/play/billing/billing_integrate.html",
          "group":"",
          "keywords": ["inapp","billing","iap"],
          "tags": ["inapp","billing","iap"],
          "image":"",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Security and Design",
          "titleFriendly":"",
          "summary":"As you design your In-app Billing implementation, be sure to follow the security and design guidelines that are discussed in this document. These guidelines are recommended best practices for anyone who is using Google Play&#39;s In-app Billing service…",
          "url":"google/play/billing/billing_best_practices.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Google Play Developer API",
          "titleFriendly":"",
          "summary":"A REST-based web service for remote app publishing and catalog management through Google Play.",
          "url":"google/play/developer-api.html",
          "group":"",
          "keywords": ["in-app billing","google play","inapp billing","in app billing","iab","billing","publishing"],
          "tags": ["in-appbilling","googleplay","inappbilling","inappbilling","iab","billing","publishing"],
          "image":"images/play_dev.jpg",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Filters on Google Play",
          "titleFriendly":"",
          "summary":"When a user searches or browses for apps to download on Google Play, the results are filtered based on which applications are compatible with the device. For example, if an app requires a camera, Google Play would not show the app to devices that do not…",
          "url":"google/play/filters.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Adding Licensing to Your App",
          "titleFriendly":"",
          "summary":"After you&#39;ve set up a publisher account and development environment (see Setting Up for Licensing ), you are ready to add license verification to your app with the License Verification Library (LVL). Adding license verification with the LVL involves…",
          "url":"google/play/licensing/adding-licensing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/licensing_flow.png",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"App Licensing",
          "titleFriendly":"",
          "summary":"Information on using the licensing feature of Google Play to protect your apps.",
          "url":"google/play/licensing/index.html",
          "group":"",
          "keywords": [],
          "tags": ["licensing","drm"],
          "image":"assets/images/resource-card-default-android.jpg",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Setting Up for Licensing",
          "titleFriendly":"",
          "summary":"Before you start adding license verification to your application, you need to set up your Google Play publishing account, your development environment, and any test accounts required to verify your implementation. If you don&#39;t already have a publisher…",
          "url":"google/play/licensing/setting-up.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/licensing_public_key.png",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Licensing Overview",
          "titleFriendly":"",
          "summary":"Google Play Licensing is a network-based service that lets an application query a trusted Google Play licensing server to determine whether the application is licensed to the current device user. The licensing service is based on the capability of the…",
          "url":"google/play/licensing/overview.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/licensing_arch.png",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Licensing Reference",
          "titleFriendly":"",
          "summary":"Table 1 lists all of the source files in the License Verification Library (LVL) available through the Android SDK. All of the files are part of the com.android.vending.licensing package. Table 2 lists all of the license response codes supported by the…",
          "url":"google/play/licensing/licensing-reference.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Google Play Distribution",
          "titleFriendly":"",
          "summary":"Google Play allows you to manage your app distribution with features that let you control which users can download your app as well as deliver separate versions of your app based on certain characteristics like platform version. Make sure your app gets…",
          "url":"google/play/dist.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Multiple APK Support",
          "titleFriendly":"",
          "summary":"Multiple APK support is a feature on Google Play that allows you to publish different APKs for your application that are each targeted to different device configurations. Each APK is a complete and independent version of your application, but they share…",
          "url":"google/play/publishing/multiple-apks.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/market/version-codes.png",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Android Backup Service",
          "titleFriendly":"",
          "summary":"Android Backup Service provides a backup transport for Android&#39;s data backup framework, which allows you to copy a user&#39;s persistent app data to remote &quot;cloud&quot; storage. Backing up persistent data this way provides a restore point for…",
          "url":"google/backup/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Authorizing with Google for REST APIs",
          "titleFriendly":"",
          "summary":"When you want your Android app to access Google APIs using the user&#39;s Google account over HTTP, the GoogleAuthUtil class and related APIs provide your users a secure and consistent experience for picking an account and retrieving an OAuth 2.0 token…",
          "url":"google/auth/http-auth.html",
          "group":"",
          "keywords": ["oauth 2.0","googleauthutil"],
          "tags": ["oauth2.0","googleauthutil"],
          "image":"",
          "lang":"en",
          "type":"google"
        }, 
        {
          "title":"Accessing Google APIs",
          "titleFriendly":"",
          "summary":"When you want to make a connection to one of the Google APIs provided in the Google Play services library (such as Google+, Games, or Drive), you need to create an instance of GoogleApiClient (&quot;Google API Client&quot;). The Google API Client provides…",
          "url":"google/auth/api-client.html",
          "group":"",
          "keywords": ["oauth 2.0","googleauthutil"],
          "tags": ["oauth2.0","googleauthutil"],
          "image":"images/google/GoogleApiClient@2x.png",
          "lang":"en",
          "type":"google"
        }
  ];
  
  var GUIDE_RESOURCES = [
        {
          "title":"System Permissions",
          "titleFriendly":"",
          "summary":"Android is a privilege-separated operating system, in which each application runs with a distinct system identity (Linux user ID and group ID). Parts of the system are also separated into distinct identities. Linux thereby isolates applications from each…",
          "url":"guide/topics/security/permissions.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Computation",
          "titleFriendly":"",
          "summary":"It’s been a year since the last blog post on RenderScript, and with the release of Android 4.2, it’s a good time to talk about the performance work that we’ve done since then. One of the major goals of this past year was to improve the performance of …",
          "url":"guide/topics/renderscript/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Advanced RenderScript",
          "titleFriendly":"",
          "summary":"Because applications that utilize RenderScript still run inside of the Android VM, you have access to all of the framework APIs that you are familiar with, but can utilize RenderScript when appropriate. To facilitate this interaction between the framework…",
          "url":"guide/topics/renderscript/advanced.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript",
          "titleFriendly":"",
          "summary":"RenderScript is a framework for running computationally intensive tasks at high performance on Android. RenderScript is primarily oriented for use with data-parallel computation, although serial computationally intensive workloads can benefit as well.…",
          "url":"guide/topics/renderscript/compute.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Atomic Update Functions",
          "titleFriendly":"",
          "summary":"To update values shared between multiple threads, use the functions below. They ensure that the values are atomically updated, i.e. that the memory reads, the updates, and the memory writes are done in the right order. These functions are slower than …",
          "url":"guide/topics/renderscript/reference/rs_atomic.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Numerical Types",
          "titleFriendly":"",
          "summary":"RenderScript supports the following scalar numerical types: 8 bits 16 bits 32 bits 64 bits Integer: char, int8_t short, int16_t int32_t long, long long, int64_t Unsigned integer: uchar, uint8_t ushort, uint16_t uint, uint32_t ulong, uint64_t Floating …",
          "url":"guide/topics/renderscript/reference/rs_value_types.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Vector Math Functions",
          "titleFriendly":"",
          "summary":"These functions interpret the input arguments as representation of vectors in n-dimensional space. The precision of the mathematical operations on 32 bit floats is affected by the pragmas rs_fp_relaxed and rs_fp_full. See Mathematical Constants and Functions…",
          "url":"guide/topics/renderscript/reference/rs_vector_math.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Kernel Invocation Functions and Types",
          "titleFriendly":"",
          "summary":"The rsForEach () function can be used to invoke the root kernel of a script. An enum with the following values:      This type is used to suggest how the invoked kernel should iterate over the cells of the allocations. This is a hint only. Implementations…",
          "url":"guide/topics/renderscript/reference/rs_for_each.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Input&#47;Output Functions",
          "titleFriendly":"",
          "summary":"These functions are used to: Receive a new set of contents from the queue. Send the contents of the Allocation to the queue. Sends a message back to the client. This call does not block. It returns true if the message was sent and false if the message…",
          "url":"guide/topics/renderscript/reference/rs_io.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Index",
          "titleFriendly":"",
          "summary":"",
          "url":"guide/topics/renderscript/reference/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Object Types",
          "titleFriendly":"",
          "summary":"The types below are used to manipulate RenderScript objects like allocations, samplers, elements, and scripts. Most of these object are created using the Java RenderScript APIs. A typedef of: _RS_HANDLE      An opaque handle to a RenderScript allocation…",
          "url":"guide/topics/renderscript/reference/rs_object_types.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Time Functions and Types",
          "titleFriendly":"",
          "summary":"The functions below can be used to tell the current clock time and the current system up time. It is not recommended to call these functions inside of a kernel. A typedef of: int      When compiling for 32 bits. A typedef of: long      When compiling …",
          "url":"guide/topics/renderscript/reference/rs_time.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Graphics Functions and Types",
          "titleFriendly":"",
          "summary":"The graphics subsystem of RenderScript has been deprecated. An enum with the following values:      When compiling for 32 bits. Added in API level 16 Deprecated. Do not use. An enum with the following values:      When compiling for 32 bits. Added in …",
          "url":"guide/topics/renderscript/reference/rs_graphics.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Quaternion Functions",
          "titleFriendly":"",
          "summary":"The following functions manipulate quaternions. Adds two quaternions, i.e. *q += *rhs; Conjugates the quaternion. Returns the dot product of two quaternions. Computes a rotation matrix from the normalized quaternion. Loads a quaternion that represents…",
          "url":"guide/topics/renderscript/reference/rs_quaternion.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Conversion Functions",
          "titleFriendly":"",
          "summary":"The functions below convert from a numerical vector type to another, of from one color representation to another. Converts a vector from one numerical type to another. The conversion are done entry per entry. E.g calling a = convert_short3(b); is equivalent…",
          "url":"guide/topics/renderscript/reference/rs_convert.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Debugging Functions",
          "titleFriendly":"",
          "summary":"The functions below are intended to be used during application developement. They should not be used in shipping applications. This function prints a message to the standard log, followed by the provided values. This function is intended for debugging…",
          "url":"guide/topics/renderscript/reference/rs_debug.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Runtime API Reference",
          "titleFriendly":"",
          "summary":"RenderScript is a high-performance runtime that provides compute operations at the native level. RenderScript code is compiled on devices at runtime to allow platform-independence as well. This reference documentation describes the RenderScript runtime…",
          "url":"guide/topics/renderscript/reference/overview.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Matrix Functions",
          "titleFriendly":"",
          "summary":"These functions let you manipulate square matrices of rank 2x2, 3x3, and 4x4. They are particularly useful for graphical transformations and are compatible with OpenGL. We use a zero-based index for rows and columns. E.g. the last element of a rs_matrix4x4…",
          "url":"guide/topics/renderscript/reference/rs_matrix.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Allocation Data Access Functions",
          "titleFriendly":"",
          "summary":"The functions below can be used to get and set the cells that comprise an allocation. Copies the specified number of cells from one allocation to another. The two allocations must be different. Using this function to copy whithin the same allocation yields…",
          "url":"guide/topics/renderscript/reference/rs_allocation_data.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Mathematical Constants and Functions",
          "titleFriendly":"",
          "summary":"The mathematical functions below can be applied to scalars and vectors. When applied to vectors, the returned value is a vector of the function applied to each entry of the input. For example: float3 a, b; &#47;&#47; The following call sets &#47;&#47;…",
          "url":"guide/topics/renderscript/reference/rs_math.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"RenderScript Object Characteristics Functions",
          "titleFriendly":"",
          "summary":"The functions below can be used to query the characteristics of an Allocation, Element, or Sampler object. These objects are created from Java. You can&#39;t create them from a script. Allocations are the primary method used to pass data to and from RenderScript…",
          "url":"guide/topics/renderscript/reference/rs_object_info.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Administration",
          "titleFriendly":"",
          "summary":"Android 4.0 (ICS) comes with a number of enhancements that make it easier for people to bring their personal Android devices to work. In this post, we’re going to have a look at the key store functionality.…",
          "url":"guide/topics/admin/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Device Administration",
          "titleFriendly":"",
          "summary":"Android 2.2 introduces support for enterprise applications by offering the Android Device Administration API. The Device Administration API provides device administration features at the system level. These APIs allow you to create security-aware applications…",
          "url":"guide/topics/admin/device-admin.html",
          "group":"",
          "keywords": ["devicepolicymanager","policy","security"],
          "tags": ["devicepolicymanager","policy","security"],
          "image":"images/admin/device-admin-app.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Animation Resources",
          "titleFriendly":"",
          "summary":"An animation resource can define one of two types of animations: There are two types of animations that you can do with the view animation framework: An animation defined in XML that modifies properties of the target object, such as background color or…",
          "url":"guide/topics/resources/animation-resource.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Drawable Resources",
          "titleFriendly":"",
          "summary":"A drawable resource is a general concept for a graphic that can be drawn to the screen and which you can retrieve with APIs such as getDrawable(int) or apply to another XML resource with attributes such as AnimationDrawable. A bitmap image. Android supports…",
          "url":"guide/topics/resources/drawable-resource.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/resources/layers.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Application Resources",
          "titleFriendly":"",
          "summary":"This document has moved. Please see Application Resources .…",
          "url":"guide/topics/resources/resources-i18n.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Accessing Resources",
          "titleFriendly":"",
          "summary":"Once you provide a resource in your application (discussed in Providing Resources ), you can apply it by referencing its resource ID. All resource IDs are defined in your project&#39;s R class, which the aapt tool automatically generates. When your application…",
          "url":"guide/topics/resources/accessing-resources.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"App Resources",
          "titleFriendly":"",
          "summary":"Developer guide about how to use resources in your Android apps.",
          "url":"guide/topics/resources/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/develop/resources.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Handling Runtime Changes",
          "titleFriendly":"",
          "summary":"Some device configurations can change during runtime (such as screen orientation, keyboard availability, and language). When such a change occurs, Android restarts the running Activity (onDestroy() is called, followed by onCreate()). The restart behavior…",
          "url":"guide/topics/resources/runtime-changes.html",
          "group":"",
          "keywords": ["activity","lifecycle"],
          "tags": ["activity","lifecycle"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Providing Resources",
          "titleFriendly":"",
          "summary":"You should always externalize application resources such as images and strings from your code, so that you can maintain them independently. You should also provide alternative resources for specific device configurations, by grouping them in specially-named…",
          "url":"guide/topics/resources/providing-resources.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/resources/resource_devices_diagram2.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Style Resource",
          "titleFriendly":"",
          "summary":"A style resource defines the format and look for a UI. A style can be applied to an individual View (from within a layout file) or to an entire Activity or application (from within the manifest file). For more information about creating and applying styles…",
          "url":"guide/topics/resources/style-resource.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"More Resource Types",
          "titleFriendly":"",
          "summary":"This page defines more types of resources you can externalize, including: A boolean value defined in XML. No attributes. This application code retrieves the boolean: This layout XML uses the boolean for an attribute: A color value defined in XML. The …",
          "url":"guide/topics/resources/more-resources.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Resource Types",
          "titleFriendly":"",
          "summary":"Each of the documents in this section describe the usage, format and syntax for a certain type of application resource that you can provide in your resources directory ({@code res&#47;}). Here&#39;s a brief summary of each resource type:…",
          "url":"guide/topics/resources/available-resources.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Color State List Resource",
          "titleFriendly":"",
          "summary":"A ColorStateList is an object you can define in XML that you can apply as a color, but will actually change colors, depending on the state of the View object to which it is applied. For example, a Button widget can exist in one of several different states…",
          "url":"guide/topics/resources/color-list-resource.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Resources Overview",
          "titleFriendly":"",
          "summary":"You should always externalize resources such as images and strings from your application code, so that you can maintain them independently. Externalizing your resources also allows you to provide alternative resources that support specific device configurations…",
          "url":"guide/topics/resources/overview.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/resources/resource_devices_diagram1.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Layout Resource",
          "titleFriendly":"",
          "summary":"A layout resource defines the architecture for the UI in an Activity or a component of a UI. You should not assume that any derivation of ViewGroup will accept nested Views. Some ViewGroups are implementations of the AdapterView class, which determines…",
          "url":"guide/topics/resources/layout-resource.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Menu Resource",
          "titleFriendly":"",
          "summary":"A menu resource defines an application menu (Options Menu, Context Menu, or submenu) that can be inflated with MenuInflater. For a guide to using menus, see the Menus developer guide. Introduced in API Level 11. See the Action Bar developer guide for …",
          "url":"guide/topics/resources/menu-resource.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"String Resources",
          "titleFriendly":"",
          "summary":"A string resource provides text strings for your application with optional text styling and formatting. There are three types of resources that can provide your application with strings: All strings are capable of applying some styling markup and formatting…",
          "url":"guide/topics/resources/string-resource.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Localizing with Resources",
          "titleFriendly":"",
          "summary":"Android will run on many devices in many regions. To reach the most users, your application should handle text, audio files, numbers, currency, and graphics in ways appropriate to the locales where your application will be used. This document describes…",
          "url":"guide/topics/resources/localization.html",
          "group":"",
          "keywords": ["localizing","localization","resources","formats","l10n"],
          "tags": ["localizing","localization","resources","formats","l10n"],
          "image":"../../../images/resources/right-arrow.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"SONiVOX JETCreator User Manual",
          "titleFriendly":"",
          "summary":"Content Authoring Application for the JET Interactive Music Engine This document contains the user guidelines for the SONiVOX JET Creator, an authoring application for creating and auditioning JET files. JET is an interactive music player for small embedded…",
          "url":"guide/topics/media/jet/jetcreator_manual.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/jet/linear_music.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Media Route Provider",
          "titleFriendly":"",
          "summary":"Users want to play media content from their Android devices bigger, brighter, and louder on connected playback devices such as televisions, stereos, and home theater equipment. As a manufacturer of these devices, allowing Android users to instantly show…",
          "url":"guide/topics/media/mediarouteprovider.html",
          "group":"",
          "keywords": ["mediarouteprovider","mediacontrolintent"],
          "tags": ["mediarouteprovider","mediacontrolintent"],
          "image":"images/mediarouter/media-route-provider-framework.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Media and Camera",
          "titleFriendly":"",
          "summary":"If your media playback application creates a media playback service, just like Music, that responds to the media button events, how will the user know where those events are going to? Music, or your new application? Making a game on Android is easy. Making…",
          "url":"guide/topics/media/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Media Router",
          "titleFriendly":"",
          "summary":"As users connect their televisions, home theater systems and music players with wireless technologies, they want to be able to play content from Android apps on these larger, louder devices. Enabling this kind of playback can turn your one-device, one-user…",
          "url":"guide/topics/media/mediarouter.html",
          "group":"",
          "keywords": ["mediarouter","cast","chromecast","wireless display","miracast"],
          "tags": ["mediarouter","cast","chromecast","wirelessdisplay","miracast"],
          "image":"images/mediarouter/mediarouter-framework.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"JetPlayer",
          "titleFriendly":"",
          "summary":"The Android platform includes a JET engine that lets you add interactive playback of JET audio content in your applications. You can create JET content for interactive playback using the JetCreator authoring application that ships with the SDK. To play…",
          "url":"guide/topics/media/jetplayer.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Audio Capture",
          "titleFriendly":"",
          "summary":"The Android multimedia framework includes support for capturing and encoding a variety of common audio formats, so that you can easily integrate audio into your applications. You can record audio using the MediaRecorder APIs if supported by the device…",
          "url":"guide/topics/media/audio-capture.html",
          "group":"",
          "keywords": ["mediarecorder"],
          "tags": ["mediarecorder"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"ExoPlayer",
          "titleFriendly":"",
          "summary":"Playing videos and music is a popular activity on Android devices. The Android framework provides MediaPlayer as a quick solution for playing media with minimal code, and the MediaCodec and MediaExtractor classes are provided for building custom media…",
          "url":"guide/topics/media/exoplayer.html",
          "group":"",
          "keywords": ["audio","video","adaptive","streaming","dash","smoothstreaming"],
          "tags": ["audio","video","adaptive","streaming","dash","smoothstreaming"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Media Playback",
          "titleFriendly":"",
          "summary":"The Android multimedia framework includes support for playing variety of common media types, so that you can easily integrate audio, video and images into your applications. You can play audio or video from media files stored in your application&#39;s…",
          "url":"guide/topics/media/mediaplayer.html",
          "group":"",
          "keywords": ["mediaplayer","soundpool","audiomanager"],
          "tags": ["mediaplayer","soundpool","audiomanager"],
          "image":"images/notification1.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Camera",
          "titleFriendly":"",
          "summary":"The Android framework includes support for various cameras and camera features available on devices, allowing you to capture pictures and videos in your applications. This document discusses a quick, simple approach to image and video capture and outlines…",
          "url":"guide/topics/media/camera.html",
          "group":"",
          "keywords": ["photo","video","picture","mediarecorder"],
          "tags": ["photo","video","picture","mediarecorder"],
          "image":"images/camera-area-coordinates.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Near Field Communication",
          "titleFriendly":"",
          "summary":"Near Field Communication (NFC) is a set of short-range wireless technologies, typically requiring a distance of 4cm or less to initiate a connection. NFC allows you to share small payloads of data between an NFC tag and an Android-powered device, or between…",
          "url":"guide/topics/connectivity/nfc/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"NFC Basics",
          "titleFriendly":"",
          "summary":"This document describes the basic NFC tasks you perform in Android. It explains how to send and receive NFC data in the form of NDEF messages and describes the Android framework APIs that support these features. For more advanced topics, including a discussion…",
          "url":"guide/topics/connectivity/nfc/nfc.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/nfc_tag_dispatch.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Host-based Card Emulation",
          "titleFriendly":"",
          "summary":"Many Android-powered devices that offer NFC functionality already support NFC card emulation. In most cases, the card is emulated by a separate chip in the device, called a secure element . Many SIM cards provided by wireless carriers also contain a secure…",
          "url":"guide/topics/connectivity/nfc/hce.html",
          "group":"",
          "keywords": ["host card emulation","hce","hostapduservice","offhostapduservice","tap and pay"],
          "tags": ["hostcardemulation","hce","hostapduservice","offhostapduservice","tapandpay"],
          "image":"images/nfc/secure-element.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Advanced NFC",
          "titleFriendly":"",
          "summary":"This document describes advanced NFC topics, such as working with various tag technologies, writing to NFC tags, and foreground dispatching, which allows an application in the foreground to handle intents even when other applications filter for the same…",
          "url":"guide/topics/connectivity/nfc/advanced-nfc.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Bluetooth Low Energy",
          "titleFriendly":"",
          "summary":"DevBytes: Bluetooth Low Energy API Android 4.3 (API Level 18) introduces built-in platform support for Bluetooth Low Energy in the central role and provides APIs that apps can use to discover devices, query for services, and read&#47;write characteristics…",
          "url":"guide/topics/connectivity/bluetooth-le.html",
          "group":"",
          "keywords": ["wireless","bluetoothadapter","bluetoothdevice","ble","btle"],
          "tags": ["wireless","bluetoothadapter","bluetoothdevice","ble","btle"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Session Initiation Protocol",
          "titleFriendly":"",
          "summary":"Android provides an API that supports the Session Initiation Protocol (SIP). This lets you add SIP-based internet telephony features to your applications. Android includes a full SIP protocol stack and integrated call management services that let applications…",
          "url":"guide/topics/connectivity/sip.html",
          "group":"",
          "keywords": ["sipmanager","sipprofile","sipaudiocall","telephony"],
          "tags": ["sipmanager","sipprofile","sipaudiocall","telephony"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Connectivity",
          "titleFriendly":"",
          "summary":"Most network-connected Android apps will use HTTP to send and receive data. Android includes two HTTP clients: HttpURLConnection and Apache HTTP Client. Both support HTTPS, streaming uploads and downloads, configurable timeouts, IPv6 and connection pooling…",
          "url":"guide/topics/connectivity/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Wi-Fi Peer-to-Peer",
          "titleFriendly":"",
          "summary":"Wi-Fi peer-to-peer (P2P) allows Android 4.0 (API level 14) or later devices with the appropriate hardware to connect directly to each other via Wi-Fi without an intermediate access point (Android&#39;s Wi-Fi P2P framework complies with the Wi-Fi Alliance…",
          "url":"guide/topics/connectivity/wifip2p.html",
          "group":"",
          "keywords": ["wireless","wifip2pmanager","wi-fi direct","wifi direct","p2p","wi-fi p2p","wifi p2p"],
          "tags": ["wireless","wifip2pmanager","wi-fidirect","wifidirect","p2p","wi-fip2p","wifip2p"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Bluetooth",
          "titleFriendly":"",
          "summary":"The Android platform includes support for the Bluetooth network stack, which allows a device to wirelessly exchange data with other Bluetooth devices. The application framework provides access to the Bluetooth functionality through the Android Bluetooth…",
          "url":"guide/topics/connectivity/bluetooth.html",
          "group":"",
          "keywords": ["wireless","bluetoothadapter","bluetoothdevice"],
          "tags": ["wireless","bluetoothadapter","bluetoothdevice"],
          "image":"images/bt_enable_request.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"USB Host and Accessory",
          "titleFriendly":"",
          "summary":"Android supports a variety of USB peripherals and Android USB accessories (hardware that implements the Android accessory protocol) through two modes: USB accessory and USB host. In USB accessory mode, the external USB hardware act as the USB hosts. Examples…",
          "url":"guide/topics/connectivity/usb/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/usb-host-accessory.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"USB Host",
          "titleFriendly":"",
          "summary":"When your Android-powered device is in USB host mode, it acts as the USB host, powers the bus, and enumerates connected USB devices. USB host mode is supported in Android 3.1 and higher. Before you begin, it is important to understand the classes that…",
          "url":"guide/topics/connectivity/usb/host.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"USB Accessory",
          "titleFriendly":"",
          "summary":"USB accessory mode allows users to connect USB host hardware specifically designed for Android-powered devices. The accessories must adhere to the Android accessory protocol outlined in the Android Accessory Development Kit documentation. This allows …",
          "url":"guide/topics/connectivity/usb/accessory.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Search Overview",
          "titleFriendly":"",
          "summary":"Search is a core user feature on Android. Users should be able to search any data that is available to them, whether the content is located on the device or the Internet. To help create a consistent search experience for users, Android provides a search…",
          "url":"guide/topics/search/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/search/search-suggest-custom.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Searchable Configuration",
          "titleFriendly":"",
          "summary":"In order to implement search with assistance from the Android system (to deliver search queries to an activity and provide search suggestions), your application must provide a search configuration in the form of an XML file. This page describes the search…",
          "url":"guide/topics/search/searchable-config.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Adding Recent Query Suggestions",
          "titleFriendly":"",
          "summary":"When using the Android search dialog or search widget, you can provide search suggestions based on recent search queries. For example, if a user previously searched for &quot;puppies,&quot; then that query appears as a suggestion once he or she begins…",
          "url":"guide/topics/search/adding-recent-query-suggestions.html",
          "group":"",
          "keywords": ["searchrecentsuggestions","searchrecentsuggestionsprovider"],
          "tags": ["searchrecentsuggestions","searchrecentsuggestionsprovider"],
          "image":"images/search/search-suggest-recent-queries.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Creating a Search Interface",
          "titleFriendly":"",
          "summary":"When you&#39;re ready to add search functionality to your application, Android helps you implement the user interface with either a search dialog that appears at the top of the activity window or a search widget that you can insert in your layout. Both…",
          "url":"guide/topics/search/search-dialog.html",
          "group":"",
          "keywords": ["searchview"],
          "tags": ["searchview"],
          "image":"images/search/search-ui.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Adding Custom Suggestions",
          "titleFriendly":"",
          "summary":"When using the Android search dialog or search widget, you can provide custom search suggestions that are created from data in your application. For example, if your application is a word dictionary, you can suggest words from the dictionary that match…",
          "url":"guide/topics/search/adding-custom-suggestions.html",
          "group":"",
          "keywords": ["searchrecentsuggestionsprovider"],
          "tags": ["searchrecentsuggestionsprovider"],
          "image":"images/search/search-suggest-custom.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"App Widgets",
          "titleFriendly":"",
          "summary":"App Widgets are miniature application views that can be embedded in other applications (such as the Home screen) and receive periodic updates. These views are referred to as Widgets in the user interface, and you can publish one with an App Widget provider…",
          "url":"guide/topics/appwidgets/index.html",
          "group":"",
          "keywords": ["home","appwidgetprovider"],
          "tags": ["home","appwidgetprovider"],
          "image":"images/appwidgets/appwidget.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"App Widget Host",
          "titleFriendly":"",
          "summary":"The Android Home screen available on most Android devices allows the user to embed app widgets for quick access to content. If you&#39;re building a Home replacement or a similar app, you can also allow the user to embed app widgets by implementing an…",
          "url":"guide/topics/appwidgets/host.html",
          "group":"",
          "keywords": ["appwidgethost","home screen","launcher"],
          "tags": ["appwidgethost","homescreen","launcher"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;application&gt;",
          "titleFriendly":"",
          "summary":"The declaration of the application. This element contains subelements that declare each of the application&#39;s components and has attributes that can affect all the components. Many of these attributes (such as icon, label, permission, process, taskAffinity…",
          "url":"guide/topics/manifest/application-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;permission-group&gt;",
          "titleFriendly":"",
          "summary":"Declares a name for a logical grouping of related permissions. Individual permission join the group through the permissionGroup attribute of the &lt;permission&gt; element. Members of a group are presented together in the user interface. Note that this…",
          "url":"guide/topics/manifest/permission-group-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;path-permission&gt;",
          "titleFriendly":"",
          "summary":"Defines the path and required permissions for a specific subset of data within a content provider. This element can be specified multiple times to supply multiple paths.…",
          "url":"guide/topics/manifest/path-permission-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;grant-uri-permission&gt;",
          "titleFriendly":"",
          "summary":"Specifies which data subsets of the parent content provider permission can be granted for. Data subsets are indicated by the path part of a true&quot;, permission can be granted for any the data under the provider&#39;s purview. However, if that attribute…",
          "url":"guide/topics/manifest/grant-uri-permission-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;action&gt;",
          "titleFriendly":"",
          "summary":"Adds an action to an intent filter. An &lt;intent-filter&gt; element must contain one or more {@code &lt;action&gt;} elements. If it doesn&#39;t contain any, no Intent objects will get through the filter. See Intents and Intent Filters for details on …",
          "url":"guide/topics/manifest/action-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;activity&gt;",
          "titleFriendly":"",
          "summary":"Declares an activity (an Activity subclass) that implements part of the application&#39;s visual user interface. All activities must be represented by {@code &lt;activity&gt;} elements in the manifest file. Any that are not declared there will not be …",
          "url":"guide/topics/manifest/activity-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;instrumentation&gt;",
          "titleFriendly":"",
          "summary":"Declares an Instrumentation class that enables you to monitor an application&#39;s interaction with the system. The Instrumentation object is instantiated before any of the application&#39;s components.…",
          "url":"guide/topics/manifest/instrumentation-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;data&gt;",
          "titleFriendly":"",
          "summary":"Adds a data specification to an intent filter. The specification can be just a data type (the mimeType attribute), just a URI, or both a data type and a URI. A URI is specified by separate attributes for each of its parts: port attribute and all the path…",
          "url":"guide/topics/manifest/data-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;meta-data&gt;",
          "titleFriendly":"",
          "summary":"A name-value pair for an item of additional, arbitrary data that can be supplied to the parent component. A component element can contain any number of Bundle object and made available to the component as the metaData field. Ordinary values are specified…",
          "url":"guide/topics/manifest/meta-data-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;category&gt;",
          "titleFriendly":"",
          "summary":"Adds a category name to an intent filter. See Intents and Intent Filters for details on intent filters and the role of category specifications within a filter.…",
          "url":"guide/topics/manifest/category-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;receiver&gt;",
          "titleFriendly":"",
          "summary":"Declares a broadcast receiver (a BroadcastReceiver subclass) as one of the application&#39;s components. Broadcast receivers enable applications to receive intents that are broadcast by the system or by other applications, even when other components of…",
          "url":"guide/topics/manifest/receiver-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;permission&gt;",
          "titleFriendly":"",
          "summary":"Declares a security permission that can be used to limit access to specific components or features of this or other applications. See the Permissions section in the introduction, and the Security and Permissions document for more information on how permissions…",
          "url":"guide/topics/manifest/permission-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;service&gt;",
          "titleFriendly":"",
          "summary":"Declares a service (a Service subclass) as one of the application&#39;s components. Unlike activities, services lack a visual user interface. They&#39;re used to implement long-running background operations or a rich communications API that can be called…",
          "url":"guide/topics/manifest/service-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;supports-screens&gt;",
          "titleFriendly":"",
          "summary":"Lets you specify the screen sizes your application supports and enable screen compatibility mode for screens larger than what your application supports. It&#39;s important that you always use this element in your application to specify the screen sizes…",
          "url":"guide/topics/manifest/supports-screens-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;compatible-screens&gt;",
          "titleFriendly":"",
          "summary":"Specifies each screen configuration with which the application is compatible. Only one instance of the {@code &lt;compatible-screens&gt;} element is allowed in the manifest, but it can contain multiple &lt;screen&gt; elements. Each &lt;screen&gt; element…",
          "url":"guide/topics/manifest/compatible-screens-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;uses-library&gt;",
          "titleFriendly":"",
          "summary":"All of the android packages (such as app, content, view, and widget) are in the default library that all applications are automatically linked against. However, some packages (such as maps) are in separate libraries that are not automatically linked. …",
          "url":"guide/topics/manifest/uses-library-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;supports-gl-texture&gt;",
          "titleFriendly":"",
          "summary":"Declares a single GL texture compression format that is supported by the application. An application &quot;supports&quot; a GL texture compression format if it is capable of providing texture assets that are compressed in that format, once the application…",
          "url":"guide/topics/manifest/supports-gl-texture-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;intent-filter&gt;",
          "titleFriendly":"",
          "summary":"Specifies the types of intents that an activity, service, or broadcast receiver can respond to. An intent filter declares the capabilities of its parent component — what an activity or service can do and what types of broadcasts a receiver can handle.…",
          "url":"guide/topics/manifest/intent-filter-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;activity-alias&gt;",
          "titleFriendly":"",
          "summary":"An alias for an activity, named by the targetActivity attribute. The target must be in the same application as the alias and it must be declared before the alias in the manifest. The alias presents the target activity as a independent entity. It can have…",
          "url":"guide/topics/manifest/activity-alias-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;uses-configuration&gt;",
          "titleFriendly":"",
          "summary":"Indicates what hardware and software features the application requires. For example, an application might specify that it requires a physical keyboard or a particular navigation device, like a trackball. The specification is used to avoid installing the…",
          "url":"guide/topics/manifest/uses-configuration-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"App Manifest",
          "titleFriendly":"",
          "summary":"The manifest file presents essential information about your app to the Android system, information the system must have before it can run any of the app&#39;s code.…",
          "url":"guide/topics/manifest/manifest-intro.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;permission-tree&gt;",
          "titleFriendly":"",
          "summary":"Declares the base name for a tree of permissions. The application takes ownership of all names within the tree. It can dynamically add new permissions to the tree by calling addPermission(). Names within the tree are separated by periods (&#39;taxes, …",
          "url":"guide/topics/manifest/permission-tree-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;uses-permission&gt;",
          "titleFriendly":"",
          "summary":"Requests a permission that the application must be granted in order for it to operate correctly. Permissions are granted by the user when the application is installed, not while it&#39;s running. For more information on permissions, see the Permissions…",
          "url":"guide/topics/manifest/uses-permission-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;manifest&gt;",
          "titleFriendly":"",
          "summary":"The root element of the AndroidManifest.xml file. It must contain an &lt;application&gt; element and specify package attributes.…",
          "url":"guide/topics/manifest/manifest-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;uses-sdk&gt;",
          "titleFriendly":"",
          "summary":"Lets you express an application&#39;s compatibility with one or more versions of the Android platform, by means of an API Level integer. The API Level expressed by an application will be compared to the API Level of a given Android system, which may vary…",
          "url":"guide/topics/manifest/uses-sdk-element.html",
          "group":"",
          "keywords": ["api levels","sdk version","minsdkversion","targetsdkversion","maxsdkversion"],
          "tags": ["apilevels","sdkversion","minsdkversion","targetsdkversion","maxsdkversion"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;provider&gt;",
          "titleFriendly":"",
          "summary":"Declares a content provider component. A content provider is a subclass of ContentProvider that supplies structured access to data managed by the application. All content providers in your application must be defined in a query(), which among other arguments…",
          "url":"guide/topics/manifest/provider-element.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"&lt;uses-feature&gt;",
          "titleFriendly":"",
          "summary":"Declares a single hardware or software feature that is used by the application. The purpose of a &lt;uses-feature&gt; declaration is to inform any external entity of the set of hardware and software features on which your application depends. The element…",
          "url":"guide/topics/manifest/uses-feature-element.html",
          "group":"",
          "keywords": ["filtering","features","google play filters","permissions"],
          "tags": ["filtering","features","googleplayfilters","permissions"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Text and Input",
          "titleFriendly":"",
          "summary":"A new feature available in Android 4.0 is voice typing: the difference for users is that the recognition results appear in the text box while they are still speaking. If you are an IME developer, you can easily integrate with voice typing. We believe …",
          "url":"guide/topics/text/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Copy and Paste",
          "titleFriendly":"",
          "summary":"Android provides a powerful clipboard-based framework for copying and pasting. It supports both simple and complex data types, including text strings, complex data structures, text and binary stream data, and even application assets. Simple text data …",
          "url":"guide/topics/text/copy-paste.html",
          "group":"",
          "keywords": ["clipboardmanager","clipdata","input"],
          "tags": ["clipboardmanager","clipdata","input"],
          "image":"images/ui/clipboard/copy_paste_framework.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Spelling Checker Framework",
          "titleFriendly":"",
          "summary":"The Android platform offers a spelling checker framework that lets you implement and access spell checking in your application. The framework is one of the Text Service APIs offered by the Android platform. To use the framework in your app, you create…",
          "url":"guide/topics/text/spell-checker-framework.html",
          "group":"",
          "keywords": ["input","spellcheckerservice"],
          "tags": ["input","spellcheckerservice"],
          "image":"resources/articles/images/spellcheck_lifecycle.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Creating an Input Method",
          "titleFriendly":"",
          "summary":"An input method editor (IME) is a user control that enables users to enter text. Android provides an extensible input-method framework that allows applications to provide users alternative input methods, such as on-screen keyboards or even speech input…",
          "url":"guide/topics/text/creating-input-method.html",
          "group":"",
          "keywords": ["ime","keyboard","inputmethodservice"],
          "tags": ["ime","keyboard","inputmethodservice"],
          "image":"resources/articles/images/inputmethod_lifecycle_image.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Calendar Provider",
          "titleFriendly":"",
          "summary":"The Calendar Provider is a repository for a user&#39;s calendar events. The Calendar Provider API allows you to perform query, insert, update, and delete operations on calendars, events, attendees, reminders, and so on. The Calender Provider API can be…",
          "url":"guide/topics/providers/calendar-provider.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/providers/datamodel.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Contacts Provider",
          "titleFriendly":"",
          "summary":"The Contacts Provider is a powerful and flexible Android component that manages the device&#39;s central repository of data about people. The Contacts Provider is the source of data you see in the device&#39;s contacts application, and you can also access…",
          "url":"guide/topics/providers/contacts-provider.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/providers/contacts_structure.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Content Providers",
          "titleFriendly":"",
          "summary":"Content providers manage access to a structured set of data. They encapsulate the data, and provide mechanisms for defining data security. Content providers are the standard interface that connects data in one process with code running in another process…",
          "url":"guide/topics/providers/content-providers.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Creating a Content Provider",
          "titleFriendly":"",
          "summary":"A content provider manages access to a central repository of data. You implement a provider as one or more classes in an Android application, along with elements in the manifest file. One of your classes implements a subclass ContentProvider, which is…",
          "url":"guide/topics/providers/content-provider-creating.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Storage Access Framework",
          "titleFriendly":"",
          "summary":"Android 4.4 (API level 19) introduces the Storage Access Framework (SAF). The SAF makes it simple for users to browse and open documents, images, and other files across all of their their preferred document storage providers. A standard, easy-to-use UI…",
          "url":"guide/topics/providers/document-provider.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/providers/storage_datamodel.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Content Provider Basics",
          "titleFriendly":"",
          "summary":"A content provider manages access to a central repository of data. A provider is part of an Android application, which often provides its own UI for working with the data. However, content providers are primarily intended to be used by other applications…",
          "url":"guide/topics/providers/content-provider-basics.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Motion Sensors",
          "titleFriendly":"",
          "summary":"The Android platform provides several sensors that let you monitor the motion of a device. Two of these sensors are always hardware-based (the accelerometer and gyroscope), and three of these sensors can be either hardware-based or software-based (the…",
          "url":"guide/topics/sensors/sensors_motion.html",
          "group":"",
          "keywords": ["sensorevent","accelerometer","gyroscope","gravity","rotation","stepcounter"],
          "tags": ["sensorevent","accelerometer","gyroscope","gravity","rotation","stepcounter"],
          "image":"images/axis_globe.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Position Sensors",
          "titleFriendly":"",
          "summary":"The Android platform provides two sensors that let you determine the position of a device: the geomagnetic field sensor and the orientation sensor. The Android platform also provides a sensor that lets you determine how close the face of a device is to…",
          "url":"guide/topics/sensors/sensors_position.html",
          "group":"",
          "keywords": ["sensorevent","orientation","proximity"],
          "tags": ["sensorevent","orientation","proximity"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Location and Sensors APIs",
          "titleFriendly":"",
          "summary":"However, there’s a new wrinkle: recently, a few devices have shipped (see here and here) that run Android on screens that are naturally landscape in their orientation. That is, when held in the default position, the screens are wider than they are tall…",
          "url":"guide/topics/sensors/index.html",
          "group":"",
          "keywords": ["location","sensors"],
          "tags": ["location","sensors"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Sensors Overview",
          "titleFriendly":"",
          "summary":"Most Android-powered devices have built-in sensors that measure motion, orientation, and various environmental conditions. These sensors are capable of providing raw data with high precision and accuracy, and are useful if you want to monitor three-dimensional…",
          "url":"guide/topics/sensors/sensors_overview.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/axis_device.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Environment Sensors",
          "titleFriendly":"",
          "summary":"The Android platform provides four sensors that let you monitor various environmental properties. You can use these sensors to monitor relative ambient humidity, illuminance, ambient pressure, and ambient temperature near an Android-powered device. All…",
          "url":"guide/topics/sensors/sensors_environment.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Processes and Application Life Cycle",
          "titleFriendly":"",
          "summary":"In most cases, every Android application runs in its own Linux process. This process is created for the application when some of its code needs to be run, and will remain running until it is no longer needed and the system needs to reclaim its memory …",
          "url":"guide/topics/processes/process-lifecycle.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Canvas and Drawables",
          "titleFriendly":"",
          "summary":"The Android framework APIs provides a set of 2D-drawing APIs that allow you to render your own custom graphics onto a canvas or to modify existing Views to customize their look and feel. When drawing 2D graphics, you&#39;ll typically do so in one of two…",
          "url":"guide/topics/graphics/2d-graphics.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/ninepatch_raw.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Animation and Graphics",
          "titleFriendly":"",
          "summary":"Earlier this year, Android 3.0 launched with a new 2D rendering pipeline designed to support hardware acceleration on tablets. With this new pipeline, all drawing operations performed by the UI toolkit are carried out using the GPU. You’ll be happy to…",
          "url":"guide/topics/graphics/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Drawable Animation",
          "titleFriendly":"",
          "summary":"Drawable animation lets you load a series of Drawable resources one after another to create an animation. This is a traditional animation in the sense that it is created with a sequence of different images, played in order, like a roll of film. The AnimationDrawable…",
          "url":"guide/topics/graphics/drawable-animation.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Property Animation",
          "titleFriendly":"",
          "summary":"The property animation system is a robust framework that allows you to animate almost anything. You can define an animation to change any object property over time, regardless of whether it draws to the screen or not. A property animation changes a property…",
          "url":"guide/topics/graphics/prop-animation.html",
          "group":"",
          "keywords": ["valueanimator","objectanimator","layouttransition","viewpropertyanimator"],
          "tags": ["valueanimator","objectanimator","layouttransition","viewpropertyanimator"],
          "image":"images/animation/animation-linear.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Animation and Graphics Overview",
          "titleFriendly":"",
          "summary":"Android provides a variety of powerful APIs for applying animation to UI elements and drawing custom 2D and 3D graphics. The sections below provide an overview of the APIs and system capabilities available and help you decide with approach is best for…",
          "url":"guide/topics/graphics/overview.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Hardware Acceleration",
          "titleFriendly":"",
          "summary":"Beginning in Android 3.0 (API level 11), the Android 2D rendering pipeline supports hardware acceleration, meaning that all drawing operations that are performed on a View&#39;s canvas use the GPU. Because of the increased resources required to enable…",
          "url":"guide/topics/graphics/hardware-accel.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"View Animation",
          "titleFriendly":"",
          "summary":"You can use the view animation system to perform tweened animation on Views. Tween animation calculates the animation with information such as the start point, end point, size, rotation, and other common aspects of an animation. A tween animation can …",
          "url":"guide/topics/graphics/view-animation.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"OpenGL ES",
          "titleFriendly":"",
          "summary":"Android includes support for high performance 2D and 3D graphics with the Open Graphics Library (OpenGL®), specifically, the OpenGL ES API. OpenGL is a cross-platform graphics API that specifies a standard software interface for 3D graphics processing…",
          "url":"guide/topics/graphics/opengl.html",
          "group":"",
          "keywords": ["games"],
          "tags": ["games"],
          "image":"images/opengl/coordinates.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"App Install Location",
          "titleFriendly":"",
          "summary":"Beginning with API Level 8, you can allow your application to be installed on the external storage (for example, the device&#39;s SD card). This is an optional feature you can declare for your application with the preferExternal&quot; or &quot;auto&quot…",
          "url":"guide/topics/data/install-location.html",
          "group":"",
          "keywords": ["sdcard","external"],
          "tags": ["sdcard","external"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Data Backup",
          "titleFriendly":"",
          "summary":"Android&#39;s backup service allows you to copy your persistent application data to remote &quot;cloud&quot; storage, in order to provide a restore point for the application data and settings. If a user performs a factory reset or converts to a new Android-powered…",
          "url":"guide/topics/data/backup.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Data Storage",
          "titleFriendly":"",
          "summary":"This class covers different strategies for cloud enabled applications. It covers syncing data with the cloud using your own back-end web application, and backing up data using the cloud so that users can restore their data when installing your application…",
          "url":"guide/topics/data/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Storage Options",
          "titleFriendly":"",
          "summary":"Android provides several options for you to save persistent application data. The solution you choose depends on your specific needs, such as whether the data should be private to your application or accessible to other applications (and the user) and…",
          "url":"guide/topics/data/data-storage.html",
          "group":"",
          "keywords": ["database","sharedpreferences","sdcard"],
          "tags": ["database","sharedpreferences","sdcard"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Notifications",
          "titleFriendly":"",
          "summary":"A notification is a message you can display to the user outside of your application&#39;s normal UI. When you tell the system to issue a notification, it first appears as an icon in the notification area . To see the details of the notification, the user…",
          "url":"guide/topics/ui/notifiers/notifications.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/ui/notifications/notification_area.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Toasts",
          "titleFriendly":"",
          "summary":"A toast provides simple feedback about an operation in a small popup. It only fills the amount of space required for the message and the current activity remains visible and interactive. For example, navigating away from an email before you send it triggers…",
          "url":"guide/topics/ui/notifiers/toasts.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/toast.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Settings",
          "titleFriendly":"",
          "summary":"Applications often include settings that allow users to modify app features and behaviors. For example, some apps allow users to specify whether notifications are enabled or specify how often the application syncs data with the cloud. If you want to provide…",
          "url":"guide/topics/ui/settings.html",
          "group":"",
          "keywords": ["preference","preferenceactivity","preferencefragment"],
          "tags": ["preference","preferenceactivity","preferencefragment"],
          "image":"images/ui/settings/settings.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Layouts",
          "titleFriendly":"",
          "summary":"A layout defines the visual structure for a user interface, such as the UI for an activity or app widget . You can declare a layout in two ways: The Android framework gives you the flexibility to use either or both of these methods for declaring and managing…",
          "url":"guide/topics/ui/declaring-layout.html",
          "group":"",
          "keywords": ["view","viewgroup"],
          "tags": ["view","viewgroup"],
          "image":"images/layoutparams.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Drag and Drop",
          "titleFriendly":"",
          "summary":"With the Android drag&#47;drop framework, you can allow your users to move data from one View to another View in the current layout using a graphical drag and drop gesture. The framework includes a drag event class, drag listeners, and helper methods …",
          "url":"guide/topics/ui/drag-drop.html",
          "group":"",
          "keywords": ["clipdata","dragevent","onlongclicklistener"],
          "tags": ["clipdata","dragevent","onlongclicklistener"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Action Bar",
          "titleFriendly":"",
          "summary":"Action Bar The action bar is a window feature that identifies the user location, and provides user actions and navigation modes. Using the action bar offers your users a familiar interface across applications that the system gracefully adapts for different…",
          "url":"guide/topics/ui/actionbar.html",
          "group":"",
          "keywords": ["actionbar","menu","tabs"],
          "tags": ["actionbar","menu","tabs"],
          "image":"images/ui/actionbar@2x.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Styles and Themes",
          "titleFriendly":"",
          "summary":"A style is a collection of properties that specify the look and format for a View or window. A style can specify properties such as height, padding, font color, font size, background color, and much more. A style is defined in an XML resource that is …",
          "url":"guide/topics/ui/themes.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"User Interface",
          "titleFriendly":"",
          "summary":"As Ice Cream Sandwich rolls out to more devices, it’s important that you begin to migrate your designs to the action bar in order to promote a consistent Android user experience. Ice Cream Sandwich (ICS) sports two new widgets that have been designed …",
          "url":"guide/topics/ui/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Input Controls",
          "titleFriendly":"",
          "summary":"Input controls are the interactive components in your app&#39;s user interface. Android provides a wide variety of controls you can use in your UI, such as buttons, text fields, seek bars, checkboxes, zoom buttons, toggle buttons, and many more. Adding…",
          "url":"guide/topics/ui/controls.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/ui/ui-controls.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"List View",
          "titleFriendly":"",
          "summary":"ListView is a view group that displays a list of scrollable items. The list items are automatically inserted to the list using an Adapter that pulls content from a source such as an array or database query and converts each item result into a view that…",
          "url":"guide/topics/ui/layout/listview.html",
          "group":"",
          "keywords": ["listview"],
          "tags": ["listview"],
          "image":"images/ui/listview.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Linear Layout",
          "titleFriendly":"",
          "summary":"LinearLayout is a view group that aligns all children in a single direction, vertically or horizontally. You can specify the layout direction with the LinearLayout are stacked one after the other, so a vertical list will only have one child per row, no…",
          "url":"guide/topics/ui/layout/linear.html",
          "group":"",
          "keywords": ["linearlayout"],
          "tags": ["linearlayout"],
          "image":"images/ui/linearlayout.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Table",
          "titleFriendly":"",
          "summary":"TableLayout is a ViewGroup that displays child View elements in rows and columns. TableLayout positions its children into rows and columns. TableLayout containers do not display border lines for their rows, columns, or cells. The table will have as many…",
          "url":"guide/topics/ui/layout/grid.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/ui/gridlayout.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Grid View",
          "titleFriendly":"",
          "summary":"GridView is a ViewGroup that displays items in a two-dimensional, scrollable grid. The grid items are automatically inserted to the layout using a ListAdapter. For an introduction to how you can dynamically insert views using an adapter, read Building…",
          "url":"guide/topics/ui/layout/gridview.html",
          "group":"",
          "keywords": ["gridview"],
          "tags": ["gridview"],
          "image":"images/ui/gridview.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Relative Layout",
          "titleFriendly":"",
          "summary":"RelativeLayout is a view group that displays child views in relative positions. The position of each view can be specified as relative to sibling elements (such as to the left-of or below another view) or in positions relative to the parent RelativeLayout…",
          "url":"guide/topics/ui/layout/relative.html",
          "group":"",
          "keywords": ["relativelayout"],
          "tags": ["relativelayout"],
          "image":"images/ui/relativelayout.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"AdapterView",
          "titleFriendly":"",
          "summary":"Note that it is necessary to have the People._ID column in projection used with CursorAdapter or else you will get an exception. If, during the course of your application&#39;s life, you change the underlying data that is read by your Adapter, you should…",
          "url":"guide/topics/ui/binding.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"How Android Draws Views",
          "titleFriendly":"",
          "summary":"When an Activity receives focus, it will be requested to draw its layout. The Android framework will handle the procedure for drawing, but the Activity must provide the root node of its layout hierarchy. Drawing begins with the root node of the layout…",
          "url":"guide/topics/ui/how-android-draws.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Text Fields",
          "titleFriendly":"",
          "summary":"A text field allows the user to type text into your app. It can be either single line or multi-line. Touching a text field places the cursor and automatically displays the keyboard. In addition to typing, text fields allow for a variety of other activities…",
          "url":"guide/topics/ui/controls/text.html",
          "group":"",
          "keywords": ["edittext","autocompletetextview"],
          "tags": ["edittext","autocompletetextview"],
          "image":"images/ui/edittext-noextract.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Toggle Buttons",
          "titleFriendly":"",
          "summary":"A toggle button allows the user to change a setting between two states. You can add a basic toggle button to your layout with the ToggleButton object. Android 4.0 (API level 14) introduces another kind of toggle button called a switch that provides a …",
          "url":"guide/topics/ui/controls/togglebutton.html",
          "group":"",
          "keywords": ["switch","togglebutton"],
          "tags": ["switch","togglebutton"],
          "image":"images/ui/togglebutton.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Pickers",
          "titleFriendly":"",
          "summary":"Android provides controls for the user to pick a time or pick a date as ready-to-use dialogs. Each picker provides controls for selecting each part of the time (hour, minute, AM&#47;PM) or date (month, day, year). Using these pickers helps ensure that…",
          "url":"guide/topics/ui/controls/pickers.html",
          "group":"",
          "keywords": ["datepicker","timepicker"],
          "tags": ["datepicker","timepicker"],
          "image":"images/ui/pickers.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Checkboxes",
          "titleFriendly":"",
          "summary":"Checkboxes allow the user to select one or more options from a set. Typically, you should present each checkbox option in a vertical list. To create each checkbox option, create a CheckBox in your layout. Because a set of checkbox options allows the user…",
          "url":"guide/topics/ui/controls/checkbox.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/ui/checkboxes.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Radio Buttons",
          "titleFriendly":"",
          "summary":"Radio buttons allow the user to select one option from a set. You should use radio buttons for optional sets that are mutually exclusive if you think that the user needs to see all available options side-by-side. If it&#39;s not necessary to show all …",
          "url":"guide/topics/ui/controls/radiobutton.html",
          "group":"",
          "keywords": ["radiobutton","radiogroup"],
          "tags": ["radiobutton","radiogroup"],
          "image":"images/ui/radiobuttons.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Spinners",
          "titleFriendly":"",
          "summary":"Spinners provide a quick way to select one value from a set. In the default state, a spinner shows its currently selected value. Touching the spinner displays a dropdown menu with all other available values, from which the user can select a new one. You…",
          "url":"guide/topics/ui/controls/spinner.html",
          "group":"",
          "keywords": ["adapterview","spinneradapter"],
          "tags": ["adapterview","spinneradapter"],
          "image":"images/ui/spinner.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Buttons",
          "titleFriendly":"",
          "summary":"A button consists of text or an icon (or both text and an icon) that communicates what action occurs when the user touches it. Depending on whether you want a button with text, an icon, or both, you can create the button in your layout in three ways: …",
          "url":"guide/topics/ui/controls/button.html",
          "group":"",
          "keywords": ["button","imagebutton"],
          "tags": ["button","imagebutton"],
          "image":"images/ui/button-types.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"UI Overview",
          "titleFriendly":"",
          "summary":"All user interface elements in an Android app are built using View and ViewGroup objects. A View is an object that draws something on the screen that the user can interact with. A ViewGroup is an object that holds other View (and ViewGroup) objects in…",
          "url":"guide/topics/ui/overview.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/viewgroup.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Making Applications Accessible",
          "titleFriendly":"",
          "summary":"Applications built for Android are more accessible to users with visual, physical or age-related limitations when those users activate accessibility services and features on a device. These services make your application more accessible even if you do…",
          "url":"guide/topics/ui/accessibility/apps.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"calendar.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Accessibility",
          "titleFriendly":"",
          "summary":"How to make your apps accessible to users with visual, physical, or other limitations. Robust support will increase your app's user base.",
          "url":"guide/topics/ui/accessibility/index.html",
          "group":"",
          "keywords": ["accessibility"],
          "tags": ["accessibility"],
          "image":"design/media/accessibility_contentdesc.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Building Accessibility Services",
          "titleFriendly":"",
          "summary":"An accessibility service is an application that provides user interface enhancements to assist users with disabilities, or who may temporarily be unable to fully interact with a device. For example, users who are driving, taking care of a young child …",
          "url":"guide/topics/ui/accessibility/services.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Accessibility Developer Checklist",
          "titleFriendly":"",
          "summary":"Making an application accessible is about a deep commitment to usability, getting the details right and delighting your users. This document provides a checklist of accessibility requirements, recommendations and considerations to help you make sure your…",
          "url":"guide/topics/ui/accessibility/checklist.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Dialogs",
          "titleFriendly":"",
          "summary":"A dialog is a small window that prompts the user to make a decision or enter additional information. A dialog does not fill the screen and is normally used for modal events that require users to take an action before they can proceed. Dialog Design For…",
          "url":"guide/topics/ui/dialogs.html",
          "group":"",
          "keywords": ["alertdialog","dialogfragment"],
          "tags": ["alertdialog","dialogfragment"],
          "image":"images/ui/dialogs.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Input Events",
          "titleFriendly":"",
          "summary":"On Android, there&#39;s more than one way to intercept the events from a user&#39;s interaction with your application. When considering events within your user interface, the approach is to capture the events from the specific View object that the user…",
          "url":"guide/topics/ui/ui-events.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Menus",
          "titleFriendly":"",
          "summary":"Menus are a common user interface component in many types of applications. To provide a familiar and consistent user experience, you should use the Menu APIs to present user actions and other options in your activities. Beginning with Android 3.0 (API…",
          "url":"guide/topics/ui/menus.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/options_menu.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Custom Components",
          "titleFriendly":"",
          "summary":"Android offers a sophisticated and powerful componentized model for building your UI, based on the fundamental layout classes: View and ViewGroup. To start with, the platform includes a variety of prebuilt View and ViewGroup subclasses — called widgets…",
          "url":"guide/topics/ui/custom-components.html",
          "group":"",
          "keywords": ["view","widget"],
          "tags": ["view","widget"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Introduction to Android",
          "titleFriendly":"",
          "summary":"Android provides a rich application framework that allows you to build innovative apps and games for mobile devices in a Java language environment. The documents listed in the left navigation provide details about how to build apps using Android&#39;s…",
          "url":"guide/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Debugging Web Apps",
          "titleFriendly":"",
          "summary":"If you are testing your web app with a device running Android 4.4 or higher, you can remotely debug your web pages in WebView with Chrome Developer Tools, while continuing to support older versions of Android. For more information, see Remote Debugging…",
          "url":"guide/webapps/debugging.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Web Apps",
          "titleFriendly":"",
          "summary":"There are essentially two ways to deliver an application on Android: as a client-side application (developed using the Android SDK and installed on user devices in an APK) or as a web application (developed using web standards and accessed through a web…",
          "url":"guide/webapps/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/webapps/webapps.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Migrating to WebView in Android 4.4",
          "titleFriendly":"",
          "summary":"Android 4.4 (API level 19) introduces a new version of WebView that is based on Chromium . This change upgrades WebView performance and standards support for HTML5, CSS3, and JavaScript to match the latest web browsers. Any apps using WebView will inherit…",
          "url":"guide/webapps/migrating.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Best Practices for Web Apps",
          "titleFriendly":"",
          "summary":"Developing web pages and web applications for mobile devices presents a different set of challenges compared to developing a web page for the typical desktop web browser. To help you get started, the following is a list of practices you should follow …",
          "url":"guide/webapps/best-practices.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Building Web Apps in WebView",
          "titleFriendly":"",
          "summary":"If you want to deliver a web application (or just a web page) as a part of a client application, you can do it using WebView. The WebView class is an extension of Android&#39;s View class that allows you to display web pages as a part of your activity…",
          "url":"guide/webapps/webview.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Supporting Different Screens in Web Apps",
          "titleFriendly":"",
          "summary":"Because Android is available on devices with a variety of screen sizes and pixel densities, you should account for these factors in your web design so your web pages always appear at the appropriate size. When targeting your web pages for Android devices…",
          "url":"guide/webapps/targeting.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Activities",
          "titleFriendly":"",
          "summary":"An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map. Each activity is given a window in which to draw its user interface…",
          "url":"guide/components/activities.html",
          "group":"",
          "keywords": ["activity","intent"],
          "tags": ["activity","intent"],
          "image":"images/activity_lifecycle.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Intents and Intent Filters",
          "titleFriendly":"",
          "summary":"An Intent is a messaging object you can use to request an action from another app component . Although intents facilitate communication between components in several ways, there are three fundamental use-cases: An Activity represents a single screen in…",
          "url":"guide/components/intents-filters.html",
          "group":"",
          "keywords": ["intentfilter"],
          "tags": ["intentfilter"],
          "image":"images/components/intent-filters@2x.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"App Components",
          "titleFriendly":"",
          "summary":"Android's application framework lets you create rich and innovative apps using a set of reusable components. This section explains how you can build the components that define the building blocks of your app and how to connect them together using intents. ",
          "url":"guide/components/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/develop/app_components.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Common Intents",
          "titleFriendly":"",
          "summary":"An intent allows you to start an activity in another app by describing a simple action you&#39;d like to perform (such as &quot;view a map&quot; or &quot;take a picture&quot;) in an Intent object. This type of intent is called an implicit intent because…",
          "url":"guide/components/intents-common.html",
          "group":"",
          "keywords": ["intentfilter"],
          "tags": ["intentfilter"],
          "image":"guide/components/images/voice-icon.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Application Fundamentals",
          "titleFriendly":"",
          "summary":"Android apps are written in the Java programming language. The Android SDK tools compile your code—along with any data and resource files—into an APK: an Android package , which is an archive file with an apk suffix. One APK file contains all the contents…",
          "url":"guide/components/fundamentals.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Overview Screen",
          "titleFriendly":"",
          "summary":"The overview screen (also referred to as the recents screen, recent task list, or recent apps) is a system-level UI that lists recently accessed activities and tasks . The user can navigate through the list and select a task to resume, or the user can…",
          "url":"guide/components/recents.html",
          "group":"",
          "keywords": ["recents","overview"],
          "tags": ["recents","overview"],
          "image":"images/components/recents.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Android Interface Definition Language (AIDL)",
          "titleFriendly":"",
          "summary":"AIDL (Android Interface Definition Language) is similar to other IDLs you might have worked with. It allows you to define the programming interface that both the client and service agree upon in order to communicate with each other using interprocess …",
          "url":"guide/components/aidl.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Services",
          "titleFriendly":"",
          "summary":"A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application component can start a service and it will continue to run in the background even if the user switches…",
          "url":"guide/components/services.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/service_lifecycle.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Loaders",
          "titleFriendly":"",
          "summary":"Introduced in Android 3.0, loaders make it easy to asynchronously load data in an activity or fragment. Loaders have these characteristics: There are multiple classes and interfaces that may be involved in using loaders in an application. They are summarized…",
          "url":"guide/components/loaders.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Fragments",
          "titleFriendly":"",
          "summary":"A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section…",
          "url":"guide/components/fragments.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/fundamentals/fragments.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Bound Services",
          "titleFriendly":"",
          "summary":"A bound service is the server in a client-server interface. A bound service allows components (such as activities) to bind to the service, send requests, receive responses, and even perform interprocess communication (IPC). A bound service typically lives…",
          "url":"guide/components/bound-services.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/fundamentals/service_binding_tree_lifecycle.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Processes and Threads",
          "titleFriendly":"",
          "summary":"When an application component starts and the application does not have any other components running, the Android system starts a new Linux process for the application with a single thread of execution. By default, all components of the same application…",
          "url":"guide/components/processes-and-threads.html",
          "group":"",
          "keywords": ["lifecycle","background"],
          "tags": ["lifecycle","background"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Tasks and Back Stack",
          "titleFriendly":"",
          "summary":"An application usually contains multiple activities . Each activity should be designed around a specific kind of action the user can perform and can start other activities. For example, an email application might have one activity to show a list of new…",
          "url":"guide/components/tasks-and-back-stack.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/fundamentals/diagram_backstack.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Appendix",
          "titleFriendly":"",
          "summary":"",
          "url":"guide/appendix/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please follow this link .…",
          "url":"guide/appendix/faq/troubleshooting.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please follow this link .…",
          "url":"guide/appendix/faq/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please follow this link .…",
          "url":"guide/appendix/faq/security.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please follow this link .…",
          "url":"guide/appendix/faq/licensingandoss.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please follow this link .…",
          "url":"guide/appendix/faq/commontasks.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please follow this link .…",
          "url":"guide/appendix/faq/framework.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Supported Media Formats",
          "titleFriendly":"",
          "summary":"This document describes the media codec, container, and network protocol support provided by the Android platform. As an application developer, you are free to make use of any media codec that is available on any Android-powered device, including those…",
          "url":"guide/appendix/media-formats.html",
          "group":"",
          "keywords": ["video","audio","mpeg","mp4","m4a","mp3","3gp","3gpp","flac","wave","wav"],
          "tags": ["video","audio","mpeg","mp4","m4a","mp3","3gp","3gpp","flac","wave","wav"],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Supporting Multiple Screens",
          "titleFriendly":"",
          "summary":"Managing UIs for the best display on multiple screen sizes.",
          "url":"guide/practices/screens_support.html",
          "group":"",
          "keywords": [],
          "tags": ["multiplescreens"],
          "image":"images/screens_support/screens-ranges.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Supporting Tablets and Handsets",
          "titleFriendly":"",
          "summary":"The Android platform runs on a variety of screen sizes and the system gracefully resizes your application&#39;s UI to fit each one. Typically, all you need to do is design your UI to be flexible and optimize some elements for different sizes by providing…",
          "url":"guide/practices/tablets-and-handsets.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/fundamentals/fragments.png",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Verifying App Behavior on the Android Runtime (ART)",
          "titleFriendly":"",
          "summary":"With Android 4.4, we are beginning to roll out a new Android runtime, ART . 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&#39;s new features…",
          "url":"guide/practices/verifying-apps-art.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Application Design Goals",
          "titleFriendly":"",
          "summary":"When learning how to build applications on a new platform, you first learn what APIs are available and how to use them. Later, you learn the nuances of the platform. Put another way: first you learn how you can build applications; later, you learn how…",
          "url":"guide/practices/app-design/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Designing for Seamlessness",
          "titleFriendly":"",
          "summary":"Even if your application is fast and responsive, certain design decisions can still cause problems for users — because of unplanned interactions with other applications or dialogs, inadvertent loss of data, unintended blocking, and so on. To avoid these…",
          "url":"guide/practices/app-design/seamlessness.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }, 
        {
          "title":"Resources",
          "titleFriendly":"",
          "summary":"These resources will help you get started with Android and Google Play. 。",
          "url":"resources.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"guide"
        }
  ];
  
  var NDK_RESOURCES = [
        {
          "title":"Sample: hello-jni",
          "titleFriendly":"",
          "summary":"This sample guides you through HelloJNI, a minimal application built with the NDK. This sample is in the so, once the build system adds the lib prefix and the so extension. For more information about what the mk file does, and how to use it, see Android.mk…",
          "url":"ndk/samples/sample_hellojni.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Samples: Overview",
          "titleFriendly":"",
          "summary":"Welcome to the NDK samples area. Here, you can download a variety of sample apps to help deepen your understanding the NDK. From this page, you can download samples that provide a look at the NDK in action. A few of the topics covered are: Download ndk-samples.zip…",
          "url":"ndk/samples/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Sample: Teapot",
          "titleFriendly":"",
          "summary":"The Teapot sample is located under in the ndk_helper helper class, a collection of native helper functions required for implementing games and similar applications as native applications. This class provides: The activity declaration here is not NativeActivity…",
          "url":"ndk/samples/sample_teapot.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Sample: native-activity",
          "titleFriendly":"",
          "summary":"The native-activity sample resides under the NDK installation root, in so file. The app itself simply renders a color onto the entire screen, and then changes the color partly in response to movement that it detects. An app with only native code must …",
          "url":"ndk/samples/sample_na.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Samples: Walkthroughs",
          "titleFriendly":"",
          "summary":"This section provides detailed walkthroughs of several key samples. The samples are as follows:…",
          "url":"ndk/samples/walkthroughs.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"The cpufeatures Library",
          "titleFriendly":"",
          "summary":"The NDK provides a small library named cpufeatures that your app can use at runtime to detect the target device&#39;s CPU family and the optional features it supports. It is designed to work as-is on all official Android platform versions. The cpufeatures…",
          "url":"ndk/guides/cpu-features.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Application.mk",
          "titleFriendly":"",
          "summary":"This document explains the mk build file, which describes the native modules that your app requires. A module can be a static library, a shared library, or an executable. We recommend that you read the Concepts and Android.mk pages before this one. Doing…",
          "url":"ndk/guides/application_mk.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Concepts",
          "titleFriendly":"",
          "summary":"This guide assumes that you are: This section provides a high-level explanation of how the NDK works. The Android NDK is a set of tools allowing you to embed C or C++ (“native code”) into your Android apps. The ability to use native code in Android apps…",
          "url":"ndk/guides/concepts.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Using Prebuilt Libraries",
          "titleFriendly":"",
          "summary":"The NDK supports the use of prebuilt libraries, both static and shared. There are two principal use cases for this functionality: This page explains how to use prebuilt libraries. You must declare each prebuilt library you use as a single independent …",
          "url":"ndk/guides/prebuilts.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"ABI Management",
          "titleFriendly":"",
          "summary":"Different Android handsets use different CPUs, which in turn support different instruction sets. Each combination of CPU and instruction sets has its own Application Binary Interface, or ABI . The ABI defines, with great precision, how an application&…",
          "url":"ndk/guides/abis.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Getting Started with the NDK",
          "titleFriendly":"",
          "summary":"The Native Development Kit (NDK) is a set of tools that allow you to leverage C and C++ code in your Android apps. You can use it either to build from your own source code, or to take advantage of existing prebuilt libraries. The NDK is not appropriate…",
          "url":"ndk/guides/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"NEON Support",
          "titleFriendly":"",
          "summary":"The NDK supports the ARM Advanced SIMD, an optional instruction-set extension of the ARMv7 spec. NEON provides a set of scalar&#47;vector instructions and registers (shared with the FPU) comparable to MMX&#47;SSE&#47;3DNow! in the x86 world. To function…",
          "url":"ndk/guides/cpu-arm-neon.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"ndk-stack",
          "titleFriendly":"",
          "summary":"The logcat . It also replaces any address inside a shared library with the corresponding armeabi ABI. There are two ways to use the tool. You can feed the logcat text as direct input to the program. For example: You can also use the {@code -dump} option…",
          "url":"ndk/guides/ndk-stack.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"MIPS Support",
          "titleFriendly":"",
          "summary":"The NDK supports the mips ABI, which allows native code to run on Android-based devices that have CPUs supporting the MIPS32 instruction set. To generate MIPS machine code, include mips in your mk file&#39;s APP_ABI definition. For example: For more information…",
          "url":"ndk/guides/mips.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"ndk-gdb",
          "titleFriendly":"",
          "summary":"The NDK includes a helper shell script named c (for &quot;continue&quot;) to resume execution. For a comprehensive list of commands, see the GDB manual. Note that when you quit the GDB prompt, the application process that you&#39;re debugging stops. This…",
          "url":"ndk/guides/ndk-gdb.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Using Existing Libraries",
          "titleFriendly":"",
          "summary":"This section discusses the use of existing libraries–both your own, and those that the NDK provides. It begins by telling you how to use your own prebuilt libraries . Then, it explains the C++ helper runtimes available with the NDK, and how to use them…",
          "url":"ndk/guides/libs.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Sample Walkthroughs",
          "titleFriendly":"",
          "summary":"This section explains several of the sample apps provided with the NDK. It assumes that you already have a working knowledge of programming in Java and native code, and focuses on issues particular to working with the NDK. It discusses the following samples…",
          "url":"ndk/guides/sample.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"CPUs and Architectures",
          "titleFriendly":"",
          "summary":"When you&#39;re working with native code, hardware matters. The NDK lets you ensure you&#39;re compiling for the right architectures and CPUs by giving you a variety of ABIs from which to choose. This section begins by explaining how to target specific…",
          "url":"ndk/guides/arch.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Support for 64-bit x86",
          "titleFriendly":"",
          "summary":"The Android NDK supports the x86_64 ABI. This ABI allows native code to run on Android-based devices using CPUs that support the 64-bit x86 instruction set. To generate 64-bit machine code for x86, add x86_64 to the APP_ABI definition in your mk file.…",
          "url":"ndk/guides/x86-64.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"C++ Library Support",
          "titleFriendly":"",
          "summary":"The Android platform provides a very minimal C++ runtime support library (APP_STL variable in your mk file to specify the runtime you wish to use. Use the values in the &quot;Name&quot; column in Table 1 as your setting. For example: You may only select…",
          "url":"ndk/guides/cpp-support.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Setup",
          "titleFriendly":"",
          "summary":"This document explains how to: This document assumes that you are already familiar with Java-based Android development. For more information on that topic, see the Android developer site . To install and configure the NDK, follow these steps: Eclipse …",
          "url":"ndk/guides/setup.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"./images/verification_screen.png",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Standalone Toolchain",
          "titleFriendly":"",
          "summary":"You can use the toolchains provided with the Android NDK independently, or as plug-ins with an existing IDE, such as Eclipse. This flexibility can be useful if you already have your own build system, and only need the ability to invoke the cross-compiler…",
          "url":"ndk/guides/standalone_toolchain.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Debugging Your Project",
          "titleFriendly":"",
          "summary":"After you&#39;ve built your app, you&#39;ll probably need to debug it. This section introduces you to the NDK&#39;s debugging tools. It begins by telling you how to use the {@code ndk-gdb} tool to debug your code. It closes with an explanation of the …",
          "url":"ndk/guides/debug.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"x86 Support",
          "titleFriendly":"",
          "summary":"The NDK includes support for the x86 ABI, which allows native code to run on Android-based devices running on CPUs supporting the IA-32 instruction set. To generate x86 machine code, add x86 to the APP_ABI definition in your mk file. For example: The …",
          "url":"ndk/guides/x86.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Android NDK Native APIs",
          "titleFriendly":"",
          "summary":"The Android NDK provides a set of native headers and shared library files that has gradually increased with successive releases of new Android API levels. This page explains these headers and files, and maps them to specific Android API levels . There…",
          "url":"ndk/guides/stable_apis.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"ndk-build",
          "titleFriendly":"",
          "summary":"The make command that runs the NDK build scripts. Combine ndk-build and options in the form ndk-build &lt;option&gt; . For example: The following options are available: To build from Eclipse, make sure that you have configured it as described in Setup…",
          "url":"ndk/guides/ndk-build.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"./images/NDK_build_string.png",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Building Your Project",
          "titleFriendly":"",
          "summary":"One of the NDK&#39;s core purposes is allowing you to build C and C++ source code into shared libraries that you can use in your app. This section explains how to build native binaries for use in your Android app. It begins by explaining the mk file, …",
          "url":"ndk/guides/build.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Android.mk",
          "titleFriendly":"",
          "summary":"This page describes the syntax of the mk build file, which glues your C and C++ source files to the Android NDK. The mk file resides in a subdirectory of your project&#39;s mk file is useful for defining project-wide settings that mk , the build system…",
          "url":"ndk/guides/android_mk.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Android NDK",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/index.html",
          "group":"",
          "keywords": ["ndk","native","c","c++"],
          "tags": ["ndk","native","c++"],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Globals",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/globals_defs.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"include Directory Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/dir_d44c64559bbebec7f509842c48db8b23.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"ASensorVector Struct Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/struct_a_sensor_vector.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"AHeartRateEvent Struct Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/struct_a_heart_rate_event.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"native_window_jni.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/native__window__jni_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Native Activity",
          "titleFriendly":"",
          "summary":"This structure defines the native side of an android.app.NativeActivity. It is created by the framework, and handed to the application&#39;s native code as it is being launched. This is the function that must be in the native code to instantiate the application…",
          "url":"ndk/reference/group___native_activity.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"sensor.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/sensor_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"ASensorEvent Struct Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/struct_a_sensor_event.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"ANativeActivityCallbacks Struct Reference",
          "titleFriendly":"",
          "summary":"#include &lt;native_activity.h&gt; These are the callbacks the framework makes into a native application. All of these callbacks happen on the main thread of the application. By default, all callbacks are NULL; set to a pointer to your own function to…",
          "url":"ndk/reference/struct_a_native_activity_callbacks.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"API Reference",
          "titleFriendly":"",
          "summary":"The API reference for the NDK includes documentation for the base set of native headers that the NDK provides for Android. These headers, and their associated libraries, expose a variety of features otherwise only accessible via the Android framework.…",
          "url":"ndk/reference/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"AUncalibratedEvent Struct Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/struct_a_uncalibrated_event.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Looper",
          "titleFriendly":"",
          "summary":"ALooper A looper is the state tracking an event loop for a thread. Loopers do not define event structures or other such things; rather they are a lower-level facility to attach one or more discrete objects listening for an event. An &quot;event&quot; …",
          "url":"ndk/reference/group___looper.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"window.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/window_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Globals",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/globals_eval_w.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Sensor",
          "titleFriendly":"",
          "summary":"Maximum magnetic field on Earth&#39;s surface in uT Minimum magnetic field on Earth&#39;s surface in uT Earth&#39;s gravity in m&#47;s^2 ASensor is an opaque type that provides information about an hardware sensors. A ASensor pointer can be obtained using…",
          "url":"ndk/reference/group___sensor.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"configuration.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/configuration_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Globals",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/globals_eval.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"File List",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/files.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"ftv2node.png",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Modules",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/modules.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"ftv2node.png",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Globals",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/globals_func.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Data Structures",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/annotated.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"ftv2node.png",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"AndroidBitmapInfo Struct Reference",
          "titleFriendly":"",
          "summary":"#include &lt;bitmap.h&gt; Bitmap info, see AndroidBitmap_getInfo() . Unused. The bitmap pixel format. See AndroidBitmapFormat The bitmap height in pixels. The number of byte per row. The bitmap width in pixels.…",
          "url":"ndk/reference/struct_android_bitmap_info.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"storage_manager.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/storage__manager_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"keycodes.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/keycodes_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Globals",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/globals_w.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Globals",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/globals_vars.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Configuration",
          "titleFriendly":"",
          "summary":"AConfiguration is an opaque type used to get and set various subsystem configurations. A AConfiguration pointer can be obtained using: Define flags and constants for various subsystem configurations. Orientation: not specified. Orientation: value corresponding…",
          "url":"ndk/reference/group___configuration.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"ANativeWindow_Buffer Struct Reference",
          "titleFriendly":"",
          "summary":"#include &lt;native_window.h&gt; ANativeWindow is a struct that represents a windows buffer. A pointer can be obtained using ANativeWindow_lock() .…",
          "url":"ndk/reference/struct_a_native_window___buffer.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"native_window.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/native__window_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"asset_manager.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/asset__manager_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Globals",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/globals_enum.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"obb.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/obb_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"native_activity.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/native__activity_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"ANativeActivity Struct Reference",
          "titleFriendly":"",
          "summary":"#include &lt;native_activity.h&gt; This structure defines the native side of an android.app.NativeActivity. It is created by the framework, and handed to the application&#39;s native code as it is being launched. Pointer to the Asset Manager instance …",
          "url":"ndk/reference/struct_a_native_activity.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Storage",
          "titleFriendly":"",
          "summary":"AObbInfo is an opaque type representing information for obb storage. AStorageManager manages application OBB storage, a pointer can be obtained with AStorageManager_new() . Callback function for asynchronous calls made on OBB files. &quot;state&quot; …",
          "url":"ndk/reference/group___storage.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Bitmap",
          "titleFriendly":"",
          "summary":"Backward compatibility: this macro used to be misspelled. AndroidBitmap functions result code. Operation was successful. Bad parameter. JNI exception occured. Allocation failed. Bitmap pixel format. No format. Red: 8 bits, Green: 8 bits, Blue: 8 bits,…",
          "url":"ndk/reference/group___bitmap.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"rect.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/rect_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Input",
          "titleFriendly":"",
          "summary":"Bit shift for the action bits holding the pointer index as defined by AMOTION_EVENT_ACTION_POINTER_INDEX_MASK. Input events. Input events are opaque structures. Use the provided accessors functions to read their properties. Input queue An input queue …",
          "url":"ndk/reference/group___input.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"bitmap.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/bitmap_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Data Fields",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/functions.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"looper.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/looper_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Globals",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/globals_type.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"input.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/input_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"AMetaDataEvent Struct Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/struct_a_meta_data_event.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"asset_manager_jni.h File Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/asset__manager__jni_8h.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Deprecated List",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/deprecated.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"ARect Struct Reference",
          "titleFriendly":"",
          "summary":"#include &lt;rect.h&gt; ARect is a struct that represents a rectangular window area. It is used with ANativeActivityCallbacks::onContentRectChanged event callback and ANativeWindow_lock() function. bottom position left position left position top position…",
          "url":"ndk/reference/struct_a_rect.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"android Directory Reference",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/dir_035c76f7235f5f563d38e3ab90cb9716.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Related Pages",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/pages.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"ftv2lastnode.png",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Data Fields - Variables",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/functions_vars.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Globals",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/globals.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Asset",
          "titleFriendly":"",
          "summary":"AAsset provides access to a read-only asset. AAsset objects are NOT thread-safe, and should not be shared across threads. AAssetDir provides access to a chunk of the asset hierarchy as if it were a single directory. The contents are populated by the AAssetManager…",
          "url":"ndk/reference/group___asset.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"Data Structure Index",
          "titleFriendly":"",
          "summary":"",
          "url":"ndk/reference/classes.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"NDK Downloads",
          "titleFriendly":"",
          "summary":"Before installing the Android NDK, you must agree to the following terms and conditions. I have read and agree with the above terms and conditions Select, from the table below, the NDK package for your development platform. For information about the changes…",
          "url":"ndk/downloads/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }, 
        {
          "title":"NDK Revision History",
          "titleFriendly":"",
          "summary":"This page provides information on previous releases of the NDK, enumerating the changes that took place in each new version. Android NDK, Revision 10d (December 2014) Android NDK, Revision 10c (October 2014) For more detailed information, see Important…",
          "url":"ndk/downloads/revision_history.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"ndk"
        }
  ];
  
  var PREVIEW_RESOURCES = [
        {
          "title":"Developer Preview Archive",
          "titleFriendly":"",
          "summary":"I have read and agree with the above terms and conditions The Android M Preview SDK includes development tools, Android system files, and library files to help you test your app and the new APIs coming in the next release of the platform. This document…",
          "url":"preview/download_mp1.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/card-download_16-9_2x.png",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"Android M Developer Preview",
          "titleFriendly":"",
          "summary":"",
          "url":"preview/index.html",
          "group":"",
          "keywords": ["preview"],
          "tags": ["preview","mpreview","androidm"],
          "image":"images/home/devices-hero_620px_2x.png",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"Downloads",
          "titleFriendly":"",
          "summary":"I have read and agree with the above terms and conditions The Android M Preview SDK includes development tools, Android system images, and library files to help you test your app and the new APIs coming in the next release of the platform. This document…",
          "url":"preview/download.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/card-download_16-9_2x.png",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"License Agreement",
          "titleFriendly":"",
          "summary":"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…",
          "url":"preview/license.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"Testing Guide",
          "titleFriendly":"",
          "summary":"The Android M Developer Preview gives you an opportunity to ensure your apps work with the next version of the platform. This preview includes a number of APIs and behavior changes that can impact your app, as described in the API Overview and Behavior…",
          "url":"preview/testing/guide.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/card-build_16x9_2x.png",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"Testing Display Performance",
          "titleFriendly":"",
          "summary":"User interface (UI) performance testing ensures that your app not only meets its functional requirements, but that user interactions with your app are buttery smooth, running at a consistent 60 frames per second ( why 60fps? ), without any dropped or …",
          "url":"preview/testing/performance.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/card-test-performance_2x.png",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"Behavior Changes",
          "titleFriendly":"",
          "summary":"Along with new features and capabilities, the M Developer Preview includes a variety of system changes and API behavior changes. This document highlights some of the key changes that you should understand and account for in your apps. If you have previously…",
          "url":"preview/behavior-changes.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"preview/images/text-selection.gif",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"Permissions",
          "titleFriendly":"",
          "summary":"Google I&#47;O 2015—Android M Permissions: Best Practices for Developers The M Developer Preview introduces a new app permissions model which streamlines the process for users to install and upgrade apps. If an app running on the M Preview supports the…",
          "url":"preview/features/runtime-permissions.html",
          "group":"",
          "keywords": ["previewresources","androidm"],
          "tags": ["previewresources","androidm"],
          "image":"images/permissions_check.png",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"App Links",
          "titleFriendly":"",
          "summary":"The Android Intent system is a flexible mechanism to enable apps to handle content and requests. Multiple apps may declare matching URI patterns in their intent filters. When a user clicks on a web link that does not have a default launch handler, the…",
          "url":"preview/features/app-linking.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/card-app-linking_2x.png",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"Samples",
          "titleFriendly":"",
          "summary":"The following code samples are provided for the M Developer Preview. To download the samples in Android Studio, select the File &gt; Import Samples menu option. Android M changes the way system permissions work. Users are asked to approve permission requests…",
          "url":"preview/samples.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/samples-new_2x.png",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"Program Overview",
          "titleFriendly":"",
          "summary":"Welcome to the Android M Developer Preview, a program that gives you everything you need to test and optimize your apps for the next version of Android.",
          "url":"preview/overview.html",
          "group":"",
          "keywords": ["preview","developer","android"],
          "tags": ["preview","developer","android"],
          "image":"images/cards/card-preview_16-9_2x.png",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"Auto Backup for Apps",
          "titleFriendly":"",
          "summary":"Users often invest significant time and effort creating data and setting preferences within apps. Preserving that data for users if they replace a broken device or upgrade to a new one is an important part of ensuring a great user experience. Devices …",
          "url":"preview/backup/index.html",
          "group":"",
          "keywords": ["backup","previewresources","androidm"],
          "tags": ["backup","previewresources","androidm"],
          "image":"images/cards/card-auto-backup_2x.png",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"API Overview",
          "titleFriendly":"",
          "summary":"The M 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. The M Developer Preview is intended…",
          "url":"preview/api-overview.html",
          "group":"",
          "keywords": ["previewresources","androidm"],
          "tags": ["previewresources","androidm"],
          "image":"images/cards/card-api-overview_16-9_2x.png",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"Downloads",
          "titleFriendly":"",
          "summary":"I have read and agree with the above terms and conditions The Android M Preview SDK includes development tools, Android system files, and library files to help you test your app and the new APIs coming in the next release of the platform. This document…",
          "url":"preview/download_mp2.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/card-download_16-9_2x.png",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"Support and Release Notes",
          "titleFriendly":"",
          "summary":"Includes final SDK and near-final system images Two primary support channels are available to you when developing and testing with the Android M Developer Preview. If you&#39;ve encountered bugs or have feedback about the M Developer Preview, you can …",
          "url":"preview/support.html",
          "group":"",
          "keywords": ["preview","developer preview"],
          "tags": ["preview","developerpreview"],
          "image":"images/cards/card-support_16-9_2x.png",
          "lang":"en",
          "type":"preview"
        }, 
        {
          "title":"Set Up the Preview SDK",
          "titleFriendly":"",
          "summary":"The M Developer Preview SDK is available from the Android SDK Manager. This document assumes that you are familiar with Android app development, such as using the Android SDK Manager and creating projects. If you are new to Android, see Building Your …",
          "url":"preview/setup-sdk.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/card-set-up_16-9_2x.png",
          "lang":"en",
          "type":"preview"
        }
  ];
  
  var SAMPLES_RESOURCES = [
        {
          "title":"Views",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/views.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"What&#39;s New",
          "titleFriendly":"",
          "summary":"The following code samples were recently published. You can download them in the Android SDK Manager under the SDK Samples component for API 21. This sample is a simple audio media app that exposes its media library and provides metadata and playback …",
          "url":"samples/new/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/samples-new_2x.png",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"Connectivity",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/connectivity.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"Admin",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/admin.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"Input",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/input.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"Renderscript",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/renderscript.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"Wearable",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/wearable.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"Sensors",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/sensors.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"Samples",
          "titleFriendly":"",
          "summary":"Welcome to code samples for Android developers. Here you can browse sample code and learn how to build different components for your applications. Use the categories on the left to browse the available samples. Each sample is a fully functioning Android…",
          "url":"samples/index.html",
          "group":"",
          "keywords": ["examples","code"],
          "tags": ["examples","code"],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"Security",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/security.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"Background",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/background.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"Media",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/media.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"UI",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/ui.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"System",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/system.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"Testing",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/testing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"Content",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/content.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }, 
        {
          "title":"Notification",
          "titleFriendly":"",
          "summary":"",
          "url":"samples/notification.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"samples"
        }
  ];
  
  var TOOLS_RESOURCES = [
        {
          "title":"Extras",
          "titleFriendly":"",
          "summary":"SDK extras add functionality to your development environment. You can download all of the SDK extras into your development environment using the SDK Manager.…",
          "url":"tools/extras/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"OEM USB Drivers",
          "titleFriendly":"",
          "summary":"If you are developing on Windows and would like to connect an Android-powered device to test your applications, then you need to install the appropriate USB driver. This document provides links to the web sites for several original equipment manufacturers…",
          "url":"tools/extras/oem-usb.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Introduction",
          "titleFriendly":"",
          "summary":"Developing applications for Android devices is facilitated by a group of tools that are provided with the SDK. You can access these tools through an Eclipse plugin called ADT (Android Development Tools) or from the command line. Developing with Eclipse…",
          "url":"tools/workflow.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/developing/developing_overview.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Managing Projects Overview",
          "titleFriendly":"",
          "summary":"An Android project contains everything that defines your Android app, from app source code to build configurations and test code. The SDK tools require that your projects follow a specific structure so it can compile and package your application correctly…",
          "url":"tools/projects/index.html",
          "group":"",
          "keywords": ["project","mipmap"],
          "tags": ["project","mipmap"],
          "image":"images/tools/studio-androidtest-folder.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Using Code Templates",
          "titleFriendly":"",
          "summary":"Quickly create Android app projects with various UI or functional components. ",
          "url":"tools/projects/templates.html",
          "group":"",
          "keywords": ["studio","templates","firstapp"],
          "tags": ["studio","templates","firstapp"],
          "image":"images/cards/card-using-code-templates_16x9_2x.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Managing Projects from the Command Line",
          "titleFriendly":"",
          "summary":"The android tool provides you with commands to create all three types of projects. An Android project contains all of the files and resources that are needed to build a project into an .apk file for installation. To create an Android project, you must…",
          "url":"tools/projects/projects-cmdline.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Managing Projects from Eclipse with ADT",
          "titleFriendly":"",
          "summary":"Eclipse and the ADT plugin provide GUIs and wizards to create all three types of projects (Android project, Library project, and Test project): The ADT plugin provides a New Project Wizard that you can use to quickly create a new Android project (or a…",
          "url":"tools/projects/projects-eclipse.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/eclipse-new.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"SDK Platforms Release Notes",
          "titleFriendly":"",
          "summary":"This document provides release information about the SDK Platform packages required for app development. If you want details about the features and APIs added in each Android version, instead read the highlights in the About section. In order to compile…",
          "url":"tools/revisions/platforms.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Android Plugin for Gradle Release Notes",
          "titleFriendly":"",
          "summary":"The Android build system uses the Android Plugin for Gradle to support building Android applications with the Gradle build toolkit. The plugin runs independent of Android Studio so the plugin and the Gradle build system can be updated independently of…",
          "url":"tools/revisions/gradle-plugin.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"SDK Build Tools Release Notes",
          "titleFriendly":"",
          "summary":"Build Tools is a component of the Android SDK required for building Android application code. The latest version of these tools is included in the SDK starter package and installed in the &lt;sdk&gt;&#47;build-tools&#47; directory. You should always keep…",
          "url":"tools/revisions/build-tools.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Revisions",
          "titleFriendly":"",
          "summary":"The Android SDK is composed of individual packages that may undergo an update at their own schedule, so some have their own set of release notes. You can find information about some of the packages in this section, including the core SDK Tools and the…",
          "url":"tools/revisions/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Android Studio Release Notes",
          "titleFriendly":"",
          "summary":"Android Studio is the official IDE for Android development, and with a single download includes everything you need to begin developing Android apps: For an introduction to Android Studio, read the Android Studio guide. Periodic updates are pushed to …",
          "url":"tools/revisions/studio.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Profiling GPU Rendering Walkthrough",
          "titleFriendly":"",
          "summary":"Overlay a graph on your device, showing how long it takes to render UI elements relative to the 16-ms-per-frame benchmark.",
          "url":"tools/performance/profile-gpu-rendering/index.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools","rendering","gpu"],
          "tags": ["android","performance","profiling","tools","rendering","gpu"],
          "image":"tools/performance/thumbnails/tools_profile_gpu_rendering.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Memory Profilers",
          "titleFriendly":"",
          "summary":"Heap Viewer, Memory Monitor, and Allocation Tracker are complementary tools that visualize the memory your app uses.",
          "url":"tools/performance/comparison.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools","memory","memoryleaks","garbagecollection"],
          "tags": ["android","performance","profiling","tools","memory","memoryleaks","garbagecollection"],
          "image":"tools/performance/thumbnails/tools_memory_monitor.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Importing Legacy Apps into Android Studio",
          "titleFriendly":"",
          "summary":"Required changes when importing legacy apps into Android Studio.",
          "url":"tools/performance/importing-legacy-apps.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools"],
          "tags": ["android","performance","profiling","tools"],
          "image":"images/tools/performance/import_image001.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Hierarchy Viewer Walkthrough",
          "titleFriendly":"",
          "summary":"Visualize your app's view hierarchy to help you simplify your layouts.",
          "url":"tools/performance/hierarchy-viewer/index.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools","rendering","hierarchyviewer"],
          "tags": ["android","performance","profiling","tools","rendering","hierarchyviewer"],
          "image":"tools/performance/thumbnails/tools_hierarchy_viewer.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Profiling with Hierarchy Viewer",
          "titleFriendly":"",
          "summary":"Profile the relative rendering speed for each view.",
          "url":"tools/performance/hierarchy-viewer/profiling.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools","rendering","hierarchyviewer"],
          "tags": ["android","performance","profiling","tools","rendering","hierarchyviewer"],
          "image":"tools/performance/thumbnails/tools_hierarchy_viewer_profiling.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Device Setup for Hierarchy Viewer",
          "titleFriendly":"",
          "summary":"Set up your mobile device to work with Hierarchy Viewer.",
          "url":"tools/performance/hierarchy-viewer/setup.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools","rendering","hierarchyviewer"],
          "tags": ["android","performance","profiling","tools","rendering","hierarchyviewer"],
          "image":"tools/performance/thumbnails/tools_hierarchy_viewer.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Performance Profiling Tools",
          "titleFriendly":"",
          "summary":"Android Studio profiling tools for evaluating your app's performance.",
          "url":"tools/performance/index.html",
          "group":"",
          "keywords": ["android","develop","performance","profiling","tools gather"],
          "tags": ["android","develop","performance","profiling","tools","gather"],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Traceview Walkthrough",
          "titleFriendly":"",
          "summary":"Log method execution over time and inspect execution data, per-thread timelines, and call stacks to track down performance issues in your source code.",
          "url":"tools/performance/traceview/index.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools","compute","traceview"],
          "tags": ["android","performance","profiling","tools","compute","traceview"],
          "image":"tools/performance/thumbnails/tools_traceview.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Memory Monitor Walkthrough",
          "titleFriendly":"",
          "summary":"Graph memory usage and garbage collection events for your app in real-time.",
          "url":"tools/performance/memory-monitor/index.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools","memory","memoryleaks","garbagecollection","memorymonitor"],
          "tags": ["android","performance","profiling","tools","memory","memoryleaks","garbagecollection","memorymonitor"],
          "image":"tools/performance/thumbnails/tools_memory_monitor.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Allocation Tracker Walkthrough",
          "titleFriendly":"",
          "summary":"Record you app's memory allocations with their call stack to identify code that allocates and frees objects unnecessarily.",
          "url":"tools/performance/allocation-tracker/index.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools","memoryleaks","memoryheap"],
          "tags": ["android","performance","profiling","tools","memoryleaks","memoryheap"],
          "image":"tools/performance/thumbnails/tools_allocation_tracker.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Batterystats &amp; Battery Historian Walkthrough",
          "titleFriendly":"",
          "summary":"Collect battery usage data from your device and display it graphically in your browser.",
          "url":"tools/performance/batterystats-battery-historian/index.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools","battery","batterystats","historian","batterydrain"],
          "tags": ["android","performance","profiling","tools","battery","batterystats","historian","batterydrain"],
          "image":"tools/performance/thumbnails/tools_battery_historian.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Battery Historian Charts",
          "titleFriendly":"",
          "summary":"Examine and interpret the collected battery usage data in your browser.",
          "url":"tools/performance/batterystats-battery-historian/charts.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools","battery","historian batterydrain"],
          "tags": ["android","performance","profiling","tools","battery","historian","batterydrain"],
          "image":"tools/performance/thumbnails/tools_battery_historian.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Systrace Walkthrough",
          "titleFriendly":"",
          "summary":"Collect system and application process execution data to identify performance bottlenecks.",
          "url":"tools/performance/systrace/index.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools","compute","systrace"],
          "tags": ["android","performance","profiling","tools","compute","systrace"],
          "image":"tools/performance/thumbnails/tools_systrace.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Debug GPU Overdraw Walkthrough",
          "titleFriendly":"",
          "summary":"Use color-coding to show how many times each pixel is redrawn on the screen to reduce rendering overhead.",
          "url":"tools/performance/debug-gpu-overdraw/index.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools","rendering","overdraw"],
          "tags": ["android","performance","profiling","tools","rendering","overdraw"],
          "image":"tools/performance/thumbnails/tools_debug_gpu_overdraw.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Heap Viewer Walkthrough",
          "titleFriendly":"",
          "summary":"Report in real-time how many objects of what types and sizes your application is allocating and find memory leaks.",
          "url":"tools/performance/heap-viewer/index.html",
          "group":"",
          "keywords": ["android","performance","profiling","tools","memory","memoryleaks","memoryheap"],
          "tags": ["android","performance","profiling","tools","memory","memoryleaks","memoryheap"],
          "image":"tools/performance/thumbnails/tools_heap_viewer.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Using Hardware Devices",
          "titleFriendly":"",
          "summary":"When building a mobile application, it&#39;s important that you always test your application on a real device before releasing it to users. This page describes how to set up your development environment and Android-powered device for testing and debugging…",
          "url":"tools/device.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/dev-options-inmilk.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Developer Workflow",
          "titleFriendly":"",
          "summary":"To develop apps for Android, you use a set of tools that are included in Android Studio. In addition to using the tools from Android Studio, you can also access most of the SDK tools from the command line. Developing with Android Studio is the preferred…",
          "url":"tools/workflow/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/developing/developing_overview.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Activity Testing Tutorial",
          "titleFriendly":"",
          "summary":"Android includes powerful tools for testing applications. The tools extend JUnit with additional features, provide convenience classes for mock Android system objects, and use instrumentation to give you control over your main application while you are…",
          "url":"tools/testing/activity_test.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/testing/eclipse_new_android_project_complete_callouts.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Testing",
          "titleFriendly":"",
          "summary":"The Android framework includes an integrated testing framework that helps you test all aspects of your application and the SDK tools include tools for setting up and running test applications. Whether you are working in Eclipse with ADT or working from…",
          "url":"tools/testing/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Activity Testing",
          "titleFriendly":"",
          "summary":"Activity testing is particularly dependent on the Android instrumentation framework. Unlike other components, activities have a complex lifecycle based on callback methods; these can&#39;t be invoked directly except by instrumentation. Also, the only …",
          "url":"tools/testing/activity_testing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Content Provider Testing",
          "titleFriendly":"",
          "summary":"Content providers, which store and retrieve data and make it accessible across applications, are a key part of the Android API. As an application developer you&#39;re allowed to provide your own public providers for use by other applications. If you do…",
          "url":"tools/testing/contentprovider_testing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Accessibility Testing Checklist",
          "titleFriendly":"",
          "summary":"Testing is an important part of making your application accessible to users with varying abilities. Following design and development guidelines for accessibility are important steps toward that goal, but testing for accessibility can uncover problems …",
          "url":"tools/testing/testing_accessibility.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"UI Testing",
          "titleFriendly":"",
          "summary":"In addition to unit testing the individual components that make up your Android application (such as activities, services, and content providers), it is also important that you test the behavior of your application’s user interface (UI) when it is running…",
          "url":"tools/testing/testing_ui.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/testing/UIAutomatorViewer.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"What To Test",
          "titleFriendly":"",
          "summary":"As you develop Android applications, knowing what to test is as important as knowing how to test. This document lists some most common Android-related situations that you should consider when you test, even at the unit test level. This is not an exhaustive…",
          "url":"tools/testing/what_to_test.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Service Testing",
          "titleFriendly":"",
          "summary":"Android provides a testing framework for Service objects that can run them in isolation and provides mock objects. The test case class for Service objects is ServiceTestCase. Since the Service class assumes that it is separate from its clients, you can…",
          "url":"tools/testing/service_testing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Testing from Other IDEs",
          "titleFriendly":"",
          "summary":"This document describes how to create and run tests directly from the command line. You can use the techniques described here if you are developing in an IDE other than Eclipse or if you prefer to work from the command line. This document assumes that…",
          "url":"tools/testing/testing_otheride.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Testing from Eclipse with ADT",
          "titleFriendly":"",
          "summary":"This topic explains how create and run tests of Android applications in Eclipse with ADT. Before you read this topic, you should read about how to create an Android application with the basic processes for creating and running applications with ADT, as…",
          "url":"tools/testing/testing_eclipse.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/testing/eclipse_test_results.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Testing Fundamentals",
          "titleFriendly":"",
          "summary":"The Android testing framework, an integral part of the development environment, provides an architecture and powerful tools that help you test every aspect of your application at every level from unit to framework. The testing framework has these key …",
          "url":"tools/testing/testing_android.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/testing/test_framework.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Android Testing Tools",
          "titleFriendly":"",
          "summary":"Testing is a critical software development activity because it helps you improve the quality of your apps, ensure better user satisfaction, and reduce overall development time spent on fixing defects. The following sections describe tools that help you…",
          "url":"tools/testing/testing-tools.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Using DDMS",
          "titleFriendly":"",
          "summary":"Android Studio includes a debugging tool called the Dalvik Debug Monitor Server (DDMS), which provides port-forwarding services, screen capture on the device, thread and heap information on the device, logcat, process, and radio state information, incoming…",
          "url":"tools/debugging/ddms.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/debug-ddms.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Debugging from Other IDEs",
          "titleFriendly":"",
          "summary":"If you are not using Android Studio to develop, you can still take advantage of all the tools that the Android SDK provides for debugging. A basic debugging environment consists of: You need to obtain a JDWP-compliant Java debugger to properly debug your…",
          "url":"tools/debugging/debugging-projects-cmdline.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Debugging",
          "titleFriendly":"",
          "summary":"The Android SDK provides most of the tools that you need to debug your applications. You need a JDWP-compliant debugger if you want to be able to do things such as step through code, view variable values, and pause execution of an application. If you …",
          "url":"tools/debugging/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/debugging.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Improving Your Code with lint",
          "titleFriendly":"",
          "summary":"In addition to testing that your Android application meets its functional requirements, it&#39;s important to ensure that your code has no structural problems. Poorly structured code can impact the reliability and efficiency of your Android apps and make…",
          "url":"tools/debugging/improving-w-lint.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/lint.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Using the Dev Tools App",
          "titleFriendly":"",
          "summary":"The Dev Tools application is installed by default on all system images included with the SDK, so you can use it with the Android Emulator. With the Dev Tools application, you can enable a number of settings on your device that will make it easier to test…",
          "url":"tools/debugging/debugging-devtools.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Debugging with Android Studio",
          "titleFriendly":"",
          "summary":"Android Studio enables you to debug apps running on the emulator or on an Android device. With Android Studio, you can: To debug your app, Android Studio builds a debuggable version of your app, connects to a device or to the emulator, installs the app…",
          "url":"tools/debugging/debugging-studio.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/as-debugdevices.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Profiling with Traceview and dmtracedump",
          "titleFriendly":"",
          "summary":"Traceview is a graphical viewer for execution logs that you create by using the Debug class to log tracing information in your code. Traceview can help you debug your application and profile its performance. When you have a trace log file (generated by…",
          "url":"tools/debugging/debugging-tracing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/traceview_timeline.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Reading and Writing Logs",
          "titleFriendly":"",
          "summary":"The Android logging system provides a mechanism for collecting and viewing system debug output. Logcat dumps a log of system messages, which include things such as stack traces when the emulator throws an error and messages that you have written from …",
          "url":"tools/debugging/debugging-log.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Analyzing UI Performance with Systrace",
          "titleFriendly":"",
          "summary":"While developing your application, you should check that user interactions are buttery smooth, running at a consistent 60 frames per second. If something goes wrong, and a frame gets dropped, the first step in fixing the problem is understanding what …",
          "url":"tools/debugging/systrace.html",
          "group":"",
          "keywords": ["systrace","speed"],
          "tags": ["systrace","speed"],
          "image":"images/systrace/overview.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Investigating Your RAM Usage",
          "titleFriendly":"",
          "summary":"Because Android is designed for mobile devices, you should always be careful about how much random-access memory (RAM) your application uses. Although Dalvik and ART perform routine garbage collection (GC), this doesn’t mean you can ignore when and where…",
          "url":"tools/debugging/debugging-memory.html",
          "group":"",
          "keywords": ["memory","outofmemoryerror"],
          "tags": ["memory","outofmemoryerror"],
          "image":"images/tools/monitor-vmheap@2x.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Optimizing Your UI",
          "titleFriendly":"",
          "summary":"Sometimes your application&#39;s layout can slow down your application. To help debug issues in your layout, the Android SDK provides the Hierarchy Viewer and lint tools. The Hierarchy Viewer application allows you to debug and optimize your user interface…",
          "url":"tools/debugging/debugging-ui.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/developing/hv_device_window.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Improving Code Inspection with Annotations",
          "titleFriendly":"",
          "summary":"Using code inspections tools such as lint can help you find problems and improve your code, but inspection tools can only infer so much. Android resource ids, for example, use an int to identify strings, graphics, colors and other resource types, so inspection…",
          "url":"tools/debugging/annotations.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Debugging from Eclipse with ADT",
          "titleFriendly":"",
          "summary":"If you are developing in Eclipse with the ADT plugin, you can use the built-in Java Debugger, along with DDMS, to debug your applications. To access the debugger and DDMS, Eclipse displays the debugger and DDMS features as perspectives, which are customized…",
          "url":"tools/debugging/debugging-projects.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Manifest Merging",
          "titleFriendly":"",
          "summary":"With Android Studio and Gradle -based builds, each app can contain manifest files in multiple locations, such as the src&#47;main&#47; folder for the productFlavor , libraries, Android ARchive (AAR) bundles of Android Library projects, and dependencies…",
          "url":"tools/building/manifest-merge.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Building and Running Overview",
          "titleFriendly":"",
          "summary":"The Android build process provides project and module build settings so that your Android modules are compiled and packaged into .apk files, the containers for your application binaries, based on your build settings. The apk file for each app contains…",
          "url":"tools/building/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/build-simplified.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Building and Running from Eclipse with ADT",
          "titleFriendly":"",
          "summary":"Eclipse and ADT provide an environment where most of the details of the build process are hidden from you. By default, the build process constantly runs in the background as you make changes to your project. When Eclipse automatically builds your application…",
          "url":"tools/building/building-eclipse.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Building and Running from the Command Line",
          "titleFriendly":"",
          "summary":"There are two ways to build your application using the Ant build script: one for testing&#47;debugging your application — debug mode — and one for building your final package for release — release mode . Regardless of which way you build your application…",
          "url":"tools/building/buidling-cmdline-ant.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Building and Running from Android Studio",
          "titleFriendly":"",
          "summary":"This document shows you how to use Android Studio to build an application .apk for testing or release and how to run your application on an emulator or a real device. To build the project on Android Studio, click Build and select Make Project . The status…",
          "url":"tools/building/building-studio.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/as-gradlebutton.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Building and Running from the Command Line",
          "titleFriendly":"",
          "summary":"By default, there are two build types to build your application using the Gradle build settings: one for debugging your application — debug — and one for building your final package for release — release mode . Regardless of which build type your modules…",
          "url":"tools/building/building-cmdline.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Android Plug-in for Gradle",
          "titleFriendly":"",
          "summary":"The Android build system consists of an Android plugin for Gradle . Gradle is an advanced build toolkit that manages dependencies and allows you to define custom build logic. Android Studio uses a Gradle wrapper to fully integrate the Android plugin for…",
          "url":"tools/building/plugin-for-gradle.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Building and Running from the Command Line",
          "titleFriendly":"",
          "summary":"There are two ways to build your application using the Ant build script: one for testing&#47;debugging your application — debug mode — and one for building your final package for release — release mode . Regardless of which way you build your application…",
          "url":"tools/building/building-cmdline-ant.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Configuring Gradle Builds",
          "titleFriendly":"",
          "summary":"This section builds on the Build System Overview and Build and Running from Android Studio to show you how to use build variants based on product flavors and build types. Android Studio projects contain a top-level build file and a build file for each…",
          "url":"tools/building/configuring-gradle.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/as-gradlesync.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Building Apps with Over 65K Methods",
          "titleFriendly":"",
          "summary":"As the Android platform has continued to grow, so has the size of Android apps. When your application and the libraries it references reach a certain size, you encounter build errors that indicate your app has reached a limit of the Android app build …",
          "url":"tools/building/multidex.html",
          "group":"",
          "keywords": ["65536","references","max","65k","dex","64k","multidex","multi-dex","methods</p>"],
          "tags": ["65536","references","max","65k","dex","64k","multidex","multi-dex","methods</p>"],
          "image":"images/tools/studio-build-variant.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Support Library Features",
          "titleFriendly":"",
          "summary":"The Android Support Library package contains several libraries that can be included in your application. Each of these libraries supports a specific range of Android platform versions and set of features. This guide explains the important features and…",
          "url":"tools/support-library/features.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Support Library",
          "titleFriendly":"",
          "summary":"The Android Support Library package is a set of code libraries that provide backward-compatible versions of Android framework APIs as well as features that are only available through the library APIs. Each Support Library is backward-compatible to a specific…",
          "url":"tools/support-library/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Support Library Setup",
          "titleFriendly":"",
          "summary":"How you setup the Android Support Libraries in your development project depends on what features you want to use and what range of Android platform versions you want to support with your application. This document guides you through downloading the Support…",
          "url":"tools/support-library/setup.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/sdk-manager-support-libs.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Android Studio Overview",
          "titleFriendly":"",
          "summary":"Learn about the official IDE for Android.",
          "url":"tools/studio/index.html",
          "group":"",
          "keywords": ["studio","sdk","tools","firstapp"],
          "tags": ["studio","sdk","tools","firstapp"],
          "image":"images/cards/card-android-studio-overview_16x9_2x.jpg",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Features",
          "titleFriendly":"",
          "summary":"Learn about the Android Studio features.",
          "url":"tools/studio/studio-features.html",
          "group":"",
          "keywords": ["studio","features"],
          "tags": ["studio","features"],
          "image":"images/tools/studio-globe-icon.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Configuration",
          "titleFriendly":"",
          "summary":"Learn about the Android Studio configuration.",
          "url":"tools/studio/studio-config.html",
          "group":"",
          "keywords": ["studio","configuration"],
          "tags": ["studio","configuration"],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Transition Guide for Eclipse ADT",
          "titleFriendly":"",
          "summary":"This document describes the differences between Eclipse ADT and Android Studio, including project structure, build system, debugging, and application packaging. This guide is intended to help you transition to using Android Studio as your development …",
          "url":"tools/studio/eclipse-transition-guide.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/eclipse-notepad-pre-import--structure.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Testing Support Library",
          "titleFriendly":"",
          "summary":"The Android Testing Support Library provides an extensive framework for testing Android apps. This library provides a set of APIs that allow you to quickly build and run test code for your apps, including JUnit 4 and functional user interface (UI) tests…",
          "url":"tools/testing-support-library/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Accessory Development Kit",
          "titleFriendly":"",
          "summary":"The Accessory Development Kit (ADK) is a reference implementation for hardware manufacturers and hobbyists to use as a starting point for building accessories for Android. Each ADK release is provided with source code and hardware specifications to make…",
          "url":"tools/adk/index.html",
          "group":"",
          "keywords": ["adk"],
          "tags": ["adk"],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Accessory Development Kit 2012 Guide",
          "titleFriendly":"",
          "summary":"The Android Accessory Development Kit (ADK) for 2012 is the latest reference implementation of an Android Open Accessory device, designed to help Android hardware accessory builders and software developers create accessories for Android. The ADK 2012 …",
          "url":"tools/adk/adk2.html",
          "group":"",
          "keywords": ["adk"],
          "tags": ["adk"],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Accessory Development Kit 2011 Guide",
          "titleFriendly":"",
          "summary":"The Android Open Accessory Development Kit (ADK) is a reference implementation of an Android Open Accessory, based on the Arduino open source electronics prototyping platform . The accessory&#39;s hardware design files, code that implements the accessory…",
          "url":"tools/adk/adk.html",
          "group":"",
          "keywords": ["adk"],
          "tags": ["adk"],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"ADT Plugin Release Notes",
          "titleFriendly":"",
          "summary":"Android Development Tools (ADT) is a plugin for the Eclipse IDE that extends the capabilities of Eclipse to let you quickly set up new Android projects, create an application UI, add packages based on the Android Framework API, debug your applications…",
          "url":"tools/sdk/eclipse-adt.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Android NDK",
          "titleFriendly":"",
          "summary":"The NDK is a toolset that allows you to implement parts of your app using native-code languages such as C and C++. Typically, good use cases for the NDK are CPU-intensive applications such as game engines, signal processing, and physics simulation. Before…",
          "url":"tools/sdk/ndk/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Data Binding Guide",
          "titleFriendly":"",
          "summary":"This document explains how to use the Data Binding Library to write declarative layouts and minimize the glue code necessary to bind your application logic and layouts. The Data Binding Library offers both flexibility and broad comnpatibility — it&#39…",
          "url":"tools/data-binding/guide.html",
          "group":"",
          "keywords": ["databinding","layouts"],
          "tags": ["databinding","layouts"],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"monkeyrunner",
          "titleFriendly":"",
          "summary":"The monkeyrunner tool provides an API for writing programs that control an Android device or emulator from outside of Android code. With monkeyrunner, you can write a Python program that installs an Android application or test package, runs it, sends …",
          "url":"tools/help/monkeyrunner_concepts.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Hierarchy Viewer",
          "titleFriendly":"",
          "summary":"The Hierarchy Viewer allows you to debug and optimize your user interface. It provides a visual representation of the layout&#39;s View hierarchy (the Layout View) and a magnified inspector of the display (the Pixel Perfect View). To start the Hierarchy…",
          "url":"tools/help/hierarchy-viewer.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/hierarchicalviewer-icon.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"zipalign",
          "titleFriendly":"",
          "summary":"zipalign is an archive alignment tool that provides important optimization to Android application (.apk) files. The purpose is to ensure that all uncompressed data starts with a particular alignment relative to the start of the file. Specifically, it …",
          "url":"tools/help/zipalign.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"MonkeyRunner",
          "titleFriendly":"",
          "summary":"A monkeyrunner class that contains static utility methods. Displays an alert dialog to the process running the current program. The dialog is modal, so the program pauses until the user clicks the dialog&#39;s button. Displays a dialog with a list of …",
          "url":"tools/help/MonkeyRunner.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"layoutopt",
          "titleFriendly":"",
          "summary":"For more information about using lint, see Improving Your Code with lint and the lint reference documentation . layoutopt is a command-line tool that helps you optimize the layouts and layout hierarchies of your applications. This document is a reference…",
          "url":"tools/help/layoutopt.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"UI&#47;Application Exerciser Monkey",
          "titleFriendly":"",
          "summary":"The Monkey is a program that runs on your emulator or device and generates pseudo-random streams of user events such as clicks, touches, or gestures, as well as a number of system-level events. You can use the Monkey to stress-test applications that you…",
          "url":"tools/help/monkey.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"dmtracedump",
          "titleFriendly":"",
          "summary":"dmtracedump is a tool that gives you an alternate way of generating graphical call-stack diagrams from trace log files (instead of using Traceview). This document is a reference to the available command line options. For more information on generating…",
          "url":"tools/help/dmtracedump.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"sqlite3",
          "titleFriendly":"",
          "summary":"From a remote shell to your device or from your host machine, you can use the sqlite3 command-line program to manage SQLite databases created by Android applications. The sqlite3 tool includes many useful commands, such as .dump to print out the contents…",
          "url":"tools/help/sqlite3.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Tools Help",
          "titleFriendly":"",
          "summary":"The Android SDK includes a variety of tools that help you develop mobile applications for the Android platform. The tools are classified into two groups: SDK tools and platform tools. SDK tools are platform independent and are required no matter which…",
          "url":"tools/help/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Device Monitor",
          "titleFriendly":"",
          "summary":"Android Device Monitor is a stand-alone tool that provides a graphical user interface for several Android application debugging and analysis tools. The Monitor tool does not require installation of an integrated development environment, such as Android…",
          "url":"tools/help/monitor.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/hierarchicalviewer-icon.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Draw 9-patch",
          "titleFriendly":"",
          "summary":"The Draw 9-patch tool is a WYSIWYG editor that allows you to create bitmap images that automatically resize to accommodate the contents of the view and the size of the screen. Selected parts of the image are scaled horizontally or vertically based indicators…",
          "url":"tools/help/draw9patch.html",
          "group":"",
          "keywords": ["ninepatch"],
          "tags": ["ninepatch"],
          "image":"images/draw9patch-norm.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"MonkeyImage",
          "titleFriendly":"",
          "summary":"A monkeyrunner class to hold an image of the device or emulator&#39;s screen. The image is copied from the screen buffer during a screenshot. This object&#39;s methods allow you to convert the image into various storage formats, write the image to a file…",
          "url":"tools/help/MonkeyImage.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"IAutomationSupport",
          "titleFriendly":"",
          "summary":"Provides auxiliary support for running test cases Allows the running test cases to send out interim status…",
          "url":"tools/help/uiautomator/IAutomationSupport.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"UiCollection",
          "titleFriendly":"",
          "summary":"Used to enumerate a container&#39;s user interface (UI) elements for the purpose of counting, or targeting a sub elements by a child&#39;s text or description. Searches for child UI element within the constraints of this UiSelector selector. It looks …",
          "url":"tools/help/uiautomator/UiCollection.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"uiautomator",
          "titleFriendly":"",
          "summary":"The uiautomator testing framework lets you test your user interface (UI) efficiently by creating automated functional UI testcases that can be run against your app on one or more devices. For more information on testing with the uiautomator framework,…",
          "url":"tools/help/uiautomator/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"UiSelector",
          "titleFriendly":"",
          "summary":"Specifies the elements in the layout hierarchy for tests to target, filtered by properties such as text value, content-description, class name, and state information. You can also target an element by its location in a layout hierarchy. Set the search…",
          "url":"tools/help/uiautomator/UiSelector.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"UiObject",
          "titleFriendly":"",
          "summary":"A UiObject is a representation of a view. It is not in any way directly bound to a view as an object reference. A UiObject contains information to help it locate a matching view at runtime based on the UiSelector properties specified in its constructor…",
          "url":"tools/help/uiautomator/UiObject.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Configurator",
          "titleFriendly":"",
          "summary":"Allows you to set key parameters for running uiautomator tests. The new settings take effect immediately and can be changed any time during a test run. To modify parameters using Configurator , first obtain an instance by calling getInstance() . As a …",
          "url":"tools/help/uiautomator/Configurator.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"UiDevice",
          "titleFriendly":"",
          "summary":"Provides access to state information about the device. You can also use this class to simulate user actions on the device, such as pressing the d-pad or pressing the Home and Menu buttons. Clears the text from the last UI traversal event. See getLastTraversedText…",
          "url":"tools/help/uiautomator/UiDevice.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"UiObjectNotFoundException",
          "titleFriendly":"",
          "summary":"Generated in test runs when a UiSelector selector could not be matched to any UI element displayed.…",
          "url":"tools/help/uiautomator/UiObjectNotFoundException.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"UiScrollable",
          "titleFriendly":"",
          "summary":"A UiCollection that supports searching for items in scrollable layout elements. This class can be used with horizontally or vertically scrollable controls. Constructor. Performs a backwards fling action with the default number of fling steps (5). If the…",
          "url":"tools/help/uiautomator/UiScrollable.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"UiAutomatorTestCase",
          "titleFriendly":"",
          "summary":"UI automation tests should extend this class. This class provides access to the following: Provides support for running tests to report interim status Get command line parameters. On the command line when passing -e key value pairs, the Bundle will have…",
          "url":"tools/help/uiautomator/UiAutomatorTestCase.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"UiWatcher",
          "titleFriendly":"",
          "summary":"Represents a conditional watcher on the target device. To learn how to register a conditional watcher, see UiDevice.registerWatcher() . The testing framework calls this handler method automatically when the framework is unable to find a match using the…",
          "url":"tools/help/uiautomator/UiWatcher.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"ProGuard",
          "titleFriendly":"",
          "summary":"The ProGuard tool shrinks, optimizes, and obfuscates your code by removing unused code and renaming classes, fields, and methods with semantically obscure names. The result is a smaller sized .apk file that is more difficult to reverse engineer. Because…",
          "url":"tools/help/proguard.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"bmgr",
          "titleFriendly":"",
          "summary":"bmgr is a shell tool you can use to interact with the Backup Manager on Android devices supporting API Level 8 or greater. It provides commands to induce backup and restore operations so that you don&#39;t need to repeatedly wipe data or take similar …",
          "url":"tools/help/bmgr.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"lint",
          "titleFriendly":"",
          "summary":"The Android lint tool is a static code analysis tool that checks your Android project source files for potential bugs and optimization improvements for correctness, security, performance, usability, accessibility, and internationalization. In Android …",
          "url":"tools/help/lint.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"ADB Shell Commands",
          "titleFriendly":"",
          "summary":"The Android Debug Bridge (adb) provides a Unix shell that you can use to run a variety of commands on an emulator or connected device. The command binaries are stored in the file system of the emulator or device, at &#47;system&#47;bin&#47;... You can…",
          "url":"tools/help/shell.html",
          "group":"",
          "keywords": ["shell","adb","am","pm","screenrecord","screencap"],
          "tags": ["shell","adb","am","pm","screenrecord","screencap"],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"etc1tool",
          "titleFriendly":"",
          "summary":"etc1tool is a command line utility that lets you encode PNG images to the ETC1 compression standard and decode ETC1 compressed images back to PNG. The usage for etc1tool is:…",
          "url":"tools/help/etc1tool.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"android",
          "titleFriendly":"",
          "summary":"android is an important development tool that lets you: If you are using Android Studio or Eclipse, the android tool&#39;s features are integrated into the IDE, so you should not need to use this tool directly.…",
          "url":"tools/help/android.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"SDK Manager",
          "titleFriendly":"",
          "summary":"The Android SDK separates tools, platforms, and other components into packages you can 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…",
          "url":"tools/help/sdk-manager.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/sdk_manager_packages.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"JOBB",
          "titleFriendly":"",
          "summary":"The jobb tool allows you to build encrypted and unencrypted APK expansion files in Opaque Binary Blob (OBB) format. You can download and mount these expansion files in your application using StorageManager on devices with Android 2.3 (API Level 9) or …",
          "url":"tools/help/jobb.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"mksdcard",
          "titleFriendly":"",
          "summary":"The mksdcard tool lets you quickly create a FAT32 disk image that you can load in the emulator, to simulate the presence of an SD card in the device. Because you can specify an SD card while creating an AVD in the AVD Manager, you usually use that feature…",
          "url":"tools/help/mksdcard.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Systrace",
          "titleFriendly":"",
          "summary":"The Systrace tool helps analyze the performance of your application by capturing and displaying execution times of your applications processes and other Android system processes. The tool combines data from the Android kernel such as the CPU scheduler…",
          "url":"tools/help/systrace.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/systrace/systrace-button.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Android Debug Bridge",
          "titleFriendly":"",
          "summary":"Android Debug Bridge (adb) is a versatile command line tool that lets you communicate with an emulator instance or connected Android-powered device. It is a client-server program that includes three components: You can find the adb tool in {@code &lt;…",
          "url":"tools/help/adb.html",
          "group":"",
          "keywords": ["adb"],
          "tags": ["adb"],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Android Developer Tools",
          "titleFriendly":"",
          "summary":"Android Developer Tools (ADT) is a plugin for Eclipse that provides a suite of tools that are integrated with the Eclipse IDE. It offers you access to many features that help you develop Android applications. ADT provides GUI access to many of the command…",
          "url":"tools/help/adt.html",
          "group":"",
          "keywords": ["adt"],
          "tags": ["adt"],
          "image":"images/layout_editor.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"logcat",
          "titleFriendly":"",
          "summary":"The Android logging system provides a mechanism for collecting and viewing system debug output. Logs from various applications and portions of the system are collected in a series of circular buffers, which then can be viewed and filtered by the logcat…",
          "url":"tools/help/logcat.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Traceview",
          "titleFriendly":"",
          "summary":"Traceview is a graphical viewer for execution logs saved by your application. Traceview can help you debug your application and profile its performance. To start the Traceview tool: For more information on how to use Traceview, see Profiling with Traceview…",
          "url":"tools/help/traceview.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"HPROF Converter",
          "titleFriendly":"",
          "summary":"The hprof-conv tool converts the HPROF file that is generated by the Android SDK tools to a standard format so you can view the file in a profiling tool of your choice. You can use &quot;-&quot; for &lt;infile&gt; or &lt;outfile&gt; to specify stdin or…",
          "url":"tools/help/hprof-conv.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"MonkeyDevice",
          "titleFriendly":"",
          "summary":"A monkeyrunner class that represents a device or emulator accessible by the workstation running monkeyrunner . This class is used to control an Android device or emulator. The methods send UI events, retrieve information, install and remove applications…",
          "url":"tools/help/MonkeyDevice.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Android Emulator",
          "titleFriendly":"",
          "summary":"The Android SDK includes a mobile device emulator — a virtual mobile device that runs on your computer. The emulator lets you develop and test Android applications without using a physical device. This document is a reference to the available command …",
          "url":"tools/help/emulator.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Tracer for OpenGL ES",
          "titleFriendly":"",
          "summary":"Tracer is a tool for analyzing OpenGL for Embedded Systems (ES) code in your Android application. The tool allows you to capture OpenGL ES commands and frame by frame images to help you understand how your graphics commands are being executed. Tracer …",
          "url":"tools/help/gltracer.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/gltracer/dialog-trace.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"AVD Manager",
          "titleFriendly":"",
          "summary":"The AVD Manager provides a graphical user interface in which you can create and manage Android Virtual Devices (AVDs), which are required by the Android Emulator . You can launch the AVD Manager in one of the following ways: For more information, see …",
          "url":"tools/help/avd-manager.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Managing Virtual Devices",
          "titleFriendly":"",
          "summary":"An Android Virtual Device (AVD) is an emulator configuration that lets you model an actual device by defining hardware and software options to be emulated by the Android Emulator. The easiest way to create an AVD is to use the graphical AVD Manager , …",
          "url":"tools/devices/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Managing AVDs from the Command Line",
          "titleFriendly":"",
          "summary":"The android tool lets you manage AVDs on the command line. For a complete reference of the command line options that you can use, see the reference for the android tool. To generate a list of system image targets, use this command: The android tool scans…",
          "url":"tools/devices/managing-avds-cmdline.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Managing AVDs with AVD Manager",
          "titleFriendly":"",
          "summary":"The AVD Manager is a tool you can use to create and manage Android virtual devices (AVDs), which define device configurations for the Android Emulator . To launch the AVD Manager: The AVD Manager main screen shows your current virtual devices, as shown…",
          "url":"tools/devices/managing-avds.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/avd-manager-studio.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Using the Emulator",
          "titleFriendly":"",
          "summary":"The Android SDK includes a virtual mobile device emulator that runs on your computer. The emulator lets you prototype, develop and test Android applications without using a physical device. The Android emulator mimics all of the hardware and software …",
          "url":"tools/devices/emulator.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/emulator@2x.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Versioning Your Applications",
          "titleFriendly":"",
          "summary":"Versioning is a critical component of your application upgrade and maintenance strategy. Versioning is important because: The Android system does not use app version information to enforce restrictions on upgrades, downgrades, or compatibility of third-party…",
          "url":"tools/publishing/versioning.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Publishing Overview",
          "titleFriendly":"",
          "summary":"Publishing is the general process that makes your Android applications available to users. When you publish an Android application you perform two main tasks: During the preparation step you build a release version of your application, which users can…",
          "url":"tools/publishing/publishing_overview.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/publishing/publishing_overview.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Preparing for Release",
          "titleFriendly":"",
          "summary":"Before you distribute your Android application to users you need to prepare it for release. The preparation process is a required development task for all Android applications and is the first step in the publishing process (see figure 1). When you prepare…",
          "url":"tools/publishing/preparing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/publishing/publishing_overview_prep.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Signing Your Applications from Eclipse with ADT",
          "titleFriendly":"",
          "summary":"Android requires that all apps be digitally signed with a certificate before they can be installed. Android uses this certificate to identify the author of an app, and the certificate does not need to be signed by a certificate authority. This document…",
          "url":"tools/publishing/app-signing-eclipse.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/signadt3.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Signing Your Applications",
          "titleFriendly":"",
          "summary":"Android requires that all apps be digitally signed with a certificate before they can be installed. Android uses this certificate to identify the author of an app, and the certificate does not need to be signed by a certificate authority. Android apps…",
          "url":"tools/publishing/app-signing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/signstudio2.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Terms and Conditions",
          "titleFriendly":"",
          "summary":"",
          "url":"sdk/terms.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to System Requirements .…",
          "url":"sdk/1.5_r1/requirements.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to Installing the Android SDK .…",
          "url":"sdk/1.5_r1/installing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to System Requirements .…",
          "url":"sdk/1.0_r1/requirements.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to Installing the Android SDK .…",
          "url":"sdk/1.0_r1/installing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Download Android Studio and SDK Tools",
          "titleFriendly":"",
          "summary":"Download the official Android IDE and developer tools to build apps for Android phones, tablets, wearables, TVs, and more.",
          "url":"sdk/index.html",
          "group":"",
          "keywords": ["sdk","android studio"],
          "tags": ["sdk","androidstudio"],
          "image":"images/cards/android-studio_2x.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to System Requirements .…",
          "url":"sdk/1.5_r2/requirements.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to Installing the Android SDK .…",
          "url":"sdk/1.5_r2/installing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Google USB Driver",
          "titleFriendly":"",
          "summary":"I have read and agree with the above terms and conditions The Google USB Driver is required for Windows only in order to perform adb debugging with any of the Google Nexus devices . The one exception is the Galaxy Nexus: the driver for Galaxy Nexus is…",
          "url":"sdk/win-usb.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/developing/sdk-usb-driver.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to System Requirements .…",
          "url":"sdk/1.5_r3/requirements.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to Installing the Android SDK .…",
          "url":"sdk/1.5_r3/installing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to System Requirements .…",
          "url":"sdk/1.6_r1/requirements.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to Installing the Android SDK .…",
          "url":"sdk/1.6_r1/installing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Migrating to Android Studio",
          "titleFriendly":"",
          "summary":"Migrating from Eclipse ADT to Android Studio requires adapting to a new project structure, build system, and IDE functionality. To simplify the migration process, Android Studio provides an import tool so you can quickly transition your Eclipse ADT workspaces…",
          "url":"sdk/installing/migrate.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/studio-select-project-forimport.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Android Studio Tips and Tricks",
          "titleFriendly":"",
          "summary":"If you&#39;re unfamiliar with using Android Studio and the IntelliJ IDEA interface, this page provides some tips to help you get started with some of the most common tasks and productivity enhancements. Android Studio includes a number of features to …",
          "url":"sdk/installing/studio-tips.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/studio-bitmap-rendering.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Using the Layout Editor",
          "titleFriendly":"",
          "summary":"What&#39;s New in Android Developer Tools Android Studio offers an advanced layout editor that allows you to drag-and-drop widgets into your layout and preview your layout while editing the XML. Within the layout editor, you can switch between the Text…",
          "url":"sdk/installing/studio-layout.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/as-preview-icon.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Setting Up the ADT Bundle",
          "titleFriendly":"",
          "summary":"",
          "url":"sdk/installing/bundle.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Adding SDK Packages",
          "titleFriendly":"",
          "summary":"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 Android SDK Manager . So before you can start, there are …",
          "url":"sdk/installing/adding-packages.html",
          "group":"",
          "keywords": ["sdk manager"],
          "tags": ["sdkmanager"],
          "image":"images/tools/sdk-manager-studio.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Managing Projects from Android Studio",
          "titleFriendly":"",
          "summary":"Android Studio provides graphical tools for creating and managing Android projects, which contain everything that define your Android apps, from app source code to build configurations and test code. Each project contains one or more different types of…",
          "url":"sdk/installing/create-project.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/wizard2.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Using the Android Project View",
          "titleFriendly":"",
          "summary":"The Android project view in Android Studio shows a flattened version of your project&#39;s structure that provides quick access to the key source files of Android projects and helps you work with the new Gradle-based build system . The Android project…",
          "url":"sdk/installing/studio-androidview.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/tools/projectview01.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Build System Overview",
          "titleFriendly":"",
          "summary":"The New Android SDK Build System The Android build system is the toolkit you use to build, test, run and package your apps. The build system can run as an integrated tool from the Android Studio menu and independently from the command line. You can use…",
          "url":"sdk/installing/studio-build.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/build.png",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"Installing the Eclipse Plugin",
          "titleFriendly":"",
          "summary":"Android offers a custom plugin for the Eclipse IDE, called Android Development Tools (ADT). This plugin provides a powerful, integrated environment in which to develop Android apps. It extends the capabilities of Eclipse to let you quickly set up new …",
          "url":"sdk/installing/installing-adt.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to System Requirements .…",
          "url":"sdk/1.1_r1/requirements.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to Installing the Android SDK .…",
          "url":"sdk/1.1_r1/installing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to System Requirements .…",
          "url":"sdk/1.0_r2/requirements.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }, 
        {
          "title":"",
          "titleFriendly":"",
          "summary":"You should have already been redirected by your browser. Please go to Installing the Android SDK .…",
          "url":"sdk/1.0_r2/installing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"tools"
        }
  ];
  
  var TRAINING_RESOURCES = [
        {
          "title":"Defining Shadows and Clipping Views",
          "titleFriendly":"",
          "summary":"Material design introduces elevation for UI elements. Elevation helps users understand the relative importance of each element and focus their attention to the task at hand. The elevation of a view, represented by the Z property, determines the visual…",
          "url":"training/material/shadows-clipping.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"training/material/images/shadows-depth.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Material Design for Developers",
          "titleFriendly":"",
          "summary":"Learn how to apply material design to your apps.",
          "url":"training/material/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/material_2x.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Lists and Cards",
          "titleFriendly":"",
          "summary":"To create complex lists and cards with material design styles in your apps, you can use the RecyclerView and CardView widgets. The RecyclerView widget is a more advanced and flexible version of ListView. This widget is a container for displaying large…",
          "url":"training/material/lists-cards.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"training/material/images/RecyclerView.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Getting Started",
          "titleFriendly":"",
          "summary":"To create apps with material design: You can add many material design features to your app while maintaining compatibility with versions of Android earlier than 5.0. For more information, see Maintaining Compatibility . To update an existing app to incorporate…",
          "url":"training/material/get-started.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Using the Material Theme",
          "titleFriendly":"",
          "summary":"The new material theme provides: 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 3 . The system…",
          "url":"training/material/theme.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/material/images/MaterialDark.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Maintaining Compatibility",
          "titleFriendly":"",
          "summary":"Some material design features like the material theme and custom activity transitions are only available on Android 5.0 (API level 21) and above. However, you can design your apps to make use of these features when running on devices that support material…",
          "url":"training/material/compatibility.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Working with Drawables",
          "titleFriendly":"",
          "summary":"The following capabilities for drawables help you implement material design in your apps: This lesson shows you how to use these features in your app. With Android 5.0 (API level 21) and above, you can tint bitmaps and nine-patches defined as alpha masks…",
          "url":"training/material/drawables.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Defining Custom Animations",
          "titleFriendly":"",
          "summary":"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 Android 5.0 (API level 21) …",
          "url":"training/material/animations.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"training/material/images/SceneTransition.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Adding the Action Bar",
          "titleFriendly":"",
          "summary":"Action Bar The action bar is one of the most important design elements you can implement for your app&#39;s activities. It provides several user interface features that make your app immediately familiar to users by offering consistency between other …",
          "url":"training/basics/actionbar/index.html",
          "group":"",
          "keywords": ["actionbar"],
          "tags": ["actionbar"],
          "image":"images/training/basics/actionbar-actions.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Adding Action Buttons",
          "titleFriendly":"",
          "summary":"The action bar allows you to add buttons for the most important action items relating to the app&#39;s current context. Those that appear directly in the action bar with an icon and&#47;or text are known as action buttons . Actions that can&#39;t fit …",
          "url":"training/basics/actionbar/adding-buttons.html",
          "group":"",
          "keywords": ["actionbar"],
          "tags": ["actionbar"],
          "image":"images/training/basics/actionbar-actions.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Styling the Action Bar",
          "titleFriendly":"",
          "summary":"The action bar provides your users a familiar and predictable way to perform actions and navigate your app, but that doesn&#39;t mean it needs to look exactly the same as it does in other apps. If you want to style the action bar to better fit your product…",
          "url":"training/basics/actionbar/styling.html",
          "group":"",
          "keywords": ["actionbar"],
          "tags": ["actionbar"],
          "image":"images/training/basics/actionbar-theme-dark@2x.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Overlaying the Action Bar",
          "titleFriendly":"",
          "summary":"By default, the action bar appears at the top of your activity window, slightly reducing the amount of space available for the rest of your activity&#39;s layout. If, during the course of user interaction, you want to hide and show the action bar, you…",
          "url":"training/basics/actionbar/overlaying.html",
          "group":"",
          "keywords": ["actionbar"],
          "tags": ["actionbar"],
          "image":"images/training/basics/actionbar-overlay@2x.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Setting Up the Action Bar",
          "titleFriendly":"",
          "summary":"In its most basic form, the action bar displays the title for the activity and the app icon on the left. Even in this simple form, the action bar is useful for all activities to inform users about where they are and to maintain a consistent identity for…",
          "url":"training/basics/actionbar/setting-up.html",
          "group":"",
          "keywords": ["actionbar"],
          "tags": ["actionbar"],
          "image":"images/training/basics/actionbar-basic.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Managing the Activity Lifecycle",
          "titleFriendly":"",
          "summary":"As a user navigates through, out of, and back to your app, the Activity instances in your app transition between different states in their lifecycle. For instance, when your activity starts for the first time, it comes to the foreground of the system …",
          "url":"training/basics/activity-lifecycle/index.html",
          "group":"",
          "keywords": ["activity lifecycle"],
          "tags": ["activitylifecycle"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Recreating an Activity",
          "titleFriendly":"",
          "summary":"There are a few scenarios in which your activity is destroyed due to normal app behavior, such as when the user presses the Back button or your activity signals its own destruction by calling finish(). The system may also destroy your activity if it&#39…",
          "url":"training/basics/activity-lifecycle/recreating.html",
          "group":"",
          "keywords": ["activity lifecycle"],
          "tags": ["activitylifecycle"],
          "image":"images/training/basics/basic-lifecycle-savestate.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Starting an Activity",
          "titleFriendly":"",
          "summary":"Unlike other programming paradigms in which apps are launched with a main() method, the Android system initiates code in an Activity instance by invoking specific callback methods that correspond to specific stages of its lifecycle. There is a sequence…",
          "url":"training/basics/activity-lifecycle/starting.html",
          "group":"",
          "keywords": ["activity lifecycle"],
          "tags": ["activitylifecycle"],
          "image":"images/training/basics/basic-lifecycle.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Stopping and Restarting an Activity",
          "titleFriendly":"",
          "summary":"Properly stopping and restarting your activity is an important process in the activity lifecycle that ensures your users perceive that your app is always alive and doesn&#39;t lose their progress. There are a few of key scenarios in which your activity…",
          "url":"training/basics/activity-lifecycle/stopping.html",
          "group":"",
          "keywords": ["activity lifecycle"],
          "tags": ["activitylifecycle"],
          "image":"images/training/basics/basic-lifecycle-stopped.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Pausing and Resuming an Activity",
          "titleFriendly":"",
          "summary":"During normal app use, the foreground activity is sometimes obstructed by other visual components that cause the activity to pause . For example, when a semi-transparent activity opens (such as one in the style of a dialog), the previous activity pauses…",
          "url":"training/basics/activity-lifecycle/pausing.html",
          "group":"",
          "keywords": ["activity lifecycle"],
          "tags": ["activitylifecycle"],
          "image":"images/training/basics/basic-lifecycle-paused.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Performing Network Operations",
          "titleFriendly":"",
          "summary":"This class explains the basic tasks involved in connecting to the network, monitoring the network connection (including connection changes), and giving users control over an app&#39;s network usage. It also describes how to parse and consume XML data.…",
          "url":"training/basics/network-ops/index.html",
          "group":"",
          "keywords": ["network","wireless"],
          "tags": ["network","wireless"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Parsing XML Data",
          "titleFriendly":"",
          "summary":"Extensible Markup Language (XML) is a set of rules for encoding documents in machine-readable form. XML is a popular format for sharing data on the internet. Websites that frequently update their content, such as news sites or blogs, often provide an …",
          "url":"training/basics/network-ops/xml.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Managing Network Usage",
          "titleFriendly":"",
          "summary":"This lesson describes how to write applications that have fine-grained control over their usage of network resources. If your application performs a lot of network operations, you should provide user settings that allow users to control your app’s data…",
          "url":"training/basics/network-ops/managing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/basics/network-settings1.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Connecting to the Network",
          "titleFriendly":"",
          "summary":"This lesson shows you how to implement a simple application that connects to the network. It explains some of the best practices you should follow in creating even the simplest network-connected app. Note that to perform the network operations described…",
          "url":"training/basics/network-ops/connecting.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Sending the User to Another App",
          "titleFriendly":"",
          "summary":"One of Android&#39;s most important features is an app&#39;s ability to send the user to another app based on an &quot;action&quot; it would like to perform. For example, if your app has the address of a business that you&#39;d like to show on a map, …",
          "url":"training/basics/intents/sending.html",
          "group":"",
          "keywords": ["intents"],
          "tags": ["intents"],
          "image":"images/training/basics/intents-choice.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Interacting with Other Apps",
          "titleFriendly":"",
          "summary":"An Android app typically has several activities . Each activity displays a user interface that allows the user to perform a specific task (such as view a map or take a photo). To take the user from one activity to another, your app must use an Intent …",
          "url":"training/basics/intents/index.html",
          "group":"",
          "keywords": ["intents","activity"],
          "tags": ["intents","activity"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Allowing Other Apps to Start Your Activity",
          "titleFriendly":"",
          "summary":"The previous two lessons focused on one side of the story: starting another app&#39;s activity from your app. But if your app can perform an action that might be useful to another app, your app should be prepared to respond to action requests from other…",
          "url":"training/basics/intents/filters.html",
          "group":"",
          "keywords": ["intents"],
          "tags": ["intents"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Getting a Result from an Activity",
          "titleFriendly":"",
          "summary":"Starting another activity doesn&#39;t have to be one-way. You can also start another activity and receive a result back. To receive a result, call startActivityForResult() (instead of startActivity()). For example, your app can start a camera app and …",
          "url":"training/basics/intents/result.html",
          "group":"",
          "keywords": ["intents"],
          "tags": ["intents"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Running Your App",
          "titleFriendly":"",
          "summary":"If you followed the previous lesson to create an Android project, it includes a default set of &quot;Hello World&quot; source files that allow you to immediately run the app. How you run your app depends on two things: whether you have a real device running…",
          "url":"training/basics/firstapp/running-app.html",
          "group":"",
          "keywords": ["emulator"],
          "tags": ["emulator"],
          "image":"images/tools/as-run.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Your First App",
          "titleFriendly":"",
          "summary":"If you're new to Android app development, this where you should begin. This series of lessons shows you how to create a new project, build a simple app, and run it on a device or emulator.",
          "url":"training/basics/firstapp/index.html",
          "group":"",
          "keywords": ["sdk tools"],
          "tags": ["sdktools"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building a Simple User Interface",
          "titleFriendly":"",
          "summary":"In this lesson, you create a layout in XML that includes a text field and a button. In the next lesson, your app responds when the button is pressed by sending the content of the text field to another activity. The graphical user interface for an Android…",
          "url":"training/basics/firstapp/building-ui.html",
          "group":"",
          "keywords": ["ui"],
          "tags": ["ui"],
          "image":"images/viewgroup.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Starting Another Activity",
          "titleFriendly":"",
          "summary":"After completing the previous lesson , you have an app that shows an activity (a single screen) with a text field and a button. In this lesson, you’ll add some code to MyActivity that starts a new activity when the user clicks the Send button. The Intent…",
          "url":"training/basics/firstapp/starting-activity.html",
          "group":"",
          "keywords": ["intents"],
          "tags": ["intents"],
          "image":"images/training/firstapp/studio-new-activity.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating an Android Project",
          "titleFriendly":"",
          "summary":"An Android project contains all the files that comprise the source code for your Android app. The Android SDK tools make it easy to start a new Android project with a set of default project directories and files. This lesson shows how to create a new …",
          "url":"training/basics/firstapp/creating-project.html",
          "group":"",
          "keywords": ["project setup"],
          "tags": ["projectsetup"],
          "image":"images/training/firstapp/studio-setup-1.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building a Flexible UI",
          "titleFriendly":"",
          "summary":"When designing your application to support a wide range of screen sizes, you can reuse your fragments in different layout configurations to optimize the user experience based on the available screen space. For example, on a handset device it might be …",
          "url":"training/basics/fragments/fragment-ui.html",
          "group":"",
          "keywords": ["fragments"],
          "tags": ["fragments"],
          "image":"images/training/basics/fragments-screen-mock.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building a Dynamic UI with Fragments",
          "titleFriendly":"",
          "summary":"To create a dynamic and multi-pane user interface on Android, you need to encapsulate UI components and activity behaviors into modules that you can swap into and out of your activities. You can create these modules with the Fragment class, which behaves…",
          "url":"training/basics/fragments/index.html",
          "group":"",
          "keywords": ["fragments","user interface","support library"],
          "tags": ["fragments","userinterface","supportlibrary"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating a Fragment",
          "titleFriendly":"",
          "summary":"You can think of a fragment as a modular section of an activity, which has its own lifecycle, receives its own input events, and which you can add or remove while the activity is running (sort of like a &quot;sub activity&quot; that you can reuse in different…",
          "url":"training/basics/fragments/creating.html",
          "group":"",
          "keywords": ["fragments"],
          "tags": ["fragments"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Communicating with Other Fragments",
          "titleFriendly":"",
          "summary":"In order to reuse the Fragment UI components, you should build each as a completely self-contained, modular component that defines its own layout and behavior. Once you have defined these reusable Fragments, you can associate them with an Activity and…",
          "url":"training/basics/fragments/communicating.html",
          "group":"",
          "keywords": ["fragments"],
          "tags": ["fragments"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Supporting Different Platform Versions",
          "titleFriendly":"",
          "summary":"Training on how to declare support for minimum and target API levels.",
          "url":"training/basics/supporting-devices/platforms.html",
          "group":"",
          "keywords": ["styles"],
          "tags": ["styles"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Supporting Different Screens",
          "titleFriendly":"",
          "summary":"Android categorizes device screens using two general properties: size and density. You should expect that your app will be installed on devices with screens that range in both size and density. As such, you should include some alternative resources that…",
          "url":"training/basics/supporting-devices/screens.html",
          "group":"",
          "keywords": ["layouts"],
          "tags": ["layouts"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Supporting Different Devices",
          "titleFriendly":"",
          "summary":"Android devices come in many shapes and sizes all around the world. With a wide range of device types, you have an opportunity to reach a huge audience with your app. In order to be as successful as possible on Android, your app needs to adapt to various…",
          "url":"training/basics/supporting-devices/index.html",
          "group":"",
          "keywords": ["layouts","resources","screens","localization"],
          "tags": ["layouts","resources","screens","localization"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Supporting Different Languages",
          "titleFriendly":"",
          "summary":"It’s always a good practice to extract UI strings from your app code and keep them in an external file. Android makes this easy with a resources directory in each Android project. If you created your project using the Android SDK Tools (read Creating …",
          "url":"training/basics/supporting-devices/languages.html",
          "group":"",
          "keywords": ["strings","localizing","localization","resources","formats","l10n"],
          "tags": ["strings","localizing","localization","resources","formats","l10n"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Saving Data in SQL Databases",
          "titleFriendly":"",
          "summary":"Saving data to a database is ideal for repeating or structured data, such as contact information. This class assumes that you are familiar with SQL databases in general and helps you get started with SQLite databases on Android. The APIs you&#39;ll need…",
          "url":"training/basics/data-storage/databases.html",
          "group":"",
          "keywords": ["data storage"],
          "tags": ["datastorage"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Saving Data",
          "titleFriendly":"",
          "summary":"Most Android apps need to save data, even if only to save information about the app state during onPause() so the user&#39;s progress is not lost. Most non-trivial apps also need to save user settings, and some apps must manage large amounts of information…",
          "url":"training/basics/data-storage/index.html",
          "group":"",
          "keywords": ["data storage","files","sql","database","preferences"],
          "tags": ["datastorage","files","sql","database","preferences"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Saving Files",
          "titleFriendly":"",
          "summary":"Android uses a file system that&#39;s similar to disk-based file systems on other platforms. This lesson describes how to work with the Android file system to read and write files with the File APIs. A File object is suited to reading or writing large…",
          "url":"training/basics/data-storage/files.html",
          "group":"",
          "keywords": ["data storage"],
          "tags": ["datastorage"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Saving Key-Value Sets",
          "titleFriendly":"",
          "summary":"If you have a relatively small collection of key-values that you&#39;d like to save, you should use the SharedPreferences APIs. A SharedPreferences object points to a file containing key-value pairs and provides simple methods to read and write them. …",
          "url":"training/basics/data-storage/shared-preferences.html",
          "group":"",
          "keywords": ["data storage"],
          "tags": ["datastorage"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Keeping the Device Awake",
          "titleFriendly":"",
          "summary":"To avoid draining the battery, an Android device that is left idle quickly falls asleep. However, there are times when an application needs to wake up the screen or the CPU and keep it awake to complete some work. The approach you take depends on the …",
          "url":"training/scheduling/wakelock.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Managing Device Awake State",
          "titleFriendly":"",
          "summary":"When an Android device is left idle, it will first dim, then turn off the screen, and ultimately turn off the CPU. This prevents the device&#39;s battery from quickly getting drained. Yet there are times when your application might require a different…",
          "url":"training/scheduling/index.html",
          "group":"",
          "keywords": ["wakelock","alarmmanager","wakefulbroadcastreceiver"],
          "tags": ["wakelock","alarmmanager","wakefulbroadcastreceiver"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Scheduling Repeating Alarms",
          "titleFriendly":"",
          "summary":"The App Clinic: Cricket DevBytes: Efficient Data Transfers Alarms (based on the AlarmManager class) give you a way to perform time-based operations outside the lifetime of your application. For example, you could use an alarm to initiate a long-running…",
          "url":"training/scheduling/alarms.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Sharing Simple Data",
          "titleFriendly":"",
          "summary":"One of the great things about Android applications is their ability to communicate and integrate with each other. Why reinvent functionality that isn&#39;t core to your application when it already exists in another application? This class covers some …",
          "url":"training/sharing/index.html",
          "group":"",
          "keywords": ["intents","share"],
          "tags": ["intents","share"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Adding an Easy Share Action",
          "titleFriendly":"",
          "summary":"Implementing an effective and user friendly share action in your ActionBar is made even easier with the introduction of ActionProvider in Android 4.0 (API Level 14). An ActionProvider, once attached to a menu item in the action bar, handles both the appearance…",
          "url":"training/sharing/shareaction.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/ui/actionbar-shareaction.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Sending Simple Data to Other Apps",
          "titleFriendly":"",
          "summary":"When you construct an intent, you must specify the action you want the intent to &quot;trigger.&quot; Android defines several actions, including ACTION_SEND which, as you can probably guess, indicates that the intent is sending data from one activity …",
          "url":"training/sharing/send.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/sharing/share-text-screenshot.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Receiving Simple Data from Other Apps",
          "titleFriendly":"",
          "summary":"Just as your application can send data to other applications, so too can it easily receive data from applications. Think about how users interact with your application, and what data types you want to receive from other applications. For example, a social…",
          "url":"training/sharing/receive.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Supporting Keyboard Navigation",
          "titleFriendly":"",
          "summary":"In addition to soft input methods (such as on-screen keyboards), Android supports physical keyboards attached to the device. A keyboard offers not only a convenient mode for text input, but also offers a way for users to navigate and interact with your…",
          "url":"training/keyboard-input/navigation.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Handling Keyboard Input",
          "titleFriendly":"",
          "summary":"The Android system shows an on-screen keyboard—known as a soft input method —when a text field in your UI receives focus. To provide the best user experience, you can specify characteristics about the type of input you expect (such as whether it&#39;s…",
          "url":"training/keyboard-input/index.html",
          "group":"",
          "keywords": ["edittext","accessibility"],
          "tags": ["edittext","accessibility"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Handling Keyboard Actions",
          "titleFriendly":"",
          "summary":"When the user gives focus to an editable text view such as an EditText element and the user has a hardware keyboard attached, all input is handled by the system. If, however, you&#39;d like to intercept or directly handle the keyboard input yourself, …",
          "url":"training/keyboard-input/commands.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Specifying the Input Method Type",
          "titleFriendly":"",
          "summary":"Every text field expects a certain type of text input, such as an email address, phone number, or just plain text. So it&#39;s important that you specify the input type for each text field in your app so the system displays the appropriate soft input …",
          "url":"training/keyboard-input/style.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/ui/edittext-phone.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Handling Input Method Visibility",
          "titleFriendly":"",
          "summary":"When input focus moves into or out of an editable text field, Android shows or hides the input method (such as the on-screen keyboard) as appropriate. The system also makes decisions about how your UI and the text field appear above the input method. …",
          "url":"training/keyboard-input/visibility.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Apps with User Info &amp; Location",
          "titleFriendly":"",
          "summary":"These classes teach you how to add user personalization to your app. Some of the ways you can do this is by identifying users, providing information that&#39;s relevant to them, and providing information about the world around them.…",
          "url":"training/building-userinfo.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Best Practices for Background Jobs",
          "titleFriendly":"",
          "summary":"These classes show you how to run jobs in the background to boost your application&#39;s performance and minimize its drain on the battery.…",
          "url":"training/best-background.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating a Background Service",
          "titleFriendly":"",
          "summary":"The IntentService class provides a straightforward structure for running an operation on a single background thread. This allows it to handle long-running operations without affecting your user interface&#39;s responsiveness. Also, an IntentService isn…",
          "url":"training/run-background-service/create-service.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Sending Work Requests to the Background Service",
          "titleFriendly":"",
          "summary":"The previous lesson showed you how to create an IntentService class. This lesson shows you how to trigger the IntentService to run an operation by sending it an Intent. This Intent can optionally contain data for the IntentService to process. You can …",
          "url":"training/run-background-service/send-request.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Running in a Background Service",
          "titleFriendly":"",
          "summary":"Unless you specify otherwise, most of the operations you do in an app run in the foreground on a special thread called the UI thread. This can cause problems, because long-running operations will interfere with the responsiveness of your user interface…",
          "url":"training/run-background-service/index.html",
          "group":"",
          "keywords": ["intentservice"],
          "tags": ["intentservice"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Reporting Work Status",
          "titleFriendly":"",
          "summary":"This lesson shows you how to report the status of a work request run in a background service to the component that sent the request. This allows you, for example, to report the status of the request in an Activity object&#39;s UI. The recommended way …",
          "url":"training/run-background-service/report-status.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Supporting Multiple Game Controllers",
          "titleFriendly":"",
          "summary":"While most games are designed to support a single user per Android device, it&#39;s also possible to support multiple users with game controllers that are connected simultaneously on the same Android device. This lesson covers some basic techniques for…",
          "url":"training/game-controllers/multiple-controllers.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Supporting Game Controllers",
          "titleFriendly":"",
          "summary":"You can greatly enhance the user experience in your game by letting players use their favorite game controllers. The Android framework provides APIs for detecting and processing user input from game controllers. This class shows how to make your game …",
          "url":"training/game-controllers/index.html",
          "group":"",
          "keywords": ["game controller"],
          "tags": ["gamecontroller"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Handling Controller Actions",
          "titleFriendly":"",
          "summary":"At the system level, Android reports input event codes from game controllers as Android key codes and axis values. In your game, you can receive these codes and values and convert them to specific in-game actions. When players physically connect or wirelessly…",
          "url":"training/game-controllers/controller-input.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/game-controller-profiles.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Supporting Controllers Across Android Versions",
          "titleFriendly":"",
          "summary":"If you are supporting game controllers in your game, it&#39;s your responsibility to make sure that your game responds to controllers consistently across devices running on different versions of Android. This lets your game reach a wider audience, and…",
          "url":"training/game-controllers/compatibility.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/backward-compatible-inputmanager.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Sending Files to Another Device",
          "titleFriendly":"",
          "summary":"This lesson shows you how to design your app to send large files to another device using Android Beam file transfer. To send files, you request permission to use NFC and external storage, test to ensure your device supports NFC, and provide URIs to Android…",
          "url":"training/beam-files/send-files.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Sharing Files with NFC",
          "titleFriendly":"",
          "summary":"Android allows you to transfer large files between devices using the Android Beam file transfer feature. This feature has a simple API and allows users to start the transfer process by simply touching devices. In response, Android Beam file transfer automatically…",
          "url":"training/beam-files/index.html",
          "group":"",
          "keywords": ["nfcadapter","android beam","share","file transfer"],
          "tags": ["nfcadapter","androidbeam","share","filetransfer"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Receiving Files from Another Device",
          "titleFriendly":"",
          "summary":"Android Beam file transfer copies files to a special directory on the receiving device. It also scans the copied files using the Android Media Scanner and adds entries for media files to the MediaStore provider. This lesson shows you how to respond when…",
          "url":"training/beam-files/receive-files.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Best Practices for Performance",
          "titleFriendly":"",
          "summary":"These classes and articles help you build an app that&#39;s smooth, responsive, and uses as little battery as possible.…",
          "url":"training/best-performance.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Implementing Effective Navigation",
          "titleFriendly":"",
          "summary":"This class demonstrates how to implement the key navigation design patterns detailed in the Designing Effective Navigation class. After reading the lessons in this class, you should have a strong understanding of how to implement navigation patterns with…",
          "url":"training/implementing-navigation/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Providing Proper Back Navigation",
          "titleFriendly":"",
          "summary":"Back navigation is how users move backward through the history of screens they previously visited. All Android devices provide a Back button for this type of navigation, so your app should not add a Back button to the UI . In almost all situations, the…",
          "url":"training/implementing-navigation/temporal.html",
          "group":"",
          "keywords": ["back navigation","navutils","taskstackbuilder"],
          "tags": ["backnavigation","navutils","taskstackbuilder"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Implementing Descendant Navigation",
          "titleFriendly":"",
          "summary":"Descendant navigation is navigation down the application&#39;s information hierarchy. This is described in Designing Effective Navigation and also covered in Android Design: Application Structure . Descendant navigation is usually implemented using Intent…",
          "url":"training/implementing-navigation/descendant.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Swipe Views with Tabs",
          "titleFriendly":"",
          "summary":"Swipe views provide lateral navigation between sibling screens such as tabs with a horizontal finger gesture (a pattern sometimes known as horizontal paging). This lesson teaches you how to create a tab layout with swipe views for switching between tabs…",
          "url":"training/implementing-navigation/lateral.html",
          "group":"",
          "keywords": ["viewpager","horizontal","paging","swipe view","tabs"],
          "tags": ["viewpager","horizontal","paging","swipeview","tabs"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Providing Up Navigation",
          "titleFriendly":"",
          "summary":"All screens in your app that are not the main entrance to your app (the &quot;home&quot; screen) should offer the user a way to navigate to the logical parent screen in the app&#39;s hierarchy by pressing the Up button in the action bar . This lesson …",
          "url":"training/implementing-navigation/ancestral.html",
          "group":"",
          "keywords": ["up navigation","navutils","taskstackbuilder"],
          "tags": ["upnavigation","navutils","taskstackbuilder"],
          "image":"images/training/implementing-navigation-up.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating a Navigation Drawer",
          "titleFriendly":"",
          "summary":"The navigation drawer is a panel that displays the app’s main navigation options on the left edge of the screen. It is hidden most of the time, but is revealed when the user swipes a finger from the left edge of the screen or, while at the top level of…",
          "url":"training/implementing-navigation/nav-drawer.html",
          "group":"",
          "keywords": ["drawerlayout","navigation"],
          "tags": ["drawerlayout","navigation"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Transmitting Network Data Using Volley",
          "titleFriendly":"",
          "summary":"Volley: Easy, Fast Networking for Android Volley is an HTTP library that makes networking for Android apps easier and most importantly, faster. Volley is available through the open AOSP repository. Volley offers the following benefits: Volley excels at…",
          "url":"training/volley/index.html",
          "group":"",
          "keywords": [""],
          "tags": [""],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Making a Standard Request",
          "titleFriendly":"",
          "summary":"Volley: Easy, Fast Networking for Android This lesson describes how to use the common request types that Volley supports: If your expected response is one of these types, you probably won&#39;t have to implement a custom request. This lesson describes…",
          "url":"training/volley/request.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Implementing a Custom Request",
          "titleFriendly":"",
          "summary":"Volley: Easy, Fast Networking for Android This lesson describes how to implement your own custom request types, for types that don&#39;t have out-of-the-box Volley support. For cases where you do need to implement a custom request, this is all you need…",
          "url":"training/volley/request-custom.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Setting Up a RequestQueue",
          "titleFriendly":"",
          "summary":"Volley: Easy, Fast Networking for Android The previous lesson showed you how to use the convenience method Volley.newRequestQueue to set up a RequestQueue, taking advantage of Volley&#39;s default behaviors. This lesson walks you through the explicit …",
          "url":"training/volley/requestqueue.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Sending a Simple Request",
          "titleFriendly":"",
          "summary":"Volley: Easy, Fast Networking for Android At a high level, you use Volley by creating a RequestQueue and passing it Request objects. The RequestQueue manages worker threads for running the network operations, reading from and writing to the cache, and…",
          "url":"training/volley/simple.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/volley-request.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Getting Started",
          "titleFriendly":"",
          "summary":"Android Training provides a collection of classes that aim to help you build great apps for Android. Each class explains the steps required to solve a problem or implement a feature using code snippets and sample code for you to use in your apps.",
          "url":"training/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating and Running a Test Case",
          "titleFriendly":"",
          "summary":"In order to verify that there are no regressions in the layout design and functional behavior in your application, it&#39;s important to create a test for each Activity in your application. For each test, you need to create the individual parts of a test…",
          "url":"training/activity-testing/activity-basic-testing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/activity-testing_lesson2_MyFirstTestActivityTest_result.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Testing Your Android Activity",
          "titleFriendly":"",
          "summary":"You should be writing and running tests as part of your Android application development cycle. Well-written tests can help you to catch bugs early in development and give you confidence in your code. A test case defines a set of objects and methods to…",
          "url":"training/activity-testing/index.html",
          "group":"",
          "keywords": ["testing"],
          "tags": ["testing"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Testing UI Components",
          "titleFriendly":"",
          "summary":"Typically, your Activity includes user interface components (such as buttons, editable text fields, checkboxes, and pickers) to allow users to interact with your Android application. This lesson shows how you can test an Activity with a simple push-button…",
          "url":"training/activity-testing/activity-ui-testing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Functional Tests",
          "titleFriendly":"",
          "summary":"Functional testing involves verifying that individual application components work together as expected by the user. For example, you can create a functional test to verify that an Activity correctly launches a target Activity when the user performs a …",
          "url":"training/activity-testing/activity-functional-testing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Setting Up Your Test Environment",
          "titleFriendly":"",
          "summary":"Before you start writing and running your tests, you should set up your test development environment. This lesson teaches you how to set up the Eclipse IDE to build and run tests, and how to build and run tests with the Gradle framework by using the command…",
          "url":"training/activity-testing/preparing-activity-testing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Unit Tests",
          "titleFriendly":"",
          "summary":"An Activity unit test is an excellent way to quickly verify the state of an Activity and its interactions with other components in isolation (that is, disconnected from the rest of the system). A unit test generally tests the smallest possible unit of…",
          "url":"training/activity-testing/activity-unit-testing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Adding Search Functionality",
          "titleFriendly":"",
          "summary":"Android&#39;s built-in search features offer apps an easy way to provide a consistent search experience for all users. There are two ways to implement search in your app depending on the version of Android that is running on the device. This class covers…",
          "url":"training/search/index.html",
          "group":"",
          "keywords": ["searchview","database"],
          "tags": ["searchview","database"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Remaining Backward Compatible",
          "titleFriendly":"",
          "summary":"The SearchView and action bar are only available on Android 3.0 and later. To support older platforms, you can fall back to the search dialog. The search dialog is a system provided UI that overlays on top of your application when invoked. To setup the…",
          "url":"training/search/backward-compat.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Setting Up the Search Interface",
          "titleFriendly":"",
          "summary":"Beginning in Android 3.0, using the SearchView widget as an item in the action bar is the preferred way to provide search in your app. Like with all items in the action bar, you can define the SearchView to show at all times, only when there is room, …",
          "url":"training/search/setup.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Storing and Searching for Data",
          "titleFriendly":"",
          "summary":"There are many ways to store your data, such as in an online database, in a local SQLite database, or even in a text file. It is up to you to decide what is the best solution for your application. This lesson shows you how to create a SQLite virtual table…",
          "url":"training/search/search.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Capturing Photos",
          "titleFriendly":"",
          "summary":"The world was a dismal and featureless place before rich media became prevalent. Remember Gopher? We don&#39;t, either. For your app to become part of your users&#39; lives, give them a way to put their lives into it. Using the on-board cameras, your …",
          "url":"training/camera/index.html",
          "group":"",
          "keywords": ["camera","video","picture"],
          "tags": ["camera","video","picture"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Controlling the Camera",
          "titleFriendly":"",
          "summary":"In this lesson, we discuss how to control the camera hardware directly using the framework APIs. Directly controlling a device camera requires a lot more code than requesting pictures or videos from existing camera applications. However, if you want to…",
          "url":"training/camera/cameradirect.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Taking Photos Simply",
          "titleFriendly":"",
          "summary":"This lesson explains how to capture photos using an existing camera application. Suppose you are implementing a crowd-sourced weather service that makes a global weather map by blending together pictures of the sky taken by devices running your client…",
          "url":"training/camera/photobasics.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Recording Videos Simply",
          "titleFriendly":"",
          "summary":"This lesson explains how to capture video using existing camera applications. Your application has a job to do, and integrating videos is only a small part of it. You want to take videos with minimal fuss, and not reinvent the camcorder. Happily, most…",
          "url":"training/camera/videobasics.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Apps for Work",
          "titleFriendly":"",
          "summary":"Learn how to build Android apps for the enterprise and take advantage of Google's Android for Work program.",
          "url":"training/enterprise/index.html",
          "group":"",
          "keywords": ["work","enterprise","corporate"],
          "tags": ["work","enterprise","corporate"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Implementing App Restrictions",
          "titleFriendly":"",
          "summary":"Learn how to implement app restrictions and configuration settings that can be changed by other apps on the same device.",
          "url":"training/enterprise/app-restrictions.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Enhancing Security with Device Management Policies",
          "titleFriendly":"",
          "summary":"Since Android 2.2 (API level 8), the Android platform offers system-level device management capabilities through the Device Administration APIs. In this lesson, you will learn how to create a security-aware application that manages access to its content…",
          "url":"training/enterprise/device-management-policy.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/device-mgmt-activate-device-admin.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Ensuring Compatibility with Managed Profiles",
          "titleFriendly":"",
          "summary":"Learn how to make sure your apps operate smoothly in a corporate environment by following some best practices.",
          "url":"training/enterprise/app-compatibility.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building a Work Policy Controller",
          "titleFriendly":"",
          "summary":"Learn how to develop a Work Policy Controller to create and administer a managed profile on an employee's device.",
          "url":"training/enterprise/work-policy-ctrl.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Custom Views",
          "titleFriendly":"",
          "summary":"The Android framework has a large set of View classes for interacting with the user and displaying various types of data. But sometimes your app has unique needs that aren’t covered by the built-in views. This class shows you how to create your own views…",
          "url":"training/custom-views/index.html",
          "group":"",
          "keywords": ["widgets","ui","layout"],
          "tags": ["widgets","ui","layout"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Custom Drawing",
          "titleFriendly":"",
          "summary":"The most important part of a custom view is its appearance. Custom drawing can be easy or complex according to your application&#39;s needs. This lesson covers some of the most common operations. The most important step in drawing a custom view is to …",
          "url":"training/custom-views/custom-drawing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Optimizing the View",
          "titleFriendly":"",
          "summary":"Now that you have a well-designed view that responds to gestures and transitions between states, ensure that the view runs fast. To avoid a UI that feels sluggish or stutters during playback, ensure that animations consistently run at 60 frames per second…",
          "url":"training/custom-views/optimizing-view.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating a View Class",
          "titleFriendly":"",
          "summary":"A well-designed custom view is much like any other well-designed class. It encapsulates a specific set of functionality with an easy to use interface, it uses CPU and memory efficiently, and so forth. In addition to being a well-designed class, though…",
          "url":"training/custom-views/create-view.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Making the View Interactive",
          "titleFriendly":"",
          "summary":"Drawing a UI is only one part of creating a custom view. You also need to make your view respond to user input in a way that closely resembles the real-world action you&#39;re mimicking. Objects should always act in the same way that real objects do. …",
          "url":"training/custom-views/making-interactive.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Adding Sign-In",
          "titleFriendly":"",
          "summary":"The Google+ platform for Android lets you authenticate a user with the same credentials they use on Google every day. Once a user signs in with Google, you can create more engaging experiences and drive usage of your app. The Google+ Android API allows…",
          "url":"training/sign-in/index.html",
          "group":"",
          "keywords": ["authentication","signin","social","google+"],
          "tags": ["authentication","signin","social","google+"],
          "image":"images/google/gps-googleplus.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Adding Maps",
          "titleFriendly":"",
          "summary":"Allow your users to explore the world with rich maps provided by Google. Identify locations with custom markers, augment the map data with image overlays, embed one or more maps as fragments, and much more. The Google Maps Android API allows you to include…",
          "url":"training/maps/index.html",
          "group":"",
          "keywords": ["mapview","location"],
          "tags": ["mapview","location"],
          "image":"images/google/gps-maps.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Advanced Training",
          "titleFriendly":"",
          "summary":"Advanced Training contains a variety of classes that teach you best practices in Android development. These classes simplify the steps required to enhance your app with powerful platform features or effectively optimize your app performance. What you …",
          "url":"training/advanced.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building a Notification",
          "titleFriendly":"",
          "summary":"This lesson explains how to create and issue a notification. The examples in this class are based on the Builder class. Builder is in the Support Library . You should use NotificationCompat and its subclasses, particularly Builder, to provide the best…",
          "url":"training/notify-user/build-notification.html",
          "group":"",
          "keywords": ["notifications"],
          "tags": ["notifications"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Preserving Navigation when Starting an Activity",
          "titleFriendly":"",
          "summary":"Part of designing a notification is preserving the user&#39;s expected navigation experience. For a detailed discussion of this topic, see the Notifications API guide. There are two general situations: To set up a PendingIntent that starts a direct entry…",
          "url":"training/notify-user/navigation.html",
          "group":"",
          "keywords": ["notifications"],
          "tags": ["notifications"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Notifying the User",
          "titleFriendly":"",
          "summary":"A notification is a user interface element that you display outside your app&#39;s normal UI to indicate that an event has occurred. Users can choose to view the notification while using other apps and respond to it when it&#39;s convenient for them. …",
          "url":"training/notify-user/index.html",
          "group":"",
          "keywords": ["notifications"],
          "tags": ["notifications"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Using Big View Styles",
          "titleFriendly":"",
          "summary":"Notifications in the notification drawer appear in two main visual styles, normal view and big view. The big view of a notification only appears when the notification is expanded. This happens when the notification is at the top of the drawer, or the …",
          "url":"training/notify-user/expanded.html",
          "group":"",
          "keywords": ["notifications"],
          "tags": ["notifications"],
          "image":"images/training/notifications-normalview.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Displaying Progress in a Notification",
          "titleFriendly":"",
          "summary":"Notifications can include an animated progress indicator that shows users the status of an ongoing operation. If you can estimate how long the operation takes and how much of it is complete at any time, use the &quot;determinate&quot; form of the indicator…",
          "url":"training/notify-user/display-progress.html",
          "group":"",
          "keywords": ["notifications"],
          "tags": ["notifications"],
          "image":"images/ui/notifications/progress_bar_summary.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Updating Notifications",
          "titleFriendly":"",
          "summary":"When you need to issue a notification multiple times for the same type of event, you should avoid making a completely new notification. Instead, you should consider updating a previous notification, either by changing some of its values or by adding to…",
          "url":"training/notify-user/managing.html",
          "group":"",
          "keywords": ["notifications"],
          "tags": ["notifications"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Specifying the Code to Run on a Thread",
          "titleFriendly":"",
          "summary":"This lesson shows you how to implement a Runnable class, which runs the code in its run() method on a separate thread. You can also pass a Runnable to another object that can then attach it to a thread and run it. One or more Runnable objects that perform…",
          "url":"training/multiple-threads/define-runnable.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Running Code on a Thread Pool Thread",
          "titleFriendly":"",
          "summary":"The previous lesson showed you how to define a class that manages thread pools and the tasks that run on them. This lesson shows you how to run a task on a thread pool. To do this, you add the task to the pool&#39;s work queue. When a thread becomes available…",
          "url":"training/multiple-threads/run-code.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Sending Operations to Multiple Threads",
          "titleFriendly":"",
          "summary":"The speed and efficiency of a long-running, data-intensive operation often improves when you split it into smaller operations running on multiple threads. On a device that has a CPU with multiple processors (cores), the system can run the threads in parallel…",
          "url":"training/multiple-threads/index.html",
          "group":"",
          "keywords": ["threadpool","runnable"],
          "tags": ["threadpool","runnable"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating a Manager for Multiple Threads",
          "titleFriendly":"",
          "summary":"The previous lesson showed how to define a task that executes on a separate thread. If you only want to run the task once, this may be all you need. If you want to run a task repeatedly on different sets of data, but you only need one execution running…",
          "url":"training/multiple-threads/create-threadpool.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Communicating with the UI Thread",
          "titleFriendly":"",
          "summary":"In the previous lesson you learned how to start a task on a thread managed by ThreadPoolExecutor. This final lesson shows you how to send data from the task to objects running on the user interface (UI) thread. This feature allows your tasks to do background…",
          "url":"training/multiple-threads/communicate-ui.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Best Practices for User Input",
          "titleFriendly":"",
          "summary":"These classes cover various subjects of user input, such as touch screen gestures and text input through on-screen input methods and hardware keyboards.…",
          "url":"training/best-user-input.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Apps for Wearables",
          "titleFriendly":"",
          "summary":"Learn how to build notifications, send and sync data, and use voice actions.",
          "url":"training/building-wearables.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/cards/android-wear-apps_2x.jpg",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Modifying Contacts Using Intents",
          "titleFriendly":"",
          "summary":"This lesson shows you how to use an Intent to insert a new contact or modify a contact&#39;s data. Instead of accessing the Contacts Provider directly, an Intent starts the contacts app, which runs the appropriate Activity. For the modification actions…",
          "url":"training/contacts-provider/modify-data.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Retrieving Details for a Contact",
          "titleFriendly":"",
          "summary":"This lesson shows how to retrieve detail data for a contact, such as email addresses, phone numbers, and so forth. It&#39;s the details that users are looking for when they retrieve a contact. You can give them all the details for a contact, or only display…",
          "url":"training/contacts-provider/retrieve-details.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Accessing Contacts Data",
          "titleFriendly":"",
          "summary":"The Contacts Provider is the central repository of the user&#39;s contacts information, including data from contacts apps and social networking apps. In your apps, you can access Contacts Provider information directly by calling ContentResolver methods…",
          "url":"training/contacts-provider/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Retrieving a List of Contacts",
          "titleFriendly":"",
          "summary":"This lesson shows you how to retrieve a list of contacts whose data matches all or part of a search string, using the following techniques: To do any type of search of the Contacts Provider, your app must have READ_CONTACTS permission. To request this…",
          "url":"training/contacts-provider/retrieve-names.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Displaying the Quick Contact Badge",
          "titleFriendly":"",
          "summary":"This lesson shows you how to add a QuickContactBadge to your UI and how to bind data to it. A QuickContactBadge is a widget that initially appears as a thumbnail image. Although you can use any Bitmap for the thumbnail image, you usually use a Bitmap …",
          "url":"training/contacts-provider/display-contact-badge.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Animating Views Using Scenes and Transitions",
          "titleFriendly":"",
          "summary":"DevBytes: Android 4.4 Transitions The user interface of an activity often changes in response to user input and other events. For example, an activity that contains a form where users can type search queries can hide the form when the user submits it …",
          "url":"training/transitions/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"The Transitions Framework",
          "titleFriendly":"",
          "summary":"Animating your app&#39;s user interface provides more than just visual appeal. Animations highlight changes and provide visual cues that help users learn how your app works. To help you animate a change between one view hierarchy and another, Android …",
          "url":"training/transitions/overview.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/transitions/transitions_diagram.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating a Scene",
          "titleFriendly":"",
          "summary":"Scenes store the state of a view hierarchy, including all its views and their property values. The transitions framework can run animations between a starting and an ending scene. The starting scene is often determined automatically from the current state…",
          "url":"training/transitions/scenes.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Custom Transitions",
          "titleFriendly":"",
          "summary":"A custom transition enables you to create an animation that is not available from any of the built-in transition classes. For example, you can define a custom transition that turns the foreground color of text and input fields to gray to indicate that…",
          "url":"training/transitions/custom-transitions.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Applying a Transition",
          "titleFriendly":"",
          "summary":"In the transitions framework, animations create a series of frames that depict a change between the view hierarchies in the starting and ending scenes. The framework represents these animations as transition objects, which contain information about an…",
          "url":"training/transitions/transitions.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Android Keystore System",
          "titleFriendly":"",
          "summary":"The Android Keystore system lets you store cryptographic 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 key material remaining non-exportable…",
          "url":"training/articles/keystore.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Performance Tips",
          "titleFriendly":"",
          "summary":"This document primarily covers micro-optimizations that can improve overall app performance when combined, but it&#39;s unlikely that these changes will result in dramatic performance effects. Choosing the right algorithms and data structures should always…",
          "url":"training/articles/perf-tips.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"SMP Primer for Android",
          "titleFriendly":"",
          "summary":"Android 3.0 and later platform versions are optimized to support multiprocessor architectures. This document introduces issues that can arise when writing code for symmetric multiprocessor systems in C, C++, and the Java programming language (hereafter…",
          "url":"training/articles/smp.html",
          "group":"",
          "keywords": ["ndk","native"],
          "tags": ["ndk","native"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"JNI Tips",
          "titleFriendly":"",
          "summary":"JNI is the Java Native Interface. It defines a way for managed code (written in the Java programming language) to interact with native code (written in C&#47;C++). It&#39;s vendor-neutral, has support for loading code from dynamic shared libraries, and…",
          "url":"training/articles/perf-jni.html",
          "group":"",
          "keywords": ["ndk","native"],
          "tags": ["ndk","native"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"﻿Security with HTTPS and SSL",
          "titleFriendly":"",
          "summary":"The Secure Sockets Layer (SSL)—now technically known as Transport Layer Security (TLS) —is a common building block for encrypted communications between clients and servers. It&#39;s possible that an application might use SSL incorrectly such that malicious…",
          "url":"training/articles/security-ssl.html",
          "group":"",
          "keywords": ["network","certificates"],
          "tags": ["network","certificates"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Updating Your Security Provider to Protect Against SSL Exploits",
          "titleFriendly":"",
          "summary":"Android relies on a security Provider to provide secure network communications. However, from time to time, vulnerabilities are found in the default security provider. To protect against these vulnerabilities, Google Play services provides a way to automatically…",
          "url":"training/articles/security-gms-provider.html",
          "group":"",
          "keywords": ["network","certificates"],
          "tags": ["network","certificates"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Keeping Your App Responsive",
          "titleFriendly":"",
          "summary":"It&#39;s possible to write code that wins every performance test in the world, but still feels sluggish, hang or freeze for significant periods, or take too long to process input. The worst thing that can happen to your app&#39;s responsiveness is an …",
          "url":"training/articles/perf-anr.html",
          "group":"",
          "keywords": ["threads","asynctask"],
          "tags": ["threads","asynctask"],
          "image":"images/anr.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"﻿Detecting Location on Android Wear",
          "titleFriendly":"",
          "summary":"Location awareness on wearable devices enables you to create apps that give users a better understanding of their geographic position, movement and what&#39;s around them. With the small form factor and glanceable nature of a wearable device, you can …",
          "url":"training/articles/wear-location-detection.html",
          "group":"",
          "keywords": ["gps"],
          "tags": ["gps"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Managing Your App&#39;s Memory",
          "titleFriendly":"",
          "summary":"Random-access memory (RAM) is a valuable resource in any software development environment, but it&#39;s even more valuable on a mobile operating system where physical memory is often constrained. Although Android&#39;s Dalvik virtual machine performs …",
          "url":"training/articles/memory.html",
          "group":"",
          "keywords": ["ram","low memory","outofmemoryerror","ontrimmemory"],
          "tags": ["ram","lowmemory","outofmemoryerror","ontrimmemory"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"﻿Security Tips",
          "titleFriendly":"",
          "summary":"Android has security features built into the operating system that significantly reduce the frequency and impact of application security issues. The system is designed so you can typically build your apps with default system and file permissions and avoid…",
          "url":"training/articles/security-tips.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Providing Descendant and Lateral Navigation",
          "titleFriendly":"",
          "summary":"One way of providing access to the full range of an application&#39;s screens is to expose hierarchical navigation. In this lesson we discuss descendant navigation , allowing users to descend &#39;down&#39; a screen hierarchy into a child screen, and …",
          "url":"training/design-navigation/descendant-lateral.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/app-navigation-descendant-lateral-desc.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Providing Ancestral and Temporal Navigation",
          "titleFriendly":"",
          "summary":"Now that users can navigate deep into the application&#39;s screen hierarchy, we need to provide a method for navigating up the hierarchy, to parent and ancestor screens. Additionally, we should ensure that temporal navigation via the Back button is respected…",
          "url":"training/design-navigation/ancestral-temporal.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/app-navigation-ancestral-navigate-back.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Designing Effective Navigation",
          "titleFriendly":"",
          "summary":"This class is not specific to any particular version of the Android platform. It is also primarily design-focused and does not require knowledge of the Android SDK. That said, you should have experience using an Android device for a better understanding…",
          "url":"training/design-navigation/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Planning Screens and Their Relationships",
          "titleFriendly":"",
          "summary":"Most apps have an inherent information model that can be expressed as a tree or graph of object types. In more obvious terms, you can draw a diagram of different kinds of information that represents the types of things users interact with in your app.…",
          "url":"training/design-navigation/screen-planning.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/app-navigation-screen-planning-erd.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Putting it All Together: Wireframing the Example App",
          "titleFriendly":"",
          "summary":"Now that we have a solid understanding of navigation patterns and screen grouping techniques, it&#39;s time to apply them to our screens. Let&#39;s take another look at our exhaustive screen map for the example news application from the first lesson ,…",
          "url":"training/design-navigation/wireframing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/app-navigation-screen-planning-exhaustive-map.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Planning for Multiple Touchscreen Sizes",
          "titleFriendly":"",
          "summary":"Designing an intuitive, effective navigation for tablets and other devices.",
          "url":"training/design-navigation/multiple-sizes.html",
          "group":"",
          "keywords": [],
          "tags": ["multiplescreens"],
          "image":"images/training/app-navigation-multiple-sizes-strategy-stack.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Printing HTML Documents",
          "titleFriendly":"",
          "summary":"Printing out content beyond a simple photo on Android requires composing text and graphics in a print document. The Android framework provides a way to use HTML to compose a document and print it with a minimum of code. In Android 4.4 (API level 19), …",
          "url":"training/printing/html-docs.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Printing Photos",
          "titleFriendly":"",
          "summary":"Taking and sharing photos is one of the most popular uses for mobile devices. If your application takes photos, displays them, or allows users to share images, you should consider enabling printing of those images in your application. The Android Support…",
          "url":"training/printing/photos.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Printing Content",
          "titleFriendly":"",
          "summary":"DevBytes: Android 4.4 Printing API Android users frequently view content solely on their devices, but there are times when showing someone a screen is not an adequate way to share information. Being able to print information from your Android application…",
          "url":"training/printing/index.html",
          "group":"",
          "keywords": ["print","navigation","gesturedetector","scroller"],
          "tags": ["print","navigation","gesturedetector","scroller"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Printing Custom Documents",
          "titleFriendly":"",
          "summary":"For some applications, such as drawing apps, page layout apps and other apps that focus on graphic output, creating beautiful printed pages is a key feature. In this case, it is not enough to print an image or an HTML document. The print output for these…",
          "url":"training/printing/custom-docs.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Resolving Cloud Save Conflicts",
          "titleFriendly":"",
          "summary":"This article describes how to design a robust conflict resolution strategy for apps that save data to the cloud using the Cloud Save service . The Cloud Save service allows you to store application data for each user of an application on Google&#39;s …",
          "url":"training/cloudsave/conflict-res.html",
          "group":"",
          "keywords": ["cloud"],
          "tags": ["cloud"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Syncing to the Cloud",
          "titleFriendly":"",
          "summary":"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 data is always backed…",
          "url":"training/cloudsync/index.html",
          "group":"",
          "keywords": ["cloud","sync","backup"],
          "tags": ["cloud","sync","backup"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Using the Backup API",
          "titleFriendly":"",
          "summary":"When a user purchases a new device or resets their existing one, they might expect that when Google Play restores your app back to their device during the initial setup, the previous data associated with the app restores as well. By default, that doesn…",
          "url":"training/cloudsync/backupapi.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating P2P Connections with Wi-Fi",
          "titleFriendly":"",
          "summary":"The Wi-Fi peer-to-peer (P2P) APIs allow applications to connect to nearby devices without needing to connect to a network or hotspot (Android&#39;s Wi-Fi P2P framework complies with the Wi-Fi Direct™ certification program). Wi-Fi P2P allows your application…",
          "url":"training/connect-devices-wirelessly/wifi-direct.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Connecting Devices Wirelessly",
          "titleFriendly":"",
          "summary":"DevBytes: Network Service Discovery Besides enabling communication with the cloud, Android&#39;s wireless APIs also enable communication with other devices on the same local network, and even devices which are not on a network, but are physically nearby…",
          "url":"training/connect-devices-wirelessly/index.html",
          "group":"",
          "keywords": ["wifi","network","wireless"],
          "tags": ["wifi","network","wireless"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Using Network Service Discovery",
          "titleFriendly":"",
          "summary":"Adding Network Service Discovery (NSD) to your app allows your users to identify other devices on the local network that support the services your app requests. This is useful for a variety of peer-to-peer applications such as file sharing or multi-player…",
          "url":"training/connect-devices-wirelessly/nsd.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Using Wi-Fi P2P for Service Discovery",
          "titleFriendly":"",
          "summary":"The first lesson in this class, Using Network Service Discovery , showed you how to discover services that are connected to a local network. However, using Wi-Fi Peer-to-Peer (P2P) Service Discovery allows you to discover the services of nearby devices…",
          "url":"training/connect-devices-wirelessly/nsd-wifi-direct.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Effective Unit Tests",
          "titleFriendly":"",
          "summary":"Unit tests are the fundamental tests in your app testing strategy. By creating and running unit tests against your code, you can easily verify that the logic of individual units is correct. Running unit tests after every build helps you to quickly catch…",
          "url":"training/testing/unit-testing/index.html",
          "group":"",
          "keywords": ["testing","androidjunitrunner","junit","unit test"],
          "tags": ["testing","androidjunitrunner","junit","unittest"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Local Unit Tests",
          "titleFriendly":"",
          "summary":"If your unit test has no dependencies or only has simple dependencies on Android, you should run your test on a local development machine. This testing approach is efficient because it helps you avoid the overhead of loading the target app and unit test…",
          "url":"training/testing/unit-testing/local-unit-tests.html",
          "group":"",
          "keywords": ["testing","androidjunitrunner","junit","unit test","mock"],
          "tags": ["testing","androidjunitrunner","junit","unittest","mock"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Instrumented Unit Tests",
          "titleFriendly":"",
          "summary":"Instrumented unit tests are unit tests that run on physical devices and emulators, instead of the Java Virtual Machine (JVM) on your local machine. You should create instrumented unit tests if your tests need access to instrumentation information (such…",
          "url":"training/testing/unit-testing/instrumented-unit-tests.html",
          "group":"",
          "keywords": ["testing","androidjunitrunner","junit","unit test","mock","instrumentation"],
          "tags": ["testing","androidjunitrunner","junit","unittest","mock","instrumentation"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Automating User Interface Tests",
          "titleFriendly":"",
          "summary":"User interface (UI) testing lets you ensure that your app meets its functional requirements and achieves a high standard of quality such that it is more likely to be successfully adopted by users. One approach to UI testing is to simply have a human tester…",
          "url":"training/testing/ui-testing/index.html",
          "group":"",
          "keywords": ["testing"],
          "tags": ["testing"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Testing UI for Multiple Apps",
          "titleFriendly":"",
          "summary":"A user interface (UI) test that involves user interactions across multiple apps lets you verify that your app behaves correctly when the user flow crosses into other apps or into the system UI. An example of such a user flow is a messaging app that lets…",
          "url":"training/testing/ui-testing/uiautomator-testing.html",
          "group":"",
          "keywords": ["testing","ui automator"],
          "tags": ["testing","uiautomator"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Testing UI for a Single App",
          "titleFriendly":"",
          "summary":"Testing user interactions within a single app helps to ensure that users do not encounter unexpected results or have a poor experience when interacting with your app. You should get into the habit of creating user interface (UI) tests if you need to verify…",
          "url":"training/testing/ui-testing/espresso-testing.html",
          "group":"",
          "keywords": ["testing","espresso"],
          "tags": ["testing","espresso"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Best Practices for Security &amp; Privacy",
          "titleFriendly":"",
          "summary":"These classes and articles provide information about how to keep your app&#39;s data secure.…",
          "url":"training/best-security.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Providing Messaging for Auto",
          "titleFriendly":"",
          "summary":"Learn how to extend your messaging app for use in Android Auto devices.",
          "url":"training/auto/messaging/index.html",
          "group":"",
          "keywords": ["auto","car","automotive","messaging"],
          "tags": ["auto","car","automotive","messaging"],
          "image":"auto/images/assets/icons/messaging_app_notifications.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Apps for Auto",
          "titleFriendly":"",
          "summary":"Starting point for building apps for Auto, with guidelines, information, and examples.",
          "url":"training/auto/index.html",
          "group":"",
          "keywords": ["auto"],
          "tags": ["auto"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Providing Audio Playback for Auto",
          "titleFriendly":"",
          "summary":"Learn how to extend your audio apps for use in Android Auto devices.",
          "url":"training/auto/audio/index.html",
          "group":"",
          "keywords": ["auto","car","automotive","audio"],
          "tags": ["auto","car","automotive","audio"],
          "image":"auto/images/assets/icons/media_app_playback.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Getting Started with Auto",
          "titleFriendly":"",
          "summary":"Android Auto extends the Android platform into the car. When users connect their handheld devices running Android 5.0 or higher to a compatible vehicle, the Auto user interface provides a car-optimized Android experience on the vehicle&#39;s screen. Users…",
          "url":"training/auto/start/index.html",
          "group":"",
          "keywords": ["auto","car","automotive"],
          "tags": ["auto","car","automotive"],
          "image":"auto/images/assets/icons/auto_app_in_simulator.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Tracking Movement",
          "titleFriendly":"",
          "summary":"This lesson describes how to track movement in touch events. A new onTouchEvent() is triggered with an ACTION_MOVE event whenever the current touch contact position, pressure, or size changes. As described in Detecting Common Gestures , all of these events…",
          "url":"training/gestures/movement.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Using Touch Gestures",
          "titleFriendly":"",
          "summary":"This class describes how to write apps that allow users to interact with an app via touch gestures. Android provides a variety of APIs to help you create and detect gestures. Although your app should not depend on touch gestures for basic behaviors (since…",
          "url":"training/gestures/index.html",
          "group":"",
          "keywords": ["input","navigation","gesturedetector","scroller"],
          "tags": ["input","navigation","gesturedetector","scroller"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Animating a Scroll Gesture",
          "titleFriendly":"",
          "summary":"In Android, scrolling is typically achieved by using the ScrollView class. Any standard layout that might extend beyond the bounds of its container should be nested in a ScrollView to provide a scrollable view that&#39;s managed by the framework. Implementing…",
          "url":"training/gestures/scroll.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Detecting Common Gestures",
          "titleFriendly":"",
          "summary":"A &quot;touch gesture&quot; occurs when a user places one or more fingers on the touch screen, and your application interprets that pattern of touches as a particular gesture. There are correspondingly two phases to gesture detection: The examples in …",
          "url":"training/gestures/detector.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Handling Multi-Touch Gestures",
          "titleFriendly":"",
          "summary":"A multi-touch gesture is when multiple pointers (fingers) touch the screen at the same time. This lesson describes how to detect gestures that involve multiple pointers. When multiple pointers touch the screen at the same time, the system generates the…",
          "url":"training/gestures/multi.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Dragging and Scaling",
          "titleFriendly":"",
          "summary":"This lesson describes how to use touch gestures to drag and scale on-screen objects, using onTouchEvent() to intercept touch events. A common operation for a touch gesture is to use it to drag an object across the screen. The following snippet lets the…",
          "url":"training/gestures/scale.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Managing Touch Events in a ViewGroup",
          "titleFriendly":"",
          "summary":"Handling touch events in a ViewGroup takes special care, because it&#39;s common for a ViewGroup to have children that are targets for different touch events than the ViewGroup itself. To make sure that each view correctly receives the touch events intended…",
          "url":"training/gestures/viewgroup.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Apps with Graphics &amp; Animation",
          "titleFriendly":"",
          "summary":"These classes teach you how to accomplish tasks with graphics that can give your app an edge on the competition. If you want to go beyond the basic user interface to create a beautiful visual experience, these classes will help you get there.…",
          "url":"training/building-graphics.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Loading Data in the Background",
          "titleFriendly":"",
          "summary":"Querying a ContentProvider for data you want to display takes time. If you run the query directly from an Activity, it may get blocked and cause the system to issue an &quot;Application Not Responding&quot; message. Even if it doesn&#39;t, users will …",
          "url":"training/load-data-background/index.html",
          "group":"",
          "keywords": ["cursorloader"],
          "tags": ["cursorloader"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Running a Query with a CursorLoader",
          "titleFriendly":"",
          "summary":"A CursorLoader runs an asynchronous query in the background against a ContentProvider, and returns the results to the Activity or FragmentActivity from which it was called. This allows the Activity or FragmentActivity to continue to interact with the …",
          "url":"training/load-data-background/setup-loader.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Handling the Results",
          "titleFriendly":"",
          "summary":"As shown in the previous lesson, you should begin loading your data with a CursorLoader in your implementation of onCreateLoader(). The loader then provides the query results to your Activity or FragmentActivity in your implementation of onLoadFinished…",
          "url":"training/load-data-background/handle-results.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Remembering Your User",
          "titleFriendly":"",
          "summary":"Everyone likes it when you remember their name. One of the simplest, most effective things you can do to make your app more lovable is to remember who your user is—especially when the user upgrades to a new device or starts carrying a tablet as well as…",
          "url":"training/id-auth/identify.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Remembering Users",
          "titleFriendly":"",
          "summary":"Android users get attached to their devices and to applications that they love. One way to make your application lovable is to make it personal. Android devices know who your user is, what services they have access to, and where they store your data. …",
          "url":"training/id-auth/index.html",
          "group":"",
          "keywords": ["privacy","oauth","accounts"],
          "tags": ["privacy","oauth","accounts"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating a Custom Account Type",
          "titleFriendly":"",
          "summary":"So far we&#39;ve talked about accessing Google APIs, which use accounts and users defined by Google. If you have your own online service, though, it won&#39;t have Google accounts or users, so what do you do? It turns out to be relatively straightforward…",
          "url":"training/id-auth/custom_auth.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Authenticating to OAuth2 Services",
          "titleFriendly":"",
          "summary":"In order to securely access an online service, users need to authenticate to the service—they need to provide proof of their identity. For an application that accesses a third-party service, the security problem is even more complicated. Not only does…",
          "url":"training/id-auth/authenticate.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/oauth_dance.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Using Google Play to Distribute &amp; Monetize",
          "titleFriendly":"",
          "summary":"These classes focus on the business aspects of your app strategy, including techniques for distributing your app on Google Play and techniques for building revenue.…",
          "url":"training/distribute.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Selling In-app Products",
          "titleFriendly":"",
          "summary":"In this class, you&#39;ll learn how to perform common In-app Billing operations from Android applications. In-app billing is a service hosted on Google Play that lets you charge for digital content or for upgrades in your app. The In-app Billing API makes…",
          "url":"training/in-app-billing/index.html",
          "group":"",
          "keywords": ["billing"],
          "tags": ["billing"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Purchasing In-app Billing Products",
          "titleFriendly":"",
          "summary":"Once your application is connected to Google Play, you can initiate purchase requests for in-app products. Google Play provides a checkout interface for users to enter their payment method, so your application does not need to handle payment transactions…",
          "url":"training/in-app-billing/purchase-iab-products.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Testing Your In-app Billing Application",
          "titleFriendly":"",
          "summary":"To ensure that In-app Billing is functioning correctly in your application, you should test the test the application before you publish it on Google Play. Early testing also helps to ensure that the user flow for purchasing in-app items is not confusing…",
          "url":"training/in-app-billing/test-iab-app.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Preparing Your In-app Billing Application",
          "titleFriendly":"",
          "summary":"Before you can start using the In-app Billing service, you&#39;ll need to add the library that contains the In-app Billing Version 3 API to your Android project. You also need to set the permissions for your application to communicate with Google Play…",
          "url":"training/in-app-billing/preparing-iab-app.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Establishing In-app Billing Products for Sale",
          "titleFriendly":"",
          "summary":"Before publishing your In-app Billing application, you&#39;ll need to define the product list of digital goods available for purchase in the Google Play Developer Console . From the Developer Console, you can define product information for in-app products…",
          "url":"training/in-app-billing/list-iab-products.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Checking Device Compatibility with SafetyNet",
          "titleFriendly":"",
          "summary":"SafetyNet provides services for analyzing the configuration of a particular device, to make sure that apps function properly on a particular device and that users have a great experience. The service provides an API your app can use to analyze the device…",
          "url":"training/safetynet/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Apps with Multimedia",
          "titleFriendly":"",
          "summary":"These classes teach you how to create rich multimedia apps that behave the way users expect.…",
          "url":"training/building-multimedia.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Best Practices for Testing",
          "titleFriendly":"",
          "summary":"These classes and articles provide information about how to test your Android application.…",
          "url":"training/testing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Apps with Location &amp; Maps",
          "titleFriendly":"",
          "summary":"These classes teach you how to add user location and mapping information to your app. Make your app more helpful and relevant to users by providing information about where they are and the world around them.…",
          "url":"training/building-location.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Best Practices for User Interface",
          "titleFriendly":"",
          "summary":"These classes teach you how to build a user interface using Android layouts for all types of devices. Android provides a flexible framework for UI design that allows your app to display different layouts for different devices, create custom UI widgets…",
          "url":"training/best-ui.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Designing for Multiple Screens",
          "titleFriendly":"",
          "summary":"Training on how to add intuitive, effective navigation for tablets and other devices.",
          "url":"training/multiscreen/index.html",
          "group":"",
          "keywords": ["tablet","tv","fragments","support"],
          "tags": ["tablet","tv","fragments","support"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Supporting Different Densities",
          "titleFriendly":"",
          "summary":"Providing sets of layouts and drawable resources for specific ranges of device screens.",
          "url":"training/multiscreen/screendensities.html",
          "group":"",
          "keywords": [],
          "tags": ["multiplescreens"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Supporting Different Screen Sizes",
          "titleFriendly":"",
          "summary":"This lesson shows you how to support different screen sizes by: To ensure that your layout is flexible and adapts to different screen sizes, you should use &quot;wrap_content&quot; and &quot;match_parent&quot; for the width and height of some view components…",
          "url":"training/multiscreen/screensizes.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/layout-hvga.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Implementing Adaptative UI Flows",
          "titleFriendly":"",
          "summary":"Depending on the layout that your application is currently showing, the UI flow may be different. For example, if your application is in the dual-pane mode, clicking on an item on the left pane will simply display the content on the right pane; if it …",
          "url":"training/multiscreen/adaptui.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Sharing Files",
          "titleFriendly":"",
          "summary":"Apps often have a need to offer one or more of their files to another app. For example, an image gallery may want to offer files to image editors, or a file management app may want to allow users to copy and paste files between areas in external storage…",
          "url":"training/secure-file-sharing/index.html",
          "group":"",
          "keywords": ["fileprovider","share","contentprovider"],
          "tags": ["fileprovider","share","contentprovider"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Setting Up File Sharing",
          "titleFriendly":"",
          "summary":"To securely offer a file from your app to another app, you need to configure your app to offer a secure handle to the file, in the form of a content URI. The Android FileProvider component generates content URIs for files, based on specifications you …",
          "url":"training/secure-file-sharing/setup-sharing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Retrieving File Information",
          "titleFriendly":"",
          "summary":"Before a client app tries to work with a file for which it has a content URI, the app can request information about the file from the server app, including the file&#39;s data type and file size. The data type helps the client app to determine if it can…",
          "url":"training/secure-file-sharing/retrieve-info.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Requesting a Shared File",
          "titleFriendly":"",
          "summary":"When an app wants to access a file shared by another app, the requesting app (the client) usually sends a request to the app sharing the files (the server). In most cases, the request starts an Activity in the server app that displays the files it can…",
          "url":"training/secure-file-sharing/request-file.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Sharing a File",
          "titleFriendly":"",
          "summary":"Once you have set up your app to share files using content URIs, you can respond to other apps&#39; requests for those files. One way to respond to these requests is to provide a file selection interface from the server app that other applications can…",
          "url":"training/secure-file-sharing/share-file.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Developing an Accessibility Service",
          "titleFriendly":"",
          "summary":"Accessibility services are a feature of the Android framework designed to provide alternative navigation feedback to the user on behalf of applications installed on Android devices. An accessibility service can communicate to the user on the application…",
          "url":"training/accessibility/service.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Implementing Accessibility",
          "titleFriendly":"",
          "summary":"When it comes to reaching as wide a userbase as possible, it&#39;s important to pay attention to accessibility in your Android application. Cues in your user interface that may work for a majority of users, such as a visible change in state when a button…",
          "url":"training/accessibility/index.html",
          "group":"",
          "keywords": ["navigation","input"],
          "tags": ["navigation","input"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Developing Accessible Applications",
          "titleFriendly":"",
          "summary":"Android has several accessibility-focused features baked into the platform, which make it easy to optimize your application for those with visual or physical disabilities. However, it&#39;s not always obvious what the correct optimizations are, or the…",
          "url":"training/accessibility/accessible-app.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Hiding the Navigation Bar",
          "titleFriendly":"",
          "summary":"This lesson describes how to hide the navigation bar, which was introduced in Android 4.0 (API level 14). Even though this lesson focuses on hiding the navigation bar, you should design your app to hide the status bar at the same time, as described in…",
          "url":"training/system-ui/navigation.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/navigation-bar.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Managing the System UI",
          "titleFriendly":"",
          "summary":"System Bars DevBytes: Android 4.4 Immersive Mode The system bars are screen areas dedicated to the display of notifications, communication of device status, and device navigation. Typically the system bars (which consist of the status and navigation bars…",
          "url":"training/system-ui/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/system-ui.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Responding to UI Visibility Changes",
          "titleFriendly":"",
          "summary":"This lesson describes how to register a listener so that your app can get notified of system UI visibility changes. This is useful if you want to synchronize other parts of your UI with the hiding&#47;showing of system bars. To get notified of system …",
          "url":"training/system-ui/visibility.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Hiding the Status Bar",
          "titleFriendly":"",
          "summary":"This lesson describes how to hide the status bar on different versions of Android. Hiding the status bar (and optionally, the navigation bar) lets the content use more of the display space, thereby providing a more immersive user experience. Figure 1 …",
          "url":"training/system-ui/status.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/status_bar_show.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Dimming the System Bars",
          "titleFriendly":"",
          "summary":"This lesson describes how to dim the system bars (that is, the status and the navigation bars) on Android 4.0 (API level 14) and higher. Android does not provide a built-in way to dim the system bars on earlier versions. When you use this approach, the…",
          "url":"training/system-ui/dim.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/low_profile_hide2x.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Using Immersive Full-Screen Mode",
          "titleFriendly":"",
          "summary":"DevBytes: Android 4.4 Immersive Mode Android 4.4 (API Level 19) introduces a new SYSTEM_UI_FLAG_IMMERSIVE flag for setSystemUiVisibility() that lets your app go truly &quot;full screen.&quot; This flag, when combined with the SYSTEM_UI_FLAG_HIDE_NAVIGATION…",
          "url":"training/system-ui/immersive.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/imm-states.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Accessing the Wearable Data Layer",
          "titleFriendly":"",
          "summary":"To call the Data Layer API, create an instance of GoogleApiClient , the main entry point for any of the Google Play services APIs. GoogleApiClient provides a builder that makes it easy to create an instance of the client. A minimal GoogleApiClient looks…",
          "url":"training/wearables/data-layer/accessing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Sending and Syncing Data",
          "titleFriendly":"",
          "summary":"The Wearable Data Layer API, which is part of Google Play services, provides a communication channel for your handheld and wearable apps. The API consists of a set of data objects that the system can send and synchronize over the wire and listeners that…",
          "url":"training/wearables/data-layer/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"wear/images/wear_cloud_node.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Handling Data Layer Events",
          "titleFriendly":"",
          "summary":"When you make calls to the Data Layer API, you can receive the status of the call when it completes as well as listen for any changes that the call ends up making with listeners. You&#39;ll notice that calls to the Data Layer API sometimes return a PendingResult…",
          "url":"training/wearables/data-layer/events.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Transferring Assets",
          "titleFriendly":"",
          "summary":"To send large blobs of binary data over the Bluetooth transport, such as images, attach an Asset to a data item and the put the data item into the replicated data store. Assets automatically handle caching of data to prevent retransmission and conserve…",
          "url":"training/wearables/data-layer/assets.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Sending and Receiving Messages",
          "titleFriendly":"",
          "summary":"You send messages using the MessageApi and attach the following items to the message: Unlike with data items, there is no syncing between the handheld and wearable apps. Messages are a one-way communication mechanism that&#39;s good for remote procedure…",
          "url":"training/wearables/data-layer/messages.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Syncing Data Items",
          "titleFriendly":"",
          "summary":"A DataItem defines the data interface that the system uses to synchronize data between handhelds and wearables. A DataItem generally consists of the following items: You normally don&#39;t implement DataItem directly. Instead, you: However, instead of…",
          "url":"training/wearables/data-layer/data-items.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Wearable Apps",
          "titleFriendly":"",
          "summary":"Wearable apps run directly on the device, giving you access to hardware such as sensors and the GPU. They are fundamentally the same as apps built for other devices using the Android SDK, but differ greatly in design and usability and the amount of functionality…",
          "url":"training/wearables/apps/index.html",
          "group":"",
          "keywords": ["wear"],
          "tags": ["wear"],
          "image":"wear/images/01_create.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Debugging over Bluetooth",
          "titleFriendly":"",
          "summary":"You can debug your wearable over Bluetooth by routing its debug output to the handheld device that&#39;s connected to your development machine. In the Android Wear companion app, you should see the status change to: If there are no other devices connected…",
          "url":"training/wearables/apps/bt-debugging.html",
          "group":"",
          "keywords": ["wear"],
          "tags": ["wear"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating and Running a Wearable App",
          "titleFriendly":"",
          "summary":"Wearable apps run directly on the wearable device, giving you access to low-level hardware such as sensors, activities, services, and more, right on the wearable. A companion handheld app that contains the wearable app is also required when you want to…",
          "url":"training/wearables/apps/creating.html",
          "group":"",
          "keywords": ["wear"],
          "tags": ["wear"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Custom Layouts",
          "titleFriendly":"",
          "summary":"Creating layouts for wearables is the same as handheld devices, except you have to design for the screen size and for glanceability. Do not port functionality and the UI from a handheld app and expect a good experience. You should create custom layouts…",
          "url":"training/wearables/apps/layouts.html",
          "group":"",
          "keywords": ["wear"],
          "tags": ["wear"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Adding Voice Capabilities",
          "titleFriendly":"",
          "summary":"Voice actions are an important part of the wearable experience. They let users carry out actions hands-free and quickly. Wear provides two types of voice actions: The Android Wear platform provides several voice intents that are based on user actions …",
          "url":"training/wearables/apps/voice.html",
          "group":"",
          "keywords": ["wear"],
          "tags": ["wear"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Packaging Wearable Apps",
          "titleFriendly":"",
          "summary":"When publishing to users, you must package a wearable app inside of a handheld app, because users cannot browse and install apps directly on the wearable. If packaged properly, when users download the handheld app, the system automatically pushes the …",
          "url":"training/wearables/apps/packaging.html",
          "group":"",
          "keywords": ["wear"],
          "tags": ["wear"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Keeping Your App Visible",
          "titleFriendly":"",
          "summary":"Some Wear apps are most useful when they are constantly visible to the user. For example, users out on a run can glance at their wearable to see the distance covered and time elapsed, or after recording a grocery list on their wearable, users can quickly…",
          "url":"training/wearables/apps/always-on.html",
          "group":"",
          "keywords": ["wear"],
          "tags": ["wear"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Stacking Notifications",
          "titleFriendly":"",
          "summary":"When creating notifications for a handheld device, you should always aggregate similar notifications into a single summary notification. For example, if your app creates notifications for received messages, you should not show more than one notification…",
          "url":"training/wearables/notifications/stacks.html",
          "group":"",
          "keywords": ["notifications"],
          "tags": ["notifications"],
          "image":"wear/images/11_bundles_B.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Adding Wearable Features to Notifications",
          "titleFriendly":"",
          "summary":"When an Android handheld (phone or tablet) and Android wearable are connected, the handheld automatically shares notifications with the wearable. On the wearable, each notification appears as a new card in the context stream . However, to give users the…",
          "url":"training/wearables/notifications/index.html",
          "group":"",
          "keywords": ["notifications","wear"],
          "tags": ["notifications","wear"],
          "image":"wear/images/01_notifications.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Receiving Voice Input in a Notification",
          "titleFriendly":"",
          "summary":"If you have handheld notifications that include an action to input text, such as reply to an email, it should normally launch an activity on the handheld device to input the text. However, when your notification appears on a wearable, there is no keyboard…",
          "url":"training/wearables/notifications/voice-input.html",
          "group":"",
          "keywords": ["notifications"],
          "tags": ["notifications"],
          "image":"wear/images/13_voicereply.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating a Notification for Wearables",
          "titleFriendly":"",
          "summary":"To build handheld notifications that are also sent to wearables, use Builder. When you build notifications with this class, the system takes care of displaying notifications properly, whether they appear on a handheld or wearable. To import the necessary…",
          "url":"training/wearables/notifications/creating.html",
          "group":"",
          "keywords": ["notifications"],
          "tags": ["notifications"],
          "image":"wear/images/circle_email_action.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Adding Pages to a Notification",
          "titleFriendly":"",
          "summary":"When you&#39;d like to provide more information without requiring users to open your app on their handheld device, you can add one or more pages to the notification on the wearable. The additional pages appear immediately to the right of the main notification…",
          "url":"training/wearables/notifications/pages.html",
          "group":"",
          "keywords": ["notifications"],
          "tags": ["notifications"],
          "image":"wear/images/09_pages.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building a Watch Face Service",
          "titleFriendly":"",
          "summary":"Watch faces in Android Wear are implemented as services and packaged inside a wearable app . When users install a handheld app that contains a wearable app with watch faces, these watch faces become available in the Android Wear companion app on the handheld…",
          "url":"training/wearables/watch-faces/service.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Showing Information in Watch Faces",
          "titleFriendly":"",
          "summary":"In addition to telling time, Android Wear devices provide users with contextually relevant information in the form of cards, notifications, and other wearable apps. Creating a custom watch face not only gives you the opportunity to tell time in visually…",
          "url":"training/wearables/watch-faces/information.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"training/wearables/watch-faces/images/Render_Saturn.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Watch Faces",
          "titleFriendly":"",
          "summary":"Watch Faces DevBytes: Watch Faces for Android Wear Watch faces in Android Wear leverage a dynamic digital canvas to tell time using colors, animations, and relevant contextual information. The Android Wear companion app provides watch faces with different…",
          "url":"training/wearables/watch-faces/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Drawing Watch Faces",
          "titleFriendly":"",
          "summary":"After you have configured your project and added a class that implements the watch face service, you can start writing code to initialize and draw your custom watch face. This lesson includes examples from the WatchFace sample to show how the system uses…",
          "url":"training/wearables/watch-faces/drawing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"training/wearables/watch-faces/images/preview_analog.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Providing Configuration Activities",
          "titleFriendly":"",
          "summary":"When users install a handheld app that contains a wearable app with watch faces, these watch faces become available in the Android Wear companion app on the companion device and in the watch face picker on the wearable. Users can choose the active watch…",
          "url":"training/wearables/watch-faces/configuration.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Optimizing Performance and Battery Life",
          "titleFriendly":"",
          "summary":"In addition to accommodating notification cards and system indicators, you need to ensure that the animations in your watch face run smoothly and that your service does not perform unnecessary computations. Watch faces in Android Wear run continuously…",
          "url":"training/wearables/watch-faces/performance.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"training/wearables/watch-faces/images/ClockHandFull.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Designing Watch Faces",
          "titleFriendly":"",
          "summary":"Watch Faces Similar to the process of designing a traditional watch face, creating one for Android Wear is an exercise in visualizing time clearly. Android Wear devices provide advanced capabilities for watch faces that you can leverage in your designs…",
          "url":"training/wearables/watch-faces/designing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"training/wearables/watch-faces/images/Render_Next.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Addressing Common Issues",
          "titleFriendly":"",
          "summary":"Creating a custom watch face for Android Wear is substantially different from creating notifications and wearable-specific activities. This class shows you how to resolve some issues that you may encounter as you implement your first few watch faces. …",
          "url":"training/wearables/watch-faces/issues.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"training/wearables/watch-faces/images/AnalogNoCard.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Custom UIs for Wear Devices",
          "titleFriendly":"",
          "summary":"User interfaces for wearable apps differ significantly from those built for handheld devices. Apps for wearables should follow the Android Wear design principles and implement the recommended UI patterns , which ensure a consistent user experience across…",
          "url":"training/wearables/ui/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"wear/images/10_uilib.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Exiting Full-Screen Activities",
          "titleFriendly":"",
          "summary":"By default, users exit Android Wear activities by swiping from left to right. If the app contains horizontally scrollable content, users first have to navigate to the edge of the content and then swipe again from left to right to exit the app. For more…",
          "url":"training/wearables/ui/exit.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Cards",
          "titleFriendly":"",
          "summary":"Cards present information to users with a consistent look and feel across different apps. This lesson shows you how to create cards in your Android Wear apps. The Wearable UI Library provides implementations of cards specifically designed for wearable…",
          "url":"training/wearables/ui/cards.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"wear/images/05_uilib.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Showing Confirmations",
          "titleFriendly":"",
          "summary":"Confirmations in Android Wear apps use the whole screen or a larger portion of it than those in handheld apps. This ensures that users can see these confirmations by just glancing at the screen and that they have large enough touch targets to cancel an…",
          "url":"training/wearables/ui/confirm.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"wear/images/09_uilib.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating a 2D Picker",
          "titleFriendly":"",
          "summary":"The 2D Picker pattern in Android Wear allows users to navigate and choose from a set of items shown as pages. The Wearable UI Library lets you easily implement this pattern using a page grid, which is a layout manager that allows users to scroll vertically…",
          "url":"training/wearables/ui/2d-picker.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"wear/images/07_uilib.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Defining Layouts",
          "titleFriendly":"",
          "summary":"Wearables use the same layout techniques as handheld Android devices, but need to be designed with specific constraints. Do not port functionality and the UI from a handheld app and expect a good experience. For more information on how to design great…",
          "url":"training/wearables/ui/layouts.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"wear/images/01_uilib.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Lists",
          "titleFriendly":"",
          "summary":"Lists let users select an item from a set of choices easily on wearable devices. This lesson shows you how to create lists in your Android Wear apps. The Wearable UI Library includes the WearableListView class, which is a list implementation optimized…",
          "url":"training/wearables/ui/lists.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"wear/images/06_uilib.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Re-using Layouts with &lt;include&#47;&gt;",
          "titleFriendly":"",
          "summary":"Although Android offers a variety of widgets to provide small and re-usable interactive elements, you might also need to re-use larger components that require a special layout. To efficiently re-use complete layouts, you can use the View, you can do it…",
          "url":"training/improving-layouts/reusing-layouts.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Loading Views On Demand",
          "titleFriendly":"",
          "summary":"Sometimes your layout might require complex views that are rarely used. Whether they are item details, progress indicators, or undo messages, you can reduce memory usage and speed up rendering by loading the views only when they are needed. ViewStub is…",
          "url":"training/improving-layouts/loading-ondemand.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Improving Layout Performance",
          "titleFriendly":"",
          "summary":"DevBytes: Optimising Layouts with Hierarchy Viewer Layouts are a key part of Android applications that directly affect the user experience. If implemented poorly, your layout can lead to a memory hungry application with slow UIs. The Android SDK includes…",
          "url":"training/improving-layouts/index.html",
          "group":"",
          "keywords": ["include","merge","viewstub","listview"],
          "tags": ["include","merge","viewstub","listview"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Optimizing Layout Hierarchies",
          "titleFriendly":"",
          "summary":"It is a common misconception that using the basic layout structures leads to the most efficient layouts. However, each widget and layout you add to your application requires initialization, layout, and drawing. For example, using nested instances of LinearLayout…",
          "url":"training/improving-layouts/optimizing-layout.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/layout-listitem.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Making ListView Scrolling Smooth",
          "titleFriendly":"",
          "summary":"The key to a smoothly scrolling ListView is to keep the application’s main thread (the UI thread) free from heavy processing. Ensure you do any disk access, network access, or SQL access in a separate thread. To test the status of your app, you can enable…",
          "url":"training/improving-layouts/smooth-scrolling.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Modifying your Download Patterns Based on the Connectivity Type",
          "titleFriendly":"",
          "summary":"When it comes to impact on battery life, not all connection types are created equal. Not only does the Wi-Fi radio use significantly less battery than its wireless radio counterparts, but the radios used in different wireless radio technologies have different…",
          "url":"training/efficient-downloads/connectivity_patterns.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Transferring Data Without Draining the Battery",
          "titleFriendly":"",
          "summary":"In this class you will learn to minimize the battery life impact of downloads and network connections, particularly in relation to the wireless radio.This class demonstrates the best practices for scheduling and executing downloads using techniques such…",
          "url":"training/efficient-downloads/index.html",
          "group":"",
          "keywords": ["battery","network","wireless"],
          "tags": ["battery","network","wireless"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Minimizing the Effect of Regular Updates",
          "titleFriendly":"",
          "summary":"The optimal frequency of regular updates will vary based on device state, network connectivity, user behavior, and explicit user preferences. Optimizing Battery Life discusses how to build battery-efficient apps that modify their refresh frequency based…",
          "url":"training/efficient-downloads/regular_updates.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Redundant Downloads are Redundant",
          "titleFriendly":"",
          "summary":"The most fundamental way to reduce your downloads is to download only what you need. In terms of data, that means implementing REST APIs that allow you to specify query criteria that limit the returned data by using parameters such as the time of your…",
          "url":"training/efficient-downloads/redundant_redundant.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Optimizing Downloads for Efficient Network Access",
          "titleFriendly":"",
          "summary":"Using the wireless radio to transfer data is potentially one of your app&#39;s most significant sources of battery drain. To minimize the battery drain associated with network activity, it&#39;s critical that you understand how your connectivity model…",
          "url":"training/efficient-downloads/efficient-network-access.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/efficient-downloads/mobile_radio_state_machine.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Multiple APKs for Different API Levels",
          "titleFriendly":"",
          "summary":"When developing your Android application to take advantage of multiple APKs on Google Play, it’s important to adopt some good practices from the get-go, and prevent unnecessary headaches further into the development process. This lesson shows you how …",
          "url":"training/multiple-apks/api.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Multiple APKs with 2+ Dimensions",
          "titleFriendly":"",
          "summary":"When developing your Android application to take advantage of multiple APKs on Google Play, it’s important to adopt some good practices from the get-go, and prevent unnecessary headaches further into the development process. This lesson shows you how …",
          "url":"training/multiple-apks/multiple.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Multiple APKs for Different GL Textures",
          "titleFriendly":"",
          "summary":"When developing your Android application to take advantage of multiple APKs on Google Play, it’s important to adopt some good practices from the get-go, and prevent unnecessary headaches further into the development process. This lesson shows you how …",
          "url":"training/multiple-apks/texture.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Maintaining Multiple APKs",
          "titleFriendly":"",
          "summary":"Multiple APK support is a feature of Google Play that allows you to publish multiple APKs under the same application listing. Each APK is a complete instance of your application, optimized to target specific device configurations. Each APK can target …",
          "url":"training/multiple-apks/index.html",
          "group":"",
          "keywords": ["support"],
          "tags": ["support"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Multiple APKs for Different Screen Sizes",
          "titleFriendly":"",
          "summary":"When developing your Android application to take advantage of multiple APKs on Google Play, it’s important to adopt some good practices from the get-go, and prevent unnecessary headaches further into the development process. This lesson shows you how …",
          "url":"training/multiple-apks/screensize.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Testing Using Mock Locations",
          "titleFriendly":"",
          "summary":"To test a location-aware app that uses Location Services, you don&#39;t need to move your device from place to place to generate location data. Instead, you can put Location Services into mock mode. In this mode, you can send mock Location objects to …",
          "url":"training/location/location-testing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Receiving Location Updates",
          "titleFriendly":"",
          "summary":"If your app can continuously track location, it can deliver more relevant information to the user. For example, if your app helps the user find their way while walking or driving, or if your app tracks the location of assets, it needs to get the location…",
          "url":"training/location/receive-location-updates.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Making Your App Location-Aware",
          "titleFriendly":"",
          "summary":"One of the unique features of mobile applications is location awareness. Mobile users take their devices with them everywhere, and adding location awareness to your app offers users a more contextual experience. The location APIs available in Google Play…",
          "url":"training/location/index.html",
          "group":"",
          "keywords": ["location","geofence","geofencing","activity recognition","activity detection","gps"],
          "tags": ["location","geofence","geofencing","activityrecognition","activitydetection","gps"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Displaying a Location Address",
          "titleFriendly":"",
          "summary":"The lessons Getting the Last Known Location and Receiving Location Updates describe how to get the user&#39;s location in the form of a Location object that contains latitude and longitude coordinates. Although latitude and longitude are useful for calculating…",
          "url":"training/location/display-address.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating and Monitoring Geofences",
          "titleFriendly":"",
          "summary":"Geofencing combines awareness of the user&#39;s current location with awareness of the user&#39;s proximity to locations that may be of interest. To mark a location of interest, you specify its latitude and longitude. To adjust the proximity for the location…",
          "url":"training/location/geofencing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/geofence@2x.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Getting the Last Known Location",
          "titleFriendly":"",
          "summary":"Using the Google Play services location APIs, your app can request the last known location of the user&#39;s device. In most cases, you are interested in the user&#39;s current location, which is usually equivalent to the last known location of the device…",
          "url":"training/location/retrieve-current.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Recognizing the User&#39;s Current Activity",
          "titleFriendly":"",
          "summary":"Activity recognition tries to detect the user&#39;s current physical activity, such as walking, driving, or standing still. Requests for updates go through an activity recognition client, which, while different from the location client used by location…",
          "url":"training/location/activity-recognition.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Controlling Your App’s Volume and Playback",
          "titleFriendly":"",
          "summary":"A good user experience is a predictable one. If your app plays media it’s important that your users can control the volume of your app using the hardware or software volume controls of their device, bluetooth headset, or headphones. Similarly, where appropriate…",
          "url":"training/managing-audio/volume-playback.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Managing Audio Playback",
          "titleFriendly":"",
          "summary":"If your app plays audio, it’s important that your users can control the audio in a predictable manner. To ensure a great user experience, it’s also important that your app manages the audio focus to ensure multiple apps aren’t playing audio at the same…",
          "url":"training/managing-audio/index.html",
          "group":"",
          "keywords": ["audio","media"],
          "tags": ["audio","media"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Managing Audio Focus",
          "titleFriendly":"",
          "summary":"With multiple apps potentially playing audio it&#39;s important to think about how they should interact. To avoid every music app playing at the same time, Android uses audio focus to moderate audio playback—only apps that hold the audio focus should …",
          "url":"training/managing-audio/audio-focus.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Dealing with Audio Output Hardware",
          "titleFriendly":"",
          "summary":"Users have a number of alternatives when it comes to enjoying the audio from their Android devices. Most devices have a built-in speaker, headphone jacks for wired headsets, and many also feature Bluetooth connectivity and support for A2DP audio. How …",
          "url":"training/managing-audio/audio-output.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Manipulating Broadcast Receivers On Demand",
          "titleFriendly":"",
          "summary":"The simplest way to monitor device state changes is to create a BroadcastReceiver for each state you&#39;re monitoring and register each of them in your application manifest. Then within each of these receivers you simply reschedule your recurring alarms…",
          "url":"training/monitoring-device-state/manifest-receivers.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Monitoring the Battery Level and Charging State",
          "titleFriendly":"",
          "summary":"When you&#39;re altering the frequency of your background updates to reduce the effect of those updates on battery life, checking the current battery level and charging state is a good place to start. The battery-life impact of performing application …",
          "url":"training/monitoring-device-state/battery-monitoring.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Optimizing Battery Life",
          "titleFriendly":"",
          "summary":"For your app to be a good citizen, it should seek to limit its impact on the battery life of its host device. After this class you will be able to build apps that monitor modify their functionality and behavior based on the state of the host device. By…",
          "url":"training/monitoring-device-state/index.html",
          "group":"",
          "keywords": ["network","internet"],
          "tags": ["network","internet"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Determining and Monitoring the Docking State and Type",
          "titleFriendly":"",
          "summary":"Android devices can be docked into several different kinds of docks. These include car or home docks and digital versus analog docks. The dock-state is typically closely linked to the charging state as many docks provide power to docked devices. How the…",
          "url":"training/monitoring-device-state/docking-monitoring.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Determining and Monitoring the Connectivity Status",
          "titleFriendly":"",
          "summary":"Some of the most common uses for repeating alarms and background services is to schedule regular updates of application data from Internet resources, cache data, or execute long running downloads. But if you aren&#39;t connected to the Internet, or the…",
          "url":"training/monitoring-device-state/connectivity-monitoring.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Adding Swipe-to-Refresh To Your App",
          "titleFriendly":"",
          "summary":"The swipe-to-refresh user interface pattern is implemented entirely within the SwipeRefreshLayout widget, which detects the vertical swipe, displays a distinctive progress bar, and triggers callback methods in your app. You enable this behavior by adding…",
          "url":"training/swipe/add-swipe-interface.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Responding to a Refresh Request",
          "titleFriendly":"",
          "summary":"This lesson shows you how to update your app when the user requests a manual refresh, whether the user triggers the refresh with a swipe gesture or by using the action bar refresh action. When the user makes a swipe gesture, the system displays the progress…",
          "url":"training/swipe/respond-refresh-request.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Supporting Swipe-to-Refresh",
          "titleFriendly":"",
          "summary":"Even if your app automatically updates its content on a regular basis, you can allow users to request manual updates as well. For example, a weather forecasting app can allow users get the latest forecasts on demand. To provide a standard user experience…",
          "url":"training/swipe/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Drawing Shapes",
          "titleFriendly":"",
          "summary":"After you define shapes to be drawn with OpenGL, you probably want to draw them. Drawing shapes with the OpenGL ES 2.0 takes a bit more code than you might imagine, because the API provides a great deal of control over the graphics rendering pipeline.…",
          "url":"training/graphics/opengl/draw.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/opengl/ogl-triangle.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Responding to Touch Events",
          "titleFriendly":"",
          "summary":"Making objects move according to a preset program like the rotating triangle is useful for getting some attention, but what if you want to have users interact with your OpenGL ES graphics? The key to making your OpenGL ES application touch interactive…",
          "url":"training/graphics/opengl/touch.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/opengl/ogl-triangle-touch.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Displaying Graphics with OpenGL ES",
          "titleFriendly":"",
          "summary":"The Android framework provides plenty of standard tools for creating attractive, functional graphical user interfaces. However, if you want more control of what your application draws on screen, or are venturing into three dimensional graphics, you need…",
          "url":"training/graphics/opengl/index.html",
          "group":"",
          "keywords": ["open gl","graphics"],
          "tags": ["opengl","graphics"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building an OpenGL ES Environment",
          "titleFriendly":"",
          "summary":"In order to draw graphics with OpenGL ES in your Android application, you must create a view container for them. One of the more straight-forward ways to do this is to implement both a GLSurfaceView and a Renderer. A GLSurfaceView is a view container …",
          "url":"training/graphics/opengl/environment.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Defining Shapes",
          "titleFriendly":"",
          "summary":"Being able to define shapes to be drawn in the context of an OpenGL ES view is the first step in creating your high-end graphics masterpiece. Drawing with OpenGL ES can be a little tricky without knowing a few basic things about how OpenGL ES expects …",
          "url":"training/graphics/opengl/shapes.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/opengl/ccw-square.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Applying Projection and Camera Views",
          "titleFriendly":"",
          "summary":"In the OpenGL ES environment, projection and camera views allow you to display drawn objects in a way that more closely resembles how you see physical objects with your eyes. This simulation of physical viewing is done with mathematical transformations…",
          "url":"training/graphics/opengl/projection.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/opengl/ogl-triangle-projected.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Adding Motion",
          "titleFriendly":"",
          "summary":"Drawing objects on screen is a pretty basic feature of OpenGL, but you can do this with other Android graphics framwork classes, including Canvas and Drawable objects. OpenGL ES provides additional capabilities for moving and transforming drawn objects…",
          "url":"training/graphics/opengl/motion.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Running a Sync Adapter",
          "titleFriendly":"",
          "summary":"In the previous lessons in this class, you learned how to create a sync adapter component that encapsulates data transfer code, and how to add the additional components that allow you to plug the sync adapter into the system. You now have everything you…",
          "url":"training/sync-adapters/running-sync-adapter.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Transferring Data Using Sync Adapters",
          "titleFriendly":"",
          "summary":"Synchronizing data between an Android device and web servers can make your application significantly more useful and compelling for your users. For example, transferring data to a web server makes a useful backup, and transferring data from a server makes…",
          "url":"training/sync-adapters/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating a Sync Adapter",
          "titleFriendly":"",
          "summary":"The sync adapter component in your app encapsulates the code for the tasks that transfer data between the device and a server. Based on the scheduling and triggers you provide in your app, the sync adapter framework runs the code in the sync adapter component…",
          "url":"training/sync-adapters/creating-sync-adapter.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating a Stub Content Provider",
          "titleFriendly":"",
          "summary":"The sync adapter framework is designed to work with device data managed by the flexible and highly secure content provider framework. For this reason, the sync adapter framework expects that an app that uses the framework has already defined a content…",
          "url":"training/sync-adapters/creating-stub-provider.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating a Stub Authenticator",
          "titleFriendly":"",
          "summary":"The sync adapter framework assumes that your sync adapter transfers data between device storage associated with an account and server storage that requires login access. For this reason, the framework expects you to provide a component called an authenticator…",
          "url":"training/sync-adapters/creating-authenticator.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Making Your App Content Searchable by Google",
          "titleFriendly":"",
          "summary":"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.…",
          "url":"training/app-indexing/index.html",
          "group":"",
          "keywords": ["app indexing","search"],
          "tags": ["getusers","search","appindexing"],
          "image":"images/cards/google-search_2x.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Specifying App Content for Indexing",
          "titleFriendly":"",
          "summary":"Google&#39;s web crawling bot ( Googlebot ), which crawls and indexes web sites for the Google search engine, can also index content in your Android app. By opting in, you can allow Googlebot to crawl the content in the APK through the Google Play Store…",
          "url":"training/app-indexing/enabling-app-indexing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Enabling Deep Links for App Content",
          "titleFriendly":"",
          "summary":"To enable Google to crawl your app content and allow users to enter your app from search results, you must add intent filters for the relevant activities in your app manifest. These intent filters allow deep linking to the content in any of your activities…",
          "url":"training/app-indexing/deep-linking.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Processing Bitmaps Off the UI Thread",
          "titleFriendly":"",
          "summary":"The AsyncTask and shows you how to handle concurrency issues. The AsyncTask class provides an easy way to execute some work in a background thread and publish the results back on the UI thread. To use it, create a subclass and override the provided methods…",
          "url":"training/displaying-bitmaps/process-bitmap.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Managing Bitmap Memory",
          "titleFriendly":"",
          "summary":"In addition to the steps described in Caching Bitmaps , there are specific things you can do to facilitate garbage collection and bitmap reuse. The recommended strategy depends on which version(s) of Android you are targeting. The BitmapFun sample app…",
          "url":"training/displaying-bitmaps/manage-memory.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Displaying Bitmaps in Your UI",
          "titleFriendly":"",
          "summary":"This lesson brings together everything from previous lessons, showing you how to load multiple bitmaps into ViewPager and GridView components using a background thread and bitmap cache, while dealing with concurrency and configuration changes. The swipe…",
          "url":"training/displaying-bitmaps/display-bitmap.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Displaying Bitmaps Efficiently",
          "titleFriendly":"",
          "summary":"DevBytes: Bitmap Allocation DevBytes: Making Apps Beautiful - Part 4 - Performance Tuning Learn how to use common techniques to process and load Bitmap objects in a way that keeps your user interface (UI) components responsive and avoids exceeding your…",
          "url":"training/displaying-bitmaps/index.html",
          "group":"",
          "keywords": ["bitmaps","images","graphics"],
          "tags": ["bitmaps","images","graphics"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Loading Large Bitmaps Efficiently",
          "titleFriendly":"",
          "summary":"Images come in all shapes and sizes. In many cases they are larger than required for a typical application user interface (UI). For example, the system Gallery application displays photos taken using your Android devices&#39;s camera which are typically…",
          "url":"training/displaying-bitmaps/load-bitmap.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Caching Bitmaps",
          "titleFriendly":"",
          "summary":"Loading a single bitmap into your user interface (UI) is straightforward, however things get more complicated if you need to load a larger set of images at once. In many cases (such as with components like ListView, GridView or LruCache class (also available…",
          "url":"training/displaying-bitmaps/cache-bitmap.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Animating Layout Changes",
          "titleFriendly":"",
          "summary":"A layout animation is a pre-loaded animation that the system runs each time you make a change to the layout configuration. All you need to do is set an attribute in the layout to tell the Android system to animate these layout changes, and system-default…",
          "url":"training/animation/layout.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Adding Animations",
          "titleFriendly":"",
          "summary":"Animations can add subtle visual cues that notify users about what&#39;s going on in your app and improve their mental model of your app&#39;s interface. Animations are especially useful when the screen changes state, such as when content loads or new…",
          "url":"training/animation/index.html",
          "group":"",
          "keywords": ["animator","views","layout","user interface"],
          "tags": ["animator","views","layout","userinterface"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Using ViewPager for Screen Slides",
          "titleFriendly":"",
          "summary":"Screen slides are transitions between one entire screen to another and are common with UIs like setup wizards or slideshows. This lesson shows you how to do screen slides with a ViewPager provided by the support library . ViewPagers can animate screen…",
          "url":"training/animation/screen-slide.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Crossfading Two Views",
          "titleFriendly":"",
          "summary":"Crossfade animations (also know as dissolve) gradually fade out one UI component while simultaneously fading in another. This animation is useful for situations where you want to switch content or views in your app. Crossfades are very subtle and short…",
          "url":"training/animation/crossfade.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Displaying Card Flip Animations",
          "titleFriendly":"",
          "summary":"This lesson shows you how to do a card flip animation with custom fragment animations. Card flips animate between views of content by showing an animation that emulates a card flipping over. Here&#39;s what a card flip looks like: If you want to jump …",
          "url":"training/animation/cardflip.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Zooming a View",
          "titleFriendly":"",
          "summary":"This lesson demonstrates how to do a touch-to-zoom animation, which is useful for apps such as photo galleries to animate a view from a thumbnail to a full-size image that fills the screen. Here&#39;s what a touch-to-zoom animation looks like that expands…",
          "url":"training/animation/zoom.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating Backward-Compatible UIs",
          "titleFriendly":"",
          "summary":"This class demonstrates how to use UI components and APIs available in newer versions of Android in a backward-compatible way, ensuring that your application still runs on previous versions of the platform. Throughout this class, the new Action Bar Tabs…",
          "url":"training/backward-compatible-ui/index.html",
          "group":"",
          "keywords": ["widgets","support"],
          "tags": ["widgets","support"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Proxying to the New APIs",
          "titleFriendly":"",
          "summary":"This lesson shows you how to subclass the CompatTab and TabHelper abstract classes and use new APIs. Your application can use this implementation on devices running a platform version that supports them. The concrete classes for CompatTab and TabHelper…",
          "url":"training/backward-compatible-ui/new-implementation.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/backward-compatible-ui-classes-honeycomb.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Using the Version-Aware Component",
          "titleFriendly":"",
          "summary":"Now that you have two implementations of TabHelper and CompatTab —one for Android 3.0 and later and one for earlier versions of the platform—it&#39;s time to do something with these implementations. This lesson discusses creating the logic for switching…",
          "url":"training/backward-compatible-ui/using-component.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/backward-compatible-ui-gb.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating an Implementation with Older APIs",
          "titleFriendly":"",
          "summary":"This lesson discusses how to create an implementation that mirrors newer APIs yet supports older devices. The most challenging task in using newer UI features in a backward-compatible way is deciding on and implementing an older (fallback) solution for…",
          "url":"training/backward-compatible-ui/older-implementation.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/backward-compatible-ui-classes-eclair.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Abstracting the New APIs",
          "titleFriendly":"",
          "summary":"Suppose you want to use action bar tabs as the primary form of top-level navigation in your application. Unfortunately, the ActionBar APIs are only available in Android 3.0 or later (API level 11+). Thus, if you want to distribute your application to …",
          "url":"training/backward-compatible-ui/abstracting.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"images/training/backward-compatible-ui-classes.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Recommending TV Content",
          "titleFriendly":"",
          "summary":"When interacting with TVs, users generally prefer to give minimal input before watching content. An ideal scenario for many TV users is: sit down, turn on, and watch. The fewest steps to get users to content they enjoy is generally the path they prefer…",
          "url":"training/tv/discovery/recommendations.html",
          "group":"",
          "keywords": ["tv","recommendations"],
          "tags": ["tv","recommendations"],
          "image":"images/tv/home-recommendations.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Helping Users Find Your Content on TV",
          "titleFriendly":"",
          "summary":"TV devices offer many entertainment options for users. They have thousands of content options from apps and related content services. At the same time, most users prefer to use TVs with the least amount of input possible. With the number of choices available…",
          "url":"training/tv/discovery/index.html",
          "group":"",
          "keywords": ["tv","leanback"],
          "tags": ["tv","leanback"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Searching within TV Apps",
          "titleFriendly":"",
          "summary":"Users frequently have specific content in mind when using a media app on TV. If your app contains a large catalog of content, browsing for a specific title may not be the most efficient way for users to find what they are looking for. A search interface…",
          "url":"training/tv/discovery/in-app-search.html",
          "group":"",
          "keywords": ["tv","leanback"],
          "tags": ["tv","leanback"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Making TV Apps Searchable",
          "titleFriendly":"",
          "summary":"Android TV uses the Android search interface to retrieve content data from installed apps and deliver search results to the user. Your app&#39;s content data can be included with these results, to give the user instant access to the content in your app…",
          "url":"training/tv/discovery/searchable.html",
          "group":"",
          "keywords": ["search","searchable"],
          "tags": ["search","searchable"],
          "image":"images/tv/deep-link.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building a Details View",
          "titleFriendly":"",
          "summary":"The media browsing interface classes provided by the v17 leanback support library 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 …",
          "url":"training/tv/playback/details.html",
          "group":"",
          "keywords": ["tv","detailsfragment"],
          "tags": ["tv","detailsfragment"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Displaying a Now Playing Card",
          "titleFriendly":"",
          "summary":"TV apps may allow users to play music or other media in the background while using other applications. If your app allows this type of use, it must must provide a means for the user to return to the app to pause the music or switch to a new song. The …",
          "url":"training/tv/playback/now-playing.html",
          "group":"",
          "keywords": ["tv","mediasession"],
          "tags": ["tv","mediasession"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building TV Playback Apps",
          "titleFriendly":"",
          "summary":"DevBytes: Android TV — Using the Leanback library Browsing and playing media files is frequently part of the user experience provided by a TV app. Building such an experience from scratch, while making sure that it is fast, fluid, and attractive can be…",
          "url":"training/tv/playback/index.html",
          "group":"",
          "keywords": ["tv","leanback"],
          "tags": ["tv","leanback"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Providing a Card View",
          "titleFriendly":"",
          "summary":"In the previous lesson, you created a catalog browser, implemented in a browse fragment, that displays a list of media items. In this lesson, you create the card views for your media items and present them in the browse fragment. The BaseCardView class…",
          "url":"training/tv/playback/card.html",
          "group":"",
          "keywords": ["card"],
          "tags": ["card"],
          "image":"images/tv/app-browse.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating a Catalog Browser",
          "titleFriendly":"",
          "summary":"Media apps that run on TV need to allow users to browse its content offerings, make a selection, and start playing content. The content browsing experience for apps of this type should be simple and intuitive, as well as visually pleasing and engaging…",
          "url":"training/tv/playback/browse.html",
          "group":"",
          "keywords": ["tv","browsefragment","presenter","backgroundmanager"],
          "tags": ["tv","browsefragment","presenter","backgroundmanager"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Apps for TV",
          "titleFriendly":"",
          "summary":"Starting point for building apps and games for Android TV, with guidelines, information, and examples.",
          "url":"training/tv/index.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"design/tv/images/focus.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Developing a TV Input Service",
          "titleFriendly":"",
          "summary":"A TV input service represents a media stream source, and lets you present your media content in a linear, broadcast TV fashion as channels and programs. With the TV input service, you can provide parental controls, program guide information, and content…",
          "url":"training/tv/tif/tvinput.html",
          "group":"",
          "keywords": ["tv","tif"],
          "tags": ["tv","tif"],
          "image":"images/tv/tvinput-life.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building TV Channels",
          "titleFriendly":"",
          "summary":"Watching live TV shows and other continuous, channel-based content is a big part of the TV experience. Users are accustomed to selecting and watching shows on TV by channel browsing. To provide your users a similar experience, use the TV Input Framework…",
          "url":"training/tv/tif/index.html",
          "group":"",
          "keywords": ["tv","tif"],
          "tags": ["tv","tif"],
          "image":"images/tv/tv-tif-overview.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Managing User Interaction",
          "titleFriendly":"",
          "summary":"In the live TV experience the user changes channels and is presented with channel and program information briefly before the information disappears. Other types of information, such as messages (&quot;DO NOT ATTEMPT AT HOME&quot;), subtitles, or ads may…",
          "url":"training/tv/tif/ui.html",
          "group":"",
          "keywords": ["tv","tif"],
          "tags": ["tv","tif"],
          "image":"images/tv/do-not-attempt.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Working with Channel Data",
          "titleFriendly":"",
          "summary":"Your TV input must provide Electronic Program Guide (EPG) data for at least one channel in its setup activity. You should also periodically update that data, with consideration for the size of the update and the processing thread that handles it. This…",
          "url":"training/tv/tif/channel.html",
          "group":"",
          "keywords": ["tv","tif"],
          "tags": ["tv","tif"],
          "image":"images/tv/channel-info.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building TV Games",
          "titleFriendly":"",
          "summary":"How to bring your games to Android TV, including recommendations and examples.",
          "url":"training/tv/games/index.html",
          "group":"",
          "keywords": ["tv","games","controller"],
          "tags": ["tv","games","controller"],
          "image":"images/games/game-controller-buttons_2x_crop.png",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Creating TV Navigation",
          "titleFriendly":"",
          "summary":"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&#39; perception while operating your app. As you build your…",
          "url":"training/tv/start/navigation.html",
          "group":"",
          "keywords": ["tv","d-pad","focus"],
          "tags": ["tv","d-pad","focus"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building TV Apps",
          "titleFriendly":"",
          "summary":"Android offers a rich user experience that&#39;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. TV apps use the same structure…",
          "url":"training/tv/start/index.html",
          "group":"",
          "keywords": ["tv","leanback"],
          "tags": ["tv","leanback"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Get Started with TV Apps",
          "titleFriendly":"",
          "summary":"TV apps use the same structure as those for phones and tablets. This similarity 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 lesson describes …",
          "url":"training/tv/start/start.html",
          "group":"",
          "keywords": ["leanback","recyclerview","launcher"],
          "tags": ["leanback","recyclerview","launcher"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Handling TV Hardware",
          "titleFriendly":"",
          "summary":"TV hardware is substantially different from other Android devices. TVs do not include some of the hardware features found on other Android devices, such as touch screens, cameras, and GPS receivers. TVs are also completely dependent on secondary hardware…",
          "url":"training/tv/start/hardware.html",
          "group":"",
          "keywords": ["unsupported"],
          "tags": ["unsupported"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Layouts for TV",
          "titleFriendly":"",
          "summary":"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 you…",
          "url":"training/tv/start/layouts.html",
          "group":"",
          "keywords": ["tv"],
          "tags": ["tv"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"TV Apps Checklist",
          "titleFriendly":"",
          "summary":"Users enjoy the TV app experience when it is consistent, logical, and predictable. They should be able to navigate within your app and throughout Android TV without getting lost or having to &quot;reset&quot; the UI and start over. Users appreciate clear…",
          "url":"training/tv/publishing/checklist.html",
          "group":"",
          "keywords": ["tv","checklist"],
          "tags": ["tv","checklist"],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Apps with Content Sharing",
          "titleFriendly":"",
          "summary":"These classes teach you how to create apps that share data between apps and devices.…",
          "url":"training/building-content-sharing.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Building Apps with Connectivity &amp; the Cloud",
          "titleFriendly":"",
          "summary":"These classes teach you how to connect your app to the world beyond the user&#39;s device. You&#39;ll learn how to connect to other devices in the area, connect to the Internet, backup and sync your app&#39;s data, and more.…",
          "url":"training/building-connectivity.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }, 
        {
          "title":"Best Practices for Interaction and Engagement",
          "titleFriendly":"",
          "summary":"These classes teach you how to engage and retain your users by implementing the best interaction patterns for Android. For instance, to help users quickly discover content in your app, your app should match their expectations for user interaction on Android…",
          "url":"training/best-ux.html",
          "group":"",
          "keywords": [],
          "tags": [],
          "image":"",
          "lang":"en",
          "type":"training"
        }
  ];
  
  var _BY_TAG = {
      "emote":[2], 
      "e-mote":[2], 
      "adt":[2]
  };
  
  var ABOUT_BY_TAG = {
      "ecosystem":[4], 
      "versions":[4], 
      "whatsnew":[4], 
      "tv":[12], 
      "leanback":[12]
  };
  
  var DESIGN_BY_TAG = {
      "material":[0], 
      "design":[0,2,5,22], 
      "beautifulapps":[2], 
      "icons":[14], 
      "stencils":[14], 
      "colorswatches":[14], 
      "viewpager":[15], 
      "navigation":[15,18,19,23,27], 
      "tabs":[15], 
      "dialog":[16], 
      "toast":[16], 
      "notification":[16], 
      "actionbar":[19], 
      "fullscreen":[20], 
      "immersive":[20], 
      "leanback":[20,31], 
      "support":[21], 
      "notifications":[22], 
      "accessibility":[23], 
      "buttons":[25], 
      "appwidget":[26], 
      "home":[26], 
      "settings":[28], 
      "preferences":[28], 
      "kitkat":[29], 
      "android4.4":[29], 
      "tv":[31]
  };
  
  var DISTRIBUTE_BY_TAG = {
      "googleplay":[1,2,3,13,43,55,61,72], 
      "developerstory":[1,3], 
      "journal":[1], 
      "tablets":[1], 
      "pure":[1], 
      "wear":[6,65], 
      "wearables":[6], 
      "quality":[6,10,60,62,65,73,74,75], 
      "guidelines":[6,62,73,74], 
      "landing":[10], 
      "google":[12,17,22,27], 
      "identity":[12,17,22,27], 
      "signin":[12,17,27], 
      "listing":[13], 
      "users":[14,15,18,20,21,23], 
      "ads":[14,56,56], 
      "adwords":[14,33], 
      "getusers":[19], 
      "search":[19,32], 
      "appindexing":[19,32], 
      "analytics":[24,45,47,48,49,50,51], 
      "userbehavior":[24,45,47,48,49,50,51], 
      "gcm":[25], 
      "engagement":[29,30,32,33], 
      "games":[31,70], 
      "":[34,36], 
      "updates":[35], 
      "localizing":[37,39], 
      "publishing":[37,39,66], 
      "disttools":[37,39,41,43], 
      "brand":[40], 
      "bugdroid":[40], 
      "assets":[40], 
      "promoting":[42,43], 
      "in-app":[52,57], 
      "iap":[52,57], 
      "monetizing":[52,53,56,57,58], 
      "free":[52], 
      "trials":[52], 
      "visibility":[59], 
      "growth":[59], 
      "distributing":[59], 
      "tv":[60], 
      "publish":[60,65,75], 
      "gpfe":[61], 
      "education":[62,63], 
      "distribute":[67], 
      "bestpractices":[67], 
      "enterprise":[68], 
      "emm":[68], 
      "business":[68], 
      "administrator":[68], 
      "profile":[68], 
      "vr":[70], 
      "carboard":[70], 
      "cast":[71], 
      "video":[71], 
      "chromecast":[71], 
      "families":[72,73,74], 
      "auto":[75]
  };
  
  var GOOGLE_BY_TAG = {
      "google":[0], 
      "play":[0], 
      "services":[0], 
      "maps":[0], 
      "location":[0], 
      "gcm":[0], 
      "messaging":[0], 
      "places":[0], 
      "accountmanager":[1], 
      "oauth2":[1], 
      "apksize":[4], 
      "apkmax":[4], 
      "largeassets":[4], 
      "billing":[5,11,12,14], 
      "inapp":[5,11,12], 
      "iap":[5,11,12], 
      "monetization":[8], 
      "inappbilling":[8,9,14,14], 
      "subscriptions":[8,9], 
      "monetizing":[9], 
      "in-appbilling":[14], 
      "googleplay":[14], 
      "licensing":[17], 
      "drm":[17], 
      "oauth2.0":[24,25], 
      "googleauthutil":[24,25]
  };
  
  var GUIDE_BY_TAG = {
      "devicepolicymanager":[22], 
      "policy":[22], 
      "security":[22], 
      "activity":[28,161], 
      "lifecycle":[28,172], 
      "localizing":[38], 
      "localization":[38], 
      "resources":[38], 
      "formats":[38], 
      "l10n":[38], 
      "mediarouteprovider":[40], 
      "mediacontrolintent":[40], 
      "mediarouter":[42], 
      "cast":[42], 
      "chromecast":[42], 
      "wirelessdisplay":[42], 
      "miracast":[42], 
      "mediarecorder":[44,47], 
      "audio":[45,181], 
      "video":[45,47,181], 
      "adaptive":[45], 
      "streaming":[45], 
      "dash":[45], 
      "smoothstreaming":[45], 
      "mediaplayer":[46], 
      "soundpool":[46], 
      "audiomanager":[46], 
      "photo":[47], 
      "hostcardemulation":[50], 
      "hce":[50], 
      "hostapduservice":[50], 
      "offhostapduservice":[50], 
      "tapandpay":[50], 
      "wireless":[52,55,56], 
      "bluetoothadapter":[52,56], 
      "bluetoothdevice":[52,56], 
      "ble":[52], 
      "btle":[52], 
      "sipmanager":[53], 
      "sipprofile":[53], 
      "sipaudiocall":[53], 
      "telephony":[53], 
      "searchrecentsuggestions":[62], 
      "searchrecentsuggestionsprovider":[62,64], 
      "searchview":[63], 
      "home":[65], 
      "appwidgetprovider":[65], 
      "appwidgethost":[66], 
      "homescreen":[66], 
      "launcher":[66], 
      "apilevels":[91], 
      "sdkversion":[91], 
      "minsdkversion":[91], 
      "targetsdkversion":[91], 
      "maxsdkversion":[91], 
      "filtering":[93], 
      "features":[93], 
      "googleplayfilters":[93], 
      "permissions":[93], 
      "clipboardmanager":[95], 
      "clipdata":[95,126], 
      "input":[95,96], 
      "ime":[97], 
      "keyboard":[97], 
      "inputmethodservice":[97], 
      "sensorevent":[104,105], 
      "accelerometer":[104], 
      "gyroscope":[104], 
      "gravity":[104], 
      "rotation":[104], 
      "stepcounter":[104], 
      "location":[106], 
      "sensors":[106], 
      "valueanimator":[113], 
      "objectanimator":[113], 
      "layouttransition":[113], 
      "viewpropertyanimator":[113], 
      "games":[117], 
      "sdcard":[118,121], 
      "external":[118], 
      "database":[121], 
      "sharedpreferences":[121], 
      "preference":[124], 
      "preferenceactivity":[124], 
      "preferencefragment":[124], 
      "view":[125,153], 
      "viewgroup":[125], 
      "actionbar":[127], 
      "menu":[127], 
      "tabs":[127], 
      "listview":[131], 
      "linearlayout":[132], 
      "gridview":[134], 
      "relativelayout":[135], 
      "edittext":[138], 
      "autocompletetextview":[138], 
      "switch":[139], 
      "togglebutton":[139], 
      "datepicker":[140], 
      "timepicker":[140], 
      "radiobutton":[142], 
      "radiogroup":[142], 
      "adapterview":[143], 
      "spinneradapter":[143], 
      "button":[144], 
      "imagebutton":[144], 
      "accessibility":[147], 
      "alertdialog":[150], 
      "dialogfragment":[150], 
      "intentfilter":[162,164], 
      "recents":[166], 
      "overview":[166], 
      "multiplescreens":[182]
  };
  
  var NDK_BY_TAG = {
      "ndk":[28], 
      "native":[28], 
      "c++":[28]
  };
  
  var PREVIEW_BY_TAG = {
      "preview":[1,10,14], 
      "mpreview":[1], 
      "androidm":[1,7,11,12], 
      "previewresources":[7,11,12], 
      "backup":[11]
  };
  
  var SAMPLES_BY_TAG = {
      "examples":[8], 
      "code":[8]
  };
  
  var TOOLS_BY_TAG = {
      "project":[3], 
      "mipmap":[3], 
      "studio":[4,67,68,69], 
      "templates":[4], 
      "firstapp":[4,67], 
      "android":[12,13,14,15,16,17,18,19,20,21,22,23,24,25,26], 
      "performance":[12,13,14,15,16,17,18,19,20,21,22,23,24,25,26], 
      "profiling":[12,13,14,15,16,17,18,19,20,21,22,23,24,25,26], 
      "tools":[12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,67], 
      "rendering":[12,15,16,17,25], 
      "gpu":[12], 
      "systrace":[49], 
      "speed":[49], 
      "memory":[50], 
      "outofmemoryerror":[50], 
      "65536":[63], 
      "references":[63], 
      "max":[63], 
      "65k":[63], 
      "dex":[63], 
      "64k":[63], 
      "multidex":[63], 
      "multi-dex":[63], 
      "methods</p>":[63], 
      "adk":[72,73,74], 
      "databinding":[77], 
      "layouts":[77], 
      "ninepatch":[88], 
      "shell":[104], 
      "adb":[104,111], 
      "am":[104], 
      "pm":[104], 
      "screenrecord":[104], 
      "screencap":[104], 
      "adt":[112], 
      "sdk":[134], 
      "androidstudio":[134], 
      "sdkmanager":[146]
  };
  
  var TRAINING_BY_TAG = {
      "actionbar":[8,9,10,11,12], 
      "activitylifecycle":[13,14,15,16,17], 
      "network":[18,135,136,155,252,274], 
      "wireless":[18,155,252], 
      "intents":[22,23,24,25,29,46], 
      "emulator":[26], 
      "sdktools":[27], 
      "ui":[28,100], 
      "projectsetup":[30], 
      "fragments":[31,32,33,34,195], 
      "styles":[35], 
      "layouts":[36,37], 
      "strings":[38], 
      "localizing":[38], 
      "localization":[38], 
      "resources":[38], 
      "formats":[38], 
      "l10n":[38], 
      "datastorage":[39,40,41,42], 
      "wakelock":[44], 
      "alarmmanager":[44], 
      "wakefulbroadcastreceiver":[44], 
      "edittext":[51], 
      "accessibility":[51], 
      "intentservice":[59], 
      "gamecontroller":[62], 
      "nfcadapter":[66], 
      "androidbeam":[66], 
      "share":[66,199], 
      "filetransfer":[66], 
      "backnavigation":[70], 
      "navutils":[70,73], 
      "taskstackbuilder":[70,73], 
      "viewpager":[72], 
      "horizontal":[72], 
      "paging":[72], 
      "swipeview":[72], 
      "tabs":[72], 
      "upnavigation":[73], 
      "drawerlayout":[74], 
      "navigation":[74,149,170,205], 
      "":[75], 
      "testing":[82,158,159,160,161,162,163], 
      "searchview":[87], 
      "database":[87], 
      "camera":[91], 
      "video":[91], 
      "picture":[91], 
      "work":[95], 
      "enterprise":[95], 
      "corporate":[95], 
      "widgets":[100,307], 
      "authentication":[105], 
      "signin":[105], 
      "social":[105], 
      "google+":[105], 
      "mapview":[106], 
      "location":[106,263], 
      "notifications":[108,109,110,111,112,113,226,227,228,229,230], 
      "threadpool":[116], 
      "runnable":[116], 
      "ndk":[133,134], 
      "native":[133,134], 
      "threads":[137], 
      "asynctask":[137], 
      "gps":[138,263], 
      "ram":[139], 
      "lowmemory":[139], 
      "outofmemoryerror":[139], 
      "ontrimmemory":[139], 
      "multiplescreens":[146,196], 
      "print":[149], 
      "cloud":[151,152], 
      "wifi":[155], 
      "auto":[165,166,167,168], 
      "car":[165,167,168], 
      "automotive":[165,167,168], 
      "messaging":[165], 
      "input":[170,205], 
      "cursorloader":[177], 
      "privacy":[181], 
      "oauth":[181], 
      "accounts":[181], 
      "billing":[185], 
      "tablet":[195], 
      "tv":[195,312,313,314,316,317,318,320,322,323,324,325,326,327,328,331,332], 
      "fileprovider":[199], 
      "wear":[219,220,221,222,223,224,225,227], 
      "include":[248], 
      "merge":[248], 
      "viewstub":[248], 
      "listview":[248], 
      "battery":[252], 
      "support":[259,307], 
      "audio":[269], 
      "media":[269], 
      "opengl":[282], 
      "graphics":[282,298], 
      "getusers":[292], 
      "search":[292,315], 
      "appindexing":[292], 
      "bitmaps":[298], 
      "images":[298], 
      "animator":[302], 
      "views":[302], 
      "layout":[302], 
      "userinterface":[302], 
      "card":[319], 
      "leanback":[329], 
      "recyclerview":[329], 
      "launcher":[329], 
      "unsupported":[330]
  };
  
  
  