package com.frozendevs.periodictable.model.adapter; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Typeface; import android.os.Parcel; import android.os.Parcelable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.frozendevs.periodictable.R; import com.frozendevs.periodictable.model.TableElementItem; import com.frozendevs.periodictable.model.TableItem; import com.frozendevs.periodictable.model.TableTextItem; import com.frozendevs.periodictable.view.PeriodicTableView; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.HashMap; import java.util.List; import java.util.Map; public class TableAdapter extends PeriodicTableView.Adapter implements Parcelable { private enum ViewType { ITEM, TEXT } private Typeface mTypeface; private int mGroupsCount; private int mPeriodsCount; private Map<Integer, TableItem> mItems = new HashMap<>(); private static final int[] COLORS = { R.color.category_diatomic_nonmetals_bg, R.color.category_noble_gases_bg, R.color.category_alkali_metals_bg, R.color.category_alkaline_earth_metals_bg, R.color.category_metalloids_bg, R.color.category_polyatomic_nonmetals_bg, R.color.category_other_metals_bg, R.color.category_transition_metals_bg, R.color.category_lanthanides_bg, R.color.category_actinides_bg, R.color.category_unknown_bg }; private static final Object[][] TEXT_ITEMS = { {4, R.string.category_actinides, 9}, {5, R.string.category_alkali_metals, 2}, {6, R.string.category_alkaline_earth_metals, 3}, {7, R.string.category_diatomic_nonmetals, 0}, {8, R.string.category_lanthanides, 8}, {9, R.string.category_metalloids, 4}, {22, R.string.category_noble_gases, 1}, {23, R.string.category_polyatomic_nonmetals, 5}, {24, R.string.category_other_metals, 6}, {25, R.string.category_transition_metals, 7}, {26, R.string.category_unknown, 10}, {92, "57 - 71", 8}, {110, "89 - 103", 9} }; private class ViewHolder { TextView symbol, number, name, weight; } public static final Creator<TableAdapter> CREATOR = new Creator<TableAdapter>() { @Override public TableAdapter createFromParcel(Parcel in) { return new TableAdapter(in); } @Override public TableAdapter[] newArray(int size) { return new TableAdapter[size]; } }; public TableAdapter() { } protected TableAdapter(Parcel in) { mGroupsCount = in.readInt(); mPeriodsCount = in.readInt(); final int size = in.readInt(); for (int i = 0; i < size; i++) { final int key = in.readInt(); final TableItem value = in.readParcelable(TableItem.class.getClassLoader()); mItems.put(key, value); } } @Override public int getCount() { return mItems.size(); } @Override public TableItem getItem(int position) { return mItems.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final Context context = parent.getContext(); initialize(context); final TableItem item = getItem(position); if (item instanceof TableTextItem) { if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.table_text, parent, false); } convertView.setBackgroundColor(getBackgroundColor(context, item)); ((TextView) convertView).setText(((TableTextItem) item).getText()); return convertView; } else if (item instanceof TableElementItem) { return getView((TableElementItem) item, convertView, parent); } return null; } public View getView(TableElementItem item, View convertView, ViewGroup parent) { final Context context = parent.getContext(); initialize(context); if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.table_item, parent, false); } ViewHolder viewHolder = (ViewHolder) convertView.getTag(); if (viewHolder == null) { viewHolder = new ViewHolder(); viewHolder.symbol = (TextView) convertView.findViewById(R.id.element_symbol); viewHolder.symbol.setTypeface(mTypeface); viewHolder.number = (TextView) convertView.findViewById(R.id.element_number); viewHolder.number.setTypeface(mTypeface); viewHolder.name = (TextView) convertView.findViewById(R.id.element_name); viewHolder.name.setTypeface(mTypeface); viewHolder.weight = (TextView) convertView.findViewById(R.id.element_weight); viewHolder.weight.setTypeface(mTypeface); convertView.setTag(viewHolder); } String atomicWeight = item.getStandardAtomicWeight(); try { BigDecimal bigDecimal = new BigDecimal(atomicWeight); atomicWeight = bigDecimal.setScale(3, RoundingMode.HALF_UP).toString(); } catch (NumberFormatException ignored) { } convertView.setBackgroundColor(getBackgroundColor(context, item)); viewHolder.symbol.setText(item.getSymbol()); viewHolder.number.setText(String.valueOf(item.getNumber())); viewHolder.name.setTextSize(12f); viewHolder.name.setText(item.getName()); viewHolder.weight.setText(atomicWeight); return convertView; } @Override public View getActiveView(Bitmap bitmap, View convertView, ViewGroup parent) { initialize(parent.getContext()); if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate( R.layout.table_active_item, parent, false); } ImageView imageView = (ImageView) convertView.findViewById(R.id.bitmap); imageView.setImageBitmap(bitmap); return convertView; } private int getBackgroundColor(Context context, TableItem item) { return context.getResources().getColor(COLORS[item.getCategory()]); } @Override public int getItemViewType(int position) { if (getItem(position) instanceof TableTextItem) { return ViewType.TEXT.ordinal(); } return ViewType.ITEM.ordinal(); } @Override public int getViewTypeCount() { return ViewType.values().length; } public void setItems(Context context, List<TableElementItem> items) { mItems.clear(); if (items == null) { return; } int groups = 0, periods = 0; for (TableElementItem item : items) { groups = Math.max(item.getGroup(), groups); periods = Math.max(item.getPeriod(), periods); } mGroupsCount = groups; mPeriodsCount = periods + 2; for (TableElementItem item : items) { final int position; if (item.getNumber() >= 57 && item.getNumber() <= 71) { position = (mGroupsCount * periods) + 2 + item.getNumber() - 57; } else if (item.getNumber() >= 89 && item.getNumber() <= 103) { position = (mGroupsCount * periods) + 20 + item.getNumber() - 89; } else { position = ((item.getPeriod() - 1) * mGroupsCount) + item.getGroup() - 1; } mItems.put(position, item); } for (Object[] item : TEXT_ITEMS) { final String text; if (item[1] instanceof Integer) { text = context.getString((int) item[1]); } else { text = (String) item[1]; } mItems.put((int) item[0], new TableTextItem(text, (int) item[2])); } } @Override public int getGroupsCount() { return mGroupsCount; } @Override public int getPeriodsCount() { return mPeriodsCount; } @Override public boolean areAllItemsEnabled() { return false; } @Override public boolean isEnabled(int position) { return getItem(position) instanceof TableElementItem; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mGroupsCount); dest.writeInt(mPeriodsCount); dest.writeInt(mItems.size()); for (Map.Entry<Integer, TableItem> item : mItems.entrySet()) { dest.writeInt(item.getKey()); dest.writeParcelable((Parcelable) item.getValue(), 0); } } private void initialize(Context context) { if (mTypeface == null) { mTypeface = Typeface.createFromAsset(context.getAssets(), "fonts/NotoSans-Regular.ttf"); } } }