]> gitweb.fperrin.net Git - Dictionary.git/blob - src/com/hughes/android/dictionary/DownloadActivity.java
go
[Dictionary.git] / src / com / hughes / android / dictionary / DownloadActivity.java
1 package com.hughes.android.dictionary;\r
2 \r
3 import java.io.File;\r
4 import java.io.FileOutputStream;\r
5 import java.io.IOException;\r
6 import java.io.InputStream;\r
7 import java.net.URL;\r
8 import java.util.concurrent.Executor;\r
9 import java.util.concurrent.Executors;\r
10 import java.util.concurrent.atomic.AtomicBoolean;\r
11 \r
12 import android.app.Activity;\r
13 import android.content.Intent;\r
14 import android.os.Bundle;\r
15 import android.os.Handler;\r
16 import android.util.Log;\r
17 import android.widget.ProgressBar;\r
18 import android.widget.TextView;\r
19 \r
20 public class DownloadActivity extends Activity {\r
21 \r
22   public static final String SOURCE = "source";\r
23   public static final String DEST = "dest";\r
24 \r
25   String source;\r
26   String dest;\r
27 \r
28   private final Executor downloadExecutor = Executors.newSingleThreadExecutor();\r
29   private final Handler uiHandler = new Handler();\r
30 \r
31   final AtomicBoolean stop = new AtomicBoolean(false);\r
32 \r
33   /** Called when the activity is first created. */\r
34   @Override\r
35   public void onCreate(final Bundle savedInstanceState) {\r
36     super.onCreate(savedInstanceState);\r
37     final Intent intent = getIntent();\r
38     source = intent.getStringExtra(SOURCE);\r
39     dest = intent.getStringExtra(DEST);\r
40     if (source == null || dest == null) {\r
41       throw new RuntimeException("null source or dest.");\r
42     }\r
43     setContentView(R.layout.download);\r
44 \r
45     final TextView sourceTextView = (TextView) findViewById(R.id.source);\r
46     sourceTextView.setText(source);\r
47 \r
48     final TextView destTextView = (TextView) findViewById(R.id.dest);\r
49     destTextView.setText(dest);\r
50 \r
51     final ProgressBar progressBar = (ProgressBar) findViewById(R.id.downloadProgressBar);\r
52     progressBar.setIndeterminate(false);\r
53     progressBar.setMax(100);\r
54 \r
55     final InputStream in;\r
56     final FileOutputStream out;\r
57 \r
58     final File destFile = new File(dest);\r
59     final File destTmpFile;\r
60     try {\r
61       destTmpFile = File.createTempFile("dictionaryDownload", "tmp", destFile\r
62           .getParentFile());\r
63       final URL uri = new URL(source);\r
64       in = uri.openStream();\r
65       out = new FileOutputStream(destTmpFile);\r
66     } catch (Exception e) {\r
67       Log.e("THAD", "Error downloading file", e);\r
68       setDownloadStatus(String.format(getString(R.string.errorDownloadingFile), e.getLocalizedMessage()));\r
69       return;\r
70     }\r
71 \r
72     final Runnable runnable = new Runnable() {\r
73       public void run() {\r
74         try {\r
75           long byteCount = 0;\r
76           int bytesRead;\r
77           final byte[] bytes = new byte[1024 * 8];\r
78           int count = 0;\r
79           while ((bytesRead = in.read(bytes)) != -1 && !stop.get()) {\r
80             out.write(bytes, 0, bytesRead);\r
81             byteCount += bytesRead;\r
82             if (count++ % 20 == 0) {\r
83               setDownloadStatus(String.format(getString(R.string.downloading),\r
84                   byteCount));\r
85             }\r
86           }\r
87           in.close();\r
88           out.close();\r
89           if (bytesRead == -1 && !stop.get()) {\r
90             destFile.delete();\r
91             destTmpFile.renameTo(destFile);\r
92           } else {\r
93             Log.d("THAD", "Stopped downloading file.");\r
94           }\r
95           setDownloadStatus(String.format(getString(R.string.downloadFinished),\r
96               byteCount));\r
97         } catch (IOException e) {\r
98           Log.e("THAD", "Error downloading file", e);\r
99           setDownloadStatus(String.format(getString(R.string.errorDownloadingFile), e.getLocalizedMessage()));\r
100         }\r
101       }\r
102     };\r
103 \r
104     downloadExecutor.execute(runnable);\r
105   }\r
106 \r
107   @Override\r
108   protected void onStop() {\r
109     stop.set(true);\r
110     super.onStop();\r
111   }\r
112 \r
113   private void setDownloadStatus(final String status) {\r
114     final TextView downloadStatus = (TextView) findViewById(R.id.downloadStatus);\r
115 //    final ProgressBar progressBar = (ProgressBar) findViewById(R.id.downloadProgressBar);\r
116     uiHandler.post(new Runnable() {\r
117       public void run() {\r
118         downloadStatus.setText(status);\r
119       }\r
120     });\r
121   }\r
122 \r
123 }\r