185609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov/*
285609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project
385609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov *
485609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
585609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov * you may not use this file except in compliance with the License.
685609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov * You may obtain a copy of the License at
785609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov *
885609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
985609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov *
1085609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
1185609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
1285609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1385609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov * See the License for the specific language governing permissions and
1485609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov * limitations under the License.
1585609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov */
1685609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikovpackage com.android.contacts.widget;
1785609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov
18cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmannimport android.animation.ObjectAnimator;
1985609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikovimport android.content.Context;
2085609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikovimport android.graphics.Color;
2185609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikovimport android.util.AttributeSet;
2285609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikovimport android.view.View;
2385609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikovimport android.widget.FrameLayout;
2485609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov
2585609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov/**
266e607d54ce08ebcc78d94963646a42605697f132Maurice Chu * A container that places a masking view on top of all other views.  The masking view can be
276e607d54ce08ebcc78d94963646a42605697f132Maurice Chu * faded in and out.  Currently, the masking view is solid color white.
2885609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov */
296e607d54ce08ebcc78d94963646a42605697f132Maurice Chupublic class TransitionAnimationView extends FrameLayout {
306e607d54ce08ebcc78d94963646a42605697f132Maurice Chu    private View mMaskingView;
316e607d54ce08ebcc78d94963646a42605697f132Maurice Chu    private ObjectAnimator mAnimator;
3285609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov
3385609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov    public TransitionAnimationView(Context context) {
3485609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov        this(context, null, 0);
3585609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov    }
3685609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov
3785609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov    public TransitionAnimationView(Context context, AttributeSet attrs) {
3885609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov        this(context, attrs, 0);
3985609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov    }
4085609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov
4185609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov    public TransitionAnimationView(Context context, AttributeSet attrs, int defStyle) {
4285609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov        super(context, attrs, defStyle);
4385609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov    }
4485609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov
4585609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov    @Override
46cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann    protected void onFinishInflate() {
47cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann        super.onFinishInflate();
486e607d54ce08ebcc78d94963646a42605697f132Maurice Chu        mMaskingView = new View(getContext());
496e607d54ce08ebcc78d94963646a42605697f132Maurice Chu        mMaskingView.setVisibility(View.INVISIBLE);
506e607d54ce08ebcc78d94963646a42605697f132Maurice Chu        mMaskingView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
51cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann                LayoutParams.MATCH_PARENT));
526e607d54ce08ebcc78d94963646a42605697f132Maurice Chu        mMaskingView.setBackgroundColor(Color.WHITE);
536e607d54ce08ebcc78d94963646a42605697f132Maurice Chu        addView(mMaskingView);
5485609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov    }
5585609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov
566e607d54ce08ebcc78d94963646a42605697f132Maurice Chu    public void setMaskVisibility(boolean flag) {
576e607d54ce08ebcc78d94963646a42605697f132Maurice Chu        if (flag) {
586e607d54ce08ebcc78d94963646a42605697f132Maurice Chu            mMaskingView.setAlpha(1.0f);
596e607d54ce08ebcc78d94963646a42605697f132Maurice Chu            mMaskingView.setVisibility(View.VISIBLE);
606e607d54ce08ebcc78d94963646a42605697f132Maurice Chu        } else {
616e607d54ce08ebcc78d94963646a42605697f132Maurice Chu            mMaskingView.setVisibility(View.INVISIBLE);
62bcf864578e0fe25813af75f33f5560709a5c8515Dmitri Plotnikov        }
63bcf864578e0fe25813af75f33f5560709a5c8515Dmitri Plotnikov    }
64bcf864578e0fe25813af75f33f5560709a5c8515Dmitri Plotnikov
656e607d54ce08ebcc78d94963646a42605697f132Maurice Chu    /**
666e607d54ce08ebcc78d94963646a42605697f132Maurice Chu     * Starts the transition of showing or hiding the mask.
676e607d54ce08ebcc78d94963646a42605697f132Maurice Chu     * If showMask is true, the mask will be set to be invisible then fade into hide the other
686e607d54ce08ebcc78d94963646a42605697f132Maurice Chu     * views in this container.  If showMask is false, the mask will be set to be hide other views
696e607d54ce08ebcc78d94963646a42605697f132Maurice Chu     * initially.  Then, the other views in this container will be revealed.
706e607d54ce08ebcc78d94963646a42605697f132Maurice Chu     */
716e607d54ce08ebcc78d94963646a42605697f132Maurice Chu    public void startMaskTransition(boolean showMask) {
726e607d54ce08ebcc78d94963646a42605697f132Maurice Chu        // Stop any animation that may still be running.
736e607d54ce08ebcc78d94963646a42605697f132Maurice Chu        if (mAnimator != null && mAnimator.isRunning()) {
746e607d54ce08ebcc78d94963646a42605697f132Maurice Chu            mAnimator.end();
7558d8be3ff47747454afdfadfe2f566a183cdee3bDmitri Plotnikov        }
76cf3d9f04955a8ec3cb405b8a4ddcaddcece2a245Daniel Lehmann
776e607d54ce08ebcc78d94963646a42605697f132Maurice Chu        mMaskingView.setVisibility(View.VISIBLE);
786e607d54ce08ebcc78d94963646a42605697f132Maurice Chu        if (showMask) {
796e607d54ce08ebcc78d94963646a42605697f132Maurice Chu            mAnimator = ObjectAnimator.ofFloat(mMaskingView, View.ALPHA, 0.0f, 1.0f);
806e607d54ce08ebcc78d94963646a42605697f132Maurice Chu            mAnimator.start();
816e607d54ce08ebcc78d94963646a42605697f132Maurice Chu        } else {
826e607d54ce08ebcc78d94963646a42605697f132Maurice Chu            // asked to hide the view
836e607d54ce08ebcc78d94963646a42605697f132Maurice Chu            mAnimator = ObjectAnimator.ofFloat(mMaskingView, View.ALPHA, 1.0f, 0.0f);
846e607d54ce08ebcc78d94963646a42605697f132Maurice Chu            mAnimator.start();
8585609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov        }
8685609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov    }
8785609edf326d86d4a2b67be3610f8de7cce28d1dDmitri Plotnikov}
88