SDK Updater: Better handling of fetch errors.

The remote page now shows fetch errors in the tree.
Using refresh tries to reload error sources.
diff --git a/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/RepoSource.java b/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/RepoSource.java
index 498cfab..b83ebc7 100755
--- a/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/RepoSource.java
+++ b/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/RepoSource.java
@@ -51,6 +51,7 @@
 

     private Package[] mPackages;

     private String mDescription;

+    private String mFetchError;

 

     /**

      * Constructs a new source for the given repository URL.

@@ -97,6 +98,14 @@
     }

 

     /**

+     * Returns the last fetch error description.

+     * If there was no error, returns null.

+     */

+    public String getFetchError() {

+        return mFetchError;

+    }

+

+    /**

      * Tries to fetch the repository index for the given URL.

      */

     public void load(ITaskMonitor monitor, boolean forceHttp) {

@@ -104,6 +113,8 @@
         monitor.setProgressMax(4);

 

         setDefaultDescription();

+        mFetchError = null;        // reset fetch error

+

 

         String url = mUrl;

         if (forceHttp) {

@@ -117,6 +128,8 @@
 

         if (xml == null) {

             mDescription += String.format("\nFailed to fetch URL %1$s", url);

+            mFetchError = "Failed to fetch URL";

+            monitor.setResult("Failed to fetch URL %1$s", url);

             return;

         }

 

@@ -125,6 +138,8 @@
 

         if (!validateXml(xml, monitor)) {

             mDescription += String.format("\nFailed to validate XML at %1$s", url);

+            mFetchError = "Failed to validate XML";

+            monitor.setResult("\nFailed to validate XML at %1$s", url);

             return;

         }

 

diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RepoSourcesAdapter.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RepoSourcesAdapter.java
index c22f456..18afd42 100755
--- a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RepoSourcesAdapter.java
+++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RepoSourcesAdapter.java
@@ -36,10 +36,28 @@
  *

  * This implementation is UI dependent.

  */

-class RepoSourcesAdapter {

+public class RepoSourcesAdapter {

 

     private final UpdaterData mUpdaterData;

 

+    public static class RepoSourceError implements IDescription {

+

+        private final RepoSource mSource;

+

+        public RepoSourceError(RepoSource source) {

+            mSource = source;

+        }

+

+        public String getLongDescription() {

+            return mSource.getLongDescription();

+        }

+

+        public String getShortDescription() {

+            return mSource.getFetchError();

+        }

+    }

+

+

     public RepoSourcesAdapter(UpdaterData updaterData) {

         mUpdaterData = updaterData;

     }

@@ -55,7 +73,7 @@
 

     // ------------

 

-    public class ViewerLabelProvider extends LabelProvider {

+    private class ViewerLabelProvider extends LabelProvider {

 

         /** Returns an image appropriate for this element. */

         @Override

@@ -119,8 +137,7 @@
                 final RepoSource source = (RepoSource) parentElement;

                 Package[] packages = source.getPackages();

 

-                if (packages == null) {

-

+                if (packages == null && source.getFetchError() == null) {

                     final boolean forceHttp = mUpdaterData.getSettingsController().getForceHttp();

 

                     mUpdaterData.getTaskFactory().start("Loading Source", new ITask() {

@@ -133,6 +150,9 @@
                 }

                 if (packages != null) {

                     return packages;

+                } else if (source.getFetchError() != null) {

+                    // Return a dummy entry to display the fetch error

+                    return new Object[] { new RepoSourceError(source) };

                 }

 

             } else if (parentElement instanceof Package) {

diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java
index 109000b..62298d8 100755
--- a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java
+++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java
@@ -359,7 +359,9 @@
                 RepoSource[] sources = mSources.getSources();

                 monitor.setProgressMax(sources.length);

                 for (RepoSource source : sources) {

-                    if (forceFetching || source.getPackages() != null) {

+                    if (forceFetching ||

+                            source.getPackages() != null ||

+                            source.getFetchError() != null) {

                         source.load(monitor.createSubMonitor(1), forceHttp);

                     }

                     monitor.incProgress(1);

diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java
index d4c74d7..bd39c5e 100755
--- a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java
+++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java
@@ -24,6 +24,7 @@
 import com.android.sdklib.internal.repository.PlatformPackage;

 import com.android.sdklib.internal.repository.RepoSource;

 import com.android.sdklib.internal.repository.ToolPackage;

+import com.android.sdkuilib.internal.repository.RepoSourcesAdapter;

 

 import org.eclipse.swt.SWTException;

 import org.eclipse.swt.graphics.Image;

@@ -92,6 +93,9 @@
         if (object instanceof RepoSource) {

             return getImageByName("source_icon16.png");

 

+        } else if (object instanceof RepoSourcesAdapter.RepoSourceError) {

+            return getImageByName("error_icon16.png");

+

         } else if (object instanceof PlatformPackage) {

             return getImageByName("android_icon_16.png");

 

diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/error_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/error_icon16.png
new file mode 100755
index 0000000..ccb4d0a
--- /dev/null
+++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/error_icon16.png
Binary files differ