Merge "Centralize animation related resources." into nyc-dev

am: 9d5bc55da3

* commit '9d5bc55da37f0b30ebb12e74740814e72b946771':
  Centralize animation related resources.
This commit is contained in:
Steve McKay
2016-03-11 23:54:14 +00:00
committed by android-build-merger
10 changed files with 128 additions and 101 deletions

View File

@@ -24,6 +24,7 @@
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_quad" />
<!-- position property maps to AnimationView.setPosition -->
<objectAnimator
android:propertyName="position"
android:valueFrom="1"

View File

@@ -24,6 +24,7 @@
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_quad" />
<!-- position property maps to AnimationView.setPosition -->
<objectAnimator
android:valueFrom="0"
android:valueTo="1"

View File

@@ -14,7 +14,8 @@
limitations under the License.
-->
<com.android.documentsui.DirectoryView xmlns:android="http://schemas.android.com/apk/res/android"
<com.android.documentsui.dirlist.AnimationView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/directory_background"
@@ -99,4 +100,4 @@
</FrameLayout>
</com.android.documentsui.DirectoryView>
</com.android.documentsui.dirlist.AnimationView>

View File

@@ -18,10 +18,6 @@ package com.android.documentsui;
import static com.android.documentsui.Shared.DEBUG;
import static com.android.documentsui.State.MODE_GRID;
import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_ENTER;
import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_LEAVE;
import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_NONE;
import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_SIDE;
import android.app.Activity;
import android.app.Fragment;
@@ -48,6 +44,7 @@ import android.widget.Spinner;
import com.android.documentsui.SearchViewManager.SearchManagerListener;
import com.android.documentsui.State.ViewMode;
import com.android.documentsui.dirlist.AnimationView;
import com.android.documentsui.dirlist.DirectoryFragment;
import com.android.documentsui.dirlist.Model;
import com.android.documentsui.model.DocumentInfo;
@@ -225,7 +222,7 @@ public abstract class BaseActivity extends Activity
// Otherwise we delegate loading data from disk to a task
// to ensure a responsive ui.
if (mRoots.isRecentsRoot(root)) {
refreshCurrentRootAndDirectory(ANIM_NONE);
refreshCurrentRootAndDirectory(AnimationView.ANIM_NONE);
} else {
new PickRootTask(this, root).executeOnExecutor(getExecutorForCurrentDirectory());
}
@@ -327,7 +324,7 @@ public abstract class BaseActivity extends Activity
// previous directory. Especially after opening a root document, pressing
// back, wouldn't go to the previous root, but close the activity.
final int anim = (mState.hasLocationChanged() && mState.stack.size() > 1)
? ANIM_ENTER : ANIM_NONE;
? AnimationView.ANIM_ENTER : AnimationView.ANIM_NONE;
refreshCurrentRootAndDirectory(anim);
}
@@ -543,7 +540,7 @@ public abstract class BaseActivity extends Activity
// Update the restored stack to ensure we have freshest data
stack.updateDocuments(getContentResolver());
mState.setStack(stack);
refreshCurrentRootAndDirectory(ANIM_SIDE);
refreshCurrentRootAndDirectory(AnimationView.ANIM_SIDE);
} catch (FileNotFoundException e) {
Log.w(mTag, "Failed to restore stack: " + e);
@@ -644,7 +641,7 @@ public abstract class BaseActivity extends Activity
private boolean popDir() {
if (mState.stack.size() > 1) {
mState.stack.pop();
refreshCurrentRootAndDirectory(ANIM_LEAVE);
refreshCurrentRootAndDirectory(AnimationView.ANIM_LEAVE);
return true;
}
return false;

View File

@@ -1,57 +0,0 @@
/*
* 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.documentsui;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.LinearLayout;
public class DirectoryView extends LinearLayout {
private float mPosition = 0f;
private int mWidth;
public DirectoryView(Context context) {
super(context);
}
public DirectoryView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
setPosition(mPosition);
}
public float getPosition() {
return mPosition;
}
public void setPosition(float position) {
mPosition = position;
setY((mWidth > 0) ? (mPosition * mWidth) : 0);
if (mPosition != 0) {
setTranslationZ(getResources().getDimensionPixelSize(R.dimen.dir_elevation));
} else {
setTranslationZ(0);
}
}
}

View File

@@ -22,7 +22,6 @@ import static com.android.documentsui.State.ACTION_GET_CONTENT;
import static com.android.documentsui.State.ACTION_OPEN;
import static com.android.documentsui.State.ACTION_OPEN_TREE;
import static com.android.documentsui.State.ACTION_PICK_COPY_DESTINATION;
import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_NONE;
import android.app.Activity;
import android.app.Fragment;
@@ -46,6 +45,7 @@ import android.view.MenuItem;
import com.android.documentsui.RecentsProvider.RecentColumns;
import com.android.documentsui.RecentsProvider.ResumeColumns;
import com.android.documentsui.dirlist.AnimationView;
import com.android.documentsui.dirlist.DirectoryFragment;
import com.android.documentsui.dirlist.Model;
import com.android.documentsui.model.DocumentInfo;
@@ -492,7 +492,7 @@ public class DocumentsActivity extends BaseActivity {
protected void finish(Void result) {
mState.restored = true;
mState.external = mExternal;
mOwner.refreshCurrentRootAndDirectory(ANIM_NONE);
mOwner.refreshCurrentRootAndDirectory(AnimationView.ANIM_NONE);
}
}

View File

@@ -18,7 +18,6 @@ package com.android.documentsui;
import static com.android.documentsui.OperationDialogFragment.DIALOG_TYPE_UNKNOWN;
import static com.android.documentsui.Shared.DEBUG;
import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_NONE;
import android.app.Activity;
import android.app.FragmentManager;
@@ -39,6 +38,7 @@ import android.view.MenuItem;
import com.android.documentsui.OperationDialogFragment.DialogType;
import com.android.documentsui.RecentsProvider.ResumeColumns;
import com.android.documentsui.dirlist.AnimationView;
import com.android.documentsui.dirlist.DirectoryFragment;
import com.android.documentsui.dirlist.Model;
import com.android.documentsui.model.DocumentInfo;
@@ -97,7 +97,7 @@ public class FilesActivity extends BaseActivity {
if (DEBUG) Log.d(TAG, "Launching with non-empty stack.");
assert(uri == null || uri.getAuthority() == null ||
LauncherActivity.isLaunchUri(uri));
refreshCurrentRootAndDirectory(ANIM_NONE);
refreshCurrentRootAndDirectory(AnimationView.ANIM_NONE);
} else if (intent.getAction() == Intent.ACTION_VIEW) {
assert(uri != null);
new OpenUriForViewTask(this).executeOnExecutor(
@@ -470,7 +470,7 @@ public class FilesActivity extends BaseActivity {
@Override
protected void finish(Void result) {
mOwner.refreshCurrentRootAndDirectory(ANIM_NONE);
mOwner.refreshCurrentRootAndDirectory(AnimationView.ANIM_NONE);
}
}
}

View File

@@ -19,7 +19,6 @@ package com.android.documentsui;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static com.android.documentsui.Shared.DEBUG;
import static com.android.documentsui.dirlist.DirectoryFragment.ANIM_LEAVE;
import android.annotation.Nullable;
import android.graphics.drawable.Drawable;
@@ -30,10 +29,10 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import com.android.documentsui.dirlist.AnimationView;
import com.android.documentsui.model.DocumentInfo;
import com.android.documentsui.model.RootInfo;
@@ -105,7 +104,7 @@ class NavigationView {
while (mState.stack.size() > position + 1) {
mState.popDocument();
}
mEnv.refreshCurrentRootAndDirectory(ANIM_LEAVE);
mEnv.refreshCurrentRootAndDirectory(AnimationView.ANIM_LEAVE);
}
void update() {

View File

@@ -0,0 +1,110 @@
/*
* 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.documentsui.dirlist;
import android.annotation.IntDef;
import android.app.FragmentTransaction;
import android.content.Context;
import android.os.Bundle;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import com.android.documentsui.R;
import com.android.documentsui.Shared;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* This class exists solely to support animated transition of our directory fragment.
* The structure of this class is tightly coupled with the static animations defined in
* res/animator, specifically the "position" property referenced by
* res/animator/dir_{enter,leave}.xml.
*/
public class AnimationView extends LinearLayout {
@IntDef(flag = true, value = {
ANIM_NONE,
ANIM_SIDE,
ANIM_LEAVE,
ANIM_ENTER
})
@Retention(RetentionPolicy.SOURCE)
public @interface AnimationType {}
public static final int ANIM_NONE = 1;
public static final int ANIM_SIDE = 2;
public static final int ANIM_LEAVE = 3;
public static final int ANIM_ENTER = 4;
private float mPosition = 0f;
// The distance the animation will cover...currently matches the height of the
// content area.
private int mSpan;
public AnimationView(Context context) {
super(context);
}
public AnimationView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mSpan = h;
setPosition(mPosition);
}
public float getPosition() {
return mPosition;
}
public void setPosition(float position) {
mPosition = position;
setY((mSpan > 0) ? (mPosition * mSpan) : 0);
if (mPosition != 0) {
setTranslationZ(getResources().getDimensionPixelSize(R.dimen.dir_elevation));
} else {
setTranslationZ(0);
}
}
/**
* Configures custom animations on the transaction according to the specified
* @AnimationType.
*/
static void setupAnimations(
FragmentTransaction ft, @AnimationType int anim, Bundle args) {
switch (anim) {
case AnimationView.ANIM_SIDE:
args.putBoolean(Shared.EXTRA_IGNORE_STATE, true);
break;
case AnimationView.ANIM_ENTER:
// TODO: Document which behavior is being tailored
// by passing this bit. Remove if possible.
args.putBoolean(Shared.EXTRA_IGNORE_STATE, true);
ft.setCustomAnimations(R.animator.dir_enter, R.animator.fade_out);
break;
case AnimationView.ANIM_LEAVE:
ft.setCustomAnimations(R.animator.fade_in, R.animator.dir_leave);
break;
}
}
}

View File

@@ -84,7 +84,6 @@ import com.android.documentsui.Events;
import com.android.documentsui.Events.MotionInputEvent;
import com.android.documentsui.Menus;
import com.android.documentsui.MessageBar;
import com.android.documentsui.MimePredicate;
import com.android.documentsui.R;
import com.android.documentsui.RecentsLoader;
import com.android.documentsui.RootsCache;
@@ -124,19 +123,6 @@ public class DirectoryFragment extends Fragment
public static final int TYPE_NORMAL = 1;
public static final int TYPE_RECENT_OPEN = 2;
@IntDef(flag = true, value = {
ANIM_NONE,
ANIM_SIDE,
ANIM_LEAVE,
ANIM_ENTER
})
@Retention(RetentionPolicy.SOURCE)
public @interface AnimationType {}
public static final int ANIM_NONE = 1;
public static final int ANIM_SIDE = 2;
public static final int ANIM_LEAVE = 3;
public static final int ANIM_ENTER = 4;
@IntDef(flag = true, value = {
REQUEST_COPY_DESTINATION
})
@@ -1485,18 +1471,7 @@ public class DirectoryFragment extends Fragment
args.putParcelable(Shared.EXTRA_SELECTION, new Selection());
final FragmentTransaction ft = fm.beginTransaction();
switch (anim) {
case ANIM_SIDE:
args.putBoolean(Shared.EXTRA_IGNORE_STATE, true);
break;
case ANIM_ENTER:
args.putBoolean(Shared.EXTRA_IGNORE_STATE, true);
ft.setCustomAnimations(R.animator.dir_enter, R.animator.fade_out);
break;
case ANIM_LEAVE:
ft.setCustomAnimations(R.animator.fade_in, R.animator.dir_leave);
break;
}
AnimationView.setupAnimations(ft, anim, args);
final DirectoryFragment fragment = new DirectoryFragment();
fragment.setArguments(args);