View Javadoc
1   package edu.jiangxin.apktoolbox.swing.extend.plugin.runnable;
2   
3   import edu.jiangxin.apktoolbox.swing.extend.plugin.ChangeMenuPreparePluginController;
4   import edu.jiangxin.apktoolbox.swing.extend.plugin.IPreparePluginCallback;
5   import org.apache.commons.io.FileUtils;
6   import org.apache.logging.log4j.LogManager;
7   import org.apache.logging.log4j.Logger;
8   
9   import javax.swing.*;
10  import java.io.*;
11  import java.net.HttpURLConnection;
12  import java.net.URL;
13  import java.util.List;
14  import java.util.Map;
15  
16  public class DownloadRunnable extends AbstractRunnable {
17      private static final Logger LOGGER = LogManager.getLogger(DownloadRunnable.class.getSimpleName());
18      private final URL url;
19      private final File downloadDir;
20  
21      public DownloadRunnable(URL url, File downloadDir, IPreparePluginCallback callback) {
22          super("Downloading...", callback);
23          this.url = url;
24          this.downloadDir = downloadDir;
25      }
26  
27      @Override
28      public void run() {
29          SwingUtilities.invokeLater(() -> progressBarDialog.setVisible(true));
30          HttpURLConnection conn;
31          try {
32              conn = (HttpURLConnection) url.openConnection();
33              conn.setRequestMethod("GET");
34              conn.setUseCaches(false);
35              conn.setConnectTimeout(5000);
36              conn.connect();
37          } catch (IOException e) {
38              LOGGER.error("download failed: {}", e.getMessage());
39              callback.onDownloadFinished(ChangeMenuPreparePluginController.RESULT_DOWNLOAD_FAILED);
40              return;
41          }
42  
43          Map<String, List<String>> map = conn.getHeaderFields();
44          List<String> contentLengthList = map.get("Content-Length");
45          int downloadLength = 1;
46          if (contentLengthList != null && !contentLengthList.isEmpty()) {
47              downloadLength = Integer.parseInt(contentLengthList.get(0));
48          }
49  
50          String urlStr = url.toString();
51          String fileName = urlStr.substring(urlStr.lastIndexOf("/") + 1);
52          File downloadFile = new File(downloadDir, fileName);
53  
54          try (BufferedInputStream is = new BufferedInputStream(conn.getInputStream());
55               BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(downloadFile))) {
56              byte[] b = new byte[2048];
57              int length;
58              long count = 0;
59              while ((length = is.read(b)) != -1 && !isCancelled) {
60                  os.write(b, 0, length);
61                  count += length;
62                  progress = (int)(count * 100 / downloadLength);
63              }
64          } catch (IOException e) {
65              LOGGER.error("download failed: {}", e.getMessage());
66              callback.onDownloadFinished(ChangeMenuPreparePluginController.RESULT_DOWNLOAD_FAILED);
67              return;
68          }
69          if (isCancelled) {
70              LOGGER.info("download cancelled");
71              FileUtils.deleteQuietly(downloadFile);
72              callback.onDownloadFinished(ChangeMenuPreparePluginController.RESULT_DOWNLOAD_CANCELLED);
73          } else {
74              isFinished = true;
75              callback.onDownloadFinished(ChangeMenuPreparePluginController.RESULT_DOWNLOAD_SUCCESS);
76          }
77      }
78  }