public void WaitUntilDeviceVibrate(int timeoutMs)
        {
            int threadSleepTimeMs = 100;
            int threadLoopCount   = timeoutMs / threadSleepTimeMs + 1;
            VibrationEventListener eventListener = new VibrationEventListener();

            try
            {
                if (mDevice.RegisterHardwareEvent(GameDevice.HW_EVENT_VIBRATOR, eventListener) < 0)
                {
                    Log.E(TAG, "could not register vibrator event.");
                    return;
                }

                while (threadLoopCount-- > 0)
                {
                    if (eventListener.GetVibrated())
                    {
                        Log.D(TAG, "detect vibration, end event pulling looping");
                        return;
                    }
                    Thread.Sleep(threadSleepTimeMs);
                }
            }
            finally
            { // note that the exception will be rethrown
                mDevice.DeregisterHardwareEvent(GameDevice.HW_EVENT_VIBRATOR, eventListener);
            }
        }
        public ScreenColor GetColorOnScreen(int index, ScreenCoord src, bool refresh)
        {
            FileStream dumpFile;
            int        offset, ret = 0;

            byte[] colorInfo = new byte[4];

            offset = CalculateOffset(src);
            ScreenColor dest = new ScreenColor();

            try
            {
                if (refresh)
                {
                    ret = RequestRefresh();
                }

                dumpFile = mDevice.ScreenshotOpen(index);
                if (dumpFile == null)
                {
                    throw new Exception();
                }
                dumpFile.Seek(offset, SeekOrigin.Begin);
                dumpFile.Read(colorInfo, 0, 4);
                dest.r = colorInfo[0];
                dest.g = colorInfo[1];
                dest.b = colorInfo[2];
                dest.t = colorInfo[3];
            }
            catch (IOException e)
            {
                Log.E(TAG, "File operation failed: " + e.ToString());
                throw new JoshGameLibrary20.ScreenshotErrorException("screenshot error", ret);
            }
            catch (ThreadInterruptedException e)
            {
                Log.E(TAG, "File operation aborted by interrupt: " + e.ToString());
                throw e;
            }

            return(dest);
        }