1fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay/*
2fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay * Copyright (C) 2013 The Android Open Source Project
3fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay *
4fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay * Licensed under the Apache License, Version 2.0 (the "License");
5fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay * you may not use this file except in compliance with the License.
6fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay * You may obtain a copy of the License at
7fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay *
8fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay *      http://www.apache.org/licenses/LICENSE-2.0
9fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay *
10fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay * Unless required by applicable law or agreed to in writing, software
11fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay * distributed under the License is distributed on an "AS IS" BASIS,
12fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay * See the License for the specific language governing permissions and
14fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay * limitations under the License.
15fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay */
16fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
17fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKaypackage com.android.documentsui.dirlist;
18fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
19fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKayimport android.annotation.IntDef;
20fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKayimport android.app.FragmentTransaction;
21fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKayimport android.content.Context;
22fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKayimport android.os.Bundle;
23fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKayimport android.util.AttributeSet;
24fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKayimport android.widget.LinearLayout;
25fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
26fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKayimport com.android.documentsui.R;
27d9caa6ab53aa784acaf241c0ded3c4ae2d342bf8Steve McKayimport com.android.documentsui.base.Shared;
28fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
29fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKayimport java.lang.annotation.Retention;
30fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKayimport java.lang.annotation.RetentionPolicy;
31fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
32fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay/**
33fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay * This class exists solely to support animated transition of our directory fragment.
34fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay * The structure of this class is tightly coupled with the static animations defined in
35fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay * res/animator, specifically the "position" property referenced by
36fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay * res/animator/dir_{enter,leave}.xml.
37fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay */
38fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKaypublic class AnimationView extends LinearLayout {
39fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
40fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    @IntDef(flag = true, value = {
41fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay            ANIM_NONE,
42fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay            ANIM_SIDE,
43fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay            ANIM_LEAVE,
44fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay            ANIM_ENTER
45fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    })
46fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    @Retention(RetentionPolicy.SOURCE)
47fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    public @interface AnimationType {}
48fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    public static final int ANIM_NONE = 1;
49fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    public static final int ANIM_SIDE = 2;
50fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    public static final int ANIM_LEAVE = 3;
51fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    public static final int ANIM_ENTER = 4;
52fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
53fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    private float mPosition = 0f;
54fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
55fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    // The distance the animation will cover...currently matches the height of the
56fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    // content area.
57fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    private int mSpan;
58fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
59fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    public AnimationView(Context context) {
60fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay        super(context);
61fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    }
62fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
63fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    public AnimationView(Context context, AttributeSet attrs) {
64fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay        super(context, attrs);
65fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    }
66fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
67fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    @Override
68fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
69fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay        super.onSizeChanged(w, h, oldw, oldh);
70fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay        mSpan = h;
71fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay        setPosition(mPosition);
72fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    }
73fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
74fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    public float getPosition() {
75fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay        return mPosition;
76fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    }
77fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
78fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    public void setPosition(float position) {
79fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay        mPosition = position;
800a4f58bcd79772deaac3537c870a85112db7ef44Steve McKay        // Warning! If we ever decide to switch this to setX (slide left/right)
810a4f58bcd79772deaac3537c870a85112db7ef44Steve McKay        // please remember to add RLT variations of the animations under res/animator-ldrtl.
82fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay        setY((mSpan > 0) ? (mPosition * mSpan) : 0);
83fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
84fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay        if (mPosition != 0) {
85fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay            setTranslationZ(getResources().getDimensionPixelSize(R.dimen.dir_elevation));
86fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay        } else {
87fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay            setTranslationZ(0);
88fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay        }
89fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    }
90fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay
91fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    /**
92fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay     * Configures custom animations on the transaction according to the specified
93fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay     * @AnimationType.
94fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay     */
95fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    static void setupAnimations(
96fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay            FragmentTransaction ft, @AnimationType int anim, Bundle args) {
97fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay        switch (anim) {
98fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay            case AnimationView.ANIM_SIDE:
99fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay                args.putBoolean(Shared.EXTRA_IGNORE_STATE, true);
100fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay                break;
101fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay            case AnimationView.ANIM_ENTER:
102fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay                // TODO: Document which behavior is being tailored
103fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay                //     by passing this bit. Remove if possible.
104fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay                args.putBoolean(Shared.EXTRA_IGNORE_STATE, true);
105fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay                ft.setCustomAnimations(R.animator.dir_enter, R.animator.fade_out);
106fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay                break;
107fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay            case AnimationView.ANIM_LEAVE:
108fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay                ft.setCustomAnimations(R.animator.fade_in, R.animator.dir_leave);
109fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay                break;
110fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay        }
111fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay    }
112fb4fd2f154e5153b6bb22bb46af7327c6735ed79Steve McKay}
113