Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / AccessControlActivity.java @ c25e8fa0

History | View | Annotate | Download (7.9 kB)

1
package com.rackspacecloud.android;
2

    
3
import java.util.ArrayList;
4

    
5
import org.apache.http.HttpResponse;
6

    
7
import com.rackspace.cloud.loadbalancer.api.client.LoadBalancer;
8
import com.rackspace.cloud.loadbalancer.api.client.NetworkItem;
9
import com.rackspace.cloud.loadbalancer.api.client.NetworkItemManager;
10
import com.rackspace.cloud.loadbalancer.api.client.http.LoadBalancersException;
11
import com.rackspace.cloud.servers.api.client.CloudServersException;
12
import com.rackspace.cloud.servers.api.client.http.HttpBundle;
13

    
14
import android.app.Activity;
15
import android.app.AlertDialog;
16
import android.app.Dialog;
17
import android.content.DialogInterface;
18
import android.content.Intent;
19
import android.os.AsyncTask;
20
import android.os.Bundle;
21
import android.view.LayoutInflater;
22
import android.view.View;
23
import android.view.View.OnClickListener;
24
import android.view.ViewGroup;
25
import android.widget.ArrayAdapter;
26
import android.widget.Button;
27
import android.widget.ImageView;
28
import android.widget.ListView;
29
import android.widget.TextView;
30

    
31
public class AccessControlActivity extends CloudListActivity {
32

    
33
        private final int REMOVE_RULE = 199;
34
        private final int ADD_RULE = 219;
35
        
36
        private LoadBalancer loadBalancer;
37
        private ArrayList<NetworkItem> networkItems;
38
        private int lastSelectedRulePosition;
39

    
40
        @Override
41
        public void onCreate(Bundle savedInstanceState) {
42
                super.onCreate(savedInstanceState);
43
                loadBalancer = (LoadBalancer) this.getIntent().getExtras().get("loadBalancer");
44
                setContentView(R.layout.accesscontrol);
45
                restoreState(savedInstanceState);
46
        }
47

    
48
        @Override
49
        protected void onSaveInstanceState(Bundle outState) {
50
                super.onSaveInstanceState(outState);
51
                outState.putSerializable("networkItems", networkItems);
52
        }
53

    
54
        @SuppressWarnings("unchecked")
55
        protected void restoreState(Bundle state) {
56
                super.restoreState(state);
57

    
58
                setupButton();
59
                
60
                if (state != null && state.containsKey("networkItems") && state.getSerializable("networkItems") != null) {
61
                        networkItems = (ArrayList<NetworkItem>) state.getSerializable("networkItems");
62
                        if (networkItems.size() == 0) {
63
                                displayNoRulesCell();
64
                        } else {
65
                                getListView().setDividerHeight(1); // restore divider lines
66
                                setListAdapter(new NetworkItemAdapter());
67
                        }
68
                } else {
69
                        loadNetworkItems();
70
                }
71
        }
72
        
73
        private void setupButton(){
74
                Button addRule = (Button)findViewById(R.id.add_rule_button);
75
                addRule.setOnClickListener(new OnClickListener() {
76
                        
77
                        @Override
78
                        public void onClick(View v) {
79
                                Intent viewIntent = new Intent(getContext(), AddAccessRuleActivity.class);
80
                                viewIntent.putExtra("loadBalancer", loadBalancer);
81
                                startActivityForResult(viewIntent, ADD_RULE);
82
                        }
83
                });
84
        }
85

    
86
        protected void onListItemClick(ListView l, View v, int position, long id) {
87
                if (networkItems != null && networkItems.size() > 0) {
88
                        lastSelectedRulePosition = position;
89
                        showDialog(REMOVE_RULE);
90
                }
91
        }
92

    
93
        @Override
94
        protected Dialog onCreateDialog(int id) {
95
                switch (id) {
96
                case REMOVE_RULE: 
97
                        return new AlertDialog.Builder(AccessControlActivity.this)
98
                        .setIcon(R.drawable.alert_dialog_icon)
99
                        .setTitle("Remove Rule")
100
                        .setMessage("Would you like to remove this rule?")
101
                        .setPositiveButton("Remove", new DialogInterface.OnClickListener() {
102
                                public void onClick(DialogInterface dialog, int whichButton) {
103
                                        //trackEvent(CATEGORY_SERVER, EVENT_DELETE, "", -1);
104
                                        new DeleteNetworkItemTask().execute((Void[]) null);
105
                                }
106
                        })
107
                        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
108
                                public void onClick(DialogInterface dialog, int whichButton) {
109
                                        // User clicked Cancel so do some stuff
110
                                }
111
                        })
112
                        .create();          
113
                }
114
                return null;
115
        }
116
        
117
        private void setNetworkItemList(ArrayList<NetworkItem> networkItems) {
118
                if (networkItems == null) {
119
                        networkItems = new ArrayList<NetworkItem>();
120
                }
121
                this.networkItems = new ArrayList<NetworkItem>();
122
                String[] networkItemNames = new String[networkItems.size()];
123

    
124
                if (networkItems != null) {
125
                        for (int i = 0; i < networkItems.size(); i++) {
126
                                NetworkItem networkItem = networkItems.get(i);
127
                                this.networkItems.add(i, networkItem);
128
                                networkItemNames[i] = networkItem.getName();
129
                        }
130
                }
131

    
132
                if (networkItemNames.length == 0) {
133
                        displayNoRulesCell();
134
                } else {
135
                        getListView().setDividerHeight(1); // restore divider lines 
136
                        setListAdapter(new NetworkItemAdapter());
137
                }
138
        }
139

    
140
        private void displayNoRulesCell() {
141
                String a[] = new String[1];
142
                a[0] = "No Rules";
143
                setListAdapter(new ArrayAdapter<String>(this, R.layout.norulescell, R.id.no_rules_label, a));
144
                getListView().setTextFilterEnabled(true);
145
                getListView().setDividerHeight(0); // hide the dividers so it won't look like a list row
146
                getListView().setItemsCanFocus(false);
147
        }
148

    
149
        private void loadNetworkItems() {
150
                new LoadNetworkItemsTask().execute((Void[]) null);
151
        }
152

    
153
        // * Adapter/
154
        class NetworkItemAdapter extends ArrayAdapter<NetworkItem> {
155
                NetworkItemAdapter() {
156
                        super(AccessControlActivity.this, R.layout.accesscontrolcell, networkItems);
157
                }
158

    
159
                public View getView(int position, View convertView, ViewGroup parent) {
160

    
161
                        NetworkItem networkItem = networkItems.get(position);
162
                        LayoutInflater inflater = getLayoutInflater();
163
                        View row = inflater.inflate(R.layout.accesscontrolcell, parent, false);
164

    
165
                        TextView label = (TextView) row.findViewById(R.id.ip_address_text);
166
                        label.setText(networkItem.getAddress());
167

    
168
                        TextView sublabel = (TextView) row.findViewById(R.id.status_text);
169
                        sublabel.setText(networkItem.getType());
170
                        
171
                        ImageView typeImage = (ImageView) row.findViewById(R.id.rule_type_image);
172
                        int image;
173
                        if(networkItem.getType().equals("ALLOW")){
174
                                image = R.drawable.allow_rule;
175
                        } else {
176
                                image = R.drawable.deny_rule;
177
                        }
178
                        typeImage.setImageResource(image);
179

    
180

    
181
                        return(row);
182
                }
183
        }
184

    
185
        private class LoadNetworkItemsTask extends AsyncTask<Void, Void, ArrayList<NetworkItem>> {
186
                private LoadBalancersException exception;
187

    
188
                @Override
189
                protected void onPreExecute(){
190
                        showDialog();
191
                }
192

    
193
                @Override
194
                protected ArrayList<NetworkItem> doInBackground(Void... arg0) {
195
                        ArrayList<NetworkItem> networkItems = null;
196
                        try {
197
                                networkItems = new NetworkItemManager(getContext()).createList(loadBalancer);
198
                        } catch (LoadBalancersException e) {
199
                                exception = e;                                
200
                        }
201
                        return networkItems;
202
                }
203

    
204
                @Override
205
                protected void onPostExecute(ArrayList<NetworkItem> result) {
206
                        hideDialog();
207
                        if (exception != null) {
208
                                showAlert("Error", exception.getMessage());
209
                        }
210
                        setNetworkItemList(result);
211
                }
212
        }
213
        
214
        private class DeleteNetworkItemTask extends AsyncTask<Void, Void, HttpBundle> {
215

    
216
                        private CloudServersException exception;
217

    
218
                        @Override
219
                        //let user know their process has started
220
                        protected void onPreExecute(){
221
                                showDialog();
222
                        }
223
                        @Override
224
                        protected HttpBundle doInBackground(Void... arg0) {
225
                                HttpBundle bundle = null;
226
                                try {
227
                                        bundle = new NetworkItemManager(getContext()).delete(loadBalancer, networkItems.get(lastSelectedRulePosition));
228
                                } catch (CloudServersException e) {
229
                                        exception = e;
230
                                }
231
                                return bundle;
232
                        }
233

    
234
                        @Override
235
                        protected void onPostExecute(HttpBundle bundle) {
236
                                hideDialog();
237
                                HttpResponse response = bundle.getResponse();
238
                                if (response != null) {
239
                                        int statusCode = response.getStatusLine().getStatusCode();
240
                                        if (statusCode == 202 || statusCode == 200) {
241
                                                setResult(Activity.RESULT_OK);
242
                                                loadNetworkItems();
243
                                        } else {
244
                                                CloudServersException cse = parseCloudServersException(response);
245
                                                if ("".equals(cse.getMessage())) {
246
                                                        showError("There was a problem deleting your rule.", bundle);
247
                                                } else {
248
                                                        showError("There was a problem deleting your rule: " + cse.getMessage(), bundle);
249
                                                }
250
                                        }
251
                                } else if (exception != null) {
252
                                        showError("There was a problem deleting your rule: " + exception.getMessage(), bundle);                                
253
                                }                        
254
                        }
255
                }
256

    
257

    
258

    
259
        protected void onActivityResult(int requestCode, int resultCode, Intent data){        
260
                if(requestCode == ADD_RULE && resultCode == RESULT_OK){
261
                        loadNetworkItems();
262
                }
263
        }
264
}