Below are links to all the source code in this course. You can download project source code for each lecture in the course individually.

Section 3 - Hello World Android App

Source code - Hello World Android App - More on Android Templates

Source code - Hello World Android App - Tour of Android Studio


Section 4 - Kotlin Tutorials

Source code - Kotlin Tutorials - Kotlin Tutorial Setup

Source code - Kotlin Tutorials - Kotlin Tutorial 1

Source code - Kotlin Tutorials - Variables and Types

Source code - Kotlin Tutorials - More on Variables and Types

Source code - Kotlin Tutorials - String Concatenation and Interpolation

Source code - Kotlin Tutorials - val and var and more on Declarations

Source code - Kotlin Tutorials - Conditions

Source code - Kotlin Tutorials - Classes

Source code - Kotlin Tutorials - Objects and Instances

Source code - Kotlin Tutorials - Lists

Source code - Kotlin Tutorials - More on Lists

Source code - Kotlin Tutorials - toString Challenge

Source code - Kotlin Tutorials - for Loops

Source code - Kotlin Tutorials - for Encapsulation and Private Properties

Source code - Kotlin Tutorials - Overloading Functions

Source code - Kotlin Tutorials - Inheritance

Source code - Kotlin Tutorials - More on Inheritance

Source code - Kotlin Tutorials - Inheritance Continued

Source code - Kotlin Tutorials - Further Inheritance

Source code - Kotlin Tutorials - while Loops

Source code - Kotlin Tutorials - for Loop Revisited

Source code - Kotlin Tutorials - do while Loop

Source code - Kotlin Tutorials - Loop Challenge


Section 5 - The Button Counter App

Source code - The Button Counter App - The Constraint Layout

Source code - The Button Counter App - Constraints and Resizing

Source code - The Button Counter App - Positioning Widgets

Source code - The Button Counter App - Inner Lines within a Widget

Source code - The Button Counter App - Layouts on Different Devices

Source code - The Button Counter App - More on the Constraints

Source code - The Button Counter App - Baseline Constraints

Source code - The Button Counter App - Constraining Widgets

Source code - The Button Counter App - Add Scrolling Capabilities

Source code - The Button Counter App - The Button Counter App

Source code - The Button Counter App - Finish Layout


Section 6 - Calculator App

Source code - Calculator App - Demo Calculator App

Source code - Calculator App - Calculator Interface Setup

Source code - Calculator App - Continue with Interface

Source code - Calculator App - Fine Tuning the Layout

Source code - Calculator App - Create Landscape Layout

Source code - Calculator App - Coding the Calculator

Source code - Calculator App - Add onClickListeners

Source code -  Calculator App - Write Perform Operation Function

Source code - Calculator App - Bug Fix and Code Improvements

Source code - Calculator App - Bug Fix Challlenge and Save State

Source code - Calculator App - Widget References in Kotlin

Source code - Calculator App - Guidelines

Source code - Calculator App - Fixing Landscape Layout

Source code - Calculator App - Add Neg Button to Layout

Source code - Calculator App - Code Changes for Neg Button

Source code - Calculator App - Add Neg Button to Portrait


Section 7 - The Top 10 Downloader App

Source code - The Top 10 Downloader App - Introduction

Source code - The Top 10 Downloader App - AsyncTask

Source code - The Top 10 Downloader App - Logging and Logcat

Source code - The Top 10 Downloader App - Download the RSS Feed

Source code - The Top 10 Downloader App - Reading the Data

Source code - The Top 10 Downloader App - Android Permissions

Source code - The Top 10 Downloader App - Writing Idiomatic Kotlin

Source code - The Top 10 Downloader App - More Idiomatic Kotlin

Source code -The Top 10 Downloader App - Parsing the Data

Source code - The Top 10 Downloader App - Create Xml Parse Function

Source code - The Top 10 Downloader App - Testing the App

Source code - The Top 10 Downloader App - ListView and ArrayAdapter

Source code - The Top 10 Downloader App - Code Changes for Array Adapter

Source code - The Top 10 Downloader App - onDestroy and Asynctask

Source code - The Top 10 Downloader App - Create Custom Adapter

Source code - The Top 10 Downloader App - Custom Adapter Code

Source code - The Top 10 Downloader App - Improving the Adapter

Source code - The Top 10 Downloader App - ViewHolder Pattern

Source code - The Top 10 Downloader App - Challenge Solution


Section 8 - The YouTube app

Source code - The YouTube app - YouTube Activity

Source code - The YouTube app - Adding Widgets Dynamically

Source code - The YouTube app - Add Key to Code

Source code - The YouTube app - The YouTube Player

Source code - The YouTube app - onInitializationSuccess Method

Source code - The YouTube app - Adding Listeners

Source code - The YouTube app - Improving the Player

Source code - The YouTube app - Extending App Layouts

Source code - The YouTube app - Extending Youtube App Code

Source code - The YouTube app - Implementing Intents and Challenge

Source code - The YouTube app - Challenge Solution

Source code - The YouTube app - More Error Handling


Section 9 -  Flickr Browser App

Source code - Flickr Browser App - Log Tag and Companion Objects

Source code - Flickr Browser App - Download JSON - doInBackground

Source code - Flickr Browser App - Downloading the JSON

Source code - Flickr Browser App - CallBacks

Source code - Flickr Browser App - GetFlickrJsonData class continued

Source code - Flickr Browser App - Uri Builder

Source code - Flickr Browser App - Flickr Browser User Inferface

Source code - Flickr Browser App - RecyclerView Layouts

Source code - Flickr Browser App - Finishing Browse Layout

Source code - Flickr Browser App - Search and PhotoDetail Activities

Source code - Flickr Browser App - Nested Layouts

Source code - Flickr Browser App - Recyclerview Adapter

Source code - Flickr Browser App - onBindViewHolder and Picasso

Source code - Flickr Browser App - Associate Adapter to Recyclerview

Source code - Flickr Browser App - RecyclerItemClickListener

Source code - Flickr Browser App - GestureDetector

Source code - Flickr Browser App - Displaying the full photo

Source code - Flickr Browser App - Serializable

Source code - Flickr Browser App - Modify Photo Details Activity

Source code - Flickr Browser App - Parcelable

Source code - Flickr Browser App - Custom Style Sheets

Source code - Flickr Browser App - Namespaces

Source code - Flickr Browser App - Other Material Design Changes

Source code - Flickr Browser App - Style Editor

Source code - Flickr Browser App - Differences in API Levels

Source code - Flickr Browser App - String Resources

Source code - Flickr Browser App - String Resources Placeholders

Source code - Flickr Browser App - Adding the Search Feature

Source code - Flickr Browser App - SearchView

Source code - Flickr Browser App - More on SearchView

Source code - Flickr Browser App - SearchView Events

Source code - Flickr Browser App - SharedPreferences

Source code - Flickr Browser App - Telling Fibs


Section 10 - Databases, the SQL Language and SQLite on Android

Source code - Databases, the SQL Language and SQLite on Android - Basic SQL in Android

Source code - Databases, the SQL Language and SQLite on Android - Create Table Add Data and Test

Source code - Databases, the SQL Language and SQLite on Android - Cursor and Navigation

Source code - Databases, the SQL Language and SQLite on Android - Contact Provider App Layout

Source code - Databases, the SQL Language and SQLite on Android - The ContactsContract

Source code - Databases, the SQL Language and SQLite on Android - Retrieving Data with a ContentResolver

Source code - Databases, the SQL Language and SQLite on Android - Permissions

Source code - Databases, the SQL Language and SQLite on Android - Checking Permissions at Runtime

Source code - Databases, the SQL Language and SQLite on Android - Testing the App

Source code - Databases, the SQL Language and SQLite on Android - Avoiding Crashes Snackbars and a Challenge

Source code - Databases, the SQL Language and SQLite on Android - More on Snackbars

Source code - Databases, the SQL Language and SQLite on Android - Intents, setData and Uris

Source code - Databases, the SQL Language and SQLite on Android - Problems Storing State

Source code - Databases, the SQL Language and SQLite on Android - Remove Saving of State

Source code - Databases, the SQL Language and SQLite on Android - Test Scripts Challenge and Cleanup


Section 11 - ViewModel and LiveData

Source code - ViewModel and LiveData - Using a ViewModel

Source code - ViewModel and LiveData - Finish ViewModel Changes

Source code - ViewModel and LiveData - Exposing LiveData

Source code - ViewModel and LiveData - Swapping the ViewModel

Source code - ViewModel and LiveData - ViewModel with Top 10 Downloader

Source code - ViewModel and LiveData - Implement ViewModel

Source code - ViewModel and LiveData - Final Changes

Source code - ViewModel and LiveData - App Testing


Section 12 -  TaskTimer App

Source code - TaskTimer App - Database Setup

Source code - TaskTimer App - Tasks Contract Class

Source code - TaskTimer App - AppDatabase Class

Source code - TaskTimer App - Create SQL for Tasks Table

Source code - TaskTimer App - Singleton AppDatabase Class

Source code - TaskTimer App - onUpgrade and Testing

Source code - TaskTimer App - The ContentProvider

Source code - TaskTimer App - uriMatcher

Source code - TaskTimer App - Updating Build Files

Source code - TaskTimer App - The Content URI

Source code - TaskTimer App - Register the ContentProvider

Source code - TaskTimer App - Using appendWhereEscapeString

Source code - TaskTimer App - Mime Types in the Content Provider

Source code - TaskTimer App - Content Provider Insert

Source code - TaskTimer App - Update and Delete

Source code - TaskTimer App - Testing Insert and Update

Source code - TaskTimer App - Testing Bulk Update and Delete

Source code - TaskTimer App - Main Menu UI

Source code - TaskTimer App - Task UI Layout

Source code - TaskTimer App - Task List Items Constraints

Source code - TaskTimer App - Add / Edit Layout

Source code - TaskTimer App - The Kotlin Data Class

Source code - TaskTimer App - The Add / Edit Fragment

Source code - TaskTimer App - Swapping Fragments

Source code - TaskTimer App - Multi-pane Fragments

Source code - TaskTimer App - Multi-pane Displays

Source code - TaskTimer App - Enabling Two-pane Mode

Source code - TaskTimer App - Logging the Fragment Lifecycle

Source code - TaskTimer App - Android SDK Gradle and Kotlin Updates

Source code - TaskTimer App - Up and Back Navigation for Fragments

Source code - TaskTimer App - Object can have More than One Type

Source code - TaskTimer App - Removing the Up Button

Source code - TaskTimer App - Back Navigation

Source code - TaskTimer App - Completing the AddEdit UI

Source code - TaskTimer App - Saving the Task Details

Source code - TaskTimer App - Test Saving

Source code - TaskTimer App - Updating Android Studio, Kotlin, and Gradle

Source code - TaskTimer App - Fixing New Kotlin Warnings

Source code - TaskTimer App - Layout Container

Source code - TaskTimer App - RecyclerView CursorAdapter

Source code - TaskTimer App - Tricking String Resources

Source code - TaskTimer App - The ViewModel Class

Source code - TaskTimer App - Subscribe to The ViewModel

Source code - TaskTimer App - Notifications and Observers

Source code - TaskTimer App - Responding to Taps

Source code - TaskTimer App - onClick Listeners, Interfaces and Callbacks

Source code - TaskTimer App - Responding to Clicks from the Adapter

Source code - TaskTimer App - Solution to The Interface Challenge

Source code - TaskTimer App - Deleting a Task from The Database

Source code - TaskTimer App - Accessing a Database on a Background Thread

Source code - TaskTimer App - Background Processing Using a Coroutine

Source code - TaskTimer App - Clean Up AddEditFragment

Source code - TaskTimer App - Saving in The ViewModel

Source code - TaskTimer App - Sharing ViewModel Instances


Section 13 - Dialogs

Source code - Dialogs - AndroidX

Source code - Dialogs - Introduction to Dialogs

Source code - Dialogs - AppDialog Class Part 2

Source code - Dialogs - Adding a Dialog to The App

Source code - Dialogs - Dialog CallBacks

Source code - Dialogs - Asserts and BuildConfig

Source code - Dialogs - Strange Dialog Behavior

Source code - Dialogs - Confirming Exit Without Saving

Source code - Dialogs - Implementing the Interface

Source code - Dialogs - Kotlin Extension Functions

Source code - Dialogs - Image Asset Studio

Source code - Dialogs - Create an About Dialog the Layout Part 2

Source code - Dialogs - Displaying the About Dialog

Source code - Dialogs - Versioning and build.gradle

Source code - Dialogs - Dismissing the Dialogue

Source code - Dialogs - Supporting Older Versions

Source code - Dialogs - Compatibility Challenge Solution Part 2


14. Settings Dialog

Source code - Settings Dialog - Introduction

Source code - Settings Dialog - Settings Dialog Layout

Source code - Settings Dialog - Settings Dialog

Source code - Settings Dialog - DefaultSharedPreferences

Source code - Settings Dialog - SeekBar Values

Source code - Settings Dialog - Quantity String Resources

Source code - Settings Dialog - Setting Dialog Title

Source code - Settings Dialog - Retain Instance State


15. Multiple Tables and Database Upgrades

Source code - Multiple Tables and Database Upgrades - Introduction

Source code - Multiple Tables and Database Upgrades - A Correction and the Device File Explorer

Source code - Multiple Tables and Database Upgrades - Database Updates

Source code - Multiple Tables and Database Upgrades - Saving the Timing Data

Source code - Multiple Tables and Database Upgrades - The saveTiming Function

Source code - Multiple Tables and Database Upgrades - Testing Timings

Source code - Multiple Tables and Database Upgrades - Providing Feedback

Source code - Multiple Tables and Database Upgrades - Data Loss

Source code - Multiple Tables and Database Upgrades - Storing the Current Timing Records

Source code - Multiple Tables and Database Upgrades - Solution - Retrieving the Current Time Record

Source code - Multiple Tables and Database Upgrades - Solution Continued

Source code - Multiple Tables and Database Upgrades - Finish Solution and Test

Source code - Multiple Tables and Database Upgrades - When the Battery Dies


16. Reports

Source code - Reports - Creating Test Data

Source code - Reports - Generating the Test Data

Source code - Reports - Debug and Release Builds

Source code - Reports - Using a SQLite view

Source code - Reports - Adding the view to the Database

Source code - Reports - Adding the view to the ContentProvider

Source code - Reports - Testing the Database Upgrade

Source code - Reports - ConstraintLayout Chains

Source code - Reports - Chain Types

Source code - Reports - Finishing the reports layouts - challenge

Source code - Reports - The Landscape Layouts

Source code - Reports - The Report Adapter

Source code - Reports - The Durations Report Activity

Source code - Reports - Testing Different Locales

Source code - Reports - Creating the reports ViewModel

Source code - Reports - Using the DurationsViewModel

Source code - Reports - Sorting the Report Data

Source code - Reports - Vector Drawables and Asset Studio

Source code - Reports - The Report Menu

Source code - Reports - Report Menu Code - day/week toggle

Source code - Reports - The DatePickerDialog

Source code - Reports - Filtering by Date

Source code - Reports - Filtering in the DurationsViewModel

Source code - Reports - Testing the Report Filters

Source code - Reports - Unbuggy DatePickerDialog

Source code - Reports - Deleting old Timings data

Source code - Reports - Testing Mass Deletion

Source code - Reports - Observing the cursor in the ViewModel

Source code - Reports - A Minor Bug

Source code - Reports - Observing a Configuration Change

Source code - Reports - Testing the Bug Fix

Source code - Reports - Using the First Day Of Week Setting

Source code - Reports - Taking Advantage of Later Features

Source code - Reports - Testing the new DatePickerFragment

Source code - Reports - Observing SharedPreference changes

Source code - Reports - Solution to Ignore Short Timings Challenge


17. Tidying up

Source code - Tidying up - Introduction

Source code - Tidying up - Plugin and Library Versions

Source code - Tidying up - Code Review

Source code - Tidying up - Code Review - The AppProvider Class

Source code - Tidying up - Code Review - CursorRecyclerViewAdapter, DurationsReport, and the ViewModels

Source code - Tidying up - Code Review - MainActivity and the Contract classes

Source code - Tidying up - Kotlin and ViewModels

Source code - Tidying up - Another Breaking Change

Source code - Tidying up - Improvements to coroutines in a ViewModel

Source code - Tidying up - Dispatchers

Source code - Tidying up - Coroutines Dont Block

Source code - Tidying up - Bug Fixes and Ideas for Improvements

Source code - Tidying up - Prevent Deletion of Edited Task

Source code - Tidying up - Implementing Delete by Swiping - Part 1

Source code - Tidying up - Implementing Delete by Swiping - Part 2

Source code - Tidying up - Implementing Delete by Swiping - Part 3

Source code - Tidying up - Challenge - Bug Fix

Source code - Tidying up - Challenge - Deleting a task that's being timed

Source code - Tidying up - Parameterised Queries

Source code - Tidying up - Adding the Parameters Table

Source code - Tidying up - Using the Parameterised View in our ViewModels

Source code - Tidying up - Refreshing the Report

Source code - Tidying up - Collation