SDK Updater: samples support.

- Scan unknown /samples folders.
- Sample icon for package list.
- Renamed all package icons to <name>_pkg_16.png to simplify loader.

Bug: 2384690

Change-Id: I4deb11c37918e75357b3bb5212f0007126a8f3de
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/LocalSdkParser.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/LocalSdkParser.java
index b92f771..1fe7fa0 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/LocalSdkParser.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/LocalSdkParser.java
@@ -106,17 +106,17 @@
                         // Get the samples dir for a platform if it is located in the new

                         // root /samples dir. We purposely ignore "old" samples that are

                         // located under the platform dir.

-                        String s = target.getPath(IAndroidTarget.SAMPLES);

-                        File f = new File(s);

-                        if (f.exists() && f.getParentFile().equals(samplesRoot)) {

-                            Properties props2 = parseProperties(

-                                    new File(f, SdkConstants.FN_SOURCE_PROP));

-                            SamplePackage pkg2 = new SamplePackage(target, props2);

-                            packages.add(pkg2);

-                            visited.add(f);

+                        File samplesDir = new File(target.getPath(IAndroidTarget.SAMPLES));

+                        if (samplesDir.exists() && samplesDir.getParentFile().equals(samplesRoot)) {

+                            Properties samplesProps = parseProperties(

+                                    new File(samplesDir, SdkConstants.FN_SOURCE_PROP));

+                            if (samplesProps != null) {

+                                SamplePackage pkg2 = new SamplePackage(target, samplesProps);

+                                packages.add(pkg2);

+                            }

+                            visited.add(samplesDir);

                         }

                     }

-

                 } else {

                     pkg = new AddonPackage(target, props);

                 }

@@ -130,28 +130,30 @@
             }

         }

 

-        scanExtra(osSdkRoot, visited, packages, log);

-

-        // TODO scanSample folder for samples that have not been visited yet

-        // (e.g. for platforms that are not installed)

+        scanMissingSamples(osSdkRoot, visited, packages, log);

+        scanExtras(osSdkRoot, visited, packages, log);

 

         mPackages = packages.toArray(new Package[packages.size()]);

         return mPackages;

     }

 

     /**

-     * Find any other directory what we haven't successfully visited and

-     * assume they contain extra packages.

-     * @param log

+     * Find any other directory <em>at the top level</em> that hasn't been visited yet

+     * and assume they contain extra packages. This is <em>not</em> a recursive search.

      */

-    private void scanExtra(String osSdkRoot,

+    private void scanExtras(String osSdkRoot,

             HashSet<File> visited,

             ArrayList<Package> packages,

             ISdkLog log) {

         File root = new File(osSdkRoot);

+

+        if (!root.isDirectory()) {

+            // This should not happen. It makes listFiles() return null so let's avoid it.

+            return;

+        }

+

         for (File dir : root.listFiles()) {

             if (dir.isDirectory() && !visited.contains(dir)) {

-

                 Properties props = parseProperties(new File(dir, SdkConstants.FN_SOURCE_PROP));

                 if (props != null) {

                     try {

@@ -171,6 +173,7 @@
                         // We only accept this as an extra package if it has a valid local path.

                         if (pkg.isPathValid()) {

                             packages.add(pkg);

+                            visited.add(dir);

                         }

                     } catch (Exception e) {

                         log.error(e, null);

@@ -181,6 +184,40 @@
     }

 

     /**

+     * Find any other sub-directories under the /samples root that hasn't been visited yet

+     * and assume they contain sample packages. This is <em>not</em> a recursive search.

+     * <p/>

+     * The use case is to find samples dirs under /samples when their target isn't loaded.

+     */

+    private void scanMissingSamples(String osSdkRoot,

+            HashSet<File> visited,

+            ArrayList<Package> packages,

+            ISdkLog log) {

+        File root = new File(osSdkRoot);

+        root = new File(root, SdkConstants.FD_SAMPLES);

+

+        if (!root.isDirectory()) {

+            // It makes listFiles() return null so let's avoid it.

+            return;

+        }

+

+        for (File dir : root.listFiles()) {

+            if (dir.isDirectory() && !visited.contains(dir)) {

+                Properties props = parseProperties(new File(dir, SdkConstants.FN_SOURCE_PROP));

+                if (props != null) {

+                    try {

+                        SamplePackage pkg = new SamplePackage(dir.getAbsolutePath(), props);

+                        packages.add(pkg);

+                        visited.add(dir);

+                    } catch (Exception e) {

+                        log.error(e, null);

+                    }

+                }

+            }

+        }

+    }

+

+    /**

      * Try to find a tools package at the given location.

      * Returns null if not found.

      */

diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SamplePackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SamplePackage.java
index f4c64a2..33ffde1 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SamplePackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SamplePackage.java
@@ -111,16 +111,16 @@
      *                                 from properties.

      */

     SamplePackage(String archiveOsPath, Properties props) throws AndroidVersionException {

-        super(  null,                                   //source

-                props,                                  //properties

-                0,                                      //revision will be taken from props

-                null,                                   //license

-                null,                                   //description

-                null,                                   //descUrl

-                Os.ANY,                                 //archiveOs

-                Arch.ANY,                               //archiveArch

-                archiveOsPath                           //archiveOsPath

-                );

+        super(null,                                   //source

+              props,                                  //properties

+              0,                                      //revision will be taken from props

+              null,                                   //license

+              null,                                   //description

+              null,                                   //descUrl

+              Os.ANY,                                 //archiveOs

+              Arch.ANY,                               //archiveArch

+              archiveOsPath                           //archiveOsPath

+              );

 

         mVersion = new AndroidVersion(props);

 

diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java
index cbd846e..5111f49 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java
@@ -16,14 +16,9 @@
 

 package com.android.sdkuilib.internal.repository.icons;

 

-import com.android.sdklib.internal.repository.AddonPackage;

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

-import com.android.sdklib.internal.repository.DocPackage;

-import com.android.sdklib.internal.repository.ExtraPackage;

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

-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;

@@ -90,6 +85,18 @@
      *  expected file is missing.

      */

     public Image getImageForObject(Object object) {

+

+        if (object == null) {

+            return null;

+        }

+

+        String clz = object.getClass().getSimpleName();

+        if (clz.endsWith(Package.class.getSimpleName())) {

+            String name = clz.replaceFirst(Package.class.getSimpleName(), "").toLowerCase() + //$NON-NLS-1$

+                            "_pkg_16.png";                                      //$NON-NLS-1$

+            return getImageByName(name);

+        }

+

         if (object instanceof RepoSource) {

             return getImageByName("source_icon16.png");                         //$NON-NLS-1$

 

@@ -98,29 +105,16 @@
 

         } else if (object instanceof RepoSourcesAdapter.RepoSourceEmpty) {

             return getImageByName("nopkg_icon16.png");                          //$NON-NLS-1$

+        }

 

-        } else if (object instanceof PlatformPackage) {

-            return getImageByName("android_icon_16.png");                       //$NON-NLS-1$

-

-        } else if (object instanceof AddonPackage) {

-            return getImageByName("addon_icon16.png");                          //$NON-NLS-1$

-

-        } else if (object instanceof ToolPackage) {

-            return getImageByName("tool_icon16.png");                           //$NON-NLS-1$

-

-        } else if (object instanceof DocPackage) {

-            return getImageByName("doc_icon16.png");                            //$NON-NLS-1$

-

-        } else if (object instanceof ExtraPackage) {

-            return getImageByName("extra_icon16.png");                          //$NON-NLS-1$

-

-        } else if (object instanceof Archive) {

+        if (object instanceof Archive) {

             if (((Archive) object).isCompatible()) {

                 return getImageByName("archive_icon16.png");                    //$NON-NLS-1$

             } else {

                 return getImageByName("incompat_icon16.png");                   //$NON-NLS-1$

             }

         }

+

         return null;

     }

 

diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/addon_icon16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/addon_pkg_16.png
similarity index 100%
rename from sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/addon_icon16.png
rename to sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/addon_pkg_16.png
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/doc_icon16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/doc_icon16.png
deleted file mode 100755
index 8f56cb0..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/doc_icon16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/doc_pkg_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/doc_pkg_16.png
new file mode 100755
index 0000000..186b3b1
--- /dev/null
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/doc_pkg_16.png
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/extra_icon16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/extra_pkg_16.png
similarity index 100%
rename from sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/extra_icon16.png
rename to sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/extra_pkg_16.png
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/platform_pkg_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/platform_pkg_16.png
new file mode 100755
index 0000000..0b0744b
--- /dev/null
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/platform_pkg_16.png
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/sample_pkg_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/sample_pkg_16.png
new file mode 100755
index 0000000..8d31865
--- /dev/null
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/sample_pkg_16.png
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/tool_icon16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/tool_pkg_16.png
similarity index 100%
rename from sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/tool_icon16.png
rename to sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/tool_pkg_16.png
Binary files differ