/*
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of
* the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright (c) 2014 Digi International Inc., All Rights Reserved.
*/
package com.digi.android.wva.adapters;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import com.digi.android.wva.R;
import com.digi.android.wva.model.EndpointConfiguration;
import com.digi.android.wva.model.EndpointConfiguration.SubscriptionConfig;
import java.util.ArrayList;
import java.util.List;
/**
* An {@link ArrayAdapter} subclass which lists out vehicle data endpoints
* and provides an at-a-glance summary of endpoint configurations.
*/
public class EndpointsAdapter extends ArrayAdapter<EndpointConfiguration> {
private static EndpointsAdapter instance;
private final Context ctx;
private final int resourceId;
private final List<EndpointConfiguration> data;
/**
* Initialize the singleton EndpointsAdapter instance
* @param context the context to be used
*/
public static void initInstance(Context context) {
if (instance == null)
instance = new EndpointsAdapter(context);
}
/**
* Fetch the singleton EndpointsAdapter instance, if there is one
* @return the singleton instance, or null
*/
public static EndpointsAdapter getInstance() {
return instance;
}
private EndpointsAdapter(Context context) {
super(context, R.layout.endpoints_list_item);
this.ctx = context;
this.resourceId = R.layout.endpoints_list_item;
this.data = new ArrayList<EndpointConfiguration>();
}
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = LayoutInflater.from(ctx).inflate(resourceId, null);
assert convertView != null;
TextView ept = (TextView)convertView.findViewById(R.id.endpoint_name);
TextView alarm =
(TextView)convertView.findViewById(R.id.endpoint_alarm_summary);
EndpointConfiguration item = getItem(pos);
SubscriptionConfig sc = item.getSubscriptionConfig();
boolean subscribed = (sc != null && sc.isSubscribed());
ept.setEnabled(subscribed);
ept.setText(item.getTitleString());
String alarmSummary = item.getAlarmSummary();
if (alarmSummary == null) {
alarm.setVisibility(View.GONE);
}
else {
alarm.setVisibility(View.VISIBLE);
alarm.setText(alarmSummary);
}
return convertView;
}
/**
* Attempt to look up an {@link EndpointConfiguration} in this
* adapter, by endpoint name
* @param endpoint endpoint name to look up
* @return matching EndpointConfiguration, or null if there is none
*/
public EndpointConfiguration findEndpointConfiguration(String endpoint) {
for (EndpointConfiguration c : data) {
if (c.getEndpoint().equals(endpoint))
return c;
}
return null;
}
public void add(EndpointConfiguration newEntry, boolean notify) {
data.add(newEntry);
if (notify) {
notifyDataSetChanged();
}
}
// ArrayAdapter overrides
@Override
public void add(EndpointConfiguration newEntry) {
add(newEntry, true);
}
@Override
public void clear() {
data.clear();
notifyDataSetChanged();
}
@Override
public int getCount() {
return data.size();
}
@Override
public EndpointConfiguration getItem(int position) {
return data.get(position);
}
@Override
public int getPosition(EndpointConfiguration item) {
return data.indexOf(item);
}
@Override
public void insert(EndpointConfiguration item, int index) {
data.add(index, item);
notifyDataSetChanged();
}
@Override
public void remove(EndpointConfiguration item) {
if (data.remove(item))
notifyDataSetChanged();
else {
Log.e("EndpointsAdapter", "data.remove() came back false");
}
}
}