Skip to content
This repository has been archived by the owner on Mar 18, 2024. It is now read-only.

Commit

Permalink
Merge pull request #35 from R3PI/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
tomjhall committed Nov 16, 2016
2 parents b33e0c9 + b258e16 commit bbc28bc
Show file tree
Hide file tree
Showing 27 changed files with 579 additions and 515 deletions.
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,17 @@
Change Log
==========

Version 1.1.0
----------------------------
* Added AnimationHandler a simple api to handle generic transition animations.
* Moved enums to IntDef for library size optimization.
* Changed nested class access to private methods & attributes to package private as part of library size optimization.
* Migrated AutoParcel to AutoValue.
* Deprecated HandlesBackPresses - this can be handled in a custom callback from onBackPress in you activity.
* Deprecated HasTraversalAnimation - use AnimationHandler.
* Call to replace with 0 views will result in a call to push.
* Added replaceStack with one view method.

Version 1.0.0
----------------------------
* Added safe operations helper class.
Expand Down
52 changes: 26 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Defrag is available in the jCenter repository:

```java
dependencies {
compile 'com.solera.defrag:defrag:1.0.0'
compile 'com.solera.defrag:defrag:1.1.0'
}
```

Expand Down Expand Up @@ -44,32 +44,32 @@ is easy!
Custom transition animations
---

It's easy to create custom transition animations, all you have to do is implement HasTraversalAnimation:
It's easy to create custom transition animations, just call setAnimationHandler with your own AnimationHandler:
```java
public class ViewWithTraversalAnimation extends FrameLayout implements HasTraversalAnimation {
...
/**
* @param fromView the view that we are traversing from.
* @return an animation that will be run for the traversal, or null if the default should be run.
*/
@Override @Nullable Animator createAnimation(@NonNull View fromView) {
final AnimatorSet set = new AnimatorSet();
final AnimatorSet exitAnim = new AnimatorSet();
exitAnim.setInterpolator(new AccelerateInterpolator());
exitAnim.play(ObjectAnimator.ofFloat(fromView, View.ALPHA, 0.0f))
.with(ObjectAnimator.ofFloat(fromView, View.TRANSLATION_X, 0f, -200));

setAlpha(0f);
final AnimatorSet enterAnim = new AnimatorSet();
enterAnim.setInterpolator(new DecelerateInterpolator());
enterAnim.setStartDelay(300);
enterAnim.play(ObjectAnimator.ofFloat(this, View.ALPHA, 0.0f, 1.0f))
.with(ObjectAnimator.ofFloat(this, View.TRANSLATION_X, 100f, 0));

set.play(exitAnim).with(enterAnim);

return set;
public class CustomAnimationHandler implements AnimationHandler {
@Nullable TraversalAnimation createAnimation(@NonNull View from, @NonNull View to,
@TraversingOperation int operation) {
boolean forward = operation != TraversingOperation.POP;

AnimatorSet set = new AnimatorSet();

set.setInterpolator(new DecelerateInterpolator());

final int width = from.getWidth();

if (forward) {
to.setTranslationX(width);
set.play(ObjectAnimator.ofFloat(from, View.TRANSLATION_X, 0 - (width / 3)));
set.play(ObjectAnimator.ofFloat(to, View.TRANSLATION_X, 0));
} else {
to.setTranslationX(0 - (width / 3));
set.play(ObjectAnimator.ofFloat(from, View.TRANSLATION_X, width));
set.play(ObjectAnimator.ofFloat(to, View.TRANSLATION_X, 0));
}

return TraversalAnimation.newInstance(set,
forward ? TraversalAnimation.ABOVE : TraversalAnimation.BELOW);
}
}
}
```
Expand Down
2 changes: 0 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,4 @@ dependencies {
compile "com.jakewharton.rxbinding:rxbinding-appcompat-v7:${rxbinding_lib_version}"
compile "com.jakewharton.rxbinding:rxbinding-design:${rxbinding_lib_version}"
compile "com.jakewharton.rxbinding:rxbinding-recyclerview-v7:${rxbinding_lib_version}"
compile "com.github.frankiesardo:auto-parcel:${auto_parcel_lib_version}"
apt "com.github.frankiesardo:auto-parcel-processor:${auto_parcel_lib_version}"
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,20 @@

import android.os.Bundle;
import android.support.annotation.NonNull;

import com.solera.defrag.ViewStack;

public class BreakdownPresenter extends Presenter<BreakdownPresenter.View> {
private static final String TOTAL_COST = "totalCost";
private static final String TOTAL_PEOPLE = "totalPeople";

interface View extends PresenterView {
void setUi(@NonNull String totalCost, @NonNull String totalPeople, @NonNull String perPerson);
}

public static void push(@NonNull ViewStack viewStack, int totalCost, int totalPeople) {
final Bundle parameters = new Bundle();
parameters.putInt(TOTAL_COST, totalCost);
parameters.putInt(TOTAL_PEOPLE, totalPeople);
viewStack.pushWithParameters(R.layout.breakdown, parameters);
}

@Override
protected void onTakeView() {
@Override protected void onTakeView() {
super.onTakeView();

final ViewStack viewStack = ViewStackHelper.getViewStack(getContext());
Expand All @@ -49,8 +43,11 @@ protected void onTakeView() {
final int totalPeople = parameters.getInt(TOTAL_PEOPLE);
final int result = totalCost / totalPeople;

getView().setUi(Integer.toString(totalCost),
Integer.toString(totalPeople),
getView().setUi(Integer.toString(totalCost), Integer.toString(totalPeople),
Integer.toString(result));
}

interface View extends PresenterView {
void setUi(@NonNull String totalCost, @NonNull String totalPeople, @NonNull String perPerson);
}
}
24 changes: 8 additions & 16 deletions app/src/main/java/com/solera/defragsample/BreakdownView.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,48 +20,40 @@
import android.util.AttributeSet;
import android.widget.FrameLayout;
import android.widget.TextView;

import butterknife.Bind;
import butterknife.ButterKnife;

public class BreakdownView extends FrameLayout implements BreakdownPresenter.View {
private final BreakdownPresenter mPresenter = new BreakdownPresenter();
@Bind(R.id.textview_costvalue)
TextView costTextView;
@Bind(R.id.textview_peoplevalue)
TextView peopleTextView;
@Bind(R.id.textview_perpersonvalue)
TextView perPersonTextView;
@Bind(R.id.textview_costvalue) TextView costTextView;
@Bind(R.id.textview_peoplevalue) TextView peopleTextView;
@Bind(R.id.textview_perpersonvalue) TextView perPersonTextView;

public BreakdownView(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
public void setUi(@NonNull String totalCost, @NonNull String totalPeople,
@NonNull String perPerson) {
@Override public void setUi(@NonNull String totalCost, @NonNull String totalPeople,
@NonNull String perPerson) {
costTextView.setText(totalCost);
peopleTextView.setText(totalPeople);
perPersonTextView.setText(perPerson);
}

@Override
protected void onFinishInflate() {
@Override protected void onFinishInflate() {
super.onFinishInflate();
ButterKnife.bind(this);
}

@Override
protected void onAttachedToWindow() {
@Override protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (isInEditMode()) {
return;
}
mPresenter.takeView(this);
}

@Override
protected void onDetachedFromWindow() {
@Override protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mPresenter.dropView();
}
Expand Down
65 changes: 48 additions & 17 deletions app/src/main/java/com/solera/defragsample/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,56 +15,58 @@
*/
package com.solera.defragsample;

import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;

import android.view.View;
import android.view.animation.DecelerateInterpolator;
import butterknife.Bind;
import butterknife.ButterKnife;
import com.solera.defrag.AnimationHandler;
import com.solera.defrag.TraversalAnimation;
import com.solera.defrag.TraversingOperation;
import com.solera.defrag.TraversingState;
import com.solera.defrag.ViewStack;
import com.solera.defrag.ViewStackListener;

import butterknife.Bind;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity {
@Bind(R.id.viewstack)
ViewStack viewStack;
@Bind(R.id.viewstack) ViewStack viewStack;
private boolean disableUI = false;

@Override
public void onBackPressed() {
@Override public void onBackPressed() {
if (disableUI) {
return;
}
if (!viewStack.onBackPressed()) {
if (!viewStack.pop()) {
super.onBackPressed();
}
}

@Override
public boolean dispatchTouchEvent(@NonNull MotionEvent ev) {
@Override public boolean dispatchTouchEvent(@NonNull MotionEvent ev) {
return disableUI || super.dispatchTouchEvent(ev);
}

@Override
public Object getSystemService(@NonNull String name) {
@Override public Object getSystemService(@NonNull String name) {
if (ViewStackHelper.matchesServiceName(name)) {
return viewStack;
}
return super.getSystemService(name);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ButterKnife.bind(this);

viewStack.setAnimationHandler(createCustomAnimationHandler());

viewStack.addTraversingListener(new ViewStackListener() {
@Override
public void onTraversing(@NonNull TraversingState traversingState) {
@Override public void onTraversing(@TraversingState int traversingState) {
disableUI = traversingState != TraversingState.IDLE;
}
});
Expand All @@ -73,4 +75,33 @@ public void onTraversing(@NonNull TraversingState traversingState) {
viewStack.push(R.layout.totalcost);
}
}

@NonNull private AnimationHandler createCustomAnimationHandler() {
return new AnimationHandler() {
@Nullable @Override
public TraversalAnimation createAnimation(@NonNull View from, @NonNull View to,
@TraversingOperation int operation) {
boolean forward = operation != TraversingOperation.POP;

AnimatorSet set = new AnimatorSet();

set.setInterpolator(new DecelerateInterpolator());

final int width = from.getWidth();

if (forward) {
to.setTranslationX(width);
set.play(ObjectAnimator.ofFloat(from, View.TRANSLATION_X, 0 - (width / 3)));
set.play(ObjectAnimator.ofFloat(to, View.TRANSLATION_X, 0));
} else {
to.setTranslationX(0 - (width / 3));
set.play(ObjectAnimator.ofFloat(from, View.TRANSLATION_X, width));
set.play(ObjectAnimator.ofFloat(to, View.TRANSLATION_X, 0));
}

return TraversalAnimation.newInstance(set,
forward ? TraversalAnimation.ABOVE : TraversalAnimation.BELOW);
}
};
}
}
6 changes: 1 addition & 5 deletions app/src/main/java/com/solera/defragsample/Presenter.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

import android.content.Context;
import android.support.annotation.NonNull;

import rx.Subscription;
import rx.exceptions.OnErrorNotImplementedException;
import rx.functions.Action1;
Expand Down Expand Up @@ -83,12 +82,9 @@ protected final T getView() {
*/
protected Action1<Throwable> getDefaultErrorAction() {
return new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
@Override public void call(Throwable throwable) {
throw new OnErrorNotImplementedException("RxError source", throwable);
}
};

}

}
3 changes: 1 addition & 2 deletions app/src/main/java/com/solera/defragsample/PresenterView.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,5 @@
* Based presenter view interface.
*/
public interface PresenterView {
@NonNull
Context getContext();
@NonNull Context getContext();
}
Loading

0 comments on commit bbc28bc

Please sign in to comment.