/*
* Copyright (C) 2015 takahirom
*
* 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.kogitune.activity_transition.fragment;
import android.animation.Animator;
import android.animation.TimeInterpolator;
import android.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.KeyEvent;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import com.kogitune.activity_transition.core.MoveData;
import com.kogitune.activity_transition.core.TransitionAnimation;
public class ExitFragmentTransition {
private final MoveData moveData;
private Fragment fragment;
private android.support.v4.app.Fragment supportFragment;
private TimeInterpolator interpolator;
private Animator.AnimatorListener listener;
public ExitFragmentTransition(Fragment fragment, MoveData moveData) {
this.fragment = fragment;
this.moveData = moveData;
}
public ExitFragmentTransition(final android.support.v4.app.Fragment fragment, MoveData moveData) {
this.supportFragment = fragment;
this.moveData = moveData;
}
public ExitFragmentTransition interpolator(TimeInterpolator interpolator) {
this.interpolator = interpolator;
return this;
}
public ExitFragmentTransition exitListener(Animator.AnimatorListener listener) {
this.listener = listener;
return this;
}
public void startExitListening() {
startExitListening(null);
}
public void startExitListening(final Runnable popBackStackRunnable) {
if (interpolator == null) {
interpolator = new DecelerateInterpolator();
}
final View toView = moveData.toView;
toView.setFocusableInTouchMode(true);
toView.requestFocus();
toView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (event.getAction() != KeyEvent.ACTION_UP) {
return true;
}
TransitionAnimation.startExitAnimation(moveData, interpolator, new Runnable() {
@Override
public void run() {
if (popBackStackRunnable != null) {
popBackStackRunnable.run();
return;
}
if (fragment == null) {
if (!supportFragment.isResumed()) {
return;
}
final FragmentManager fragmentManager = supportFragment.getFragmentManager();
if (fragmentManager != null) {
fragmentManager.popBackStack();
}
} else {
if (!fragment.isResumed()) {
return;
}
final android.app.FragmentManager fragmentManager = fragment.getFragmentManager();
if (fragmentManager != null) {
fragmentManager.popBackStack();
}
}
}
}, listener);
return true;
}
return false;
}
});
}
}