package com.rackspacecloud.android;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.rackspace.cloud.android.R;
import com.rackspace.cloud.loadbalancer.api.client.LoadBalancer;
import com.rackspace.cloud.loadbalancer.api.client.LoadBalancerManager;
import com.rackspace.cloud.loadbalancer.api.client.http.LoadBalancersException;
public class ListLoadBalancersActivity extends GaListActivity {
private final int ADD_LOAD_BALANCER_CODE = 22;
private LoadBalancer[] loadBalancers;
private Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
trackPageView(GoogleAnalytics.PAGE_LOADBALANCERS);
context = getApplicationContext();
restoreState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("loadBalancers", loadBalancers);
}
private void restoreState(Bundle state) {
if (state != null && state.containsKey("loadBalancers") && state.getSerializable("loadBalancers") != null) {
loadBalancers = (LoadBalancer[]) state.getSerializable("loadBalancers");
if (loadBalancers.length == 0) {
displayNoLoadBalancerCell();
} else {
getListView().setDividerHeight(1); // restore divider lines
setListAdapter(new LoadBalancerAdapter());
}
} else {
loadLoadBalancers();
}
}
private void displayNoLoadBalancerCell() {
String a[] = new String[1];
a[0] = "No Load Balancers";
setListAdapter(new ArrayAdapter<String>(this, R.layout.noloadbalancerscell, R.id.no_loadbalancers_label, a));
getListView().setTextFilterEnabled(true);
getListView().setDividerHeight(0); // hide the dividers so it won't look like a list row
getListView().setItemsCanFocus(false);
}
protected void onListItemClick(ListView l, View v, int position, long id) {
if (loadBalancers != null && loadBalancers.length > 0) {
Intent viewIntent = new Intent(this, ViewLoadBalancerActivity.class);
viewIntent.putExtra("loadBalancer", loadBalancers[position]);
startActivityForResult(viewIntent, 55); // arbitrary number; never
// used again
}
}
private void loadLoadBalancers() {
displayLoadingCell();
new LoadLoadBalancersTask().execute((Void[]) null);
}
private void setLoadBalancersList(ArrayList<LoadBalancer> loadBalancers) {
if (loadBalancers == null) {
loadBalancers = new ArrayList<LoadBalancer>();
}
String[] loadBalancerNames = new String[loadBalancers.size()];
this.loadBalancers = new LoadBalancer[loadBalancers.size()];
if (loadBalancers != null) {
for (int i = 0; i < loadBalancers.size(); i++) {
LoadBalancer loadBalancer = loadBalancers.get(i);
this.loadBalancers[i] = loadBalancer;
loadBalancerNames[i] = loadBalancer.getName();
}
}
if (loadBalancerNames.length == 0) {
displayNoLoadBalancerCell();
} else {
getListView().setDividerHeight(1); // restore divider lines
setListAdapter(new LoadBalancerAdapter());
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.loadbalancers_list_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.add_loadbalancer:
startActivityForResult(new Intent(this, AddLoadBalancerActivity.class), ADD_LOAD_BALANCER_CODE);
return true;
case R.id.refresh:
loadBalancers = null;
loadLoadBalancers();
return true;
}
return false;
}
// * Adapter/
class LoadBalancerAdapter extends ArrayAdapter<LoadBalancer> {
LoadBalancerAdapter() {
super(ListLoadBalancersActivity.this,
R.layout.list_loadbalancer_item, loadBalancers);
}
public View getView(int position, View convertView, ViewGroup parent) {
LoadBalancer loadBalancer = loadBalancers[position];
LayoutInflater inflater = getLayoutInflater();
View row = inflater.inflate(R.layout.list_loadbalancer_item,
parent, false);
Log.d("info", "name: " + loadBalancer.getName() + " status: " + loadBalancer.getStatus());
ImageView status = (ImageView) row.findViewById(R.id.load_balancer_status);
if(loadBalancer.getStatus().equals("DELETED") || loadBalancer.getStatus().equals("PENDING_DELETE")){
status.setImageResource(R.drawable.deny_rule);
} else if(loadBalancer.getStatus().equals("ERROR")){
status.setImageResource(R.drawable.error_icon);
} else {
status.setImageResource(R.drawable.allow_rule);
}
TextView label = (TextView) row.findViewById(R.id.label);
label.setText(loadBalancer.getName());
TextView sublabel = (TextView) row.findViewById(R.id.sublabel);
sublabel.setText("ID: " + loadBalancer.getId());
return (row);
}
}
private void displayLoadingCell() {
String a[] = new String[1];
a[0] = "Loading...";
setListAdapter(new ArrayAdapter<String>(this, R.layout.loadingcell, R.id.loading_label, a));
getListView().setTextFilterEnabled(true);
getListView().setDividerHeight(0); // hide the dividers so it won't look like a list row
getListView().setItemsCanFocus(false);
}
private void showAlert(String title, String message) {
// Can't create handler inside thread that has not called
// Looper.prepare()
// Looper.prepare();
try {
AlertDialog alert = new AlertDialog.Builder(this).create();
alert.setTitle(title);
alert.setMessage(message);
alert.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
return;
}
});
alert.show();
} catch (Exception e) {
e.printStackTrace();
}
}
private class LoadLoadBalancersTask extends AsyncTask<Void, Void, ArrayList<LoadBalancer>> {
private LoadBalancersException exception;
@Override
protected ArrayList<LoadBalancer> doInBackground(Void... arg0) {
ArrayList<LoadBalancer> loadBalancers = null;
try {
loadBalancers = (new LoadBalancerManager(context)).createList();
} catch (LoadBalancersException e) {
exception = e;
}
return loadBalancers;
}
@Override
protected void onPostExecute(ArrayList<LoadBalancer> result) {
if (exception != null) {
showAlert("Error", exception.getMessage());
}
setLoadBalancersList(result);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
// a sub-activity kicked back, so we want to refresh the server list
loadLoadBalancers();
}
}
}