Android Open Source - longhorn Stock Tile Processor






From Project

Back to project page longhorn.

License

The source code is released under:

Apache License

If you think the Android project longhorn listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2012 Santiago Valdarrama
 * /*www. j  av  a 2  s  .  c  o m*/
 * 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);
  }

}




Java Source Code List

com.svpino.longhorn.MarketCollectorService.java
com.svpino.longhorn.activities.DashboardActivity.java
com.svpino.longhorn.artifacts.Constants.java
com.svpino.longhorn.artifacts.Extensions.java
com.svpino.longhorn.artifacts.StockOverviewManager.java
com.svpino.longhorn.artifacts.StockTileProcessor.java
com.svpino.longhorn.artifacts.StockTileViewHolder.java
com.svpino.longhorn.artifacts.TabFragment.java
com.svpino.longhorn.artifacts.back.BackStack.java
com.svpino.longhorn.artifacts.back.StockOverviewBackStackItem.java
com.svpino.longhorn.data.DataProvider.java
com.svpino.longhorn.data.LonghornDatabase.java
com.svpino.longhorn.data.LonghornOpenHelper.java
com.svpino.longhorn.fragments.StockListFragment.java
com.svpino.longhorn.layouts.BorderRelativeLayout.java
com.svpino.longhorn.layouts.StockOverviewLayout.java
com.svpino.longhorn.model.Stock.java
com.svpino.longhorn.providers.SearchContentProvider.java
com.svpino.longhorn.receivers.BatteryBroadcastReceiver.java
com.svpino.longhorn.receivers.ConnectivityBroadcastReceiver.java
com.svpino.longhorn.receivers.MarketCollectionReceiver.java