package com.rackspacecloud.android;
import java.util.ArrayList;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
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.VirtualIp;
import com.rackspace.cloud.loadbalancer.api.client.http.LoadBalancersException;
public class SharedVipActivity extends CloudActivity {
private VirtualIp[] vips;
private String loadBalancerPort;
private String loadBalancerRegion;
private VirtualIp selectedVip;
private RadioGroup vipGroup;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_vips);
loadBalancerPort = (String) this.getIntent().getExtras().get("loadBalancerPort");
loadBalancerRegion = (String) this.getIntent().getExtras().get("loadBalancerRegion");
selectedVip = (VirtualIp) this.getIntent().getExtras().get("selectedVip");
restoreState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("vips", vips);
outState.putSerializable("selectedVip", selectedVip);
}
protected void restoreState(Bundle state) {
super.restoreState(state);
setupButton();
vipGroup = (RadioGroup) findViewById(R.id.vip_group);
if(state != null && state.containsKey("selectedVip")){
selectedVip = (VirtualIp) state.getSerializable("selectedVip");
}
if (state != null && state.containsKey("vips") && state.getSerializable("vips") != null) {
vips = (VirtualIp[]) state.getSerializable("vips");
if (vips.length == 0) {
displayNoVipsCell();
} else {
displayRadioButtons();
}
} else {
loadVirtualIps();
}
}
private void setupButton(){
Button submit = (Button) findViewById(R.id.select_vip_button);
submit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent viewIntent = new Intent();
viewIntent.putExtra("selectedVip", selectedVip);
setResult(RESULT_OK, viewIntent);
finish();
}
});
}
private void displayNoVipsCell() {
/* 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);
*/
}
private void displayRadioButtons(){
for(VirtualIp vip : vips){
RadioButton button = new RadioButton(getContext());
//Display the load balancer info next to the radio
//buttons
button.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
button.setText(vip.getAddress() + "\n" +
"Type: " + vip.getType() + "\n" +
"Load Balancer: " + vip.getLoadBalancer().getName() + "\n");
//if can't add vip make it unselectable
if((vip.getLoadBalancer().getPort().equals(loadBalancerPort)
|| !vip.getLoadBalancer().getRegion().equals(loadBalancerRegion))){
button.setEnabled(false);
}
vipGroup.addView(button);
if(selectedVip != null && selectedVip.getId().equals(vip.getId())){
((RadioButton)vipGroup.getChildAt(vipGroup.getChildCount() - 1)).toggle();
}
}
vipGroup.setOnCheckedChangeListener (new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
View radioButton = group.findViewById(checkedId);
int index = group.indexOfChild(radioButton);
if(vips[index].getLoadBalancer().getPort().equals(loadBalancerPort)){
showToast("Cannot use this Virtual IP. The same port cannot be used on multiple load balancers for a Shared Virtual IP.");
} else if(!vips[index].getLoadBalancer().getRegion().equals(loadBalancerRegion)){
showToast("Cannot use this Virtual IP. The Shared Virtual IP must come the same region as the new load balancer.");
} else {
Log.d("info", "the selected vip is " + vips[index].getAddress());
selectedVip = vips[index];
}
}
});
}
private void setLoadBalancersList(ArrayList<VirtualIp> vips) {
if (vips == null) {
vips = new ArrayList<VirtualIp>();
}
this.vips = new VirtualIp[vips.size()];
if (vips != null) {
for (int i = 0; i < vips.size(); i++) {
VirtualIp virtualIp = vips.get(i);
this.vips[i] = virtualIp;
}
}
if (this.vips.length == 0) {
displayNoVipsCell();
} else {
displayRadioButtons();
}
}
private void loadVirtualIps() {
new LoadVirtualIpsTask().execute((Void[]) null);
}
private class LoadVirtualIpsTask extends AsyncTask<Void, Void, ArrayList<LoadBalancer>> {
private LoadBalancersException exception;
@Override
protected void onPreExecute(){
showDialog();
}
@Override
protected ArrayList<LoadBalancer> doInBackground(Void... arg0) {
ArrayList<LoadBalancer> loadBalancers = null;
try {
loadBalancers = (new LoadBalancerManager(getContext())).createList();
} catch (LoadBalancersException e) {
exception = e;
}
return loadBalancers;
}
@Override
protected void onPostExecute(ArrayList<LoadBalancer> result) {
hideDialog();
if (exception != null) {
showAlert("Error", exception.getMessage());
}
ArrayList<VirtualIp> vipList = getVipList(result);
setLoadBalancersList(vipList);
}
}
private ArrayList<VirtualIp> getVipList(ArrayList<LoadBalancer> result){
ArrayList<VirtualIp> vips = new ArrayList<VirtualIp>();
for(LoadBalancer lb : result){
for(VirtualIp ip : lb.getVirtualIps()){
ip.setLoadBalancer(lb);
vips.add(ip);
}
}
return vips;
}
}