62.1 System requirements
43739.3 Saving and Restoring State
72.2 Downloading the Android Studio package
43839.4 Adding Saved State Support to the ViewModelDemo Project
82.3 Installing Android Studio
43939.5 Summary
92.3.1 Installation on Windows
44040. Working with Android Lifecycle-Aware Components
102.3.2 Installation on macOS
44140.1 Lifecycle Awareness
112.3.3 Installation on Linux
44240.2 Lifecycle Owners
122.4 The Android Studio setup wizard
44340.3 Lifecycle Observers
132.5 Installing additional Android SDK packages
44440.4 Lifecycle States and Events
142.6 Setting up Command-line tools access
44540.5 Summary
152.6.1 Windows 11
44641. An Android Jetpack Lifecycle Awareness Tutorial
162.6.2 Linux
44741.1 Creating the Example Lifecycle Project
172.6.3 macOS
44841.2 Creating a Lifecycle Observer
182.7 Android Studio memory management
44941.3 Adding the Observer
192.8 Updating Android Studio and the SDK
45041.4 Testing the Observer
202.9 Summary
45141.5 Creating a Lifecycle Owner
213. Creating an Example Android App in Android Studio
45241.6 Testing the Custom Lifecycle Owner
223.1 About the Project
45341.7 Summary
233.2 Creating a New Android Project
45442. An Overview of the Navigation Architecture Component
243.3 Creating an Activity
45542.1 Understanding Navigation
253.4 Defining the Project and SDK Settings
45642.2 Declaring a Navigation Host
263.5 Modifying the Example Application
45742.3 The Navigation Graph
273.6 Modifying the User Interface
45842.4 Accessing the Navigation Controller
283.7 Reviewing the Layout and Resource Files
45942.5 Triggering a Navigation Action
293.8 Adding Interaction
46042.6 Passing Arguments
303.9 Summary
46142.7 Summary
314. Creating an Android Virtual Device (AVD) in Android Studio
46243. An Android Jetpack Navigation Component Tutorial
324.1 About Android Virtual Devices
46343.1 Creating the NavigationDemo Project
334.2 Remote Devices
46443.2 Adding Navigation to the Build Configuration
344.3 Starting the Emulator
46543.3 Creating the Navigation Graph Resource File
354.4 Running the Application in the AVD
46643.4 Declaring a Navigation Host
364.5 Running on Multiple Devices
46743.5 Adding Navigation Destinations
374.6 Stopping a Running Application
46843.6 Designing the Destination Fragment Layouts
384.7 Supporting Dark Theme
46943.7 Adding an Action to the Navigation Graph
394.8 Running the Emulator in a Separate Window
47043.8 Implement the OnFragmentInteractionListener
404.9 Removing the Device Frame
47143.9 Adding View Binding Support to the Destination Fragments
414.10 Summary
47243.10 Triggering the Action
425. Using and Configuring the Android Studio AVD Emulator
47343.11 Passing Data Using Safeargs
435.1 The Emulator Environment
47443.12 Summary
445.2 Emulator Toolbar Options
47544. Working with the Floating Action Button and Snackbar
455.3 Working in Zoom Mode
47644.1 The Material Design
465.4 Resizing the Emulator Window
47744.2 The Design Library
475.5 Extended Control Options
47844.3 The Floating Action Button (FAB)
485.5.1 Displays
47944.4 The Snackbar
495.5.2 Cellular
48044.5 Creating the Example Project
505.5.3 Battery
48144.6 Reviewing the Project
515.5.4 Camera
48244.7 Removing Navigation Features
525.5.5 Location
48344.8 Changing the Floating Action Button
535.5.6 Phone
48444.9 Adding an Action to the Snackbar
545.5.7 Directional Pad
48544.10 Summary
555.5.8 Microphone
48645. Creating a Tabbed Interface using the TabLayout Component
565.5.9 Fingerprint
48745.1 An Introduction to the ViewPager2
575.5.10 Virtual Sensors
48845.2 An Overview of the TabLayout Component
585.5.11 Bug report
48945.3 Creating the TabLayoutDemo Project
595.5.12 Snapshots
49045.4 Creating the First Fragment
605.5.13 Record and Playback
49145.5 Duplicating the Fragments
615.5.14 Google Play
49245.6 Adding the TabLayout and ViewPager2
625.5.15 Settings
49345.7 Creating the Pager Adapter
635.5.16 Help
49445.8 Performing the Initialization Tasks
645.6 Working with Snapshots
49545.9 Testing the Application
655.7 Configuring Fingerprint Emulation
49645.10 Customizing the TabLayout
665.8 The Emulator in Tool Window Mode
49745.11 Summary
675.9 Common Android Settings
49846. Working with the RecyclerView and CardView Widgets
685.10 Creating a Resizable Emulator
49946.1 An Overview of the RecyclerView
695.11 Summary
50046.2 An Overview of the CardView
706. A Tour of the Android Studio User Interface
50146.3 Summary
716.1 The Welcome Screen
50247. An Android RecyclerView and CardView Tutorial
726.2 The Menu Bar
50347.1 Creating the CardDemo Project
736.3 The Main Window
50447.2 Modifying the Basic Views Activity Project
746.4 The Tool Windows
50547.3 Designing the CardView Layout
756.5 The Tool Window Menus
50647.4 Adding the RecyclerView
766.6 Android Studio Keyboard Shortcuts
50747.5 Adding the Image Files
776.7 Switcher and Recent Files Navigation
50847.6 Creating the RecyclerView Adapter
786.8 Changing the Android Studio Theme
50947.7 Initializing the RecyclerView Component
796.9 Summary
51047.8 Testing the Application
807. Testing Android Studio Apps on a Physical Android Device
51147.9 Responding to Card Selections
817.1 An Overview of the Android Debug Bridge (ADB)
51247.10 Summary
827.2 Enabling USB Debugging ADB on Android Devices
51348. Working with the AppBar and Collapsing Toolbar Layouts
837.2.1 macOS ADB Configuration
51448.1 The Anatomy of an AppBar
847.2.2 Windows ADB Configuration
51548.2 The Example Project
857.2.3 Linux ADB Configuration
51648.3 Coordinating the RecyclerView and Toolbar
867.3 Resolving USB Connection Issues
51748.4 Introducing the Collapsing Toolbar Layout
877.4 Enabling Wireless Debugging on Android Devices
51848.5 Changing the Title and Scrim Color
887.5 Testing the ADB Connection
51948.6 Summary
897.6 Device Mirroring
52049. An Overview of Android Services
907.7 Summary
52149.1 Intent Service
918. The Basics of the Android Studio Code Editor
52249.2 Bound Service
928.1 The Android Studio Editor
52349.3 The Anatomy of a Service
938.2 The Floating Code Toolbar
52449.4 Controlling Destroyed Service Restart Options
948.3 Splitting the Editor Window
52549.5 Declaring a Service in the Manifest File
958.4 Code Completion
52649.6 Starting a Service Running on System Startup
968.5 Statement Completion
52749.7 Summary
978.6 Parameter Information
52850. An Overview of Android Intents
988.7 Parameter Name Hints
52950.1 An Overview of Intents
998.8 Code Generation
53050.2 Explicit Intents
1008.9 Code Folding
53150.3 Returning Data from an Activity
1018.10 Quick Documentation Lookup
53250.4 Implicit Intents
1028.11 Code Reformatting
53350.5 Using Intent Filters
1038.12 Live Templates
53450.6 Automatic Link Verification
1048.13 Summary
53550.7 Manually Enabling Links
1059. An Overview of the Android Architecture
53650.8 Checking Intent Availability
1069.1 The Android Software Stack
53750.9 Summary
1079.2 The Linux Kernel
53851. Android Explicit Intents – A Worked Example
1089.3 Hardware Abstraction Layer
53951.1 Creating the Explicit Intent Example Application
1099.4 Android Runtime – ART
54051.2 Designing the User Interface Layout for MainActivity
1109.5 Android Libraries: 9.5.1 C/C++ Libraries
54151.3 Creating the Second Activity Class
1119.6 Application Framework
54251.4 Designing the User Interface Layout for SecondActivity
1129.7 Applications
54351.5 Reviewing the Application Manifest File
1139.8 Summary
54451.6 Creating the Intent
11410. The Anatomy of an Android App
54551.7 Extracting Intent Data
11510.1 Android Activities
54651.8 Launching SecondActivity as a Sub-Activity
11610.2 Android Fragments
54751.9 Returning Data from a Sub-Activity
11710.3 Android Intents
54851.10 Testing the Application
11810.4 Broadcast Intents
54951.11 Summary
11910.5 Broadcast Receivers
55052. Android Implicit Intents – A Worked Example
12010.6 Android Services
55152.1 Creating the Android Studio Implicit Intent Example Project
12110.7 Content Providers
55252.2 Designing the User Interface
12210.8 The Application Manifest
55352.3 Creating the Implicit Intent
12310.9 Application Resources
55452.4 Adding a Second Matching Activity
12410.10 Application Context
55552.5 Adding the Web View to the UI
12510.11 Summary
55652.6 Obtaining the Intent URL
12611. An Overview of Android View Binding
55752.7 Modifying the MyWebView Project Manifest File
12711.1 Find View by Id
55852.8 Installing the MyWebView Package on a Device
12811.2 View Binding
55952.9 Testing the Application
12911.3 Converting the AndroidSample project
56052.10 Manually Enabling the Link
13011.4 Enabling View Binding
56152.11 Automatic Link Verification
13111.5 Using View Binding
56252.12 Summary
13211.6 Choosing an Option
56353. Android Broadcast Intents and Broadcast Receivers
13311.7 View Binding in the Book Examples
56453.1 An Overview of Broadcast Intents
13411.8 Migrating a Project to View Binding
56553.2 An Overview of Broadcast Receivers
13511.9 Using AI to Perform the Conversion
56653.3 Obtaining Results from a Broadcast
13611.10 Summary
56753.4 Sticky Broadcast Intents
13712. Introducing Gemini AI in Android Studio
56853.5 The Broadcast Intent Example
13812.1 Introducing Gemini AI
56953.6 Creating the Example Application
13912.2 Enabling Gemini AI in Android Studio
57053.7 Creating and Sending the Broadcast Intent
14012.3 Gemini API Billing
57153.8 Creating the Broadcast Receiver
14112.4 Asking Gemini questions
57253.9 Registering the Broadcast Receiver
14212.5 Inline code completion
57353.10 Testing the Broadcast Example
14312.6 Transforming and documenting code
57453.11 Listening for System Broadcasts
14412.7 Smart Renaming
57553.12 Summary
14512.8 Gemini in Agent Mode
57654. Android Local Bound Services – A Worked Example
14612.9 Summary
57754.1 Understanding Bound Services
14713. Understanding Android Application and Activity Lifecycles
57854.2 Bound Service Interaction Options
14813.1 Android Applications and Resource Management
57954.3 A Local Bound Service Example
14913.2 Android Process States
58054.4 Adding a Bound Service to the Project
15013.2.1 Foreground Process
58154.5 Implementing the Binder
15113.2.2 Visible Process
58254.6 Binding the Client to the Service
15213.2.3 Service Process
58354.7 Completing the Example
15313.2.4 Background Process
58454.8 Testing the Application
15413.2.5 Empty Process
58554.9 Summary
15513.3 Inter-Process Dependencies
58655. Android Remote Bound Services – A Worked Example
15613.4 The Activity Lifecycle
58755.1 Client to Remote Service Communication
15713.5 The Activity Stack
58855.2 Creating the Example Application
15813.6 Activity States
58955.3 Designing the User Interface
15913.7 Configuration Changes
59055.4 Implementing the Remote Bound Service
16013.8 Handling State Change
59155.5 Configuring a Remote Service in the Manifest File
16113.9 Summary
59255.6 Launching and Binding to the Remote Service
16214. Handling Android Activity State Changes
59355.7 Sending a Message to the Remote Service
16314.1 New vs. Old Lifecycle Techniques
59455.8 Summary
16414.2 The Activity and Fragment Classes
59556. An Overview of Java Threads, Handlers and Executors
16514.3 Dynamic State vs. Persistent State
59656.1 The Application Main Thread
16614.4 The Android Lifecycle Methods
59756.2 Thread Handlers
16714.5 Lifetimes
59856.3 A Threading Example
16814.6 Foldable Devices and Multi-Resume
59956.4 Building the App
16914.7 Disabling Configuration Change Restarts
60056.5 Creating a New Thread
17014.8 Lifecycle Method Limitations
60156.6 Implementing a Thread Handler
17114.9 Summary
60256.7 Passing a Message to the Handler
17215. Android Activity State Changes by Example
60356.8 Java Executor Concurrency
17315.1 Creating the State Change Example Project
60456.9 Working with Runnable Tasks
17415.2 Designing the User Interface
60556.10 Shutting down an Executor Service
17515.3 Overriding the Activity Lifecycle Methods
60656.11 Working with Callable Tasks and Futures
17615.4 Filtering the Logcat Panel
60756.12 Handling a Future Result
17715.5 Running the Application
60856.13 Scheduling Tasks
17815.6 Experimenting with the Activity
60956.14 Summary
17915.7 Summary
61057. Making Runtime Permission Requests in Android
18016. Saving and Restoring the State of an Android Activity
61157.1 Understanding Normal and Dangerous Permissions
18116.1 Saving Dynamic State
61257.2 Creating the Permissions Example Project
18216.2 Default Saving of User Interface State
61357.3 Checking for a Permission
18316.3 The Bundle Class
61457.4 Requesting Permission at Runtime
18416.4 Saving the State
61557.5 Providing a Rationale for the Permission Request
18516.5 Restoring the State
61657.6 Testing the Permissions App
18616.6 Testing the Application
61757.7 Summary
18716.7 Summary
61858. An Android Notifications Tutorial
18817. Understanding Android Views, View Groups and Layouts
61958.1 An Overview of Notifications
18917.1 Designing for Different Android Devices
62058.2 Creating the NotifyDemo Project
19017.2 Views and View Groups
62158.3 Designing the User Interface
19117.3 Android Layout Managers
62258.4 Creating the Second Activity
19217.4 The View Hierarchy
62358.5 Creating a Notification Channel
19317.5 Creating User Interfaces
62458.6 Requesting Notification Permission
19417.6 Summary
62558.7 Creating and Issuing a Notification
19518. A Guide to the Android Studio Layout Editor Tool
62658.8 Launching an Activity from a Notification
19618.1 Basic vs. Empty Views Activity Templates
62758.9 Adding Actions to a Notification
19718.2 The Android Studio Layout Editor
62858.10 Bundled Notifications
19818.3 Design Mode
62958.11 Summary
19918.4 The Palette
63059. An Android Direct Reply Notification Tutorial
20018.5 Design Mode and Layout Views
63159.1 Creating the DirectReply Project
20118.6 Night Mode
63259.2 Designing the User Interface
20218.7 Code Mode
63359.3 Requesting Notification Permission
20318.8 Split Mode
63459.4 Creating the Notification Channel
20418.9 Setting Attributes
63559.5 Building the RemoteInput Object
20518.10 Transforms
63659.6 Creating the PendingIntent
20618.11 Tools Visibility Toggles
63759.7 Creating the Reply Action
20718.12 Converting Views
63859.8 Receiving Direct Reply Input
20818.13 Displaying Sample Data
63959.9 Updating the Notification
20918.14 Creating a Custom Device Definition
64059.10 Summary
21018.15 Changing the Current Device
64160. An Overview of Android SQLite Databases
21118.16 Layout Validation
64260.1 Understanding database tables
21218.17 Summary
64360.2 Introducing database schema
21319. A Guide to the Android ConstraintLayout
64460.3 Columns and data types
21419.1 How ConstraintLayout Works
64560.4 Database rows
21519.1.1 Constraints
64660.5 Introducing primary keys
21619.1.2 Margins
64760.6 What is SQLite?
21719.1.3 Opposing Constraints
64860.7 Structured Query Language (SQL)
21819.1.4 Constraint Bias
64960.8 Trying SQLite on an Android Virtual Device (AVD)
21919.1.5 Chains
65060.9 The Android Room persistence library
22019.1.6 Chain Styles
65160.10 Summary
22119.2 Baseline Alignment
65261. An Android SQLite Database Tutorial
22219.3 Configuring Widget Dimensions
65361.1 About the Database Example
22319.4 Guideline Helper
65461.2 Creating the SQLDemo Project
22419.5 Group Helper
65561.3 Designing the User interface
22519.6 Barrier Helper
65661.4 Creating the Data Model
22619.7 Flow Helper
65761.5 Implementing the Data Handler
22719.8 Ratios
65861.6 The Add Handler Method
22819.9 ConstraintLayout Advantages
65961.7 The Query Handler Method
22919.10 ConstraintLayout Availability
66061.8 The Delete Handler Method
23019.11 Summary
66161.9 Implementing the Activity Event Methods
23120. A Guide to Using ConstraintLayout in Android Studio
66261.10 Testing the Application
23220.1 Design and Layout Views
66361.11 Summary
23320.2 Autoconnect Mode
66462. Understanding Android Content Providers
23420.3 Inference Mode
66562.1 What is a Content Provider?
23520.4 Manipulating Constraints Manually
66662.2 The Content Provider
23620.5 Adding Constraints in the Inspector
66762.2.1 onCreate()
23720.6 Viewing Constraints in the Attributes Window
66862.2.2 query()
23820.7 Deleting Constraints
66962.2.3 insert()
23920.8 Adjusting Constraint Bias
67062.2.4 update()
24020.9 Understanding ConstraintLayout Margins
67162.2.5 delete()
24120.10 The Importance of Opposing Constraints and Bias
67262.2.6 getType()
24220.11 Configuring Widget Dimensions
67362.3 The Content URI
24320.12 Design Time Tools Positioning
67462.4 The Content Resolver
24420.13 Adding Guidelines
67562.5 The <provider> Manifest Element
24520.14 Adding Barriers
67662.6 Summary
24620.15 Adding a Group
67763. An Android Content Provider Tutorial
24720.16 Working with the Flow Helper
67863.1 Copying the SQLDemo Project
24820.17 Widget Group Alignment and Distribution
67963.2 Adding the Content Provider Package
24920.18 Converting other Layouts to ConstraintLayout
68063.3 Creating the Content Provider Class
25020.19 Summary
68163.4 Constructing the Authority and Content URI
25121. Working with ConstraintLayout Chains and Ratios in Android Studio
68263.5 Implementing URI Matching in the Content Provider
25221.1 Creating a Chain
68363.6 Implementing the Content Provider onCreate() Method
25321.2 Changing the Chain Style
68463.7 Implementing the Content Provider insert() Method
25421.3 Spread Inside Chain Style
68563.8 Implementing the Content Provider query() Method
25521.4 Packed Chain Style
68663.9 Implementing the Content Provider update() Method
25621.5 Packed Chain Style with Bias
68763.10 Implementing the Content Provider delete() Method
25721.6 Weighted Chain
68863.11 Declaring the Content Provider in the Manifest File
25821.7 Working with Ratios
68963.12 Modifying the Database Handler
25921.8 Summary
69063.13 Summary
26022. An Android Studio Layout Editor ConstraintLayout Tutorial
69164. An Android Content Provider Client Tutorial
26122.1 An Android Studio Layout Editor Tool Example
69264.1 Creating the SQLDemoClient Project
26222.2 Preparing the Layout Editor Environment
69364.2 Designing the User interface
26322.3 Adding the Widgets to the User Interface
69464.3 Accessing the Content Provider
26422.4 Adding the Constraints
69564.4 Adding the Query Permission
26522.5 Testing the Layout
69664.5 Testing the Project
26622.6 Using the Layout Inspector
69764.6 Summary
26722.7 Summary
69865. The Android Room Persistence Library
26823. Manual XML Layout Design in Android Studio
69965.1 Revisiting Modern App Architecture
26923.1 Manually Creating an XML Layout
70065.2 Key Elements of Room Database Persistence
27023.2 Manual XML vs. Visual Layout Design
70165.2.1 Repository
27123.3 Summary
70265.2.2 Room Database
27224. Managing Constraints using Constraint Sets
70365.2.3 Data Access Object (DAO)
27324.1 Java Code vs. XML Layout Files
70465.2.4 Entities
27424.2 Creating Views
70565.2.5 SQLite Database
27524.3 View Attributes
70665.3 Understanding Entities
27624.4 Constraint Sets
70765.4 Data Access Objects
27724.4.1 Establishing Connections
70865.5 The Room Database
27824.4.2 Applying Constraints to a Layout
70965.6 The Repository
27924.4.3 Parent Constraint Connections
71065.7 In-Memory Databases
28024.4.4 Sizing Constraints
71165.8 Database Inspector
28124.4.5 Constraint Bias
71265.9 Summary
28224.4.6 Alignment Constraints
71366. An Android TableLayout and TableRow Tutorial
28324.4.7 Copying and Applying Constraint Sets
71466.1 The TableLayout and TableRow Layout Views
28424.4.8 ConstraintLayout Chains
71566.2 Creating the Room Database Project
28524.4.9 Guidelines
71666.3 Converting to a LinearLayout
28624.4.10 Removing Constraints
71766.4 Adding the TableLayout to the User Interface
28724.4.11 Scaling
71866.5 Configuring the TableRows
28824.4.12 Rotation
71966.6 Adding the Button Bar to the Layout
28924.5 Summary
72066.7 Adding the RecyclerView
29025. An Android ConstraintSet Tutorial
72166.8 Adjusting the Layout Margins
29125.1 Creating the Example Project in Android Studio
72266.9 Summary
29225.2 Adding Views to an Activity
72367. An Android Room Database and Repository Tutorial
29325.3 Setting View Attributes
72467.1 About the RoomDemo Project
29425.4 Creating View IDs
72567.2 Modifying the Build Configuration
29525.5 Configuring the Constraint Set
72667.3 Building the Entity
29625.6 Adding the EditText View
72767.4 Creating the Data Access Object
29725.7 Converting Density Independent Pixels (dp) to Pixels (px)
72867.5 Adding the Room Database
29825.8 Summary
72967.6 Adding the Repository
29926. A Guide to Using Apply Changes in Android Studio
73067.7 Adding the ViewModel
30026.1 Introducing Apply Changes
73167.8 Creating the Product Item Layout
30126.2 Understanding Apply Changes Options
73267.9 Adding the RecyclerView Adapter
30226.3 Using Apply Changes
73367.10 Preparing the Main Activity
30326.4 Configuring Apply Changes Fallback Settings
73467.11 Adding the Button Listeners
30426.5 An Apply Changes Tutorial
73567.12 Adding LiveData Observers
30526.6 Using Apply Code Changes
73667.13 Initializing the RecyclerView
30626.7 Using Apply Changes and Restart Activity
73767.14 Testing the RoomDemo App
30726.8 Using Run App
73867.15 Using the Database Inspector
30826.9 Summary
73967.16 Summary
30927. A Guide to Gradle Version Catalogs
74068. Creating, Testing, and Uploading an Android App Bundle
31027.1 Library and Plugin Dependencies
74168.1 The Release Preparation Process
31127.2 Project Gradle Build File
74268.2 Android App Bundles
31227.3 Module Gradle Build Files
74368.3 Register for a Google Play Developer Console Account
31327.4 Version Catalog File
74468.4 Configuring the App in the Console
31427.5 Adding Dependencies
74568.5 Creating a Keystore File
31527.6 Library Updates
74668.6 Creating the Android App Bundle
31627.7 Summary
74768.7 Generating Test APK Files
31728. An Overview and Example of Android Event Handling
74868.8 Uploading the App Bundle to the Google Play Developer Console
31828.1 Understanding Android Events
74968.9 Exploring the App Bundle
31928.2 Using the android:onClick Resource
75068.10 Managing Testers
32028.3 Event Listeners and Callback Methods
75168.11 Uploading New App Bundle Revisions
32128.4 An Event Handling Example
75268.12 Analyzing the App Bundle File
32228.5 Designing the User Interface
75368.13 Summary
32328.6 The Event Listener and Callback Method
75469. An Overview of Android In-App Billing
32428.7 Consuming Events
75569.1 Preparing a Project for In-App Purchasing
32528.8 Summary
75669.2 Creating In-App Products and Subscriptions
32629. Android Touch and Multi-touch Event Handling
75769.3 Billing Client Initialization
32729.1 Intercepting Touch Events
75869.4 Connecting to the Google Play Billing Library
32829.2 The MotionEvent Object
75969.5 Querying Available Products
32929.3 Understanding Touch Actions
76069.6 Starting the Purchase Process
33029.4 Handling Multiple Touches
76169.7 Completing the Purchase
33129.5 An Example Multi-Touch Application
76269.8 Querying Previous Purchases
33229.6 Designing the Activity User Interface
76369.9 Summary
33329.7 Implementing the Touch Event Listener
76470. An Android In-App Purchasing Tutorial
33429.8 Running the Example Application
76570.1 About the In-App Purchasing Example Project
33529.9 Summary
76670.2 Creating the InAppPurchase Project
33630. Detecting Common Gestures Using the Android Gesture Detector Class
76770.3 Adding Libraries to the Project
33730.1 Implementing Common Gesture Detection
76870.4 Designing the User Interface
33830.2 Creating an Example Gesture Detection Project
76970.5 Adding the App to the Google Play Store
33930.3 Implementing the Listener Class
77070.6 Creating an In-App product
34030.4 Creating the GestureDetector Instance
77170.7 Enabling license testers
34130.5 Implementing the onTouchEvent() Method
77270.8 Initializing the Billing Client
34230.6 Testing the Application
77370.9 Querying the Product
34330.7 Summary
77470.10 Launching the Purchase Flow
34431. Implementing Custom Gesture and Pinch Recognition on Android
77570.11 Handling Purchase Updates
34531.1 The Android Gesture Builder Application
77670.12 Consuming the Product
34631.2 The GestureOverlayView Class
77770.13 Restoring a Previous Purchase
34731.3 Detecting Gestures
77870.14 Testing the app
34831.4 Identifying Specific Gestures
77970.15 Troubleshooting
34931.5 Installing and Running the Gesture Builder Application
78070.16 Summary
35031.6 Creating a Gestures File
78171. An Android Biometric Authentication Tutorial
35131.7 Creating the Example Project
78271.1 An Overview of Biometric Authentication
35231.8 Extracting the Gestures File from the SD Card
78371.2 Creating the Biometric Authentication Project
35331.9 Adding the Gestures File to the Project
78471.3 Configuring Device Fingerprint Authentication
35431.10 Designing the User Interface
78571.4 Adding the Biometric Permission to the Manifest File
35531.11 Loading the Gestures File
78671.5 Designing the User Interface
35631.12 Registering the Event Listener
78771.6 Adding a Toast Convenience Method
35731.13 Implementing the onGesturePerformed Method
78871.7 Checking the Security Settings
35831.14 Testing the Application
78971.8 Configuring the Authentication Callbacks
35931.15 Configuring the GestureOverlayView
79071.9 Adding the CancellationSignal
36031.16 Intercepting Gestures
79171.10 Starting the Biometric Prompt
36131.17 Detecting Pinch Gestures
79271.11 Testing the Project
36231.18 A Pinch Gesture Example Project
79371.12 Summary
36331.19 Summary
79472. Integrating Gemini AI into Android Apps
36432. An Introduction to Android Fragments
79572.1 Gemini models
36532.1 What is a Fragment?
79672.2 Firebase AI Logic and Gemini API providers
36632.2 Creating a Fragment
79772.3 Initializing AI models
36732.3 Adding a Fragment to an Activity using the Layout XML File
79872.4 Multi-modal content
36832.4 Adding and Managing Fragments in Code
79972.5 Generating content
36932.5 Handling Fragment Events
80072.6 Starting a chat session
37032.6 Implementing Fragment Communication
80172.7 Image Generation
37132.7 Summary
80272.8 Summary
37233. Using Fragments in Android Studio - An Example
80373. Preparing the Gemini Firebase AI Logic Project
37333.1 About the Example Fragment Application
80473.1 Opening the GeminiDemo starter project
37433.2 Creating the Example Project
80573.2 Creating a Google Cloud account
37533.3 Creating the First Fragment Layout
80673.3 Generating the Gemini API key
37633.4 Migrating a Fragment to View Binding
80773.4 Adding the Google Cloud project to Firebase
37733.5 Adding the Second Fragment
80873.5 Registering the app with Firebase
37833.6 Adding the Fragments to the Activity
80973.6 Enabling the Gemini API provider
37933.7 Making the Toolbar Fragment Talk to the Activity
81073.7 Adding the JSON services file
38033.8 Making the Activity Talk to the Text Fragment
81173.8 Adding libraries
38133.9 Testing the Application
81273.9 Initializing the generative model
38233.10 Summary
81373.10 Summary
38334. Modern Android App Architecture with Jetpack
81474. A Gemini AI Tutorial
38434.1 What is Android Jetpack?
81574.1 Opening the GeminiDemo project
38534.2 The “Old” Architecture
81674.2 Getting started
38634.3 Modern Android Architecture
81774.3 Calling the Gemini API
38734.4 The ViewModel Component
81874.4 Testing the app
38834.5 The LiveData Component
81974.5 Migrating to chat
38934.6 ViewModel Saved State
82074.6 Summary
39034.7 LiveData and Data Binding
82175. Using Gemini AI for Video Analysis
39134.8 Android Lifecycles
82275.1 Opening the GeminiDemo project
39234.9 Repository Modules
82375.2 Updating the view model
39334.10 Summary
82475.3 Testing the app
39435. An Android ViewModel Tutorial
82575.4 Summary
39535.1 About the Project
82676. Gemini AI Image Generation
39635.2 Creating the ViewModel Example Project
82776.1 Opening the GeminiDemo project
39735.3 Removing Unwanted Project Elements
82876.2 Initializing the Imagen model
39835.4 Designing the Fragment Layout
82976.3 Sending the image generation request
39935.5 Implementing the View Model
83076.4 Updating the UI fragments
40035.6 Associating the Fragment with the View Model
83176.5 Upgrading to the Firebase Blaze plan
40135.7 Modifying the Fragment
83276.6 Testing image generation
40235.8 Accessing the ViewModel Data
83376.7 Summary
40335.9 Testing the Project
83477. Working with Material Design 3 Theming
40435.10 Summary
83577.1 Material Design 2 vs. Material Design 3
40536. An Android Jetpack LiveData Tutorial
83677.2 Understanding Material Design Theming
40636.1 LiveData - A Recap
83777.3 Material Design 3 Theming
40736.2 Adding LiveData to the ViewModel
83877.4 Building a custom theme
40836.3 Implementing the Observer
83977.5 Summary
40936.4 Summary
84078. A Material Design 3 Theming and Dynamic Color Tutorial
41037. An Overview of Android Jetpack Data Binding
84178.1 Creating the ThemeDemo Project
41137.1 An Overview of Data Binding
84278.2 Designing the User Interface
41237.2 The Key Components of Data Binding
84378.3 Building a new theme
41337.2.1 The Project Build Configuration
84478.4 Adding the Theme to the Project
41437.2.2 The Data Binding Layout File
84578.5 Enabling Dynamic Color Support
41537.2.3 The Layout File Data Element
84678.6 Summary
41637.2.4 The Binding Classes
84779. An Overview of Gradle in Android Studio
41737.2.5 Data Binding Variable Configuration
84879.1 An Overview of Gradle
41837.2.6 Binding Expressions (One-Way)
84979.2 Gradle and Android Studio
41937.2.7 Binding Expressions (Two-Way)
85079.2.1 Sensible Defaults
42037.2.8 Event and Listener Bindings
85179.2.2 Dependencies
42137.3 Summary
85279.2.3 Build Variants
42238. An Android Jetpack Data Binding Tutorial
85379.2.4 Manifest Entries
42338.1 Removing the Redundant Code
85479.2.5 APK Signing
42438.2 Enabling Data Binding
85579.2.6 ProGuard Support
42538.3 Adding the Layout Element
85679.3 The Property and Settings Gradle Build File
42638.4 Adding the Data Element to Layout File
85779.4 The Top-level Gradle Build File
42738.5 Working with the Binding Class
85879.5 Module Level Gradle Build Files
42838.6 Assigning the ViewModel Instance to the Data Binding Variable
85979.6 Configuring Signing Settings in the Build File
42938.7 Adding Binding Expressions
86079.7 Running Gradle Tasks from the Command Line
43038.8 Adding the Conversion Method
86179.8 Summary
43138.9 Adding a Listener Binding