@Override
  public boolean onInfo(MediaPlayer mp, int what, int extra) {
    String msg = "Unknown media issue.";

    switch (what) {
      case MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING:
        msg = "Stream not interleaved or interleaved improperly.";
        break;
      case MediaPlayer.MEDIA_INFO_NOT_SEEKABLE:
        msg = "Stream does not support seeking";
        break;
      case MediaPlayer.MEDIA_INFO_UNKNOWN:
        msg = "Unknown media issue";
        break;
      case MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING:
        msg = "Video is too complex for decoder, video lagging."; // shouldn't occur, but covering
        // bases.
        break;
    }

    KrollDict data = new KrollDict();
    data.put("code", 0);
    data.put("message", msg);
    proxy.fireEvent(EVENT_ERROR, data);

    return true;
  }
 public boolean fireAppEvent(KrollInvocation invocation, String eventName, KrollDict data) {
   boolean handled = false;
   for (KrollProxy appEventProxy : appEventProxies) {
     boolean proxyHandled = appEventProxy.fireEvent(eventName, data);
     handled = handled || proxyHandled;
   }
   return handled;
 }
  @Override
  public boolean onError(MediaPlayer mp, int what, int extra) {
    int code = 0;
    String msg = "Unknown media error.";
    if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
      msg = "Media server died";
    }
    release();

    KrollDict data = new KrollDict();
    data.put("code", code);
    data.put("message", msg);
    proxy.fireEvent(EVENT_ERROR, data);

    return true;
  }
  private void setState(int state) {
    proxy.setProperty("state", state);
    String stateDescription = "";

    switch (state) {
      case STATE_BUFFERING:
        stateDescription = STATE_BUFFERING_DESC;
        break;
      case STATE_INITIALIZED:
        stateDescription = STATE_INITIALIZED_DESC;
        break;
      case STATE_PAUSED:
        stateDescription = STATE_PAUSED_DESC;
        break;
      case STATE_PLAYING:
        stateDescription = STATE_PLAYING_DESC;
        break;
      case STATE_STARTING:
        stateDescription = STATE_STARTING_DESC;
        break;
      case STATE_STOPPED:
        stateDescription = STATE_STOPPED_DESC;
        break;
      case STATE_STOPPING:
        stateDescription = STATE_STOPPING_DESC;
        break;
      case STATE_WAITING_FOR_DATA:
        stateDescription = STATE_WAITING_FOR_DATA_DESC;
        break;
      case STATE_WAITING_FOR_QUEUE:
        stateDescription = STATE_WAITING_FOR_QUEUE_DESC;
        break;
    }

    proxy.setProperty("stateDescription", stateDescription);
    if (DBG) {
      Log.d(LCAT, "Audio state changed: " + stateDescription);
    }

    KrollDict data = new KrollDict();
    data.put("state", state);
    data.put("description", stateDescription);
    proxy.fireEvent(EVENT_CHANGE, data);
  }
 public void onCompletion(MediaPlayer mp) {
   proxy.fireEvent(EVENT_COMPLETE, null);
   stop();
 }
  @Override
  public boolean dispatchKeyEvent(KeyEvent event) {
    boolean handled = false;

    TiViewProxy window;
    if (this.window != null) {
      window = this.window;
    } else {
      window = this.view;
    }

    if (window == null) {
      return super.dispatchKeyEvent(event);
    }

    switch (event.getKeyCode()) {
      case KeyEvent.KEYCODE_BACK:
        {
          if (event.getAction() == KeyEvent.ACTION_UP) {
            String backEvent = "android:back";
            KrollProxy proxy = null;
            // android:back could be fired from a tabGroup window (activityProxy)
            // or hw window (window).This event is added specifically to the activity
            // proxy of a tab group in window.js
            if (activityProxy.hasListeners(backEvent)) {
              proxy = activityProxy;
            } else if (window.hasListeners(backEvent)) {
              proxy = window;
            }

            if (proxy != null) {
              proxy.fireEvent(backEvent, null);
              handled = true;
            }
          }
          break;
        }
      case KeyEvent.KEYCODE_CAMERA:
        {
          if (window.hasListeners(TiC.EVENT_ANDROID_CAMERA)) {
            if (event.getAction() == KeyEvent.ACTION_UP) {
              window.fireEvent(TiC.EVENT_ANDROID_CAMERA, null);
            }
            handled = true;
          }
          // TODO: Deprecate old event
          if (window.hasListeners("android:camera")) {
            if (event.getAction() == KeyEvent.ACTION_UP) {
              window.fireEvent("android:camera", null);
            }
            handled = true;
          }

          break;
        }
      case KeyEvent.KEYCODE_FOCUS:
        {
          if (window.hasListeners(TiC.EVENT_ANDROID_FOCUS)) {
            if (event.getAction() == KeyEvent.ACTION_UP) {
              window.fireEvent(TiC.EVENT_ANDROID_FOCUS, null);
            }
            handled = true;
          }
          // TODO: Deprecate old event
          if (window.hasListeners("android:focus")) {
            if (event.getAction() == KeyEvent.ACTION_UP) {
              window.fireEvent("android:focus", null);
            }
            handled = true;
          }

          break;
        }
      case KeyEvent.KEYCODE_SEARCH:
        {
          if (window.hasListeners(TiC.EVENT_ANDROID_SEARCH)) {
            if (event.getAction() == KeyEvent.ACTION_UP) {
              window.fireEvent(TiC.EVENT_ANDROID_SEARCH, null);
            }
            handled = true;
          }
          // TODO: Deprecate old event
          if (window.hasListeners("android:search")) {
            if (event.getAction() == KeyEvent.ACTION_UP) {
              window.fireEvent("android:search", null);
            }
            handled = true;
          }

          break;
        }
      case KeyEvent.KEYCODE_VOLUME_UP:
        {
          if (window.hasListeners(TiC.EVENT_ANDROID_VOLUP)) {
            if (event.getAction() == KeyEvent.ACTION_UP) {
              window.fireEvent(TiC.EVENT_ANDROID_VOLUP, null);
            }
            handled = true;
          }
          // TODO: Deprecate old event
          if (window.hasListeners("android:volup")) {
            if (event.getAction() == KeyEvent.ACTION_UP) {
              window.fireEvent("android:volup", null);
            }
            handled = true;
          }

          break;
        }
      case KeyEvent.KEYCODE_VOLUME_DOWN:
        {
          if (window.hasListeners(TiC.EVENT_ANDROID_VOLDOWN)) {
            if (event.getAction() == KeyEvent.ACTION_UP) {
              window.fireEvent(TiC.EVENT_ANDROID_VOLDOWN, null);
            }
            handled = true;
          }
          // TODO: Deprecate old event
          if (window.hasListeners("android:voldown")) {
            if (event.getAction() == KeyEvent.ACTION_UP) {
              window.fireEvent("android:voldown", null);
            }
            handled = true;
          }

          break;
        }
    }

    if (!handled) {
      handled = super.dispatchKeyEvent(event);
    }

    return handled;
  }