logic waiting removed

This commit is contained in:
Gavriil Sitnikov 2016-03-24 20:08:41 +03:00
parent 2a86fab405
commit a9efe49446
8 changed files with 159 additions and 205 deletions

View File

@ -25,12 +25,14 @@ import android.support.annotation.Nullable;
import java.io.Serializable;
import ru.touchin.roboswag.components.utils.Logic;
/**
* Created by Gavriil Sitnikov on 07/03/2016.
* TODO: fill description
*/
public class SimpleViewControllerFragment<TState extends Serializable, TLogicBridge, TActivity extends ViewControllerActivity<TLogicBridge>>
extends ViewControllerFragment<TState, TLogicBridge, TActivity> {
public class SimpleViewControllerFragment<TState extends Serializable, TLogic extends Logic, TActivity extends ViewControllerActivity<TLogic>>
extends ViewControllerFragment<TState, TLogic, TActivity> {
private static final String VIEW_CONTROLLER_CLASS_EXTRA = "VIEW_CONTROLLER_CLASS_EXTRA";
@ -49,13 +51,13 @@ public class SimpleViewControllerFragment<TState extends Serializable, TLogicBri
return result;
}
private Class<? extends ViewController<TLogicBridge, TActivity,
? extends ViewControllerFragment<TState, TLogicBridge, TActivity>>> viewControllerClass;
private Class<? extends ViewController<TLogic, TActivity,
? extends ViewControllerFragment<TState, TLogic, TActivity>>> viewControllerClass;
@NonNull
@Override
public Class<? extends ViewController<TLogicBridge, TActivity,
? extends ViewControllerFragment<TState, TLogicBridge, TActivity>>> getViewControllerClass() {
public Class<? extends ViewController<TLogic, TActivity,
? extends ViewControllerFragment<TState, TLogic, TActivity>>> getViewControllerClass() {
return viewControllerClass;
}
@ -63,8 +65,8 @@ public class SimpleViewControllerFragment<TState extends Serializable, TLogicBri
@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewControllerClass = (Class<? extends ViewController<TLogicBridge, TActivity,
? extends ViewControllerFragment<TState, TLogicBridge, TActivity>>>) getArguments().getSerializable(VIEW_CONTROLLER_CLASS_EXTRA);
viewControllerClass = (Class<? extends ViewController<TLogic, TActivity,
? extends ViewControllerFragment<TState, TLogic, TActivity>>>) getArguments().getSerializable(VIEW_CONTROLLER_CLASS_EXTRA);
}
}

View File

@ -21,10 +21,12 @@ package ru.touchin.roboswag.components.navigation;
import java.io.Serializable;
import ru.touchin.roboswag.components.utils.Logic;
/**
* Created by Gavriil Sitnikov on 12/03/2016.
* TODO: fill description
*/
public class StatelessViewControllerFragment<TLogicBridge, TActivity extends ViewControllerActivity<TLogicBridge>>
extends SimpleViewControllerFragment<Serializable, TLogicBridge, TActivity> {
public class StatelessViewControllerFragment<TLogic extends Logic, TActivity extends ViewControllerActivity<TLogic>>
extends SimpleViewControllerFragment<Serializable, TLogic, TActivity> {
}

View File

@ -30,6 +30,7 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.ViewGroup;
import ru.touchin.roboswag.components.utils.Logic;
import ru.touchin.roboswag.core.log.Lc;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
@ -39,14 +40,12 @@ import rx.subjects.BehaviorSubject;
* Created by Gavriil Sitnikov on 21/10/2015.
* Class to control view of specific fragment, activity and application by logic bridge.
*/
public class ViewController<TLogicBridge,
TActivity extends ViewControllerActivity<TLogicBridge>,
TFragment extends ViewControllerFragment<?, TLogicBridge, TActivity>> {
public class ViewController<TLogic extends Logic,
TActivity extends ViewControllerActivity<TLogic>,
TFragment extends ViewControllerFragment<?, TLogic, TActivity>> {
private static final String SUPPORT_FRAGMENT_VIEW_STATE_EXTRA = "android:view_state";
@NonNull
private final TLogicBridge logicBridge;
@NonNull
private final TActivity activity;
@NonNull
@ -56,9 +55,8 @@ public class ViewController<TLogicBridge,
@NonNull
private final BehaviorSubject<Boolean> isDestroyedSubject = BehaviorSubject.create(false);
public ViewController(@NonNull final CreationContext<TLogicBridge, TActivity, TFragment> creationContext,
public ViewController(@NonNull final CreationContext<TLogic, TActivity, TFragment> creationContext,
@Nullable final Bundle savedInstanceState) {
this.logicBridge = creationContext.logicBridge;
this.activity = creationContext.activity;
this.fragment = creationContext.fragment;
this.container = creationContext.container;
@ -82,19 +80,19 @@ public class ViewController<TLogicBridge,
* @return {@link Observable} to get restore time to.
*/
@NonNull
protected Observable<Bundle> getRestoreSavedStateObservable(@NonNull final CreationContext<TLogicBridge, TActivity, TFragment> creationContext,
protected Observable<Bundle> getRestoreSavedStateObservable(@NonNull final CreationContext<TLogic, TActivity, TFragment> creationContext,
@Nullable final Bundle savedInstanceState) {
return Observable.just(savedInstanceState);
}
/**
* Returns logic bridge to use and affect application logic.
* Returns application's logic.
*
* @return Returns logic bridge object.
* @return Returns logic;
*/
@NonNull
public TLogicBridge getLogicBridge() {
return logicBridge;
public TLogic getLogic(){
return getActivity().getLogic();
}
/**
@ -177,12 +175,10 @@ public class ViewController<TLogicBridge,
/**
* Class to simplify constructor override.
*/
public static class CreationContext<TLogicBridge,
TActivity extends ViewControllerActivity<TLogicBridge>,
TFragment extends ViewControllerFragment<?, TLogicBridge, TActivity>> {
public static class CreationContext<TLogic extends Logic,
TActivity extends ViewControllerActivity<TLogic>,
TFragment extends ViewControllerFragment<?, TLogic, TActivity>> {
@NonNull
private final TLogicBridge logicBridge;
@NonNull
private final TActivity activity;
@NonNull
@ -190,21 +186,14 @@ public class ViewController<TLogicBridge,
@NonNull
private final ViewGroup container;
public CreationContext(@NonNull final TLogicBridge logicBridge,
@NonNull final TActivity activity,
public CreationContext(@NonNull final TActivity activity,
@NonNull final TFragment fragment,
@NonNull final ViewGroup container) {
this.logicBridge = logicBridge;
this.activity = activity;
this.fragment = fragment;
this.container = container;
}
@NonNull
public TLogicBridge getLogicBridge() {
return logicBridge;
}
@NonNull
public TActivity getActivity() {
return activity;

View File

@ -2,33 +2,29 @@ package ru.touchin.roboswag.components.navigation;
import android.support.annotation.NonNull;
import ru.touchin.roboswag.components.services.LogicService;
import ru.touchin.roboswag.core.utils.android.RxAndroidUtils;
import rx.Observable;
import ru.touchin.roboswag.components.utils.Logic;
/**
* Created by Gavriil Sitnikov on 07/03/2016.
* TODO: fill description
*/
public abstract class ViewControllerActivity<TLogicBridge> extends BaseActivity {
public abstract class ViewControllerActivity<TLogic extends Logic> extends BaseActivity {
/**
* It should return specific Service class where from this fragment should get interface to logic.
* It should return specific class where from all logic will be.
*
* @return Returns class of specific LogicService.
* @return Returns class of specific Logic.
*/
@NonNull
protected abstract Class<? extends LogicService<TLogicBridge>> getLogicServiceClass();
protected abstract Class<TLogic> getLogicClass();
/**
* Returns {@link Observable} which will connect to {@link LogicService} and get object of {@link TLogicBridge} type from it.
* Returns or creates application's logic.
*
* @return {@link Observable} which will provide changes of object of type {@link TLogicBridge};
* @return Object which represents application's logic.
*/
@NonNull
public Observable<TLogicBridge> observeLogicBridge() {
return RxAndroidUtils.observeService(this, getLogicServiceClass())
.map(service -> service != null ? service.getLogicBridge() : null);
public TLogic getLogic() {
return Logic.getInstance(this, getLogicClass());
}
}

View File

@ -35,11 +35,11 @@ import android.widget.FrameLayout;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import ru.touchin.roboswag.components.utils.Logic;
import ru.touchin.roboswag.core.log.Lc;
import ru.touchin.roboswag.core.utils.ShouldNotHappenException;
import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.exceptions.OnErrorThrowable;
import rx.subjects.BehaviorSubject;
@ -47,7 +47,7 @@ import rx.subjects.BehaviorSubject;
* Created by Gavriil Sitnikov on 21/10/2015.
* Fragment instantiated in specific activity of {@link TActivity} type that is holding {@link ViewController} inside.
*/
public abstract class ViewControllerFragment<TState extends Serializable, TLogicBridge, TActivity extends ViewControllerActivity<TLogicBridge>>
public abstract class ViewControllerFragment<TState extends Serializable, TLogic extends Logic, TActivity extends ViewControllerActivity<TLogic>>
extends ViewFragment<TActivity> {
private static final String VIEW_CONTROLLER_STATE_EXTRA = "VIEW_CONTROLLER_STATE_EXTRA";
@ -82,13 +82,13 @@ public abstract class ViewControllerFragment<TState extends Serializable, TLogic
}
/**
* It should return specific ViewController class to control instantiated view by logic bridge after activity creation.
* It should return specific ViewController class to control instantiated view by logic after activity creation.
*
* @return Returns class of specific ViewController.
*/
@NonNull
public abstract Class<? extends ViewController<TLogicBridge, TActivity,
? extends ViewControllerFragment<TState, TLogicBridge, TActivity>>> getViewControllerClass();
public abstract Class<? extends ViewController<TLogic, TActivity,
? extends ViewControllerFragment<TState, TLogic, TActivity>>> getViewControllerClass();
@SuppressWarnings("unchecked")
@Override
@ -110,21 +110,13 @@ public abstract class ViewControllerFragment<TState extends Serializable, TLogic
@NonNull
private Observable<ViewController> createViewControllerObservable() {
return Observable
.combineLatest(activitySubject
.switchMap(activity -> activity != null ? activity.observeLogicBridge() : Observable.just(null))
.distinctUntilChanged()
.observeOn(AndroidSchedulers.mainThread()),
activitySubject.distinctUntilChanged().observeOn(AndroidSchedulers.mainThread()),
viewSubject.distinctUntilChanged().observeOn(AndroidSchedulers.mainThread()),
this::getViewController);
return Observable.combineLatest(activitySubject.distinctUntilChanged(), viewSubject.distinctUntilChanged(), this::createViewController);
}
@Nullable
private ViewController getViewController(@Nullable final TLogicBridge logicBridge,
@Nullable final TActivity activity,
@Nullable final Pair<PlaceholderView, Bundle> viewInfo) {
if (logicBridge == null || activity == null || viewInfo == null) {
private ViewController createViewController(@Nullable final TActivity activity,
@Nullable final Pair<PlaceholderView, Bundle> viewInfo) {
if (activity == null || viewInfo == null) {
return null;
}
@ -132,9 +124,9 @@ public abstract class ViewControllerFragment<TState extends Serializable, TLogic
throw OnErrorThrowable.from(new ShouldNotHappenException("There should be single constructor for " + getViewControllerClass()));
}
final Constructor<?> constructor = getViewControllerClass().getConstructors()[0];
final ViewController.CreationContext<TLogicBridge, TActivity,
? extends ViewControllerFragment<TState, TLogicBridge, TActivity>> creationContext
= new ViewController.CreationContext<>(logicBridge, activity, this, viewInfo.first);
final ViewController.CreationContext<TLogic, TActivity,
? extends ViewControllerFragment<TState, TLogic, TActivity>> creationContext
= new ViewController.CreationContext<>(activity, this, viewInfo.first);
try {
switch (constructor.getParameterTypes().length) {
case 2:
@ -193,10 +185,9 @@ public abstract class ViewControllerFragment<TState extends Serializable, TLogic
this.viewController.onDestroy();
}
this.viewController = viewController;
if (this.viewController == null) {
return;
if (this.viewController != null) {
this.viewController.getActivity().supportInvalidateOptionsMenu();
}
viewController.getActivity().supportInvalidateOptionsMenu();
}
@Override

View File

@ -9,44 +9,45 @@ import android.support.v4.app.FragmentTransaction;
import java.io.Serializable;
import ru.touchin.roboswag.components.utils.Logic;
import rx.functions.Func1;
/**
* Created by Gavriil Sitnikov on 07/03/2016.
* TODO: fill description
*/
public class ViewControllerNavigation<TLogicBridge> extends FragmentNavigation {
public class ViewControllerNavigation<TLogic extends Logic> extends FragmentNavigation {
@SuppressWarnings("CPD-START")
public ViewControllerNavigation(@NonNull final ViewControllerActivity<TLogicBridge> context,
public ViewControllerNavigation(@NonNull final ViewControllerActivity<TLogic> context,
@NonNull final FragmentManager fragmentManager,
@IdRes final int containerViewId) {
super(context, fragmentManager, containerViewId);
}
public <TState extends Serializable> void push(@NonNull final Class<? extends ViewControllerFragment<TState, TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>>> fragmentClass,
public <TState extends Serializable> void push(@NonNull final Class<? extends ViewControllerFragment<TState, TLogic,
? extends ViewControllerActivity<TLogic>>> fragmentClass,
@NonNull final TState state) {
addToStack(fragmentClass, null, ViewControllerFragment.createState(state), null, null);
}
public <TState extends Serializable> void push(@NonNull final Class<? extends ViewControllerFragment<TState, TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>>> fragmentClass,
public <TState extends Serializable> void push(@NonNull final Class<? extends ViewControllerFragment<TState, TLogic,
? extends ViewControllerActivity<TLogic>>> fragmentClass,
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
addToStack(fragmentClass, null, ViewControllerFragment.createState(state), null, transactionSetup);
}
public <TState extends Serializable> void pushForResult(@NonNull final Class<? extends ViewControllerFragment<TState, TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>>> fragmentClass,
public <TState extends Serializable> void pushForResult(@NonNull final Class<? extends ViewControllerFragment<TState, TLogic,
? extends ViewControllerActivity<TLogic>>> fragmentClass,
@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 Serializable> void pushForResult(@NonNull final Class<? extends ViewControllerFragment<TState, TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>>> fragmentClass,
public <TState extends Serializable> void pushForResult(@NonNull final Class<? extends ViewControllerFragment<TState, TLogic,
? extends ViewControllerActivity<TLogic>>> fragmentClass,
@NonNull final Fragment targetFragment,
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
@ -54,73 +55,73 @@ public class ViewControllerNavigation<TLogicBridge> extends FragmentNavigation {
+ WITH_TARGET_FRAGMENT_TAG_MARK, transactionSetup);
}
public <TState extends Serializable> void setAsTop(@NonNull final Class<? extends ViewControllerFragment<TState, TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>>> fragmentClass,
public <TState extends Serializable> void setAsTop(@NonNull final Class<? extends ViewControllerFragment<TState, TLogic,
? extends ViewControllerActivity<TLogic>>> fragmentClass,
@NonNull final TState state) {
setAsTop(fragmentClass, ViewControllerFragment.createState(state), null);
}
public <TState extends Serializable> void setAsTop(@NonNull final Class<? extends ViewControllerFragment<TState, TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>>> fragmentClass,
public <TState extends Serializable> void setAsTop(@NonNull final Class<? extends ViewControllerFragment<TState, TLogic,
? extends ViewControllerActivity<TLogic>>> fragmentClass,
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
setAsTop(fragmentClass, ViewControllerFragment.createState(state), transactionSetup);
}
public <TState extends Serializable> void setInitial(@NonNull final Class<? extends ViewControllerFragment<TState, TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>>> fragmentClass,
public <TState extends Serializable> void setInitial(@NonNull final Class<? extends ViewControllerFragment<TState, TLogic,
? extends ViewControllerActivity<TLogic>>> fragmentClass,
@NonNull final TState state) {
setInitial(fragmentClass, ViewControllerFragment.createState(state), null);
}
public <TState extends Serializable> void setInitial(@NonNull final Class<? extends ViewControllerFragment<TState, TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>>> fragmentClass,
public <TState extends Serializable> void setInitial(@NonNull final Class<? extends ViewControllerFragment<TState, TLogic,
? extends ViewControllerActivity<TLogic>>> fragmentClass,
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
setInitial(fragmentClass, ViewControllerFragment.createState(state), transactionSetup);
}
public void pushViewController(@NonNull final Class<? extends ViewController<TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>,
? extends StatelessViewControllerFragment<TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>>>> viewControllerClass) {
public void pushViewController(@NonNull final Class<? extends ViewController<TLogic,
? extends ViewControllerActivity<TLogic>,
? extends StatelessViewControllerFragment<TLogic, ? extends ViewControllerActivity<TLogic>>>> viewControllerClass) {
addStatelessViewControllerToStack(viewControllerClass, null, null, null);
}
public <TState extends Serializable> void pushViewController(@NonNull final Class<? extends ViewController<TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>,
? extends SimpleViewControllerFragment<TState, TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>>>> viewControllerClass,
public <TState extends Serializable> void pushViewController(@NonNull final Class<? extends ViewController<TLogic,
? extends ViewControllerActivity<TLogic>,
? extends SimpleViewControllerFragment<TState, TLogic, ? extends ViewControllerActivity<TLogic>>>> viewControllerClass,
@NonNull final TState state) {
addViewControllerToStack(viewControllerClass, null, state, null, null);
}
public <TState extends Serializable> void pushViewController(@NonNull final Class<? extends ViewController<TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>,
? extends SimpleViewControllerFragment<TState, TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>>>> viewControllerClass,
public <TState extends Serializable> void pushViewController(@NonNull final Class<? extends ViewController<TLogic,
? extends ViewControllerActivity<TLogic>,
? extends SimpleViewControllerFragment<TState, TLogic, ? extends ViewControllerActivity<TLogic>>>> viewControllerClass,
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {
addViewControllerToStack(viewControllerClass, null, state, null, transactionSetup);
}
public void pushViewControllerForResult(@NonNull final Class<? extends ViewController<TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>,
? extends StatelessViewControllerFragment<TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>>>> viewControllerClass,
public void pushViewControllerForResult(@NonNull final Class<? extends ViewController<TLogic,
? extends ViewControllerActivity<TLogic>,
? extends StatelessViewControllerFragment<TLogic, ? extends ViewControllerActivity<TLogic>>>> viewControllerClass,
@NonNull final Fragment targetFragment) {
addStatelessViewControllerToStack(viewControllerClass, targetFragment,
viewControllerClass.getName() + ';' + WITH_TARGET_FRAGMENT_TAG_MARK, null);
}
public <TState extends Serializable> void pushViewControllerForResult(@NonNull final Class<? extends ViewController<TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>,
? extends SimpleViewControllerFragment<TState, TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>>>> viewControllerClass,
public <TState extends Serializable> void pushViewControllerForResult(@NonNull final Class<? extends ViewController<TLogic,
? extends ViewControllerActivity<TLogic>,
? extends SimpleViewControllerFragment<TState, TLogic, ? extends ViewControllerActivity<TLogic>>>> viewControllerClass,
@NonNull final Fragment targetFragment,
@NonNull final TState state) {
addViewControllerToStack(viewControllerClass, targetFragment, state, viewControllerClass.getName() + ';'
+ WITH_TARGET_FRAGMENT_TAG_MARK, null);
}
public <TState extends Serializable> void pushViewControllerForResult(@NonNull final Class<? extends ViewController<TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>,
? extends SimpleViewControllerFragment<TState, TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>>>> viewControllerClass,
public <TState extends Serializable> void pushViewControllerForResult(@NonNull final Class<? extends ViewController<TLogic,
? extends ViewControllerActivity<TLogic>,
? extends SimpleViewControllerFragment<TState, TLogic, ? extends ViewControllerActivity<TLogic>>>> viewControllerClass,
@NonNull final Fragment targetFragment,
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction>
@ -129,45 +130,45 @@ public class ViewControllerNavigation<TLogicBridge> extends FragmentNavigation {
+ WITH_TARGET_FRAGMENT_TAG_MARK, transactionSetup);
}
public void setViewControllerAsTop(@NonNull final Class<? extends ViewController<TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>,
? extends StatelessViewControllerFragment<TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>>>> viewControllerClass) {
public void setViewControllerAsTop(@NonNull final Class<? extends ViewController<TLogic,
? extends ViewControllerActivity<TLogic>,
? extends StatelessViewControllerFragment<TLogic, ? extends ViewControllerActivity<TLogic>>>> viewControllerClass) {
addStatelessViewControllerToStack(viewControllerClass, null, viewControllerClass.getName() + ' ' + TOP_FRAGMENT_TAG_MARK, null);
}
public <TState extends Serializable> void setViewControllerAsTop(@NonNull final Class<? extends ViewController<TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>,
? extends SimpleViewControllerFragment<TState, TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>>>> viewControllerClass,
public <TState extends Serializable> void setViewControllerAsTop(@NonNull final Class<? extends ViewController<TLogic,
? extends ViewControllerActivity<TLogic>,
? extends SimpleViewControllerFragment<TState, TLogic, ? extends ViewControllerActivity<TLogic>>>> viewControllerClass,
@NonNull final TState state) {
addViewControllerToStack(viewControllerClass, null, state, viewControllerClass.getName() + ' ' + TOP_FRAGMENT_TAG_MARK, null);
}
public <TState extends Serializable> void setViewControllerAsTop(@NonNull final Class<? extends ViewController<TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>,
? extends SimpleViewControllerFragment<TState, TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>>>> viewControllerClass,
public <TState extends Serializable> void setViewControllerAsTop(@NonNull final Class<? extends ViewController<TLogic,
? extends ViewControllerActivity<TLogic>,
? extends SimpleViewControllerFragment<TState, TLogic, ? extends ViewControllerActivity<TLogic>>>> viewControllerClass,
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction>
transactionSetup) {
addViewControllerToStack(viewControllerClass, null, state, viewControllerClass.getName() + ' ' + TOP_FRAGMENT_TAG_MARK, transactionSetup);
}
public void setInitialViewController(@NonNull final Class<? extends ViewController<TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>,
? extends StatelessViewControllerFragment<TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>>>> viewControllerClass) {
public void setInitialViewController(@NonNull final Class<? extends ViewController<TLogic,
? extends ViewControllerActivity<TLogic>,
? extends StatelessViewControllerFragment<TLogic, ? extends ViewControllerActivity<TLogic>>>> viewControllerClass) {
beforeSetInitialActions();
setViewControllerAsTop(viewControllerClass);
}
public <TState extends Serializable> void setInitialViewController(@NonNull final Class<? extends ViewController<TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>,
? extends SimpleViewControllerFragment<TState, TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>>>> viewControllerClass,
public <TState extends Serializable> void setInitialViewController(@NonNull final Class<? extends ViewController<TLogic,
? extends ViewControllerActivity<TLogic>,
? extends SimpleViewControllerFragment<TState, TLogic, ? extends ViewControllerActivity<TLogic>>>> viewControllerClass,
@NonNull final TState state) {
setInitialViewController(viewControllerClass, state, null);
}
public <TState extends Serializable> void setInitialViewController(@NonNull final Class<? extends ViewController<TLogicBridge,
? extends ViewControllerActivity<TLogicBridge>,
? extends SimpleViewControllerFragment<TState, TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>>>> viewControllerClass,
public <TState extends Serializable> void setInitialViewController(@NonNull final Class<? extends ViewController<TLogic,
? extends ViewControllerActivity<TLogic>,
? extends SimpleViewControllerFragment<TState, TLogic, ? extends ViewControllerActivity<TLogic>>>> viewControllerClass,
@Nullable final TState state,
@Nullable final Func1<FragmentTransaction, FragmentTransaction>
transactionSetup) {
@ -176,7 +177,7 @@ public class ViewControllerNavigation<TLogicBridge> extends FragmentNavigation {
}
protected <TState extends Serializable> void addViewControllerToStack(
@NonNull final Class<? extends ViewController<TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>, ?>> viewControllerClass,
@NonNull final Class<? extends ViewController<TLogic, ? extends ViewControllerActivity<TLogic>, ?>> viewControllerClass,
@Nullable final Fragment targetFragment,
@Nullable final TState state,
@Nullable final String backStackTag,
@ -187,7 +188,7 @@ public class ViewControllerNavigation<TLogicBridge> extends FragmentNavigation {
@SuppressWarnings("CPD-END")
protected <TState extends Serializable> void addStatelessViewControllerToStack(
@NonNull final Class<? extends ViewController<TLogicBridge, ? extends ViewControllerActivity<TLogicBridge>, ?>> viewControllerClass,
@NonNull final Class<? extends ViewController<TLogic, ? extends ViewControllerActivity<TLogic>, ?>> viewControllerClass,
@Nullable final Fragment targetFragment,
@Nullable final String backStackTag,
@Nullable final Func1<FragmentTransaction, FragmentTransaction> transactionSetup) {

View File

@ -1,78 +0,0 @@
/*
* 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.services;
import android.app.IntentService;
import android.content.Intent;
import android.os.IBinder;
import ru.touchin.roboswag.core.utils.android.ServiceBinder;
/**
* Created by Gavriil Sitnikov on 10/01/2016.
* Service which holds interface to all application's logic objects and methods.
* Any part of application should interact with some part of logic via this interface.
* If it is Service, Activity, Fragment or view then it should bind itself to that service first then get service and logic bridge from IBinder.
* If it is BroadcastReceiver then it should start service which can bind to that service or just send some intent to that service.
* [phase 1]
*/
public abstract class LogicService<TLogicBridge> extends IntentService {
private TLogicBridge logicBridge;
protected LogicService() {
super("LogicService");
}
@Override
public void onCreate() {
super.onCreate();
this.logicBridge = createLogicBridge();
}
@Override
protected void onHandleIntent(final Intent intent) {
// do nothing
}
/**
* Creates object which will provide all logic methods and objects of application.
* Any other activity, fragment or service should bind to that service to get logic bridge and start interact with application's logic.
* Do not initialize massive objects during creation as this operation is calling on UI thread.
*
* @return Returns instantiated logic bridge.
*/
protected abstract TLogicBridge createLogicBridge();
/**
* Returns interface to application's logic.
*
* @return Returns logic bridge object.
*/
public TLogicBridge getLogicBridge() {
return logicBridge;
}
@Override
public IBinder onBind(final Intent intent) {
return new ServiceBinder<>(this);
}
}

View File

@ -0,0 +1,51 @@
package ru.touchin.roboswag.components.utils;
import android.content.Context;
import android.support.annotation.NonNull;
import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Gavriil Sitnikov on 24/03/16.
* TODO: description
*/
public abstract class Logic {
private final static Map<Class<? extends Logic>, WeakReference<Logic>> LOGIC_INSTANCES = new HashMap<>();
@SuppressWarnings("unchecked")
@NonNull
public static <T extends Logic> T getInstance(@NonNull final Context context, @NonNull final Class<T> logicClass) {
T result;
synchronized (LOGIC_INSTANCES) {
final WeakReference<Logic> reference = LOGIC_INSTANCES.get(logicClass);
result = reference != null ? (T) reference.get() : null;
if (result == null) {
result = constructLogic(context.getApplicationContext(), logicClass);
LOGIC_INSTANCES.put(logicClass, new WeakReference<>(result));
}
}
return result;
}
@SuppressWarnings("unchecked")
private static <T extends Logic> T constructLogic(@NonNull final Context context, @NonNull final Class<T> logicClass) {
if (logicClass.getConstructors().length != 1 || logicClass.getConstructors()[0].getParameterTypes().length != 1) {
throw new IllegalArgumentException("There should be only one public constructor(Context) for class " + logicClass);
}
final Constructor<?> constructor = logicClass.getConstructors()[0];
try {
return (T) constructor.newInstance(context);
} catch (final Exception exception) {
throw new IllegalStateException(exception);
}
}
public Logic(@NonNull final Context context) {
//do nothing
}
}