diff --git a/src/com/android/retaildemo/DownloadVideoTask.java b/src/com/android/retaildemo/DownloadVideoTask.java
index d7133a6..9170b1e 100644
--- a/src/com/android/retaildemo/DownloadVideoTask.java
+++ b/src/com/android/retaildemo/DownloadVideoTask.java
@@ -138,8 +138,19 @@
 
             final long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
             if (id == mVideoDownloadId) {
-                if (checkDownloadsAndSetVideo(id) && mProgressDialog != null) {
-                    mProgressDialog.dismiss();
+                final int status = checkDownloadsAndSetVideo(id);
+                if (status == DownloadManager.STATUS_SUCCESSFUL ||
+                        status == DownloadManager.STATUS_FAILED) {
+                    if (mProgressDialog != null) {
+                        mProgressDialog.dismiss();
+                    }
+                    if (mDownloadReceiver != null) {
+                        mContext.unregisterReceiver(mDownloadReceiver);
+                        mDownloadReceiver = null;
+                    }
+                    if (status == DownloadManager.STATUS_FAILED) {
+                        mListener.onError();
+                    }
                 }
             } else if (id == mVideoUpdateDownloadId) {
                 mHandler.sendMessage(mHandler.obtainMessage(MSG_DOWNLOAD_COMPLETE));
@@ -211,18 +222,15 @@
         }
     }
 
-    private boolean checkDownloadsAndSetVideo(long downloadId) {
+    private int checkDownloadsAndSetVideo(long downloadId) {
         final DownloadManager.Query query =
                 new DownloadManager.Query().setFilterById(downloadId);
         Cursor cursor = mDlm.query(query);
         try {
             if (cursor != null & cursor.moveToFirst()) {
                 final int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
-                if (cursor.getInt(columnIndex) == DownloadManager.STATUS_SUCCESSFUL) {
-                    if (mDownloadReceiver != null) {
-                        mContext.unregisterReceiver(mDownloadReceiver);
-                        mDownloadReceiver = null;
-                    }
+                final int status = cursor.getInt(columnIndex);
+                if (status == DownloadManager.STATUS_SUCCESSFUL) {
                     final String fileUri = cursor.getString(
                             cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                     mDownloadedPath = Uri.parse(fileUri).getPath();
@@ -230,8 +238,8 @@
                     mListener.onFileDownloaded(mDownloadedPath);
                     mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CLEANUP_DOWNLOAD_DIR),
                             CLEANUP_DELAY_MILLIS);
-                    return true;
                 }
+                return status;
             }
         } finally {
             if (cursor != null) {
@@ -242,7 +250,7 @@
                 mNetworkChangeReceiver = null;
             }
         }
-        return false;
+        return -1;
     }
 
     private class NetworkChangeReceiver extends BroadcastReceiver {
diff --git a/tests/src/com/android/retaildemo/DownloadVideoTaskTest.java b/tests/src/com/android/retaildemo/DownloadVideoTaskTest.java
index 67c5244..6684173 100644
--- a/tests/src/com/android/retaildemo/DownloadVideoTaskTest.java
+++ b/tests/src/com/android/retaildemo/DownloadVideoTaskTest.java
@@ -181,6 +181,35 @@
     }
 
     @Test
+    public void testDownloadVideo_downloadFailed() throws Exception {
+        final DownloadVideoTask task = new DownloadVideoTask(mContext,
+                mDownloadPath, mPreloadedVideo, mResultListener, new TestInjector(mContext));
+        when(mDownloadManager.enqueue(any(DownloadManager.Request.class)))
+                .thenReturn(TEST_DOWNLOAD_ID);
+
+        task.run();
+
+        final ArgumentCaptor<BroadcastReceiver> downloadReceiver =
+                verifyIfDownloadCompleteReceiverRegistered();
+
+        verify(mProgressDialog, times(1)).show();
+
+        final Cursor cursor = createCursor(DownloadManager.STATUS_FAILED, mDownloadPath);
+        when(mDownloadManager.query(any(DownloadManager.Query.class))).thenReturn(cursor);
+
+        final Intent downloadCompleteIntent = new Intent(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
+                .putExtra(DownloadManager.EXTRA_DOWNLOAD_ID, TEST_DOWNLOAD_ID);
+        downloadReceiver.getValue().onReceive(mContext, downloadCompleteIntent);
+
+        verify(mContext).unregisterReceiver(downloadReceiver.getValue());
+
+        verify(mResultListener, times(1)).onError();
+        verifyNoMoreInteractions(mResultListener);
+
+        verify(mProgressDialog, times(1)).dismiss();
+    }
+
+    @Test
     public void testDownloadUpdatedVideo() throws Exception {
         new File(mDownloadPath).createNewFile();
 
