void EnterTransitionCoordinator::PrepareEnter()
{
    AutoPtr<IViewGroup> vg;
    GetDecor((IViewGroup**)&vg);
    IView* decorView = IView::Probe(vg);
    if (mActivity == NULL || decorView == NULL) {
        return;
    }
    mActivity->OverridePendingTransition(0, 0);
    if (!mIsReturning) {
        mActivity->ConvertToTranslucent(NULL, NULL, &mWasOpaque);
        AutoPtr<IDrawable> background;
        decorView->GetBackground((IDrawable**)&background);
        if (background != NULL) {
            AutoPtr<IWindow> window;
            window->SetBackgroundDrawable(NULL);
            background->Mutate();
            background->SetAlpha(0);
            window->SetBackgroundDrawable(background);
        }
    }
    else {
        mActivity = NULL; // all done with it now.
    }
}
void EnterTransitionCoordinator::StartEnterTransition(
    /* [in] */ ITransition* transition)
{
    AutoPtr<IViewGroup> vg;
    GetDecor((IViewGroup**)&vg);
    IView* decorView = IView::Probe(vg);
    if (!mIsReturning && decorView != NULL) {
        AutoPtr<IDrawable> background;
        decorView->GetBackground((IDrawable**)&background);
        if (background != NULL) {
            background->Mutate();
            AutoPtr<IWindow> window;
            GetWindow((IWindow**)&window);
            window->SetBackgroundDrawable(background);
            AutoPtr<ArrayOf<Int32> > args = ArrayOf<Int32>::Alloc(1);
            args->Set(0, 255);
            mBackgroundAnimator = ObjectAnimator::OfInt32(
                IInterface::Probe(background), String("alpha"), args);
            IAnimator* va = IAnimator::Probe(mBackgroundAnimator);
            va->SetDuration(GetFadeDuration());
            AutoPtr<IAnimatorListener> listener = new MyAnimatorListenerAdapter(this);
            va->AddListener(listener);
            va->Start();
        }
        else if (transition != NULL) {
            AutoPtr<ITransitionListener> listener = new EnterTransitionListener(this);
            transition->AddListener(listener);
        }
        else {
            MakeOpaque();
        }
    }
}
ECode EnterTransitionCoordinator::Stop()
{
    // Restore the background to its previous state since the
    // Activity is stopping.
    if (mBackgroundAnimator != NULL) {
        IAnimator* va = IAnimator::Probe(mBackgroundAnimator);
        va->End();
        mBackgroundAnimator = NULL;
    }
    else if (mWasOpaque) {
        AutoPtr<IViewGroup> vg;
        GetDecor((IViewGroup**)&vg);
        IView* decorView = IView::Probe(vg);
        if (decorView != NULL) {
            AutoPtr<IDrawable> drawable;
            decorView->GetBackground((IDrawable**)&drawable);
            if (drawable != NULL) {
                drawable->SetAlpha(1);
            }
        }
    }
    MakeOpaque();
    mIsCanceled = TRUE;
    mResultReceiver = NULL;
    mActivity = NULL;
    MoveSharedElementsFromOverlay();
    if (mTransitioningViews != NULL) {
        ShowViews(mTransitioningViews, TRUE);
    }
    ShowViews(mSharedElements, TRUE);
    ClearState();
    return NOERROR;
}