package com.kaichunlin.transition.adapter; import android.app.Activity; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.Menu; import com.kaichunlin.transition.MenuItemTransition; import com.kaichunlin.transition.TransitionManager; /** * Provides default support for handling MenuItem transitions. */ public class DefaultMenuOptionHandler implements MenuOptionHandler { private final TransitionManager mTransitionManager; private final AdapterState mAdapterState; private MenuOptionConfiguration mOpenConfig; private MenuOptionConfiguration mCloseConfig; public DefaultMenuOptionHandler(@NonNull TransitionManager transitionManager, @NonNull AdapterState adapterState) { mTransitionManager = transitionManager; mAdapterState = adapterState; } @Override public AdapterState getAdapterState() { return mAdapterState; } @Override public void onCreateOptionsMenu(@NonNull Activity activity, @NonNull Menu menu) { onCreateOptionsMenu(activity, menu, mAdapterState); } @Override public void onCreateOptionsMenu(@NonNull Activity activity, @NonNull Menu menu, @NonNull AdapterState adapterState) { if (adapterState.isOpen()) { boolean hasOpen = mOpenConfig != null; if (hasOpen && mOpenConfig.getMenuId() > 0) { activity.getMenuInflater().inflate(mOpenConfig.getMenuId(), menu); } if (mCloseConfig != null) { if (hasOpen) { // TODO may cause issues when mOpenConfig.getTransition() has been merged mTransitionManager.removeTransition(mOpenConfig.getTransition()); } mTransitionManager.addTransition(mCloseConfig.getTransition()); } } else { boolean hasClose = mCloseConfig != null; if (hasClose && mCloseConfig.getMenuId() > 0) { activity.getMenuInflater().inflate(mCloseConfig.getMenuId(), menu); } if (mOpenConfig != null) { if (hasClose) { mTransitionManager.removeTransition(mCloseConfig.getTransition()); } mTransitionManager.addTransition(mOpenConfig.getTransition()); } } } @Override public void setupOption(@NonNull Activity activity, @Nullable MenuOptionConfiguration openConfig) { MenuItemTransition transition = openConfig.getTransition(); setupOptions(activity, openConfig, new MenuOptionConfiguration(transition.clone().reverse(), openConfig.getMenuId())); } @Override public void setupOpenOption(@NonNull Activity activity, @Nullable MenuOptionConfiguration openConfig) { MenuItemTransition transition = openConfig.getTransition(); setupOptions(activity, openConfig, new MenuOptionConfiguration(transition.clone().reverse(), -1)); } @Override public void setupCloseOption(@NonNull Activity activity, @Nullable MenuOptionConfiguration closeConfig) { MenuItemTransition transition = closeConfig.getTransition(); setupOptions(activity, new MenuOptionConfiguration(transition.clone().reverse(), -1), closeConfig); } @Override public void setupOptions(@NonNull Activity activity, @Nullable MenuOptionConfiguration openConfig, @Nullable MenuOptionConfiguration closeConfig) { if (mOpenConfig != null) { mTransitionManager.removeTransition(mOpenConfig.getTransition()); } if (mCloseConfig != null) { mTransitionManager.removeTransition(mCloseConfig.getTransition()); } mOpenConfig = openConfig; mCloseConfig = closeConfig; if (activity != null && mAdapterState.isOpen()) { if (mCloseConfig != null) { if (mCloseConfig.getTransition().isInvalidateOptionOnStopTransition()) { activity.invalidateOptionsMenu(); } mTransitionManager.addTransition(mCloseConfig.getTransition()); } } else { if (mOpenConfig != null) { if (mOpenConfig.getTransition().isInvalidateOptionOnStopTransition()) { activity.invalidateOptionsMenu(); } mTransitionManager.addTransition(mOpenConfig.getTransition()); } } } @Override public void clearOptions() { setupOptions(null, null, null); } @Nullable @Override public MenuOptionConfiguration getOpenConfig() { return mOpenConfig; } @Nullable @Override public MenuOptionConfiguration getCloseConfig() { return mCloseConfig; } }