Android How to Program, 3/e

Book description

Thinking like a developer - from the start.

Created by world-renowned programming instructors Paul and Harvey Deitel, Android How to Program, Third Edition introduces the dynamic world of Android smartphone and tablet app development with the Android Software Development Kit (SDK), the Java™ programming language, and the rapidly evolving Android Studio Integrated Development Environment (IDE). Updated to Android 6 and Google—s preferred Android Studio IDE, the Third Edition presents cutting-edge mobile computing technologies. The Deitels— App-driven Approach helps readers master Android app development through eight complete, working Android apps.

Each chapter features new concepts through a single app. The authors begin with an introduction to the app, followed by an app test-drive showing sample executions and a technologies overview. Next, they present detailed steps to build the app. Finally, they provide a detailed code walkthrough of the app—s source code, discussing the programming concepts and Android APIs used in the app. The book also has an extensive introduction to programming using the Java language, making it appropriate for Java courses that want to add an app-programming flavor.

Table of contents

  1. Android™ HOW TO PROGRAM with an Introduction to Java™
    1. How To Program Series
    2. Deitel® Developer Series
    3. Simply Series
    4. CourseSmart Web Books
    5. LiveLessons Video Learning Products
  2. Android™ HOW TO PROGRAM with and Introduction to Java™
  3. Trademarks
  4. Contents
  5. Preface
    1. Architecture of Android How to Program, 3/e
    2. App-Driven Approach
    3. Intended Audiences
    4. Instructor Resources
    5. Before You Begin: Software Used in Android How to Program, 3/e
    6. Getting up to Speed in Java and XML
    7. App-Development Courses
    8. Key Topics
    9. Pedagogic Features
    10. Working with Open-Source Apps
    11. Copyright Notice and Code License
    12. Android 6 App-Development Fundamentals LiveLessons Video Training
    13. Join the Deitel & Associates, Inc. Social Media Communities
    14. Contacting the Authors
    15. About the Authors
    16. About Deitel & Associates, Inc
  6. Before You Begin
  7. 1 Introduction to Android
    1. Objectives
    2. Outline
    3. 1.1 Introduction
    4. 1.2 Android—The World’s Leading Mobile Operating System
    5. 1.3 Android Features
    6. 1.4 Android Operating System
      1. 1.4.1 Android 2.2 (Froyo)
      2. 1.4.2 Android 2.3 (Gingerbread)
      3. 1.4.3 Android 3.0 through 3.2 (Honeycomb)
      4. 1.4.4 Android 4.0 through 4.0.4 (Ice Cream Sandwich)
      5. 1.4.5 Android 4.1–4.3 (Jelly Bean)
      6. 1.4.6 Android 4.4 (KitKat)
      7. 1.4.7 Android 5.0 and 5.1 (Lollipop)
      8. 1.4.8 Android 6 (Marshmallow)
    7. 1.5 Downloading Apps from Google Play
    8. 1.6 Packages
    9. 1.7 Android Software Development Kit (SDK)
    10. 1.8 Object-Oriented Programming: A Quick Refresher
      1. 1.8.1 The Automobile as an Object
      2. 1.8.2 Methods and Classes
      3. 1.8.3 Instantiation
      4. 1.8.4 Reuse
      5. 1.8.5 Messages and Method Calls
      6. 1.8.6 Attributes and Instance Variables
      7. 1.8.7 Encapsulation
      8. 1.8.8 Inheritance
      9. 1.8.9 Object-Oriented Analysis and Design (OOAD)
    11. 1.9 Test-Driving the Tip Calculator App in an Android Virtual Device (AVD)
      1. 1.9.1 Opening the Tip Calculator App’s Project in Android Studio
      2. 1.9.2 Creating Android Virtual Devices (AVDs)
      3. 1.9.3 Running the Tip Calculator App on the Nexus 6 Smartphone AVD
        1. Troubleshooting AVD Startup
      4. 1.9.4 Running the Tip Calculator App on an Android Device
        1. Test-Drives for the Book’s Apps
        2. Preparing to Distribute Apps
    12. 1.10 Building Great Android Apps
    13. 1.11 Android Development Resources
    14. 1.12 Wrap-Up
    15. Self-Review Exercises
    16. Answers to Self-Review Exercises
    17. Exercises
  8. 2 Welcome App
    1. Objectives
    2. Outline
    3. 2.1 Introduction
    4. 2.2 Technologies Overview
      1. 2.2.1 Android Studio
      2. 2.2.2 LinearLayout, TextView and ImageView
      3. 2.2.3 Extensible Markup Language (XML)
      4. 2.2.4 App Resources
      5. 2.2.5 Accessibility
      6. 2.2.6 Internationalization
    5. 2.3 Creating an App
      1. 2.3.1 Launching Android Studio
      2. 2.3.2 Creating a New Project
      3. 2.3.3 Create New Project Dialog
      4. 2.3.4 Target Android Devices Step
      5. 2.3.5 Add an Activity to Mobile Step
      6. 2.3.6 Customize the Activity Step
    6. 2.4 Android Studio Window
      1. 2.4.1 Project Window
      2. 2.4.2 Editor Windows
      3. 2.4.3 Component Tree Window
      4. 2.4.4 App Resource Files
      5. 2.4.5 Layout Editor
        1. Selecting the Screen Type for GUI Design
      6. 2.4.6 Default GUI
      7. 2.4.7 XML for the Default GUI
    7. 2.5 Building the App’s GUI with the Layout Editor
      1. 2.5.1 Adding an Image to the Project
        1. drawable Folders
        2. Adding bug.png to the Project
      2. 2.5.2 Adding an App Icon
      3. 2.5.3 Changing RelativeLayout to a LinearLayout
      4. 2.5.4 Changing the LinearLayout’s id and orientation
        1. Setting the LinearLayout’s orientation and id Properties
        2. The id Property’s XML Representation
      5. 2.5.5 Configuring the TextView’s id and text Properties
        1. Setting the TextView’s id Property
        2. Configuring the TextView’s text Property Using a String Resource
      6. 2.5.6 Configuring the TextView’s textSize Property—Scaled Pixels and Density-Independent Pixels
        1. Creating a Dimension Resource for the Font Size on a Phone Device
        2. Creating a Dimension Resource for the Font Size on a Large Tablet Device
      7. 2.5.7 Setting the TextView’s textColor Property
      8. 2.5.8 Setting the TextView’s gravity Property
      9. 2.5.9 Setting the TextView’s layout:gravity Property
      10. 2.5.10 Setting the TextView’s layout:weight Property
      11. 2.5.11 Adding an ImageView to Display the Image
      12. 2.5.12 Previewing the Design
    8. 2.6 Running the Welcome App
    9. 2.7 Making Your App Accessible
    10. 2.8 Internationalizing Your App
      1. 2.8.1 Localization
      2. 2.8.2 Naming the Folders for Localized Resources
      3. 2.8.3 Adding String Translations to the App’s Project
      4. 2.8.4 Localizing Strings
      5. 2.8.5 Testing the App in Spanish on an AVD
        1. Returning the AVD to English
      6. 2.8.6 Testing the App in Spanish on a Device
        1. Returning Your Device to English
      7. 2.8.7 TalkBack and Localization
      8. 2.8.8 Localization Checklist
      9. 2.8.9 Professional Translation
    11. 2.9 Wrap-Up
    12. Self-Review Exercises
    13. Answers to Self-Review Exercises
    14. Exercises
  9. 3 Tip Calculator App
    1. Objectives
    2. Outline
    3. 3.1 Introduction
    4. 3.2 Test-Driving the Tip Calculator App
    5. 3.3 Technologies Overview
      1. 3.3.1 Class Activity
      2. 3.3.2 Activity Lifecycle Methods
      3. 3.3.3 AppCompat Library and Class AppCompatActivity
      4. 3.3.4 Arranging Views with a GridLayout
      5. 3.3.5 Creating and Customizing the GUI with the Layout Editor and the Component Tree and Properties Windows
      6. 3.3.6 Formatting Numbers as Locale-Specific Currency and Percentage Strings
      7. 3.3.7 Implementing Interface TextWatcher for Handling EditText Text Changes
      8. 3.3.8 Implementing Interface OnSeekBarChangeListener for Handling SeekBar Thumb Position Changes
      9. 3.3.9 Material Themes
      10. 3.3.10 Material Design: Elevation and Shadows
      11. 3.3.11 Material Design: Colors
      12. 3.3.12 AndroidManifest.xml
      13. 3.3.13 Searching in the Properties Window
    6. 3.4 Building the GUI
      1. 3.4.1 GridLayout Introduction
        1. id Property Values for This App’s Views
      2. 3.4.2 Creating the TipCalculator Project
      3. 3.4.3 Changing to a GridLayout
        1. Specifying Two Columns and Default Margins for the GridLayout
      4. 3.4.4 Adding the TextViews, EditText and SeekBar
        1. Step 1: Adding Views to the First Row
        2. Step 2: Adding Views to the Second Row
        3. Step 3: Adding Views to the Third Row
        4. Step 4: Adding Views to the Fourth Row
        5. Reviewing the Layout So Far
        6. A Note Regarding the EditText’s Virtual Keyboard
      5. 3.4.5 Customizing the Views
        1. Step 5: Specifying Literal Text
        2. Step 6: Right Aligning the TextViews in the Left Column
        3. Step 7: Configuring the amountEditText
        4. Step 8: Configuring the amountTextView
        5. Step 9: Configuring the percentTextView
        6. Step 10: Configuring the percentSeekBar
        7. Step 11: Configuring the tipTextView and totalTextView
    7. 3.5 Default Theme and Customizing Theme Colors
      1. 3.5.1 parent Themes
      2. 3.5.2 Customizing Theme Colors
        1. Modifying the Theme’s Primary, Dark Primary and Accent Colors
      3. 3.5.3 Common View Property Values as Styles
    8. 3.6 Adding the App’s Logic
      1. 3.6.1 package and import Statements
      2. 3.6.2 MainActivity Subclass of AppCompatActivity
      3. 3.6.3 Class Variables and Instance Variables
      4. 3.6.4 Overriding Activity Method onCreate
        1. onCreate’s Bundle Parameter
        2. Generated R Class Contains Resource IDs
        3. Inflating the GUI
        4. Getting References to the Widgets
        5. Displaying Initial Values in the TextViews
        6. Registering the Event Listeners
        7. Note Regarding Android 6 Data Binding
      5. 3.6.5 MainActivity Method calculate
      6. 3.6.6 Anonymous Inner Class That Implements Interface OnSeekBarChangeListener
        1. Overriding Method onProgressChanged of Interface OnSeekBarChangeListener
        2. Overriding Methods onStartTrackingTouch and onStopTrackingTouch of Interface OnSeekBarChangeListener
        3. Android Studio Tools for Overriding Methods
      7. 3.6.7 Anonymous Inner Class That Implements Interface TextWatcher
      8. Overriding Method onTextChanged of Interface TextWatcher
      9. Other Methods of the amountEditTextWatcher TextWatcher
    9. 3.7 AndroidManifest.xml
      1. 3.7.1 manifest Element
      2. 3.7.2 application Element
      3. 3.7.3 activity Element
      4. 3.7.4 intent-filter Element
        1. Inter-App Communication
        2. Executing Apps
        3. Determining Which Activity to Execute
    10. 3.8 Wrap-Up
    11. Self-Review Exercises
    12. Answers to Self-Review Exercises
    13. Exercises
  10. 4 Flag Quiz App
    1. Objectives
    2. Outline
    3. 4.1 Introduction
    4. 4.2 Test-Driving the Flag Quiz App
      1. 4.2.1 Configuring the Quiz’s Settings
      2. 4.2.2 Taking the Quiz
        1. Making a Correct Selection
        2. Making an Incorrect Selection
        3. Completing the Quiz
    5. 4.3 Technologies Overview
      1. 4.3.1 Menus
      2. 4.3.2 Fragments
      3. 4.3.3 Fragment Lifecycle Methods
      4. 4.3.4 Managing Fragments
      5. 4.3.5 Preferences
      6. 4.3.6 assets Folder
      7. 4.3.7 Resource Folders
      8. 4.3.8 Supporting Different Screen Sizes and Resolutions
      9. 4.3.9 Determining the Device Orientation
      10. 4.3.10 Toasts for Displaying Messages
      11. 4.3.11 Using a Handler to Execute a Runnable in the Future
      12. 4.3.12 Applying an Animation to a View
      13. 4.3.13 Using ViewAnimationUtils to Create a Circular Reveal Animator
      14. 4.3.14 Specifying Colors Based on a View’s State Via a Color State List
      15. 4.3.15 AlertDialog
      16. 4.3.16 Logging Exception Messages
      17. 4.3.17 Launching Another Activity Via an Explicit Intent
        1. Implicit and Explicit Intents
      18. 4.3.18 Java Data Structures
      19. 4.3.19 Java SE 7 Features
      20. 4.3.20 AndroidManifest.xml
    6. 4.4 Creating the Project, Resource Files and Additional Classes
      1. 4.4.1 Creating the Project
      2. 4.4.2 Blank Activity Template Layouts
        1. activity_main.xml
        2. content_main.xml
        3. fragment_main.xml
        4. Preparing to Design the GUI
      3. 4.4.3 Configuring Java SE 7 Support
      4. 4.4.4 Adding the Flag Images to the Project
      5. 4.4.5 strings.xml and Formatted String Resources
        1. Format Strings as String Resources
      6. 4.4.6 arrays.xml
      7. 4.4.7 colors.xml
      8. 4.4.8 button_text_color.xml
      9. 4.4.9 Editing menu_main.xml
      10. 4.4.10 Creating the Flag Shake Animation
      11. 4.4.11 preferences.xml for Specifying the App’s Settings
      12. 4.4.12 Adding Classes SettingsActivity and SettingsActivityFragment to the Project
    7. 4.5 Building the App’s GUI
      1. 4.5.1 activity_main.xml Layout for Devices in Portrait Orientation
      2. 4.5.2 Designing fragment_main.xml Layout
        1. Step 1: Changing from a RelativeLayout to a LinearLayout
        2. Step 2: Adding the questionNumberTextView to the LinearLayout
        3. Step 3: Adding the flagImageView to the LinearLayout
        4. Step 4: Adding the guessCountryTextView to the LinearLayout
        5. Step 5: Adding the Buttons to the LinearLayout
        6. Step 6: Adding the answerTextView to the LinearLayout
        7. Step 7: Setting the Properties of the Buttons
      3. 4.5.3 Graphical Layout Editor Toolbar
      4. 4.5.4 content_main.xml Layout for Tablet Landscape Orientation
        1. Creating content_main.xml for Tablets in Landscape Orientation
        2. Creating the Tablet Layout’s GUI
        3. Selecting a Fragment to Preview in the Layout Editor’s Design View
    8. 4.6 MainActivity Class
      1. 4.6.1 package Statement and import Statements
      2. 4.6.2 Fields
      3. 4.6.3 Overridden Activity Method onCreate
        1. Setting the Default Preference Values and Registering a Change Listener
        2. Configuring a Phone Device for Portrait Orientation
      4. 4.6.4 Overridden Activity Method onStart
      5. 4.6.5 Overridden Activity Method onCreateOptionsMenu
      6. 4.6.6 Overridden Activity Method onOptionsItemSelected
      7. 4.6.7 Anonymous Inner Class That Implements OnSharedPreferenceChangeListener
    9. 4.7 MainActivityFragment Class
      1. 4.7.1 package and import Statements
      2. 4.7.2 Fields
      3. 4.7.3 Overridden Fragment Method onCreateView
      4. 4.7.4 Method updateGuessRows
      5. 4.7.5 Method updateRegions
      6. 4.7.6 Method resetQuiz
      7. 4.7.7 Method loadNextFlag
      8. 4.7.8 Method getCountryName
      9. 4.7.9 Method animate
      10. 4.7.10 Anonymous Inner Class That Implements OnClickListener
        1. Creating and Configuring the AlertDialog
      11. 4.7.11 Method disableButtons
    10. 4.8 SettingsActivity Class
    11. 4.9 SettingsActivityFragment Class
    12. 4.10 AndroidManifest.xml
      1. Launch Mode
    13. 4.11 Wrap-Up
    14. Self-Review Exercises
    15. Answers to Self-Review Exercises
    16. Exercises
      1. Project Exercises
  11. 5 Doodlz App
    1. Objectives
    2. Outline
    3. 5.1 Introduction
    4. 5.2 Test-Driving the Doodlz App in an Android Virtual Device (AVD)
    5. 5.3 Technologies Overview
      1. 5.3.1 Activity and Fragment Lifecycle Methods
      2. 5.3.2 Custom Views
      3. 5.3.3 Using SensorManager to Listen for Accelerometer Events
      4. 5.3.4 Custom DialogFragments
        1. Preventing Multiple Dialogs from Appearing at the Same Time
      5. 5.3.5 Drawing with Canvas, Paint and Bitmap
      6. 5.3.6 Processing Multiple Touch Events and Storing Lines in Paths
      7. 5.3.7 Saving to the Device
      8. 5.3.8 Printing and the Android Support Library’s PrintHelper Class
      9. 5.3.9 New Android 6.0 (Marshmallow) Permissions Model
      10. 5.3.10 Adding Dependencies Using the Gradle Build System
    6. 5.4 Creating the Project and Resources
      1. 5.4.1 Creating the Project
      2. 5.4.2 Gradle: Adding a Support Library to the Project
      3. 5.4.3 strings.xml
      4. 5.4.4 Importing the Material Design Icons for the App’s Menu Items
      5. 5.4.5 MainActivityFragment Menu
        1. Menus for Different Android Versions
        2. Creating the Menu
      6. 5.4.6 Adding a Permission to AndroidManifest.xml
    7. 5.5 Building the App’s GUI
      1. 5.5.1 content_main.xml Layout for MainActivity
      2. 5.5.2 fragment_main.xml Layout for MainActivityFragment
      3. 5.5.3 fragment_color.xml Layout for ColorDialogFragment
        1. Adding the colorView to the Layout
        2. Adding Class ColorDialogFragment to the Project
      4. 5.5.4 fragment_line_width.xml Layout for LineWidthDialogFragment
        1. Adding Class LineWidthDialogFragment to the Project
      5. 5.5.5 Adding Class EraseImageDialogFragment
    8. 5.6 MainActivity Class
    9. 5.7 MainActivityFragment Class
      1. 5.7.1 package Statement, import Statements and Fields
      2. 5.7.2 Overridden Fragment Method onCreateView
      3. 5.7.3 Methods onResume and enableAccelerometerListening
      4. 5.7.4 Methods onPause and disableAccelerometerListening
      5. 5.7.5 Anonymous Inner Class for Processing Accelerometer Events
      6. 5.7.6 Method confirmErase
      7. 5.7.7 Overridden Fragment Methods onCreateOptionsMenu and onOptionsItemSelected
      8. 5.7.8 Method saveImage
      9. 5.7.9 Overridden Method onRequestPermissionsResult
      10. 5.7.10 Methods getDoodleView and setDialogOnScreen
    10. 5.8 DoodleView Class
      1. 5.8.1 package Statement and import Statements
      2. 5.8.2 static and Instance Variables
      3. 5.8.3 Constructor
      4. 5.8.4 Overridden View Method onSizeChanged
      5. 5.8.5 Methods clear, setDrawingColor, getDrawingColor, setLineWidth and getLineWidth
      6. 5.8.6 Overridden View Method onDraw
      7. 5.8.7 Overridden View Method onTouchEvent
      8. 5.8.8 touchStarted Method
      9. 5.8.9 touchMoved Method
      10. 5.8.10 touchEnded Method
      11. 5.8.11 Method saveImage
      12. 5.8.12 Method printImage
    11. 5.9 ColorDialogFragment Class
      1. 5.9.1 Overridden DialogFragment Method onCreateDialog
      2. 5.9.2 Method getDoodleFragment
      3. 5.9.3 Overridden Fragment Lifecycle Methods onAttach and onDetach
      4. 5.9.4 Anonymous Inner Class That Responds to the Events of the Alpha, Red, Green and Blue SeekBars
    12. 5.10 LineWidthDialogFragment Class
      1. 5.10.1 Method onCreateDialog
      2. 5.10.2 Anonymous Inner Class That Responds to the Events of the widthSeekBar
    13. 5.11 EraseImageDialogFragment Class
    14. 5.12 Wrap-Up
    15. Self-Review Exercises
    16. Answers to Self-Review Exercises
    17. Exercises
  12. 6 Cannon Game App
    1. Objectives
    2. Outline
    3. 6.1 Introduction
    4. 6.2 Test-Driving the Cannon Game App
      1. Opening and Running the App
      2. Playing the Game
    5. 6.3 Technologies Overview
      1. 6.3.1 Using the Resource Folder res/raw
      2. 6.3.2 Activity and Fragment Lifecycle Methods
      3. 6.3.3 Overriding View Method onTouchEvent
      4. 6.3.4 Adding Sound with SoundPool and AudioManager
      5. 6.3.5 Frame-by-Frame Animation with Threads, SurfaceView and SurfaceHolder
      6. 6.3.6 Simple Collision Detection
      7. 6.3.7 Immersive Mode
    6. 6.4 Building the GUI and Resource Files
      1. 6.4.1 Creating the Project
        1. Configure the App for Landscape Orientation
      2. 6.4.2 Adjusting the Theme to Remove the App Title and App Bar
      3. 6.4.3 strings.xml
      4. 6.4.4 Colors
      5. 6.4.5 Adding the Sounds to the App
      6. 6.4.6 Adding Class MainActivityFragment
      7. 6.4.7 Editing activity_main.xml
      8. 6.4.8 Adding the CannonView to fragment_main.xml
    7. 6.5 Overview of This App’s Classes
    8. 6.6 MainActivity Subclass of Activity
    9. 6.7 MainActivityFragment Subclass of Fragment
    10. 6.8 Class GameElement
      1. 6.8.1 Instance Variables and Constructor
      2. 6.8.2 Methods update, draw, and playSound
    11. 6.9 Blocker Subclass of GameElement
    12. 6.10 Target Subclass of GameElement
    13. 6.11 Cannon Class
      1. 6.11.1 Instance Variables and Constructor
      2. 6.11.2 Method align
      3. 6.11.3 Method fireCannonball
      4. 6.11.4 Method draw
        1. Drawing the Cannon Barrel with Canvas Method drawLine
        2. Drawing the Cannon Base with Canvas Method drawCircle
      5. 6.11.5 Methods getCannonball and removeCannonball
    14. 6.12 Cannonball Subclass of GameElement
      1. 6.12.1 Instance Variables and Constructor
      2. 6.12.2 Methods getRadius, collidesWith, isOnScreen, and reverseVelocityX
        1. Checking for Collisions with Another GameElement with the collidesWith Method
        2. Reversing the Cannonball’s Horizontal Velocity with reverseVelocityX
      3. 6.12.3 Method update
      4. 6.12.4 Method draw
    15. 6.13 CannonView Subclass of SurfaceView
      1. 6.13.1 package and import Statements
      2. 6.13.2 Instance Variables and Constants
      3. 6.13.3 Constructor
        1. Registering the SurfaceHolder.Callback Listener
        2. Configuring the SoundPool and Loading the Sounds
        3. Creating the Paint Objects Used to Draw the Background and Timer Text
      4. 6.13.4 Overriding View Method onSizeChanged
      5. 6.13.5 Methods getScreenWidth, getScreenHeight, and playSound
      6. 6.13.6 Method newGame
      7. 6.13.7 Method updatePositions
        1. Elapsed Time Since the Last Animation Frame
        2. Updating the Cannonball, Blocker and Target Positions
        3. Updating the Time Left and Determining Whether Time Ran Out
      8. 6.13.8 Method alignAndFireCannonball
      9. 6.13.9 Method showGameOverDialog
      10. 6.13.10 Method drawGameElements
        1. Clearing the Canvas with Method drawRect
        2. Displaying the Time Remaining with Canvas Method drawText
        3. Drawing the Cannon, Cannonball, Blocker and Targets with the draw Method
      11. 6.13.11 Method testForCollisions
      12. 6.13.12 Methods stopGame and releaseResources
      13. 6.13.13 Implementing the SurfaceHolder.Callback Methods
      14. 6.13.14 Overriding View Method onTouchEvent
      15. 6.13.15 CannonThread: Using a Thread to Create a Game Loop
      16. 6.13.16 Methods hideSystemBars and showSystemBars
    16. 6.14 Wrap-Up
    17. Self-Review Exercises
    18. Answers to Self-Review Exercises
    19. Exercises
  13. 7 WeatherViewer App
    1. Objectives
    2. Outline
    3. 7.1 Introduction
    4. 7.2 Test-Driving the WeatherViewer App
    5. 7.3 Technologies Overview
      1. 7.3.1 Web Services
        1. REST Web Services
        2. Web Services Often Require an API Key
        3. OpenWeatherMap.org Web Services
        4. OpenWeatherMap.org Web Service License
        5. Obtaining an OpenWeatherMap.org API Key
      2. 7.3.2 JavaScript Object Notation (JSON) and the org.json Package
        1. org.json Package
      3. 7.3.3 HttpUrlConnection Invoking a REST Web Service
      4. 7.3.4 Using AsyncTask to Perform Network Requests Outside the GUI Thread
      5. 7.3.5 ListView, ArrayAdapter and the View-Holder Pattern
        1. View-Holder Pattern
      6. 7.3.6 FloatingActionButton
      7. 7.3.7 TextInputLayout
      8. 7.3.8 Snackbar
    6. 7.4 Building the App’s GUI and Resource Files
      1. 7.4.1 Creating the Project
      2. 7.4.2 AndroidManifest.xml
        1. Permissions That Are Automatically Granted in Android 6.0
      3. 7.4.3 strings.xml
      4. 7.4.4 colors.xml
      5. 7.4.5 activity_main.xml
      6. 7.4.6 content_main.xml
      7. 7.4.7 list_item.xml
        1. Step 1: Creating the Layout File and Customizing the LinearLayout’s Orientation
        2. Step 2: Adding the ImageView for Displaying a Weather-Condition Icon
        3. Step 3: Adding the GridLayout for Displaying the TextViews
        4. Step 4: Adding the TextViews
    7. 7.5 Class Weather
      1. 7.5.1 package Statement, import Statements and Instance Variables
      2. 7.5.2 Constructor
      3. 7.5.3 Method convertTimeStampToDay
    8. 7.6 Class WeatherArrayAdapter
      1. 7.6.1 package Statement and import Statements
      2. 7.6.2 Nested Class ViewHolder
      3. 7.6.3 Instance Variable and Constructor
      4. 7.6.4 Overridden ArrayAdapter Method getView
      5. 7.6.5 AsyncTask Subclass for Downloading Images in a Separate Thread
        1. Downloading the Weather-Condition Image
    9. 7.7 Class MainActivity
      1. 7.7.1 package Statement and import Statements
      2. 7.7.2 Instance Variables
      3. 7.7.3 Overridden Activity Method onCreate
      4. 7.7.4 Methods dismissKeyboard and createURL
      5. 7.7.5 AsyncTask Subclass for Invoking a Web Service
      6. 7.7.6 Method convertJSONtoArrayList
    10. 7.8 Wrap-Up
    11. Self-Review Exercises
    12. Answers to Self-Review Exercises
    13. Exercises
      1. Web Services and Mashups
  14. 8 Twitter® Searches App
    1. Objectives
    2. Outline
    3. 8.1 Introduction
    4. 8.2 Test-Driving the App
      1. 8.2.1 Adding a Favorite Search
      2. 8.2.2 Viewing Twitter Search Results
      3. 8.2.3 Editing a Search
      4. 8.2.4 Sharing a Search
      5. 8.2.5 Deleting a Search
      6. 8.2.6 Scrolling Through Saved Searches
    5. 8.3 Technologies Overview
      1. 8.3.1 Storing Key–Value Data in a SharedPreferences File
      2. 8.3.2 Implicit Intents and Intent Choosers
      3. 8.3.3 RecyclerView
        1. RecyclerView vs. ListView
        2. RecyclerView Layout Managers
      4. 8.3.4 RecyclerView.Adapter and RecyclerView.ViewHolder
      5. 8.3.5 RecyclerView.ItemDecoration
      6. 8.3.6 Displaying a List of Options in an AlertDialog
    6. 8.4 Building the App’s GUI and Resource Files
      1. 8.4.1 Creating the Project
      2. 8.4.2 AndroidManifest.xml
      3. 8.4.3 Adding the RecyclerView Library
      4. 8.4.4 colors.xml
      5. 8.4.5 strings.xml
      6. 8.4.6 arrays.xml
      7. 8.4.7 dimens.xml
      8. 8.4.8 Adding the Save Button Icon
      9. 8.4.9 activity_main.xml
      10. 8.4.10 content_main.xml
        1. Step 1: Adding the queryTextInputLayout and Its Nested EditText
        2. Step 2: Adding the tagTextInputLayout and Its Nested EditText
        3. Step 3: Adding the LinearLayout
        4. Step 3: Adding the LinearLayout’s Nested TextView and RecyclerView
      11. 8.4.11 RecyclerView Item’s Layout: list_item.xml
        1. Other Predefined Android Resources
    7. 8.5 MainActivity Class
      1. 8.5.1 package and import Statements
      2. 8.5.2 MainActivity Fields
      3. 8.5.3 Overriden Activity Method onCreate
        1. Getting a SharedPreferences Object
        2. Getting the Keys Stored in the SharedPreferences Object
        3. Sorting the ArrayList of Tags
        4. Configuring the RecyclerView
        5. Registering a Listener for the FloatingActionButton
      4. 8.5.4 TextWatcher Event Handler and Method updateSaveFAB
      5. 8.5.5 saveButton’s OnClickListener
      6. 8.5.6 addTaggedSearch Method
        1. Editing a SharedPreferences Object’s Contents
        2. Notifying the RecyclerView.Adapter That Its Data Has Changed
      7. 8.5.7 Anonymous Inner Class That Implements View.OnClickListener to Display Search Results
        1. Getting String Resources
        2. Getting Strings from a SharedPreferences Object
        3. Creating an Intent to Launch the Device’s Web Browser
        4. Starting an Activity for an Intent
      8. 8.5.8 Anonymous Inner Class That Implements View.OnLongClickListener to Share, Edit or Delete a Search
        1. final Local Variables for Use in Anonymous Inner Classes
        2. AlertDialog That Displays a List of Items
        3. Event Handler for the Dialog’s List of Items
        4. Configuring the Negative Button and Displaying the Dialog
      9. 8.5.9 shareSearch Method
        1. Adding Extras to an Intent
        2. Displaying an Intent Chooser
      10. 8.5.10 deleteSearch Method
    8. 8.6 SearchesAdapter Subclass of RecyclerView.Adapter
      1. 8.6.1 package Statement, import statements, Instance Variables and Constructor
      2. 8.6.2 Nested ViewHolder Subclass of RecyclerView.ViewHolder
      3. 8.6.3 Overridden RecyclerView.Adapter Methods
        1. Overriding the onCreateViewHolder Method
        2. Overriding the onBindViewHolder Method
        3. Overriding the getItemCount Method
    9. 8.7 ItemDivider Subclass of RecyclerView.ItemDecoration
    10. 8.8 A Note on Fabric: Twitter’s New Mobile Development Platform
    11. 8.9 Wrap-Up
    12. Self-Review Exercises
    13. Answers to Self-Review Exercises
    14. Exercises
      1. Project Exercises
      2. Advanced Project Exercises
  15. 9 Address Book App
    1. Objectives
    2. Outline
    3. 9.1 Introduction
    4. 9.2 Test-Driving the Address Book App
      1. 9.2.1 Adding a Contact
      2. 9.2.2 Viewing a Contact
      3. 9.2.3 Editing a Contact
      4. 9.2.4 Deleting a Contact
    5. 9.3 Technologies Overview
      1. 9.3.1 Displaying Fragments with FragmentTransactions
      2. 9.3.2 Communicating Data Between a Fragment and a Host Activity
      3. 9.3.3 Manipulating a SQLite Database
      4. 9.3.4 ContentProviders and ContentResolvers
        1. Uris
        2. ContentResolver
      5. 9.3.5 Loader and LoaderManager—Asynchronous Database Access
        1. Loaders
        2. LoaderManager and LoaderManager.LoaderCallbacks
      6. 9.3.6 Defining Styles and Applying Them to GUI Components
      7. 9.3.7 Specifying a TextView Background
    6. 9.4 Building the GUI and Resource Files
      1. 9.4.1 Creating the Project
      2. 9.4.2 Creating the App’s Classes
        1. Package com.deitel.addressbook
        2. Package com.deitel.addressbook.data
      3. 9.4.3 Add the App’s Icons
      4. 9.4.4 strings.xml
      5. 9.4.5 styles.xml
      6. 9.4.6 textview_border.xml
      7. 9.4.7 MainActivity’s Layout
        1. Phone Layout: content_main.xml
        2. Tablet Layout: content_main.xml for Large Devices
      8. 9.4.8 ContactsFragment’s Layout
      9. 9.4.9 DetailFragment’s Layout
        1. GridLayout Settings
        2. Left Column TextView Settings
        3. Right Column TextView Settings
      10. 9.4.10 AddEditFragment’s Layout
        1. ScrollView Settings
        2. LinearLayout Settings
        3. EditText Settings
      11. 9.4.11 DetailFragment’s Menu
    7. 9.5 Overview of This Chapter’s Classes
    8. 9.6 DatabaseDescription Class
      1. 9.6.1 static Fields
      2. 9.6.2 Nested Class Contact
    9. 9.7 AddressBookDatabaseHelper Class
    10. 9.8 AddressBookContentProvider Class
      1. 9.8.1 AddressBookContentProvider Fields
      2. 9.8.2 Overridden Methods onCreate and getType
      3. 9.8.3 Overridden Method query
        1. SQLiteQueryBuilder
        2. Using the UriMatcher to Determine the Operation to Perform
        3. Querying the Database
        4. Registering the Cursor to Watch for Content Changes
      4. 9.8.4 Overridden Method insert
      5. 9.8.5 Overridden Method update
      6. 9.8.6 Overridden Method delete
    11. 9.9 MainActivity Class
      1. 9.9.1 Superclass, Implemented Interfaces and Fields
      2. 9.9.2 Overridden Method onCreate
      3. 9.9.3 ContactsFragment.ContactsFragmentListener Methods
      4. 9.9.4 Method displayContact
      5. 9.9.5 Method displayAddEditFragment
      6. 9.9.6 DetailFragment.DetailFragmentListener Methods
      7. 9.9.7 AddEditFragment.AddEditFragmentListener Method
    12. 9.10 ContactsFragment Class
      1. 9.10.1 Superclass and Implemented Interface
      2. 9.10.2 ContactsFragmentListener
      3. 9.10.3 Fields
      4. 9.10.4 Overridden Fragment Method onCreateView
      5. 9.10.5 Overridden Fragment Methods onAttach and onDetach
      6. 9.10.6 Overridden Fragment Method onActivityCreated
      7. 9.10.7 Method updateContactList
      8. 9.10.8 LoaderManager.LoaderCallbacks<Cursor> Methods
        1. Method onCreateLoader
        2. Method onLoadFinished
        3. Method onLoaderReset
    13. 9.11 ContactsAdapter Class
    14. 9.12 AddEditFragment Class
      1. 9.12.1 Superclass and Implemented Interface
      2. 9.12.2 AddEditFragmentListener
      3. 9.12.3 Fields
      4. 9.12.4 Overridden Fragment Methods onAttach, onDetach and onCreateView
      5. 9.12.5 TextWatcher nameChangedListener and Method updateSaveButtonFAB
      6. 9.12.6 View.OnClickListener saveContactButtonClicked and Method saveContact
      7. 9.12.7 LoaderManager.LoaderCallbacks<Cursor> Methods
    15. 9.13 DetailFragment Class
      1. 9.13.1 Superclass and Implemented Interface
      2. 9.13.2 DetailFragmentListener
      3. 9.13.3 Fields
      4. 9.13.4 Overridden Methods onAttach, onDetach and onCreateView
      5. 9.13.5 Overridden Methods onCreateOptionsMenu and onOptionsItemSelected
      6. 9.13.6 Method deleteContact and DialogFragment confirmDelete
      7. 9.13.7 LoaderManager.LoaderCallback<Cursor> Methods
    16. 9.14 Wrap-Up
    17. Self-Review Exercises
    18. Answers to Self-Review Exercises
    19. Exercises
  16. 10 Google Play and App Business Issues
    1. Objectives
    2. Outline
    3. 10.1 Introduction
    4. 10.2 Preparing Your Apps for Publication
      1. 10.2.1 Testing Your App
      2. 10.2.2 End User License Agreement
      3. 10.2.3 Icons and Labels
      4. 10.2.4 Versioning Your App
      5. 10.2.5 Licensing to Control Access to Paid Apps
      6. 10.2.6 Obfuscating Your Code
      7. 10.2.7 Getting a Private Key for Digitally Signing Your App
      8. 10.2.8 Featured Image and Screenshots
        1. Featured Image
        2. Screenshots and Using the Android Device Manager’s Screen Capture Tool
      9. 10.2.9 Promotional App Video
    5. 10.3 Pricing Your App: Free or Fee
      1. 10.3.1 Paid Apps
      2. 10.3.2 Free Apps
    6. 10.4 Monetizing Apps with In-App Advertising
    7. 10.5 Monetizing Apps: Using In-App Billing to Sell Virtual Goods
    8. 10.6 Registering at Google Play
    9. 10.7 Setting Up a Google Payments Merchant Account
    10. 10.8 Uploading Your Apps to Google Play
    11. 10.9 Launching Play Store from Within Your App
    12. 10.10 Managing Your Apps in Google Play
    13. 10.11 Other Android App Marketplaces
    14. 10.12 Other Mobile App Platforms and Porting Your Apps
    15. 10.13 Marketing Your Apps
    16. 10.14 Wrap-Up
      1. Staying in Contact with the Authors and Deitel & Associates, Inc
    17. Self-Review Exercises
    18. Answers to Self-Review Exercises
    19. Exercises
  17. A Introduction to Java Applications
    1. Objectives
    2. Outline
    3. A.1 Introduction
    4. A.2 Your First Program in Java: Printing a Line of Text
    5. A.3 Modifying Your First Java Program
    6. A.4 Displaying Text with printf
    7. A.5 Another Application: Adding Integers
    8. A.6 Memory Concepts
    9. A.7 Arithmetic
    10. A.8 Decision Making: Equality and Relational Operators
    11. A.9 Wrap-Up
    12. Self-Review Exercises
    13. Answers to Self-Review Exercises
    14. Exercises
  18. B Introduction to Classes, Objects, Methods and Strings
    1. Objectives
    2. Outline
    3. B.1 Introduction
    4. B.2 Declaring a Class with a Method and Instantiating an Object of a Class
    5. B.3 Declaring a Method with a Parameter
    6. B.4 Instance Variables, set Methods and get Methods
    7. B.5 Primitive Types vs. Reference Types
    8. B.6 Initializing Objects with Constructors
    9. B.7 Floating-Point Numbers and Type double
    10. B.8 Wrap-Up
    11. Self-Review Exercises
    12. Answers to Self-Review Exercises
    13. Exercises
  19. C Control Statements
    1. Objectives
    2. Outline
    3. C.1 Introduction
    4. C.2 Algorithms
    5. C.3 Pseudocode
    6. C.4 Control Structures
    7. C.5 if Single-Selection Statement
    8. C.6 if…else Double-Selection Statement
    9. C.7 while Repetition Statement
    10. C.8 Case Study: Counter-Controlled Repetition
    11. C.9 Case Study: Sentinel-Controlled Repetition
    12. C.10 Case Study: Nested Control Statements
    13. C.11 Compound Assignment Operators
    14. C.12 Increment and Decrement Operators
    15. C.13 Primitive Types
    16. C.14 Essentials of Counter-Controlled Repetition
    17. C.15 for Repetition Statement
    18. C.16 Examples Using the for Statement
    19. C.17 do…while Repetition Statement
    20. C.18 switch Multiple-Selection Statement
    21. C.19 break and continue Statements
    22. C.20 Logical Operators
    23. C.21 Wrap-Up
    24. Self-Review Exercises (Sections C.1–C.13)
    25. Self-Review Exercises (Sections C.14–C.20)
    26. Answers to Self-Review Exercises (Sections C.1–C.13)
    27. Answers to Self-Review Exercises (Sections C.14–C.20)
    28. Exercises (Sections C.1–C.13)
    29. Exercises (Sections C.14–C.20)
  20. D Methods: A Deeper Look
    1. Objectives
    2. Outline
    3. D.1 Introduction
    4. D.2 Program Modules in Java
    5. D.3 static Methods, static Fields and Class Math
    6. D.4 Declaring Methods with Multiple Parameters
    7. D.5 Notes on Declaring and Using Methods
    8. D.6 Method-Call Stack and Activation Records
    9. D.7 Argument Promotion and Casting
    10. D.8 Java API Packages
    11. D.9 Introduction to Random-Number Generation
      1. D.9.1 Scaling and Shifting of Random Numbers
        1. Generalizing the Random Number Calculations
      2. D.9.2 Random-Number Repeatability for Testing and Debugging
    12. D.10 Case Study: A Game of Chance; Introducing Enumerations
    13. D.11 Scope of Declarations
    14. D.12 Method Overloading
    15. D.13 Wrap-Up
    16. Self-Review Exercises
    17. Answers to Self-Review Exercises
    18. Exercises
  21. E Arrays and ArrayLists
    1. Objectives
    2. Outline
    3. E.1 Introduction
    4. E.2 Arrays
    5. E.3 Declaring and Creating Arrays
    6. E.4 Examples Using Arrays
    7. E.5 Case Study: Card Shuffling and Dealing Simulation
    8. E.6 Enhanced for Statement
    9. E.7 Passing Arrays to Methods
    10. E.8 Case Study: Class GradeBook Using an Array to Store Grades
    11. E.9 Multidimensional Arrays
    12. E.10 Case Study: Class GradeBook Using a Two-Dimensional Array
    13. E.11 Class Arrays
    14. E.12 Introduction to Collections and Class ArrayList
    15. E.13 Wrap-Up
    16. Self-Review Exercises
    17. Answers to Self-Review Exercises
    18. Exercises
  22. F Classes and Objects: A Deeper Look
    1. Objectives
    2. Outline
    3. F.1 Introduction
    4. F.2 Time Class Case Study
    5. F.3 Controlling Access to Members
    6. F.4 Referring to the Current Object’s Members with the this Reference
    7. F.5 Time Class Case Study: Overloaded Constructors
      1. Class Time2 with Overloaded Constructors
    8. F.6 Default and No-Argument Constructors
    9. F.7 Composition
    10. F.8 Enumerations
    11. F.9 Garbage Collection
    12. F.10 static Class Members
    13. F.11 final Instance Variables
    14. F.12 Packages
    15. F.13 Package Access
    16. F.14 Wrap-Up
    17. Self-Review Exercise
    18. Answers to Self-Review Exercise
    19. Exercises
  23. G Object-Oriented Programming: Inheritance and Polymorphism
    1. Objectives
    2. Outline
    3. G.1 Introduction to Inheritance
    4. G.2 Superclasses and Subclasses
    5. G.3 protected Members
    6. G.4 Relationship between Superclasses and Subclasses
      1. G.4.1 Creating and Using a CommissionEmployee Class
        1. Overview of Class CommissionEmployee’s Methods and Instance Variables
        2. Class CommissionEmployee’s Constructor
        3. Class CommissionEmployee’s earnings Method
        4. Class CommissionEmployee’s toString Method and the @Override Annotation
        5. Class CommissionEmployeeTest
      2. G.4.2 Creating and Using a BasePlusCommissionEmployee Class
        1. Testing Class BasePlusCommissionEmployee
        2. Notes on Class BasePlusCommissionEmployee
      3. G.4.3 Creating a CommissionEmployee–BasePlusCommissionEmployee Inheritance Hierarchy
        1. A Subclass’s Constructor Must Call Its Superclass’s Constructor
        2. BasePlusCommissionEmployee Method Earnings
      4. G.4.4 CommissionEmployee–BasePlusCommissionEmployee Inheritance Hierarchy Using protected Instance Variables
        1. Class BasePlusCommissionEmployee
        2. Testing Class BasePlusCommissionEmployee
        3. Notes on Using protected Instance Variables
      5. G.4.5 CommissionEmployee–BasePlusCommissionEmployee Inheritance Hierarchy Using private Instance Variables
        1. Class BasePlusCommissionEmployee’s earnings Method
        2. Class BasePlusCommissionEmployee’s toString Method
        3. Testing Class BasePlusCommissionEmployee
    7. G.5 Class Object
    8. G.6 Introduction to Polymorphism
    9. G.7 Polymorphism: An Example
    10. G.8 Demonstrating Polymorphic Behavior
    11. G.9 Abstract Classes and Methods
    12. G.10 Case Study: Payroll System Using Polymorphism
      1. G.10.1 Abstract Superclass Employee
      2. G.10.2 Concrete Subclass SalariedEmployee
      3. G.10.3 Concrete Subclass HourlyEmployee
      4. G.10.4 Concrete Subclass CommissionEmployee
      5. G.10.5 Indirect Concrete Subclass BasePlusCommissionEmployee
      6. G.10.6 Polymorphic Processing, Operator instanceof and Downcasting
        1. Creating the Array of Employees
        2. Polymorphically Processing Employees
        3. Performing Type-Specific Operations on BasePlusCommissionEmployees
        4. Calling earnings Polymorphically
        5. Using Reflection to Get Each Employee’s Class Name
        6. Avoiding Compilation Errors with Downcasting
      7. G.10.7 Summary of the Allowed Assignments Between Superclass and Subclass Variables
    13. G.11 final Methods and Classes
    14. G.12 Case Study: Creating and Using Interfaces
      1. G.12.1 Developing a Payable Hierarchy
      2. G.12.2 Interface Payable
      3. G.12.3 Class Invoice
      4. G.12.4 Modifying Class Employee to Implement Interface Payable
      5. G.12.5 Modifying Class SalariedEmployee for Use in the Payable Hierarchy
      6. G.12.6 Using Interface Payable to Process Invoices and Employees Polymorphically
    15. G.13 Common Interfaces of the Java API
    16. G.14 Wrap-Up
    17. Self-Review Exercises (Sections G.1G.5)
    18. Self-Review Exercises (Sections G.6G.13)
    19. Answers to Self-Review Exercises (Sections G.1G.5)
    20. Answers to Self-Review Exercises (Sections G.6G.13)
    21. Exercises (Sections G.1G.5)
    22. Exercises (Sections G.6G.13)
  24. H Exception Handling: A Deeper Look
    1. Objectives
    2. Outline
    3. H.1 Introduction
    4. H.2 Example: Divide by Zero without Exception Handling
    5. H.3 Example: Handling ArithmeticExceptions and InputMismatchExceptions
    6. H.4 When to Use Exception Handling
    7. H.5 Java Exception Hierarchy
    8. H.6 finally Block
    9. H.7 Stack Unwinding and Obtaining Information from an Exception Object
    10. H.8 Wrap-Up
    11. Self-Review Exercises
    12. Answers to Self-Review Exercises
    13. Exercises
  25. I GUI Components and Event Handling
    1. Objectives
    2. Outline
    3. I.1 Introduction
    4. I.2 Nimbus Look-and-Feel
    5. I.3 Text Fields and an Introduction to Event Handling with Nested Classes
    6. I.4 Common GUI Event Types and Listener Interfaces
    7. I.5 How Event Handling Works
    8. I.6 JButton
    9. I.7 JComboBox; Using an Anonymous Inner Class for Event Handling
    10. I.8 Adapter Classes
    11. I.9 Wrap-Up
    12. Self-Review Exercises
    13. Answers to Self-Review Exercises
    14. Exercises
  26. J Other Java Topics
    1. Objectives
    2. Outline
    3. J.1 Introduction
    4. J.2 Collections Overview
    5. J.3 Type-Wrapper Classes for Primitive Types
    6. J.4 Interface Collection and Class Collections
    7. J.5 Lists
      1. J.5.1 ArrayList and Iterator
      2. J.5.2 LinkedList
        1. Method convertToUppercaseStrings
        2. Method removeItems
        3. Method printReversedList
      3. J.5.3 Views into Collections and Arrays Method asList
        1. Viewing Arrays as Lists and Converting Lists to Arrays
    8. J.6 Collections Methods
      1. J.6.1 Method sort
        1. Sorting in Ascending or Descending Order
        2. Sorting with a Comparator
      2. J.6.2 Method shuffle
    9. J.7 Interface Queue
    10. J.8 Sets
    11. J.9 Maps
    12. J.10 Introduction to Files and Streams
    13. J.11 Class File
    14. J.12 Introduction to Object Serialization
    15. J.13 Introduction to Multithreading
    16. J.14 Creating and Executing Threads with the Executor Framework
    17. J.15 Overview of Thread Synchronization
    18. J.16 Concurrent Collections Overview
    19. J.17 Multithreading with GUI
    20. J.18 Wrap-Up
    21. Self-Review Exercises
    22. Answers to Self-Review Exercises
    23. Exercises
  27. K Operator Precedence Chart
  28. L Primitive Types
  29. Index
    1. Symbols
    2. Numerics
    3. A
    4. B
    5. C
    6. D
    7. E
    8. F
    9. G
    10. H
    11. I
    12. J
    13. K
    14. L
    15. M
    16. N
    17. O
    18. P
    19. Q
    20. R
    21. S
    22. T
    23. U
    24. V
    25. W
    26. X
    27. Y
    28. Z

Product information

  • Title: Android How to Program, 3/e
  • Author(s): Paul J. Deitel, Harvey M. Deitel
  • Release date: February 2016
  • Publisher(s): Pearson
  • ISBN: 9780134444307