when a download fails, store the error msg in db
Vasu Nori [Thu, 11 Nov 2010 23:26:07 +0000 (15:26 -0800)]
useful for debugging for bugs like bug:3187299
without this error message, one doesn't know WHY downloads
fail.
to prevent PII info in database,
there is a STOPSHIP comment around storage of this error
message in database.

Change-Id: I612e383aef8483b68b772f70dff722a5daea2ef5

src/com/android/providers/downloads/DownloadProvider.java
src/com/android/providers/downloads/DownloadThread.java

index 1aa9a0b..7954467 100644 (file)
@@ -58,7 +58,7 @@ public final class DownloadProvider extends ContentProvider {
     /** Database filename */
     private static final String DB_NAME = "downloads.db";
     /** Current database version */
-    private static final int DB_VERSION = 106;
+    private static final int DB_VERSION = 107;
     /** Name of table in the database */
     private static final String DB_TABLE = "downloads";
 
@@ -286,6 +286,10 @@ public final class DownloadProvider extends ContentProvider {
                             "BOOLEAN NOT NULL DEFAULT 0");
                     break;
 
+                case 107:
+                    addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_ERROR_MSG, "TEXT");
+                    break;
+
                 default:
                     throw new IllegalStateException("Don't know how to upgrade to " + version);
             }
index f6f511e..0eea6c7 100644 (file)
@@ -29,6 +29,7 @@ import android.os.PowerManager;
 import android.os.Process;
 import android.provider.Downloads;
 import android.provider.DrmStore;
+import android.text.TextUtils;
 import android.util.Log;
 import android.util.Pair;
 
@@ -148,6 +149,7 @@ public class DownloadThread extends Thread {
         AndroidHttpClient client = null;
         PowerManager.WakeLock wakeLock = null;
         int finalStatus = Downloads.Impl.STATUS_UNKNOWN_ERROR;
+        String errorMsg = null;
 
         try {
             PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
@@ -187,11 +189,12 @@ public class DownloadThread extends Thread {
             finalStatus = Downloads.Impl.STATUS_SUCCESS;
         } catch (StopRequest error) {
             // remove the cause before printing, in case it contains PII
-            Log.w(Constants.TAG,
-                    "Aborting request for download " + mInfo.mId + ": " + error.getMessage());
+            errorMsg = "Aborting request for download " + mInfo.mId + ": " + error.getMessage();
+            Log.w(Constants.TAG, errorMsg);
             finalStatus = error.mFinalStatus;
             // fall through to finally block
         } catch (Throwable ex) { //sometimes the socket code throws unchecked exceptions
+            errorMsg = "Exception for id " + mInfo.mId + ": " + ex.getMessage();
             Log.w(Constants.TAG, "Exception for id " + mInfo.mId + ": " + ex);
             finalStatus = Downloads.Impl.STATUS_UNKNOWN_ERROR;
             // falls through to the code that reports an error
@@ -207,7 +210,7 @@ public class DownloadThread extends Thread {
             cleanupDestination(state, finalStatus);
             notifyDownloadCompleted(finalStatus, state.mCountRetry, state.mRetryAfter,
                                     state.mRedirectCount, state.mGotData, state.mFilename,
-                                    state.mNewUri, state.mMimeType);
+                                    state.mNewUri, state.mMimeType, errorMsg);
             mInfo.mHasActiveThread = false;
         }
     }
@@ -686,7 +689,8 @@ public class DownloadThread extends Thread {
         } else {
             finalStatus = Downloads.Impl.STATUS_UNHANDLED_HTTP_CODE;
         }
-        throw new StopRequest(finalStatus, "http error " + statusCode);
+        throw new StopRequest(finalStatus, "http error " + statusCode + ", mContinuingDownload: " +
+                innerState.mContinuingDownload);
     }
 
     /**
@@ -861,9 +865,10 @@ public class DownloadThread extends Thread {
      */
     private void notifyDownloadCompleted(
             int status, boolean countRetry, int retryAfter, int redirectCount, boolean gotData,
-            String filename, String uri, String mimeType) {
+            String filename, String uri, String mimeType, String errorMsg) {
         notifyThroughDatabase(
-                status, countRetry, retryAfter, redirectCount, gotData, filename, uri, mimeType);
+                status, countRetry, retryAfter, redirectCount, gotData, filename, uri, mimeType,
+                errorMsg);
         if (Downloads.Impl.isStatusCompleted(status)) {
             mInfo.sendIntentIfRequested();
         }
@@ -871,7 +876,7 @@ public class DownloadThread extends Thread {
 
     private void notifyThroughDatabase(
             int status, boolean countRetry, int retryAfter, int redirectCount, boolean gotData,
-            String filename, String uri, String mimeType) {
+            String filename, String uri, String mimeType, String errorMsg) {
         ContentValues values = new ContentValues();
         values.put(Downloads.Impl.COLUMN_STATUS, status);
         values.put(Downloads.Impl._DATA, filename);
@@ -888,7 +893,11 @@ public class DownloadThread extends Thread {
         } else {
             values.put(Constants.FAILED_CONNECTIONS, mInfo.mNumFailed + 1);
         }
-
+        // STOPSHIP begin delete the following lines
+        if (!TextUtils.isEmpty(errorMsg)) {
+            values.put(Downloads.Impl.COLUMN_ERROR_MSG, errorMsg);
+        }
+        // STOPSHIP end
         mContext.getContentResolver().update(mInfo.getAllDownloadsUri(), values, null, null);
     }