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