Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / ListContainerActivity.java @ 240418be

History | View | Annotate | Download (8 kB)

1
package com.rackspacecloud.android;
2

    
3
import java.util.ArrayList;
4

    
5
import android.app.AlertDialog;
6
import android.app.ListActivity;
7
import android.content.DialogInterface;
8
import android.content.Intent;
9
import android.os.AsyncTask;
10
import android.os.Bundle;
11
import android.util.Log;
12
import android.view.LayoutInflater;
13
import android.view.Menu;
14
import android.view.MenuInflater;
15
import android.view.MenuItem;
16
import android.view.View;
17
import android.view.ViewGroup;
18
import android.widget.ArrayAdapter;
19
import android.widget.ListView;
20
import android.widget.TextView;
21

    
22
import com.rackspace.cloud.files.api.client.Container;
23
import com.rackspace.cloud.files.api.client.ContainerManager;
24
import com.rackspace.cloud.servers.api.client.CloudServersException;
25

    
26
/**
27
 * 
28
 * @author Phillip Toohill
29
 * 
30
 */
31
public class ListContainerActivity extends ListActivity {
32

    
33
        private Container[] containers;
34
        public Container container;
35
        public Container cdnContainer;
36
        public String[] containerNames;
37
        public Object megaBytes;
38
        public Object kiloBytes;
39
        public int bConver = 1048576;
40
        public int kbConver = 1024;
41
        protected static final int DELETE_ID = 0;
42

    
43
        @Override
44
        public void onCreate(Bundle savedInstanceState) {
45
                super.onCreate(savedInstanceState);
46
                restoreState(savedInstanceState);
47
        }
48

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

    
55
        private void restoreState(Bundle state) {
56
                if (state != null && state.containsKey("container")) {
57
                        containers = (Container[]) state.getSerializable("container");
58
                        if (containers.length == 0) {
59
                                displayNoServersCell();
60
                        } else {
61
                                getListView().setDividerHeight(1); // restore divider lines
62
                                setListAdapter(new FileAdapter());
63
                        }
64
                } else {
65
                        loadContainers();
66
                        registerForContextMenu(getListView());
67
                }
68
        }
69

    
70
        protected void onListItemClick(ListView l, View v, int position, long id) {
71
                if (containers != null && containers.length > 0) {
72
                        Intent viewIntent = new Intent(this, ContainerObjectsActivity.class);
73
                        viewIntent.putExtra("container", containers[position]);
74
                        startActivityForResult(viewIntent, 55);
75

    
76
                        // startActivityForResult(viewIntent, 55); // arbitrary number;
77
                        // never used again
78
                }
79
        }
80

    
81
        private void loadContainers() {
82
                displayLoadingCell();
83
                new LoadContainersTask().execute((Void[]) null);
84
        }
85

    
86
        private void setContainerList() {
87
                if (containerNames.length == 0) {
88
                        displayNoServersCell();
89
                } else {
90
                        getListView().setDividerHeight(1); // restore divider lines
91
                        setListAdapter(new FileAdapter());
92
                }
93
        }
94

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

    
106
        private void displayNoServersCell() {
107
                String a[] = new String[1];
108
                a[0] = "No Files";
109
                setListAdapter(new ArrayAdapter<String>(this,
110
                                R.layout.nocontainerscell, R.id.no_containers_label, a));
111
                getListView().setTextFilterEnabled(true);
112
                getListView().setDividerHeight(0); // hide the dividers so it won't look
113
                                                                                        // like a list row
114
                getListView().setItemsCanFocus(false);
115
        }
116

    
117
        private void showAlert(String title, String message) {
118
                // Can't create handler inside thread that has not called
119
                // Looper.prepare()
120
                // Looper.prepare();
121
                try {
122
                        AlertDialog alert = new AlertDialog.Builder(this).create();
123
                        alert.setTitle(title);
124
                        alert.setMessage(message);
125
                        alert.setButton("OK", new DialogInterface.OnClickListener() {
126
                                public void onClick(DialogInterface dialog, int which) {
127
                                        return;
128
                                }
129
                        });
130
                        alert.show();
131
                } catch (Exception e) {
132
                        e.printStackTrace();
133
                }
134
        }
135

    
136
        private class LoadContainersTask extends
137
                        AsyncTask<Void, Void, ArrayList<Container>> {
138

    
139
                private CloudServersException exception;
140

    
141
                @Override
142
                protected ArrayList<Container> doInBackground(Void... arg0) {
143
                        ArrayList<Container> containers = null;
144

    
145
                        try {
146
                                containers = (new ContainerManager()).createList(true);
147
                        } catch (CloudServersException e) {
148
                                exception = e;
149
                        }
150
                        return containers;
151
                }
152

    
153
                @Override
154
                protected void onPostExecute(ArrayList<Container> result) {
155
                        if (exception != null) {
156
                                showAlert("Error", exception.getMessage());
157
                        }
158
                        ArrayList<Container> containerList = result;
159
                        containerNames = new String[containerList.size()];
160
                        containers = new Container[containerList.size()];
161
                        if (containerList != null) {
162
                                for (int i = 0; i < containerList.size(); i++) {
163
                                        Container container = containerList.get(i);
164
                                        containers[i] = container;
165
                                        containerNames[i] = container.getName();
166
                                }
167
                        }
168

    
169
                        new LoadCDNContainersTask().execute((Void[]) null);
170
                }
171
        }
172

    
173
        private class LoadCDNContainersTask extends
174
                        AsyncTask<Void, Void, ArrayList<Container>> {
175

    
176
                private CloudServersException exception;
177

    
178
                @Override
179
                protected ArrayList<Container> doInBackground(Void... arg0) {
180
                        ArrayList<Container> cdnContainers = null;
181

    
182
                        try {
183
                                cdnContainers = (new ContainerManager()).createCDNList(true);
184
                        } catch (CloudServersException e) {
185
                                exception = e;
186
                        }
187
                        return cdnContainers;
188
                }
189

    
190
                @Override
191
                protected void onPostExecute(ArrayList<Container> result) {
192
                        Log.v("listcontainerActivity", "onPostExecute loadCDNcontainerTask");
193
                        if (exception != null) {
194
                                showAlert("Error", exception.getMessage());
195
                        }
196

    
197
                        ArrayList<Container> cdnContainers = result;
198

    
199
                        for (int i = 0; i < containers.length; i++) {
200
                                Container container = containers[i];
201
                                for (int t = 0; t < cdnContainers.size(); t++) {
202
                                        Container cdnContainer = cdnContainers.get(t);
203
                                        if (container.getName().equals(cdnContainer.getName())) {
204
                                                container.setCdnEnabled(true);
205
                                                container.setCdnUrl(cdnContainer.getCdnUrl());
206
                                                container.setTtl(cdnContainer.getTtl());
207
                                        }
208
                                }
209
                        }
210
                        setContainerList();
211
                }
212
        }
213

    
214
        @Override
215
        public boolean onCreateOptionsMenu(Menu menu) {
216
                super.onCreateOptionsMenu(menu);
217
                MenuInflater inflater = getMenuInflater();
218
                inflater.inflate(R.menu.container_list_menu, menu);
219
                return true;
220
        }
221

    
222
        @Override
223
        public boolean onOptionsItemSelected(MenuItem item) {
224
                switch (item.getItemId()) {
225
                case R.id.add_container:
226
                        startActivityForResult(
227
                                        new Intent(this, AddContainerActivity.class), 56); // arbitrary
228
                                                                                                                                                // number;
229
                                                                                                                                                // never
230
                                                                                                                                                // used
231
                                                                                                                                                // again
232
                        return true;
233
                case R.id.refresh:
234
                        loadContainers();
235
                        return true;
236
                }
237
                return false;
238
        }
239

    
240
        class FileAdapter extends ArrayAdapter<Container> {
241
                FileAdapter() {
242
                        super(ListContainerActivity.this, R.layout.listcontainerscell,
243
                                        containers);
244
                }
245

    
246
                public View getView(int position, View convertView, ViewGroup parent) {
247

    
248
                        Container container = containers[position];
249
                        LayoutInflater inflater = getLayoutInflater();
250
                        View row = inflater.inflate(R.layout.listcontainerscell, parent,
251
                                        false);
252

    
253
                        TextView label = (TextView) row.findViewById(R.id.label);
254
                        label.setText(container.getName());
255

    
256
                        if (container.getBytes() >= bConver) {
257
                                megaBytes = Math.abs(container.getBytes() / bConver + 0.2);
258
                                TextView sublabel = (TextView) row.findViewById(R.id.sublabel);
259
                                sublabel.setText(container.getCount() + " Objects " + megaBytes
260
                                                + " MB");
261
                        } else if (container.getBytes() >= kbConver) {
262
                                kiloBytes = Math.abs(container.getBytes() / kbConver + 0.2);
263
                                TextView sublabel = (TextView) row.findViewById(R.id.sublabel);
264
                                sublabel.setText(container.getCount() + " Objects " + kiloBytes
265
                                                + " KB");
266
                        } else {
267
                                TextView sublabel = (TextView) row.findViewById(R.id.sublabel);
268
                                sublabel.setText(container.getCount() + " Objects "
269
                                                + container.getBytes() + " B");
270
                        }
271

    
272
                        return (row);
273
                }
274
        }
275

    
276
        @Override
277
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
278
                super.onActivityResult(requestCode, resultCode, data);
279

    
280
                if (resultCode == RESULT_OK) {
281
                        // a sub-activity kicked back, so we want to refresh the server list
282
                        loadContainers();
283
                }
284
        }
285

    
286
}