/** * */ package org.androad.ui.common.adapters; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.androad.R; import org.androad.sys.ors.adt.ORSServer; import org.androad.sys.ors.adt.ORSServer.ServerStatus; import org.androad.util.constants.Constants; import org.androad.util.ping.PingResult; import android.content.Context; import android.os.Parcel; import android.os.Parcelable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; /** * @author Nicolas Gramlich * @since 15:09:22 - 17.07.2009 */ public class ORSServerListAdapter extends BaseAdapter implements Constants { // =========================================================== // Final Fields // =========================================================== // =========================================================== // Fields // =========================================================== /** Remember our context so we can use it when constructing views. */ private final Context mContext; private List<ORSServerItem> mItems = new ArrayList<ORSServerItem>(); // =========================================================== // Constructors // =========================================================== public ORSServerListAdapter(final Context context) { this.mContext = context; } // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods from SuperClass/Interfaces // =========================================================== public void addItem(final ORSServerItem it) { this.mItems.add(it); Collections.sort(this.mItems); } public void setListItems(final List<ORSServerItem> lit) { this.mItems = lit; Collections.sort(this.mItems); } @Override public boolean isEmpty() { return this.mItems == null || this.mItems.size() == 0; } /** @return The number of items in the */ public int getCount() { return this.mItems.size(); } public Object getItem(final int position) { return this.mItems.get(position); } @Override public long getItemId(final int position) { return position; } // =========================================================== // Methods // =========================================================== @Override public View getView(final int position, final View convertView, final ViewGroup parent) { final View v; if (convertView != null){ v = convertView; }else{ final LayoutInflater inflater = LayoutInflater.from(this.mContext); v = inflater.inflate(R.layout.settings_orsserver_listrow, null); } // Reuse/Overwrite the View passed final ORSServerItem serverItem = this.mItems.get(position); /* Coverage-Flag. */ ((ImageView)v.findViewById(R.id.iv_settings_orsserver_listrow_coverageflag)) .setImageResource(serverItem.mORSServer.COVERAGE.FLAGRESID); /* Name. */ ((TextView)v.findViewById(R.id.tv_settings_orsserver_listrow_name)) .setText(serverItem.mORSServer.SERVERNAME); /* Location-Flag. */ ((ImageView)v.findViewById(R.id.iv_settings_orsserver_listrow_locationflag)) .setImageResource(serverItem.mORSServer.LOCATION.FLAGRESID); /* LocationName. */ ((TextView)v.findViewById(R.id.tv_settings_orsserver_listrow_location)) .setText(serverItem.mORSServer.LOCATIONNAME); /* ServerStatus. */ final ImageView serverStatusImage = (ImageView)v.findViewById(R.id.iv_settings_orsserver_listrow_status); final TextView serverStatusText = (TextView)v.findViewById(R.id.tv_settings_orsserver_listrow_status); final TextView serverLatencyText = (TextView)v.findViewById(R.id.tv_settings_orsserver_listrow_latency); switch(serverItem.mStatus){ case ONLINE: serverStatusImage.setImageResource(R.drawable.status_orsserver_green); serverStatusText.setText(R.string.online); serverLatencyText.setText(serverItem.mLatencyMS + " ms"); break; case OFFLINE: serverStatusImage.setImageResource(R.drawable.status_orsserver_red); serverStatusText.setText(R.string.offline); serverLatencyText.setText(R.string.unknown); break; case UNKNOWN: serverStatusImage.setImageResource(R.drawable.status_orsserver_unknown); serverStatusText.setText(R.string.unknown); serverLatencyText.setText(R.string.unknown); break; } return v; } // =========================================================== // Inner and Anonymous Classes // =========================================================== public static class ORSServerItem implements Comparable<ORSServerItem>, Parcelable { public final ORSServer mORSServer; protected ORSServer.ServerStatus mStatus = ServerStatus.UNKNOWN; protected int mLatencyMS = NOT_SET; public ORSServerItem(final ORSServer pORServer) { this.mORSServer = pORServer; } @Override public int compareTo(final ORSServerItem another) { return this.mORSServer.SERVERNAME.compareToIgnoreCase(another.mORSServer.SERVERNAME); } public void updatePingInformation(final Runnable callback) { this.mLatencyMS = NOT_SET; this.mStatus = ServerStatus.UNKNOWN; new Thread(new Runnable(){ @Override public void run() { try { final PingResult pr = ORSServerItem.this.mORSServer.ping(); if(pr.mReachable){ ORSServerItem.this.mStatus = ServerStatus.ONLINE; ORSServerItem.this.mLatencyMS = pr.mLatency; }else{ ORSServerItem.this.mStatus = ServerStatus.OFFLINE; ORSServerItem.this.mLatencyMS = NOT_SET; } } catch (final IOException e) { ORSServerItem.this.mStatus = ServerStatus.OFFLINE; ORSServerItem.this.mLatencyMS = NOT_SET; } callback.run(); } }).start(); } // =========================================================== // Parcelable // =========================================================== public static final Parcelable.Creator<ORSServerItem> CREATOR = new Parcelable.Creator<ORSServerItem>() { public ORSServerItem createFromParcel(final Parcel in) { return readFromParcel(in); } public ORSServerItem[] newArray(final int size) { return new ORSServerItem[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(final Parcel out, final int flags) { out.writeParcelable(this.mORSServer, 0); } private static ORSServerItem readFromParcel(final Parcel in){ final ORSServer server = in.readParcelable(null); return new ORSServerItem(server); } } }