/* * Copyright 2012 University of South Florida * * 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 org.onebusaway.android.directions.util; import org.onebusaway.android.R; import org.onebusaway.android.directions.model.Direction; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.graphics.Typeface; import android.text.SpannableString; import android.text.TextUtils; import android.text.style.StyleSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; /** * @author Khoa Tran */ public class DirectionExpandableListAdapter extends BaseExpandableListAdapter { Context mContext; int mDirectionLayoutResourceId; int mSubDirectionLayoutResourceId; Direction mData[] = null; public DirectionExpandableListAdapter(Context context, int directionLayoutResourceId, int subDirectionLayoutResourceId, Direction[] data) { mDirectionLayoutResourceId = directionLayoutResourceId; mSubDirectionLayoutResourceId = subDirectionLayoutResourceId; mContext = context; mData = data; } @Override public Object getChild(int groupPosition, int childPosition) { ArrayList<Direction> subDirections = mData[groupPosition].getSubDirections(); if (subDirections != null && !subDirections.isEmpty()) { return subDirections.get(childPosition); } return null; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public int getChildrenCount(int groupPosition) { ArrayList<Direction> subDirections = mData[groupPosition].getSubDirections(); if (subDirections != null) { return subDirections.size(); } return 0; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { View row = convertView; DirectionHolder holder = null; if (row == null) { LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); row = inflater.inflate(mSubDirectionLayoutResourceId, parent, false); holder = new DirectionHolder(); holder.imgIcon = (ImageView) row.findViewById(R.id.imgIcon); holder.txtDirection = (TextView) row.findViewById(R.id.directionText); row.setTag(holder); } else { holder = (DirectionHolder) row.getTag(); } Direction subDirection = (Direction) getChild(groupPosition, childPosition); CharSequence text = subDirection == null ? "null here" : subDirection.getDirectionText(); holder.txtDirection.setText(text); if (subDirection.getIcon() != -1) { holder.imgIcon.setImageResource(subDirection.getIcon()); holder.imgIcon.setColorFilter(Color.GRAY); } else { holder.imgIcon.setVisibility(View.INVISIBLE); } return row; } @Override public Object getGroup(int groupPosition) { return mData[groupPosition]; } @Override public int getGroupCount() { return mData.length; } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { View row = convertView; DirectionHolder holder = null; if (row == null) { LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); row = inflater.inflate(mDirectionLayoutResourceId, parent, false); holder = new DirectionHolder(); holder.imgIcon = (ImageView) row.findViewById(R.id.imgIcon); holder.noIconText = (TextView) row.findViewById(R.id.noIconText); holder.txtDirection = (TextView) row.findViewById(R.id.directionText); row.setTag(holder); } else { holder = (DirectionHolder) row.getTag(); } Direction dir = mData[groupPosition]; if (!dir.isTransit()) { holder.txtDirection.setText(dir.getDirectionIndex() + ". " + dir.getDirectionText()); holder.imgIcon.setVisibility(View.VISIBLE); if (dir.getIcon() != -1) { holder.imgIcon.setImageResource(dir.getIcon()); holder.imgIcon.setColorFilter(Color.GRAY); } else { holder.imgIcon.setVisibility(View.INVISIBLE); } } else { CharSequence textBeforeTime = dir.getDirectionIndex() + ". " + dir.getService(); CharSequence text; CharSequence time = dir.getOldTime(); text = new SpannableString(textBeforeTime); if (dir.isRealTimeInfo()) { if (dir.getNewTime() != null) { time = dir.getNewTime(); } } text = TextUtils.concat(text, " ", time, "\n", dir.getPlaceAndHeadsign()); if (!TextUtils.isEmpty(dir.getAgency())) { text = TextUtils.concat(text, "\n", dir.getAgency()); } if (!TextUtils.isEmpty(dir.getExtra())) { SpannableString extraSpannableString = new SpannableString(dir.getExtra()); extraSpannableString.setSpan(new StyleSpan(Typeface.ITALIC), 0, extraSpannableString.length(), 0); text = TextUtils.concat(text, "\n", extraSpannableString); } holder.txtDirection.setText(text); if (dir.getIcon() == -1) { holder.imgIcon.setVisibility(View.INVISIBLE); holder.noIconText.setVisibility(View.VISIBLE); } else { holder.imgIcon.setVisibility(View.VISIBLE); holder.imgIcon.setImageResource(dir.getIcon()); holder.imgIcon.setColorFilter(Color.GRAY); holder.noIconText.setVisibility(View.INVISIBLE); } } return row; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } @Override public boolean hasStableIds() { return true; } static class DirectionHolder { ImageView imgIcon; TextView noIconText; TextView txtDirection; } }