package com.example.devicehive.android.client.sample;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.apache.http.auth.MalformedChallengeException;
import org.apache.http.client.ClientProtocolException;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
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.actionbarsherlock.app.ActionBar;
import com.dataart.android.devicehive.Network;
import com.dataart.android.devicehive.client.commands.DeviceClientCommand;
import com.dataart.android.devicehive.client.commands.GetNetworksCommand;
import com.dataart.android.devicehive.network.DeviceHiveResultReceiver;
public class NetworksActivity extends BaseActivity {
private static final String TAG = "NetworksActivity";
private ListView networksListView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_networks);
networksListView = (ListView) findViewById(R.id.networks_listView);
networksListView
.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView,
View itemView, int position, long arg3) {
NetworksAdapter adapter = (NetworksAdapter) adapterView
.getAdapter();
Network network = (Network) adapter.getItem(position);
// start network devices activity
NetworkDevicesActivity.start(NetworksActivity.this,
network);
}
});
ActionBar actionbar = getSupportActionBar();
actionbar.setTitle("Networks");
}
protected void onResume() {
super.onResume();
Log.d(TAG, "Starting Get Networks request");
networksListView.postDelayed(new Runnable() {
@Override
public void run() {
startNetworksRequest();
}
}, 10);
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected boolean showsActionBarProgress() {
return true;
}
@Override
protected boolean showsSettingsActionItem() {
return true;
}
@Override
protected boolean showsRefreshActionItem() {
return true;
}
@Override
protected void onShowSettings() {
startSettingsActivity();
}
@Override
protected void onRefresh() {
startNetworksRequest();
}
@Override
protected boolean showsHomeAsUpButton() {
return false;
}
private void startSettingsActivity() {
startActivity(new Intent(this, SettingsActivity.class));
}
private void startNetworksRequest() {
incrementActionBarProgressOperationsCount(1);
startCommand(new GetNetworksCommand());
}
private static class NetworksAdapter extends BaseAdapter {
private final LayoutInflater inflater;
private final List<Network> networks;
public NetworksAdapter(Context context, List<Network> networks) {
this.networks = networks;
this.inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return networks.size();
}
@Override
public Object getItem(int position) {
return networks.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 Network network = networks.get(position);
holder.name.setText(network.getName());
holder.description.setText(network.getDescription());
return convertView;
}
private class ViewHolder {
TextView name;
TextView description;
}
}
@Override
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);
if (exception instanceof ClientProtocolException
&& exception.getCause() instanceof MalformedChallengeException) {
showSettingsDialog("Authentication error!",
"Looks like your credentials are not valid.");
} else {
showSettingsDialog("Error", "Failed to connect to the server.");
}
break;
case DeviceHiveResultReceiver.MSG_STATUS_FAILURE:
int statusCode = DeviceClientCommand.getStatusCode(resultData);
Log.e(TAG, "Failed to execute network command. Status code: "
+ statusCode);
if (statusCode == 404) {
showSettingsDialog("Error", "Failed to connect to the server.");
}
break;
case DeviceHiveResultReceiver.MSG_HANDLED_RESPONSE:
if (tagId == TAG_GET_NETWORKS) {
final List<Network> networks = GetNetworksCommand
.getNetworks(resultData);
Log.d(TAG, "Fetched networks: " + networks);
if (networks != null) {
Collections.sort(networks, new Comparator<Network>() {
@Override
public int compare(Network lhs, Network rhs) {
return lhs.getName().compareToIgnoreCase(
rhs.getName());
}
});
networksListView.setAdapter(new NetworksAdapter(this,
networks));
}
}
break;
}
}
private void showSettingsDialog(String title, String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final AlertDialog dialog = builder
.setTitle(title)
.setMessage(message)
.setPositiveButton("Edit settings",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
startSettingsActivity();
}
})
.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.dismiss();
}
}).create();
dialog.show();
}
private static final int TAG_GET_NETWORKS = getTagId(GetNetworksCommand.class);
}