package com.amaze.filemanager.services.asynctasks; import android.net.Uri; import android.os.AsyncTask; import com.amaze.filemanager.fragments.ZipViewer; import com.amaze.filemanager.ui.ZipObj; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; /** * Created by Vishal on 11/23/2014. */ public class ZipHelperTask extends AsyncTask<String, Void, ArrayList<ZipObj>> { ZipViewer zipViewer; String dir; /** * AsyncTask to load ZIP file items. * @param zipViewer the zipViewer fragment instance * @param dir */ public ZipHelperTask(ZipViewer zipViewer, String dir) { this.zipViewer = zipViewer; this.dir = dir; zipViewer.swipeRefreshLayout.setRefreshing(true); } @Override protected void onPreExecute() { super.onPreExecute(); zipViewer.swipeRefreshLayout.setRefreshing(true); } @Override protected ArrayList<ZipObj> doInBackground(String... params) { ArrayList<ZipObj> elements = new ArrayList<>(); try { if (zipViewer.wholelist.size() == 0) { Uri uri = Uri.parse(params[0]); if (new File(uri.getPath()).canRead()) { ZipFile zipfile = new ZipFile(uri.getPath()); for (Enumeration e = zipfile.entries(); e.hasMoreElements(); ) { ZipEntry entry = (ZipEntry) e.nextElement(); zipViewer.wholelist.add(new ZipObj(entry, entry.getTime(), entry.getSize(), entry.isDirectory())); } } else { ZipEntry entry1; if (zipViewer.wholelist.size() == 0) { ZipInputStream zipfile1 = new ZipInputStream(zipViewer.getActivity().getContentResolver().openInputStream(uri)); while ((entry1 = zipfile1.getNextEntry()) != null) { zipViewer.wholelist.add(new ZipObj(entry1, entry1.getTime(), entry1.getSize(), entry1.isDirectory())); } } } } ArrayList<String> strings = new ArrayList<>(); // int fileCount = zipfile.size(); for (ZipObj entry : zipViewer.wholelist) { String s = entry.getName(); // System.out.println(s); File file = new File(entry.getName()); if (dir == null || dir.trim().length() == 0) { String y = entry.getName(); if (y.startsWith("/")) y = y.substring(1, y.length()); if (file.getParent() == null || file.getParent().length() == 0 || file.getParent().equals("/")) { if (!strings.contains(y)) { elements.add(new ZipObj(new ZipEntry(y), entry.getTime(), entry.getSize(), entry.isDirectory())); strings.add(y); } } else { String path = y.substring(0, y.indexOf("/") + 1); if (!strings.contains(path)) { ZipObj zipObj = new ZipObj(new ZipEntry(path), entry.getTime(), entry.getSize(), true); strings.add(path); elements.add(zipObj); } } } else { String y = entry.getName(); if (entry.getName().startsWith("/")) y = y.substring(1, y.length()); if (file.getParent() != null && (file.getParent().equals(dir) || file.getParent().equals("/" + dir))) { if (!strings.contains(y)) { elements.add(new ZipObj(new ZipEntry(y), entry.getTime(), entry.getSize(), entry.isDirectory())); strings.add(y); } } else { if (y.startsWith(dir + "/") && y.length() > dir.length() + 1) { String path1 = y.substring(dir.length() + 1, y.length()); int index = dir.length() + 1 + path1.indexOf("/"); String path = y.substring(0, index + 1); if (!strings.contains(path)) { ZipObj zipObj = new ZipObj(new ZipEntry(y.substring(0, index + 1)), entry.getTime(), entry.getSize(), true); strings.add(path); //System.out.println(path); elements.add(zipObj); } } } } } } catch (Exception e) { e.printStackTrace(); } Collections.sort(elements, new FileListSorter()); if (zipViewer.gobackitem && dir != null && dir.trim().length() != 0) elements.add(0, new ZipObj(null, 0, 0, true)); zipViewer.elements = elements; return elements; } @Override protected void onPostExecute(ArrayList<ZipObj> zipEntries) { super.onPostExecute(zipEntries); zipViewer.swipeRefreshLayout.setRefreshing(false); zipViewer.createviews(zipEntries, dir); } private class FileListSorter implements Comparator<ZipObj> { @Override public int compare(ZipObj file1, ZipObj file2) { if (file1.isDirectory() && !file2.isDirectory()) { return -1; } else if (file2.isDirectory() && !(file1).isDirectory()) { return 1; } return file1.getEntry().getName().compareToIgnoreCase(file2.getEntry().getName()); } } }