public ScreenRotationAnimation(
      Context context,
      SurfaceSession session,
      boolean inTransaction,
      int originalWidth,
      int originalHeight,
      int originalRotation) {
    mContext = context;

    // Screenshot does NOT include rotation!
    // Allow for abnormal hardware orientation
    mSnapshotRotation = (4 - android.os.SystemProperties.getInt("ro.sf.hwrotation", 0) / 90) % 4;
    if (mSnapshotRotation == Surface.ROTATION_0 || mSnapshotRotation == Surface.ROTATION_180) {
      if (originalRotation == Surface.ROTATION_90 || originalRotation == Surface.ROTATION_270) {
        mWidth = originalHeight;
        mHeight = originalWidth;
      } else {
        mWidth = originalWidth;
        mHeight = originalHeight;
      }
    } else {
      if (originalRotation == Surface.ROTATION_90 || originalRotation == Surface.ROTATION_270) {
        mWidth = originalWidth;
        mHeight = originalHeight;
      } else {
        mWidth = originalHeight;
        mHeight = originalWidth;
      }
    }

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

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

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

      if (WindowManagerService.SHOW_TRANSACTIONS || WindowManagerService.SHOW_SURFACE_ALLOC)
        Slog.i(WindowManagerService.TAG, "  FREEZE " + mSurface + ": CREATE");

      setRotation(originalRotation);
    } finally {
      if (!inTransaction) {
        Surface.closeTransaction();
        if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS)
          Slog.i(WindowManagerService.TAG, "<<< CLOSE TRANSACTION ScreenRotationAnimation");
      }
    }
  }
  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");
      }
    }
  }