root / src / com / rackspacecloud / android / ContainerObjectDetails.java @ b722cab3
History | View | Annotate | Download (18.7 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 | b6fa6007 | unknown | public class ContainerObjectDetails extends Activity { |
57 | 3e180b04 | Adam Menz | |
58 | 3d6041e8 | Phillip Toohill | private static final int deleteObject = 0; |
59 | 51938302 | Adam Menz | private final String DOWNLOAD_DIRECTORY = "/RackspaceCloud"; |
60 | 3d6041e8 | Phillip Toohill | private ContainerObjects objects;
|
61 | 3d6041e8 | Phillip Toohill | private String containerNames; |
62 | 3d6041e8 | Phillip Toohill | private String cdnURL; |
63 | 8b432514 | Phillip Toohill | private String cdnEnabled; |
64 | 3d6041e8 | Phillip Toohill | public String LOG = "ViewObject"; |
65 | 6864568a | Phillip Toohill | private int bConver = 1048576; |
66 | 6864568a | Phillip Toohill | private int kbConver = 1024; |
67 | 6864568a | Phillip Toohill | private double megaBytes; |
68 | 6864568a | Phillip Toohill | private double kiloBytes; |
69 | 82cd98ea | unknown | public Button previewButton; |
70 | 51938302 | Adam Menz | public Button downloadButton; |
71 | b347d5e3 | Chmouel Boudjnah | public Context context; |
72 | 3e180b04 | Adam Menz | private boolean displayDialog; |
73 | 51938302 | Adam Menz | private ProgressDialog dialog;
|
74 | 51938302 | Adam Menz | private Boolean isDownloaded; |
75 | 3e180b04 | Adam Menz | private AndroidCloudApplication app;
|
76 | 3e180b04 | Adam Menz | private DeleteObjectListenerTask deleteObjTask;
|
77 | 3e180b04 | Adam Menz | private DownloadObjectListenerTask downloadObjTask;
|
78 | 3d6041e8 | Phillip Toohill | |
79 | 3e180b04 | Adam Menz | /** Called when the activity is first created. */
|
80 | 3e180b04 | Adam Menz | @Override
|
81 | 3e180b04 | Adam Menz | public void onCreate(Bundle savedInstanceState) { |
82 | 3e180b04 | Adam Menz | super.onCreate(savedInstanceState);
|
83 | 3e180b04 | Adam Menz | |
84 | 3e180b04 | Adam Menz | context = getApplicationContext(); |
85 | 3e180b04 | Adam Menz | |
86 | 3e180b04 | Adam Menz | objects = (ContainerObjects) this.getIntent().getExtras().get("container"); |
87 | 3e180b04 | Adam Menz | containerNames = (String) this.getIntent().getExtras().get("containerNames"); |
88 | 3e180b04 | Adam Menz | cdnURL = (String) this.getIntent().getExtras().get("cdnUrl"); |
89 | 3e180b04 | Adam Menz | cdnEnabled = (String) this.getIntent().getExtras().get("isCdnEnabled"); |
90 | 3e180b04 | Adam Menz | |
91 | 3e180b04 | Adam Menz | |
92 | 3e180b04 | Adam Menz | setContentView(R.layout.viewobject); |
93 | 3e180b04 | Adam Menz | restoreState(savedInstanceState); |
94 | 3e180b04 | Adam Menz | |
95 | 3e180b04 | Adam Menz | } |
96 | 3e180b04 | Adam Menz | |
97 | 3d6041e8 | Phillip Toohill | @Override
|
98 | 3d6041e8 | Phillip Toohill | protected void onSaveInstanceState(Bundle outState) { |
99 | 3d6041e8 | Phillip Toohill | super.onSaveInstanceState(outState);
|
100 | 3d6041e8 | Phillip Toohill | outState.putSerializable("container", objects);
|
101 | 51938302 | Adam Menz | outState.putBoolean("isDownloaded", isDownloaded);
|
102 | 3e180b04 | Adam Menz | outState.putBoolean("displayDialog", displayDialog);
|
103 | 3e180b04 | Adam Menz | |
104 | 3e180b04 | Adam Menz | if(displayDialog){
|
105 | 3e180b04 | Adam Menz | hideDialog(); |
106 | 3e180b04 | Adam Menz | displayDialog = true;
|
107 | 3e180b04 | Adam Menz | } |
108 | 3d6041e8 | Phillip Toohill | } |
109 | 3d6041e8 | Phillip Toohill | |
110 | 3e180b04 | Adam Menz | private void restoreState(Bundle state) { |
111 | 3e180b04 | Adam Menz | |
112 | 3e180b04 | Adam Menz | /*
|
113 | 3e180b04 | Adam Menz | * need reference to the app so you can access curDirFiles
|
114 | 3e180b04 | Adam Menz | * as well as processing status
|
115 | 3e180b04 | Adam Menz | */
|
116 | 3e180b04 | Adam Menz | app = (AndroidCloudApplication)this.getApplication();
|
117 | 51938302 | Adam Menz | |
118 | 3e180b04 | Adam Menz | if (state != null && state.containsKey("displayDialog") && state.getBoolean("displayDialog")) { |
119 | 3e180b04 | Adam Menz | showDialog(); |
120 | 51938302 | Adam Menz | } else {
|
121 | 3e180b04 | Adam Menz | hideDialog(); |
122 | 51938302 | Adam Menz | } |
123 | 3e180b04 | Adam Menz | |
124 | 3e180b04 | Adam Menz | if (state != null && state.containsKey("container")) { |
125 | 3e180b04 | Adam Menz | objects = (ContainerObjects) state.getSerializable("container");
|
126 | 3e180b04 | Adam Menz | } |
127 | 3e180b04 | Adam Menz | loadObjectData(); |
128 | 51938302 | Adam Menz | |
129 | 3e180b04 | Adam Menz | if ( cdnEnabled.equals("true")) { |
130 | 3e180b04 | Adam Menz | this.previewButton = (Button) findViewById(R.id.preview_button); |
131 | 3e180b04 | Adam Menz | previewButton.setOnClickListener(new MyOnClickListener());
|
132 | 3e180b04 | Adam Menz | } else {
|
133 | 3e180b04 | Adam Menz | this.previewButton = (Button) findViewById(R.id.preview_button); |
134 | 3e180b04 | Adam Menz | previewButton.setVisibility(View.GONE);
|
135 | 3e180b04 | Adam Menz | } |
136 | 3e180b04 | Adam Menz | |
137 | 3e180b04 | Adam Menz | if (state != null && state.containsKey("isDownloaded")){ |
138 | 3e180b04 | Adam Menz | isDownloaded = state.getBoolean("isDownloaded");
|
139 | 3e180b04 | Adam Menz | } |
140 | 3e180b04 | Adam Menz | else{
|
141 | 3e180b04 | Adam Menz | isDownloaded = fileIsDownloaded(); |
142 | 3e180b04 | Adam Menz | } |
143 | 3e180b04 | Adam Menz | this.downloadButton = (Button) findViewById(R.id.download_button); |
144 | 3e180b04 | Adam Menz | if ( isDownloaded ) {
|
145 | 3e180b04 | Adam Menz | downloadButton.setText("Open File");
|
146 | 3e180b04 | Adam Menz | } else {
|
147 | 3e180b04 | Adam Menz | downloadButton.setText("Download File");
|
148 | 3e180b04 | Adam Menz | } |
149 | 3e180b04 | Adam Menz | downloadButton.setOnClickListener(new MyOnClickListener());
|
150 | 3e180b04 | Adam Menz | |
151 | 3e180b04 | Adam Menz | if(app.isDeletingObject()){
|
152 | 3e180b04 | Adam Menz | deleteObjTask = new DeleteObjectListenerTask();
|
153 | 3e180b04 | Adam Menz | deleteObjTask.execute(); |
154 | 3e180b04 | Adam Menz | } |
155 | 3e180b04 | Adam Menz | |
156 | 3e180b04 | Adam Menz | if(app.isDownloadingObject()){
|
157 | 3e180b04 | Adam Menz | downloadObjTask = new DownloadObjectListenerTask();
|
158 | 3e180b04 | Adam Menz | downloadObjTask.execute(); |
159 | 3e180b04 | Adam Menz | } |
160 | 3e180b04 | Adam Menz | } |
161 | 3e180b04 | Adam Menz | |
162 | 3e180b04 | Adam Menz | |
163 | 3e180b04 | Adam Menz | @Override
|
164 | 3e180b04 | Adam Menz | protected void onStart(){ |
165 | 3e180b04 | Adam Menz | super.onStart();
|
166 | 3e180b04 | Adam Menz | if(displayDialog){
|
167 | 3e180b04 | Adam Menz | showDialog(); |
168 | 3e180b04 | Adam Menz | } |
169 | 3e180b04 | Adam Menz | } |
170 | 3e180b04 | Adam Menz | |
171 | 3e180b04 | Adam Menz | |
172 | 3e180b04 | Adam Menz | @Override
|
173 | 3e180b04 | Adam Menz | protected void onStop(){ |
174 | 3e180b04 | Adam Menz | super.onStop();
|
175 | 51938302 | Adam Menz | |
176 | 3e180b04 | Adam Menz | if(displayDialog){
|
177 | 3e180b04 | Adam Menz | hideDialog(); |
178 | 3e180b04 | Adam Menz | displayDialog = true;
|
179 | 3e180b04 | Adam Menz | } |
180 | 82cd98ea | unknown | |
181 | 3e180b04 | Adam Menz | /*
|
182 | 3e180b04 | Adam Menz | * Need to stop running listener task
|
183 | 3e180b04 | Adam Menz | * if we exit
|
184 | 3e180b04 | Adam Menz | */
|
185 | 3e180b04 | Adam Menz | if(deleteObjTask != null){ |
186 | 3e180b04 | Adam Menz | deleteObjTask.cancel(true);
|
187 | 3e180b04 | Adam Menz | } |
188 | 3e180b04 | Adam Menz | |
189 | 3e180b04 | Adam Menz | if(downloadObjTask != null){ |
190 | 3e180b04 | Adam Menz | downloadObjTask.cancel(true);
|
191 | 3e180b04 | Adam Menz | } |
192 | 3e180b04 | Adam Menz | } |
193 | 3e180b04 | Adam Menz | |
194 | 3e180b04 | Adam Menz | |
195 | 3e180b04 | Adam Menz | private void loadObjectData() { |
196 | 3e180b04 | Adam Menz | //Object Name
|
197 | 3e180b04 | Adam Menz | TextView name = (TextView) findViewById(R.id.view_container_name); |
198 | 3e180b04 | Adam Menz | name.setText(objects.getCName().toString()); |
199 | 3e180b04 | Adam Menz | |
200 | 3e180b04 | Adam Menz | //File size
|
201 | 3e180b04 | Adam Menz | if (objects.getBytes() >= bConver) {
|
202 | 6864568a | Phillip Toohill | megaBytes = Math.abs(objects.getBytes()/bConver + 0.2); |
203 | 3e180b04 | Adam Menz | TextView sublabel = (TextView) findViewById(R.id.view_file_bytes); |
204 | 3e180b04 | Adam Menz | sublabel.setText(megaBytes + " MB");
|
205 | 6864568a | Phillip Toohill | } else if (objects.getBytes() >= kbConver){ |
206 | 6864568a | Phillip Toohill | kiloBytes = Math.abs(objects.getBytes()/kbConver + 0.2); |
207 | 3e180b04 | Adam Menz | TextView sublabel = (TextView) findViewById(R.id.view_file_bytes); |
208 | 3e180b04 | Adam Menz | sublabel.setText(kiloBytes + " KB");
|
209 | 6864568a | Phillip Toohill | } else {
|
210 | 3e180b04 | Adam Menz | TextView sublabel = (TextView) findViewById(R.id.view_file_bytes); |
211 | 3e180b04 | Adam Menz | sublabel.setText(objects.getBytes() + " B");
|
212 | 78af992b | unknown | } |
213 | 3e180b04 | Adam Menz | |
214 | 3e180b04 | Adam Menz | //Content Type
|
215 | 3e180b04 | Adam Menz | TextView cType = (TextView) findViewById(R.id.view_content_type); |
216 | 3e180b04 | Adam Menz | cType.setText(objects.getContentType().toString()); |
217 | 3e180b04 | Adam Menz | |
218 | 3e180b04 | Adam Menz | //Last Modification date
|
219 | 3e180b04 | Adam Menz | String strDate = objects.getLastMod();
|
220 | 877f6f58 | Adam Menz | strDate = strDate.substring(0, strDate.indexOf('T')); |
221 | 877f6f58 | Adam Menz | /*
|
222 | 3e180b04 | Adam Menz | SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.ssssss");
|
223 | 3e180b04 | Adam Menz | Date dateStr = null;
|
224 | 3e180b04 | Adam Menz | try {
|
225 | 3e180b04 | Adam Menz | dateStr = formatter.parse(strDate);
|
226 | 3e180b04 | Adam Menz | } catch (ParseException e1) {
|
227 | 3e180b04 | Adam Menz | e1.printStackTrace();
|
228 | 3e180b04 | Adam Menz | }
|
229 | 3e180b04 | Adam Menz | String formattedDate = formatter.format(dateStr);
|
230 | 877f6f58 | Adam Menz | |
231 | 3e180b04 | Adam Menz | Date date1 = null;
|
232 | 3e180b04 | Adam Menz | try {
|
233 | 3e180b04 | Adam Menz | date1 = formatter.parse(formattedDate);
|
234 | 3e180b04 | Adam Menz | } catch (ParseException e) {
|
235 | 3e180b04 | Adam Menz | e.printStackTrace();
|
236 | 3e180b04 | Adam Menz | }
|
237 | 3e180b04 | Adam Menz | formatter = new SimpleDateFormat("MMM-dd-yyyy");
|
238 | 3e180b04 | Adam Menz | formattedDate = formatter.format(date1);
|
239 | 877f6f58 | Adam Menz | */
|
240 | 3e180b04 | Adam Menz | TextView lastmod = (TextView) findViewById(R.id.view_file_modification); |
241 | 877f6f58 | Adam Menz | lastmod.setText(strDate); |
242 | 3e180b04 | Adam Menz | |
243 | 3e180b04 | Adam Menz | } |
244 | 3e180b04 | Adam Menz | |
245 | 3e180b04 | Adam Menz | private class MyOnClickListener implements View.OnClickListener { |
246 | 3e180b04 | Adam Menz | @Override
|
247 | 3e180b04 | Adam Menz | public void onClick(View v) { |
248 | 3e180b04 | Adam Menz | if(v.equals(findViewById(R.id.preview_button))){
|
249 | 3e180b04 | Adam Menz | Intent viewIntent = new Intent("android.intent.action.VIEW", Uri.parse(cdnURL + "/" + objects.getCName())); |
250 | 3e180b04 | Adam Menz | startActivity(viewIntent); |
251 | 78af992b | unknown | } |
252 | 3e180b04 | Adam Menz | /*
|
253 | 3e180b04 | Adam Menz | * need to perform different functions based on if
|
254 | 3e180b04 | Adam Menz | * the file is in the devices filesystem
|
255 | 3e180b04 | Adam Menz | */
|
256 | 3e180b04 | Adam Menz | if(v.equals(findViewById(R.id.download_button))){
|
257 | 3e180b04 | Adam Menz | if(!isDownloaded){
|
258 | 3e180b04 | Adam Menz | if(storageIsReady()){
|
259 | 3e180b04 | Adam Menz | new ContainerObjectDownloadTask().execute();
|
260 | 3e180b04 | Adam Menz | } |
261 | 3e180b04 | Adam Menz | else{
|
262 | 3e180b04 | Adam Menz | showAlert("Error", "Storage not found."); |
263 | 3e180b04 | Adam Menz | } |
264 | 3e180b04 | Adam Menz | } |
265 | 3e180b04 | Adam Menz | else{
|
266 | 3e180b04 | Adam Menz | openFile(); |
267 | 3e180b04 | Adam Menz | } |
268 | 3e180b04 | Adam Menz | } |
269 | 3e180b04 | Adam Menz | } |
270 | 3e180b04 | Adam Menz | } |
271 | 3e180b04 | Adam Menz | |
272 | 3e180b04 | Adam Menz | private void showAlert(String title, String message) { |
273 | 3d6041e8 | Phillip Toohill | AlertDialog alert = new AlertDialog.Builder(this).create(); |
274 | 3d6041e8 | Phillip Toohill | alert.setTitle(title); |
275 | 3d6041e8 | Phillip Toohill | alert.setMessage(message); |
276 | 3d6041e8 | Phillip Toohill | alert.setButton("OK", new DialogInterface.OnClickListener() { |
277 | 3e180b04 | Adam Menz | public void onClick(DialogInterface dialog, int which) { |
278 | 3e180b04 | Adam Menz | return;
|
279 | 3e180b04 | Adam Menz | } }); |
280 | 3d6041e8 | Phillip Toohill | alert.show(); |
281 | 3e180b04 | Adam Menz | } |
282 | 3e180b04 | Adam Menz | //Create the Menu options
|
283 | 3e180b04 | Adam Menz | @Override
|
284 | 3e180b04 | Adam Menz | public boolean onCreateOptionsMenu(Menu menu) { |
285 | 3d6041e8 | Phillip Toohill | super.onCreateOptionsMenu(menu);
|
286 | 3d6041e8 | Phillip Toohill | MenuInflater inflater = getMenuInflater(); |
287 | 3d6041e8 | Phillip Toohill | inflater.inflate(R.menu.container_object_list_menu, menu); |
288 | 3d6041e8 | Phillip Toohill | return true; |
289 | 3d6041e8 | Phillip Toohill | } |
290 | 3e180b04 | Adam Menz | |
291 | 3e180b04 | Adam Menz | @Override
|
292 | 3e180b04 | Adam Menz | public boolean onOptionsItemSelected(MenuItem item) { |
293 | 3d6041e8 | Phillip Toohill | switch (item.getItemId()) {
|
294 | 3d6041e8 | Phillip Toohill | case R.id.delete_object:
|
295 | 3d6041e8 | Phillip Toohill | showDialog(deleteObject); |
296 | 3d6041e8 | Phillip Toohill | return true; |
297 | 3d6041e8 | Phillip Toohill | case R.id.refresh:
|
298 | 3d6041e8 | Phillip Toohill | loadObjectData(); |
299 | 3e180b04 | Adam Menz | return true; |
300 | 3d6041e8 | Phillip Toohill | } |
301 | 3d6041e8 | Phillip Toohill | return false; |
302 | 3d6041e8 | Phillip Toohill | } |
303 | 3e180b04 | Adam Menz | |
304 | 3e180b04 | Adam Menz | @Override
|
305 | 3e180b04 | Adam Menz | protected Dialog onCreateDialog(int id ) { |
306 | 3e180b04 | Adam Menz | switch (id) {
|
307 | 3e180b04 | Adam Menz | case deleteObject:
|
308 | 3e180b04 | Adam Menz | return new AlertDialog.Builder(ContainerObjectDetails.this) |
309 | 3e180b04 | Adam Menz | .setIcon(R.drawable.alert_dialog_icon) |
310 | 3e180b04 | Adam Menz | .setTitle("Delete File")
|
311 | 3e180b04 | Adam Menz | .setMessage("Are you sure you want to delete this file?")
|
312 | 3e180b04 | Adam Menz | .setPositiveButton("Delete File", new DialogInterface.OnClickListener() { |
313 | 3e180b04 | Adam Menz | public void onClick(DialogInterface dialog, int whichButton) { |
314 | 3e180b04 | Adam Menz | // User clicked OK so do some stuff
|
315 | 3e180b04 | Adam Menz | new ContainerObjectDeleteTask().execute((Void[]) null); |
316 | 3e180b04 | Adam Menz | } |
317 | 3e180b04 | Adam Menz | }) |
318 | 3e180b04 | Adam Menz | .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { |
319 | 3e180b04 | Adam Menz | public void onClick(DialogInterface dialog, int whichButton) { |
320 | 3e180b04 | Adam Menz | // User clicked Cancel so do some stuff
|
321 | 3e180b04 | Adam Menz | } |
322 | 3e180b04 | Adam Menz | }) |
323 | 3e180b04 | Adam Menz | .create(); |
324 | 3e180b04 | Adam Menz | } |
325 | 3e180b04 | Adam Menz | return null; |
326 | 3e180b04 | Adam Menz | } |
327 | 3e180b04 | Adam Menz | /**
|
328 | 3d6041e8 | Phillip Toohill | * @return the file
|
329 | 3d6041e8 | Phillip Toohill | */
|
330 | 3d6041e8 | Phillip Toohill | public ContainerObjects getViewFile() {
|
331 | 3d6041e8 | Phillip Toohill | return objects;
|
332 | 3d6041e8 | Phillip Toohill | } |
333 | 3d6041e8 | Phillip Toohill | |
334 | 3d6041e8 | Phillip Toohill | /**
|
335 | 3d6041e8 | Phillip Toohill | * @param File the file to set
|
336 | 3d6041e8 | Phillip Toohill | */
|
337 | 3d6041e8 | Phillip Toohill | public void setViewFile(ContainerObjects object) { |
338 | 3d6041e8 | Phillip Toohill | this.objects = object;
|
339 | 3d6041e8 | Phillip Toohill | } |
340 | 3e180b04 | Adam Menz | |
341 | 51938302 | Adam Menz | /*
|
342 | 51938302 | Adam Menz | * returns false if external storage is not avaliable
|
343 | 51938302 | Adam Menz | * (if its mounted, missing, read-only, etc)
|
344 | 51938302 | Adam Menz | * from: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal
|
345 | 51938302 | Adam Menz | */
|
346 | 51938302 | Adam Menz | private boolean storageIsReady(){ |
347 | 51938302 | Adam Menz | boolean mExternalStorageAvailable = false; |
348 | 51938302 | Adam Menz | boolean mExternalStorageWriteable = false; |
349 | 51938302 | Adam Menz | String state = Environment.getExternalStorageState();
|
350 | 51938302 | Adam Menz | |
351 | 51938302 | Adam Menz | if (Environment.MEDIA_MOUNTED.equals(state)) {
|
352 | 3e180b04 | Adam Menz | // We can read and write the media
|
353 | 3e180b04 | Adam Menz | mExternalStorageAvailable = mExternalStorageWriteable = true;
|
354 | 51938302 | Adam Menz | } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { |
355 | 3e180b04 | Adam Menz | // We can only read the media
|
356 | 3e180b04 | Adam Menz | mExternalStorageAvailable = true;
|
357 | 3e180b04 | Adam Menz | mExternalStorageWriteable = false;
|
358 | 51938302 | Adam Menz | } else {
|
359 | 3e180b04 | Adam Menz | // Something else is wrong. It may be one of many other states, but all we need
|
360 | 3e180b04 | Adam Menz | // to know is we can neither read nor write
|
361 | 3e180b04 | Adam Menz | mExternalStorageAvailable = mExternalStorageWriteable = false;
|
362 | 51938302 | Adam Menz | } |
363 | 51938302 | Adam Menz | return mExternalStorageAvailable && mExternalStorageWriteable;
|
364 | 51938302 | Adam Menz | } |
365 | 3e180b04 | Adam Menz | |
366 | 51938302 | Adam Menz | private boolean fileIsDownloaded(){ |
367 | 51938302 | Adam Menz | if(storageIsReady()){
|
368 | 51938302 | Adam Menz | String fileName = Environment.getExternalStorageDirectory().getPath() + "/RackspaceCloud/" + objects.getCName(); |
369 | 51938302 | Adam Menz | File f = new File(fileName); |
370 | 51938302 | Adam Menz | return f.isFile();
|
371 | 51938302 | Adam Menz | } |
372 | 51938302 | Adam Menz | return false; |
373 | 51938302 | Adam Menz | } |
374 | 3e180b04 | Adam Menz | |
375 | 51938302 | Adam Menz | private void openFile(){ |
376 | 51938302 | Adam Menz | File object = new File(Environment.getExternalStorageDirectory().getPath() + "/RackspaceCloud/" + objects.getCName()); |
377 | 51938302 | Adam Menz | Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW);
|
378 | 3e180b04 | Adam Menz | File file = new File(object.getAbsolutePath()); |
379 | 3e180b04 | Adam Menz | String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString());
|
380 | 3e180b04 | Adam Menz | String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
|
381 | 3e180b04 | Adam Menz | myIntent.setDataAndType(Uri.fromFile(file),mimetype); |
382 | 3e180b04 | Adam Menz | //myIntent.setData(Uri.fromFile(file));
|
383 | 3e180b04 | Adam Menz | try{
|
384 | 3e180b04 | Adam Menz | startActivity(myIntent); |
385 | 3e180b04 | Adam Menz | } |
386 | 3e180b04 | Adam Menz | catch(Exception e){ |
387 | 3e180b04 | Adam Menz | Toast.makeText(this, "Could not open file.", Toast.LENGTH_SHORT).show(); |
388 | 3e180b04 | Adam Menz | } |
389 | 51938302 | Adam Menz | } |
390 | 3e180b04 | Adam Menz | |
391 | 51938302 | Adam Menz | private boolean writeFile(byte[] data){ |
392 | 51938302 | Adam Menz | String directoryName = Environment.getExternalStorageDirectory().getPath() + DOWNLOAD_DIRECTORY;
|
393 | 51938302 | Adam Menz | File f = new File(directoryName); |
394 | 3e180b04 | Adam Menz | |
395 | 51938302 | Adam Menz | if(!f.isDirectory()){
|
396 | 51938302 | Adam Menz | if(!f.mkdir()){
|
397 | 51938302 | Adam Menz | return false; |
398 | 51938302 | Adam Menz | } |
399 | 51938302 | Adam Menz | } |
400 | 3e180b04 | Adam Menz | |
401 | 51938302 | Adam Menz | String filename = directoryName + "/" + objects.getCName(); |
402 | 51938302 | Adam Menz | File object = new File(filename); |
403 | 51938302 | Adam Menz | BufferedOutputStream bos = null; |
404 | 3e180b04 | Adam Menz | |
405 | 51938302 | Adam Menz | try{
|
406 | 51938302 | Adam Menz | FileOutputStream fos = new FileOutputStream(object); |
407 | 51938302 | Adam Menz | bos = new BufferedOutputStream(fos); |
408 | 51938302 | Adam Menz | bos.write(data); |
409 | 51938302 | Adam Menz | } |
410 | 51938302 | Adam Menz | catch(FileNotFoundException e){ |
411 | 51938302 | Adam Menz | e.printStackTrace(); |
412 | 51938302 | Adam Menz | } |
413 | 51938302 | Adam Menz | catch(IOException e){ |
414 | 51938302 | Adam Menz | e.printStackTrace(); |
415 | 51938302 | Adam Menz | } |
416 | 51938302 | Adam Menz | finally{
|
417 | 51938302 | Adam Menz | if(bos != null){ |
418 | 51938302 | Adam Menz | try {
|
419 | 51938302 | Adam Menz | bos.flush(); |
420 | 51938302 | Adam Menz | bos.close(); |
421 | 51938302 | Adam Menz | } catch (IOException e) { |
422 | 51938302 | Adam Menz | // TODO Auto-generated catch block
|
423 | 51938302 | Adam Menz | e.printStackTrace(); |
424 | 51938302 | Adam Menz | } |
425 | 51938302 | Adam Menz | } |
426 | 51938302 | Adam Menz | } |
427 | 51938302 | Adam Menz | return true; |
428 | 51938302 | Adam Menz | } |
429 | 3e180b04 | Adam Menz | |
430 | 3d6041e8 | Phillip Toohill | //Task's
|
431 | 3e180b04 | Adam Menz | |
432 | 3e180b04 | Adam Menz | private CloudServersException parseCloudServersException(HttpResponse response) {
|
433 | 3e180b04 | Adam Menz | CloudServersException cse = new CloudServersException();
|
434 | 3e180b04 | Adam Menz | try {
|
435 | 3e180b04 | Adam Menz | BasicResponseHandler responseHandler = new BasicResponseHandler();
|
436 | 3e180b04 | Adam Menz | String body = responseHandler.handleResponse(response);
|
437 | 3e180b04 | Adam Menz | CloudServersFaultXMLParser parser = new CloudServersFaultXMLParser();
|
438 | 3e180b04 | Adam Menz | SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); |
439 | 3e180b04 | Adam Menz | XMLReader xmlReader = saxParser.getXMLReader(); |
440 | 3e180b04 | Adam Menz | xmlReader.setContentHandler(parser); |
441 | 3e180b04 | Adam Menz | xmlReader.parse(new InputSource(new StringReader(body))); |
442 | 3e180b04 | Adam Menz | cse = parser.getException(); |
443 | 3e180b04 | Adam Menz | } catch (ClientProtocolException e) {
|
444 | 3e180b04 | Adam Menz | cse = new CloudServersException();
|
445 | 3e180b04 | Adam Menz | cse.setMessage(e.getLocalizedMessage()); |
446 | 3e180b04 | Adam Menz | } catch (IOException e) { |
447 | 3e180b04 | Adam Menz | cse = new CloudServersException();
|
448 | 3e180b04 | Adam Menz | cse.setMessage(e.getLocalizedMessage()); |
449 | 3e180b04 | Adam Menz | } catch (ParserConfigurationException e) { |
450 | 3e180b04 | Adam Menz | cse = new CloudServersException();
|
451 | 3e180b04 | Adam Menz | cse.setMessage(e.getLocalizedMessage()); |
452 | 3e180b04 | Adam Menz | } catch (SAXException e) {
|
453 | 3e180b04 | Adam Menz | cse = new CloudServersException();
|
454 | 3e180b04 | Adam Menz | cse.setMessage(e.getLocalizedMessage()); |
455 | 3e180b04 | Adam Menz | } catch (FactoryConfigurationError e) { |
456 | 3e180b04 | Adam Menz | cse = new CloudServersException();
|
457 | 3e180b04 | Adam Menz | cse.setMessage(e.getLocalizedMessage()); |
458 | 3e180b04 | Adam Menz | } |
459 | 3e180b04 | Adam Menz | return cse;
|
460 | 3e180b04 | Adam Menz | } |
461 | 3e180b04 | Adam Menz | |
462 | 3e180b04 | Adam Menz | private void startFileError(String message, HttpBundle bundle){ |
463 | 3e180b04 | Adam Menz | Intent viewIntent = new Intent(getApplicationContext(), ServerErrorActivity.class);
|
464 | 3e180b04 | Adam Menz | viewIntent.putExtra("errorMessage", message);
|
465 | 3e180b04 | Adam Menz | viewIntent.putExtra("response", bundle.getResponseText());
|
466 | 3e180b04 | Adam Menz | viewIntent.putExtra("request", bundle.getCurlRequest());
|
467 | 3e180b04 | Adam Menz | startActivity(viewIntent); |
468 | 3e180b04 | Adam Menz | } |
469 | 3e180b04 | Adam Menz | |
470 | 3e180b04 | Adam Menz | private void showDialog() { |
471 | 3e180b04 | Adam Menz | if(dialog == null || !dialog.isShowing()){ |
472 | 3e180b04 | Adam Menz | displayDialog = true;
|
473 | 3e180b04 | Adam Menz | dialog = ProgressDialog.show(ContainerObjectDetails.this, "", "Loading...", true); |
474 | 3e180b04 | Adam Menz | } |
475 | 3e180b04 | Adam Menz | } |
476 | 3e180b04 | Adam Menz | |
477 | 3e180b04 | Adam Menz | private void hideDialog() { |
478 | 3e180b04 | Adam Menz | if(dialog != null){ |
479 | 3e180b04 | Adam Menz | dialog.dismiss(); |
480 | 3e180b04 | Adam Menz | } |
481 | 3e180b04 | Adam Menz | displayDialog = false;
|
482 | 3e180b04 | Adam Menz | } |
483 | 3e180b04 | Adam Menz | |
484 | 3e180b04 | Adam Menz | private class ContainerObjectDeleteTask extends AsyncTask<Void, Void, HttpBundle> { |
485 | 3e180b04 | Adam Menz | |
486 | 3e180b04 | Adam Menz | private CloudServersException exception;
|
487 | 3e180b04 | Adam Menz | |
488 | 3e180b04 | Adam Menz | protected void onPreExecute(){ |
489 | 3e180b04 | Adam Menz | //dialog = ProgressDialog.show(ContainerObjectDetails.this, "", "Deleting...", true);
|
490 | 3e180b04 | Adam Menz | showDialog(); |
491 | 3e180b04 | Adam Menz | app.setDeleteingObject(true);
|
492 | 3e180b04 | Adam Menz | deleteObjTask = new DeleteObjectListenerTask();
|
493 | 3e180b04 | Adam Menz | deleteObjTask.execute(); |
494 | 3e180b04 | Adam Menz | } |
495 | 3e180b04 | Adam Menz | |
496 | 3e180b04 | Adam Menz | @Override
|
497 | 3e180b04 | Adam Menz | protected HttpBundle doInBackground(Void... arg0) { |
498 | 3e180b04 | Adam Menz | HttpBundle bundle = null;
|
499 | 3e180b04 | Adam Menz | try {
|
500 | 3e180b04 | Adam Menz | bundle = (new ContainerObjectManager(context)).deleteObject(containerNames, objects.getCName() );
|
501 | 3e180b04 | Adam Menz | } catch (CloudServersException e) {
|
502 | 3e180b04 | Adam Menz | exception = e; |
503 | 3e180b04 | Adam Menz | } |
504 | 3e180b04 | Adam Menz | |
505 | 3e180b04 | Adam Menz | return bundle;
|
506 | 3e180b04 | Adam Menz | } |
507 | 3e180b04 | Adam Menz | |
508 | 3e180b04 | Adam Menz | @Override
|
509 | 3e180b04 | Adam Menz | protected void onPostExecute(HttpBundle bundle) { |
510 | 3e180b04 | Adam Menz | //dialog.dismiss();
|
511 | 3e180b04 | Adam Menz | app.setDeleteingObject(false);
|
512 | 3e180b04 | Adam Menz | hideDialog(); |
513 | 3e180b04 | Adam Menz | HttpResponse response = bundle.getResponse(); |
514 | 3e180b04 | Adam Menz | if (response != null) { |
515 | 3e180b04 | Adam Menz | int statusCode = response.getStatusLine().getStatusCode();
|
516 | 3e180b04 | Adam Menz | if (statusCode == 204) { |
517 | 3e180b04 | Adam Menz | //handled by listner
|
518 | 3e180b04 | Adam Menz | } else {
|
519 | 3e180b04 | Adam Menz | CloudServersException cse = parseCloudServersException(response); |
520 | 3e180b04 | Adam Menz | if ("".equals(cse.getMessage())) { |
521 | 3e180b04 | Adam Menz | startFileError("There was a problem deleting your File.", bundle);
|
522 | 3e180b04 | Adam Menz | } else {
|
523 | 3e180b04 | Adam Menz | startFileError("There was a problem deleting your file: " + cse.getMessage(), bundle);
|
524 | 3e180b04 | Adam Menz | } |
525 | 3e180b04 | Adam Menz | } |
526 | 3e180b04 | Adam Menz | } else if (exception != null) { |
527 | 3e180b04 | Adam Menz | startFileError("There was a problem deleting your file: " + exception.getMessage(), bundle);
|
528 | 3e180b04 | Adam Menz | } |
529 | 3e180b04 | Adam Menz | } |
530 | 3e180b04 | Adam Menz | } |
531 | 3e180b04 | Adam Menz | |
532 | 3e180b04 | Adam Menz | private class ContainerObjectDownloadTask extends AsyncTask<Void, Void, HttpBundle> { |
533 | 3e180b04 | Adam Menz | |
534 | 3e180b04 | Adam Menz | private CloudServersException exception;
|
535 | 3e180b04 | Adam Menz | |
536 | 3e180b04 | Adam Menz | @Override
|
537 | 3e180b04 | Adam Menz | protected void onPreExecute(){ |
538 | 3e180b04 | Adam Menz | showDialog(); |
539 | 3e180b04 | Adam Menz | app.setDownloadingObject(true);
|
540 | 3e180b04 | Adam Menz | downloadObjTask = new DownloadObjectListenerTask();
|
541 | 3e180b04 | Adam Menz | downloadObjTask.execute(); |
542 | 3e180b04 | Adam Menz | } |
543 | 3e180b04 | Adam Menz | |
544 | 3e180b04 | Adam Menz | @Override
|
545 | 3e180b04 | Adam Menz | protected HttpBundle doInBackground(Void... arg0) { |
546 | 3e180b04 | Adam Menz | HttpBundle bundle = null;
|
547 | 3e180b04 | Adam Menz | try {
|
548 | 3e180b04 | Adam Menz | bundle = (new ContainerObjectManager(context)).getObject(containerNames, objects.getCName());
|
549 | 3e180b04 | Adam Menz | } catch (CloudServersException e) {
|
550 | 3e180b04 | Adam Menz | exception = e; |
551 | 3e180b04 | Adam Menz | } |
552 | 3e180b04 | Adam Menz | return bundle;
|
553 | 3e180b04 | Adam Menz | } |
554 | 3e180b04 | Adam Menz | |
555 | 3e180b04 | Adam Menz | @Override
|
556 | 3e180b04 | Adam Menz | protected void onPostExecute(HttpBundle bundle) { |
557 | 3e180b04 | Adam Menz | app.setDownloadingObject(false);
|
558 | 3e180b04 | Adam Menz | hideDialog(); |
559 | 3e180b04 | Adam Menz | HttpResponse response = bundle.getResponse(); |
560 | 3e180b04 | Adam Menz | if (response != null) { |
561 | 3e180b04 | Adam Menz | int statusCode = response.getStatusLine().getStatusCode();
|
562 | 3e180b04 | Adam Menz | if (statusCode == 200) { |
563 | 3e180b04 | Adam Menz | setResult(Activity.RESULT_OK); |
564 | 3e180b04 | Adam Menz | HttpEntity entity = response.getEntity(); |
565 | 3e180b04 | Adam Menz | app.setDownloadedEntity(entity); |
566 | 3e180b04 | Adam Menz | /*
|
567 | 3e180b04 | Adam Menz | try {
|
568 | 3e180b04 | Adam Menz | if(writeFile(EntityUtils.toByteArray(entity))){
|
569 | 3e180b04 | Adam Menz | downloadButton.setText("Open File");
|
570 | 3e180b04 | Adam Menz | isDownloaded = true;
|
571 | 3e180b04 | Adam Menz | }
|
572 | 3e180b04 | Adam Menz | else{
|
573 | 3e180b04 | Adam Menz | showAlert("Error", "There was a problem downloading your file.");
|
574 | 3e180b04 | Adam Menz | }
|
575 | 3e180b04 | Adam Menz | |
576 | 3e180b04 | Adam Menz | } catch (IOException e) {
|
577 | 3e180b04 | Adam Menz | showAlert("Error", "There was a problem downloading your file.");
|
578 | 3e180b04 | Adam Menz | e.printStackTrace();
|
579 | 3e180b04 | Adam Menz | }
|
580 | 3e180b04 | Adam Menz | */
|
581 | 3e180b04 | Adam Menz | |
582 | 3e180b04 | Adam Menz | } else {
|
583 | 3e180b04 | Adam Menz | CloudServersException cse = parseCloudServersException(response); |
584 | 3e180b04 | Adam Menz | if ("".equals(cse.getMessage())) { |
585 | 3e180b04 | Adam Menz | startFileError("There was a problem downloading your File.", bundle);
|
586 | 3e180b04 | Adam Menz | } else {
|
587 | 3e180b04 | Adam Menz | startFileError("There was a problem downloading your file: " + cse.getMessage(), bundle);
|
588 | 3e180b04 | Adam Menz | } |
589 | 3e180b04 | Adam Menz | } |
590 | 3e180b04 | Adam Menz | } else if (exception != null) { |
591 | 3e180b04 | Adam Menz | startFileError("There was a problem downloading your file: " + exception.getMessage(), bundle);
|
592 | 3e180b04 | Adam Menz | } |
593 | 3e180b04 | Adam Menz | } |
594 | 3e180b04 | Adam Menz | } |
595 | 3d6041e8 | Phillip Toohill | |
596 | 3e180b04 | Adam Menz | private class DeleteObjectListenerTask extends |
597 | 3e180b04 | Adam Menz | AsyncTask<Void, Void, Void> { |
598 | 3e180b04 | Adam Menz | |
599 | 3e180b04 | Adam Menz | @Override
|
600 | 3e180b04 | Adam Menz | protected Void doInBackground(Void... arg1) { |
601 | 3e180b04 | Adam Menz | |
602 | 3e180b04 | Adam Menz | while(app.isDeletingObject()){
|
603 | 3e180b04 | Adam Menz | // wait for process to finish
|
604 | 3e180b04 | Adam Menz | // or have it be canceled
|
605 | 3e180b04 | Adam Menz | if(deleteObjTask.isCancelled()){
|
606 | 3e180b04 | Adam Menz | return null; |
607 | 3e180b04 | Adam Menz | } |
608 | 3e180b04 | Adam Menz | } |
609 | 3e180b04 | Adam Menz | return null; |
610 | 3e180b04 | Adam Menz | } |
611 | 3e180b04 | Adam Menz | |
612 | 3e180b04 | Adam Menz | /*
|
613 | 3e180b04 | Adam Menz | * when no longer processing, time to load
|
614 | 3e180b04 | Adam Menz | * the new files
|
615 | 3e180b04 | Adam Menz | */
|
616 | 3e180b04 | Adam Menz | @Override
|
617 | 3e180b04 | Adam Menz | protected void onPostExecute(Void arg1) { |
618 | 3e180b04 | Adam Menz | hideDialog(); |
619 | 3e180b04 | Adam Menz | setResult(99);
|
620 | 3e180b04 | Adam Menz | finish(); |
621 | 3e180b04 | Adam Menz | } |
622 | 3e180b04 | Adam Menz | } |
623 | 3e180b04 | Adam Menz | |
624 | 3e180b04 | Adam Menz | private class DownloadObjectListenerTask extends |
625 | 3e180b04 | Adam Menz | AsyncTask<Void, Void, Void> { |
626 | 3e180b04 | Adam Menz | |
627 | 3e180b04 | Adam Menz | @Override
|
628 | 3e180b04 | Adam Menz | protected Void doInBackground(Void... arg1) { |
629 | 3e180b04 | Adam Menz | |
630 | 3e180b04 | Adam Menz | while(app.isDownloadingObject()){
|
631 | 3e180b04 | Adam Menz | // wait for process to finish
|
632 | 3e180b04 | Adam Menz | // or have it be canceled
|
633 | 3e180b04 | Adam Menz | if(downloadObjTask.isCancelled()){
|
634 | 3e180b04 | Adam Menz | return null; |
635 | 3e180b04 | Adam Menz | } |
636 | 3e180b04 | Adam Menz | } |
637 | 3e180b04 | Adam Menz | return null; |
638 | 3e180b04 | Adam Menz | } |
639 | 3e180b04 | Adam Menz | |
640 | 3e180b04 | Adam Menz | /*
|
641 | 3e180b04 | Adam Menz | * when no longer processing, time to load
|
642 | 3e180b04 | Adam Menz | * the new files
|
643 | 3e180b04 | Adam Menz | */
|
644 | 3e180b04 | Adam Menz | @Override
|
645 | 3e180b04 | Adam Menz | protected void onPostExecute(Void arg1) { |
646 | 3e180b04 | Adam Menz | hideDialog(); |
647 | 3e180b04 | Adam Menz | try {
|
648 | 3e180b04 | Adam Menz | Log.d("info", "captin starting to write"); |
649 | 3e180b04 | Adam Menz | if(writeFile(EntityUtils.toByteArray(app.getDownloadedEntity()))){
|
650 | 3e180b04 | Adam Menz | downloadButton.setText("Open File");
|
651 | 3e180b04 | Adam Menz | isDownloaded = true;
|
652 | 3e180b04 | Adam Menz | Log.d("info", "captin wrote"); |
653 | 3e180b04 | Adam Menz | } |
654 | 3e180b04 | Adam Menz | else{
|
655 | 3e180b04 | Adam Menz | showAlert("Error", "There was a problem downloading your file."); |
656 | 3e180b04 | Adam Menz | } |
657 | 3e180b04 | Adam Menz | |
658 | 3e180b04 | Adam Menz | } catch (IOException e) { |
659 | 3e180b04 | Adam Menz | showAlert("Error", "There was a problem downloading your file."); |
660 | 3e180b04 | Adam Menz | e.printStackTrace(); |
661 | 969195cf | Adam Menz | } catch (Exception e) { |
662 | 969195cf | Adam Menz | showAlert("Error", "There was a problem downloading your file."); |
663 | 969195cf | Adam Menz | e.printStackTrace(); |
664 | 3e180b04 | Adam Menz | } |
665 | 3e180b04 | Adam Menz | } |
666 | 3e180b04 | Adam Menz | } |
667 | 3e180b04 | Adam Menz | |
668 | 3e180b04 | Adam Menz | } |