Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / ListServersActivity.java @ 23cc0515

History | View | Annotate | Download (6.5 kB)

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

    
6
import java.util.ArrayList;
7

    
8
import android.app.AlertDialog;
9
import android.content.Context;
10
import android.content.DialogInterface;
11
import android.content.Intent;
12
import android.os.AsyncTask;
13
import android.os.Bundle;
14
import android.util.Log;
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 GaListActivity {
35
        
36
        private Server[] servers;
37
        private Context context;
38
        
39
        
40
        @Override
41
    public void onCreate(Bundle savedInstanceState) {
42
        super.onCreate(savedInstanceState);
43
        trackPageView(GoogleAnalytics.PAGE_SERVERS);
44
        context = getApplicationContext();
45
        restoreState(savedInstanceState);
46
    }
47
        
48
        @Override
49
        protected void onSaveInstanceState(Bundle outState) {
50
                super.onSaveInstanceState(outState);
51
                outState.putSerializable("servers", servers);
52
        }
53

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

    
197
                        TextView label = (TextView) row.findViewById(R.id.label);
198
                        label.setText(server.getName());
199
                        
200
                        TextView sublabel = (TextView) row.findViewById(R.id.sublabel);                        
201
                        sublabel.setText(server.getPublicIpAddresses()[0]);
202
                        
203
                        ImageView icon = (ImageView) row.findViewById(R.id.icon);
204
                        icon.setImageResource(server.getImage().iconResourceId());
205

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