62.1 System requirements
50143. An Android Jetpack LiveData Tutorial
72.2 Downloading the Android Studio package
50243.1 LiveData - A Recap
82.3 Installing Android Studio
50343.2 Adding LiveData to the ViewModel
92.3.1 Installation on Windows
50443.3 Implementing the Observer
102.3.2 Installation on macOS
50543.4 Summary
112.3.3 Installation on Linux
50644. An Overview of Android Jetpack Data Binding
122.4 The Android Studio setup wizard
50744.1 An Overview of Data Binding
132.5 Installing additional Android SDK packages
50844.2 The Key Components of Data Binding
142.6 Setting up Command-line tools access
50944.2.1 The Project Build Configuration
152.6.1 Windows 11
51044.2.2 The Data Binding Layout File
162.6.2 Linux
51144.2.3 The Layout File Data Element
172.6.3 macOS
51244.2.4 The Binding Classes
182.7 Android Studio memory management
51344.2.5 Data Binding Variable Configuration
192.8 Updating Android Studio and the SDK
51444.2.6 Binding Expressions (One-Way)
202.9 Summary
51544.2.7 Binding Expressions (Two-Way)
213. Creating an Example Android App in Android Studio
51644.2.8 Event and Listener Bindings
223.1 About the Project
51744.3 Summary
233.2 Creating a New Android Project
51845. An Android Jetpack Data Binding Tutorial
243.3 Creating an Activity
51945.1 Removing the Redundant Code
253.4 Defining the Project and SDK Settings
52045.2 Enabling Data Binding
263.5 Modifying the Example Application
52145.3 Adding the Layout Element
273.6 Modifying the User Interface
52245.4 Adding the Data Element to Layout File
283.7 Reviewing the Layout and Resource Files
52345.5 Working with the Binding Class
293.8 Adding Interaction
52445.6 Assigning the ViewModel Instance to the Data Binding Variable
303.9 Summary
52545.7 Adding Binding Expressions
314. Creating an Android Virtual Device (AVD) in Android Studio
52645.8 Adding the Conversion Method
324.1 About Android Virtual Devices
52745.9 Adding a Listener Binding
334.2 Remote Devices
52845.10 Testing the App
344.3 Starting the Emulator
52945.11 Summary
354.4 Running the Application in the AVD
53046. An Android ViewModel Saved State Tutorial
364.5 Running on Multiple Devices
53146.1 Understanding ViewModel State Saving
374.6 Stopping a Running Application
53246.2 Implementing ViewModel State Saving
384.7 Supporting Dark Theme
53346.3 Saving and Restoring State
394.8 Running the Emulator in a Separate Window
53446.4 Adding Saved State Support to the ViewModelDemo Project
404.9 Removing the Device Frame
53546.5 Summary
414.10 Summary
53647. Working with Android Lifecycle-Aware Components
425. Using and Configuring the Android Studio AVD Emulator
53747.1 Lifecycle Awareness
435.1 The Emulator Environment
53847.2 Lifecycle Owners
445.2 Emulator Toolbar Options
53947.3 Lifecycle Observers
455.3 Working in Zoom Mode
54047.4 Lifecycle States and Events
465.4 Resizing the Emulator Window
54147.5 Summary
475.5 Extended Control Options
54248. An Android Jetpack Lifecycle Awareness Tutorial
485.5.1 Displays
54348.1 Creating the Example Lifecycle Project
495.5.2 Cellular
54448.2 Creating a Lifecycle Observer
505.5.3 Battery
54548.3 Adding the Observer
515.5.4 Camera
54648.4 Testing the Observer
525.5.5 Location
54748.5 Creating a Lifecycle Owner
535.5.6 Phone
54848.6 Testing the Custom Lifecycle Owner
545.5.7 Directional Pad
54948.7 Summary
555.5.8 Microphone
55049. An Overview of the Navigation Architecture Component
565.5.9 Fingerprint
55149.1 Understanding Navigation
575.5.10 Virtual Sensors
55249.2 Declaring a Navigation Host
585.5.11 Bug report
55349.3 The Navigation Graph
595.5.12 Snapshots
55449.4 Accessing the Navigation Controller
605.5.13 Record and Playback
55549.5 Triggering a Navigation Action
615.5.14 Google Play
55649.6 Passing Arguments
625.5.15 Settings
55749.7 Summary
635.5.16 Help
55850. An Android Jetpack Navigation Component Tutorial
645.6 Working with Snapshots
55950.1 Creating the NavigationDemo Project
655.7 Configuring Fingerprint Emulation
56050.2 Adding Navigation to the Build Configuration
665.8 The Emulator in Tool Window Mode
56150.3 Creating the Navigation Graph Resource File
675.9 Common Android Settings
56250.4 Declaring a Navigation Host
685.10 Creating a Resizable Emulator
56350.5 Adding Navigation Destinations
695.11 Summary
56450.6 Designing the Destination Fragment Layouts
706. A Tour of the Android Studio User Interface
56550.7 Adding an Action to the Navigation Graph
716.1 The Welcome Screen
56650.8 Implement the OnFragmentInteractionListener
726.2 The Menu Bar
56750.9 Adding View Binding Support to the Destination Fragments
736.3 The Main Window
56850.10 Triggering the Action
746.4 The Tool Windows
56950.11 Passing Data Using Safeargs
756.5 The Tool Window Menus
57050.12 Summary
766.6 Android Studio Keyboard Shortcuts
57151. Working with the Floating Action Button and Snackbar
776.7 Switcher and Recent Files Navigation
57251.1 The Material Design
786.8 Changing the Android Studio Theme
57351.2 The Design Library
796.9 Summary
57451.3 The Floating Action Button (FAB)
807. Testing Android Studio Apps on a Physical Android Device
57551.4 The Snackbar
817.1 An Overview of the Android Debug Bridge (ADB)
57651.5 Creating the Example Project
827.2 Enabling USB Debugging ADB on Android Devices
57751.6 Reviewing the Project
837.2.1 macOS ADB Configuration
57851.7 Removing Navigation Features
847.2.2 Windows ADB Configuration
57951.8 Changing the Floating Action Button
857.2.3 Linux ADB Configuration
58051.9 Adding an Action to the Snackbar
867.3 Resolving USB Connection Issues
58151.10 Summary
877.4 Enabling Wireless Debugging on Android Devices
58252. Creating a Tabbed Interface using the TabLayout Component
887.5 Testing the ADB Connection
58352.1 An Introduction to the ViewPager2
897.6 Device Mirroring
58452.2 An Overview of the TabLayout Component
907.7 Summary
58552.3 Creating the TabLayoutDemo Project
918. The Basics of the Android Studio Code Editor
58652.4 Creating the First Fragment
928.1 The Android Studio Editor
58752.5 Duplicating the Fragments
938.2 The Floating Code Toolbar
58852.6 Adding the TabLayout and ViewPager2
948.3 Splitting the Editor Window
58952.7 Performing the Initialization Tasks
958.4 Code Completion
59052.8 Testing the Application
968.5 Statement Completion
59152.9 Customizing the TabLayout
978.6 Parameter Information
59252.10 Summary
988.7 Parameter Name Hints
59353. Working with the RecyclerView and CardView Widgets
998.8 Code Generation
59453.1 An Overview of the RecyclerView
1008.9 Code Folding
59553.2 An Overview of the CardView
1018.10 Quick Documentation Lookup
59653.3 Summary
1028.11 Code Reformatting
59754. An Android RecyclerView and CardView Tutorial
1038.12 Live Templates
59854.1 Creating the CardDemo Project
1048.13 Summary
59954.2 Modifying the Basic Views Activity Project
1059. An Overview of the Android Architecture
60054.3 Designing the CardView Layout
1069.1 The Android Software Stack
60154.4 Adding the RecyclerView
1079.2 The Linux Kernel
60254.5 Adding the Image Files
1089.3 Hardware Abstraction Layer
60354.6 Creating the RecyclerView Adapter
1099.4 Android Runtime – ART
60454.7 Initializing the RecyclerView Component
1109.5 Android Libraries: 9.5.1 C/C++ Libraries
60554.8 Testing the Application
1119.6 Application Framework
60654.9 Responding to Card Selections
1129.7 Applications
60754.10 Summary
1139.8 Summary
60855. Working with the AppBar and Collapsing Toolbar Layouts
11410. The Anatomy of an Android App
60955.1 The Anatomy of an AppBar
11510.1 Android Activities
61055.2 The Example Project
11610.2 Android Fragments
61155.3 Coordinating the RecyclerView and Toolbar
11710.3 Android Intents
61255.4 Introducing the Collapsing Toolbar Layout
11810.4 Broadcast Intents
61355.5 Changing the Title and Scrim Color
11910.5 Broadcast Receivers
61455.6 Summary
12010.6 Android Services
61556. An Overview of Android Intents
12110.7 Content Providers
61656.1 An Overview of Intents
12210.8 The Application Manifest
61756.2 Explicit Intents
12310.9 Application Resources
61856.3 Returning Data from an Activity
12410.10 Application Context
61956.4 Implicit Intents
12510.11 Summary
62056.5 Using Intent Filters
12611. An Introduction to Kotlin
62156.6 Automatic Link Verification
12711.1 What is Kotlin?
62256.7 Manually Enabling Links
12811.2 Kotlin and Java
62356.8 Checking Intent Availability
12911.3 Converting from Java to Kotlin
62456.9 Summary
13011.4 Kotlin and Android Studio
62557. Android Explicit Intents – A Worked Example
13111.5 Experimenting with Kotlin
62657.1 Creating the Explicit Intent Example Application
13211.6 Semi-colons in Kotlin
62757.2 Designing the User Interface Layout for MainActivity
13311.7 Summary
62857.3 Creating the Second Activity Class
13412. Kotlin Data Types, Variables and Nullability
62957.4 Designing the User Interface Layout for SecondActivity
13512.1 Kotlin data types
63057.5 Reviewing the Application Manifest File
13612.1.1 Integer data types
63157.6 Creating the Intent
13712.1.2 Floating point data types
63257.7 Extracting Intent Data
13812.1.3 Boolean data type
63357.8 Launching SecondActivity as a Sub-Activity
13912.1.4 Character data type
63457.9 Returning Data from a Sub-Activity
14012.1.5 String data type
63557.10 Testing the Application
14112.1.6 Escape sequences
63657.11 Summary
14212.2 Mutable variables
63758. Android Implicit Intents – A Worked Example
14312.3 Immutable variables
63858.1 Creating the Android Studio Implicit Intent Example Project
14412.4 Declaring mutable and immutable variables
63958.2 Designing the User Interface
14512.5 Data types are objects
64058.3 Creating the Implicit Intent
14612.6 Type annotations and type inference
64158.4 Adding a Second Matching Activity
14712.7 Nullable type
64258.5 Adding the Web View to the UI
14812.8 The safe call operator
64358.6 Obtaining the Intent URL
14912.9 Not-null assertion
64458.7 Modifying the MyWebView Project Manifest File
15012.10 Nullable types and the let function
64558.8 Installing the MyWebView Package on a Device
15112.11 Late initialization (lateinit)
64658.9 Testing the Application
15212.12 The Elvis operator
64758.10 Manually Enabling the Link
15312.13 Type casting and type checking
64858.11 Automatic Link Verification
15412.14 Summary
64958.12 Summary
15513. Kotlin Operators and Expressions
65059. Android Broadcast Intents and Broadcast Receivers
15613.1 Expression syntax in Kotlin
65159.1 An Overview of Broadcast Intents
15713.2 The Basic assignment operator
65259.2 An Overview of Broadcast Receivers
15813.3 Kotlin arithmetic operators
65359.3 Obtaining Results from a Broadcast
15913.4 Augmented assignment operators
65459.4 Sticky Broadcast Intents
16013.5 Increment and decrement operators
65559.5 The Broadcast Intent Example
16113.6 Equality operators
65659.6 Creating the Example Application
16213.7 Boolean logical operators
65759.7 Creating and Sending the Broadcast Intent
16313.8 Range operator
65859.8 Creating the Broadcast Receiver
16413.9 Bitwise operators
65959.9 Registering the Broadcast Receiver
16513.9.1 Bitwise inversion
66059.10 Testing the Broadcast Example
16613.9.2 Bitwise AND
66159.11 Listening for System Broadcasts
16713.9.3 Bitwise OR
66259.12 Summary
16813.9.4 Bitwise XOR
66360. An Introduction to Kotlin Coroutines
16913.9.5 Bitwise left shift
66460.1 What are Coroutines?
17013.9.6 Bitwise right shift
66560.2 Threads vs. Coroutines
17113.10 Summary
66660.3 Coroutine Scope
17214. Kotlin Control Flow
66760.4 Suspend Functions
17314.1 Looping control flow
66860.5 Coroutine Dispatchers
17414.1.1 The Kotlin for-in Statement
66960.6 Coroutine Builders
17514.1.2 The while loop
67060.7 Jobs
17614.1.3 The do ... while loop
67160.8 Coroutines – Suspending and Resuming
17714.1.4 Breaking from Loops
67260.9 Returning Results from a Coroutine
17814.1.5 The continue statement
67360.10 Using withContext
17914.1.6 Break and continue labels
67460.11 Coroutine Channel Communication
18014.2 Conditional control flow
67560.12 Summary
18114.2.1 Using the if expressions
67661. An Android Kotlin Coroutines Tutorial
18214.2.2 Using if ... else … expressions
67761.1 Creating the Coroutine Example Application
18314.2.3 Using if ... else if ... Expressions
67861.2 Designing the User Interface
18414.2.4 Using the when statement
67961.3 Implementing the SeekBar
18514.3 Summary
68061.4 Adding the Suspend Function
18615. An Overview of Kotlin Functions and Lambdas
68161.5 Implementing the launchCoroutines Method
18715.1 What is a function?
68261.6 Testing the App
18815.2 How to declare a Kotlin function
68361.7 Summary
18915.3 Calling a Kotlin function
68462. An Overview of Android Services
19015.4 Single expression functions
68562.1 Intent Service
19115.5 Local functions
68662.2 Bound Service
19215.6 Handling return values
68762.3 The Anatomy of a Service
19315.7 Declaring default function parameters
68862.4 Controlling Destroyed Service Restart Options
19415.8 Variable number of function parameters
68962.5 Declaring a Service in the Manifest File
19515.9 Lambda expressions
69062.6 Starting a Service Running on System Startup
19615.10 Higher-order functions
69162.7 Summary
19715.11 Trailing lambdas
69263. Android Local Bound Services – A Worked Example
19815.12 Summary
69363.1 Understanding Bound Services
19916. The Basics of Object-Oriented Programming in Kotlin
69463.2 Bound Service Interaction Options
20016.1 What is an object?
69563.3 A Local Bound Service Example
20116.2 What is a class?
69663.4 Adding a Bound Service to the Project
20216.3 Declaring a Kotlin class
69763.5 Implementing the Binder
20316.4 Adding properties to a class
69863.6 Binding the Client to the Service
20416.5 Defining methods
69963.7 Completing the Example
20516.6 Declaring and initializing a class instance
70063.8 Testing the Application
20616.7 Primary and secondary constructors
70163.9 Summary
20716.8 Initializer blocks
70264. Android Remote Bound Services – A Worked Example
20816.9 Calling methods and accessing properties
70364.1 Client to Remote Service Communication
20916.10 Custom accessors
70464.2 Creating the Example Application
21016.11 Nested and inner classes
70564.3 Designing the User Interface
21116.12 Companion objects
70664.4 Implementing the Remote Bound Service
21216.13 Summary
70764.5 Configuring a Remote Service in the Manifest File
21317. An Introduction to Kotlin Inheritance and Subclassing
70864.6 Launching and Binding to the Remote Service
21417.1 Inheritance, classes, and subclasses
70964.7 Sending a Message to the Remote Service
21517.2 Subclassing syntax
71064.8 Summary
21617.3 A Kotlin inheritance example
71165. An Introduction to Kotlin Flow
21717.4 Extending the functionality of a subclass
71265.1 Understanding Flows
21817.5 Overriding inherited methods
71365.2 Creating the Sample Project
21917.6 Adding a custom secondary constructor
71465.3 Adding the Kotlin Lifecycle Library
22017.7 Using the SavingsAccount class
71565.4 Declaring a Flow
22117.8 Summary
71665.5 Emitting Flow Data
22218. An Overview of Android View Binding
71765.6 Collecting Flow Data
22318.1 Find View by Id
71865.7 Adding a Flow Buffer
22418.2 View Binding
71965.8 Transforming Data with Intermediaries
22518.3 Converting the AndroidSample project
72065.9 Terminal Flow Operators
22618.4 Enabling View Binding
72165.10 Flow Flattening
22718.5 Using View Binding
72265.11 Combining Multiple Flows
22818.6 Choosing an Option
72365.12 Hot and Cold Flows
22918.7 View Binding in the Book Examples
72465.13 StateFlow
23018.8 Migrating a Project to View Binding
72565.14 SharedFlow
23118.9 Using AI to Perform the Conversion
72665.15 Summary
23218.10 Summary
72766. An Android SharedFlow Tutorial
23319. Introducing Gemini AI in Android Studio
72866.1 About the Project
23419.1 Introducing Gemini AI
72966.2 Creating the SharedFlowDemo Project
23519.2 Enabling Gemini AI in Android Studio
73066.3 Adding the Lifecycle Libraries
23619.3 Gemini API Billing
73166.4 Designing the User Interface Layout
23719.4 Asking Gemini questions
73266.5 Adding the List Row Layout
23819.5 Inline code completion
73366.6 Adding the RecyclerView Adapter
23919.6 Transforming and documenting code
73466.7 Adding the ViewModel
24019.7 Smart Renaming
73566.8 Configuring the ViewModelProvider
24119.8 Gemini in Agent Mode
73666.9 Collecting the Flow Values
24219.9 Summary
73766.10 Testing the SharedFlowDemo App
24320. Understanding Android Application and Activity Lifecycles
73866.11 Handling Flows in the Background
24420.1 Android Applications and Resource Management
73966.12 Summary
24520.2 Android Process States
74067. An Overview of Android SQLite Databases
24620.2.1 Foreground Process
74167.1 Understanding database tables
24720.2.2 Visible Process
74267.2 Introducing database schema
24820.2.3 Service Process
74367.3 Columns and data types
24920.2.4 Background Process
74467.4 Database rows
25020.2.5 Empty Process
74567.5 Introducing primary keys
25120.3 Inter-Process Dependencies
74667.6 What is SQLite?
25220.4 The Activity Lifecycle
74767.7 Structured Query Language (SQL)
25320.5 The Activity Stack
74867.8 Trying SQLite on an Android Virtual Device (AVD)
25420.6 Activity States
74967.9 The Android Room persistence library
25520.7 Configuration Changes
75067.10 Summary
25620.8 Handling State Change
75168. An Android SQLite Database Tutorial
25720.9 Summary
75268.1 About the Database Example
25821. Handling Android Activity State Changes
75368.2 Creating the SQLDemo Project
25921.1 New vs. Old Lifecycle Techniques
75468.3 Designing the User interface
26021.2 The Activity and Fragment Classes
75568.4 Creating the Data Model
26121.3 Dynamic State vs. Persistent State
75668.5 Implementing the Data Handler
26221.4 The Android Lifecycle Methods
75768.6 The Add Handler Method
26321.5 Lifetimes
75868.7 The Query Handler Method
26421.6 Foldable Devices and Multi-Resume
75968.8 The Delete Handler Method
26521.7 Disabling Configuration Change Restarts
76068.9 Implementing the Activity Event Methods
26621.8 Lifecycle Method Limitations
76168.10 Testing the Application
26721.9 Summary
76268.11 Summary
26822. Android Activity State Changes by Example
76369. Understanding Android Content Providers
26922.1 Creating the State Change Example Project
76469.1 What is a Content Provider?
27022.2 Designing the User Interface
76569.2 The Content Provider
27122.3 Overriding the Activity Lifecycle Methods
76669.2.1 onCreate()
27222.4 Filtering the Logcat Panel
76769.2.2 query()
27322.5 Running the Application
76869.2.3 insert()
27422.6 Experimenting with the Activity
76969.2.4 update()
27522.7 Summary
77069.2.5 delete()
27623. Saving and Restoring the State of an Android Activity
77169.2.6 getType()
27723.1 Saving Dynamic State
77269.3 The Content URI
27823.2 Default Saving of User Interface State
77369.4 The Content Resolver
27923.3 The Bundle Class
77469.5 The <provider> Manifest Element
28023.4 Saving the State
77569.6 Summary
28123.5 Restoring the State
77670. An Android Content Provider Tutorial
28223.6 Testing the Application
77770.1 Copying the SQLDemo Project
28323.7 Summary
77870.2 Adding the Content Provider Package
28424. Understanding Android Views, View Groups and Layouts
77970.3 Creating the Content Provider Class
28524.1 Designing for Different Android Devices
78070.4 Constructing the Authority and Content URI
28624.2 Views and View Groups
78170.5 Implementing URI Matching in the Content Provider
28724.3 Android Layout Managers
78270.6 Implementing the Content Provider onCreate() Method
28824.4 The View Hierarchy
78370.7 Implementing the Content Provider insert() Method
28924.5 Creating User Interfaces
78470.8 Implementing the Content Provider query() Method
29024.6 Summary
78570.9 Implementing the Content Provider update() Method
29125. A Guide to the Android Studio Layout Editor Tool
78670.10 Implementing the Content Provider delete() Method
29225.1 Basic vs. Empty Views Activity Templates
78770.11 Declaring the Content Provider in the Manifest File
29325.2 The Android Studio Layout Editor
78870.12 Modifying the Database Handler
29425.3 Design Mode
78970.13 Summary
29525.4 The Palette
79071. An Android Content Provider Client Tutorial
29625.5 Design Mode and Layout Views
79171.1 Creating the SQLDemoClient Project
29725.6 Night Mode
79271.2 Designing the User interface
29825.7 Code Mode
79371.3 Accessing the Content Provider
29925.8 Split Mode
79471.4 Adding the Query Permission
30025.9 Setting Attributes
79571.5 Testing the Project
30125.10 Transforms
79671.6 Summary
30225.11 Tools Visibility Toggles
79772. The Android Room Persistence Library
30325.12 Converting Views
79872.1 Revisiting Modern App Architecture
30425.13 Displaying Sample Data
79972.2 Key Elements of Room Database Persistence
30525.14 Creating a Custom Device Definition
80072.2.1 Repository
30625.15 Changing the Current Device
80172.2.2 Room Database
30725.16 Layout Validation
80272.2.3 Data Access Object (DAO)
30825.17 Summary
80372.2.4 Entities
30926. A Guide to the Android ConstraintLayout
80472.2.5 SQLite Database
31026.1 How ConstraintLayout Works
80572.3 Understanding Entities
31126.1.1 Constraints
80672.4 Data Access Objects
31226.1.2 Margins
80772.5 The Room Database
31326.1.3 Opposing Constraints
80872.6 The Repository
31426.1.4 Constraint Bias
80972.7 In-Memory Databases
31526.1.5 Chains
81072.8 Database Inspector
31626.1.6 Chain Styles
81172.9 Summary
31726.2 Baseline Alignment
81273. An Android TableLayout and TableRow Tutorial
31826.3 Configuring Widget Dimensions
81373.1 The TableLayout and TableRow Layout Views
31926.4 Guideline Helper
81473.2 Creating the Room Database Project
32026.5 Group Helper
81573.3 Converting to a LinearLayout
32126.6 Barrier Helper
81673.4 Adding the TableLayout to the User Interface
32226.7 Flow Helper
81773.5 Configuring the TableRows
32326.8 Ratios
81873.6 Adding the Button Bar to the Layout
32426.9 ConstraintLayout Advantages
81973.7 Adding the RecyclerView
32526.10 ConstraintLayout Availability
82073.8 Adjusting the Layout Margins
32626.11 Summary
82173.9 Summary
32727. A Guide to Using ConstraintLayout in Android Studio
82274. An Android Room Database and Repository Tutorial
32827.1 Design and Layout Views
82374.1 About the RoomDemo Project
32927.2 Autoconnect Mode
82474.2 Modifying the Build Configuration
33027.3 Inference Mode
82574.3 Building the Entity
33127.4 Manipulating Constraints Manually
82674.4 Creating the Data Access Object
33227.5 Adding Constraints in the Inspector
82774.5 Adding the Room Database
33327.6 Viewing Constraints in the Attributes Window
82874.6 Adding the Repository
33427.7 Deleting Constraints
82974.7 Adding the ViewModel
33527.8 Adjusting Constraint Bias
83074.8 Creating the Product Item Layout
33627.9 Understanding ConstraintLayout Margins
83174.9 Adding the RecyclerView Adapter
33727.10 The Importance of Opposing Constraints and Bias
83274.10 Preparing the Main Activity
33827.11 Configuring Widget Dimensions
83374.11 Adding the Button Listeners
33927.12 Design Time Tools Positioning
83474.12 Adding LiveData Observers
34027.13 Adding Guidelines
83574.13 Initializing the RecyclerView
34127.14 Adding Barriers
83674.14 Testing the RoomDemo App
34227.15 Adding a Group
83774.15 Using the Database Inspector
34327.16 Working with the Flow Helper
83874.16 Summary
34427.17 Widget Group Alignment and Distribution
83975. Making Runtime Permission Requests in Android
34527.18 Converting other Layouts to ConstraintLayout
84075.1 Understanding Normal and Dangerous Permissions
34627.19 Summary
84175.2 Creating the Permissions Example Project
34728. Working with ConstraintLayout Chains and Ratios in Android Studio
84275.3 Checking for a Permission
34828.1 Creating a Chain
84375.4 Requesting Permission at Runtime
34928.2 Changing the Chain Style
84475.5 Providing a Rationale for the Permission Request
35028.3 Spread Inside Chain Style
84575.6 Testing the Permissions App
35128.4 Packed Chain Style
84675.7 Summary
35228.5 Packed Chain Style with Bias
84776. An Android Notifications Tutorial
35328.6 Weighted Chain
84876.1 An Overview of Notifications
35428.7 Working with Ratios
84976.2 Creating the NotifyDemo Project
35528.8 Summary
85076.3 Designing the User Interface
35629. An Android Studio Layout Editor ConstraintLayout Tutorial
85176.4 Creating the Second Activity
35729.1 An Android Studio Layout Editor Tool Example
85276.5 Creating a Notification Channel
35829.2 Preparing the Layout Editor Environment
85376.6 Requesting Notification Permission
35929.3 Adding the Widgets to the User Interface
85476.7 Creating and Issuing a Notification
36029.4 Adding the Constraints
85576.8 Launching an Activity from a Notification
36129.5 Testing the Layout
85676.9 Adding Actions to a Notification
36229.6 Using the Layout Inspector
85776.10 Bundled Notifications
36329.7 Summary
85876.11 Summary
36430. Manual XML Layout Design in Android Studio
85977. An Android Direct Reply Notification Tutorial
36530.1 Manually Creating an XML Layout
86077.1 Creating the DirectReply Project
36630.2 Manual XML vs. Visual Layout Design
86177.2 Designing the User Interface
36730.3 Summary
86277.3 Requesting Notification Permission
36831. Managing Constraints using Constraint Sets
86377.4 Creating the Notification Channel
36931.1 Kotlin Code vs. XML Layout Files
86477.5 Building the RemoteInput Object
37031.2 Creating Views
86577.6 Creating the PendingIntent
37131.3 View Attributes
86677.7 Creating the Reply Action
37231.4 Constraint Sets
86777.8 Receiving Direct Reply Input
37331.4.1 Establishing Connections
86877.9 Updating the Notification
37431.4.2 Applying Constraints to a Layout
86977.10 Summary
37531.4.3 Parent Constraint Connections
87078. An Android Biometric Authentication Tutorial
37631.4.4 Sizing Constraints
87178.1 An Overview of Biometric Authentication
37731.4.5 Constraint Bias
87278.2 Creating the Biometric Authentication Project
37831.4.6 Alignment Constraints
87378.3 Configuring Device Fingerprint Authentication
37931.4.7 Copying and Applying Constraint Sets
87478.4 Adding the Biometric Permission to the Manifest File
38031.4.8 ConstraintLayout Chains
87578.5 Designing the User Interface
38131.4.9 Guidelines
87678.6 Adding a Toast Convenience Method
38231.4.10 Removing Constraints
87778.7 Checking the Security Settings
38331.4.11 Scaling
87878.8 Configuring the Authentication Callbacks
38431.4.12 Rotation
87978.9 Adding the CancellationSignal
38531.5 Summary
88078.10 Starting the Biometric Prompt
38632. An Android ConstraintSet Tutorial
88178.11 Testing the Project
38732.1 Creating the Example Project in Android Studio
88278.12 Summary
38832.2 Adding Views to an Activity
88379. Creating, Testing, and Uploading an Android App Bundle
38932.3 Setting View Attributes
88479.1 The Release Preparation Process
39032.4 Creating View IDs
88579.2 Android App Bundles
39132.5 Configuring the Constraint Set
88679.3 Register for a Google Play Developer Console Account
39232.6 Adding the EditText View
88779.4 Configuring the App in the Console
39332.7 Converting Density Independent Pixels (dp) to Pixels (px)
88879.5 Creating a Keystore File
39432.8 Summary
88979.6 Creating the Android App Bundle
39533. A Guide to Using Apply Changes in Android Studio
89079.7 Generating Test APK Files
39633.1 Introducing Apply Changes
89179.8 Uploading the App Bundle to the Google Play Developer Console
39733.2 Understanding Apply Changes Options
89279.9 Exploring the App Bundle
39833.3 Using Apply Changes
89379.10 Managing Testers
39933.4 Configuring Apply Changes Fallback Settings
89479.11 Uploading New App Bundle Revisions
40033.5 An Apply Changes Tutorial
89579.12 Analyzing the App Bundle File
40133.6 Using Apply Code Changes
89679.13 Summary
40233.7 Using Apply Changes and Restart Activity
89780. An Overview of Android In-App Billing
40333.8 Using Run App
89880.1 Preparing a Project for In-App Purchasing
40433.9 Summary
89980.2 Creating In-App Products and Subscriptions
40534. A Guide to Gradle Version Catalogs
90080.3 Billing Client Initialization
40634.1 Library and Plugin Dependencies
90180.4 Connecting to the Google Play Billing Library
40734.2 Project Gradle Build File
90280.5 Querying Available Products
40834.3 Module Gradle Build Files
90380.6 Starting the Purchase Process
40934.4 Version Catalog File
90480.7 Completing the Purchase
41034.5 Adding Dependencies
90580.8 Querying Previous Purchases
41134.6 Library Updates
90680.9 Summary
41234.7 Summary
90781. An Android In-App Purchasing Tutorial
41335. An Overview and Example of Android Event Handling
90881.1 About the In-App Purchasing Example Project
41435.1 Understanding Android Events
90981.2 Creating the InAppPurchase Project
41535.2 Using the android:onClick Resource
91081.3 Adding Libraries to the Project
41635.3 Event Listeners and Callback Methods
91181.4 Designing the User Interface
41735.4 An Event Handling Example
91281.5 Adding the App to the Google Play Store
41835.5 Designing the User Interface
91381.6 Creating an In-App product
41935.6 The Event Listener and Callback Method
91481.7 Enabling license testers
42035.7 Consuming Events
91581.8 Initializing the Billing Client
42135.8 Summary
91681.9 Querying the Product
42236. Android Touch and Multi-touch Event Handling
91781.10 Launching the Purchase Flow
42336.1 Intercepting Touch Events
91881.11 Handling Purchase Updates
42436.2 The MotionEvent Object
91981.12 Consuming the Product
42536.3 Understanding Touch Actions
92081.13 Restoring a Previous Purchase
42636.4 Handling Multiple Touches
92181.14 Testing the app
42736.5 An Example Multi-Touch Application
92281.15 Troubleshooting
42836.6 Designing the Activity User Interface
92381.16 Summary
42936.7 Implementing the Touch Event Listener
92482. Integrating Gemini AI into Android Apps
43036.8 Running the Example Application
92582.1 Gemini models
43136.9 Summary
92682.2 Firebase AI Logic and Gemini API providers
43237. Detecting Common Gestures Using the Android Gesture Detector Class
92782.3 Initializing AI models
43337.1 Implementing Common Gesture Detection
92882.4 Multi-modal content
43437.2 Creating an Example Gesture Detection Project
92982.5 Generating content
43537.3 Implementing the Listener Class
93082.6 Starting a chat session
43637.4 Creating the GestureDetector Instance
93182.7 Image Generation
43737.5 Implementing the onTouchEvent() Method
93282.8 Summary
43837.6 Testing the Application
93383. Preparing the Gemini Firebase AI Logic Project
43937.7 Summary
93483.1 Opening the GeminiDemo starter project
44038. Implementing Custom Gesture and Pinch Recognition on Android
93583.2 Creating a Google Cloud account
44138.1 The Android Gesture Builder Application
93683.3 Generating the Gemini API key
44238.2 The GestureOverlayView Class
93783.4 Adding the Google Cloud project to Firebase
44338.3 Detecting Gestures
93883.5 Registering the app with Firebase
44438.4 Identifying Specific Gestures
93983.6 Enabling the Gemini API provider
44538.5 Installing and Running the Gesture Builder Application
94083.7 Adding the JSON services file
44638.6 Creating a Gestures File
94183.8 Adding libraries
44738.7 Creating the Example Project
94283.9 Initializing the generative model
44838.8 Extracting the Gestures File from the SD Card
94383.10 Summary
44938.9 Adding the Gestures File to the Project
94484. A Gemini AI Tutorial
45038.10 Designing the User Interface
94584.1 Opening the GeminiDemo project
45138.11 Loading the Gestures File
94684.2 Getting started
45238.12 Registering the Event Listener
94784.3 Calling the Gemini API
45338.13 Implementing the onGesturePerformed Method
94884.4 Testing the app
45438.14 Testing the Application
94984.5 Migrating to chat
45538.15 Configuring the GestureOverlayView
95084.6 Summary
45638.16 Intercepting Gestures
95185. Using Gemini AI for Video Analysis
45738.17 Detecting Pinch Gestures
95285.1 Opening the GeminiDemo project
45838.18 A Pinch Gesture Example Project
95385.2 Updating the view model
45938.19 Summary
95485.3 Testing the app
46039. An Introduction to Android Fragments
95585.4 Summary
46139.1 What is a Fragment?
95686. Gemini AI Image Generation
46239.2 Creating a Fragment
95786.1 Opening the GeminiDemo project
46339.3 Adding a Fragment to an Activity using the Layout XML File
95886.2 Initializing the Imagen model
46439.4 Adding and Managing Fragments in Code
95986.3 Sending the image generation request
46539.5 Handling Fragment Events
96086.4 Upgrading to the Firebase Blaze plan
46639.6 Implementing Fragment Communication
96186.5 Testing image generation
46739.7 Summary
96286.6 Summary
46840. Using Fragments in Android Studio - An Example
96387. Working with Material Design 3 Theming
46940.1 About the Example Fragment Application
96487.1 Material Design 2 vs. Material Design 3
47040.2 Creating the Example Project
96587.2 Understanding Material Design Theming
47140.3 Creating the First Fragment Layout
96687.3 Material Design 3 Theming
47240.4 Migrating a Fragment to View Binding
96787.4 Building a custom theme
47340.5 Adding the Second Fragment
96887.5 Summary
47440.6 Adding the Fragments to the Activity
96988. A Material Design 3 Theming and Dynamic Color Tutorial
47540.7 Making the Toolbar Fragment Talk to the Activity
97088.1 Creating the ThemeDemo Project
47640.8 Making the Activity Talk to the Text Fragment
97188.2 Designing the User Interface
47740.9 Testing the Application
97288.3 Building a new theme
47840.10 Summary
97388.4 Adding the Theme to the Project
47941. Modern Android App Architecture with Jetpack
97488.5 Enabling Dynamic Color Support
48041.1 What is Android Jetpack?
97588.6 Summary
48141.2 The “Old” Architecture
97689. An Overview of Gradle in Android Studio
48241.3 Modern Android Architecture
97789.1 An Overview of Gradle
48341.4 The ViewModel Component
97889.2 Gradle and Android Studio
48441.5 The LiveData Component
97989.2.1 Sensible Defaults
48541.6 ViewModel Saved State
98089.2.2 Dependencies
48641.7 LiveData and Data Binding
98189.2.3 Build Variants
48741.8 Android Lifecycles
98289.2.4 Manifest Entries
48841.9 Repository Modules
98389.2.5 APK Signing
48941.10 Summary
98489.2.6 ProGuard Support
49042. An Android ViewModel Tutorial
98589.3 The Property and Settings Gradle Build File
49142.1 About the Project
98689.4 The Top-level Gradle Build File
49242.2 Creating the ViewModel Example Project
98789.5 Module Level Gradle Build Files
49342.3 Removing Unwanted Project Elements
98889.6 Configuring Signing Settings in the Build File
49442.4 Designing the Fragment Layout
98989.7 Running Gradle Tasks from the Command Line
49542.5 Implementing the View Model
99089.8 Summary