Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / ListServersActivity.java @ 25881fb3

History | View | Annotate | Download (6.4 kB)

1
/**
2
 * 
3
 */
4
package com.rackspacecloud.android;
5

    
6
import java.util.ArrayList;
7

    
8
import android.app.AlertDialog;
9
import android.app.ListActivity;
10
import android.content.Context;
11
import android.content.DialogInterface;
12
import android.content.Intent;
13
import android.os.AsyncTask;
14
import android.os.Bundle;
15
import android.view.LayoutInflater;
16
import android.view.Menu;
17
import android.view.MenuInflater;
18
import android.view.MenuItem;
19
import android.view.View;
20
import android.view.ViewGroup;
21
import android.widget.ArrayAdapter;
22
import android.widget.ImageView;
23
import android.widget.ListView;
24
import android.widget.TextView;
25

    
26
import com.rackspace.cloud.servers.api.client.CloudServersException;
27
import com.rackspace.cloud.servers.api.client.Server;
28
import com.rackspace.cloud.servers.api.client.ServerManager;
29

    
30
/**
31
 * @author Mike Mayo - mike.mayo@rackspace.com - twitter.com/greenisus
32
 *
33
 */
34
public class ListServersActivity extends ListActivity {
35

    
36
        private Server[] servers;
37
        private Context context;
38
        
39
        @Override
40
    public void onCreate(Bundle savedInstanceState) {
41
        super.onCreate(savedInstanceState);
42
        context = getApplicationContext();
43
        restoreState(savedInstanceState);
44
    }
45
        
46
        @Override
47
        protected void onSaveInstanceState(Bundle outState) {
48
                super.onSaveInstanceState(outState);
49
                outState.putSerializable("servers", servers);
50
        }
51

    
52
    private void restoreState(Bundle state) {
53
            if (state != null && state.containsKey("servers") && state.getSerializable("servers") != null) {
54
                    servers = (Server[]) state.getSerializable("servers");
55
                    if (servers.length == 0) {
56
                            displayNoServersCell();
57
                    } else {
58
                            getListView().setDividerHeight(1); // restore divider lines 
59
                            setListAdapter(new ServerAdapter());
60
                    }
61
            } else {
62
            loadServers();        
63
            }
64
    }
65
    
66
    protected void onListItemClick(ListView l, View v, int position, long id) {
67
            if (servers != null && servers.length > 0) {
68
                    Intent viewIntent = new Intent(this, ViewServerActivity.class);
69
                    viewIntent.putExtra("server", servers[position]);
70
                        startActivityForResult(viewIntent, 55); // arbitrary number; never used again
71
            }
72
    }
73
    
74
    private void loadServers() {
75
            displayLoadingCell();
76
            new LoadServersTask().execute((Void[]) null);
77
    }
78
    
79
    private void setServerList(ArrayList<Server> servers) {
80
            if (servers == null) {
81
                    servers = new ArrayList<Server>();
82
            }
83
            String[] serverNames = new String[servers.size()];
84
            this.servers = new Server[servers.size()];
85
            
86
                if (servers != null) {
87
                        for (int i = 0; i < servers.size(); i++) {
88
                                Server server = servers.get(i);
89
                                this.servers[i] = server;
90
                                serverNames[i] = server.getName();
91
                        }
92
                }
93
                
94
                if (serverNames.length == 0) {
95
                        displayNoServersCell();
96
                } else {
97
                        getListView().setDividerHeight(1); // restore divider lines 
98
                        setListAdapter(new ServerAdapter());
99
                }
100
    }
101
    
102
    private void displayLoadingCell() {
103
            String a[] = new String[1];
104
            a[0] = "Loading...";
105
        setListAdapter(new ArrayAdapter<String>(this, R.layout.loadingcell, R.id.loading_label, a));
106
        getListView().setTextFilterEnabled(true);
107
        getListView().setDividerHeight(0); // hide the dividers so it won't look like a list row
108
        getListView().setItemsCanFocus(false);
109
    }
110
    
111
    private void displayNoServersCell() {
112
            String a[] = new String[1];
113
            a[0] = "No Servers";
114
        setListAdapter(new ArrayAdapter<String>(this, R.layout.noserverscell, R.id.no_servers_label, a));
115
        getListView().setTextFilterEnabled(true);
116
        getListView().setDividerHeight(0); // hide the dividers so it won't look like a list row
117
        getListView().setItemsCanFocus(false);
118
    }
119
    
120
    private void showAlert(String title, String message) {
121
            //Can't create handler inside thread that has not called Looper.prepare()
122
            //Looper.prepare();
123
            try {
124
                AlertDialog alert = new AlertDialog.Builder(this).create();
125
                alert.setTitle(title);
126
                alert.setMessage(message);
127
                alert.setButton("OK", new DialogInterface.OnClickListener() {
128
              public void onClick(DialogInterface dialog, int which) {
129
                return;
130
            } }); 
131
                alert.show();
132
            } catch (Exception e) {
133
                    e.printStackTrace();
134
            }
135
    }
136
            
137
    private class LoadServersTask extends AsyncTask<Void, Void, ArrayList<Server>> {
138
            
139
            private CloudServersException exception;
140
            
141
                @Override
142
                protected ArrayList<Server> doInBackground(Void... arg0) {
143
                        ArrayList<Server> servers = null;
144
                        try {
145
                                servers = (new ServerManager()).createList(true, context);
146
                        } catch (CloudServersException e) {
147
                                exception = e;                                
148
                        }
149
                        return servers;
150
                }
151
            
152
                @Override
153
                protected void onPostExecute(ArrayList<Server> result) {
154
                        if (exception != null) {
155
                                showAlert("Error", exception.getMessage());
156
                        }
157
                        setServerList(result);
158
                }
159
    }
160
    
161
    @Override 
162
    public boolean onCreateOptionsMenu(Menu menu) {
163
                super.onCreateOptionsMenu(menu);
164
                MenuInflater inflater = getMenuInflater();
165
                inflater.inflate(R.menu.servers_list_menu, menu);
166
                return true;
167
        } 
168
    
169
    @Override 
170
    public boolean onOptionsItemSelected(MenuItem item) {
171
                switch (item.getItemId()) {
172
                case R.id.add_server:
173
                        startActivityForResult(new Intent(this, AddServerActivity.class), 56); // arbitrary number; never used again
174
                        return true;
175
                case R.id.refresh:
176
                        servers = null;
177
                        loadServers();
178
                return true;
179
                }
180
                return false;
181
        } 
182
        //*/
183
    
184
        class ServerAdapter extends ArrayAdapter<Server> {
185
                ServerAdapter() {
186
                        super(ListServersActivity.this, R.layout.listservercell, servers);
187
                }
188
                
189
                public View getView(int position, View convertView, ViewGroup parent) {
190
                        
191
                        Server server = servers[position];
192
                        LayoutInflater inflater = getLayoutInflater();
193
                        View row = inflater.inflate(R.layout.listservercell, parent, false);
194

    
195
                        TextView label = (TextView) row.findViewById(R.id.label);
196
                        label.setText(server.getName());
197
                        
198
                        TextView sublabel = (TextView) row.findViewById(R.id.sublabel);
199
                        sublabel.setText(server.getFlavor().getName() + " - " + server.getImage().getName());
200
                        
201
                        ImageView icon = (ImageView) row.findViewById(R.id.icon);
202
                        icon.setImageResource(server.getImage().iconResourceId());
203

    
204
                        return(row);
205
                }
206
        }
207
    
208
        @Override
209
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
210
          super.onActivityResult(requestCode, resultCode, data);
211
          
212
          if (resultCode == RESULT_OK) {          
213
                  // a sub-activity kicked back, so we want to refresh the server list
214
                  loadServers();
215
          }
216
        }        
217
}