package com.example.devicehive.android.client.sample; import java.util.Collections; import java.util.Comparator; import java.util.List; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import com.dataart.android.devicehive.DeviceData; import com.dataart.android.devicehive.Network; import com.dataart.android.devicehive.client.commands.DeviceClientCommand; import com.dataart.android.devicehive.client.commands.GetNetworkDevicesCommand; import com.dataart.android.devicehive.network.DeviceHiveResultReceiver; public class NetworkDevicesActivity extends BaseActivity { public static final String EXTRA_NETWORK = NetworkDevicesActivity.class .getName() + ".EXTRA_NETWORK"; public static void start(Context context, Network network) { Intent intent = new Intent(context, NetworkDevicesActivity.class); intent.putExtra(EXTRA_NETWORK, network); setParentActivity(intent, NetworksActivity.class); context.startActivity(intent); } private static final String TAG = "NetworkDevicesActivity"; private ListView networkDevicesListView; private Network network; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_networks); network = getIntent().getExtras().getParcelable(EXTRA_NETWORK); if (network == null) { throw new IllegalArgumentException( "Network extra should be provided"); } setTitle(network.getName()); networkDevicesListView = (ListView) findViewById(R.id.networks_listView); networkDevicesListView .setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View itemView, int position, long arg3) { NetworkDevicesAdapter adapter = (NetworkDevicesAdapter) adapterView .getAdapter(); final DeviceData device = (DeviceData) adapter .getItem(position); DeviceActivity.start(NetworkDevicesActivity.this, device); } }); } protected void onResume() { super.onResume(); Log.d(TAG, "Starting Fetch Network devices request"); networkDevicesListView.postDelayed(new Runnable() { @Override public void run() { startNetworkDevicesRequest(); } }, 10); } @Override protected void onStop() { super.onStop(); } @Override protected boolean showsActionBarProgress() { return true; } @Override protected boolean showsRefreshActionItem() { return true; } @Override protected void onRefresh() { startNetworkDevicesRequest(); } private void startNetworkDevicesRequest() { incrementActionBarProgressOperationsCount(1); startCommand(new GetNetworkDevicesCommand(network.getId())); } private static class NetworkDevicesAdapter extends BaseAdapter { private final LayoutInflater inflater; private final List<DeviceData> devices; public NetworkDevicesAdapter(Context context, List<DeviceData> devices) { this.devices = devices; this.inflater = LayoutInflater.from(context); } @Override public int getCount() { return devices.size(); } @Override public Object getItem(int position) { return devices.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater .inflate(R.layout.network_list_item, null); holder = new ViewHolder(); holder.name = (TextView) convertView .findViewById(R.id.network_name_text_view); holder.description = (TextView) convertView .findViewById(R.id.network_description_text_view); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final DeviceData device = devices.get(position); holder.name.setText(device.getName()); holder.description.setText(device.getDeviceClass().getName()); return convertView; } private class ViewHolder { TextView name; TextView description; } } protected void onReceiveResult(final int resultCode, final int tagId, final Bundle resultData) { switch (resultCode) { case DeviceHiveResultReceiver.MSG_COMPLETE_REQUEST: decrementActionBarProgressOperationsCount(); break; case DeviceHiveResultReceiver.MSG_EXCEPTION: final Throwable exception = DeviceClientCommand .getThrowable(resultData); Log.e(TAG, "Failed to execute network command", exception); break; case DeviceHiveResultReceiver.MSG_STATUS_FAILURE: int statusCode = DeviceClientCommand.getStatusCode(resultData); Log.e(TAG, "Failed to execute network command. Status code: " + statusCode); break; case DeviceHiveResultReceiver.MSG_HANDLED_RESPONSE: if (tagId == TAG_GET_NETWORK_DEVICES) { final List<DeviceData> devices = GetNetworkDevicesCommand .getNetworkDevices(resultData); Log.d(TAG, "Fetched devices: " + devices); if (devices != null) { Collections.sort(devices, new Comparator<DeviceData>() { @Override public int compare(DeviceData lhs, DeviceData rhs) { return lhs.getName().compareToIgnoreCase( rhs.getName()); } }); networkDevicesListView .setAdapter(new NetworkDevicesAdapter(this, devices)); } } break; } } private static final int TAG_GET_NETWORK_DEVICES = getTagId(GetNetworkDevicesCommand.class); }