Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / ContainerObjectDetails.java @ 6b8dad86

History | View | Annotate | Download (18.9 kB)

1 3d6041e8 Phillip Toohill
package com.rackspacecloud.android;
2 3d6041e8 Phillip Toohill
3 51938302 Adam Menz
import java.io.BufferedOutputStream;
4 51938302 Adam Menz
import java.io.File;
5 51938302 Adam Menz
import java.io.FileNotFoundException;
6 51938302 Adam Menz
import java.io.FileOutputStream;
7 3d6041e8 Phillip Toohill
import java.io.IOException;
8 3d6041e8 Phillip Toohill
import java.io.StringReader;
9 3d6041e8 Phillip Toohill
10 3d6041e8 Phillip Toohill
import javax.xml.parsers.FactoryConfigurationError;
11 3d6041e8 Phillip Toohill
import javax.xml.parsers.ParserConfigurationException;
12 3d6041e8 Phillip Toohill
import javax.xml.parsers.SAXParser;
13 3d6041e8 Phillip Toohill
import javax.xml.parsers.SAXParserFactory;
14 3d6041e8 Phillip Toohill
15 51938302 Adam Menz
import org.apache.http.HttpEntity;
16 3d6041e8 Phillip Toohill
import org.apache.http.HttpResponse;
17 3d6041e8 Phillip Toohill
import org.apache.http.client.ClientProtocolException;
18 3d6041e8 Phillip Toohill
import org.apache.http.impl.client.BasicResponseHandler;
19 51938302 Adam Menz
import org.apache.http.util.EntityUtils;
20 3d6041e8 Phillip Toohill
import org.xml.sax.InputSource;
21 3d6041e8 Phillip Toohill
import org.xml.sax.SAXException;
22 3d6041e8 Phillip Toohill
import org.xml.sax.XMLReader;
23 3d6041e8 Phillip Toohill
24 3d6041e8 Phillip Toohill
import android.app.Activity;
25 3d6041e8 Phillip Toohill
import android.app.AlertDialog;
26 3d6041e8 Phillip Toohill
import android.app.Dialog;
27 d3ea294b Adam Menz
import android.app.ProgressDialog;
28 b347d5e3 Chmouel Boudjnah
import android.content.Context;
29 3d6041e8 Phillip Toohill
import android.content.DialogInterface;
30 82cd98ea unknown
import android.content.Intent;
31 82cd98ea unknown
import android.net.Uri;
32 3d6041e8 Phillip Toohill
import android.os.AsyncTask;
33 3d6041e8 Phillip Toohill
import android.os.Bundle;
34 51938302 Adam Menz
import android.os.Environment;
35 006434d8 Adam Menz
import android.util.Log;
36 3d6041e8 Phillip Toohill
import android.view.Menu;
37 3d6041e8 Phillip Toohill
import android.view.MenuInflater;
38 3d6041e8 Phillip Toohill
import android.view.MenuItem;
39 82cd98ea unknown
import android.view.View;
40 82cd98ea unknown
import android.widget.Button;
41 3d6041e8 Phillip Toohill
import android.widget.TextView;
42 697895bc Adam Menz
import android.widget.Toast;
43 3d6041e8 Phillip Toohill
44 3d6041e8 Phillip Toohill
import com.rackspace.cloud.files.api.client.ContainerObjectManager;
45 3d6041e8 Phillip Toohill
import com.rackspace.cloud.files.api.client.ContainerObjects;
46 3d6041e8 Phillip Toohill
import com.rackspace.cloud.servers.api.client.CloudServersException;
47 32731215 Adam Menz
import com.rackspace.cloud.servers.api.client.http.HttpBundle;
48 3d6041e8 Phillip Toohill
import com.rackspace.cloud.servers.api.client.parsers.CloudServersFaultXMLParser;
49 3d6041e8 Phillip Toohill
50 3d6041e8 Phillip Toohill
/** 
51 3d6041e8 Phillip Toohill
 * 
52 3d6041e8 Phillip Toohill
 * @author Phillip Toohill
53 3d6041e8 Phillip Toohill
 *
54 3d6041e8 Phillip Toohill
 */
55 3d6041e8 Phillip Toohill
56 6b8dad86 Adam Menz
//doesn't extend cloud activity because of the complex
57 6b8dad86 Adam Menz
//dialog management needed for the listeners
58 0edf6b39 Adam Menz
public class ContainerObjectDetails extends GaActivity {
59 3e180b04 Adam Menz
60 3d6041e8 Phillip Toohill
        private static final int deleteObject = 0;
61 51938302 Adam Menz
        private final String DOWNLOAD_DIRECTORY = "/RackspaceCloud";
62 0edf6b39 Adam Menz
        
63 3d6041e8 Phillip Toohill
        private ContainerObjects objects;
64 3d6041e8 Phillip Toohill
        private String containerNames;
65 3d6041e8 Phillip Toohill
        private String cdnURL;
66 8b432514 Phillip Toohill
        private String cdnEnabled;
67 3d6041e8 Phillip Toohill
        public String LOG = "ViewObject";
68 6864568a Phillip Toohill
        private int bConver = 1048576;
69 6864568a Phillip Toohill
        private int kbConver = 1024;
70 6864568a Phillip Toohill
        private double megaBytes;
71 6864568a Phillip Toohill
        private double kiloBytes;
72 82cd98ea unknown
        public Button previewButton;
73 51938302 Adam Menz
        public Button downloadButton;
74 b347d5e3 Chmouel Boudjnah
        public Context context;
75 3e180b04 Adam Menz
        private boolean displayDialog;
76 51938302 Adam Menz
        private ProgressDialog dialog;
77 51938302 Adam Menz
        private Boolean isDownloaded;
78 3e180b04 Adam Menz
        private AndroidCloudApplication app;
79 3e180b04 Adam Menz
        private DeleteObjectListenerTask deleteObjTask;
80 3e180b04 Adam Menz
        private DownloadObjectListenerTask downloadObjTask;
81 0edf6b39 Adam Menz
                
82 3e180b04 Adam Menz
        /** Called when the activity is first created. */
83 3e180b04 Adam Menz
        @Override
84 3e180b04 Adam Menz
        public void onCreate(Bundle savedInstanceState) {
85 3e180b04 Adam Menz
                super.onCreate(savedInstanceState);
86 0edf6b39 Adam Menz
                trackPageView(PAGE_STORAGE_OBJECT);
87 0edf6b39 Adam Menz
                
88 3e180b04 Adam Menz
                context = getApplicationContext();
89 3e180b04 Adam Menz
90 3e180b04 Adam Menz
                objects = (ContainerObjects) this.getIntent().getExtras().get("container");
91 3e180b04 Adam Menz
                containerNames =  (String) this.getIntent().getExtras().get("containerNames");
92 3e180b04 Adam Menz
                cdnURL = (String) this.getIntent().getExtras().get("cdnUrl");
93 3e180b04 Adam Menz
                cdnEnabled = (String) this.getIntent().getExtras().get("isCdnEnabled");
94 3e180b04 Adam Menz
95 3e180b04 Adam Menz
96 3e180b04 Adam Menz
                setContentView(R.layout.viewobject);       
97 3e180b04 Adam Menz
                restoreState(savedInstanceState);
98 3e180b04 Adam Menz
99 3e180b04 Adam Menz
        }
100 3e180b04 Adam Menz
101 3d6041e8 Phillip Toohill
        @Override
102 3d6041e8 Phillip Toohill
        protected void onSaveInstanceState(Bundle outState) {
103 3d6041e8 Phillip Toohill
                super.onSaveInstanceState(outState);
104 3d6041e8 Phillip Toohill
                outState.putSerializable("container", objects);
105 51938302 Adam Menz
                outState.putBoolean("isDownloaded", isDownloaded);
106 3e180b04 Adam Menz
                outState.putBoolean("displayDialog", displayDialog);
107 3e180b04 Adam Menz
                
108 3e180b04 Adam Menz
                if(displayDialog){
109 3e180b04 Adam Menz
                        hideDialog();
110 3e180b04 Adam Menz
                        displayDialog = true;
111 3e180b04 Adam Menz
                }
112 3d6041e8 Phillip Toohill
        }
113 3d6041e8 Phillip Toohill
114 3e180b04 Adam Menz
        private void restoreState(Bundle state) {
115 3e180b04 Adam Menz
                
116 3e180b04 Adam Menz
                /*
117 3e180b04 Adam Menz
                 * need reference to the app so you can access curDirFiles
118 3e180b04 Adam Menz
                 * as well as processing status
119 3e180b04 Adam Menz
                 */
120 3e180b04 Adam Menz
                app = (AndroidCloudApplication)this.getApplication();
121 51938302 Adam Menz
122 3e180b04 Adam Menz
                if (state != null && state.containsKey("displayDialog") && state.getBoolean("displayDialog")) {
123 3e180b04 Adam Menz
                    showDialog();
124 51938302 Adam Menz
            } else {
125 3e180b04 Adam Menz
                    hideDialog();
126 51938302 Adam Menz
            }
127 3e180b04 Adam Menz
                
128 3e180b04 Adam Menz
                if (state != null && state.containsKey("container")) {
129 3e180b04 Adam Menz
                        objects = (ContainerObjects) state.getSerializable("container");
130 3e180b04 Adam Menz
                }
131 3e180b04 Adam Menz
                loadObjectData();
132 51938302 Adam Menz
133 3e180b04 Adam Menz
                if ( cdnEnabled.equals("true"))  {
134 3e180b04 Adam Menz
                        this.previewButton = (Button) findViewById(R.id.preview_button);
135 3e180b04 Adam Menz
                        previewButton.setOnClickListener(new MyOnClickListener());
136 3e180b04 Adam Menz
                } else {
137 3e180b04 Adam Menz
                        this.previewButton = (Button) findViewById(R.id.preview_button);
138 3e180b04 Adam Menz
                        previewButton.setVisibility(View.GONE);
139 3e180b04 Adam Menz
                }
140 3e180b04 Adam Menz
141 3e180b04 Adam Menz
                if (state != null && state.containsKey("isDownloaded")){
142 3e180b04 Adam Menz
                        isDownloaded = state.getBoolean("isDownloaded");
143 3e180b04 Adam Menz
                }
144 3e180b04 Adam Menz
                else{
145 3e180b04 Adam Menz
                        isDownloaded = fileIsDownloaded();
146 3e180b04 Adam Menz
                }
147 3e180b04 Adam Menz
                this.downloadButton = (Button) findViewById(R.id.download_button);
148 3e180b04 Adam Menz
                if ( isDownloaded )  {
149 3e180b04 Adam Menz
                        downloadButton.setText("Open File");
150 3e180b04 Adam Menz
                } else {
151 3e180b04 Adam Menz
                        downloadButton.setText("Download File");
152 3e180b04 Adam Menz
                }           
153 3e180b04 Adam Menz
                downloadButton.setOnClickListener(new MyOnClickListener());
154 3e180b04 Adam Menz
                
155 3e180b04 Adam Menz
                if(app.isDeletingObject()){
156 3e180b04 Adam Menz
                        deleteObjTask = new DeleteObjectListenerTask();
157 3e180b04 Adam Menz
                        deleteObjTask.execute();
158 3e180b04 Adam Menz
                }
159 3e180b04 Adam Menz
                
160 3e180b04 Adam Menz
                if(app.isDownloadingObject()){
161 3e180b04 Adam Menz
                        downloadObjTask = new DownloadObjectListenerTask();
162 3e180b04 Adam Menz
                        downloadObjTask.execute();
163 3e180b04 Adam Menz
                }
164 3e180b04 Adam Menz
        }
165 3e180b04 Adam Menz
        
166 3e180b04 Adam Menz
        @Override
167 3e180b04 Adam Menz
        protected void onStart(){
168 3e180b04 Adam Menz
                super.onStart();
169 3e180b04 Adam Menz
                if(displayDialog){
170 3e180b04 Adam Menz
                        showDialog();
171 3e180b04 Adam Menz
                }
172 3e180b04 Adam Menz
        }
173 3e180b04 Adam Menz
174 3e180b04 Adam Menz
        
175 3e180b04 Adam Menz
        @Override
176 3e180b04 Adam Menz
        protected void onStop(){
177 3e180b04 Adam Menz
                super.onStop();
178 51938302 Adam Menz
179 3e180b04 Adam Menz
                if(displayDialog){
180 3e180b04 Adam Menz
                        hideDialog();
181 3e180b04 Adam Menz
                        displayDialog = true;
182 3e180b04 Adam Menz
                }
183 82cd98ea unknown
184 3e180b04 Adam Menz
                /*
185 3e180b04 Adam Menz
                 * Need to stop running listener task
186 3e180b04 Adam Menz
                 * if we exit
187 3e180b04 Adam Menz
                 */
188 3e180b04 Adam Menz
                if(deleteObjTask != null){
189 3e180b04 Adam Menz
                        deleteObjTask.cancel(true);
190 3e180b04 Adam Menz
                }
191 3e180b04 Adam Menz
                
192 3e180b04 Adam Menz
                if(downloadObjTask != null){
193 3e180b04 Adam Menz
                        downloadObjTask.cancel(true);
194 3e180b04 Adam Menz
                }
195 3e180b04 Adam Menz
        }
196 3e180b04 Adam Menz
197 3e180b04 Adam Menz
198 3e180b04 Adam Menz
        private void loadObjectData() {
199 3e180b04 Adam Menz
                //Object Name
200 3e180b04 Adam Menz
                TextView name = (TextView) findViewById(R.id.view_container_name);
201 3e180b04 Adam Menz
                name.setText(objects.getCName().toString());
202 3e180b04 Adam Menz
203 3e180b04 Adam Menz
                //File size
204 3e180b04 Adam Menz
                if (objects.getBytes() >= bConver) {
205 6864568a Phillip Toohill
                        megaBytes = Math.abs(objects.getBytes()/bConver + 0.2);
206 3e180b04 Adam Menz
                        TextView sublabel = (TextView) findViewById(R.id.view_file_bytes);
207 3e180b04 Adam Menz
                        sublabel.setText(megaBytes + " MB");
208 6864568a Phillip Toohill
                } else if (objects.getBytes() >= kbConver){
209 6864568a Phillip Toohill
                        kiloBytes = Math.abs(objects.getBytes()/kbConver + 0.2);
210 3e180b04 Adam Menz
                        TextView sublabel = (TextView) findViewById(R.id.view_file_bytes);
211 3e180b04 Adam Menz
                        sublabel.setText(kiloBytes + " KB");
212 6864568a Phillip Toohill
                } else {
213 3e180b04 Adam Menz
                        TextView sublabel = (TextView) findViewById(R.id.view_file_bytes);
214 3e180b04 Adam Menz
                        sublabel.setText(objects.getBytes() + " B");
215 78af992b unknown
                }        
216 3e180b04 Adam Menz
217 3e180b04 Adam Menz
                //Content Type
218 3e180b04 Adam Menz
                TextView cType = (TextView) findViewById(R.id.view_content_type);
219 3e180b04 Adam Menz
                cType.setText(objects.getContentType().toString());
220 3e180b04 Adam Menz
221 3e180b04 Adam Menz
                //Last Modification date
222 3e180b04 Adam Menz
                String strDate = objects.getLastMod();
223 877f6f58 Adam Menz
                strDate = strDate.substring(0, strDate.indexOf('T'));
224 877f6f58 Adam Menz
                /*
225 3e180b04 Adam Menz
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.ssssss");
226 3e180b04 Adam Menz
                Date dateStr = null;
227 3e180b04 Adam Menz
                try {
228 3e180b04 Adam Menz
                        dateStr = formatter.parse(strDate);
229 3e180b04 Adam Menz
                } catch (ParseException e1) {
230 3e180b04 Adam Menz
                        e1.printStackTrace();
231 3e180b04 Adam Menz
                }
232 3e180b04 Adam Menz
                String formattedDate = formatter.format(dateStr);
233 877f6f58 Adam Menz

234 3e180b04 Adam Menz
                Date date1 = null;
235 3e180b04 Adam Menz
                try {
236 3e180b04 Adam Menz
                        date1 = formatter.parse(formattedDate);
237 3e180b04 Adam Menz
                } catch (ParseException e) {
238 3e180b04 Adam Menz
                        e.printStackTrace();
239 3e180b04 Adam Menz
                }      
240 3e180b04 Adam Menz
                formatter = new SimpleDateFormat("MMM-dd-yyyy");
241 3e180b04 Adam Menz
                formattedDate = formatter.format(date1);
242 877f6f58 Adam Menz
                */
243 3e180b04 Adam Menz
                TextView lastmod = (TextView) findViewById(R.id.view_file_modification);
244 877f6f58 Adam Menz
                lastmod.setText(strDate);              
245 3e180b04 Adam Menz
246 3e180b04 Adam Menz
        }
247 3e180b04 Adam Menz
248 3e180b04 Adam Menz
        private class MyOnClickListener implements View.OnClickListener {
249 3e180b04 Adam Menz
                @Override
250 3e180b04 Adam Menz
                public void onClick(View v) {
251 3e180b04 Adam Menz
                        if(v.equals(findViewById(R.id.preview_button))){
252 3e180b04 Adam Menz
                                Intent viewIntent = new Intent("android.intent.action.VIEW", Uri.parse(cdnURL + "/" + objects.getCName()));
253 3e180b04 Adam Menz
                                startActivity(viewIntent);  
254 78af992b unknown
                        }
255 3e180b04 Adam Menz
                        /*
256 3e180b04 Adam Menz
                         * need to perform different functions based on if
257 3e180b04 Adam Menz
                         * the file is in the devices filesystem
258 3e180b04 Adam Menz
                         */
259 3e180b04 Adam Menz
                        if(v.equals(findViewById(R.id.download_button))){
260 3e180b04 Adam Menz
                                if(!isDownloaded){
261 3e180b04 Adam Menz
                                        if(storageIsReady()){
262 3e180b04 Adam Menz
                                                new ContainerObjectDownloadTask().execute();
263 3e180b04 Adam Menz
                                        }
264 3e180b04 Adam Menz
                                        else{
265 3e180b04 Adam Menz
                                                showAlert("Error", "Storage not found.");
266 3e180b04 Adam Menz
                                        }
267 3e180b04 Adam Menz
                                }
268 3e180b04 Adam Menz
                                else{
269 3e180b04 Adam Menz
                                        openFile();
270 3e180b04 Adam Menz
                                }
271 3e180b04 Adam Menz
                        }
272 3e180b04 Adam Menz
                }
273 3e180b04 Adam Menz
        }
274 3e180b04 Adam Menz
275 3e180b04 Adam Menz
        private void showAlert(String title, String message) {
276 3d6041e8 Phillip Toohill
                AlertDialog alert = new AlertDialog.Builder(this).create();
277 3d6041e8 Phillip Toohill
                alert.setTitle(title);
278 3d6041e8 Phillip Toohill
                alert.setMessage(message);
279 3d6041e8 Phillip Toohill
                alert.setButton("OK", new DialogInterface.OnClickListener() {
280 3e180b04 Adam Menz
                        public void onClick(DialogInterface dialog, int which) {
281 3e180b04 Adam Menz
                                return;
282 3e180b04 Adam Menz
                        } }); 
283 3d6041e8 Phillip Toohill
                alert.show();
284 3e180b04 Adam Menz
        }
285 3e180b04 Adam Menz
        //Create the Menu options
286 3e180b04 Adam Menz
        @Override 
287 3e180b04 Adam Menz
        public boolean onCreateOptionsMenu(Menu menu) {
288 3d6041e8 Phillip Toohill
                super.onCreateOptionsMenu(menu);
289 3d6041e8 Phillip Toohill
                MenuInflater inflater = getMenuInflater();
290 3d6041e8 Phillip Toohill
                inflater.inflate(R.menu.container_object_list_menu, menu);
291 3d6041e8 Phillip Toohill
                return true;
292 3d6041e8 Phillip Toohill
        } 
293 3e180b04 Adam Menz
294 3e180b04 Adam Menz
        @Override 
295 3e180b04 Adam Menz
        public boolean onOptionsItemSelected(MenuItem item) {
296 3d6041e8 Phillip Toohill
                switch (item.getItemId()) {
297 3d6041e8 Phillip Toohill
                case R.id.delete_object:
298 3d6041e8 Phillip Toohill
                        showDialog(deleteObject); 
299 3d6041e8 Phillip Toohill
                        return true;
300 3d6041e8 Phillip Toohill
                case R.id.refresh:
301 3d6041e8 Phillip Toohill
                        loadObjectData();
302 3e180b04 Adam Menz
                        return true;
303 3d6041e8 Phillip Toohill
                }
304 3d6041e8 Phillip Toohill
                return false;
305 3d6041e8 Phillip Toohill
        } 
306 3e180b04 Adam Menz
307 3e180b04 Adam Menz
        @Override
308 3e180b04 Adam Menz
        protected Dialog onCreateDialog(int id ) {
309 3e180b04 Adam Menz
                switch (id) {
310 3e180b04 Adam Menz
                case deleteObject:
311 3e180b04 Adam Menz
                        return new AlertDialog.Builder(ContainerObjectDetails.this)
312 3e180b04 Adam Menz
                        .setIcon(R.drawable.alert_dialog_icon)
313 3e180b04 Adam Menz
                        .setTitle("Delete File")
314 3e180b04 Adam Menz
                        .setMessage("Are you sure you want to delete this file?")
315 3e180b04 Adam Menz
                        .setPositiveButton("Delete File", new DialogInterface.OnClickListener() {
316 3e180b04 Adam Menz
                                public void onClick(DialogInterface dialog, int whichButton) {
317 3e180b04 Adam Menz
                                        // User clicked OK so do some stuff
318 0edf6b39 Adam Menz
                                        trackEvent(CATEGORY_FILE, EVENT_DELETE, "", -1);
319 3e180b04 Adam Menz
                                        new ContainerObjectDeleteTask().execute((Void[]) null);
320 3e180b04 Adam Menz
                                }
321 3e180b04 Adam Menz
                        })
322 3e180b04 Adam Menz
                        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
323 3e180b04 Adam Menz
                                public void onClick(DialogInterface dialog, int whichButton) {
324 3e180b04 Adam Menz
                                        // User clicked Cancel so do some stuff
325 3e180b04 Adam Menz
                                }
326 3e180b04 Adam Menz
                        })
327 3e180b04 Adam Menz
                        .create();
328 3e180b04 Adam Menz
                }
329 3e180b04 Adam Menz
                return null;
330 3e180b04 Adam Menz
        }
331 3e180b04 Adam Menz
        /**
332 3d6041e8 Phillip Toohill
         * @return the file
333 3d6041e8 Phillip Toohill
         */
334 3d6041e8 Phillip Toohill
        public ContainerObjects getViewFile() {
335 3d6041e8 Phillip Toohill
                return objects;
336 3d6041e8 Phillip Toohill
        }
337 3d6041e8 Phillip Toohill
338 3d6041e8 Phillip Toohill
        /**
339 3d6041e8 Phillip Toohill
         * @param File the file to set
340 3d6041e8 Phillip Toohill
         */
341 3d6041e8 Phillip Toohill
        public void setViewFile(ContainerObjects object) {
342 3d6041e8 Phillip Toohill
                this.objects = object;
343 3d6041e8 Phillip Toohill
        }
344 3e180b04 Adam Menz
345 51938302 Adam Menz
        /*
346 51938302 Adam Menz
         * returns false if external storage is not avaliable
347 51938302 Adam Menz
         * (if its mounted, missing, read-only, etc)
348 51938302 Adam Menz
         * from: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal
349 51938302 Adam Menz
         */
350 51938302 Adam Menz
        private boolean storageIsReady(){
351 51938302 Adam Menz
                boolean mExternalStorageAvailable = false;
352 51938302 Adam Menz
                boolean mExternalStorageWriteable = false;
353 51938302 Adam Menz
                String state = Environment.getExternalStorageState();
354 51938302 Adam Menz
355 51938302 Adam Menz
                if (Environment.MEDIA_MOUNTED.equals(state)) {
356 3e180b04 Adam Menz
                        // We can read and write the media
357 3e180b04 Adam Menz
                        mExternalStorageAvailable = mExternalStorageWriteable = true;
358 51938302 Adam Menz
                } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
359 3e180b04 Adam Menz
                        // We can only read the media
360 3e180b04 Adam Menz
                        mExternalStorageAvailable = true;
361 3e180b04 Adam Menz
                        mExternalStorageWriteable = false;
362 51938302 Adam Menz
                } else {
363 3e180b04 Adam Menz
                        // Something else is wrong. It may be one of many other states, but all we need
364 3e180b04 Adam Menz
                        //  to know is we can neither read nor write
365 3e180b04 Adam Menz
                        mExternalStorageAvailable = mExternalStorageWriteable = false;
366 51938302 Adam Menz
                }
367 51938302 Adam Menz
                return mExternalStorageAvailable && mExternalStorageWriteable;
368 51938302 Adam Menz
        }
369 3e180b04 Adam Menz
370 51938302 Adam Menz
        private boolean fileIsDownloaded(){
371 51938302 Adam Menz
                if(storageIsReady()){
372 51938302 Adam Menz
                        String fileName = Environment.getExternalStorageDirectory().getPath() + "/RackspaceCloud/" + objects.getCName();
373 51938302 Adam Menz
                        File f = new File(fileName);
374 51938302 Adam Menz
                        return f.isFile();
375 51938302 Adam Menz
                }
376 51938302 Adam Menz
                return false;
377 51938302 Adam Menz
        }
378 3e180b04 Adam Menz
379 51938302 Adam Menz
        private void openFile(){
380 51938302 Adam Menz
                File object = new File(Environment.getExternalStorageDirectory().getPath() + "/RackspaceCloud/" + objects.getCName());
381 51938302 Adam Menz
                Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW);
382 3e180b04 Adam Menz
                File file = new File(object.getAbsolutePath()); 
383 3e180b04 Adam Menz
                String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString());
384 3e180b04 Adam Menz
                String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
385 3e180b04 Adam Menz
                myIntent.setDataAndType(Uri.fromFile(file),mimetype);
386 3e180b04 Adam Menz
                //myIntent.setData(Uri.fromFile(file));
387 3e180b04 Adam Menz
                try{
388 3e180b04 Adam Menz
                        startActivity(myIntent);
389 3e180b04 Adam Menz
                }
390 3e180b04 Adam Menz
                catch(Exception e){
391 3e180b04 Adam Menz
                        Toast.makeText(this, "Could not open file.", Toast.LENGTH_SHORT).show();
392 3e180b04 Adam Menz
                }
393 51938302 Adam Menz
        }
394 3e180b04 Adam Menz
395 51938302 Adam Menz
        private boolean writeFile(byte[] data){
396 51938302 Adam Menz
                String directoryName = Environment.getExternalStorageDirectory().getPath() + DOWNLOAD_DIRECTORY;
397 51938302 Adam Menz
                File f = new File(directoryName);
398 3e180b04 Adam Menz
399 51938302 Adam Menz
                if(!f.isDirectory()){
400 51938302 Adam Menz
                        if(!f.mkdir()){
401 51938302 Adam Menz
                                return false;
402 51938302 Adam Menz
                        }
403 51938302 Adam Menz
                }
404 3e180b04 Adam Menz
405 51938302 Adam Menz
                String filename = directoryName + "/" + objects.getCName();
406 51938302 Adam Menz
                File object = new File(filename);
407 51938302 Adam Menz
                BufferedOutputStream bos = null;
408 3e180b04 Adam Menz
409 51938302 Adam Menz
                try{
410 51938302 Adam Menz
                        FileOutputStream fos = new FileOutputStream(object);
411 51938302 Adam Menz
                        bos = new BufferedOutputStream(fos);
412 51938302 Adam Menz
                        bos.write(data);
413 51938302 Adam Menz
                }
414 51938302 Adam Menz
                catch(FileNotFoundException e){
415 51938302 Adam Menz
                        e.printStackTrace();
416 51938302 Adam Menz
                }
417 51938302 Adam Menz
                catch(IOException e){
418 51938302 Adam Menz
                        e.printStackTrace();
419 51938302 Adam Menz
                }
420 51938302 Adam Menz
                finally{
421 51938302 Adam Menz
                        if(bos != null){
422 51938302 Adam Menz
                                try {
423 51938302 Adam Menz
                                        bos.flush();
424 51938302 Adam Menz
                                        bos.close();
425 51938302 Adam Menz
                                } catch (IOException e) {
426 51938302 Adam Menz
                                        // TODO Auto-generated catch block
427 51938302 Adam Menz
                                        e.printStackTrace();
428 51938302 Adam Menz
                                }
429 51938302 Adam Menz
                        }
430 51938302 Adam Menz
                }
431 51938302 Adam Menz
                return true;
432 51938302 Adam Menz
        }
433 3e180b04 Adam Menz
434 3d6041e8 Phillip Toohill
        //Task's
435 3e180b04 Adam Menz
436 3e180b04 Adam Menz
        private CloudServersException parseCloudServersException(HttpResponse response) {
437 3e180b04 Adam Menz
                CloudServersException cse = new CloudServersException();
438 3e180b04 Adam Menz
                try {
439 3e180b04 Adam Menz
                        BasicResponseHandler responseHandler = new BasicResponseHandler();
440 3e180b04 Adam Menz
                        String body = responseHandler.handleResponse(response);
441 3e180b04 Adam Menz
                        CloudServersFaultXMLParser parser = new CloudServersFaultXMLParser();
442 3e180b04 Adam Menz
                        SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
443 3e180b04 Adam Menz
                        XMLReader xmlReader = saxParser.getXMLReader();
444 3e180b04 Adam Menz
                        xmlReader.setContentHandler(parser);
445 3e180b04 Adam Menz
                        xmlReader.parse(new InputSource(new StringReader(body)));                            
446 3e180b04 Adam Menz
                        cse = parser.getException();                            
447 3e180b04 Adam Menz
                } catch (ClientProtocolException e) {
448 3e180b04 Adam Menz
                        cse = new CloudServersException();
449 3e180b04 Adam Menz
                        cse.setMessage(e.getLocalizedMessage());
450 3e180b04 Adam Menz
                } catch (IOException e) {
451 3e180b04 Adam Menz
                        cse = new CloudServersException();
452 3e180b04 Adam Menz
                        cse.setMessage(e.getLocalizedMessage());
453 3e180b04 Adam Menz
                } catch (ParserConfigurationException e) {
454 3e180b04 Adam Menz
                        cse = new CloudServersException();
455 3e180b04 Adam Menz
                        cse.setMessage(e.getLocalizedMessage());
456 3e180b04 Adam Menz
                } catch (SAXException e) {
457 3e180b04 Adam Menz
                        cse = new CloudServersException();
458 3e180b04 Adam Menz
                        cse.setMessage(e.getLocalizedMessage());
459 3e180b04 Adam Menz
                } catch (FactoryConfigurationError e) {
460 3e180b04 Adam Menz
                        cse = new CloudServersException();
461 3e180b04 Adam Menz
                        cse.setMessage(e.getLocalizedMessage());
462 3e180b04 Adam Menz
                }
463 3e180b04 Adam Menz
                return cse;
464 3e180b04 Adam Menz
        }
465 3e180b04 Adam Menz
466 3e180b04 Adam Menz
        private void startFileError(String message, HttpBundle bundle){
467 3e180b04 Adam Menz
                Intent viewIntent = new Intent(getApplicationContext(), ServerErrorActivity.class);
468 3e180b04 Adam Menz
                viewIntent.putExtra("errorMessage", message);
469 3e180b04 Adam Menz
                viewIntent.putExtra("response", bundle.getResponseText());
470 3e180b04 Adam Menz
                viewIntent.putExtra("request", bundle.getCurlRequest());
471 3e180b04 Adam Menz
                startActivity(viewIntent);
472 3e180b04 Adam Menz
        }
473 3e180b04 Adam Menz
        
474 3e180b04 Adam Menz
        private void showDialog() {
475 3e180b04 Adam Menz
                if(dialog == null || !dialog.isShowing()){
476 3e180b04 Adam Menz
                        displayDialog = true;
477 3e180b04 Adam Menz
                        dialog = ProgressDialog.show(ContainerObjectDetails.this, "", "Loading...", true);
478 3e180b04 Adam Menz
                }
479 3e180b04 Adam Menz
    }
480 3e180b04 Adam Menz
    
481 3e180b04 Adam Menz
    private void hideDialog() {
482 3e180b04 Adam Menz
            if(dialog != null){
483 3e180b04 Adam Menz
                    dialog.dismiss();
484 3e180b04 Adam Menz
            }
485 3e180b04 Adam Menz
            displayDialog = false;
486 3e180b04 Adam Menz
    }
487 3e180b04 Adam Menz
488 3e180b04 Adam Menz
        private class ContainerObjectDeleteTask extends AsyncTask<Void, Void, HttpBundle> {
489 3e180b04 Adam Menz
490 3e180b04 Adam Menz
                private CloudServersException exception;
491 3e180b04 Adam Menz
492 3e180b04 Adam Menz
                protected void onPreExecute(){
493 3e180b04 Adam Menz
                        //dialog = ProgressDialog.show(ContainerObjectDetails.this, "", "Deleting...", true);
494 3e180b04 Adam Menz
                        showDialog();
495 3e180b04 Adam Menz
                        app.setDeleteingObject(true);
496 3e180b04 Adam Menz
                        deleteObjTask = new DeleteObjectListenerTask();
497 3e180b04 Adam Menz
                        deleteObjTask.execute();
498 3e180b04 Adam Menz
                }
499 3e180b04 Adam Menz
500 3e180b04 Adam Menz
                @Override
501 3e180b04 Adam Menz
                protected HttpBundle doInBackground(Void... arg0) {
502 3e180b04 Adam Menz
                        HttpBundle bundle = null;        
503 3e180b04 Adam Menz
                        try {
504 3e180b04 Adam Menz
                                bundle = (new ContainerObjectManager(context)).deleteObject(containerNames, objects.getCName() );
505 3e180b04 Adam Menz
                        } catch (CloudServersException e) {
506 3e180b04 Adam Menz
                                exception = e;
507 3e180b04 Adam Menz
                        }
508 3e180b04 Adam Menz
                        
509 3e180b04 Adam Menz
                        return bundle;
510 3e180b04 Adam Menz
                }
511 3e180b04 Adam Menz
512 3e180b04 Adam Menz
                @Override
513 3e180b04 Adam Menz
                protected void onPostExecute(HttpBundle bundle) {
514 3e180b04 Adam Menz
                        //dialog.dismiss();
515 3e180b04 Adam Menz
                        app.setDeleteingObject(false);
516 3e180b04 Adam Menz
                        hideDialog();
517 3e180b04 Adam Menz
                        HttpResponse response = bundle.getResponse();
518 3e180b04 Adam Menz
                        if (response != null) {
519 3e180b04 Adam Menz
                                int statusCode = response.getStatusLine().getStatusCode();
520 3e180b04 Adam Menz
                                if (statusCode == 204) {
521 3e180b04 Adam Menz
                                        //handled by listner
522 3e180b04 Adam Menz
                                } else {
523 3e180b04 Adam Menz
                                        CloudServersException cse = parseCloudServersException(response);
524 3e180b04 Adam Menz
                                        if ("".equals(cse.getMessage())) {
525 3e180b04 Adam Menz
                                                startFileError("There was a problem deleting your File.", bundle);
526 3e180b04 Adam Menz
                                        } else {
527 3e180b04 Adam Menz
                                                startFileError("There was a problem deleting your file: " + cse.getMessage(), bundle);
528 3e180b04 Adam Menz
                                        }
529 3e180b04 Adam Menz
                                }
530 3e180b04 Adam Menz
                        } else if (exception != null) {
531 3e180b04 Adam Menz
                                startFileError("There was a problem deleting your file: " + exception.getMessage(), bundle);                                
532 3e180b04 Adam Menz
                        }                        
533 3e180b04 Adam Menz
                }
534 3e180b04 Adam Menz
        }
535 3e180b04 Adam Menz
536 3e180b04 Adam Menz
        private class ContainerObjectDownloadTask extends AsyncTask<Void, Void, HttpBundle> {
537 3e180b04 Adam Menz
538 3e180b04 Adam Menz
                private CloudServersException exception;
539 3e180b04 Adam Menz
540 3e180b04 Adam Menz
                @Override
541 3e180b04 Adam Menz
                protected void onPreExecute(){
542 3e180b04 Adam Menz
                        showDialog();
543 3e180b04 Adam Menz
                        app.setDownloadingObject(true);
544 3e180b04 Adam Menz
                        downloadObjTask = new DownloadObjectListenerTask();
545 3e180b04 Adam Menz
                        downloadObjTask.execute();
546 3e180b04 Adam Menz
                }
547 3e180b04 Adam Menz
548 3e180b04 Adam Menz
                @Override
549 3e180b04 Adam Menz
                protected HttpBundle doInBackground(Void... arg0) {
550 3e180b04 Adam Menz
                        HttpBundle bundle = null;        
551 3e180b04 Adam Menz
                        try {
552 3e180b04 Adam Menz
                                bundle = (new ContainerObjectManager(context)).getObject(containerNames, objects.getCName());
553 3e180b04 Adam Menz
                        } catch (CloudServersException e) {
554 3e180b04 Adam Menz
                                exception = e;
555 3e180b04 Adam Menz
                        }
556 3e180b04 Adam Menz
                        return bundle;
557 3e180b04 Adam Menz
                }
558 3e180b04 Adam Menz
559 3e180b04 Adam Menz
                @Override
560 3e180b04 Adam Menz
                protected void onPostExecute(HttpBundle bundle) {
561 3e180b04 Adam Menz
                        app.setDownloadingObject(false);
562 3e180b04 Adam Menz
                        hideDialog();
563 3e180b04 Adam Menz
                        HttpResponse response = bundle.getResponse();
564 3e180b04 Adam Menz
                        if (response != null) {
565 3e180b04 Adam Menz
                                int statusCode = response.getStatusLine().getStatusCode();
566 3e180b04 Adam Menz
                                if (statusCode == 200) {
567 3e180b04 Adam Menz
                                        setResult(Activity.RESULT_OK);
568 3e180b04 Adam Menz
                                        HttpEntity entity = response.getEntity();
569 3e180b04 Adam Menz
                                        app.setDownloadedEntity(entity);
570 3e180b04 Adam Menz
                                        /*
571 3e180b04 Adam Menz
                                        try {
572 3e180b04 Adam Menz
                                                if(writeFile(EntityUtils.toByteArray(entity))){
573 3e180b04 Adam Menz
                                                        downloadButton.setText("Open File");
574 3e180b04 Adam Menz
                                                        isDownloaded = true;
575 3e180b04 Adam Menz
                                                }
576 3e180b04 Adam Menz
                                                else{
577 3e180b04 Adam Menz
                                                        showAlert("Error", "There was a problem downloading your file.");
578 3e180b04 Adam Menz
                                                }
579 3e180b04 Adam Menz

580 3e180b04 Adam Menz
                                        } catch (IOException e) {
581 3e180b04 Adam Menz
                                                showAlert("Error", "There was a problem downloading your file.");
582 3e180b04 Adam Menz
                                                e.printStackTrace();
583 3e180b04 Adam Menz
                                        }
584 3e180b04 Adam Menz
                                        */
585 3e180b04 Adam Menz
586 3e180b04 Adam Menz
                                } else {
587 3e180b04 Adam Menz
                                        CloudServersException cse = parseCloudServersException(response);
588 3e180b04 Adam Menz
                                        if ("".equals(cse.getMessage())) {
589 3e180b04 Adam Menz
                                                startFileError("There was a problem downloading your File.", bundle);
590 3e180b04 Adam Menz
                                        } else {
591 3e180b04 Adam Menz
                                                startFileError("There was a problem downloading your file: " + cse.getMessage(), bundle);
592 3e180b04 Adam Menz
                                        }
593 3e180b04 Adam Menz
                                }
594 3e180b04 Adam Menz
                        } else if (exception != null) {
595 3e180b04 Adam Menz
                                startFileError("There was a problem downloading your file: " + exception.getMessage(), bundle);                                
596 3e180b04 Adam Menz
                        }                        
597 3e180b04 Adam Menz
                }
598 3e180b04 Adam Menz
        }
599 3d6041e8 Phillip Toohill
        
600 3e180b04 Adam Menz
        private class DeleteObjectListenerTask extends
601 3e180b04 Adam Menz
        AsyncTask<Void, Void, Void> {
602 3e180b04 Adam Menz
                
603 3e180b04 Adam Menz
                @Override
604 3e180b04 Adam Menz
                protected Void doInBackground(Void... arg1) {
605 3e180b04 Adam Menz
606 3e180b04 Adam Menz
                        while(app.isDeletingObject()){
607 3e180b04 Adam Menz
                                // wait for process to finish
608 3e180b04 Adam Menz
                                // or have it be canceled
609 3e180b04 Adam Menz
                                if(deleteObjTask.isCancelled()){
610 3e180b04 Adam Menz
                                        return null;
611 3e180b04 Adam Menz
                                }
612 3e180b04 Adam Menz
                        }
613 3e180b04 Adam Menz
                        return null;
614 3e180b04 Adam Menz
                }
615 3e180b04 Adam Menz
616 3e180b04 Adam Menz
                /*
617 3e180b04 Adam Menz
                 * when no longer processing, time to load
618 3e180b04 Adam Menz
                 * the new files
619 3e180b04 Adam Menz
                 */
620 3e180b04 Adam Menz
                @Override
621 3e180b04 Adam Menz
                protected void onPostExecute(Void arg1) {
622 3e180b04 Adam Menz
                        hideDialog();
623 3e180b04 Adam Menz
                        setResult(99);
624 3e180b04 Adam Menz
                        finish();
625 3e180b04 Adam Menz
                }
626 3e180b04 Adam Menz
        }
627 3e180b04 Adam Menz
        
628 3e180b04 Adam Menz
        private class DownloadObjectListenerTask extends
629 3e180b04 Adam Menz
        AsyncTask<Void, Void, Void> {
630 3e180b04 Adam Menz
                
631 3e180b04 Adam Menz
                @Override
632 3e180b04 Adam Menz
                protected Void doInBackground(Void... arg1) {
633 3e180b04 Adam Menz
634 3e180b04 Adam Menz
                        while(app.isDownloadingObject()){
635 3e180b04 Adam Menz
                                // wait for process to finish
636 3e180b04 Adam Menz
                                // or have it be canceled
637 3e180b04 Adam Menz
                                if(downloadObjTask.isCancelled()){
638 3e180b04 Adam Menz
                                        return null;
639 3e180b04 Adam Menz
                                }
640 3e180b04 Adam Menz
                        }
641 3e180b04 Adam Menz
                        return null;
642 3e180b04 Adam Menz
                }
643 3e180b04 Adam Menz
644 3e180b04 Adam Menz
                /*
645 3e180b04 Adam Menz
                 * when no longer processing, time to load
646 3e180b04 Adam Menz
                 * the new files
647 3e180b04 Adam Menz
                 */
648 3e180b04 Adam Menz
                @Override
649 3e180b04 Adam Menz
                protected void onPostExecute(Void arg1) {
650 3e180b04 Adam Menz
                        hideDialog();
651 3e180b04 Adam Menz
                        try {
652 3e180b04 Adam Menz
                                Log.d("info", "captin starting to write");
653 3e180b04 Adam Menz
                                if(writeFile(EntityUtils.toByteArray(app.getDownloadedEntity()))){
654 3e180b04 Adam Menz
                                        downloadButton.setText("Open File");
655 3e180b04 Adam Menz
                                        isDownloaded = true;
656 3e180b04 Adam Menz
                                        Log.d("info", "captin wrote");
657 3e180b04 Adam Menz
                                }
658 3e180b04 Adam Menz
                                else{
659 3e180b04 Adam Menz
                                        showAlert("Error", "There was a problem downloading your file.");
660 3e180b04 Adam Menz
                                }
661 3e180b04 Adam Menz
662 3e180b04 Adam Menz
                        } catch (IOException e) {
663 3e180b04 Adam Menz
                                showAlert("Error", "There was a problem downloading your file.");
664 3e180b04 Adam Menz
                                e.printStackTrace();
665 969195cf Adam Menz
                        } catch (Exception e) {
666 969195cf Adam Menz
                                showAlert("Error", "There was a problem downloading your file.");
667 969195cf Adam Menz
                                e.printStackTrace();
668 3e180b04 Adam Menz
                        }
669 3e180b04 Adam Menz
                }
670 3e180b04 Adam Menz
        }
671 3e180b04 Adam Menz
672 3e180b04 Adam Menz
}