package ru.ltst.u2020mvp.base.mvp; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.support.annotation.IdRes; import java.util.Arrays; import java.util.HashMap; import butterknife.ButterKnife; import ru.ltst.u2020mvp.ui.ActivityHierarchyServer; import ru.ltst.u2020mvp.util.Strings; import timber.log.Timber; import static ru.ltst.u2020mvp.util.Strings.COLON; import static ru.ltst.u2020mvp.util.Strings.DOT; public class Registry { private static final HashMap<String, Entry> registers = new HashMap<>(); public static final ActivityHierarchyServer.Empty SERVER = new ActivityHierarchyServer.Empty() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { final String key = getKey(activity); final Entry entry = registers.get(key); Timber.d("%s onActivityCreated", key); if (entry != null && savedInstanceState != null) { entry.presenter.onRestore(savedInstanceState); } } @Override @SuppressWarnings("unchecked") public void onActivityStarted(Activity activity) { final String key = getKey(activity); final Entry entry = registers.get(key); Timber.d("%s onActivityStarted", key); if (entry != null) { final BaseView view = ButterKnife.findById(activity, entry.viewId); entry.presenter.takeView(view); } } @Override @SuppressWarnings("unchecked") public void onActivityStopped(Activity activity) { final String key = getKey(activity); final Entry entry = registers.get(key); Timber.d("%s onActivityStopped", key); if (entry != null) { final BaseView view = ButterKnife.findById(activity, entry.viewId); entry.presenter.dropView(view); } } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { final String key = getKey(activity); final Entry entry = registers.get(key); Timber.d("%s onActivitySaveInstanceState", key); if (entry != null) { entry.presenter.onSave(outState); } } @Override public void onActivityDestroyed(Activity activity) { final String key = getKey(activity); Timber.d("%s onActivityDestroyed", key); registers.remove(key); } }; public static <V extends BaseView> void add(Activity activity, @IdRes int viewId, BasePresenter<V> presenter) { registers.put(getKey(activity), new Entry<>(viewId, presenter)); } private static String getKey(Activity activity) { StringBuilder builder = new StringBuilder(); builder.append(activity.getClass().getName()); if (activity instanceof BaseActivity) { final String uniqueKey = ((BaseActivity) activity).uniqueKey(); if (!uniqueKey.isEmpty()) { builder.append(Strings.DOT).append(uniqueKey); } } else { final String action = activity.getIntent().getAction(); if (action != null) { builder.append(DOT).append(action); } final Uri data = activity.getIntent().getData(); if (data != null) { builder.append(DOT).append(data.toString()); } final Bundle extras = activity.getIntent().getExtras(); if (extras != null) { for (String key : extras.keySet()) { Object value = extras.get(key); if (value == null) continue; String valueString; if (value.getClass().isArray()) { valueString = Arrays.toString((Object[]) value); } else { valueString = value.toString(); } builder.append(DOT); builder.append(key).append(COLON); builder.append(valueString); } } } return builder.toString(); } private static class Entry<V extends BaseView> { @IdRes public final int viewId; public final BasePresenter<V> presenter; public Entry(int viewId, BasePresenter<V> presenter) { this.viewId = viewId; this.presenter = presenter; } } }