package com.reactnativenavigation.views.slidingOverlay;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.view.View;
import android.widget.RelativeLayout;
import com.reactnativenavigation.animation.PeekingAnimator;
import com.reactnativenavigation.params.SlidingOverlayParams;
import com.reactnativenavigation.params.SlidingOverlayParams.Position;
import com.reactnativenavigation.screens.Screen;
import com.reactnativenavigation.utils.ViewUtils;
import com.reactnativenavigation.views.ContentView;
import com.reactnativenavigation.views.utils.ViewMeasurer;
public class SlidingOverlay {
private enum VisibilityState {
Hidden, AnimateHide, Shown, AnimateShow
}
private ContentView view = null;
private final RelativeLayout parent;
private final SlidingOverlayParams params;
private SlidingListener listener;
private VisibilityState visibilityState = VisibilityState.Hidden;
public interface SlidingListener {
void onSlidingOverlayGone();
void onSlidingOverlayShown();
}
public SlidingOverlay(RelativeLayout parent, SlidingOverlayParams params) {
this.parent = parent;
this.params = params;
}
public void setSlidingListener(SlidingListener listener) {
this.listener = listener;
}
public Integer getAutoDismissTimerSec() {
return params.autoDismissTimerSec;
}
public void show() {
view = createSlidingOverlayView(params);
parent.addView(view);
view.setOnDisplayListener(new Screen.OnDisplayListener() {
@Override
public void onDisplay() {
final PeekingAnimator animator = new PeekingAnimator(view, params.position, true);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animator) {
onSlidingOverlayShown(view);
}
@Override
public void onAnimationEnd(Animator animator) {
onSlidingOverlayShown(view);
}
});
view.setVisibility(View.VISIBLE);
visibilityState = VisibilityState.AnimateShow;
animator.animate();
}
});
}
public void hide() {
final PeekingAnimator animator = new PeekingAnimator(view, params.position, false);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animator) {
onSlidingOverlayEnd(view);
}
@Override
public void onAnimationEnd(Animator animator) {
onSlidingOverlayEnd(view);
}
});
visibilityState = VisibilityState.AnimateHide;
animator.animate();
}
public void destroy() {
visibilityState = VisibilityState.Hidden;
view.unmountReactView();
parent.removeView(view);
}
public boolean isShowing() {
return VisibilityState.AnimateShow == visibilityState;
}
public boolean isVisible() {
return VisibilityState.Shown == visibilityState;
}
public boolean isHiding() {
return VisibilityState.AnimateHide == visibilityState;
}
protected ContentView createSlidingOverlayView(SlidingOverlayParams params) {
final RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.addRule(params.position == Position.Top ? RelativeLayout.ALIGN_PARENT_TOP : RelativeLayout.ALIGN_PARENT_BOTTOM);
final ContentView view = new ContentView(parent.getContext(), params.screenInstanceId, params.navigationParams);
view.setViewMeasurer(new OverlayViewMeasurer(view));
view.setLayoutParams(lp);
view.setVisibility(View.INVISIBLE);
return view;
}
protected void onSlidingOverlayShown(ContentView view) {
visibilityState = VisibilityState.Shown;
if (listener != null) {
listener.onSlidingOverlayShown();
}
}
protected void onSlidingOverlayEnd(ContentView view) {
destroy();
if (listener != null) {
listener.onSlidingOverlayGone();
}
}
}