com.f2prateek.dfg.ui.debug.ContextualDebugActions.java Source code

Java tutorial

Introduction

Here is the source code for com.f2prateek.dfg.ui.debug.ContextualDebugActions.java

Source

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