package com.openfarmanager.android.fragments; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.MimeTypeMap; import android.widget.TextView; import com.openfarmanager.android.R; import com.openfarmanager.android.adapters.FileSystemAdapter; import com.openfarmanager.android.core.archive.MimeTypes; import com.openfarmanager.android.utils.CustomFormatter; import com.openfarmanager.android.utils.FileUtilsExt; import java.io.File; import java.util.Date; /** * @author Vlad Namashko */ public class InfoDialog extends BaseDialog { private View mRootView; private View mProgress; private View mFileDetails; private View mFolderDetails; private LoadDataTask mLoadDataTask; public static InfoDialog newInstance(String filePath) { InfoDialog infoDialog = new InfoDialog(); Bundle args = new Bundle(); args.putString("filePath", filePath); infoDialog.setArguments(args); return infoDialog; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Action_Dialog); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { getDialog().setTitle(getSafeString(R.string.app_name)); mRootView = inflater.inflate(R.layout.dialog_file_info, container, false); mProgress = mRootView.findViewById(R.id.loading); mFileDetails = mRootView.findViewById(R.id.details_file); mFolderDetails = mRootView.findViewById(R.id.details_folder); mRootView.findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { cancelRunningTask(); dismiss(); } }); cancelRunningTask(); mLoadDataTask = new LoadDataTask(); mLoadDataTask.execute(); return mRootView; } private void cancelRunningTask() { if (mLoadDataTask != null) { mLoadDataTask.cancel(true); mLoadDataTask = null; } } private class LoadDataTask extends AsyncTask<Void, Void, FileUtilsExt.DirectoryScanResult> { private Exception mExecutionException; private File mCurrentFile; @Override protected void onPreExecute() { super.onPreExecute(); mProgress.setVisibility(View.VISIBLE); mFileDetails.setVisibility(View.GONE); mFolderDetails.setVisibility(View.GONE); } @Override protected FileUtilsExt.DirectoryScanResult doInBackground(Void... params) { try { mCurrentFile = new File(getArguments().getString("filePath")); return FileUtilsExt.getDirectoryDetails(mCurrentFile); } catch (Exception e) { mExecutionException = e; } return null; } @Override protected void onPostExecute(FileUtilsExt.DirectoryScanResult result) { if (getActivity() == null || getActivity().isFinishing() || mCurrentFile == null) { return; } String permissions = ""; permissions += mCurrentFile.canRead() ? "r" : "-"; permissions += mCurrentFile.canWrite() ? "w" : "-"; mProgress.setVisibility(View.GONE); if (mExecutionException != null) { TextView error = ((TextView) mRootView.findViewById(R.id.error)); error.setText(getSafeString(R.string.error_quick_view_error_while_calculating_detailes, mExecutionException.getLocalizedMessage())); error.setVisibility(View.VISIBLE); } else { setSafeValue(R.id.file_name, mCurrentFile.getName()); setSafeValue(R.id.folders, Long.toString(result.directories)); setSafeValue(R.id.files, Long.toString(result.files)); setSafeValue(R.id.size, CustomFormatter.formatBytes(result.filesSize)); setSafeValue(R.id.last_modified, FileSystemAdapter.sDateFormat.format(new Date(mCurrentFile.lastModified()))); setSafeValue(R.id.permissions, permissions); setSafeValue(R.id.mime_type, MimeTypes.getMimeType(MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(mCurrentFile).toString()))); mFileDetails.setVisibility(mCurrentFile.isDirectory() ? View.GONE : View.VISIBLE); mFolderDetails.setVisibility(mCurrentFile.isDirectory() ? View.VISIBLE : View.GONE); } } private View getCurrentVisibleView() { return mCurrentFile.isDirectory() ? mFolderDetails : mFileDetails; } private void setSafeValue(int view_id, String value) { TextView textView = (TextView) getCurrentVisibleView().findViewById(view_id); if (textView != null) { textView.setText(value); } } } }