/*
DeviceListAdapter.java
Copyright (c) 2014 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.sphero.setting.widget;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import org.deviceconnect.android.deviceplugin.sphero.R;
import org.deviceconnect.android.deviceplugin.sphero.data.SpheroParcelable;
import java.util.ArrayList;
import java.util.List;
/**
* デバイス一覧用のアダプタ.
* @author NTT DOCOMO, INC.
*/
public class DeviceListAdapter extends ArrayAdapter<SpheroParcelable> implements OnClickListener {
/**
* レイアウトインフレーター.
*/
private LayoutInflater mInflater;
/**
* クリックリスナー.
*/
private OnConnectButtonClickListener mListener;
/**
* アダプタを生成する.
*
* @param context コンテキスト
*/
public DeviceListAdapter(final Context context) {
this(context, new ArrayList<SpheroParcelable>());
}
/**
* アダプタを生成する.
*
* @param context コンテキスト
* @param devices デバイスリスト
*/
public DeviceListAdapter(final Context context, final List<SpheroParcelable> devices) {
super(context, R.layout.list_item_layout, devices);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
View view = null;
if (convertView == null) {
view = mInflater.inflate(R.layout.list_item_layout, null);
} else {
view = convertView;
}
SpheroParcelable device = getItem(position);
if (device != null) {
TextView name = (TextView) view.findViewById(R.id.name);
name.setText(device.getSpheroName());
Button connBtn = (Button) view.findViewById(R.id.connect);
connBtn.setOnClickListener(this);
connBtn.setTag(position);
if (device.isConnected() == SpheroParcelable.SpheroState.Connected) {
connBtn.setText(R.string.state_off);
} else if (device.isConnected() == SpheroParcelable.SpheroState.Disconnected
|| device.isConnected() == SpheroParcelable.SpheroState.Remember) {
connBtn.setText(R.string.state_on);
} else if (device.isConnected() == SpheroParcelable.SpheroState.Delete){
connBtn.setText(R.string.state_remove);
}
}
return view;
}
/**
* アダプタが管理しているデータを取得する.
*
* @param device 検索データ
* @return 実データ. 0 : データ, 1 : インデックス
*/
private Object[] getRowData(final SpheroParcelable device) {
for (int i = 0; i < getCount(); i++) {
SpheroParcelable s = getItem(i);
if (s.getSpheroId().equals(device.getSpheroId())) {
return new Object[]{s, i};
}
}
return null;
}
@Override
public void remove(final SpheroParcelable object) {
Object[] data = getRowData(object);
if (data != null) {
super.remove((SpheroParcelable) data[0]);
}
}
/**
* リスナーを設定する.
*
* @param listener リスナー
*/
public void setOnConnectButtonClickListener(final OnConnectButtonClickListener listener) {
mListener = listener;
}
/**
* 接続(解除)ボタン押下イベントリスナー.
*/
public interface OnConnectButtonClickListener {
/**
* ボタンが押された場合に呼び出される.
*
* @param position 押されたボタンの行番号
* @param device 選択された行のデータ
*/
void onClicked(int position, SpheroParcelable device);
}
@Override
public void onClick(final View v) {
if (mListener != null) {
int position = (Integer) v.getTag();
SpheroParcelable device = getItem(position);
mListener.onClicked(position, device);
}
}
/**
* 接続状態の表示を切り替える.
*
* @param device デバイス
*/
public void changeConnectionState(final SpheroParcelable device) {
Object[] data = getRowData(device);
if (data != null) {
((SpheroParcelable) data[0]).setConnected(device.isConnected());
notifyDataSetChanged();
}
}
}