auto import from //depot/cupcake/@135843
diff --git a/simulator/app/PhoneButton.cpp b/simulator/app/PhoneButton.cpp
new file mode 100644
index 0000000..eca7ddc
--- /dev/null
+++ b/simulator/app/PhoneButton.cpp
@@ -0,0 +1,180 @@
+//
+// Copyright 2005 The Android Open Source Project
+//
+// Simulated device data.
+//
+
+// 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 "LinuxKeys.h"
+#include "PhoneButton.h"
+
+using namespace android;
+
+
+/*
+ * Create a PhoneButton without a backing image.
+ */
+bool PhoneButton::Create(const char* label)
+{
+ assert(!mHasImage); // quick check for re-use
+
+ mKeyCode = LookupKeyCode(label);
+ if (mKeyCode == kKeyCodeUnknown) {
+ fprintf(stderr, "WARNING: key code '%s' not recognized\n", label);
+ // keep going
+ }
+
+ return true;
+}
+
+/*
+ * Create a PhoneButton with an associated image. Don't load the image yet.
+ */
+bool PhoneButton::Create(const char* label, const char* imageFileName,
+ int x, int y)
+{
+ if (!Create(label))
+ return false;
+
+ if (mSelectedImage.Create(imageFileName, x, y))
+ mHasImage = true;
+ else
+ fprintf(stderr, "Warning: image create (%s, %d, %d) failed\n",
+ imageFileName, x, y);
+
+ return true;
+}
+
+/*
+ * Load the image, if any.
+ */
+bool PhoneButton::LoadResources(void)
+{
+ if (!mHasImage)
+ return true; // no image associated with this button
+
+ bool result = mSelectedImage.LoadResources();
+ if (result)
+ CreateHighlightedBitmap();
+ return result;
+}
+
+/*
+ * Unload the image if we loaded one.
+ */
+bool PhoneButton::UnloadResources(void)
+{
+ if (!mHasImage)
+ return true;
+
+ return mSelectedImage.UnloadResources();
+}
+
+/* use an inline instead of macro so we don't evaluate args multiple times */
+static inline int MinVal(int a, int b) { return (a < b ? a : b); }
+
+/*
+ * Create the "highlighted" bitmap from the "selected" image.
+ */
+void PhoneButton::CreateHighlightedBitmap(void)
+{
+ wxBitmap* src = mSelectedImage.GetBitmap();
+ assert(src != NULL);
+ wxImage tmpImage = src->ConvertToImage();
+
+ unsigned char* pRGB = tmpImage.GetData(); // top-left RGBRGB...
+ int x, y;
+
+ /*
+ * Modify the color used for the "highlight" image.
+ */
+ for (y = tmpImage.GetHeight()-1; y >= 0; --y) {
+ for (x = tmpImage.GetWidth()-1; x >= 0; --x) {
+ *(pRGB) = MinVal(*(pRGB) + *(pRGB) / 8, 255);
+ *(pRGB+1) = MinVal(*(pRGB+1) + *(pRGB+1) / 8, 255);
+ *(pRGB+2) = *(pRGB+2) * 5 / 8;
+
+ pRGB += 3;
+ }
+ }
+
+ mHighlightedBitmap = wxBitmap(tmpImage);
+}
+
+/*
+ * Check to see if the button "collides" with the specified point.
+ *
+ * This is currently a simple rectangle check, but could be modified
+ * to take image transparency into account.
+ */
+bool PhoneButton::CheckCollision(int x, int y) const
+{
+ if (!mHasImage)
+ return false;
+
+ return (x >= mSelectedImage.GetX() &&
+ x < mSelectedImage.GetX() + mSelectedImage.GetWidth() &&
+ y >= mSelectedImage.GetY() &&
+ y < mSelectedImage.GetY() + mSelectedImage.GetHeight());
+}
+
+/*
+ * Look up a key code based on a string.
+ *
+ * Returns kKeyCodeUnknown if the label doesn't match anything.
+ */
+KeyCode PhoneButton::LookupKeyCode(const char* label) const
+{
+ static const struct {
+ const char* label;
+ int keyCode;
+ } codeList[] = {
+ { "soft-left", KEY_MENU },
+ { "soft-right", KEY_KBDILLUMUP },
+ { "home", KEY_HOME },
+ { "back", KEY_BACK },
+ { "call", KEY_F3 },
+ { "phone-dial", KEY_F3 },
+ { "end-call", KEY_F4 },
+ { "phone-hangup", KEY_F4 },
+ { "0", KEY_0 },
+ { "1", KEY_1 },
+ { "2", KEY_2 },
+ { "3", KEY_3 },
+ { "4", KEY_4 },
+ { "5", KEY_5 },
+ { "6", KEY_6 },
+ { "7", KEY_7 },
+ { "8", KEY_8 },
+ { "9", KEY_9 },
+ { "star", KEY_SWITCHVIDEOMODE },
+ { "pound", KEY_KBDILLUMTOGGLE },
+ { "dpad-up", KEY_UP },
+ { "dpad-down", KEY_DOWN },
+ { "dpad-left", KEY_LEFT },
+ { "dpad-right", KEY_RIGHT },
+ { "dpad-center", KEY_REPLY },
+ { "volume-up", KEY_VOLUMEUP },
+ { "volume-down", KEY_VOLUMEDOWN },
+ { "power", KEY_POWER },
+ { "camera", KEY_CAMERA },
+ //{ "clear", kKeyCodeClear },
+ };
+ const int numCodes = sizeof(codeList) / sizeof(codeList[0]);
+
+ for (int i = 0; i < numCodes; i++) {
+ if (strcmp(label, codeList[i].label) == 0)
+ return (KeyCode) codeList[i].keyCode;
+ }
+
+ return kKeyCodeUnknown;
+};
+