Java tutorial
/* * Copyright 2014 Prateek Srivastava (@f2prateek) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.f2prateek.dfg.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 com.f2prateek.dfg.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; 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<>(); actionMap = new LinkedHashMap<>(); 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); } }