Organize ui by feature instead of layer
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
package eu.kanade.mangafeed.ui.base.activity;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
|
||||
public class BaseActivity extends AppCompatActivity {
|
||||
|
||||
protected void setupToolbar(Toolbar toolbar) {
|
||||
setSupportActionBar(toolbar);
|
||||
if (getSupportActionBar() != null)
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
|
||||
public void setToolbarTitle(String title) {
|
||||
if (getSupportActionBar() != null)
|
||||
getSupportActionBar().setTitle(title);
|
||||
}
|
||||
|
||||
public void setToolbarTitle(int titleResource) {
|
||||
if (getSupportActionBar() != null)
|
||||
getSupportActionBar().setTitle(getString(titleResource));
|
||||
}
|
||||
|
||||
public Context getActivity() {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
package eu.kanade.mangafeed.ui.base.activity;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import eu.kanade.mangafeed.App;
|
||||
import eu.kanade.mangafeed.ui.base.activity.BaseActivity;
|
||||
import nucleus.factory.PresenterFactory;
|
||||
import nucleus.factory.ReflectionPresenterFactory;
|
||||
import nucleus.presenter.Presenter;
|
||||
import nucleus.view.PresenterLifecycleDelegate;
|
||||
import nucleus.view.ViewWithPresenter;
|
||||
|
||||
|
||||
/**
|
||||
* This class is an example of how an activity could controls it's presenter.
|
||||
* You can inherit from this class or copy/paste this class's code to
|
||||
* create your own view implementation.
|
||||
*
|
||||
* @param <P> a type of presenter to return with {@link #getPresenter}.
|
||||
*/
|
||||
public abstract class BaseRxActivity<P extends Presenter> extends BaseActivity implements ViewWithPresenter<P> {
|
||||
|
||||
private static final String PRESENTER_STATE_KEY = "presenter_state";
|
||||
|
||||
private PresenterLifecycleDelegate<P> presenterDelegate =
|
||||
new PresenterLifecycleDelegate<>(ReflectionPresenterFactory.<P>fromViewClass(getClass()));
|
||||
|
||||
/**
|
||||
* Returns a current presenter factory.
|
||||
*/
|
||||
public PresenterFactory<P> getPresenterFactory() {
|
||||
return presenterDelegate.getPresenterFactory();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a presenter factory.
|
||||
* Call this method before onCreate/onFinishInflate to override default {@link ReflectionPresenterFactory} presenter factory.
|
||||
* Use this method for presenter dependency injection.
|
||||
*/
|
||||
@Override
|
||||
public void setPresenterFactory(PresenterFactory<P> presenterFactory) {
|
||||
presenterDelegate.setPresenterFactory(presenterFactory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a current attached presenter.
|
||||
* This method is guaranteed to return a non-null value between
|
||||
* onResume/onPause and onAttachedToWindow/onDetachedFromWindow calls
|
||||
* if the presenter factory returns a non-null value.
|
||||
*
|
||||
* @return a currently attached presenter or null.
|
||||
*/
|
||||
public P getPresenter() {
|
||||
return presenterDelegate.getPresenter();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
final PresenterFactory<P> superFactory = getPresenterFactory();
|
||||
setPresenterFactory(() -> {
|
||||
P presenter = superFactory.createPresenter();
|
||||
((App)getApplication()).getComponentReflection().inject(presenter);
|
||||
return presenter;
|
||||
});
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
if (savedInstanceState != null)
|
||||
presenterDelegate.onRestoreInstanceState(savedInstanceState.getBundle(PRESENTER_STATE_KEY));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(@NonNull Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putBundle(PRESENTER_STATE_KEY, presenterDelegate.onSaveInstanceState());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
presenterDelegate.onResume(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
presenterDelegate.onPause(isFinishing());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package eu.kanade.mangafeed.ui.base.fragment;
|
||||
|
||||
import android.support.v4.app.Fragment;
|
||||
|
||||
import eu.kanade.mangafeed.ui.base.activity.BaseActivity;
|
||||
|
||||
public class BaseFragment extends Fragment {
|
||||
|
||||
public void setToolbarTitle(String title) {
|
||||
getBaseActivity().setToolbarTitle(title);
|
||||
}
|
||||
|
||||
public void setToolbarTitle(int resourceId) {
|
||||
getBaseActivity().setToolbarTitle(getString(resourceId));
|
||||
}
|
||||
|
||||
public BaseActivity getBaseActivity() {
|
||||
return (BaseActivity) getActivity();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package eu.kanade.mangafeed.ui.base.fragment;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
import eu.kanade.mangafeed.App;
|
||||
import eu.kanade.mangafeed.ui.base.fragment.BaseFragment;
|
||||
import nucleus.factory.PresenterFactory;
|
||||
import nucleus.factory.ReflectionPresenterFactory;
|
||||
import nucleus.presenter.Presenter;
|
||||
import nucleus.view.PresenterLifecycleDelegate;
|
||||
import nucleus.view.ViewWithPresenter;
|
||||
|
||||
/**
|
||||
* This class is an example of how an activity could controls it's presenter.
|
||||
* You can inherit from this class or copy/paste this class's code to
|
||||
* create your own view implementation.
|
||||
*
|
||||
* @param <P> a type of presenter to return with {@link #getPresenter}.
|
||||
*/
|
||||
public abstract class BaseRxFragment<P extends Presenter> extends BaseFragment implements ViewWithPresenter<P> {
|
||||
|
||||
private static final String PRESENTER_STATE_KEY = "presenter_state";
|
||||
private PresenterLifecycleDelegate<P> presenterDelegate =
|
||||
new PresenterLifecycleDelegate<>(ReflectionPresenterFactory.<P>fromViewClass(getClass()));
|
||||
|
||||
/**
|
||||
* Returns a current presenter factory.
|
||||
*/
|
||||
public PresenterFactory<P> getPresenterFactory() {
|
||||
return presenterDelegate.getPresenterFactory();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a presenter factory.
|
||||
* Call this method before onCreate/onFinishInflate to override default {@link ReflectionPresenterFactory} presenter factory.
|
||||
* Use this method for presenter dependency injection.
|
||||
*/
|
||||
@Override
|
||||
public void setPresenterFactory(PresenterFactory<P> presenterFactory) {
|
||||
presenterDelegate.setPresenterFactory(presenterFactory);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a current attached presenter.
|
||||
* This method is guaranteed to return a non-null value between
|
||||
* onResume/onPause and onAttachedToWindow/onDetachedFromWindow calls
|
||||
* if the presenter factory returns a non-null value.
|
||||
*
|
||||
* @return a currently attached presenter or null.
|
||||
*/
|
||||
public P getPresenter() {
|
||||
return presenterDelegate.getPresenter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle bundle) {
|
||||
final PresenterFactory<P> superFactory = getPresenterFactory();
|
||||
setPresenterFactory(() -> {
|
||||
P presenter = superFactory.createPresenter();
|
||||
((App)getActivity().getApplication()).getComponentReflection().inject(presenter);
|
||||
return presenter;
|
||||
});
|
||||
|
||||
super.onCreate(bundle);
|
||||
if (bundle != null)
|
||||
presenterDelegate.onRestoreInstanceState(bundle.getBundle(PRESENTER_STATE_KEY));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle bundle) {
|
||||
super.onSaveInstanceState(bundle);
|
||||
bundle.putBundle(PRESENTER_STATE_KEY, presenterDelegate.onSaveInstanceState());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
presenterDelegate.onResume(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
presenterDelegate.onPause(getActivity().isFinishing());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package eu.kanade.mangafeed.ui.base.presenter;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import de.greenrobot.event.EventBus;
|
||||
import icepick.Icepick;
|
||||
import nucleus.presenter.RxPresenter;
|
||||
import nucleus.view.ViewWithPresenter;
|
||||
|
||||
public class BasePresenter<V extends ViewWithPresenter> extends RxPresenter<V> {
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedState) {
|
||||
super.onCreate(savedState);
|
||||
Icepick.restoreInstanceState(this, savedState);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSave(@NonNull Bundle state) {
|
||||
super.onSave(state);
|
||||
Icepick.saveInstanceState(this, state);
|
||||
}
|
||||
|
||||
public void registerForStickyEvents() {
|
||||
EventBus.getDefault().registerSticky(this);
|
||||
}
|
||||
|
||||
public void registerForEvents() {
|
||||
EventBus.getDefault().register(this);
|
||||
}
|
||||
|
||||
public void unregisterForEvents() {
|
||||
EventBus.getDefault().unregister(this);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user