Merge "Show the default wallpaper if downloading video fails."
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();