com.svpino.longhorn.artifacts.StockTileProcessor.java Source code

Java tutorial

Introduction

Here is the source code for com.svpino.longhorn.artifacts.StockTileProcessor.java

Source

/*
 * Copyright (C) 2012 Santiago Valdarrama
 * 
 * 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.svpino.longhorn.artifacts;

import static com.svpino.longhorn.artifacts.Extensions.isHoneycombOrLater;

import java.util.List;

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Color;
import android.support.v4.app.Fragment;
import android.util.SparseArray;
import android.view.DragEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnDragListener;
import android.view.View.OnLongClickListener;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TableRow.LayoutParams;

import com.svpino.longhorn.R;
import com.svpino.longhorn.artifacts.Extensions.PatternBackgroundColor;
import com.svpino.longhorn.model.Stock;

public class StockTileProcessor {

    public static void create(Fragment fragment, TableLayout tableLayout, List<Stock> stocks,
            SparseArray<View> tiles, boolean restart) {

        if (restart) {
            tableLayout.removeAllViews();
            if (tiles != null) {
                tiles.clear();
            }
        }

        tableLayout.setStretchAllColumns(true);
        tableLayout.setShrinkAllColumns(true);

        int margin = Extensions.dpToPixels(fragment.getResources(), 3);
        int height = Extensions.dpToPixels(fragment.getResources(), 90);

        int index = createFixedHeaderRow(fragment, tableLayout, stocks, tiles, height, margin);

        int row = index == 3 ? 1 : 0;

        while (index < stocks.size()) {
            index = createStandardRow(fragment, tableLayout, stocks, tiles, height, margin, index, row);
            row++;
        }

        while (tableLayout.getChildCount() > row) {
            tableLayout.removeViewAt(tableLayout.getChildCount() - 1);
        }

        if (stocks.size() % 2 != 0) {
            TableRow tableRow = new TableRow(fragment.getActivity());

            View addNewStockTile = createTileForAddingNewStock(fragment);
            tableRow.addView(addNewStockTile, getSpannedLayoutParams(row, margin, height));

            tableLayout.addView(tableRow);
        } else {
            TableRow tableRow = (TableRow) tableLayout.getChildAt(tableLayout.getChildCount() - 1);
            LayoutParams layoutParams = (TableRow.LayoutParams) tableRow.getChildAt(0).getLayoutParams();
            layoutParams.bottomMargin = margin;
            layoutParams.height = height;
        }
    }

    private static int createFixedHeaderRow(Fragment fragment, TableLayout tableLayout, List<Stock> stocks,
            SparseArray<View> tiles, int height, int margin) {

        View view = tableLayout.getChildAt(0);

        if (view == null || view.getTag() != "fixed-header") {
            TableRow indexesTableRow = new TableRow(fragment.getActivity());

            TableRow.LayoutParams indixesLayoutParams = new TableRow.LayoutParams();
            indixesLayoutParams.topMargin = margin;
            indixesLayoutParams.rightMargin = margin;
            indixesLayoutParams.bottomMargin = margin;
            indixesLayoutParams.height = height;

            TableRow.LayoutParams lastIndexLayoutParams = new TableRow.LayoutParams();
            lastIndexLayoutParams.topMargin = margin;
            lastIndexLayoutParams.bottomMargin = margin;
            lastIndexLayoutParams.height = height;

            View tile1 = createTile(fragment, stocks.get(0), 0, false);
            View tile2 = createTile(fragment, stocks.get(1), 1, false);
            View tile3 = createTile(fragment, stocks.get(2), 2, false);

            tiles.put(0, tile1);
            tiles.put(1, tile2);
            tiles.put(2, tile3);

            indexesTableRow.addView(tile1, indixesLayoutParams);
            indexesTableRow.addView(tile2, indixesLayoutParams);
            indexesTableRow.addView(tile3, lastIndexLayoutParams);
            indexesTableRow.setTag("fixed-header");

            tableLayout.addView(indexesTableRow);
        }

        return 3;
    }

    @TargetApi(11)
    private static int createStandardRow(Fragment fragment, TableLayout tableLayout, List<Stock> stocks,
            SparseArray<View> tiles, int height, int margin, int index, int row) {

        Stock stock1 = stocks.get(index);
        Stock stock2 = (index + 1 < stocks.size()) ? stocks.get(index + 1) : null;

        if (shouldUpdateTableRow(tableLayout, row, stock1, stock2)) {
            TableRow tableRow = new TableRow(fragment.getActivity());

            boolean shouldSpanFirstTile = row % 2 != 0;
            boolean shouldSpanSecondTile = !shouldSpanFirstTile;

            if (stock2 != null) {
                View tile1 = createTile(fragment, stock1, index, shouldSpanFirstTile);
                tiles.put(index, tile1);
                tableRow.addView(tile1, shouldSpanFirstTile ? getPartialSpannedLayoutParams(row, height, margin)
                        : getNotSpannedLayoutParams(row, height, margin));

                View tile2 = createTile(fragment, stock2, index + 1, shouldSpanSecondTile);
                tiles.put(index + 1, tile2);
                tableRow.addView(tile2,
                        shouldSpanSecondTile ? getLastPartialSpannedLayoutParams(row, height, margin)
                                : getLastNotSpannedLayoutParams(row, height, margin));
            } else {
                View tile1 = createTile(fragment, stock1, index, shouldSpanFirstTile);
                tiles.put(index, tile1);
                tableRow.addView(tile1, shouldSpanFirstTile ? getPartialSpannedLayoutParams(row, height, margin)
                        : getNotSpannedLayoutParams(row, height, margin));

                View tile2 = createTileForAddingNewStock(fragment);
                tiles.put(index + 1, tile2);
                tableRow.addView(tile2,
                        shouldSpanSecondTile ? getLastPartialSpannedLayoutParams(row, height, margin)
                                : getLastNotSpannedLayoutParams(row, height, margin));
            }

            if (row < tableLayout.getChildCount()) {
                tableLayout.removeViewAt(row);
            }

            tableLayout.addView(tableRow, row);
        }

        return index + 2;
    }

    private static boolean shouldUpdateTableRow(TableLayout tableLayout, int row, Stock stock1, Stock stock2) {
        boolean shouldUpdateTableRow = true;

        TableRow currentTableRow = (TableRow) tableLayout.getChildAt(row);
        if (currentTableRow != null) {
            StockTileViewHolder tile1 = (StockTileViewHolder) currentTableRow.getChildAt(0).getTag();
            StockTileViewHolder tile2 = currentTableRow.getChildCount() == 2
                    ? (StockTileViewHolder) currentTableRow.getChildAt(1).getTag()
                    : null;

            if (tile1 != null && (stock2 == null || tile2 != null)) {
                if (tile1.getStock().equals(stock1)) {
                    if (stock2 != null && tile2.getStock().equals(stock2)) {
                        shouldUpdateTableRow = false;
                    } else if (stock2 == null && tile2 == null) {
                        shouldUpdateTableRow = false;
                    }
                }
            }
        }

        return shouldUpdateTableRow;
    }

    private static View createTile(Fragment fragment, Stock stock, int index, boolean spanned) {

        View view = ((LayoutInflater) fragment.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                .inflate(spanned ? R.layout.stock_tile_spanned : R.layout.stock_tile_not_spanned, null);

        StockTileViewHolder stockTileViewHolder = new StockTileViewHolder(fragment.getResources(), view, stock,
                index, spanned);
        stockTileViewHolder.refresh(fragment.getResources());
        view.setTag(stockTileViewHolder);

        view.setOnClickListener((OnClickListener) fragment);

        if (index > 2) {
            view.setOnLongClickListener((OnLongClickListener) fragment);

            if (!stock.isMarketIndex()) {
                enableTileAsADropLocation(fragment, view);
            }

        }

        return view;
    }

    private static View createTileForAddingNewStock(Fragment fragment) {
        View view = ((LayoutInflater) fragment.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                .inflate(R.layout.stock_tile_add_new_stock, null);
        Extensions.applyPattern(fragment.getResources(), view.findViewById(R.id.tileLayout),
                PatternBackgroundColor.BLACK);

        view.setOnClickListener((OnClickListener) fragment);

        return view;
    }

    public static void updateTileColor(Fragment fragment, View view, List<Integer> selectedTiles) {
        StockTileViewHolder stockTileViewHolder = (StockTileViewHolder) view.getTag();

        if (selectedTiles != null && selectedTiles.contains(stockTileViewHolder.getPosition())) {
            updateTileColorToSelected(fragment, view);
        } else {
            updateTileColorBasedOnStock(fragment, view);
        }
    }

    public static void updateTileColorBasedOnStock(Fragment fragment, View view) {
        StockTileViewHolder stockTileViewHolder = (StockTileViewHolder) view.getTag();
        Extensions.applyPattern(fragment.getResources(), stockTileViewHolder.getTileLayout(),
                stockTileViewHolder.getStock());
    }

    public static void updateTileColorToSelected(Fragment fragment, View view) {
        StockTileViewHolder stockTileViewHolder = (StockTileViewHolder) view.getTag();
        Extensions.applyPattern(fragment.getResources(), stockTileViewHolder.getTileLayout(),
                PatternBackgroundColor.BLUE);
    }

    public static void updateTileColorToDropReceptor(View view) {
        StockTileViewHolder stockTileViewHolder = (StockTileViewHolder) view.getTag();
        stockTileViewHolder.getTileLayout().setBackgroundColor(Color.BLACK);
    }

    @TargetApi(11)
    private static void enableTileAsADropLocation(final Fragment fragment, View tile) {
        if (isHoneycombOrLater()) {
            tile.setOnDragListener(new OnDragListener() {

                @Override
                public boolean onDrag(View view, DragEvent event) {
                    return ((OnDragTileListener) fragment).onDrag(view, event);
                }
            });
        }
    }

    private static TableRow.LayoutParams getSpannedLayoutParams(int row, int margin, int height) {
        TableRow.LayoutParams layoutParams = new TableRow.LayoutParams();
        layoutParams.span = 3;
        layoutParams.bottomMargin = margin;
        layoutParams.height = height;

        if (row == 0) {
            layoutParams.topMargin = margin;
        }

        return layoutParams;
    }

    private static TableRow.LayoutParams getLastPartialSpannedLayoutParams(int row, int height, int margin) {
        TableRow.LayoutParams layoutParams = new TableRow.LayoutParams();
        layoutParams.span = 2;
        layoutParams.bottomMargin = margin;
        layoutParams.height = height;

        if (row == 0) {
            layoutParams.topMargin = margin;
        }

        return layoutParams;
    }

    private static TableRow.LayoutParams getPartialSpannedLayoutParams(int row, int height, int margin) {
        TableRow.LayoutParams layoutParams = new TableRow.LayoutParams();
        layoutParams.span = 2;
        layoutParams.rightMargin = margin;
        layoutParams.bottomMargin = margin;
        layoutParams.height = height;

        if (row == 0) {
            layoutParams.topMargin = margin;
        }

        return layoutParams;
    }

    private static TableRow.LayoutParams getLastNotSpannedLayoutParams(int row, int height, int margin) {
        TableRow.LayoutParams layoutParams = new TableRow.LayoutParams();
        layoutParams.bottomMargin = margin;
        layoutParams.height = height;

        if (row == 0) {
            layoutParams.topMargin = margin;
        }

        return layoutParams;
    }

    private static TableRow.LayoutParams getNotSpannedLayoutParams(int row, int height, int margin) {
        TableRow.LayoutParams layoutParams = new TableRow.LayoutParams();
        layoutParams.rightMargin = margin;
        layoutParams.bottomMargin = margin;
        layoutParams.height = height;

        if (row == 0) {
            layoutParams.topMargin = margin;
        }

        return layoutParams;
    }

    public interface OnDragTileListener {
        public boolean onDrag(View view, DragEvent event);
    }

}