public void onWindowFocusChanged(boolean hasFocus) {
   super.onWindowFocusChanged(hasFocus);
   if (null == IOuyaActivity.GetUnityPlayer()) {
     Log.i("Unity", "IOuyaActivity.GetUnityPlayer() is null");
     return;
   }
   IOuyaActivity.GetUnityPlayer().windowFocusChanged(hasFocus);
 }
 // Pass any keys not handled by (unfocused) views straight to UnityPlayer
 public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) {
   if (null == IOuyaActivity.GetUnityPlayer()) {
     Log.i("Unity", "IOuyaActivity.GetUnityPlayer() is null");
     return false;
   }
   return IOuyaActivity.GetUnityPlayer().onKeyMultiple(keyCode, count, event);
 }
 public void onConfigurationChanged(Configuration newConfig) {
   super.onConfigurationChanged(newConfig);
   if (null == IOuyaActivity.GetUnityPlayer()) {
     Log.i("Unity", "IOuyaActivity.GetUnityPlayer() is null");
     return;
   }
   IOuyaActivity.GetUnityPlayer().configurationChanged(newConfig);
 }
  @Override
  public boolean onTrackballEvent(MotionEvent event) {
    if (null == IOuyaActivity.GetUnityPlayer()) {
      Log.i("Unity", "IOuyaActivity.GetUnityPlayer() is null");
      return false;
    }

    return IOuyaActivity.GetUnityPlayer().onTrackballEvent(event);
  }
  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (null == IOuyaActivity.GetUnityPlayer()) {
      Log.i("Unity", "IOuyaActivity.GetUnityPlayer() is null");
      return false;
    }

    return IOuyaActivity.GetUnityPlayer().onKeyDown(keyCode, event);
  }
  @Override
  public boolean onGenericMotionEvent(MotionEvent event) {
    if (null == IOuyaActivity.GetUnityPlayer()) {
      Log.i("Unity", "IOuyaActivity.GetUnityPlayer() is null");
      return false;
    }

    // return IOuyaActivity.GetUnityPlayer().onGenericMotionEvent(event);

    // rupert is awesome!!! workaround to not detecting axis input (3.5.7)
    return IOuyaActivity.GetUnityPlayer().onTouchEvent(event);
  }
  @Override
  protected void onDestroy() {
    TestOuyaFacade test = IOuyaActivity.GetTestOuyaFacade();
    if (null != test) {
      test.onDestroy();
    }

    if (null != IOuyaActivity.GetUnityPlayer()) {
      IOuyaActivity.GetUnityPlayer().quit();
    }

    super.onDestroy();
  }
  @Override
  public boolean onKeyUp(int keyCode, KeyEvent event) {
    // Log.i("Unity", "onKeyUp keyCode=" + keyCode);
    if (keyCode == OuyaController.BUTTON_MENU) {
      Log.i("Unity", "BroadcastReceiver tell Unity we see the menu button up");
      UnityPlayer.UnitySendMessage("OuyaGameObject", "onMenuButtonUp", "");
      Log.i("Unity", "BroadcastReceiver notified Unity onMenuButtonUp");
    }

    if (null == IOuyaActivity.GetUnityPlayer()) {
      Log.i("Unity", "IOuyaActivity.GetUnityPlayer() is null");
      return false;
    }

    return IOuyaActivity.GetUnityPlayer().onKeyUp(keyCode, event);
  }
  @Override
  public void onPause() {
    if (m_enableUnity) {
      UnityPlayer.UnitySendMessage("OuyaGameObject", "onPause", "");
    }

    Boolean isFinishing = isFinishing();
    if (m_enableLogging) {
      Log.i("Unity", "isFinishing=" + isFinishing);
    }
    if (isFinishing) {
      IOuyaActivity.GetUnityPlayer().quit();
    }

    IOuyaActivity.GetUnityPlayer().pause();

    super.onPause();
  }
  @Override
  public void onResume() {
    if (m_enableUnity) {
      UnityPlayer.UnitySendMessage("OuyaGameObject", "onResume", "");
    }

    super.onResume();

    IOuyaActivity.GetUnityPlayer().resume();
  }
  protected void onCreate(Bundle savedInstanceState) {
    // make activity accessible to Unity
    IOuyaActivity.SetActivity(this);

    // make bundle accessible to Unity
    IOuyaActivity.SetSavedInstanceState(savedInstanceState);

    super.onCreate(savedInstanceState);

    // load the raw resource for the application key
    try {
      InputStream inputStream = getResources().openRawResource(R.raw.key);
      byte[] applicationKey = new byte[inputStream.available()];
      inputStream.read(applicationKey);
      inputStream.close();
      IOuyaActivity.SetApplicationKey(applicationKey);
    } catch (IOException e) {
      e.printStackTrace();
    }

    // Create the UnityPlayer
    IOuyaActivity.SetUnityPlayer(new UnityPlayer(this));
    int glesMode = IOuyaActivity.GetUnityPlayer().getSettings().getInt("gles_mode", 1);
    boolean trueColor8888 = false;
    IOuyaActivity.GetUnityPlayer().init(glesMode, trueColor8888);
    setContentView(R.layout.main);

    // Add the Unity view
    FrameLayout layout = (FrameLayout) findViewById(R.id.unityLayout);
    LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    layout.addView(IOuyaActivity.GetUnityPlayer().getView(), 0, lp);
    IOuyaActivity.SetLayout(layout);

    // Set the focus
    RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.mainLayout);
    mainLayout.setFocusableInTouchMode(true);

    Context context = getBaseContext();

    // Init the controller
    OuyaController.init(context);
  }