Expert Android - Programming 3D Graphics with OpenGL.pdf -...

This preview shows page 1 out of 425 pages.

Unformatted text preview: For your convenience Apress has placed some of the front matter material after the index. Please use the Bookmarks and Contents at a Glance links to access them. Contents at a Glance About the Authors.............................................................................................................. xix About the Technical Reviewer ........................................................................................... xxi Acknowledgments ........................................................................................................... xxiii Introduction ...................................................................................................................... xxv ■ Chapter 1: Exploring Custom Views ..................................................................................1 ■ Chapter 2: Exploring Compound Controls........................................................................33 ■ Chapter 3: Principles and Practice of Custom Layouts ...................................................61 ■ Chapter 4: JSON for On-Device Persistence ....................................................................81 ■ Chapter 5: Programming for Multiple Devices ................................................................99 ■ Chapter 6: Advanced Form Processing .........................................................................115 ■ Chapter 7: Using the Telephony APIs .............................................................................135 ■ Chapter 8: Advanced Debugging and Analysis ..............................................................153 ■ Chapter 9: Programming 3D Graphics with OpenGL ......................................................175 ■ Chapter 10: Introduction to Android Search ..................................................................257 ■ Chapter 11: Simple Search Suggestion Provider...........................................................279 ■ Chapter 12: Custom Search Suggestion Provider..........................................................297 v vi Contents at a Glance ■ Chapter 13: Introduction to Cloud Storage with Parse ..................................................329 ■ Chapter 14: Enhancing Parse with Parcelables .............................................................353 ■ Chapter 15: Exploring Push Notifications with Parse ....................................................381 Index .................................................................................................................................397 Introduction As a programmer, designer, or architect, you may be lulled into thinking that the Android API is merely what you use to write mobile programs for the Android mobile platform—which, of course, is true. However, we believe that the Android architecture has an undercurrent that makes it a key pillar in the cloud-based Google computing era that is beckoning all of us! When you learn deeply about the Android API, you are gaining a pass to the future of Google, and perhaps to the future of all of us. This book, Expert Android, is our fifth book on Android in the last four years. In the first four books, published under the Pro Android name, we covered increasingly new material on the core Android API. Expert Android is the outcome of our deepest desire and commitment to bring you the essentials for writing compelling and impactful Android applications at a faster pace. In Expert Android, you will find more difficult topics that are not covered anywhere else. You will discover ways that help you extend Android and companion topics that will enhance your Android mobile applications. You also will find information that is applicable for any release of Android. Is This Book for You? As authors, the first question we want to answer is whether this book is for you. Yes, this book is for you if you are transitioning from learning about Android and writing stock applications to writing applications that are impactful. Yes, it’s for you if you also want to release those applications to the market quickly. A key focus of Expert Android is to write components that extend Android, especially UI components. This is important, for two reasons. First, you can write reusable components that are specific to your suite of applications or problem space. Second, there are increasingly reusable open-source components that you can borrow along with their source codes. Often, or even only occasionally, you will need to tweak these components to meet your needs. You will then need to understand how the source codes of these custom components work. This book will guide you through the details of these customized components. The first three chapters on customizing views, and the fourth chapter on OpenGL, serve this Android UI customization goal. xxv xxvi Introduction There is an advantage in the mobile space if you can release applications quickly into the marketplace, a topic that we address in Expert Android. The chapter on JSON shows you a really cool and quick way to use persistence, which is so essential for all mobile applications. Additionally, many mobile applications are form based. The chapter on advanced form processing makes writing form-based applications really easy. And the three chapters on Parse will further expedite your writing of collaborative mobile applications in record time. Yes, this book is for you if you want to push the mobile programming practice to the next level, using the best tools and approaches available. What You Need to Know Before You Begin Expert Android assumes that you are familiar with Java and Android. The basis for most of Android programming is Java. However, if you know any high-level object-oriented programming language, you should be able to pick up Android programming fairly quickly. Having experience with Eclipse or IntelliJ would be quite helpful. This book further assumes that you know the basics of Android and that you have written a few simple applications. There are a number of books to get you to this stage, including our Pro Android series from APress. In short, we assume you will have worked with Java, Eclipse or IntelliJ, and Android for a year or two. With that said, here’s a brief, quick overview of what is in Expert Android, chapter by chapter. What’s in This Book We start Expert Android by documenting in depth how you can customize Android UI by customizing the views, controls, and layouts. You will see over 100 pages of this material spread over the first three chapters. In Chapter 4, we provide a practical way to persist the application state with JSON. This allows you to write small to medium mobile applications really quickly, as it makes persistence super-simple. Just quickly browse through this chapter if you are skeptical. In Chapter 5, we address an essential question of how to write a mobile application that works well on multiple mobile form factors. Continuing the theme of practical guidance for mobile applications, in Chapter 6 we present an advanced form-processing framework to write form-based mobile applications using really simple principles. A mobile device is a phone too, which we tend to forget. Chapter 7 covers the telephony API of Android. With the memory and power consumption of mobile devices always at a premium, you want your applications to run as efficiently as possible. In Chapter 8, we cover the debugging approaches and tools available for ensuring this is the case. OpenGL has a come a long way on Android, now with substantial support for the new generation of programmable GPUs. Android has been supporting ES 2.0 for sometime. In Chapter 9, we have over 100 pages covering OpenGL. With this chapter on OpenGL, we start at the begining and explain all the concepts without needing to refer to external books, although we do provide an extensive Introduction xxvii bibliography on OpenGL. We cover ES 2.0, and we provide guidance to combine OpenGL and regular views to pave the way for 3D components. Federated search protocol of Android is powerful, as you can use it in quite a few imaginative ways. The search experience is also shifting and pivoting with each release of Android so as to reach its full potential. Chapters 10, 11, and 12 fully explore the fundamentals of the search protocol and also offer some alternative ways to optimally use this Android facility. And if our intuitions are correct, mobile applications will increasingly be collaborative, so they will need to store data in the cloud and also collaborate among users. Chapters 13, 14, and 15 present Parse-related material. In short, we have taken a successful cloud platform called Parse, and have engaged it for user management, cloud storage, and push notifications. With Parse now being part of Facebook, this coverage of Parse is a valuable addition to our book, for two reasons: its synergy with Facebook, and how easy it is to take collaborative applications to the marketplace. Mobile in the cloud is the future. We are proud to have taken a good first step toward exploring this potential in Expert Android. How to Prepare for Expert Android Although we have used the latest Android release (4.2) to write and test Expert Android, the contents of this book are fairly independent of any Android release. Most, if not all, sample programs and code should work even in future releases. Expecially, the concepts and approaches presented here should be valid across all Android releases. To heighten the readability of these chapters, among other improvements we have reduced the typical pages and pages of source code. Instead, the source code for each chapter is available both on Apress.com and at our supporting site, androidbook.com. You will be able to download each chapter’s source code and load it into Eclipse directly. If you are using IntelliJ or another editor, you can unzip each chapter and build the code by importing the projects manually into your favorite IDE. Furthermore, we have broken some of the bigger topics into more manageable shorter chapters. For example, we have the discussion of custom views spread out in three chapters. Coverage of Parse.com is spread across three chapters as well. We’ve done the same to explain Android Search. Although most chapters are self-contained in terms of their examples, you may occasionally need to refer to the earlier chapters on that topic. If you are programming using any of the topics that we have covered in any of our books, including Expert Android, remember that our websites androidbook.com and satyakomatineni.com have dedicated knowledge folders for each topic. These knowledge folders document various items in each topic. For example, you will see in this book the Android API links you will need as you develop code in that context. In short, we use these sites often to grab code snippets and also quickly get to the Android API links. We have written Expert Android in such a way that we expect you will read through it like a novel, chapter by chapter, and grasp an idea before implementing it. You can then come back to the book for clarification or additional reference when you start implementing these ideas. xxviii Introduction How to Reach Us We can be reached readily via our respective e-mail addresses: Satya Komatineni at [email protected], and Dave MacLean at [email protected] Also, keep this URL in your bookmarks: . Here you will find links to source code, links to downloadable projects, key feedback from readers, full contact information, future notifications, errata, news on our future projects, a reading guide, additional resources—even some future alpha chapters and perhaps more. Chapter 1 Exploring Custom Views Your understanding of Android SDK is not vigorous until you master the architecture of Android’s Views. So it is appropriate that we begin Expert Android by exploring the power of Android’s custom views. Our goal in this and the next two chapters is to unwrap the architecture of Android’s Views by customizing them. In Android you can customize views in three ways: Custom views (by extending the View class) Compound views/controls (by composing other existing controls through extending one of the existing Layout classes) (Note that in this and the next few chapters we are using custom views and custom components synonymously) Custom layouts (by extending the ViewGroup class) We have learned a lot in researching each of these topics. We are eager to share with you this information on custom components, presented in this and the next two chapters. We believe custom components hold the key to unlocking the full potential of the Android SDK. We start this chapter by covering the custom views. This chapter also forms the basis for the next two chapters: Compound views/controls and Custom layouts. To demonstrate custom views, in this chapter we: Create a custom view called CircleView and explain the theory and mechanics of customizing a View. Present the entire source code of CircleView in order to guide you to write your own custom views. Show how to embed the CircleView in any of Android layouts. Show how the CircleView responds to touch events by changing the size of the circle. (Note that we are using “click” and “touch” synonymously in much of the book!) Show how the CircleView remembers state (such as the size of the circle) as you rotate the device. Show how to use custom attributes in layout files to initialize the CircleView. 1 2 CHAPTER 1: Exploring Custom Views Planning a Custom View Before we explain the implementation of a custom view like the CircleView, let us show you the expected look, feel, and behavior of the CircleView. This, we believe, will make it easier for you to follow the subsequent explanation and code. Let’s begin by examining the CircleView in Figure 1-1. In Figure 1-1, the CircleView is between two text views in a linear layout. The width of the view is set to match_parent. The height of the CircleView is set to wrap_content. Figure 1-1. Custom CircleView with wrap_content When we design this CircleView, we make the circle stroke color and width configurable in the layout file using custom attributes. To test responding to events, we use click events to expand the circle and redraw. Figure 1-2 shows what the CircleView would look like after a couple of clicks. Each click expands the circle by 20 percent. Figure 1-2. Custom CircleView expanded with clicks We then implement state management to the CircleView so that when we flip the device to landscape, the view retains its magnification. Figure 1-3 shows the rotated device with CircleView maintaining its expansion. CHAPTER 1: Exploring Custom Views Figure 1-3. Custom CircleView retaining state after rotation Let’s get started and cover all the essential things (there are a lot of them) about custom views so that you can design and code the CircleView that is shown in Figures 1-1, 1-2, and 1-3. Nature of Drawing in Android To understand how to draw in Android, you have to understand the architecture of the following classes: View ViewParent (interface) ViewGroup (extends View and implements ViewParent) ViewRoot (implements ViewParent) View is the fundamental class that all of the visible components in Android are derived from. It defines a number of callbacks to customize its behavior, like the ability to define size, draw, and save state. A ViewParent defines the protocol for any object (including another view) that wants to play the role of a parent to other views. There are two important view parents. Of those, ViewGroup is the key one. In addition to being a ViewParent, a ViewGroup also defines the protocol for a collection of child views. All layouts like the FrameLayout and LinearLayout in the Android SDK extend this class ViewGroup. ViewGroup plays a central role in defining these layouts in XML files and in placing the controls (views) at the right place. A ViewGroup also controls the background and animation of its child views. The other key ViewParent, the ViewRoot is implementation centric and is not a public API. In some releases it is called ViewRoot, and in some implementations it is called ViewRootImplementation—and it may even be changed in the future to something else. However, this class is important for understanding how drawing is done in Android. We advise you to keep tabs on the source code of these three classes (View, ViewGroup, ViewParent) to refer back to, should you have questions that were not answered anywhere else. For instance, if you want to look up the source code for View.java, Google that name and you will 3 4 CHAPTER 1: Exploring Custom Views see a number of places on the Web that has this source code. The source code may not match the latest release, but for understanding what this class does, it is sufficient. I tend to download the latest android.jar source code and keep it in eclipse, then quickly locate a file in the source using CTRL-SHIFT-R (R stands for “resource”). Being a root parent of all views in the activity, the ViewRoot schedules traversals of all the views in order to first lay them out at the right place with the right size; this is called the layout phase. The ViewRoot then traverses the view hierarchy to draw them; this phase is called the drawing phase. We will talk about each of these phases now. Layout Phase: Measurement and Layout The goal of the layout phase is to know the position and size of each view in the view hierarchy owned by a parent such as the ViewRoot. To calculate the position and size of each view, the ViewRoot initiates a layout phase. However, in the layout phase, the view root does a traversal of only those views that reported or requested a layout change. This conditional measurement is to save resources and improve response time. The trigger to initiate the layout phase may come from multiple events. One trigger may be the very first time everything is being drawn. Or one of the views, while reacting to an event like a click or touch, could report that its size has changed. In such an event, the view that got clicked on calls the method requestLayout( ). This call walks up the chain and gets to the root view (ViewRoot). The root view then schedules a layout traversal message on the main thread’s queue. The layout phase has two passes: a measure pass and a layout pass. The measure pass is implemented by the measure( ) function of the View class.The signature of this function is public final void measure(int widthMeasureSpec, int heightMeasureSpec) Make a note of this method’s signature. This signature will help you to easily locate this method measure( ) in the source code of the large View.java source file. This method, measure( ), does some housekeeping and calls the onMeasure( ) of the derived views. The derived views need to set their dimensions by calling setMeasuredDimension(). These measured dimensions set on each view are then subsequently used in the layout pass. In this context, your primary override is View.onMeasure(). Keep in mind that there is a default implementation for onMeasure(). The default implementation of onMeasure( ) decides the size of your view based on suggestions from the layout files, including an exact size passed in. We will cover this later in the chapter. Although it is the onMeasure( ) that you care about when you are a creating custom view like the CircleView, there are times when measure( ) is important as well. If the inherited custom view is a collection of other views, as in a ViewGroup, then you need to call measure( ) on child views in your onMeasure( ) method. The signature of measure( ) earlier clearly supports the idea that you can’t override it by being final, but you are expected to call it by being public. We will cover the measure( ) method arguments widthMeasureSpec and heightMeasureSpec when we work with onMeasure() later in this chapter. After the measure pass, each vi...
View Full Document

  • Left Quote Icon

    Student Picture

  • Left Quote Icon

    Student Picture

  • Left Quote Icon

    Student Picture