package com.rackspacecloud.android;
import java.util.ArrayList;
import org.apache.http.HttpResponse;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
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.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.NetworkItem;
import com.rackspace.cloud.loadbalancer.api.client.NetworkItemManager;
import com.rackspace.cloud.loadbalancer.api.client.http.LoadBalancersException;
import com.rackspace.cloud.servers.api.client.CloudServersException;
import com.rackspace.cloud.servers.api.client.http.HttpBundle;
public class AccessControlActivity extends CloudListActivity {
private final int REMOVE_RULE = 199;
private final int ADD_RULE = 219;
private LoadBalancer loadBalancer;
private ArrayList<NetworkItem> networkItems;
private int lastSelectedRulePosition;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loadBalancer = (LoadBalancer) this.getIntent().getExtras().get("loadBalancer");
setContentView(R.layout.accesscontrol);
restoreState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("networkItems", networkItems);
}
@SuppressWarnings("unchecked")
protected void restoreState(Bundle state) {
super.restoreState(state);
setupButton();
if (state != null && state.containsKey("networkItems") && state.getSerializable("networkItems") != null) {
networkItems = (ArrayList<NetworkItem>) state.getSerializable("networkItems");
if (networkItems.size() == 0) {
displayNoRulesCell();
} else {
getListView().setDividerHeight(1); // restore divider lines
setListAdapter(new NetworkItemAdapter());
}
} else {
loadNetworkItems();
}
}
private void setupButton(){
Button addRule = (Button)findViewById(R.id.add_rule_button);
addRule.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent viewIntent = new Intent(getContext(), AddAccessRuleActivity.class);
viewIntent.putExtra("loadBalancer", loadBalancer);
startActivityForResult(viewIntent, ADD_RULE);
}
});
}
protected void onListItemClick(ListView l, View v, int position, long id) {
if (networkItems != null && networkItems.size() > 0) {
lastSelectedRulePosition = position;
showDialog(REMOVE_RULE);
}
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case REMOVE_RULE:
return new AlertDialog.Builder(AccessControlActivity.this)
.setIcon(R.drawable.alert_dialog_icon)
.setTitle("Remove Rule")
.setMessage("Would you like to remove this rule?")
.setPositiveButton("Remove", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
new DeleteNetworkItemTask().execute((Void[]) null);
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// User clicked Cancel so do some stuff
}
})
.create();
}
return null;
}
private void setNetworkItemList(ArrayList<NetworkItem> networkItems) {
if (networkItems == null) {
networkItems = new ArrayList<NetworkItem>();
}
this.networkItems = new ArrayList<NetworkItem>();
String[] networkItemNames = new String[networkItems.size()];
if (networkItems != null) {
for (int i = 0; i < networkItems.size(); i++) {
NetworkItem networkItem = networkItems.get(i);
this.networkItems.add(i, networkItem);
networkItemNames[i] = networkItem.getName();
}
}
if (networkItemNames.length == 0) {
displayNoRulesCell();
} else {
getListView().setDividerHeight(1); // restore divider lines
setListAdapter(new NetworkItemAdapter());
}
}
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 displayNoRulesCell() {
String a[] = new String[1];
a[0] = "No Rules";
setListAdapter(new ArrayAdapter<String>(this, R.layout.norulescell, R.id.no_rules_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 loadNetworkItems() {
displayLoadingCell();
new LoadNetworkItemsTask().execute((Void[]) null);
}
// * Adapter/
class NetworkItemAdapter extends ArrayAdapter<NetworkItem> {
NetworkItemAdapter() {
super(AccessControlActivity.this, R.layout.accesscontrolcell, networkItems);
}
public View getView(int position, View convertView, ViewGroup parent) {
NetworkItem networkItem = networkItems.get(position);
LayoutInflater inflater = getLayoutInflater();
View row = inflater.inflate(R.layout.accesscontrolcell, parent, false);
TextView label = (TextView) row.findViewById(R.id.ip_address_text);
label.setText(networkItem.getAddress());
TextView sublabel = (TextView) row.findViewById(R.id.status_text);
sublabel.setText(networkItem.getType());
ImageView typeImage = (ImageView) row.findViewById(R.id.rule_type_image);
int image;
if(networkItem.getType().equals("ALLOW")){
image = R.drawable.allow_rule;
} else {
image = R.drawable.deny_rule;
}
typeImage.setImageResource(image);
return(row);
}
}
private class LoadNetworkItemsTask extends AsyncTask<Void, Void, ArrayList<NetworkItem>> {
private LoadBalancersException exception;
@Override
protected void onPreExecute(){
//set to null so will reload on config changes
networkItems = null;
}
@Override
protected ArrayList<NetworkItem> doInBackground(Void... arg0) {
ArrayList<NetworkItem> networkItems = null;
try {
networkItems = new NetworkItemManager(getContext()).createList(loadBalancer);
} catch (LoadBalancersException e) {
exception = e;
}
return networkItems;
}
@Override
protected void onPostExecute(ArrayList<NetworkItem> result) {
if (exception != null) {
showAlert("Error", exception.getMessage());
}
setNetworkItemList(result);
}
}
private class DeleteNetworkItemTask extends AsyncTask<Void, Void, HttpBundle> {
private CloudServersException exception;
private NetworkItem networkItem;
@Override
//let user know their process has started
protected void onPreExecute(){
networkItem = networkItems.get(lastSelectedRulePosition);
displayLoadingCell();
//set to null so will reload on config change
networkItems = null;
}
@Override
protected HttpBundle doInBackground(Void... arg0) {
HttpBundle bundle = null;
try {
bundle = new NetworkItemManager(getContext()).delete(loadBalancer, networkItem);
} catch (CloudServersException e) {
exception = e;
}
return bundle;
}
@Override
protected void onPostExecute(HttpBundle bundle) {
HttpResponse response = bundle.getResponse();
if (response != null) {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 202 || statusCode == 200) {
setResult(Activity.RESULT_OK);
loadNetworkItems();
} else {
CloudServersException cse = parseCloudServersException(response);
if ("".equals(cse.getMessage())) {
showError("There was a problem deleting your rule.", bundle);
} else {
showError("There was a problem deleting your rule: " + cse.getMessage(), bundle);
}
}
} else if (exception != null) {
showError("There was a problem deleting your rule: " + exception.getMessage(), bundle);
}
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if(requestCode == ADD_RULE && resultCode == RESULT_OK){
loadNetworkItems();
}
}
}