All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.arellomobile.mvp.MvpProcessor Maven / Gradle / Ivy

The newest version!
package com.arellomobile.mvp;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.arellomobile.mvp.presenter.PresenterField;
import com.arellomobile.mvp.presenter.PresenterType;

/**
 * Date: 18-Dec-15
 * Time: 13:16
 *
 * @author Yuri Shmakov
 * @author Alexander Blinov
 */
public class MvpProcessor {
	public static final String PRESENTER_BINDER_SUFFIX = "$$PresentersBinder";
	public static final String PRESENTER_BINDER_INNER_SUFFIX = "Binder";
	public static final String VIEW_STATE_SUFFIX = "$$State";
	public static final String VIEW_STATE_PROVIDER_SUFFIX = "$$ViewStateProvider";

	/**
	 * 

1) Generates tag for identification MvpPresenter

*

2) Checks if presenter with tag is already exist in {@link com.arellomobile.mvp.PresenterStore}, and returns it

*

3) If {@link com.arellomobile.mvp.PresenterStore} doesn't contain MvpPresenter with current tag, {@link PresenterField} will create it

* * @param type of delegated * @param target object that want injection * @param presenterField info about presenter from {@link com.arellomobile.mvp.presenter.InjectPresenter} * @param delegateTag unique tag generated by {@link MvpDelegate#generateTag()} @return MvpPresenter instance */ private MvpPresenter getMvpPresenter(Delegated target, PresenterField presenterField, String delegateTag) { Class presenterClass = presenterField.getPresenterClass(); PresenterStore presenterStore = MvpFacade.getInstance().getPresenterStore(); PresenterType type = presenterField.getPresenterType(); String tag; if (type == PresenterType.LOCAL) { tag = delegateTag + "$" + presenterField.getTag(target); } else { tag = presenterField.getTag(target); } //noinspection unchecked MvpPresenter presenter = presenterStore.get(tag); if (presenter != null) { return presenter; } //noinspection unchecked presenter = (MvpPresenter) presenterField.providePresenter(target); if (presenter == null) { return null; } presenter.setPresenterType(type); presenter.setTag(tag); presenter.setPresenterClass(presenterClass); presenterStore.add(tag, presenter); return presenter; } /** *

Gets presenters {@link java.util.List} annotated with {@link com.arellomobile.mvp.presenter.InjectPresenter} for view.

*

See full info about getting presenter instance in {@link #getMvpPresenter}

* * @param delegated class contains presenter * @param delegateTag unique tag generated by {@link MvpDelegate#generateTag()} * @param type of delegated * @return presenters list for specifies presenters container */ List> getMvpPresenters(Delegated delegated, String delegateTag) { if (!hasMoxyReflector()) { return Collections.emptyList(); } @SuppressWarnings("unchecked") Class aClass = (Class) delegated.getClass(); List presenterBinders = null; while (aClass != Object.class && presenterBinders == null) { presenterBinders = MoxyReflector.getPresenterBinders(aClass); aClass = aClass.getSuperclass(); } if (presenterBinders == null || presenterBinders.isEmpty()) { return Collections.emptyList(); } List> presenters = new ArrayList<>(); PresentersCounter presentersCounter = MvpFacade.getInstance().getPresentersCounter(); for (Object presenterBinderObject : presenterBinders) { //noinspection unchecked PresenterBinder presenterBinder = (PresenterBinder) presenterBinderObject; List> presenterFields = presenterBinder.getPresenterFields(); for (PresenterField presenterField : presenterFields) { MvpPresenter presenter = getMvpPresenter(delegated, presenterField, delegateTag); if (presenter != null) { presentersCounter.injectPresenter(presenter, delegateTag); presenters.add(presenter); presenterField.bind(delegated, presenter); } } } return presenters; } private static Boolean hasMoxyReflector = null; // Check is it have generated MoxyReflector without usage of reflection API private static boolean hasMoxyReflector() { if (hasMoxyReflector != null) { return hasMoxyReflector; } try { new MoxyReflector(); hasMoxyReflector = true; } catch (NoClassDefFoundError error) { hasMoxyReflector = false; } return hasMoxyReflector; } }