Java tutorial
/* * Copyright (C) 2014 MyMenu, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see [http://www.gnu.org/licenses/]. */ package ca.mymenuapp.ui.debug; import android.content.Context; import android.support.v4.widget.DrawerLayout; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import ca.mymenuapp.R; import com.f2prateek.ln.Ln; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; /** * Watches incoming and outgoing views to display context specific actions. */ public class ContextualDebugActions implements ViewGroup.OnHierarchyChangeListener { public interface DebugAction<T extends View> { String name(); Class<T> viewClass(); void run(T view); } private final Map<DebugAction<? extends View>, View> buttonMap; private final Map<Class<? extends View>, List<DebugAction<? extends View>>> actionMap; private final DrawerLayout drawerLayout; private final Context drawerContext; private final View contextualTitleView; private final LinearLayout contextualListView; public ContextualDebugActions(DebugAppContainer container, Set<DebugAction<?>> debugActions) { buttonMap = new LinkedHashMap<DebugAction<? extends View>, View>(); actionMap = new LinkedHashMap<Class<? extends View>, List<DebugAction<? extends View>>>(); drawerLayout = container.drawerLayout; drawerContext = container.drawerContext; contextualTitleView = container.contextualTitleView; contextualListView = container.contextualListView; for (DebugAction<?> debugAction : debugActions) { putAction(debugAction.viewClass(), debugAction); } } private void putAction(Class<? extends View> view, DebugAction<? extends View> action) { Ln.d("Adding %s action for %s.", action.getClass().getSimpleName(), view.getSimpleName()); List<DebugAction<? extends View>> actions = actionMap.get(view); if (actions == null) { actions = new ArrayList<>(2); actionMap.put(view, actions); } actions.add(action); } @Override public void onChildViewAdded(View parent, View child) { List<DebugAction<? extends View>> actions = actionMap.get(child.getClass()); if (actions != null) { for (DebugAction<? extends View> action : actions) { Ln.d("Adding debug action \"%s\" for %s.", action.name(), child.getClass().getSimpleName()); View button = createButton(action, child); buttonMap.put(action, button); contextualListView.addView(button); } updateContextualVisibility(); } } @Override public void onChildViewRemoved(View parent, View child) { List<DebugAction<? extends View>> actions = actionMap.get(child.getClass()); if (actions != null) { for (DebugAction<? extends View> action : actions) { Ln.d("Removing debug action \"%s\" for %s.", action.name(), child.getClass().getSimpleName()); contextualListView.removeView(buttonMap.remove(action)); } updateContextualVisibility(); } } private Button createButton(final DebugAction action, final View child) { Button button = (Button) LayoutInflater.from(drawerContext).inflate(R.layout.debug_drawer_contextual_action, contextualListView, false); button.setText(action.name()); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { drawerLayout.closeDrawers(); action.run(child); } }); return button; } private void updateContextualVisibility() { int visibility = contextualListView.getChildCount() > 0 ? View.VISIBLE : View.GONE; contextualTitleView.setVisibility(visibility); contextualListView.setVisibility(visibility); } }