ca.mymenuapp.ui.debug.ContextualDebugActions.java Source code

Java tutorial

Introduction

Here is the source code for ca.mymenuapp.ui.debug.ContextualDebugActions.java

Source

/*
 * 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);
    }
}