Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / ListServersActivity.java @ eb3b3154

History | View | Annotate | Download (7.2 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.app.ProgressDialog;
11
import android.content.Context;
12
import android.content.DialogInterface;
13
import android.content.Intent;
14
import android.os.AsyncTask;
15
import android.os.Bundle;
16
import android.view.LayoutInflater;
17
import android.view.Menu;
18
import android.view.MenuInflater;
19
import android.view.MenuItem;
20
import android.view.View;
21
import android.view.ViewGroup;
22
import android.view.WindowManager;
23
import android.view.ViewGroup.LayoutParams;
24
import android.widget.ArrayAdapter;
25
import android.widget.ImageView;
26
import android.widget.ListView;
27
import android.widget.ProgressBar;
28
import android.widget.TextView;
29

    
30
import com.rackspace.cloud.servers.api.client.CloudServersException;
31
import com.rackspace.cloud.servers.api.client.Server;
32
import com.rackspace.cloud.servers.api.client.ServerManager;
33

    
34
/**
35
 * @author Mike Mayo - mike.mayo@rackspace.com - twitter.com/greenisus
36
 *
37
 */
38
public class ListServersActivity extends ListActivity {
39

    
40
        private Server[] servers;
41
        private Context context;
42
        ProgressDialog pDialog;
43
        
44
        @Override
45
    public void onCreate(Bundle savedInstanceState) {
46
        super.onCreate(savedInstanceState);
47
        context = getApplicationContext();
48
        setContentView(R.layout.list_servers);
49
        restoreState(savedInstanceState);
50
    }
51
        
52
        @Override
53
        protected void onSaveInstanceState(Bundle outState) {
54
                super.onSaveInstanceState(outState);
55
                outState.putSerializable("servers", servers);
56
        }
57

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

    
218
                        TextView label = (TextView) row.findViewById(R.id.label);
219
                        label.setText(server.getName());
220
                        
221
                        TextView sublabel = (TextView) row.findViewById(R.id.sublabel);
222
                        sublabel.setText(server.getFlavor().getName() + " - " + server.getImage().getName());
223
                        
224
                        ImageView icon = (ImageView) row.findViewById(R.id.icon);
225
                        icon.setImageResource(server.getImage().iconResourceId());
226

    
227
                        return(row);
228
                }
229
        }
230
    
231
        @Override
232
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
233
          super.onActivityResult(requestCode, resultCode, data);
234
          
235
          if (resultCode == RESULT_OK) {          
236
                  // a sub-activity kicked back, so we want to refresh the server list
237
                  loadServers();
238
          }
239
        }        
240
}