Skip to content

Commit

Permalink
🚧 Add Activity swipe back support.
Browse files Browse the repository at this point in the history
  • Loading branch information
JingYeoh committed Aug 1, 2018
1 parent 743da34 commit de767e9
Show file tree
Hide file tree
Showing 7 changed files with 203 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import android.support.v4.app.Fragment;
import com.jkb.fragment.rigger.annotation.Puppet;
import com.jkb.fragment.rigger.exception.AlreadyExistException;
import com.jkb.fragment.swiper.widget.SwipeLayout;
import com.jkb.fragment.swiper.SwipeLayout;
import java.util.Stack;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import com.jkb.fragment.rigger.exception.UnSupportException;
import com.jkb.fragment.rigger.utils.Logger;
import com.jkb.fragment.swiper.widget.SwipeLayout;
import com.jkb.fragment.swiper.SwipeLayout;

/**
* Activity Rigger.rig the Activity puppet.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import com.jkb.fragment.rigger.exception.UnSupportException;
import com.jkb.fragment.rigger.utils.Logger;
import com.jkb.fragment.rigger.utils.RiggerConsts;
import com.jkb.fragment.swiper.widget.SwipeLayout;
import com.jkb.fragment.swiper.SwipeLayout;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.UUID;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
import com.jkb.fragment.rigger.helper.FragmentStackManager;
import com.jkb.fragment.rigger.utils.Logger;
import com.jkb.fragment.swiper.annotation.Swiper;
import com.jkb.fragment.swiper.widget.SwipeLayout;
import com.jkb.fragment.swiper.SwipeLayout;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.jkb.fragment.swiper;

import android.app.Activity;
import android.support.annotation.NonNull;

import java.util.Stack;

/**
* This class is used to manage {@link android.app.Activity} and only used by {@link SwipeLayout}.
*
* @author JingYeoh
* <a href="mailto:[email protected]">Email me</a>
* <a href="https://github.com/justkiddingbaby">Github</a>
* <a href="http://blog.justkiddingbaby.com">Blog</a>
* @since Aug 1,2018
*/
class SwipeActivityManager {

private Stack<Activity> mActivityStack;

private static volatile SwipeActivityManager sInstance = null;

private SwipeActivityManager() {
mActivityStack = new Stack<>();
}

/**
* Returns the instance of SwipeManager.
*/
static SwipeActivityManager getInstance() {
if (sInstance == null) {
synchronized (SwipeActivityManager.class) {
if (sInstance == null) {
sInstance = new SwipeActivityManager();
}
}
}
return sInstance;
}

private void addToStack(@NonNull Activity activity) {
mActivityStack.add(activity);
}

private void removeFromStack(@NonNull Activity activity) {
mActivityStack.remove(activity);
}

@NonNull
Stack<Activity> getActivityStack() {
return mActivityStack;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.jkb.fragment.swiper.widget;
package com.jkb.fragment.swiper;

import android.annotation.SuppressLint;
import android.app.Activity;
Expand All @@ -14,8 +14,10 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import com.jkb.fragment.rigger.rigger.Rigger;
import com.jkb.fragment.swiper.annotation.SwipeEdge;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
Expand Down Expand Up @@ -183,7 +185,7 @@ public int getViewVerticalDragRange(View child) {
}

@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
public void onViewPositionChanged(@NonNull View changedView, int left, int top, int dx, int dy) {
super.onViewPositionChanged(changedView, left, top, dx, dy);

if ((mCurrentSwipeOrientation & ViewDragHelper.EDGE_LEFT) != 0) {
Expand All @@ -210,6 +212,13 @@ public void onViewPositionChanged(View changedView, int left, int top, int dx, i
preView.setX(0);
preView.setY(0);
}
} else {
Activity activity = getPreActivity();
if (activity != null) {
View decorView = activity.getWindow().getDecorView();
decorView.setX(0);
decorView.setY(0);
}
}
if (topFragment != null) {
if (preFragment == null && mStickyWithHost) {
Expand Down Expand Up @@ -262,12 +271,7 @@ public void computeScroll() {
}
}

private void computeScrollPreView() {
Fragment preFragment = getPreFragment();
if (preFragment == null) {
return;
}
View view = preFragment.getView();
private void computeScroll(@Nullable View view) {
if (view == null) {
return;
}
Expand Down Expand Up @@ -301,6 +305,27 @@ private void computeScrollPreView() {
view.setY(yOffset);
}

private void computeScrollPreView() {
Fragment preFragment = getPreFragment();
if (preFragment == null) {
if (mPuppetHost instanceof Activity) {
computeScrollActivityView();
}
return;
}
View view = preFragment.getView();
computeScroll(view);
}

private void computeScrollActivityView() {
Activity activity = getPreActivity();
if (activity == null) {
return;
}
View decorView = activity.getWindow().getDecorView();
computeScroll(decorView);
}

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
Expand Down Expand Up @@ -378,6 +403,19 @@ private Fragment getPreFragment() {
return Rigger.getRigger(mPuppetHost).findFragmentByTag(topTag);
}

@Nullable
private Activity getPreActivity() {
if (mPuppetHost instanceof Activity) {
Stack<Activity> stack = SwipeActivityManager.getInstance().getActivityStack();
int index = stack.indexOf(mPuppetHost);
if (index <= 0) {
return null;
}
return stack.get(index - 1);
}
return null;
}

///////////////////////////// Attributes SETTER /////////////////////////////////////

public void setParallaxOffset(float parallaxOffset) {
Expand All @@ -395,14 +433,14 @@ public void setSwipeEdgeSide(SwipeEdge[] swipeEdgeSide) {
if (edge == SwipeEdge.NONE) {
if (swipeEdgeSide.length > 1) {
throw new IllegalArgumentException("The Swiper#edgeSide can not contain other value as" +
" the SwipeEdge.NONE is contained.");
" the SwipeEdge.NONE is contained.");
}
setEnableSwipe(false);
return;
} else if (edge == SwipeEdge.ALL) {
if (swipeEdgeSide.length > 1) {
throw new IllegalArgumentException("The Swiper#edgeSide can not contain other value as" +
" the SwipeEdge.ALL is contained.");
" the SwipeEdge.ALL is contained.");
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package com.jkb.fragment.swiper.aop;

import android.app.Activity;
import android.os.Bundle;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

import java.lang.reflect.Method;

/**
* Using AspectJ tools reach AOP. this class is used to inject
* {@link com.jkb.fragment.rigger.rigger.Rigger} to Activity's lifecycle and other methods.
*
* @author JingYeoh
* <a href="mailto:[email protected]">Email me</a>
* <a href="https://github.com/justkiddingbaby">Github</a>
* <a href="http://blog.justkiddingbaby.com">Blog</a>
* @since Nov 19,2017
*/
@Aspect
public class SwipeInjection {

//****************PointCut***********************************

/**
* PointCut method.find all classes that is marked by
* {@link com.jkb.fragment.swiper.annotation.Swiper} Annotation.
*/
@Pointcut("@target(com.jkb.fragment.swiper.annotation.Swiper)")
public void annotatedWithSwiper() {
}

/**
* PointCut method.find all classes that is marked by
* {@link com.jkb.fragment.rigger.annotation.Puppet} Annotation.
*/
@Pointcut("@target(com.jkb.fragment.rigger.annotation.Puppet)")
public void annotatedWithPuppet() {
}

//****************Helper************************************ && annotatedWithPuppet() && annotatedWithSwiper()

@Pointcut("execution(* android.support.v4.app.FragmentActivity+.onCreate(..))")
public void onCreate() {
}

@Pointcut("execution(* android.support.v4.app.FragmentActivity+.onDestroy(..))")
public void onDestroy() {
}

//****************Process***********************************

@Around("onCreate()")
public Object onCreateProcess(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = joinPoint.proceed();
Object puppet = joinPoint.getTarget();
//Only inject the class that marked by Puppet annotation.

Method onCreate = invokeSwiperMethod("addToStack", Activity.class);
onCreate.invoke(getSwiperInstance(), puppet);
return result;
}

@Around("onDestroy()")
public Object onDestroyProcess(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = joinPoint.proceed();
Object puppet = joinPoint.getTarget();
//Only inject the class that marked by Puppet annotation.

Method onDestroy = invokeSwiperMethod("removeFromStack", Activity.class);
onDestroy.invoke(getSwiperInstance(), puppet);
return result;
}

/**
* Returns the instance of SwiperActivityManager class by reflect.
*/
Object getSwiperInstance() throws Exception {
Class<?> riggerClazz = Class.forName("com.jkb.fragment.swiper.SwipeActivityManager");
Method getInstance = riggerClazz.getDeclaredMethod("getInstance");
getInstance.setAccessible(true);
return getInstance.invoke(null);
}

/**
* Returns the method object of SwiperActivityManager by reflect.
*/
Method invokeSwiperMethod(String methodName, Class<?>... params) throws Exception {
Object object = getSwiperInstance();
Class<?> clazz = object.getClass();
Method method = clazz.getDeclaredMethod(methodName, params);
method.setAccessible(true);
return method;
}
}

0 comments on commit de767e9

Please sign in to comment.