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 net.lingala.zip4j.ZipFile;
6 import net.lingala.zip4j.progress.ProgressMonitor;
7 import org.apache.commons.io.FileUtils;
8 import org.apache.logging.log4j.LogManager;
9 import org.apache.logging.log4j.Logger;
10
11 import javax.swing.*;
12 import java.io.File;
13 import java.io.IOException;
14
15 public class UnzipRunnable extends AbstractRunnable {
16 private static final Logger LOGGER = LogManager.getLogger(UnzipRunnable.class.getSimpleName());
17 private final File pluginFile;
18 private final boolean isPluginNeedUnzipToSeparateDir;
19
20 public UnzipRunnable(File pluginFile, boolean isPluginNeedUnzipToSeparateDir, IPreparePluginCallback callback) {
21 super("Unzipping...", callback);
22 this.pluginFile = pluginFile;
23 this.isPluginNeedUnzipToSeparateDir = isPluginNeedUnzipToSeparateDir;
24 }
25
26 @Override
27 public void run() {
28 SwingUtilities.invokeLater(() -> progressBarDialog.setVisible(true));
29 LOGGER.info("Unzip file: {}", pluginFile);
30 String parentDir = pluginFile.getParent();
31 if (isPluginNeedUnzipToSeparateDir) {
32 String dirName = pluginFile.getName().substring(0, pluginFile.getName().lastIndexOf('.'));
33 parentDir = new File(parentDir, dirName).getAbsolutePath();
34 FileUtils.deleteQuietly(new File(parentDir));
35 try {
36 FileUtils.forceMkdir(new File(parentDir));
37 } catch (IOException e) {
38 LOGGER.error("forceMkdir failed: IOException");
39 callback.onUnzipFinished(ChangeMenuPreparePluginController.RESULT_UNZIP_FAILED);
40 return;
41 }
42 }
43 try (ZipFile zipFile = new ZipFile(pluginFile)) {
44 zipFile.setRunInThread(true);
45 zipFile.extractAll(parentDir);
46 while (zipFile.getProgressMonitor().getState() == ProgressMonitor.State.BUSY) {
47 if (isCancelled) {
48 zipFile.getProgressMonitor().setCancelAllTasks(true);
49 break;
50 }
51 progress = zipFile.getProgressMonitor().getPercentDone();
52 Thread.sleep(100);
53 }
54 } catch (IOException e) {
55 LOGGER.error("unzipFile failed: IOException");
56 callback.onUnzipFinished(ChangeMenuPreparePluginController.RESULT_UNZIP_FAILED);
57 return;
58 } catch (InterruptedException e) {
59 LOGGER.error("unzipFile failed: InterruptedException");
60 callback.onUnzipFinished(ChangeMenuPreparePluginController.RESULT_UNZIP_FAILED);
61 Thread.currentThread().interrupt();
62 }
63
64 if (isCancelled) {
65 LOGGER.info("download cancelled");
66 String fileName = pluginFile.getAbsolutePath();
67 String dirName = fileName.substring(0, fileName.lastIndexOf("."));
68 FileUtils.deleteQuietly(new File(dirName));
69 callback.onUnzipFinished(ChangeMenuPreparePluginController.RESULT_UNZIP_CANCELLED);
70 } else {
71 isFinished = true;
72 callback.onUnzipFinished(ChangeMenuPreparePluginController.RESULT_UNZIP_SUCCESS);
73 }
74 }
75 }