Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / AddNodesActivity.java @ b722cab3

History | View | Annotate | Download (8 kB)

1
package com.rackspacecloud.android;
2

    
3
import java.util.ArrayList;
4

    
5
import com.rackspace.cloud.loadbalancer.api.client.Node;
6
import com.rackspace.cloud.servers.api.client.CloudServersException;
7
import com.rackspace.cloud.servers.api.client.Server;
8
import com.rackspace.cloud.servers.api.client.ServerManager;
9

    
10
import android.content.Intent;
11
import android.os.AsyncTask;
12
import android.os.Bundle;
13
import android.util.Log;
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.CheckBox;
21
import android.widget.CompoundButton;
22
import android.widget.LinearLayout;
23
import android.widget.ListView;
24
import android.widget.CompoundButton.OnCheckedChangeListener;
25
import android.widget.ImageView;
26
import android.widget.TextView;
27

    
28
public class AddNodesActivity extends CloudListActivity {
29

    
30
        private static final int ADD_NODE_CODE = 178;
31

    
32
        private Server[] servers;
33
        private int lastCheckedPos;
34
        private ArrayList<Node> nodes;
35

    
36
        @SuppressWarnings("unchecked")
37
        @Override
38
        public void onCreate(Bundle savedInstanceState) {
39
                super.onCreate(savedInstanceState);
40
                nodes = (ArrayList<Node>) this.getIntent().getExtras().get("nodes");
41
                setContentView(R.layout.addnodes);
42
                restoreState(savedInstanceState);
43
        }
44

    
45
        @Override
46
        protected void onSaveInstanceState(Bundle outState) {
47
                super.onSaveInstanceState(outState);
48
                outState.putSerializable("nodes", nodes);
49
                outState.putSerializable("servers", servers);
50
        }
51

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

    
56
                if (state != null && state.containsKey("nodes")){
57
                        nodes = (ArrayList<Node>) state.getSerializable("nodes");
58
                        if(nodes == null){
59
                                nodes = new ArrayList<Node>();
60
                        }
61
                }
62

    
63
                if (state != null && state.containsKey("servers")) {
64
                        servers = (Server[]) state.getSerializable("servers");
65
                        if (servers.length == 0) {
66
                                displayNoServersCell();
67
                        } else {
68
                                getListView().setDividerHeight(1); // restore divider lines
69
                                setListAdapter(new ServerAdapter());
70
                        }
71
                } else {
72
                        loadServers();
73
                }
74

    
75
                Button submitNodes = (Button) findViewById(R.id.submit_nodes_button);
76
                submitNodes.setOnClickListener(new OnClickListener() {
77

    
78
                        @Override
79
                        public void onClick(View v) {
80
                                Intent viewIntent = new Intent();
81
                                viewIntent.putExtra("nodes", nodes);
82
                                setResult(RESULT_OK, viewIntent);
83
                                finish();
84
                        }
85
                });
86
        }
87

    
88
        @Override
89
        public void onBackPressed(){
90
                setResult(RESULT_CANCELED);
91
                finish();
92
        }
93

    
94
        private void displayNoServersCell() {
95
                String a[] = new String[1];
96
                a[0] = "No Nodes";
97
                setListAdapter(new ArrayAdapter<String>(this, R.layout.noserverscell, R.id.no_servers_label, a));
98
                getListView().setTextFilterEnabled(true);
99
                getListView().setDividerHeight(0); // hide the dividers so it won't look like a list row
100
                getListView().setItemsCanFocus(false);
101
        }
102

    
103
        private void setServerList(ArrayList<Server> servers) {
104
                if (servers == null) {
105
                        servers = new ArrayList<Server>();
106
                }
107
                String[] serverNames = new String[servers.size()];
108
                this.servers = new Server[servers.size()];
109

    
110
                if (servers != null) {
111
                        for (int i = 0; i < servers.size(); i++) {
112
                                Server server = servers.get(i);
113
                                this.servers[i] = server;
114
                                serverNames[i] = server.getName();
115
                        }
116
                }
117

    
118
                if (serverNames.length == 0) {
119
                        displayNoServersCell();
120
                } else {
121
                        getListView().setDividerHeight(1); // restore divider lines 
122
                        setListAdapter(new ServerAdapter());
123
                }
124
        }
125

    
126
        private void loadServers() {
127
                new LoadServersTask().execute((Void[]) null);
128
        }
129

    
130
        private class LoadServersTask extends AsyncTask<Void, Void, ArrayList<Server>> {
131
                private CloudServersException exception;
132

    
133
                @Override
134
                protected void onPreExecute(){
135
                        showDialog();
136
                }
137

    
138
                @Override
139
                protected ArrayList<Server> doInBackground(Void... arg0) {
140
                        ArrayList<Server> servers = null;
141
                        try {
142
                                servers = (new ServerManager()).createList(true, getContext());
143
                        } catch (CloudServersException e) {
144
                                exception = e;                                
145
                        }
146
                        return servers;
147
                }
148

    
149
                @Override
150
                protected void onPostExecute(ArrayList<Server> result) {
151
                        hideDialog();
152
                        if (exception != null) {
153
                                showAlert("Error", exception.getMessage());
154
                        }
155
                        setServerList(result);
156
                }
157
        }
158

    
159
        // * Adapter/
160
        class ServerAdapter extends ArrayAdapter<Server> {
161
                ServerAdapter() {
162
                        super(AddNodesActivity.this, R.layout.listservernodecell, servers);
163
                }
164

    
165
                public View getView(int position, View convertView, ViewGroup parent) {
166

    
167
                        final Server server = servers[position];
168
                        LayoutInflater inflater = getLayoutInflater();
169
                        View row = inflater.inflate(R.layout.listservernodecell, parent, false);
170

    
171
                        TextView label = (TextView) row.findViewById(R.id.label);
172
                        label.setText(server.getName());
173

    
174
                        TextView sublabel = (TextView) row.findViewById(R.id.sublabel);
175
                        sublabel.setText(server.getFlavor().getName() + " - " + server.getImage().getName());
176

    
177
                        ImageView icon = (ImageView) row.findViewById(R.id.icon);
178
                        icon.setImageResource(server.getImage().iconResourceId());
179

    
180
                        String[] publicIp = server.getPublicIpAddresses();
181
                        String[] privateIp = server.getPrivateIpAddresses();
182

    
183

    
184
                        final String[] ipAddresses = new String[privateIp.length + publicIp.length];
185
                        for(int i = 0; i < privateIp.length; i++){
186
                                ipAddresses[i] = privateIp[i];
187
                        }
188
                        for(int i = 0; i < publicIp.length; i++){
189
                                ipAddresses[i+privateIp.length] = publicIp[i];
190
                        }
191

    
192
                        final int pos = position;
193
                        CheckBox add = (CheckBox) row.findViewById(R.id.add_node_checkbox);
194

    
195
                        if(inNodeList(server)){
196
                                add.setChecked(true);
197
                        }
198

    
199
                        add.setOnCheckedChangeListener(new OnCheckedChangeListener() {
200

    
201
                                @Override
202
                                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
203
                                        if(isChecked){
204
                                                lastCheckedPos = pos;
205
                                                Intent viewIntent = new Intent(getContext(), AddNodeActivity.class);
206
                                                viewIntent.putExtra("ipAddresses", ipAddresses);
207
                                                viewIntent.putExtra("name", server.getName());
208
                                                //weighted is false, because on initial node add
209
                                                //weight is not option
210
                                                viewIntent.putExtra("weighted", false);
211
                                                startActivityForResult(viewIntent, ADD_NODE_CODE);
212
                                        }
213
                                        else{
214
                                                removeNodeFromList(server);
215
                                        }
216
                                }
217
                        });
218

    
219
                        return(row);
220
                }
221

    
222
                private boolean inNodeList(Server server){
223
                        for(Node node : nodes){
224
                                String nodeIp = node.getAddress();
225
                                if(serverHasIp(server, nodeIp)){
226
                                        return true;
227
                                }
228
                        }
229
                        return false;
230
                }
231

    
232
                /*
233
                 *  need to remove by id because that is 
234
                 *  what is unique
235
                 */
236
                private void removeNodeFromList(Server server){
237
                        for(int i = 0; i < nodes.size(); i++){
238
                                Node node = nodes.get(i);
239
                                if(serverHasIp(server, node.getAddress())){
240
                                        nodes.remove(i);
241
                                        break;
242
                                }
243
                        }
244
                }
245

    
246
                private boolean serverHasIp(Server server, String address){
247
                        String[] addresses = server.getPrivateIpAddresses();
248
                        for(int i = 0; i < addresses.length; i++){
249
                                if(addresses[i].equals(address)){
250
                                        return true;
251
                                }
252
                        }
253
                        addresses = server.getPublicIpAddresses();
254
                        for(int i = 0; i < addresses.length; i++){
255
                                if(addresses[i].equals(address)){
256
                                        return true;
257
                                }
258
                        }
259
                        return false;
260
                }
261
        }
262

    
263

    
264

    
265
        protected void onActivityResult(int requestCode, int resultCode, Intent data){
266
                int pos = lastCheckedPos;
267
                if(requestCode == ADD_NODE_CODE && resultCode == RESULT_OK){
268
                        Node node = new Node();
269
                        node.setAddress(data.getStringExtra("nodeIp"));
270
                        node.setCondition(data.getStringExtra("nodeCondition"));
271
                        node.setName(servers[pos].getName());
272
                        node.setPort(data.getStringExtra("nodePort"));
273
                        Log.d("info", "the node weight is " + data.getStringExtra("nodeWeight"));
274
                        node.setWeight(data.getStringExtra("nodeWeight"));
275
                        nodes.add(node);
276
                }
277
                else if(requestCode == ADD_NODE_CODE && resultCode == RESULT_CANCELED){
278
                        //uncheck the node at lastCheckedPos
279
                        LinearLayout linear = (LinearLayout) findViewById(R.id.nodes_linear_layout); 
280
                        ListView serversList = (ListView) linear.findViewById(android.R.id.list);
281
                        View row = serversList.getChildAt(pos);
282
                        CheckBox checkBox = (CheckBox)row.findViewById(R.id.add_node_checkbox);
283
                        checkBox.setChecked(false);
284
                }
285
        }
286

    
287

    
288
}