@Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
   switch (keyCode) {
     case KeyEvent.KEYCODE_VOLUME_DOWN:
     case KeyEvent.KEYCODE_VOLUME_UP:
     case KeyEvent.KEYCODE_VOLUME_MUTE:
     case KeyEvent.KEYCODE_DPAD_UP:
     case KeyEvent.KEYCODE_DPAD_DOWN:
     case KeyEvent.KEYCODE_DPAD_LEFT:
     case KeyEvent.KEYCODE_DPAD_RIGHT:
       /// M: Code analyze 010, fix bug ALPS00264030, no response for menu key @{
     case KeyEvent.KEYCODE_MENU:
       /// @}
       break;
     case KeyEvent.KEYCODE_BACK:
       if ((mSmilPlayer != null)
           && (mSmilPlayer.isPausedState()
               || mSmilPlayer.isPlayingState()
               || mSmilPlayer.isPlayedState())) {
         mSmilPlayer.stop();
       }
       break;
     default:
       if ((mSmilPlayer != null) && (mMediaController != null)) {
         mMediaController.show();
       }
   }
   return super.onKeyDown(keyCode, event);
 }
 @Override
 protected void onPause() {
   super.onPause();
   /// M: Code analyze 008, fix bug ALPS00236567, hide the mediaControl when activity paused
   /// so onTouchEvent excute show @{
   if (mMediaController != null) {
     /// M: Must do this so we don't leak a window.
     mMediaController.hide();
   }
   /// @}
   if (mSmilDoc != null) {
     ((EventTarget) mSmilDoc)
         .removeEventListener(SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT, this, false);
   }
   /// M: Code analyze 002, fix bug ALPS00111374, whether need resume @{
   if ((null != mSmilPlayer)) {
     if (mSmilPlayer.isPlayingState()) {
       mSmilPlayer.pause();
       bNeedResume = true;
     } else if (mSmilPlayer.isPausedState()) {
       bNeedResume = false;
     }
   }
   /// @}
 }
 public int getCurrentPosition() {
   /// M: Code analyze 005, fix bug ALPS00071669, Handel delay problem
   /// when progress bar update @{
   if (mPlayer != null) {
     return mPlayer.getCurrentPosition();
   } else {
     return 0;
   }
   /// @}
 }
 @Override
 protected void onStop() {
   super.onStop();
   /// M: Code analyze 009, fix bug ALPS00335430, should close in lockscreen @{
   /**
    * M: when this activity is invisiable, it should exit. though it has nohistory property, lock
    * screen is an exception. so we must destory this activity in onStop.
    */
   finish();
   /// @}
   if ((null != mSmilPlayer)) {
     if (isFinishing()) {
       mSmilPlayer.stop();
       if (mSlideView != null) {
         mSlideView.clearImageView();
       }
     } else {
       mSmilPlayer.stopWhenReload();
     }
     if (mMediaController != null) {
       // Must set the seek bar change listener null, otherwise if we rotate it
       // while tapping progress bar continuously, window will leak.
       View seekBar =
           mMediaController.findViewById(com.android.internal.R.id.mediacontroller_progress);
       if (seekBar instanceof SeekBar) {
         ((SeekBar) seekBar).setOnSeekBarChangeListener(null);
       }
       // Must do this so we don't leak a window.
       mMediaController.hide();
     }
   }
   /// M: Code analyze 003, fix bug ALPS00119632, present slide return
   /// (mActivityRunning=false) when SlideshowActivity stop @{
   if (mPresenter != null) {
     mPresenter.onStop();
     mPresenter = null;
   }
   /// @}
 }
  @Override
  protected void onResume() {
    super.onResume();

    if (mMediaController != null) {
      // mMediaController.setMdragging(false);
      mMediaController.hide();
    }
    if (mSmilDoc != null) {
      ((EventTarget) mSmilDoc)
          .addEventListener(
              SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT, SlideshowActivity.this, false);
    }
    /// M: Code analyze 002, fix bug ALPS00111374, whether need resume @{
    if (!bNeedResume) {
      mRotate = false;
      return;
    }
    /// @}
    if (null == mSmilPlayer) {
      mSmilPlayer = SmilPlayer.getPlayer();
    }
    if (null != mSmilPlayer) {
      if (!isFinishing()) {
        if (mSmilPlayer.isPausedState()) {
          if (mRotate) {
            // if need resume the player, set the state playing.
            mSmilPlayer.setStateStart();
          } else {
            mSmilPlayer.start();
          }
        }
      }
    }
    mRotate = false;
  }
 public void start() {
   mPlayer.start();
   mCachedIsPlaying = true;
 }
 public void pause() {
   mPlayer.pause();
   mCachedIsPlaying = false;
 }
 public int getDuration() {
   return mPlayer.getDuration();
 }
  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    mHandler = new Handler();
    /// M: Code analyze 004, new feature, Slideshow Plugin(unknown) @{
    initPlugin(this);
    /// @}
    // Play slide-show in full-screen mode.
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFormat(PixelFormat.TRANSLUCENT);
    setContentView(R.layout.slideshow);

    Intent intent = getIntent();
    Uri msg = intent.getData();
    final SlideshowModel model;

    try {
      model = SlideshowModel.createFromMessageUri(this, msg);
      mSlideCount = model.size();
      /** M: Confirm that we have at least 1 supported_slide to display @{ */
      if (mSlideCount == 0) {
        Toast.makeText(this, getString(R.string.unsupport_media_type), Toast.LENGTH_SHORT).show();
        throw new MmsException();
      }
      /** @} */
    } catch (MmsException e) {
      Log.e(TAG, "Cannot present the slide show.", e);
      finish();
      return;
    }
    mSlideView = (SlideView) findViewById(R.id.slide_view);

    /// M: Code analyze 003, fix bug ALPS00119632, present slide return
    /// (mActivityRunning=false) when SlideshowActivity stop @{
    mPresenter =
        (SlideshowPresenter)
            PresenterFactory.getPresenter("SlideshowPresenter", this, mSlideView, model);
    /// @}

    mRotate = true;

    /// M: Code analyze 005, fix bug ALPS00071669, Handel delay problem
    /// when progress bar update @{
    mSmilPlayer = SmilPlayer.getPlayer();
    initMediaController();
    mSlideView.setMediaController(mMediaController);
    mSlideView.setActivity(this);
    mSlideView.setMmsSlideShowPlugin(mMmsSlideShowPlugin);
    // Use SmilHelper.getDocument() to ensure rebuilding the
    /// M: entire SMIL document.
    mSmilDoc = SmilHelper.getDocument(model);
    /// @}
    mHandler.post(
        new Runnable() {
          private boolean isRotating() {
            return mSmilPlayer.isPausedState()
                || mSmilPlayer.isPlayingState()
                || mSmilPlayer.isPlayedState();
          }

          public void run() {
            if (isMMSConformance(mSmilDoc)) {
              int imageLeft = 0;
              int imageTop = 0;
              int textLeft = 0;
              int textTop = 0;
              /// M: Code analyze 006, fix bug ALPS00300308, Modified Text layout @{
              int textWidth = 0;
              int textHeight = 0;
              /// @}
              LayoutModel layout = model.getLayout();
              if (layout != null) {
                RegionModel imageRegion = layout.getImageRegion();
                if (imageRegion != null) {
                  imageLeft = imageRegion.getLeft();
                  imageTop = imageRegion.getTop();
                }
                RegionModel textRegion = layout.getTextRegion();
                if (textRegion != null) {
                  textLeft = textRegion.getLeft();
                  textTop = textRegion.getTop();
                }
              }
              /// M: Code analyze 006, fix bug ALPS00300308, Modified Text layout @{
              mSlideView.enableMMSConformanceMode(
                  textLeft, textTop, textWidth, textHeight, imageLeft, imageTop);
              /// @}
            } else {
              /// M: init page divider view
              mSlideView.initPageDivider();
            }
            if (DEBUG) {
              ByteArrayOutputStream ostream = new ByteArrayOutputStream();
              SmilXmlSerializer.serialize(mSmilDoc, ostream);
              if (LOCAL_LOGV) {
                Log.v(TAG, ostream.toString());
              }
            }

            // Add event listener.
            ((EventTarget) mSmilDoc)
                .addEventListener(
                    SmilDocumentImpl.SMIL_DOCUMENT_END_EVENT, SlideshowActivity.this, false);

            mSmilPlayer.init(mSmilDoc);
            if (isRotating()) {
              mSmilPlayer.reload();
            } else {
              /// M: Code analyze 002, fix bug ALPS00111374, (CMCC feature) pause / not auto play
              /// but need prepareToPlay when enter the slideshow activity @{
              if (mMmsSlideShowPlugin.getInitialPlayState() == IMmsSlideShow.PLAY_AS_PAUSE) {
                mSmilPlayer.prepareToPlay();
                bNeedResume = true;
                mSmilPlayerController.pause();
              } else {
                mSmilPlayer.play();
                bNeedResume = true;
              }
              /// @}
            }
          }
        });
  }