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

Commit

Permalink
Merge pull request #72 from nhaarman/release-0.16.0
Browse files Browse the repository at this point in the history
Release 0.16.0
  • Loading branch information
nhaarman committed Jan 6, 2016
2 parents 4181e74 + 0556b22 commit 04c6652
Show file tree
Hide file tree
Showing 9 changed files with 313 additions and 104 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Changelog

Version 0.16.0 *(2016-01-06)*
-----------------------------------

* Screens are notified of creation and destroy.

Version 0.15.1 *(2015-12-15)*
-----------------------------------

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,12 @@ protected void onActivityResult(final int requestCode, final int resultCode, fin
mDelegate.onActivityResult(requestCode, resultCode, data);
}

@Override
protected void onDestroy() {
mDelegate.onDestroy();
super.onDestroy();
}

/**
* Returns the {@link Triad} instance to be used to navigate between {@link Screen}s.
*/
Expand Down
6 changes: 5 additions & 1 deletion triad/src/main/java/com/nhaarman/triad/Backstack.java
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,12 @@ public Builder push(@NonNull final Screen<?> screen) {

@NonNull
public Builder push(@NonNull final Screen<?> screen, @Nullable final TransitionAnimator animator) {
mBackstack.push(new Entry(screen, animator));
return push(new Entry(screen, animator));
}

@NonNull
public Builder push(@NonNull final Entry<?> entry) {
mBackstack.push(entry);
return this;
}

Expand Down
14 changes: 10 additions & 4 deletions triad/src/main/java/com/nhaarman/triad/Screen.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,6 @@ protected ViewGroup createView(@NonNull final ViewGroup parent) {
@NonNull
protected abstract Presenter<?, ?> createPresenter(int viewId);

boolean onBackPressed() {
return false;
}

void setApplicationComponent(@Nullable final ApplicationComponent applicationComponent) {
mApplicationComponent = applicationComponent;
}
Expand All @@ -77,4 +73,14 @@ void saveState(@NonNull final ViewGroup view) {
void restoreState(@NonNull final ViewGroup view) {
view.restoreHierarchyState(mState);
}

protected void onCreate() {
}

protected boolean onBackPressed() {
return false;
}

protected void onDestroy() {
}
}
94 changes: 73 additions & 21 deletions triad/src/main/java/com/nhaarman/triad/Triad.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,6 @@ private Triad(@NonNull final Backstack backstack) {
}

private Triad(@NonNull final Backstack backstack, @Nullable final Listener<?> listener) {
new Exception().printStackTrace();

mListener = listener;
mBackstack = backstack;

Expand Down Expand Up @@ -303,6 +301,10 @@ public interface Callback {

public interface Listener<T> {

void screenPushed(@NonNull Screen<T> pushedScreen);

void screenPopped(@NonNull Screen<T> poppedScreen);

/**
* Notifies the listener that the backstack will forward to a new Screen.
*
Expand Down Expand Up @@ -351,21 +353,33 @@ void enqueue(@NonNull final Transition transition) {
}
}

protected void forward(@NonNull final Backstack nextBackstack) {
protected void notifyScreenPopped(@NonNull final Screen<?> screen) {
checkState(mListener != null, "Listener is null. Be sure to call setListener(Listener).");

mListener.screenPopped(screen);
}

protected void notifyScreenPushed(@NonNull final Screen<?> screen) {
checkState(mListener != null, "Listener is null. Be sure to call setListener(Listener).");

mListener.screenPushed(screen);
}

protected void notifyForward(@NonNull final Backstack nextBackstack) {
checkState(mListener != null, "Listener is null. Be sure to call setListener(Listener).");

mNextBackstack = nextBackstack;
mListener.forward(nextBackstack.current().screen, nextBackstack.current().animator, this);
}

protected void backward(@NonNull final Backstack nextBackstack, @Nullable final TransitionAnimator animator) {
protected void notifyBackward(@NonNull final Backstack nextBackstack, @Nullable final TransitionAnimator animator) {
checkState(mListener != null, "Listener is null. Be sure to call setListener(Listener).");

mNextBackstack = nextBackstack;
mListener.backward(nextBackstack.current().screen, animator, this);
}

protected void replace(@NonNull final Backstack nextBackstack) {
protected void notifyReplace(@NonNull final Backstack nextBackstack) {
checkState(mListener != null, "Listener is null. Be sure to call setListener(Listener).");

mNextBackstack = nextBackstack;
Expand Down Expand Up @@ -405,7 +419,9 @@ public void execute() {
Backstack.Builder builder = mBackstack.buildUpon();
Backstack.Entry<?> entry = checkNotNull(builder.pop(), "Popped entry is null.");
Backstack newBackstack = builder.build();
backward(newBackstack, entry.animator);

notifyScreenPopped(entry.screen);
notifyBackward(newBackstack, entry.animator);
}
}
}
Expand All @@ -426,11 +442,13 @@ private ReplaceWithTransition(@NonNull final Screen<?> screen, @Nullable final T
@Override
public void execute() {
Backstack.Builder builder = mBackstack.buildUpon();
builder.pop();
Backstack.Entry<?> entry = checkNotNull(builder.pop(), "Popped entry is null");
builder.push(mScreen, mAnimator);
Backstack newBackstack = builder.build();

replace(newBackstack);
notifyScreenPopped(entry.screen);
notifyScreenPushed(mScreen);
notifyReplace(newBackstack);
}
}

Expand All @@ -445,7 +463,14 @@ private ForwardTransition(@NonNull final Backstack newBackstack) {

@Override
public void execute() {
forward(mNewBackstack);
for (Screen<?> screen : mBackstack) {
notifyScreenPopped(screen);
}
for (Iterator<Screen<?>> it = mNewBackstack.reverseIterator(); it.hasNext(); ) {
notifyScreenPushed(it.next());
}

notifyForward(mNewBackstack);
}
}

Expand All @@ -470,18 +495,21 @@ public void execute() {
}

Backstack.Builder builder = mBackstack.buildUpon();
Backstack.Builder poppedScreens = Backstack.emptyBuilder();
int count = 0;
// Take care to leave the original screen instance on the stack, if we find it. This enables
// some arguably bad behavior on the part of clients, but it's still probably the right thing
// to do.
Backstack.Entry<?> lastPoppedEntry = null;
for (Iterator<Backstack.Entry<?>> it = mBackstack.reverseEntryIterator(); it.hasNext(); ) {
Screen<?> screen = it.next().screen;

if (screen.equals(mScreen)) {
// Clear up to the target screen.
for (int i = 0; i < mBackstack.size() - count; i++) {
lastPoppedEntry = builder.pop();
Backstack.Entry<?> entry = builder.pop();
if (entry != null) {
poppedScreens.push(entry);
}
}
break;
} else {
Expand All @@ -490,14 +518,22 @@ public void execute() {
}

Backstack newBackstack;
if (lastPoppedEntry != null) {
builder.push(lastPoppedEntry.screen, lastPoppedEntry.animator);
Backstack poppedBackstack = poppedScreens.build();
if (poppedBackstack.size() != 0) {
for (Iterator<Backstack.Entry<?>> it = poppedBackstack.reverseEntryIterator(); it.hasNext(); ) {
Backstack.Entry<?> entry = it.next();
notifyScreenPopped(entry.screen);
}

builder.push(poppedBackstack.current());
newBackstack = builder.build();
backward(newBackstack, mAnimator);
notifyBackward(newBackstack, mAnimator);
} else {
notifyScreenPushed(mScreen);

builder.push(mScreen, mAnimator);
newBackstack = builder.build();
forward(newBackstack);
notifyForward(newBackstack);
}
}
}
Expand All @@ -506,7 +542,7 @@ private class ShowTransition extends Transition {

@Override
public void execute() {
forward(mBackstack);
notifyForward(mBackstack);
}
}

Expand All @@ -521,8 +557,9 @@ private StartWithTransition(@NonNull final Screen<?> screen) {

@Override
public void execute() {
Backstack newBackstack = mBackstack.buildUpon().push(mScreen).build();
forward(newBackstack);
Backstack newBackstack = Backstack.single(mScreen);
notifyScreenPushed(mScreen);
notifyForward(newBackstack);
}
}

Expand All @@ -542,7 +579,8 @@ private GoToTransition(@NonNull final Screen<?> screen, @Nullable final Transiti
@Override
public void execute() {
Backstack newBackstack = mBackstack.buildUpon().push(mScreen, mAnimator).build();
forward(newBackstack);
notifyScreenPushed(mScreen);
notifyForward(newBackstack);
}
}

Expand All @@ -557,7 +595,14 @@ private BackwardTransition(@NonNull final Backstack newBackstack) {

@Override
public void execute() {
backward(mNewBackstack, null);
for (Screen<?> screen : mBackstack) {
notifyScreenPopped(screen);
}
for (Iterator<Screen<?>> it = mNewBackstack.reverseIterator(); it.hasNext(); ) {
notifyScreenPushed(it.next());
}

notifyBackward(mNewBackstack, null);
}
}

Expand All @@ -572,7 +617,14 @@ private ReplaceTransition(@NonNull final Backstack newBackstack) {

@Override
public void execute() {
replace(mNewBackstack);
for (Screen<?> screen : mBackstack) {
notifyScreenPopped(screen);
}
for (Iterator<Screen<?>> it = mNewBackstack.reverseIterator(); it.hasNext(); ) {
notifyScreenPushed(it.next());
}

notifyReplace(mNewBackstack);
}
}
}
6 changes: 6 additions & 0 deletions triad/src/main/java/com/nhaarman/triad/TriadActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,12 @@ protected void onActivityResult(final int requestCode, final int resultCode, fin
mDelegate.onActivityResult(requestCode, resultCode, data);
}

@Override
protected void onDestroy() {
mDelegate.onDestroy();
super.onDestroy();
}

/**
* Returns the {@link Triad} instance to be used to navigate between {@link Screen}s.
*/
Expand Down
23 changes: 21 additions & 2 deletions triad/src/main/java/com/nhaarman/triad/TriadDelegate.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import android.support.annotation.Nullable;
import android.util.SparseArray;
import android.view.ViewGroup;
import java.util.Iterator;

import static com.nhaarman.triad.Preconditions.checkNotNull;
import static com.nhaarman.triad.Preconditions.checkState;
Expand Down Expand Up @@ -111,6 +112,15 @@ public void onActivityResult(final int requestCode, final int resultCode, final
mTriad.onActivityResult(requestCode, resultCode, data);
}

public void onDestroy() {
checkState(mTriad != null, "Triad is null. Make sure to call TriadDelegate.onCreate()");

for (Iterator<Screen<?>> iterator = mTriad.getBackstack().reverseIterator(); iterator.hasNext(); ) {
Screen<?> screen = iterator.next();
screen.onDestroy();
}
}

/**
* Returns the {@link Triad} instance to be used to navigate between {@link Screen}s.
*/
Expand Down Expand Up @@ -141,6 +151,17 @@ public static <T> TriadDelegate<T> createFor(@NonNull final Activity activity) {

private class MyTriadListener implements Triad.Listener<ApplicationComponent> {

@Override
public void screenPushed(@NonNull final Screen<ApplicationComponent> pushedScreen) {
pushedScreen.setApplicationComponent(mApplicationComponent);
pushedScreen.onCreate();
}

@Override
public void screenPopped(@NonNull final Screen<ApplicationComponent> poppedScreen) {
poppedScreen.onDestroy();
}

@Override
public void forward(@NonNull final Screen<ApplicationComponent> newScreen, @Nullable final TransitionAnimator animator, @NonNull final Triad.Callback callback) {
if (mCurrentScreen != null && mCurrentView != null) {
Expand All @@ -150,7 +171,6 @@ public void forward(@NonNull final Screen<ApplicationComponent> newScreen, @Null
}

mCurrentScreen = newScreen;
newScreen.setApplicationComponent(mApplicationComponent);

ViewGroup newView = newScreen.createView(mTriadView);
mTriadView.forward(mCurrentView, newView, animator, callback);
Expand All @@ -176,7 +196,6 @@ public void backward(@NonNull final Screen<ApplicationComponent> newScreen, @Nul
@Override
public void replace(@NonNull final Screen<ApplicationComponent> newScreen, @Nullable final TransitionAnimator animator, @NonNull final Triad.Callback callback) {
mCurrentScreen = newScreen;
newScreen.setApplicationComponent(mApplicationComponent);

ViewGroup newView = newScreen.createView(mTriadView);
mTriadView.forward(mCurrentView, newView, animator, callback);
Expand Down
Loading

0 comments on commit 04c6652

Please sign in to comment.