Statistics
| Branch: | Revision:

root / src / com / rackspace / cloud / android / AccessControlActivity.java @ 7dbfc514

History | View | Annotate | Download (8.4 kB)

1
package com.rackspace.cloud.android;
2

    
3
import java.util.ArrayList;
4

    
5
import org.apache.http.HttpResponse;
6

    
7
import android.app.Activity;
8
import android.app.AlertDialog;
9
import android.app.Dialog;
10
import android.content.DialogInterface;
11
import android.content.Intent;
12
import android.os.AsyncTask;
13
import android.os.Bundle;
14
import android.view.LayoutInflater;
15
import android.view.View;
16
import android.view.View.OnClickListener;
17
import android.view.ViewGroup;
18
import android.widget.ArrayAdapter;
19
import android.widget.Button;
20
import android.widget.ImageView;
21
import android.widget.ListView;
22
import android.widget.TextView;
23

    
24
import com.rackspace.cloud.android.R;
25
import com.rackspace.cloud.loadbalancer.api.client.LoadBalancer;
26
import com.rackspace.cloud.loadbalancer.api.client.NetworkItem;
27
import com.rackspace.cloud.loadbalancer.api.client.NetworkItemManager;
28
import com.rackspace.cloud.loadbalancer.api.client.http.LoadBalancersException;
29
import com.rackspace.cloud.servers.api.client.CloudServersException;
30
import com.rackspace.cloud.servers.api.client.http.HttpBundle;
31

    
32
public class AccessControlActivity extends CloudListActivity {
33

    
34
        private final int REMOVE_RULE = 199;
35
        private final int ADD_RULE = 219;
36
        
37
        private LoadBalancer loadBalancer;
38
        private ArrayList<NetworkItem> networkItems;
39
        private int lastSelectedRulePosition;
40
        
41
        @Override
42
        public void onCreate(Bundle savedInstanceState) {
43
                super.onCreate(savedInstanceState);
44
                loadBalancer = (LoadBalancer) this.getIntent().getExtras().get("loadBalancer");
45
                setContentView(R.layout.accesscontrol);
46
                restoreState(savedInstanceState);
47
        }
48

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

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

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

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

    
94
        @Override
95
        protected Dialog onCreateDialog(int id) {
96
                switch (id) {
97
                case REMOVE_RULE: 
98
                        return new AlertDialog.Builder(AccessControlActivity.this)
99
                        .setIcon(R.drawable.alert_dialog_icon)
100
                        .setTitle("Remove Rule")
101
                        .setMessage("Would you like to remove this rule?")
102
                        .setPositiveButton("Remove", new DialogInterface.OnClickListener() {
103
                                public void onClick(DialogInterface dialog, int whichButton) {
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 displayLoadingCell() {
141
                    String a[] = new String[1];
142
                    a[0] = "Loading...";
143
                setListAdapter(new ArrayAdapter<String>(this, R.layout.loadingcell, R.id.loading_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 displayNoRulesCell() {
150
                String a[] = new String[1];
151
                a[0] = "No Rules";
152
                setListAdapter(new ArrayAdapter<String>(this, R.layout.norulescell, R.id.no_rules_label, a));
153
                getListView().setTextFilterEnabled(true);
154
                getListView().setDividerHeight(0); // hide the dividers so it won't look like a list row
155
                getListView().setItemsCanFocus(false);
156
        }
157

    
158
        private void loadNetworkItems() {
159
                displayLoadingCell();
160
                new LoadNetworkItemsTask().execute((Void[]) null);
161
        }
162

    
163
        // * Adapter/
164
        class NetworkItemAdapter extends ArrayAdapter<NetworkItem> {
165
                NetworkItemAdapter() {
166
                        super(AccessControlActivity.this, R.layout.accesscontrolcell, networkItems);
167
                }
168

    
169
                public View getView(int position, View convertView, ViewGroup parent) {
170

    
171
                        NetworkItem networkItem = networkItems.get(position);
172
                        LayoutInflater inflater = getLayoutInflater();
173
                        View row = inflater.inflate(R.layout.accesscontrolcell, parent, false);
174

    
175
                        TextView label = (TextView) row.findViewById(R.id.ip_address_text);
176
                        label.setText(networkItem.getAddress());
177

    
178
                        TextView sublabel = (TextView) row.findViewById(R.id.status_text);
179
                        sublabel.setText(networkItem.getType());
180
                        
181
                        ImageView typeImage = (ImageView) row.findViewById(R.id.rule_type_image);
182
                        int image;
183
                        if(networkItem.getType().equals("ALLOW")){
184
                                image = R.drawable.allow_rule;
185
                        } else {
186
                                image = R.drawable.deny_rule;
187
                        }
188
                        typeImage.setImageResource(image);
189

    
190

    
191
                        return(row);
192
                }
193
        }
194

    
195
        private class LoadNetworkItemsTask extends AsyncTask<Void, Void, ArrayList<NetworkItem>> {
196
                private LoadBalancersException exception;
197

    
198
                @Override
199
                protected void onPreExecute(){
200
                        //set to null so will reload on config changes
201
                        networkItems = null;
202
                }
203

    
204
                @Override
205
                protected ArrayList<NetworkItem> doInBackground(Void... arg0) {
206
                        ArrayList<NetworkItem> networkItems = null;
207
                        try {
208
                                networkItems = new NetworkItemManager(getContext()).createList(loadBalancer);
209
                        } catch (LoadBalancersException e) {
210
                                exception = e;                                
211
                        }
212
                        return networkItems;
213
                }
214

    
215
                @Override
216
                protected void onPostExecute(ArrayList<NetworkItem> result) {
217
                        if (exception != null) {
218
                                showAlert("Error", exception.getMessage());
219
                        }
220
                        setNetworkItemList(result);
221
                }
222
        }
223
        
224
        private class DeleteNetworkItemTask extends AsyncTask<Void, Void, HttpBundle> {
225

    
226
                        private CloudServersException exception;
227
                        private NetworkItem networkItem;
228

    
229
                        @Override
230
                        //let user know their process has started
231
                        protected void onPreExecute(){
232
                                networkItem = networkItems.get(lastSelectedRulePosition);
233
                                displayLoadingCell();
234
                                //set to null so will reload on config change
235
                                networkItems = null;
236
                        }
237
                        @Override
238
                        protected HttpBundle doInBackground(Void... arg0) {
239
                                HttpBundle bundle = null;
240
                                try {
241
                                        bundle = new NetworkItemManager(getContext()).delete(loadBalancer, networkItem);
242
                                } catch (CloudServersException e) {
243
                                        exception = e;
244
                                }
245
                                return bundle;
246
                        }
247

    
248
                        @Override
249
                        protected void onPostExecute(HttpBundle bundle) {
250
                                HttpResponse response = bundle.getResponse();
251
                                if (response != null) {
252
                                        int statusCode = response.getStatusLine().getStatusCode();
253
                                        if (statusCode == 202 || statusCode == 200) {
254
                                                setResult(Activity.RESULT_OK);
255
                                                loadNetworkItems();
256
                                        } else {
257
                                                CloudServersException cse = parseCloudServersException(response);
258
                                                if ("".equals(cse.getMessage())) {
259
                                                        showError("There was a problem deleting your rule.", bundle);
260
                                                } else {
261
                                                        showError("There was a problem deleting your rule: " + cse.getMessage(), bundle);
262
                                                }
263
                                        }
264
                                } else if (exception != null) {
265
                                        showError("There was a problem deleting your rule: " + exception.getMessage(), bundle);                                
266
                                }                        
267
                        }
268
                }
269

    
270

    
271

    
272
        protected void onActivityResult(int requestCode, int resultCode, Intent data){        
273
                if(requestCode == ADD_RULE && resultCode == RESULT_OK){
274
                        loadNetworkItems();
275
                }
276
        }
277
}