auto import from //depot/cupcake/@135843
diff --git a/simulator/app/PhoneCollection.cpp b/simulator/app/PhoneCollection.cpp
new file mode 100644
index 0000000..5cddfa8
--- /dev/null
+++ b/simulator/app/PhoneCollection.cpp
@@ -0,0 +1,174 @@
+//
+// Copyright 2005 The Android Open Source Project
+//
+// Our collection of devices.
+//
+
+// For compilers that support precompilation, include "wx/wx.h".
+#include "wx/wxprec.h"
+
+// Otherwise, include all standard headers
+#ifndef WX_PRECOMP
+# include "wx/wx.h"
+#endif
+//#include "wx/image.h"   // needed for Windows build
+
+
+#include "PhoneCollection.h"
+#include "PhoneData.h"
+#include "MyApp.h"
+
+#include <utils.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <assert.h>
+
+using namespace android;
+
+/*static*/ PhoneCollection* PhoneCollection::mpInstance = NULL;
+
+/*static*/ const char* PhoneCollection::kLayoutFile = "layout.xml";
+
+
+/*
+ * (Re-)scan the specified directory for phones.  We register a hit if we can
+ * see a file called "<directory>/layout.xml".
+ */
+void PhoneCollection::ScanForPhones(const char* directory)
+{
+    /*
+     * Scan through the directory and find everything that looks like it
+     * might hold phone data.
+     */
+    StringArray strArr;
+
+#ifdef BEFORE_ASSET
+    DIR* dirp;
+    struct dirent* entp;
+
+    dirp = opendir(directory);
+    if (dirp == NULL) {
+        char buf[512];
+        fprintf(stderr, "ERROR: unable to scan directory '%s' for phone data\n",
+            directory);
+        fprintf(stderr, "Current dir is %s\n", getcwd(buf, sizeof(buf)));
+        return;
+    }
+
+    while (1) {
+        wxString dirName;
+        wxString fileName;
+
+        entp = readdir(dirp);
+        if (entp == NULL)
+            break;              // done with scan
+        dirName = directory;
+        dirName += '/';
+        dirName += entp->d_name;
+        fileName = dirName;
+        fileName += '/';
+        fileName += kLayoutFile;
+
+        if (access(fileName, R_OK) == 0) {
+            strArr.push_back(dirName);
+            //printf("--- examining '%s'\n", (const char*) fileName);
+        }
+    }
+    closedir(dirp);
+#else
+    android::AssetManager* pAssetMgr = ((MyApp*)wxTheApp)->GetAssetManager();
+    android::AssetDir* pDir;
+    int i, count;
+
+    pDir = pAssetMgr->openDir("");
+    assert(pDir != NULL);
+    count = pDir->getFileCount();
+
+    for (i = 0; i < count; i++) {
+        android::String8 layoutPath;
+
+        if (pDir->getFileType(i) != kFileTypeDirectory)
+            continue;
+
+        layoutPath = pDir->getFileName(i);
+        layoutPath.appendPath(kLayoutFile);
+
+        if (pAssetMgr->getFileType(layoutPath.string()) == kFileTypeRegular) {
+            strArr.push_back(pDir->getFileName(i).string());
+            printf("--- examining '%s'\n", layoutPath.string());
+        }
+    }
+
+    delete pDir;
+#endif
+
+    if (strArr.size() == 0) {
+        fprintf(stderr, "ERROR: no phone data found in '%s'\n", directory);
+        return;
+    }
+
+    /*
+     * Found some candidates.  If they parse successfully, add them to
+     * our list.
+     *
+     * We sort them first, because it's nice when everybody's user
+     * interface looks the same.  Note we're sorting the directory name,
+     * so it's possible to define a sort order in the filesystem that
+     * doesn't require messing up the phone's title string.
+     */
+    mPhoneList.clear();
+    strArr.sort(StringArray::cmpAscendingAlpha);
+
+    for (int i = 0; i < strArr.size(); i++) {
+        PhoneData tmpPhone;
+
+        if (!tmpPhone.Create(strArr.getEntry(i))) {
+            fprintf(stderr, "Sim: Abandoning phone '%s'\n", strArr.getEntry(i));
+            //strArr.erase(i);
+            //i--;
+        } else {
+            if (GetPhoneData(tmpPhone.GetName()) != NULL) {
+                fprintf(stderr, "Sim: ERROR: duplicate name '%s' in '%s'\n",
+                    tmpPhone.GetName(), strArr.getEntry(i));
+            } else {
+                mPhoneList.push_back(tmpPhone);
+            }
+        }
+    }
+}
+
+
+/*
+ * Return the Nth member of the phone data array.  (Replace w/Vector.)
+ */
+PhoneData* PhoneCollection::GetPhoneData(int idx)
+{
+    typedef List<PhoneData>::iterator Iter;
+
+    for (Iter ii = mPhoneList.begin(); ii != mPhoneList.end(); ++ii) {
+        if (idx == 0)
+            return &(*ii);
+        --idx;
+    }
+    return NULL;
+}
+
+/*
+ * Return the entry whose phone data name matches "name".
+ */
+PhoneData* PhoneCollection::GetPhoneData(const char* name)
+{
+    typedef List<PhoneData>::iterator Iter;
+
+    for (Iter ii = mPhoneList.begin(); ii != mPhoneList.end(); ++ii) {
+        if (strcasecmp((*ii).GetName(), name) == 0)
+            return &(*ii);
+    }
+    return NULL;
+}
+