targeted viewcontrollers added

This commit is contained in:
Gavriil Sitnikov 2016-05-22 13:35:29 +03:00
parent 77fe050c51
commit 9af73c11b7
6 changed files with 140 additions and 48 deletions

View File

@ -19,8 +19,8 @@ android {
dependencies {
compile project(':libraries:core')
provided 'com.android.support:appcompat-v7:23.3.0'
provided 'com.android.support:recyclerview-v7:23.3.0'
provided 'com.android.support:appcompat-v7:23.4.0'
provided 'com.android.support:recyclerview-v7:23.4.0'
provided 'io.reactivex:rxandroid:1.1.0'

View File

@ -57,10 +57,10 @@ public class ViewController<TActivity extends ViewControllerActivity<?>,
@SuppressWarnings("PMD.UnusedFormalParameter")
//UnusedFormalParameter: savedInstanceState could be used by children
public ViewController(@NonNull final CreationContext<TActivity, TFragment> creationContext,
public ViewController(@NonNull final CreationContext creationContext,
@Nullable final Bundle savedInstanceState) {
this.activity = creationContext.activity;
this.fragment = creationContext.fragment;
this.activity = (TActivity) creationContext.activity;
this.fragment = (TFragment) creationContext.fragment;
this.container = creationContext.container;
}
@ -168,18 +168,17 @@ public class ViewController<TActivity extends ViewControllerActivity<?>,
/**
* Class to simplify constructor override.
*/
public static class CreationContext<TActivity extends ViewControllerActivity<?>,
TFragment extends ViewControllerFragment<?, TActivity>> {
public static class CreationContext {
@NonNull
private final TActivity activity;
private final ViewControllerActivity activity;
@NonNull
private final TFragment fragment;
private final ViewControllerFragment fragment;
@NonNull
private final ViewGroup container;
public CreationContext(@NonNull final TActivity activity,
@NonNull final TFragment fragment,
public CreationContext(@NonNull final ViewControllerActivity activity,
@NonNull final ViewControllerFragment fragment,
@NonNull final ViewGroup container) {
this.activity = activity;
this.fragment = fragment;

View File

@ -10,7 +10,9 @@ import android.support.v4.app.FragmentTransaction;
import ru.touchin.roboswag.components.navigation.activities.ViewControllerActivity;
import ru.touchin.roboswag.components.navigation.fragments.SimpleViewControllerFragment;
import ru.touchin.roboswag.components.navigation.fragments.StatelessTargetedViewControllerFragment;
import ru.touchin.roboswag.components.navigation.fragments.StatelessViewControllerFragment;
import ru.touchin.roboswag.components.navigation.fragments.TargetedViewControllerFragment;
import ru.touchin.roboswag.components.navigation.fragments.ViewControllerFragment;
import rx.functions.Func1;
@ -27,50 +29,50 @@ public class ViewControllerNavigation<TActivity extends ViewControllerActivity<?
}
public <TState extends AbstractState> void push(@NonNull final Class<? extends ViewControllerFragment<TState, TActivity>> fragmentClass,
@NonNull final TState state) {
@NonNull final TState state) {
addToStack(fragmentClass, null, ViewControllerFragment.createState(state), null, null);
}
public <TState extends AbstractState> void push(@NonNull final Class<? extends ViewControllerFragment<TState, TActivity>> fragmentClass,
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
addToStack(fragmentClass, null, ViewControllerFragment.createState(state), null, transactionSetup);
}
public <TState extends AbstractState> void pushForResult(@NonNull final Class<? extends ViewControllerFragment<TState, TActivity>> fragmentClass,
@NonNull final Fragment targetFragment,
@NonNull final TState state) {
@NonNull final Fragment targetFragment,
@NonNull final TState state) {
addToStack(fragmentClass, targetFragment, ViewControllerFragment.createState(state),
fragmentClass.getName() + ';' + WITH_TARGET_FRAGMENT_TAG_MARK, null);
}
public <TState extends AbstractState> void pushForResult(@NonNull final Class<? extends ViewControllerFragment<TState, TActivity>> fragmentClass,
@NonNull final Fragment targetFragment,
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
@NonNull final Fragment targetFragment,
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
addToStack(fragmentClass, targetFragment, ViewControllerFragment.createState(state),
fragmentClass.getName() + ';' + WITH_TARGET_FRAGMENT_TAG_MARK, transactionSetup);
}
public <TState extends AbstractState> void setAsTop(@NonNull final Class<? extends ViewControllerFragment<TState, TActivity>> fragmentClass,
@NonNull final TState state) {
@NonNull final TState state) {
setAsTop(fragmentClass, ViewControllerFragment.createState(state), null);
}
public <TState extends AbstractState> void setAsTop(@NonNull final Class<? extends ViewControllerFragment<TState, TActivity>> fragmentClass,
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
setAsTop(fragmentClass, ViewControllerFragment.createState(state), transactionSetup);
}
public <TState extends AbstractState> void setInitial(@NonNull final Class<? extends ViewControllerFragment<TState, TActivity>> fragmentClass,
@NonNull final TState state) {
@NonNull final TState state) {
setInitial(fragmentClass, ViewControllerFragment.createState(state), null);
}
public <TState extends AbstractState> void setInitial(@NonNull final Class<? extends ViewControllerFragment<TState, TActivity>> fragmentClass,
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
setInitial(fragmentClass, ViewControllerFragment.createState(state), transactionSetup);
}
@ -81,7 +83,7 @@ public class ViewControllerNavigation<TActivity extends ViewControllerActivity<?
public <TState extends AbstractState> void pushViewController(@NonNull final Class<? extends ViewController<TActivity,
SimpleViewControllerFragment<TState, TActivity>>> viewControllerClass,
@NonNull final TState state) {
@NonNull final TState state) {
addViewControllerToStack(viewControllerClass, null, state, null, null);
}
@ -98,35 +100,45 @@ public class ViewControllerNavigation<TActivity extends ViewControllerActivity<?
addStatelessViewControllerToStack(viewControllerClass, null, null, transactionSetup);
}
public void pushViewControllerForResult(
@NonNull final Class<? extends ViewController<TActivity, StatelessViewControllerFragment<TActivity>>> viewControllerClass,
@NonNull final Fragment targetFragment) {
addStatelessViewControllerToStack(viewControllerClass, targetFragment,
public <TTargetState extends AbstractState,
TTargetFragment extends ViewControllerFragment<TTargetState, TActivity>> void pushViewControllerForResult(
@NonNull final Class<? extends ViewController<TActivity,
StatelessTargetedViewControllerFragment<TTargetState, TActivity>>> viewControllerClass,
@NonNull final TTargetFragment targetFragment) {
addTargetedStatelessViewControllerToStack(viewControllerClass, targetFragment,
viewControllerClass.getName() + ';' + WITH_TARGET_FRAGMENT_TAG_MARK, null);
}
public <TState extends AbstractState> void pushViewControllerForResult(
@NonNull final Class<? extends ViewController<TActivity, SimpleViewControllerFragment<TState, TActivity>>> viewControllerClass,
@NonNull final Fragment targetFragment,
@SuppressWarnings("CPD-START")
public <TState extends AbstractState, TTargetState extends AbstractState,
TTargetFragment extends ViewControllerFragment<TTargetState, TActivity>> void pushViewControllerForResult(
@NonNull final Class<? extends ViewController<TActivity,
TargetedViewControllerFragment<TState, TTargetState, TActivity>>> viewControllerClass,
@NonNull final TTargetFragment targetFragment,
@NonNull final TState state) {
addViewControllerToStack(viewControllerClass, targetFragment, state,
addTargetedViewControllerToStack(viewControllerClass, targetFragment, state,
viewControllerClass.getName() + ';' + WITH_TARGET_FRAGMENT_TAG_MARK, null);
}
public <TState extends AbstractState> void pushViewControllerForResult(
@NonNull final Class<? extends ViewController<TActivity, SimpleViewControllerFragment<TState, TActivity>>> viewControllerClass,
@NonNull final Fragment targetFragment,
@SuppressWarnings("CPD-END")
public <TState extends AbstractState, TTargetState extends AbstractState,
TTargetFragment extends ViewControllerFragment<TTargetState, TActivity>> void pushViewControllerForResult(
@NonNull final Class<? extends ViewController<TActivity,
TargetedViewControllerFragment<TState, TTargetState, TActivity>>> viewControllerClass,
@NonNull final TTargetFragment targetFragment,
@NonNull final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
addViewControllerToStack(viewControllerClass, targetFragment, state,
addTargetedViewControllerToStack(viewControllerClass, targetFragment, state,
viewControllerClass.getName() + ';' + WITH_TARGET_FRAGMENT_TAG_MARK, transactionSetup);
}
public void pushViewControllerForResult(
@NonNull final Class<? extends ViewController<TActivity, StatelessViewControllerFragment<TActivity>>> viewControllerClass,
@NonNull final Fragment targetFragment,
public <TTargetState extends AbstractState,
TTargetFragment extends ViewControllerFragment<TTargetState, TActivity>> void pushViewControllerForResult(
@NonNull final Class<? extends ViewController<TActivity,
StatelessTargetedViewControllerFragment<TTargetState, TActivity>>> viewControllerClass,
@NonNull final TTargetFragment targetFragment,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
addStatelessViewControllerToStack(viewControllerClass, targetFragment,
addTargetedStatelessViewControllerToStack(viewControllerClass, targetFragment,
viewControllerClass.getName() + ';' + WITH_TARGET_FRAGMENT_TAG_MARK, transactionSetup);
}
@ -191,13 +203,32 @@ public class ViewControllerNavigation<TActivity extends ViewControllerActivity<?
SimpleViewControllerFragment.createState(viewControllerClass, state), backStackTag, transactionSetup);
}
protected <TState extends AbstractState> void addTargetedViewControllerToStack(
@NonNull final Class<? extends ViewController<TActivity, ? extends ViewControllerFragment<TState, TActivity>>> viewControllerClass,
@NonNull final Fragment targetFragment,
@NonNull final TState state,
@Nullable final String backStackTag,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
addToStack(TargetedViewControllerFragment.class, targetFragment,
SimpleViewControllerFragment.createState(viewControllerClass, state), backStackTag, transactionSetup);
}
protected void addStatelessViewControllerToStack(
@NonNull final Class<? extends ViewController<TActivity, ? extends ViewControllerFragment<AbstractState, TActivity>>> viewControllerClass,
@Nullable final Fragment targetFragment,
@Nullable final String backStackTag,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
addToStack(StatelessViewControllerFragment.class, targetFragment,
SimpleViewControllerFragment.createState(viewControllerClass, null), backStackTag, transactionSetup);
StatelessViewControllerFragment.createState(viewControllerClass, null), backStackTag, transactionSetup);
}
protected <TState extends AbstractState> void addTargetedStatelessViewControllerToStack(
@NonNull final Class<? extends ViewController<TActivity, ? extends ViewControllerFragment<TState, TActivity>>> viewControllerClass,
@NonNull final Fragment targetFragment,
@Nullable final String backStackTag,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
addToStack(StatelessTargetedViewControllerFragment.class, targetFragment,
StatelessTargetedViewControllerFragment.createState(viewControllerClass, null), backStackTag, transactionSetup);
}
}

View File

@ -0,0 +1,32 @@
/*
* Copyright (c) 2015 RoboSwag (Gavriil Sitnikov, Vsevolod Ivanov)
*
* This file is part of RoboSwag library.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package ru.touchin.roboswag.components.navigation.fragments;
import ru.touchin.roboswag.components.navigation.AbstractState;
import ru.touchin.roboswag.components.navigation.activities.ViewControllerActivity;
/**
* Created by Gavriil Sitnikov on 12/03/2016.
* TODO: fill description
*/
public class StatelessTargetedViewControllerFragment<TTargetState extends AbstractState,
TActivity extends ViewControllerActivity<?>>
extends TargetedViewControllerFragment<AbstractState, TTargetState, TActivity> {
}

View File

@ -1,14 +1,46 @@
/*
* Copyright (c) 2015 RoboSwag (Gavriil Sitnikov, Vsevolod Ivanov)
*
* This file is part of RoboSwag library.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package ru.touchin.roboswag.components.navigation.fragments;
import android.support.annotation.NonNull;
import ru.touchin.roboswag.components.navigation.AbstractState;
import ru.touchin.roboswag.components.navigation.activities.ViewControllerActivity;
import ru.touchin.roboswag.core.utils.ShouldNotHappenException;
/**
* Created by Gavriil Sitnikov on 11/04/2016.
* TODO: fill description
*/
public class TargetedViewControllerFragment<TState extends AbstractState, TActivity extends ViewControllerActivity<?>>
public class TargetedViewControllerFragment<TState extends AbstractState,
TTargetState extends AbstractState,
TActivity extends ViewControllerActivity<?>>
extends SimpleViewControllerFragment<TState, TActivity> {
@SuppressWarnings("unchecked")
@NonNull
public ViewControllerFragment<TTargetState, TActivity> getTarget() {
if (!(getTargetFragment() instanceof ViewControllerFragment)) {
throw new ShouldNotHappenException();
}
return (ViewControllerFragment<TTargetState, TActivity>) getTargetFragment();
}
}

View File

@ -121,9 +121,7 @@ public abstract class ViewControllerFragment<TState extends AbstractState, TActi
throw OnErrorThrowable.from(new ShouldNotHappenException("There should be single constructor for " + getViewControllerClass()));
}
final Constructor<?> constructor = getViewControllerClass().getConstructors()[0];
final ViewController.CreationContext<TActivity,
? extends ViewControllerFragment<TState, TActivity>> creationContext
= new ViewController.CreationContext<>(activity, this, viewInfo.first);
final ViewController.CreationContext creationContext = new ViewController.CreationContext(activity, this, viewInfo.first);
try {
switch (constructor.getParameterTypes().length) {
case 2: