package com.amaze.filemanager.services.asynctasks;
import android.app.Activity;
import android.os.AsyncTask;
import android.util.Log;
import com.amaze.filemanager.activities.MainActivity;
import com.amaze.filemanager.filesystem.RootHelper;
import com.amaze.filemanager.utils.UtilitiesProviderInterface;
import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.rarfile.FileHeader;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/**
* Created by Vishal on 11/27/2014.
*/
public class ZipExtractTask extends AsyncTask<Void, Void, Void> {
private UtilitiesProviderInterface utilsProvider;
private String outputDir;
private ZipFile zipFile;
private Activity zipViewer;
private String fileName;
boolean zip;ZipEntry entry;
Archive rar;
FileHeader header;
File output;
public ZipExtractTask(UtilitiesProviderInterface utilsProvider, ZipFile zipFile, String outputDir, Activity zipViewer, String fileName,boolean zip,ZipEntry zipEntry) {
this.utilsProvider = utilsProvider;
this.zip=zip;
this.outputDir = outputDir;
this.zipFile = zipFile;
this.zipViewer = zipViewer;
this.fileName = fileName;
this.entry=zipEntry;
}
public ZipExtractTask(UtilitiesProviderInterface utilsProvider, Archive rar, String outputDir, Activity zipViewer, String fileName,boolean zip,FileHeader fileHeader) {
this.zip=zip;
this.outputDir = outputDir;
this.rar = rar;
this.zipViewer = zipViewer;
this.fileName = fileName;
this.header = fileHeader;
}
@Override
protected Void doInBackground(Void... zipEntries) {
try {
if (zip) unzipEntry1(zipFile, entry, outputDir);
else unzipRAREntry(rar,header,outputDir);
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
String cmd = "chmod 777 " + output.getPath();
Log.d("change permissions", cmd);
RootHelper.runAndWait(cmd, false);
utilsProvider.getFutils().openFile(output, (MainActivity) zipViewer);
}
private void unzipEntry1(ZipFile zipfile, ZipEntry entry, String outputDir)
throws IOException {
output = new File(outputDir, fileName);
BufferedInputStream inputStream = new BufferedInputStream(
zipfile.getInputStream(entry));
BufferedOutputStream outputStream = new BufferedOutputStream(
new FileOutputStream(output));
try {
int len;
byte buf[] = new byte[1024];
while ((len = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, len);
}
} finally {
outputStream.close();
inputStream.close();
}
}
private void unzipRAREntry(Archive zipfile, FileHeader header, String outputDir)
throws IOException, RarException {
output = new File(outputDir + "/" + header.getFileNameString().trim());
FileOutputStream fileOutputStream = new FileOutputStream(output);
zipfile.extractFile(header, fileOutputStream);
}
}