Skip to content

Commit

Permalink
Sliding overlay (#651)
Browse files Browse the repository at this point in the history
* WIP

* Core function works e2e

* Queued overlays support

* Remove unneeded activity ref

* Add post-PR changes
  • Loading branch information
d4vidi authored and guyca committed Jan 13, 2017
1 parent 8ffed6a commit e283d44
Show file tree
Hide file tree
Showing 17 changed files with 342 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.reactnativenavigation.animation;

import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.view.View;
import android.view.animation.OvershootInterpolator;

import static android.view.View.TRANSLATION_Y;

public class PeekingAnimator {

private static final int SLIDE_OUT_DURATION = 300;
private static final int SLIDE_IN_DURATION = 600;
private static final int SUSTAIN_DURATION = 3000;

private final Animator animator;

public PeekingAnimator(View view) {
this.animator = createAnimator(view);
}

public void addListener(Animator.AnimatorListener listener) {
this.animator.addListener(listener);
}

public void animate() {
animator.start();
}

private Animator createAnimator(View view) {
final int heightPixels = view.getLayoutParams().height;

view.setTranslationY(-heightPixels);

ObjectAnimator slideIn = createSlideInAnimator(view);
ObjectAnimator slideOut = createSlideOutAnimator(view, heightPixels, slideIn);
AnimatorSet animatorSet = createAnimatorSet(slideIn, slideOut);
return animatorSet;
}

private ObjectAnimator createSlideInAnimator(View view) {
ObjectAnimator slideIn = ObjectAnimator.ofFloat(view, TRANSLATION_Y, 0);
slideIn.setDuration(SLIDE_IN_DURATION);
slideIn.setInterpolator(new OvershootInterpolator(0.8f));
return slideIn;
}

private ObjectAnimator createSlideOutAnimator(View view, int heightPixels, ObjectAnimator slideIn) {
ObjectAnimator slideOut = ObjectAnimator.ofFloat(view, TRANSLATION_Y, -heightPixels);
slideIn.setDuration(SLIDE_OUT_DURATION);
return slideOut;
}

private AnimatorSet createAnimatorSet(ObjectAnimator slideIn, ObjectAnimator slideOut) {
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(slideOut).after(SUSTAIN_DURATION).after(slideIn);
return animatorSet;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@
import com.reactnativenavigation.controllers.NavigationCommandsHandler;
import com.reactnativenavigation.params.ContextualMenuParams;
import com.reactnativenavigation.params.FabParams;
import com.reactnativenavigation.params.SlidingOverlayParams;
import com.reactnativenavigation.params.SnackbarParams;
import com.reactnativenavigation.params.TitleBarButtonParams;
import com.reactnativenavigation.params.TitleBarLeftButtonParams;
import com.reactnativenavigation.params.parsers.ContextualMenuParamsParser;
import com.reactnativenavigation.params.parsers.FabParamsParser;
import com.reactnativenavigation.params.parsers.SlidingOverlayParamsParser;
import com.reactnativenavigation.params.parsers.SnackbarParamsParser;
import com.reactnativenavigation.params.parsers.TitleBarButtonParamsParser;
import com.reactnativenavigation.params.parsers.TitleBarLeftButtonParamsParser;
Expand Down Expand Up @@ -185,6 +187,12 @@ public void dismissTopModal() {
NavigationCommandsHandler.dismissTopModal();
}

@ReactMethod
public void showSlidingOverlay(final ReadableMap params) {
SlidingOverlayParams slidingOverlayParams = new SlidingOverlayParamsParser().parse(BundleConverter.toBundle(params));
NavigationCommandsHandler.showSlidingOverlay(slidingOverlayParams);
}

@ReactMethod
public void showSnackbar(final ReadableMap params) {
SnackbarParams snackbarParams = new SnackbarParamsParser().parse(BundleConverter.toBundle(params));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import com.reactnativenavigation.params.ContextualMenuParams;
import com.reactnativenavigation.params.FabParams;
import com.reactnativenavigation.params.ScreenParams;
import com.reactnativenavigation.params.SlidingOverlayParams;
import com.reactnativenavigation.params.SnackbarParams;
import com.reactnativenavigation.params.TitleBarButtonParams;
import com.reactnativenavigation.params.TitleBarLeftButtonParams;
Expand Down Expand Up @@ -291,6 +292,10 @@ public void setBottomTabBadgeByNavigatorId(String navigatorId, String badge) {
}
}

public void showSlidingOverlay(SlidingOverlayParams params) {
layout.showSlidingOverlay(params);
}

public void showSnackbar(SnackbarParams params) {
layout.showSnackbar(params);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.reactnativenavigation.params.ContextualMenuParams;
import com.reactnativenavigation.params.FabParams;
import com.reactnativenavigation.params.ScreenParams;
import com.reactnativenavigation.params.SlidingOverlayParams;
import com.reactnativenavigation.params.SnackbarParams;
import com.reactnativenavigation.params.TitleBarButtonParams;
import com.reactnativenavigation.params.TitleBarLeftButtonParams;
Expand Down Expand Up @@ -336,6 +337,20 @@ public void run() {
});
}

public static void showSlidingOverlay(final SlidingOverlayParams params) {
final NavigationActivity currentActivity = NavigationActivity.currentActivity;
if (currentActivity == null) {
return;
}

NavigationApplication.instance.runOnMainThread(new Runnable() {
@Override
public void run() {
currentActivity.showSlidingOverlay(params);
}
});
}

public static void showSnackbar(final SnackbarParams params) {
final NavigationActivity currentActivity = NavigationActivity.currentActivity;
if (currentActivity == null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.reactnativenavigation.layouts;

import android.support.v7.app.AppCompatActivity;
import android.widget.RelativeLayout;

public abstract class BaseLayout extends RelativeLayout implements Layout {

public BaseLayout(AppCompatActivity activity) {
super(activity);
}

protected AppCompatActivity getActivity() {
return (AppCompatActivity) getContext();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.reactnativenavigation.params.FabParams;
import com.reactnativenavigation.params.ScreenParams;
import com.reactnativenavigation.params.SideMenuParams;
import com.reactnativenavigation.params.SlidingOverlayParams;
import com.reactnativenavigation.params.SnackbarParams;
import com.reactnativenavigation.params.TitleBarButtonParams;
import com.reactnativenavigation.params.TitleBarLeftButtonParams;
Expand All @@ -27,27 +28,28 @@
import com.reactnativenavigation.views.SideMenu;
import com.reactnativenavigation.views.SideMenu.Side;
import com.reactnativenavigation.views.SnackbarAndFabContainer;
import com.reactnativenavigation.views.slidingOverlay.SlidingOverlay;
import com.reactnativenavigation.views.slidingOverlay.SlidingOverlaysQueue;

import java.util.List;

import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;

public class BottomTabsLayout extends RelativeLayout implements Layout, AHBottomNavigation.OnTabSelectedListener {
public class BottomTabsLayout extends BaseLayout implements AHBottomNavigation.OnTabSelectedListener {

private final AppCompatActivity activity;
private ActivityParams params;
private SnackbarAndFabContainer snackbarAndFabContainer;
private BottomTabs bottomTabs;
private ScreenStack[] screenStacks;
private final SideMenuParams leftSideMenuParams;
private final SideMenuParams rightSideMenuParams;
private final SlidingOverlaysQueue slidingOverlaysQueue = new SlidingOverlaysQueue();
private @Nullable SideMenu sideMenu;
private int currentStackIndex = 0;

public BottomTabsLayout(AppCompatActivity activity, ActivityParams params) {
super(activity);
this.activity = activity;
this.params = params;
leftSideMenuParams = params.leftSideMenuParams;
rightSideMenuParams = params.rightSideMenuParams;
Expand Down Expand Up @@ -81,7 +83,7 @@ private void addScreenStacks() {

private void createAndAddScreens(int position) {
ScreenParams screenParams = params.tabParams.get(position);
ScreenStack newStack = new ScreenStack(activity, getScreenStackParent(), screenParams.getNavigatorId(), this);
ScreenStack newStack = new ScreenStack(getActivity(), getScreenStackParent(), screenParams.getNavigatorId(), this);
newStack.pushInitialScreen(screenParams, createScreenLayoutParams(screenParams));
screenStacks[position] = newStack;
}
Expand Down Expand Up @@ -209,6 +211,11 @@ public void showSnackbar(SnackbarParams params) {
snackbarAndFabContainer.showSnackbar(eventId, params);
}

@Override
public void showSlidingOverlay(final SlidingOverlayParams params) {
slidingOverlaysQueue.add(new SlidingOverlay(this, params));
}

@Override
public void onModalDismissed() {
EventBus.instance.post(new ScreenChangedEvent(getCurrentScreenStack().peek().getScreenParams()));
Expand Down Expand Up @@ -277,7 +284,7 @@ public void newStack(ScreenParams params) {
removeView(currentScreenStack.peek());
currentScreenStack.destroy();

ScreenStack newStack = new ScreenStack(activity, getScreenStackParent(), params.getNavigatorId(), this);
ScreenStack newStack = new ScreenStack(getActivity(), getScreenStackParent(), params.getNavigatorId(), this);
LayoutParams lp = createScreenLayoutParams(params);
newStack.pushInitialScreenWithAnimation(params, lp);
screenStacks[currentStackIndex] = newStack;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.facebook.react.bridge.Callback;
import com.reactnativenavigation.params.ContextualMenuParams;
import com.reactnativenavigation.params.FabParams;
import com.reactnativenavigation.params.SlidingOverlayParams;
import com.reactnativenavigation.params.SnackbarParams;
import com.reactnativenavigation.params.TitleBarButtonParams;
import com.reactnativenavigation.params.TitleBarLeftButtonParams;
Expand Down Expand Up @@ -36,6 +37,8 @@ public interface Layout extends ScreenStackContainer {

void showSnackbar(SnackbarParams params);

void showSlidingOverlay(SlidingOverlayParams params);

void onModalDismissed();

boolean containsNavigator(String navigatorId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.reactnativenavigation.params.FabParams;
import com.reactnativenavigation.params.ScreenParams;
import com.reactnativenavigation.params.SideMenuParams;
import com.reactnativenavigation.params.SlidingOverlayParams;
import com.reactnativenavigation.params.SnackbarParams;
import com.reactnativenavigation.params.TitleBarButtonParams;
import com.reactnativenavigation.params.TitleBarLeftButtonParams;
Expand All @@ -22,26 +23,27 @@
import com.reactnativenavigation.views.SideMenu;
import com.reactnativenavigation.views.SideMenu.Side;
import com.reactnativenavigation.views.SnackbarAndFabContainer;
import com.reactnativenavigation.views.slidingOverlay.SlidingOverlay;
import com.reactnativenavigation.views.slidingOverlay.SlidingOverlaysQueue;

import java.util.List;

import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;

public class SingleScreenLayout extends RelativeLayout implements Layout {
public class SingleScreenLayout extends BaseLayout {

private final AppCompatActivity activity;
protected final ScreenParams screenParams;
private final SideMenuParams leftSideMenuParams;
private final SideMenuParams rightSideMenuParams;
protected ScreenStack stack;
private SnackbarAndFabContainer snackbarAndFabContainer;
protected LeftButtonOnClickListener leftButtonOnClickListener;
private @Nullable SideMenu sideMenu;
private final SlidingOverlaysQueue slidingOverlaysQueue = new SlidingOverlaysQueue();

public SingleScreenLayout(AppCompatActivity activity, SideMenuParams leftSideMenuParams,
SideMenuParams rightSideMenuParams, ScreenParams screenParams) {
super(activity);
this.activity = activity;
this.screenParams = screenParams;
this.leftSideMenuParams = leftSideMenuParams;
this.rightSideMenuParams = rightSideMenuParams;
Expand Down Expand Up @@ -74,7 +76,7 @@ private void createStack(RelativeLayout parent) {
if (stack != null) {
stack.destroy();
}
stack = new ScreenStack(activity, parent, screenParams.getNavigatorId(), this);
stack = new ScreenStack(getActivity(), parent, screenParams.getNavigatorId(), this);
LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
pushInitialScreen(lp);
}
Expand Down Expand Up @@ -148,7 +150,7 @@ public void newStack(ScreenParams params) {
removeView(stack.peek());
stack.destroy();

ScreenStack newStack = new ScreenStack(activity, getScreenStackParent(), params.getNavigatorId(), this);
ScreenStack newStack = new ScreenStack(getActivity(), getScreenStackParent(), params.getNavigatorId(), this);
LayoutParams lp = new LayoutParams(MATCH_PARENT, MATCH_PARENT);
newStack.pushInitialScreenWithAnimation(params, lp);
stack = newStack;
Expand Down Expand Up @@ -212,6 +214,11 @@ public void showSnackbar(SnackbarParams params) {
snackbarAndFabContainer.showSnackbar(navigatorEventId, params);
}

@Override
public void showSlidingOverlay(final SlidingOverlayParams params) {
slidingOverlaysQueue.add(new SlidingOverlay(this, params));
}

@Override
public void onModalDismissed() {
EventBus.instance.post(new ScreenChangedEvent(stack.peek().getScreenParams()));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.reactnativenavigation.params;

public class SlidingOverlayParams {
public String screenInstanceId;
public NavigationParams navigationParams;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.reactnativenavigation.params.parsers;

import android.os.Bundle;

import com.reactnativenavigation.params.NavigationParams;
import com.reactnativenavigation.params.SlidingOverlayParams;

public class SlidingOverlayParamsParser extends Parser {

public SlidingOverlayParams parse(Bundle bundle) {
final SlidingOverlayParams result = new SlidingOverlayParams();
result.screenInstanceId = bundle.getString("screen");
result.navigationParams = new NavigationParams(bundle.getBundle("navigationParams"));
return result;
}
}
Loading

0 comments on commit e283d44

Please sign in to comment.