package com.amaze.filemanager.services.asynctasks; import android.content.Context; import android.os.AsyncTask; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.amaze.filemanager.R; import com.amaze.filemanager.filesystem.BaseFile; import com.amaze.filemanager.utils.Futils; import com.amaze.filemanager.utils.GenericCopyUtil; import java.io.IOException; import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * Generates hashes from files (MD5 and SHA256) * * Created by Vishal on 05-02-2015 edited by Emmanuel Messulam<emmanuelbendavid@gmail.com> */ public class GenerateHashes extends AsyncTask<Void, String, String[]> { private BaseFile file; private Context context; private TextView md5HashText; private TextView sha256Text; private LinearLayout mMD5LinearLayout, mSHA256LinearLayout; public GenerateHashes(BaseFile f, final Context c, final View view) { this.context = c; this.file = f; md5HashText = (TextView) view.findViewById(R.id.t9); sha256Text = (TextView) view.findViewById(R.id.t10); mMD5LinearLayout = (LinearLayout) view.findViewById(R.id.properties_dialog_md5); mSHA256LinearLayout = (LinearLayout) view.findViewById(R.id.properties_dialog_sha256); } @Override protected String[] doInBackground(Void... params) { String md5 = context.getString(R.string.error); String sha256 = context.getString(R.string.error); try { if (!file.isDirectory(context)) { md5 = getMD5Checksum(); sha256 = getSHA256Checksum(); } } catch (Exception e) { e.printStackTrace(); } return new String[] {md5, sha256}; } @Override protected void onPostExecute(final String[] hashes) { super.onPostExecute(hashes); if (!file.isDirectory() && file.getSize() != 0) { md5HashText.setText(hashes[0]); sha256Text.setText(hashes[1]); mMD5LinearLayout.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Futils.copyToClipboard(context, hashes[0]); Toast.makeText(context, context.getResources().getString(R.string.md5).toUpperCase() + " " + context.getResources().getString(R.string.properties_copied_clipboard), Toast.LENGTH_SHORT).show(); return false; } }); mSHA256LinearLayout.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Futils.copyToClipboard(context, hashes[1]); Toast.makeText(context, context.getResources().getString(R.string.hash_sha256) + " " + context.getResources().getString(R.string.properties_copied_clipboard), Toast.LENGTH_SHORT).show(); return false; } }); } else { mMD5LinearLayout.setVisibility(View.GONE); mSHA256LinearLayout.setVisibility(View.GONE); } } // see this How-to for a faster way to convert a byte array to a HEX string private String getMD5Checksum() throws Exception { byte[] b = createChecksum(); String result = ""; for (byte aB : b) { result += Integer.toString((aB & 0xff) + 0x100, 16).substring(1); } return result; } private String getSHA256Checksum() throws NoSuchAlgorithmException, IOException { MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); byte[] input = new byte[GenericCopyUtil.DEFAULT_BUFFER_SIZE]; int length; InputStream inputStream = file.getInputStream(context); while ((length = inputStream.read(input)) != -1) { if (length > 0) messageDigest.update(input, 0, length); } byte[] hash = messageDigest.digest(); StringBuilder hexString = new StringBuilder(); for (byte aHash : hash) { // convert hash to base 16 String hex = Integer.toHexString(0xff & aHash); if (hex.length() == 1) hexString.append('0'); hexString.append(hex); } inputStream.close(); return hexString.toString(); } private byte[] createChecksum() throws Exception { InputStream fis = file.getInputStream(context); 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(); } }