package com.amaze.filemanager.services; import android.content.ContentResolver; import android.content.Context; import android.net.Uri; import android.provider.MediaStore; import com.amaze.filemanager.filesystem.HFile; import com.amaze.filemanager.utils.Futils; import java.io.InputStream; import java.net.MalformedURLException; import java.security.MessageDigest; import java.util.ArrayList; import jcifs.smb.SmbException; /** * Created by arpitkh996 on 25-01-2016. */ public class FileVerifier extends Thread { ArrayList<FileBundle> arrayList = new ArrayList<>(); Context c; boolean rootmode; FileVerifierInterface fileVerifierInterface; boolean running=true; public FileVerifier(Context context,boolean rootmode, FileVerifierInterface fileVerifierInterface) { c = context; this.rootmode=rootmode; this.fileVerifierInterface = fileVerifierInterface; } @Override public void run() { super.run(); while (arrayList.size() > 0 && !isInterrupted()) { running=true; if (arrayList.get(arrayList.size() - 1) != null) { FileBundle fileBundle = arrayList.get(arrayList.size() - 1); processFile(fileBundle); if(arrayList.contains(fileBundle)) arrayList.remove(fileBundle); } } running=false; } public void add(FileBundle fileBundle) { arrayList.add(0, fileBundle); if (!isAlive()) { start(); } } public boolean isRunning() { return running; } void stopTask(){ arrayList.clear(); interrupt(); } public interface FileVerifierInterface { void addFailedFile(HFile a); boolean contains(String a); boolean containsDirectory(String a); void setCopySuccessful(boolean b); } void processFile(FileBundle fileBundle) { HFile sourceFile = fileBundle.getFile(), targetFile = fileBundle.getFile2(); boolean move = fileBundle.isMove(); if(sourceFile.isDirectory()){ if(move){ if(!fileVerifierInterface.containsDirectory(sourceFile.getPath())){ sourceFile.delete(c,rootmode); } } return; } if (!targetFile.isSmb()) Futils.scanFile(targetFile.getPath(), c); if (!checkNonRootFiles(sourceFile, targetFile)) { fileVerifierInterface.addFailedFile(sourceFile); fileVerifierInterface.setCopySuccessful(false); } try { targetFile.setLastModified(sourceFile.lastModified()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (SmbException e) { e.printStackTrace(); } if (move) { if (!fileVerifierInterface.contains(sourceFile.getPath())) { sourceFile.delete(c,rootmode); if (sourceFile.isLocal()) delete(c, sourceFile.getPath()); } } } void delete(final Context context, final String file) { final String where = MediaStore.MediaColumns.DATA + "=?"; final String[] selectionArgs = new String[]{ file }; final ContentResolver contentResolver = context.getContentResolver(); final Uri filesUri = MediaStore.Files.getContentUri("external"); // Delete the entry from the media database. This will actually delete media files. contentResolver.delete(filesUri, where, selectionArgs); } boolean checkNonRootFiles(HFile hFile1, HFile hFile2) { long l1 = hFile1.length(), l2 = hFile2.length(); if (hFile2.exists() && ((l1 != -1 && l2 != -1) ? l1 == l2 : true)) { return true; } return false; } public String getMD5Checksum(InputStream filename) throws Exception { byte[] b = createChecksum(filename); String result = ""; for (int i = 0; i < b.length; i++) { result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1); } return result; } public byte[] createChecksum(InputStream fis) throws Exception { byte[] buffer = new byte[8192]; MessageDigest complete = MessageDigest.getInstance("MD5"); int numRead; do { numRead = fis.read(buffer); if (numRead > 0) { complete.update(buffer, 0, numRead); } } while (numRead != -1); fis.close(); return complete.digest(); } }