Thursday, October 25, 2012

Welcome to Android 4.0! Ice Cream Sandwich


Ice Cream Sandwich

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, beautiful, and beyond smart.

Android 4.0 for Users


Simple, beautiful, beyond smart

Android 4.0 builds on the things people love most about Android — easy multitasking, rich notifications, customizable home screens, resizable widgets, and deep interactivity — and adds powerful new ways of communicating and sharing.
Refined, evolved UI
Focused on bringing the power of Android to the surface, Android 4.0 makes common actions more visible and lets users navigate with simple, intuitive gestures. Refinedanimations and feedback throughout the system make interactions engaging and interesting. An entirely new typeface optimized for high-resolution screens improves readability and brings a polished, modern feel to the user interface.
Virtual buttons in the System Bar let users navigate instantly to Back, Home, and Recent Apps. The System Bar and virtual buttons are present across all apps, but can be dimmed by applications for full-screen viewing. Users can access each application's contextual options in the Action Bar, displayed at the top (and sometimes also at the bottom) of the screen.
Multitasking is a key strength of Android and it's made even easier and more visual on Android 4.0. The Recent Apps button lets users jump instantly from one task to another using the list in the System Bar. The list pops up to show thumbnail images of apps used recently — tapping a thumbnail switches to the app.
The Recent Apps list makes multitasking simple.

Jump to the camera or see notifications without unlocking.

For incoming calls, you can respond instantly by text.
Rich and interactive notifications let users keep in constant touch with incoming messages, play music tracks, see real-time updates from apps, and much more. On smaller-screen devices, notifications appear at the top of the screen, while on larger-screen devices they appear in the System Bar.
 
The All Apps launcher (left) and resizable widgets (right) give you apps and rich content from the home screen.
Home screen folders and favorites tray
New home screen folders offer a new way for users to group their apps and shortcuts logically, just by dragging one onto another. Also, in All Apps launcher, users can now simply drag an app to get information about it or immediately uninstall it, or disable a pre-installed app.
On smaller-screen devices, the home screen now includes a customizable favorites tray visible from all home screens. Users can drag apps, shortcuts, folders, and other priority items in or out of the favorites tray for instant access from any home screen.
Resizable widgets
Home screens in Android 4.0 are designed to be content-rich and customizable. Users can do much more than add shortcuts — they can embed live application content directly through interactive widgets. Widgets let users check email, flip through a calendar, play music, check social streams, and more — right from the home screen, without having to launch apps. Widgets are resizable, so users can expand them to show more content or shrink them to save space.
New lock screen actions
The lock screens now let users do more without unlocking. From the slide lock screen, users can jump directly to the camera for a picture or pull down the notifications window to check for messages. When listening to music, users can even manage music tracks and see album art.
Quick responses for incoming calls
When an incoming call arrives, users can now quickly respond by text message, without needing to pick up the call or unlock the device. On the incoming call screen, users simply slide a control to see a list of text responses and then tap to send and end the call. Users can add their own responses and manage the list from the Settings app.
Swipe to dismiss notifications, tasks, and browser tabs
Android 4.0 makes managing notifications, recent apps, and browser tabs even easier. Users can now dismiss individual notifications, apps from the Recent Apps list, and browser tabs with a simple swipe of a finger.
A spell-checker lets you find errors and fix them faster.

A powerful voice input engine lets you dictate continously.
Improved text input and spell-checking
The soft keyboard in Android 4.0 makes text input even faster and more accurate. Error correction and word suggestion are improved through a new set of default dictionaries and more accurate heuristics for handling cases such as double-typed characters, skipped letters, and omitted spaces. Word suggestion is also improved and the suggestion strip is simplified to show only three words at a time.
To fix misspelled words more easily, Android 4.0 adds a spell-checker that locates and underlines errors and suggests replacement words. With one tap, users can choose from multiple spelling suggestions, delete a word, or add it to the dictionary. Users can even tap to see replacement suggestions for words that are spelled correctly. For specialized features or additional languages, users can now download and install third-party dictionaries, spell-checkers, and other text services.
Powerful voice input engine
Android 4.0 introduces a powerful new voice input engine that offers a continuous "open microphone" experience and streaming voice recognition. The new voice input engine lets users dictate the text they want, for as long as they want, using the language they want. Users can speak continously for a prolonged time, even pausing for intervals if needed, and dictate punctuation to create correct sentences. As the voice input engine enters text, it underlines possible dictation errors in gray. After dictating, users can tap the underlined words to quickly replace them from a list of suggestions.
 
Data usage controls let you monitor total usage by network type and application and then set limits if needed.
Control over network data
Mobile devices can make extensive use of network data for streaming content, synchronizing data, downloading apps, and more. To meet the needs of users withtiered or metered data plans, Android 4.0 adds new controls for managing network data usage.
In the Settings app, colorful charts show the total data usage on each network type (mobile or Wi-Fi), as well as amount of data used by each running application. Based on their data plans, users can optionally set warning levels or hard limits on data usage or disable mobile data altogether. Users can also manage the background data used by individual applications as needed.
Designed for accessibility
A variety of new features greatly enhance the accessibility of Android 4.0 for blind or visually impaired users. Most important is a new explore-by-touch mode that lets users navigate without having to see the screen. Touching the screen once triggers audible feedback that identifies the UI component below; a second touch in the same component activates it with a full touch event. The new mode is especially important to support users on new devices that use virtual buttons in the System Bar, rather than dedicated hardware buttons or trackballs. Also, standard apps are updated to offer an improved accessibility experience. The Browser supports a script-based screen reader for reading favorite web content and navigating sites. For improved readability, users can also increase the default font size used across the system.
The accessibility experience begins at first setup — a simple touch gesture during setup (clockwise square from upper left) activates all accessibility features and loads a setup tutorial. Once accessibility features are active, everything visible on the screen can be spoken aloud by the standard screen reader.

Communication and sharing

  
Contacts and profiles are integrated across apps and social networks, for a consistent, personal experience everywhere — from incoming calls to emails.
Designed for the way people live, Android 4.0 integrates rich social communication and sharing touchpoints across the system, making it easy to talk, email, text, and share.
People and profiles
Throughout the system, a user’s social groups, profiles, and contacts are linked together and integrated for easy accessibility. At the center is a newPeople app that offers richer profile information, including a large profile picture, phone numbers, addresses and accounts, status updates, events, stream items, and a new button for connecting on integrated social networks.
The user's own contact information is stored in a new "Me" profile, allowing easier sharing with apps and people. All of the user's integrated contacts are displayed in an easy to manage list, including controls over which contacts are shown from any integrated account or social network. Wherever the user navigates across the system, tapping a profile photo displays Quick Contacts, with large profile pictures, shortcuts to phone numbers, text messaging, and more.
Unified calendar, visual voicemail
To help organize appointments and events, an updated Calendar app brings together personal, work, school, and social agendas. With user permission, other applications can contribute events to the calendar and manage reminders, for an integrated view across multiple calendar providers. The app is redesigned to let users manage events more easily. Calendars are color-coded and users can swipe left or right to change dates and pinch to zoom in or out agendas.
In the phone app, a new visual voicemail features integrates incoming messages, voice transcriptions, and audio files from one or more providers. Third-party applications can integrate with the Phone app to add their own voice messages, transcriptions, and more to the visual voicemail inbox.
Capture the picture you want, edit, and share instantly.
Rich and versatile camera capabilities
The Camera app includes many new features that let users capture special moments with great photos and videos. After capturing images, they can edit and share them easily with friends.
When taking pictures, continuous focuszero shutter lag exposure, and decreased shot-to-shot speed help capture clear, precise images. Stabilized image zoom lets users compose photos and video in the way they want, including while video is recording. For new flexibility and convenience while shooting video, users can now take snapshots at full video resolution just by tapping the screen as video continues to record.
To make it easier to take great pictures of people, built-in face detectionlocates faces in the frame and automatically sets focus. For more control, users can tap to focus anywhere in the preview image.
For capturing larger scenes, the Camera introduces a single-motion panorama mode. In this mode, the user starts an exposure and then slowly turns the Camera to encompass as wide a perspective as needed. The Camera assembles the full range of continuous imagery into a single panoramic photo.
After taking a picture or video, users can quickly share it by email, text message, bluetooth, social networks, and more, just by tapping the thumbnail in the camera controls.
A Photo Gallery widget on the home screen.
Redesigned Gallery app with photo editor
The Gallery app now makes it easier to manage, show, and share photos and videos. For managing collections, a redesigned album layout shows many more albums and offers larger thumbnails. There are many ways to sort albums, including by time, location, people, and tags. To help pictures look their best, the Gallery now includes a powerful photo editor. Users can crop and rotate pictures, set levels, remove red eyes, add effects, and much more. After retouching, users can select one or multiple pictures or videos to share instantly over email, text messaging, bluetooth, social networks, or other apps.
An improved Picture Gallery widget lets users look at pictures directly on their home screen. The widget can display pictures from a selected album, shuffle pictures from all albums, or show a single image. After adding the widget to the home screen, users can flick through the photo stacks to locate the image they want, then tap to load it in Gallery.
Live Effects let you change backgrounds and use Silly Faces during video.
Live Effects for transforming video
Live Effects is a collection of graphical transformations that add interest and fun to videos captured in the Camera app. For example, users can change the background behind them to any stock or custom image, for just the right setting when shooting videeo. Also available for video is Silly Faces, a set of morphing effects that use state-of-the-art face recognition and GPU filters to transform facial features. For example, you can use effects such as small eyes, big mouth, big nose, face squeeze, and more. Outside of the Camera app, Live Effects is available during video chat in the Google Talk app.
Snapping a screenshot.
Sharing with screenshots
Users can now share what's on their screens more easily by taking screenshots. Hardware buttons let them snap a screenshot and store it locally. Afterward, they can view, edit, and share the screen shot in Gallery or a similar app.

Cloud-connected experience

 
The Browser tabs menu (left) lets you quickly switch browser tabs. The options menu (right) gives you new ways to manage your browsing experience.

Benchmark comparisons of Android Browser.
Android has always been cloud-connected, letting users browse the web and sync photos, apps, games, email, and contacts — wherever they are and across all of their devices. Android 4.0 adds new browsing and email capabilities to let users take even more with them and keep communication organized.
Powerful web browsing
The Android Browser offers an experience that’s as rich and convenient as a desktop browser. It lets users instantly sync and manage Google Chrome bookmarks from all of their accounts, jump to their favorite content faster, and even save it for reading later in case there's no network available.
To get the most out of web content, users can now request fulldesktop versions of web sites, rather than their mobile versions. Users can set their preference for web sites separately for eachbrowser tab. For longer content, users can save a copy for offline reading. To find and open saved pages, users can browse a visual list that’s included with browser bookmarks and history. For better readability and accessibility, users can increase the browser’s zoom levels and override the system default text sizes.
Across all types of content, the Android Browser offers dramatically improved page rendering performance through updated versions of the WebKit core and the V8 Crankshaft compilation engine for JavaScript. In benchmarks run on a Nexus S device, the Android 4.0 browser showed an improvement of nearly 220% over the Android 2.3 browser in the V8 Benchmark Suite and more than 35% in the SunSpider 9.1 JavaScript Benchmark. When run on a Galaxy Nexus device, the Android 4.0 browser showed improvement of nearly 550% in the V8 benchmark and nearly 70% in the SunSpider benchmark.
Improved email
In Android 4.0, email is easier to send, read, and manage. For composing email, improved auto-completion of recipients helps with finding and adding frequent contacts more quickly. For easier input of frequent text, users can now createquick responses and store them in the app, then enter them from a convenient menu when composing. When replying to a message, users can now toggle the message to Reply All and Forward without changing screens.
For easier browsing across accounts and labels, the app adds an integrated menu of accounts and recent labels. To help users locate and organize IMAP and Exchange email, the Email app now supports nested mail subfolders, each with synchronization rules. Users can also search across folders on the server, for faster results.
For enterprises, the Email app supports EAS v14. It supports EAS certificate authentication, provides ABQ strings for device type and mode, and allows automatic sync to be disabled while roaming. Administrators can also limit attachment size or disable attachments.
For keeping track of incoming email more easily, a resizable Email widget lets users flick through recent email right from the home screen, then jump into the Email app to compose or reply.
Android Beam lets users share what they are using with a single tap.

Innovation

Android is continously driving innovation forward, pushing the boundaries of communication and sharing with new capabilities and interactions.
Android Beam for NFC-based sharing
Android Beam is an innovative, convenient feature for sharing across two NFC-enabled devices, It lets people instantly exchange favorite apps, contacts, music, videos — almost anything. It’s incredibly simple and convenient to use — there’s no menu to open, application to launch, or pairing needed. Just touch one Android-powered phone to another, then tap to send.
For sharing apps, Android Beam pushes a link to the app's details page in Google Play. On the other device, the Google Play client app launches and loads the details page, for easy downloading of the app. Individual apps can build on Android Beam to add other types of interactions, such as passing game scores, initiating a multiplayer game or chat, and more.
Face recognition lets you unlock your phone with your face.
Face Unlock
Android 4.0 introduces a completely new approach to securing a device, making each person's device even more personal — Face Unlock is a new screen-lock option that lets users unlock their devices with their faces. It takes advantage of the device front-facing camera and state-of-the-art facial recognition technology to register a face during setup and then to recognize it again when unlocking the device. Users just hold their devices in front of their faces to unlock, or use a backup PIN or pattern.
Wi-Fi Direct and Bluetooth HDP
Support for Wi-Fi Direct lets users connect directly to nearby peer devices over Wi-Fi, for more reliable, higher-speed communication. No internet connection or tethering is needed. Through third-party apps, users can connect to compatible devices to take advantage of new features such as instant sharing of files, photos, or other media; streaming video or audio from another device; or connecting to compatible printers or other devices.
Android 4.0 also introduces built-in support for connecting to Bluetooth Health Device Profile (HDP) devices. With support from third-party apps, users can connect to wireless medical devices and sensors in hospitals, fitness centers, homes, and elsewhere.

New Developer Features


Unified UI framework for phones, tablets, and more

Android 4.0 brings a unified UI framework that lets developers create elegant, innovative apps for phones, tablets, and more. It includes all of the familiar Android 3.x interface elements and APIs — fragments, content loaders, Action Bar, rich notifications, resizable home screen widgets, and more — as well as new elements and APIs.
For developers, the unified UI framework in Android 4.0 means new UI tools, consistent design practices, simplified code and resources, and streamlined development across the range of Android-powered devices.

Key Honeycomb developer features,
now for phones too

Core UI
  • Fragments and content loaders
  • Resizeable home screen widgets
  • Rich notifications
  • Multi-selection, drag-drop, clipboard
  • Improved screen-support API
  • Hardware-accelerated 2D graphics
Graphics and animation
  • Property-based animation
  • Renderscript 3D graphics
Media and connectivity
  • HTTP Live streaming
  • Bluetooth A2DP and HSP devices
  • Support for RTP
  • MTP/PTP file transfer
  • DRM framework
  • Input from keyboard, mouse, gamepad, joystick
Enterprise
  • Full device encryption
  • DPM policies for encrypted storage and passwords

Communication and sharing

Android 4.0 extends social and sharing features to any application on the device. Applications can integrate contacts, profile data, stream items, and calendar events from any of the user’s activities or social networks.
Social API
A shared social provider and API provide a new unified store for contacts, profile data, stream items, and photos. Any app or social network with user permission can contribute raw contacts and make them accessible to other apps and networks. Applications with user permission can also read profile data from the provider and display it in their applications.
The social API lets applications store standard contact data as well as new types of content for any given contact, including large profile photos, stream items, and recent activity feedback. Recent activity feedback is a standard way for applications to “tag” a contact with common activity, such as when the user calls the contact or sends an email or SMS message. The social provider uses the recent activity feedback as a new signal in ranking, such as for name auto-complete, to keep the most relevant contacts ranked closest to the top.
Applications can also let users set up a social connection to a contact from the People app. When the user touches Add Connection in a contact, the app sends a public intent that other apps can handle, displaying any UI needed to create the social connection.
Building on the social API, developers can add powerful new interactions that span multiple social networks and contacts sources.
Calendar API
A shared calendar content provider and framework API make it easier for developers to add calendar services to their apps.
With user permission, any application can add events to the shared database and manage dates, attendees, alerts, and reminders. Applications can also read entries from the database, including events contributed by other applications, and handle the display of event alerts and reminders. Using the calendar provider, applications can take advantage of event data sourced from a variety of apps and protocols, to offer innovative ways of viewing and managing a user’s events. Apps can also use calendar data to improve the relevance of their other content.
For lighter-weight access to calendar services, the Calendar app defines a set of public Intents for creating, viewing, and editing events. Rather than needing to implement a calendar UI and integrate directly with the calendar provider, applications can simply broadcast calendar Intents. When the Calendar app receives the Intents, it launches the appropriate UI and stores any event data entered. Using calendar Intents, for example, apps can let users add events directly from lists, dialogs, or home screen widgets, such as for making restaurant reservations or booking time with friends.
Visual voicemail API
A shared Voicemail provider and API allow developers to build applications that contribute to a unified voicemail store. Voicemails are displayed and played in the call log tab of the platform’s Phone app.
Android Beam
Android Beam is an NFC-based feature that lets users instantly share information about the apps they are using, just by touching two NFC-enabled phones together. When the devices are in range — within a few centimeters — the system sets up an NFC connection and displays a sharing UI. To share whatever they are viewing with the other device, users just touch the screen.
For developers, Android Beam is a new way of triggering almost any type of proximity-based interaction. For example, it can let users instantly exchange contacts, set up multiplayer gaming, join a chat or video call, share a photo or video, and more. The system provides the low-level NFC support and the sharing UI, while the foreground app provides lightweight data to transfer to the other device. Developers have complete control over the data that is shared and how it is handled, so almost any interaction is possible. For larger payloads, developers can even use Android Beam to initiate a connection and transfer the data over Bluetooth, without the need for user-visible pairing.
Even if developers do not add custom interactions based on Android Beam they can still benefit from it being deeply integrated into Android. By default the system shares the app’s Google Play URL, so it’s easy for the user to download or purchase the app right away.
Modular sharing widget
The UI framework includes a new widget, ShareActionProvider, that lets developers quickly embed standard share functionality and UI in the Action Bar of their applications. Developers simply add ShareActionProvider to the menu and set an intent that describes the desired sharing action. The system handles the rest, building up the list of applications that can handle the share intent and dispatching the intent when the user chooses from the menu.

New media capabilities

Low-level streaming multimedia
Android 4.0 provides a direct, efficient path for low-level streaming multimedia. The new path is ideal for applications that need to maintain complete control over media data before passing it to the platform for presentation. For example, media applications can now retrieve data from any source, apply proprietary encryption/decryption, and then send the data to the platform for display.
Applications can now send processed data to the platform as a multiplexed stream of audio/video content in MPEG-2 transport stream format. The platform de-muxes, decodes, and renders the content. The audio track is rendered to the active audio device, while the video track is rendered to either a Surface or a SurfaceTexture. When rendering to a SurfaceTexture, the application can apply subsequent graphics effects to each frame using OpenGL.
To support this low-level streaming, the platform introduces a new native API based on Khronos OpenMAX AL 1.0.1. The API is implemented on the same underlying services as the platform’s existing OpenSL ES API, so developers can make use of both APIs together if needed. Tools support for low-level streaming multimedia will be available in an upcoming release of the Android NDK.
New camera capabilities
Developers can take advantage of a variety of new camera features in Android 4.0. ZSL exposure, continuous focus, and image zoom let apps capture better still and video images, including during video capture. Apps can even capture full-resolution snapshots while shooting video. Apps can now set custom metering regions in a camera preview, then manage white balance and exposure dynamically for those regions. For easier focusing and image processing, a face-detection service identifies and tracks faces in a preview and returns their screen coordinates.
Media effects for transforming images and video
A set of high-performance transformation filters let developers apply rich effects to any image passed as an OpenGL ES 2.0 texture. Developers can adjust color levels and brightness, change backgrounds, sharpen, crop, rotate, add lens distortion, and apply other effects. The transformations are processed by the GPU, so they are fast enough for processing image frames loaded from disk, camera, or video stream.
Audio remote controls
Android 4.0 adds a new audio remote control API that lets media applications integrate with playback controls that are displayed in a remote view. Media applications can integrate with a remote music playback control that’s built into in the platform’s lock screen, allowing users to control song selection and playback without having to unlock and navigate to the music app.
Using the audio remote control API, any music or media app can register to receive media button events from the remote control and then manage play state accordingly. The application can also supply metadata to the remote control, such as album art or image, play state, track number and description, duration, genre, and more.
New media codecs and containers
Android 4.0 adds support for additional media types and containers to give developers access to the formats they need. For high-quality compressed images, the media framework adds support for WebP content. For video, the framework now supports streaming VP8 content. For streaming multimedia, the framework supports HTTP Live streaming protocol version 3 and encoding of ADTS-contained AAC content. Additionally, developers can now use Matroska containers for Vorbis and VP8 content.

New types of connectivity

Wi-Fi Direct
Developers can use a framework API to discover and connect directly to nearby devices over a high-performance, secure Wi-Fi Direct connection. No internet connection or hotspot is needed.
Wi-Fi Direct opens new opportunities for developers to add innovative features to their applications. Applications can use Wi-Fi Direct to share files, photos, or other media between devices or between a desktop computer and an Android-powered device. Applications could also use Wi-Fi Direct to stream media content from a peer device such as a digital television or audio player, connect a group of users for gaming, print files, and more.
Bluetooth Health Device Profile (HDP)
Developers can now build powerful medical applications that use Bluetooth to communicate with wireless devices and sensors in hospitals, fitness centers, homes, and elsewhere. Applications can collect and manage data from HDP source devices and transmit it to backend medical applications such as records systems, data analysis services, and others.
Using a framework API, applications can use Bluetooth to discover nearby devices, establish reliable or streaming data channels, and manage data transmission. Applications can supply any IEEE 11073 Manager to retrieve and interpret health data from Continua-certified devices such as heart-rate monitors, blood meters, thermometers, and scales.

New UI components and capabilities

Layout enhancements
A new layout, GridLayout, improves the performance of Android applications by supporting flatter view hierarchies that are faster to layout and render. Because hierarchies are flatter, developers can also manage alignments between components that are visually related to each other even when they are not logically related, for precise control over application UI. GridLayout is also specifically designed to be configured by drag-and-drop design tools such as the ADT Plug-in for Eclipse.
OpenGL ES texture views
A new TextureView object lets developers directly integrate OpenGL ES textures as rendering targets in a UI hierarchy. The object lets developers display and manipulate OpenGL ES rendering just as they would a normal view object in the hierarchy, including moving, transforming, and animating the view as needed. The TextureView object makes it easy for developers to embed camera preview, decoded video, OpenGL game scenes, and more. TextureView can be viewed as a more powerful version of the existing SurfaceView object, since it offers the same benefits of access to a GL rendering surface, with the added advantage of having that surface participate fully in the normal view hierarchy.
Hardware-accelerated 2D drawing
All Android-powered devices running Android 4.0 are required to support hardware-accelerated 2D drawing. Developers can take advantage of this to add great UI effects while maintaining optimal performance on high-resolution screens, even on phones. For example, developers can rely on accelerated scaling, rotation, and other 2D operations, as well as accelerated UI components such as TextureView and compositing modes such as filtering, blending, and opacity.

New input types and text services

Stylus input, button support, hover events
Android 4.0 includes full support for stylus input events, including tilt and distance axes, pressure, and related motion event properties. To help applications distinguish motion events from different sources, the platform adds distinct tool types for stylus, finger, mouse, and eraser. For improved input from multi-button pointing devices, the platform now provides distinct primary, secondary, and tertiary buttons, as well as back and forward buttons. Hover-enter and hover-exit events are also added, for improved navigation and accessibility. Developers can build on these new input features to add powerful interactions to their apps, such as precise drawing and gesturing, handwriting and shape recognition, improved mouse input, and others.
Text services API for integrating spelling checkers
Android 4.0 lets applications query available text services such as dictionaries and spell checkers for word suggestions, corrections, and similar data. The text services are external to the active IME, so developers can create and distribute dictionaries and suggestion engines that plug into the platform. When an application receives results from a text service — for example, word suggestions — it can display them in a dedicated suggestion popup window directly inside the text view, rather than relying on the IME to display them.

Enhanced accessibility APIs

Android 4.0 adds new accessibility features and an enhanced API to let developers improve the user experience in their apps, especially on devices that don’t have hardware buttons. For accessibility services such as screen readers in particular, the platform offers new APIs to query window content, for easier navigation, better feedback, and richer user interfaces.
Accessibility API
To let applications manage interactions more effectively when accessibility features are enabled, the platform adds accessibility events for explore-by-touch mode, scrolling, and text selection. For these and other events, the platform can attach a new object called an accessibility record that provides extra information about the event context.
Using the accessibility record and related APIs, applications can now access the view hierarchy associated with an event. Applications can query for key properties such as parent and child nodes, available states, supported actions, screen position, and more. Applications can also request changes to certain properties to help manage focus and selected state. For example, an accessibility service could use these new capabilities to add convenient features such as screen-search by text.
Text-to-speech API
A new framework API lets developers write text-to-speech engines and make them available to any app requesting TTS capabilities.

Efficient network usage

In Android 4.0, users can see how much network data their running apps are using. They can also set limits on data usage by network type and disable background data usage for specific applications. In this context, developers need to design their apps to run efficiently and follow best practices for checking the network connection. Android 4.0 provides network APIs to let applications meet those goals.
As users move between networks or set limits on network data, the platform lets applications query for connection type and availability. Developers can use this information to dynamically manage network requests to ensure the best experience for users. Developers can also build custom network and data-usage options into their apps, then expose them to users directly from Settings by means of a new system Intent.

Security for apps and content

Secure management of credentials
Android 4.0 makes it easier for applications to manage authentication and secure sessions. A new keychain API and underlying encrypted storage let applications store and retrieve private keys and their corresponding certificate chains. Any application can use the keychain API to install and store user certificates and CAs securely.
Address Space Layout Randomization
Android 4.0 now provides address space layout randomization (ASLR) to help protect system and third party applications from exploitation due to memory-management issues.

Enhancements for Enterprise

VPN client API
Developers can now build or extend their own VPN solutions on the platform using a new VPN API and underlying secure credential storage. With user permission, applications can configure addresses and routing rules, process outgoing and incoming packets, and establish secure tunnels to a remote server. Enterprises can also take advantage of a standard VPN client built into the platform that provides access to L2TP and IPSec protocols.
Device policy management for camera
The platform adds a new policy control for administrators who manage devices using an installed Device Policy Manager. Administrators can now remotely disable the camera on a managed device for users working in sensitive environments.

Android 4.1 APIs


API Level: 16
Android 4.1 (Jelly Bean) is a progression of the platform that offers improved performance and enhanced user experience. It adds new features for users and app developers. This document provides an introduction to the most notable and useful new APIs for app developers.

Declare your app API Level

To better optimize your app for devices running Android 4.1, you should set your targetSdkVersion to "16", install it on an Android 4.1 system image, test it, then publish an update with this change.
You can use APIs in Android 4.1 while also supporting older versions by adding conditions to your code that check for the system API level before executing APIs not supported by yourminSdkVersion. To learn more about maintaining backward-compatibility, read Creating Backward-Compatible UIs.
More information about how API levels work is available in What is API Level?
As an app developer, Android 4.1 is available to you with an SDK platform you can use to build your app against Android 4.1 and with a system image you can run in the Android emulator. You should download download the platform and system image as soon as possible to build and test your app on Android 4.1. To get started developing and testing against Android 4.1, use the Android SDK Manager to download the platform into your SDK.

App Components


Isolated services

By specifying android:isolatedProcess="true" in the <service> tag, yourService will run under its own isolated user ID process that has no permissions of its own.

Memory management

New ComponentCallbacks2 constants such asTRIM_MEMORY_RUNNING_LOW and TRIM_MEMORY_RUNNING_CRITICALprovide foreground processes more information about memory state before the system calls onLowMemory().
New getMyMemoryState(ActivityManager.RunningAppProcessInfo)method allows you to retrieve the general memory state.

Content providers

A new method, acquireUnstableContentProviderClient(), allows you to access a ContentProviderClient that may be "unstable" such that your app will not crash if the content provider does. It's useful when you are interacting with content providers in a separate app.

Live Wallpapers

New intent protocol to directly launch the live wallpaper preview activity so you can help users easily select your live wallpaper without forcing them to leave your app and navigate through the Home wallpaper picker.
To launch the live wallpaper picker, call startActivity() with an Intent using ACTION_CHANGE_LIVE_WALLPAPERand an extra that specifies your live wallpaper ComponentName as a string in EXTRA_LIVE_WALLPAPER_COMPONENT.

App stack navigation

Android 4.1 makes it much easier to implement the proper design patterns for Up navigation. All you need to do is add theandroid:parentActivityName to each <activity> element in your manifest file. The system uses this information to open the appropriate activity when the user presses the Up button in the action bar (while also finishing the current activity). So if you declare the android:parentActivityName for each activity, you don't need theonOptionsItemSelected() method to handle click events on the action bar's app icon—the system now handles that event and resumes or creates the appropriate activity.
This is particularly powerful for scenarios in which the user enters one of your app's activities through a "deep dive" intent such as from a notification or an intent from different app (as described in the design guide for Navigating Between Apps). When the user enters your activity this way, your app may not naturally have a back stack of activities that can be resumed as the user navigates up. However, when you supply the android:parentActivityName attribute for your activities, the system recognizes whether or not your app already contains a back stack of parent activities and, if not, constructs a synthetic back stack that contains all parent activities.
Note: When the user enters a deep activity in your app and it creates a new task for your app, the system actually inserts the stack of parent activities into the task. As such, pressing the Back button also navigates back through the stack of parent activities.
When the system creates a synthetic back stack for your app, it builds a basic Intent to create a new instance of each parent activity. So there's no saved state for the parent activities the way you'd expect had the user naturally navigated through each activity. If any of the parent activities normally show a UI that's dependent on the user's context, that context information will be missing and you should deliver it when the user navigates back through the stack. For example, if the user is viewing an album in a music app, navigating up might bring them to an activity that lists all albums in a chosen music genre. In this case, if the stack must be created, it's necessary that you inform the parent activity what genre the current album belongs to so that the parent can display the proper list as if the user actually came from that activity. To deliver such information to a synthetic parent activity, you must override theonPrepareNavigateUpTaskStack() method. This provides you with a TaskStackBuilder object that the system created in order to synthesize the parent activities. The TaskStackBuilder contains Intent objects that the system uses to create each parent activity. In your implementation of onPrepareNavigateUpTaskStack(), you can modify the appropriate Intent to add extra data that the parent activity can use to determine the appropriate context and display the appropriate UI.
When the system creates the TaskStackBuilder, it adds the Intent objects that are used to create the parent activities in their logical order beginning from the top of the activity tree. So, the last Intent added to the internal array is the direct parent of the current activity. If you want to modify the Intent for the activity's parent, first determine the length of the array with getIntentCount() and pass that value to editIntentAt().
If your app structure is more complex, there are several other APIs available that allow you to handle the behavior of Up navigation and fully customize the synthetic back stack. Some of the APIs that give you additional control include:
onNavigateUp()
Override this to perform a custom action when the user presses the Up button.
navigateUpTo(Intent)
Call this to finish the current activity and go to the activity indicated by the supplied Intent. If the activity exists in the back stack, but is not the closest parent, then all other activities between the current activity and the activity specified with the intent are finished as well.
getParentActivityIntent()
Call this to get the Intent that will start the logical parent for the current activity.
shouldUpRecreateTask(Intent)
Call this to query whether a synthetic back stack must be created in order to navigate up. Returns true if a synthetic stack must be created, false if the appropropriate stack already exists.
finishAffinity()
Call this to finish the current activity and all parent activities with the same task affinity that are chained to the current activity. If you override the default behaviors such as onNavigateUp(), you should call this method when you create a synthetic back stack upon Up navigation.
onCreateNavigateUpTaskStack
Override this if you need to fully control how the synthetic task stack is created. If you want to simply add some extra data to the intents for your back stack, you should instead override onPrepareNavigateUpTaskStack()
However, most apps don't need to use these APIs or implement onPrepareNavigateUpTaskStack(), but can can achieve the correct behavior simply by adding android:parentActivityName to each <activity> element.

Multimedia


Media codecs

The MediaCodec class provides access to low-level media codecs for encoding and decoding your media. You can instantiate a MediaCodec by calling createEncoderByType() to encode media or call createDecoderByType() to decode media. Each of these methods take a MIME type for the type of media you want to encode or decode, such as"video/3gpp" or "audio/vorbis".
With an instance of MediaCodec created, you can then call configure() to specify properties such as the media format or whether or not the content is encrypted.
Whether you're encoding or decoding your media, the rest of the process is the same after you create the MediaCodec. First call getInputBuffers() to get an array of input ByteBuffer objects and getOutputBuffers() to get an array of output ByteBuffer objects.
When you're ready to encode or decode, call dequeueInputBuffer() to get the index position of the ByteBuffer (from the array of input buffers) that you should use to to feed in your source media. After you fill the ByteBuffer with your source media, release ownership of the buffer by calling queueInputBuffer().
Likewise for the output buffer, call dequeueOutputBuffer() to get the index position of the ByteBuffer where you'll receive the results. After you read the output from the ByteBuffer, release ownership by callingreleaseOutputBuffer().
You can handle encrypted media data in the codecs by calling queueSecureInputBuffer() in conjunction with theMediaCrypto APIs, instead of the normal queueInputBuffer().
For more information about how to use codecs, see the MediaCodec documentation.

Record audio on cue

New method startRecording() allows you to begin audio recording based on a cue defined by a MediaSyncEvent. TheMediaSyncEvent specifies an audio session (such as one defined by MediaPlayer), which when complete, triggers the audio recorder to begin recording. For example, you can use this functionality to play an audio tone that indicates the beginning of a recording session and recording automatically begins so you don't have to manually synchronize the tone and the beginning of recording.

Timed text tracks

The MediaPlayer now handles both in-band and out-of-band text tracks. In-band text tracks come as a text track within an MP4 or 3GPP media source. Out-of-band text tracks can be added as an external text source viaaddTimedTextSource() method. After all external text track sources are added, getTrackInfo() should be called to get the refreshed list of all available tracks in a data source.
To set the track to use with the MediaPlayer, you must call selectTrack(), using the index position for the track you want to use.
To be notified when the text track is ready to play, implement the MediaPlayer.OnTimedTextListener interface and pass it to setOnTimedTextListener().

Audio effects

The AudioEffect class now supports additional audio pre-processing types when capturing audio:
  • Acoustic Echo Canceler (AEC) with AcousticEchoCanceler removes the contribution of the signal received from the remote party from the captured audio signal.
  • Automatic Gain Control (AGC) with AutomaticGainControl automatically normalizes the output of the captured signal.
  • Noise Suppressor (NS) with NoiseSuppressor removes background noise from the captured signal.
You can apply these pre-processor effects on audio captured with an AudioRecord using one of the AudioEffectsubclasses.
Note: It's not guaranteed that all devices support these effects, so you should always first check availability by callingisAvailable() on the corresponding audio effect class.

Gapless playback

You can now perform gapless playback between two separate MediaPlayer objects. At any time before your firstMediaPlayer finishes, call setNextMediaPlayer() and Android attempts to start the second player the moment that the first one stops.
Media router. The new APIs MediaRouter, MediaRouteActionProvider, and MediaRouteButton provide standard mechanisms and UI for choosing where to play media.

Camera


Auto focus movement

The new interface Camera.AutoFocusMoveCallback allows you to listen for changes to the auto focus movement. You can register your interface with setAutoFocusMoveCallback(). Then when the camera is in a continuous autofocus mode (FOCUS_MODE_CONTINUOUS_VIDEO or FOCUS_MODE_CONTINUOUS_PICTURE), you'll receive a call toonAutoFocusMoving(), which tells you whether auto focus has started moving or has stopped moving.

Camera sounds

The MediaActionSound class provides a simple set of APIs to produce standard sounds made by the camera or other media actions. You should use these APIs to play the appropriate sound when building a custom still or video camera.
To play a sound, simply instantiate a MediaActionSound object, call load() to pre-load the desired sound, then at the appropriate time, call play().

Connectivity


Android Beam

Android Beam™ now supports large payload transfers over Bluetooth. When you define the data to transfer with either the new setBeamPushUris() method or the new callback interface NfcAdapter.CreateBeamUrisCallback, Android hands off the data transfer to Bluetooth or another alternate transport to achieve faster transfer speeds. This is especially useful for large payloads such as image and audio files and requires no visible pairing between the devices. No additional work is required by your app to take advantage of transfers over Bluetooth.
The setBeamPushUris() method takes an array of Uri objects that specify the data you want to transfer from your app. Alternatively, you can implement the NfcAdapter.CreateBeamUrisCallback interface, which you can specify for your activity by calling setBeamPushUrisCallback().
When using the callback interface, the system calls the interface's createBeamUris() method when the user executes a share with Android Beam so that you can define the URIs to share at share-time. This is useful if the URIs to share might vary depending on the user context within the activity, whereas calling setBeamPushUris() is useful when the URIs to share are unchanging and you can safely define them ahead of time.

Network service discovery

Android 4.1 adds support for multicast DNS-based service discovery, which allows you to find and connect to services offered by peer devices over Wi-Fi, such as mobile devices, printers, cameras, media players, and others that are registered on the local network.
The new package android.net.nsd contains the new APIs that allow you to broadcast your services on the local network, discover local devices on the network, and connect to devices.
To register your service, you must first create an NsdServiceInfo object and define the various properties of your service with methods such as setServiceName()setServiceType(), and setPort().
Then you need to implement NsdManager.RegistrationListener and pass it to registerService() with yourNsdServiceInfo.
To discover services on the network, implement NsdManager.DiscoveryListener and pass it todiscoverServices().
When your NsdManager.DiscoveryListener receives callbacks about services found, you need to resolve the service by calling resolveService(), passing it an implementation of NsdManager.ResolveListener that receives anNsdServiceInfo object that contains information about the discovered service, allowing you to initiate the connection.

Wi-Fi Direct service discovery

The Wi-Fi Direct APIs are enhanced in Android 4.1 to support pre-association service discovery in the WifiP2pManager. This allows you to discover and filter nearby devices by services using Wi-Fi Direct before connecting to one, while Network Service Discovery allows you to discover a service on an existing connected network (such as a local Wi-Fi network).
To broadcast your app as a service over Wi-Fi so that other devices can discover your app and connect to it, calladdLocalService() with a WifiP2pServiceInfo object that describes your app services.
To initiate discover of nearby devices over Wi-Fi, you need to first decide whether you'll communicate using Bonjour or Upnp. To use Bonjour, first set up some callback listeners with setDnsSdResponseListeners(), which takes both aWifiP2pManager.DnsSdServiceResponseListener and WifiP2pManager.DnsSdTxtRecordListener. To use Upnp, call setUpnpServiceResponseListener(), which takes a WifiP2pManager.UpnpServiceResponseListener.
Before you can start discovering services on local devices, you also need to call addServiceRequest(). When theWifiP2pManager.ActionListener you pass to this method receives a successful callback, you can then begin discovering services on local devices by calling discoverServices().
When local services are discovered, you'll receive a callback to either theWifiP2pManager.DnsSdServiceResponseListener or WifiP2pManager.UpnpServiceResponseListener, depending on whether you registered to use Bonjour or Upnp. The callback received in either case contains aWifiP2pDevice object representing the peer device.

Network usage

The new method isActiveNetworkMetered() allows you to check whether the device is currently connected to a metered network. By checking this state before performing intensive network transactions, you can help manage the data usage that may cost your users money and make informed decisions about whether to perform the transactions now or later (such as when the device becomes connected to Wi-Fi).

Accessibility


Accessibility service APIs

The reach of accessibility service APIs has been significantly increased in Android 4.1. It now allows you to build services that monitor and respond to more input events, such as complex gestures using onGesture() and other input events through additions to the AccessibilityEventAccessibilityNodeInfo and AccessibilityRecord classes.
Accessibility services can also perform actions on behalf of the user, including clicking, scrolling and stepping through text using performAction and setMovementGranularities. The performGlobalAction() method also allows services to perform actions such as Back, Home, and open Recent Apps and Notifications.

Customizable app navigation

When building an Android app, you can now customize navigation schemes by finding focusable elements and input widgets using findFocus() and focusSearch(), and set focus using setAccessibilityFocused().

More accessible widgets

The new android.view.accessibility.AccessibilityNodeProvider class allows you to surface complex custom views to accessibility services so they can present the information in a more accessible way. Theandroid.view.accessibility.AccessibilityNodeProvider allows a user widget with advanced content, such as a calendar grid, to present a logical semantic structure for accessibility services that is completely separate from the widget’s layout structure. This semantic structure allows accessibility services to present a more useful interaction model for users who are visually impaired.

Copy and Paste


Copy and paste with intents

You can now associate a ClipData object with an Intent using the setClipData() method. This is especially useful when using an intent to transfer multiple content: URIs to another application, such as when sharing multiple documents. The content: URIs supplied this way will also respect the intent's flags to offer read or write access, allowing you to grant access to multiple URIs in an the intent. When starting an ACTION_SEND orACTION_SEND_MULTIPLE intent, the URIs supplied in the intent are now automatically propagated to the ClipData so that the receiver can have access granted to them.
Support for HTML and string styles
The ClipData class now supports styled text (either as HTML or Android styled strings). You can add HTML styled text to the ClipData with newHtmlText().

Renderscript


Renderscript computation functionality has been enhanced with the following features:
  • Support for multiple kernels within one script.
  • Support for reading from allocation with filtered samplers from compute in a new script API rsSample.
  • Support for different levels of FP precision in #pragma.
  • Support for querying additional information from RS objects from a compute script.
  • Numerous performance improvements.
New pragmas are also available to define the floating point precision required by your compute Renderscripts. This lets you enable NEON like operations such as fast vector math operations on the CPU path that wouldn’t otherwise be possible with full IEEE 754-2008 standard.
Note: The experimental Renderscript graphics engine is now deprecated.

Animation


Activity launch animations

You can now launch an Activity using zoom animations or your own custom animations. To specify the animation you want, use the ActivityOptions APIs to build a Bundle that you can then pass to any of the methods that start an activity, such as startActivity().
The ActivityOptions class includes a different method for each type of animation you may want to show as your activity opens:
makeScaleUpAnimation()
Creates an animation that scales up the activity window from a specified starting position on the screen and a specified starting size. For example, the home screen in Android 4.1 uses this when opening an app.
makeThumbnailScaleUpAnimation()
Creates an animation that scales up the activity window starting from a specified position and a provided thumbnail image. For example, the Recent Apps window in Android 4.1 uses this when returning to an app.
makeCustomAnimation()
Creates an animation defined by your own resources: one that defines the animation for the activity opening and another for the activity being stopped.

Time animator

The new TimeAnimator provides a simple callback mechanism with the TimeAnimator.TimeListener that notifies you upon every frame of the animation. There is no duration, interpolation, or object value-setting with this Animator. The listener's callback receives information for each frame including total elapsed time and the elapsed time since the previous animation frame.

User Interface


Notifications

In Android 4.1, you can create notifications with larger content regions, big image previews, multiple action buttons, and configurable priority.
Notification styles
The new method setStyle() allows you to specify one of three new styles for your notification that each offer a larger content region. To specify the style for your large content region, pass setStyle() one of the following objects:
Notification.BigPictureStyle
For notifications that includes a large image attachment.
Notification.BigTextStyle
For notifications that includes a lot of text, such as a single email.
Notification.InboxStyle
For notifications that include a list of strings, such as snippets from multiple emails.
Notification actions
There's now support for up to two action buttons that appear at the bottom of the notification message, whether your notification uses the normal or larger style.
To add an action button, call addAction(). This method takes three arguments: a drawable resource for an icon, text for the button, and a PendingIntent that defines the action to perfrom.
Priorities
You can now hint to the system how important your notification is to affect the order of your notification in the list by setting the priority with setPriority(). You can pass this one of five different priority levels defined by PRIORITY_*constants in the Notification class. The default is PRIORITY_DEFAULT, and there's two levels higher and two levels lower.
High priority notifications are things that users generally want to respond to quickly, such as a new instant message, text message, or impending event reminder. Low priority notifications are things like expired calendar events or app promotions.

Controls for system UI

Android 4.0 (Ice Cream Sandwich) added new flags to control the visibility of the system UI elements, such as to dim the appearance of the system bar or make it disappear completely on handsets. Android 4.1 adds a few more flags that allow you to further control the appearance of system UI elements and your activity layout in relation to them by callingsetSystemUiVisibility() and passing the following flags:
SYSTEM_UI_FLAG_FULLSCREEN
Hides non-critical system UI (such as the status bar). If your activity uses the action bar in overlay mode (by enablingandroid:windowActionBarOverlay), then this flag also hides the action bar and does so with a coordinated animation when both hiding and showing the two.
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
Sets your activity layout to use the same screen area that's available when you've enabledSYSTEM_UI_FLAG_FULLSCREEN even if the system UI elements are still visible. Although parts of your layout will be overlayed by the system UI, this is useful if your app often hides and shows the system UI withSYSTEM_UI_FLAG_FULLSCREEN, because it avoids your layout from adjusting to the new layout bounds each time the system UI hides or appears.
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
Sets your activity layout to use the same screen area that's available when you've enabledSYSTEM_UI_FLAG_HIDE_NAVIGATION (added in Android 4.0) even if the system UI elements are still visible. Although parts of your layout will be overlayed by the navigation bar, this is useful if your app often hides and shows the navigation bar with SYSTEM_UI_FLAG_HIDE_NAVIGATION, because it avoids your layout from adjusting to the new layout bounds each time the navigation bar hides or appears.
SYSTEM_UI_FLAG_LAYOUT_STABLE
You might want to add this flag if you're using SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN and/orSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION to ensure that when you call fitSystemWindows() on a view that the bounds defined remain consistent with regard to the available screen space. That is, with this flag set,fitSystemWindows() will behave as if the visibility of system UI elements is unchanged even after you hide all system UI.
For more discussion about the other related system UI flags, read about those added in Android 4.0.

Remote views

GridLayout and ViewStub are now remotable views so you can use them in layouts for your app widgets and notification custom layouts.

Font families

Android 4.1 adds several more variants of the Roboto font style for a total of 10 variants, and they're all usable by apps. Your apps now have access to the full set of both light and condensed variants.
The complete set of Roboto font variants available is:
  • Regular
  • Italic
  • Bold
  • Bold-italic
  • Light
  • Light-italic
  • Condensed regular
  • Condensed italic
  • Condensed bold
  • Condensed bold-italic
You can apply any one of these with the new fontFamily attribute in combination with the textStyle attribute.
Supported values for fontFamily are:
  • "sans-serif" for regular Roboto
  • "sans-serif-light" for Roboto Light
  • "sans-serif-condensed" for Roboto Condensed
You can then apply bold and/or italic with textStyle values "bold" and "italic". You can apply both like so:android:textStyle="bold|italic".
You can also use Typeface.create(). For example, Typeface.create("sans-serif-light", Typeface.NORMAL).

Input Framework


Multiple input devices

The new InputManager class allows you to query the set of input devices current connected and register to be notified when a new device is added, changed, or removed. This is particularly useful if you're building a game that supports multiple players and you want to detect how many controllers are connected and when there are changes to the number of controllers.
You can query all input devices connected by calling getInputDeviceIds(). This returns an array of integers, each of which is an ID for a different input device. You can then call getInputDevice() to acquire an InputDevice for a specified input device ID.
If you want to be informed when new input devices are connected, changed, or disconnected, implement theInputManager.InputDeviceListener interface and register it with registerInputDeviceListener().

Vibrate for input controllers

If connected input devices have their own vibrate capabilities, you can now control the vibration of those devices using the existing Vibrator APIs simply by calling getVibrator() on the InputDevice.

Permissions


The following are new permissions:
READ_EXTERNAL_STORAGE
Provides protected read access to external storage. In Android 4.1 by default all applications still have read access. This will be changed in a future release to require that applications explicitly request read access using this permission. If your application already requests write access, it will automatically get read access as well. There is a new developer option to turn on read access restriction, for developers to test their applications against how Android will behave in the future.
READ_USER_DICTIONARY
Allows an application to read the user dictionary. This should only be required by an IME, or a dictionary editor like the Settings app.
READ_CALL_LOG
Allows an application to read the system's call log that contains information about incoming and outgoing calls.
WRITE_CALL_LOG
Allows an application to modify the system's call log stored on your phone
WRITE_USER_DICTIONARY
Allows an application to write to the user's word dictionary.

Device Features


Android 4.1 includes a new feature declaration for devices that are dedicated to displaying the user interface on a television screen: FEATURE_TELEVISION. To declare that your app requires a television interface, declare this feature in your manifest file with the <uses-feature> element:
<manifest ... >
    <uses-feature android:name="android.hardware.type.television"
                  android:required="true" />
    ...
</manifest>
This feature defines "television" to be a typical living room television experience: displayed on a big screen, where the user is sitting far away and the dominant form of input is be something like a d-pad, and generally not through touch or a mouse/pointer-device.

My Headlines

RF Optimization 2G,3G,4G and Wimax

Subscribe Now: google

Add to Google Reader or Homepage