/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.transitiontests;

import android.app.Activity;
import android.os.Bundle;
import android.transition.ChangeBounds;
import android.view.View;
import android.view.ViewGroup;
import android.transition.Crossfade;
import android.transition.TextChange;
import android.transition.Transition;
import android.transition.TransitionSet;
import android.transition.TransitionManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import static android.widget.LinearLayout.LayoutParams;

public class CrossfadeMultiple extends Activity {
    ViewGroup mSceneRoot;
    static int mCurrentScene;
    TransitionManager mTransitionManager;
    Transition mTransition;
    ImageView mImageView;
    TextView mTextView;
    Button mButton;
    Crossfade mCrossfade;
    TransitionSet mCrossfadeGroup;
    TransitionSet mTextChangeGroup1, mTextChangeGroup2;
    TransitionSet mInOutGroup;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.crossfade_multiple);

        ViewGroup container = (ViewGroup) findViewById(R.id.container);
        mSceneRoot = container;

        mButton = (Button) findViewById(R.id.button);
        mImageView = (ImageView) findViewById(R.id.imageview);
        mTextView = (TextView) findViewById(R.id.textview);

        mCrossfade = new Crossfade();
        mCrossfade.addTarget(R.id.button).addTarget(R.id.textview).addTarget(R.id.imageview);

        mCrossfadeGroup = new TransitionSet();
        mCrossfadeGroup.setDuration(300);
        mCrossfadeGroup.addTransition(mCrossfade).addTransition(new ChangeBounds());
        mTransition = mCrossfadeGroup;

        mInOutGroup = new TransitionSet();
        Crossfade inOut = new Crossfade();
        inOut.setDuration(300);
        inOut.setFadeBehavior(Crossfade.FADE_BEHAVIOR_OUT_IN);
        ChangeBounds changeBounds = new ChangeBounds();
        changeBounds.setStartDelay(150);
        changeBounds.setDuration(0);
        mInOutGroup.addTransition(inOut).addTransition(changeBounds);

        mTextChangeGroup1 = new TransitionSet();
        TextChange textChangeInOut = new TextChange();
        textChangeInOut.setChangeBehavior(TextChange.CHANGE_BEHAVIOR_OUT_IN);
        mTextChangeGroup1.addTransition(textChangeInOut).addTransition(new ChangeBounds());

        mTextChangeGroup2 = new TransitionSet();
        mTextChangeGroup2.setOrdering(TransitionSet.ORDERING_SEQUENTIAL);
        TextChange textChangeOut = new TextChange();
        textChangeOut.setChangeBehavior(TextChange.CHANGE_BEHAVIOR_OUT);
        TextChange textChangeIn = new TextChange();
        textChangeIn.setChangeBehavior(TextChange.CHANGE_BEHAVIOR_IN);
        mTextChangeGroup2.addTransition(textChangeOut).addTransition(new ChangeBounds()).
                addTransition(textChangeIn);
    }

    public void sendMessage(View view) {
        TransitionManager.beginDelayedTransition(mSceneRoot, mTransition);
        int id = view.getId();
        LayoutParams params = null;
        switch (id) {
            case R.id.button1:
                params = new LayoutParams(200, 200);
                mButton.setText("A");
                mTextView.setText("1111111");
                mImageView.setImageResource(R.drawable.self_portrait_square_100);
                break;
            case R.id.button2:
                params = new LayoutParams(400, 200);
                mButton.setText("B");
                mTextView.setText("2222222");
                mImageView.setImageResource(R.drawable.self_portrait_square_200);
                break;
            case R.id.button3:
                params = new LayoutParams(200, 400);
                mButton.setText("C");
                mTextView.setText("3333333");
                mImageView.setImageResource(R.drawable.self_portrait_square_400);
                break;
        }
        mButton.setLayoutParams(params);
    }

    public void changeTransitionType(View view) {
        int id = view.getId();
        switch (id) {
            case R.id.reveal:
                mCrossfade.setFadeBehavior(Crossfade.FADE_BEHAVIOR_REVEAL);
                mTransition = mCrossfadeGroup;
                break;
            case R.id.crossfade:
                mCrossfade.setFadeBehavior(Crossfade.FADE_BEHAVIOR_CROSSFADE);
                mTransition = mCrossfadeGroup;
                break;
            case R.id.inout:
                mTransition = mInOutGroup;
                break;
            case R.id.textfade1:
                mTransition = mTextChangeGroup1;
                break;
            case R.id.textfade2:
                mTransition = mTextChangeGroup2;
                break;
        }
    }
}
