public ScreenRotationAnimation(
      Context context,
      Display display,
      SurfaceSession session,
      boolean inTransaction,
      int originalWidth,
      int originalHeight,
      int originalRotation,
      int exitAnim,
      int enterAnim) {
    mContext = context;
    mDisplay = display;
    mExitAnimId = exitAnim;
    mEnterAnimId = enterAnim;

    // Screenshot does NOT include rotation!
    if (originalRotation == Surface.ROTATION_90 || originalRotation == Surface.ROTATION_270) {
      mWidth = originalHeight;
      mHeight = originalWidth;
    } else {
      mWidth = originalWidth;
      mHeight = originalHeight;
    }

    mOriginalRotation = originalRotation;
    mOriginalWidth = originalWidth;
    mOriginalHeight = originalHeight;

    if (!inTransaction) {
      if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS)
        Slog.i(WindowManagerService.TAG, ">>> OPEN TRANSACTION ScreenRotationAnimation");
      Surface.openTransaction();
    }

    try {
      try {
        if (WindowManagerService.DEBUG_SURFACE_TRACE) {
          mSurface =
              new SurfaceTrace(
                  session,
                  "FreezeSurface",
                  mWidth,
                  mHeight,
                  PixelFormat.OPAQUE,
                  Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN);
        } else {
          mSurface =
              new Surface(
                  session,
                  "FreezeSurface",
                  mWidth,
                  mHeight,
                  PixelFormat.OPAQUE,
                  Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN);
        }
        if (!mSurface.isValid()) {
          // Screenshot failed, punt.
          mSurface = null;
          return;
        }
        mSurface.setLayerStack(mDisplay.getLayerStack());
        mSurface.setLayer(FREEZE_LAYER + 1);
        mSurface.setAlpha(0);
        mSurface.show();
      } catch (Surface.OutOfResourcesException e) {
        Slog.w(TAG, "Unable to allocate freeze surface", e);
      }

      /// M: Add systrace for orientation chagnge performance analysis
      Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "ScreenRotationAnimation:Create");
      Slog.i(WindowManagerService.TAG, "  FREEZE " + mSurface + ": CREATE");
      Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);

      setRotationInTransaction(originalRotation);
    } finally {
      if (!inTransaction) {
        Surface.closeTransaction();
        if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS)
          Slog.i(WindowManagerService.TAG, "<<< CLOSE TRANSACTION ScreenRotationAnimation");
      }
    }
  }