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 }