X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/5795ad34dc374499aa426704dede3f3e803793a2..080a8ab7af2bc48e3c5fa1334ae91d21073e26c2:/src/com/owncloud/android/ui/preview/PreviewTextFragment.java diff --git a/src/com/owncloud/android/ui/preview/PreviewTextFragment.java b/src/com/owncloud/android/ui/preview/PreviewTextFragment.java index 790cfde6..a07d3dff 100644 --- a/src/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -1,26 +1,26 @@ package com.owncloud.android.ui.preview; import android.accounts.Account; -import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ListView; -import android.widget.ProgressBar; import android.widget.TextView; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.view.MenuItem; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.FileMenuFilter; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; +import com.owncloud.android.ui.dialog.LoadingDialog; import com.owncloud.android.ui.dialog.RemoveFileDialogFragment; import com.owncloud.android.ui.fragment.FileFragment; @@ -28,7 +28,8 @@ import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.IOException; import java.io.StringWriter; -import java.util.ArrayList; +import java.lang.ref.WeakReference; +import java.util.LinkedList; import java.util.List; import java.util.Scanner; @@ -38,8 +39,8 @@ public class PreviewTextFragment extends FileFragment { private static final String TAG = PreviewTextFragment.class.getSimpleName(); private Account mAccount; - private ListView mTextPreviewList; - private ProgressBar mProgressBar; + private TextView mTextPreview; + private TextLoadAsyncTask mTextLoadTask; /** * Creates an empty fragment for previews. @@ -67,9 +68,7 @@ public class PreviewTextFragment extends FileFragment { View ret = inflater.inflate(R.layout.text_file_preview, container, false); - mTextPreviewList = (ListView) ret.findViewById(R.id.text_preview_list); - mTextPreviewList.setAdapter(new TextLineAdapter()); - mProgressBar = (ProgressBar) ret.findViewById(R.id.progress_bar); + mTextPreview = (TextView) ret.findViewById(R.id.text_preview); return ret; } @@ -85,12 +84,13 @@ public class PreviewTextFragment extends FileFragment { Bundle args = getArguments(); - if (file == null) + if (file == null) { file = args.getParcelable(FileDisplayActivity.EXTRA_FILE); + } - if (mAccount == null) + if (mAccount == null) { mAccount = args.getParcelable(FileDisplayActivity.EXTRA_ACCOUNT); - + } if (savedInstanceState == null) { if (file == null) { @@ -113,58 +113,71 @@ public class PreviewTextFragment extends FileFragment { @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - outState.putParcelable(PreviewImageFragment.EXTRA_FILE, getFile()); - outState.putParcelable(PreviewImageFragment.EXTRA_ACCOUNT, mAccount); + outState.putParcelable(PreviewTextFragment.EXTRA_FILE, getFile()); + outState.putParcelable(PreviewTextFragment.EXTRA_ACCOUNT, mAccount); } @Override public void onStart() { super.onStart(); Log_OC.e(TAG, "onStart"); + + loadAndShowTextPreview(); } private void loadAndShowTextPreview() { - new TextLoadAsyncTask().execute(getFile().getStoragePath()); + mTextLoadTask = new TextLoadAsyncTask(new WeakReference(mTextPreview)); + mTextLoadTask.execute(getFile().getStoragePath()); } + /** * Reads the file to preview and shows its contents. Too critical to be anonymous. */ - private class TextLoadAsyncTask extends AsyncTask { + private class TextLoadAsyncTask extends AsyncTask { + private final String DIALOG_WAIT_TAG = "DIALOG_WAIT"; + private final WeakReference mTextViewReference; + + private TextLoadAsyncTask(WeakReference textView) { + mTextViewReference = textView; + } + @Override protected void onPreExecute() { - ((TextLineAdapter) mTextPreviewList.getAdapter()).clear(); + showLoadingDialog(); } @Override - protected Void doInBackground(java.lang.Object... params) { - if (params.length != 1) - throw new IllegalArgumentException("The parameter to " + TextLoadAsyncTask.class.getName() + " must be the file location only"); + protected StringWriter doInBackground(java.lang.Object... params) { + if (params.length != 1) { + throw new IllegalArgumentException("The parameter to " + TextLoadAsyncTask.class.getName() + " must be (1) the file location"); + } final String location = (String) params[0]; FileInputStream inputStream = null; Scanner sc = null; + StringWriter source = new StringWriter(); + BufferedWriter bufferedWriter = new BufferedWriter(source); try { inputStream = new FileInputStream(location); sc = new Scanner(inputStream); while (sc.hasNextLine()) { - StringWriter target = new StringWriter(); - BufferedWriter bufferedWriter = new BufferedWriter(target); - if (sc.hasNextLine()) - bufferedWriter.write(sc.nextLine()); - bufferedWriter.close(); - publishProgress(target); + bufferedWriter.append(sc.nextLine()); + if (sc.hasNextLine()) bufferedWriter.append("\n"); } + bufferedWriter.close(); IOException exc = sc.ioException(); if (exc != null) throw exc; } catch (IOException e) { + Log_OC.e(TAG, e.getMessage(), e); finish(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { + Log_OC.e(TAG, e.getMessage(), e); finish(); } } @@ -172,90 +185,50 @@ public class PreviewTextFragment extends FileFragment { sc.close(); } } - return null; - } - - @Override - protected void onProgressUpdate(StringWriter... values) { - super.onProgressUpdate(values); - //Using a ListView allows to show large text without the UI freeze that happens - //when calling TextView#setText() with a large CharSequence - ((TextLineAdapter) mTextPreviewList.getAdapter()).add(values[0].toString()); + return source; } @Override - protected void onPostExecute(Void aVoid) { - super.onPostExecute(aVoid); - mProgressBar.setVisibility(View.GONE); - mTextPreviewList.setVisibility(View.VISIBLE); - } - } - - private class TextLineAdapter extends BaseAdapter { - private static final int LIST_ITEM_LAYOUT = R.layout.text_file_preview_list_item; - private final List items = new ArrayList<>(); - - private void add(String line) { - items.add(line); - notifyDataSetChanged(); - } - - private void clear() { - items.clear(); - notifyDataSetChanged(); - } + protected void onPostExecute(final StringWriter stringWriter) { + final TextView textView = mTextViewReference.get(); - @Override - public int getCount() { - return items.size(); - } + if (textView != null) { + textView.setText(new String(stringWriter.getBuffer())); + textView.setVisibility(View.VISIBLE); + } - @Override - public String getItem(int position) { - if (position >= items.size()) - throw new IllegalArgumentException(); - return items.get(position); + dismissLoadingDialog(); } - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - ViewHolder viewHolder; - if (convertView == null) { - convertView = - ((LayoutInflater) getActivity().getApplicationContext() - .getSystemService(Context.LAYOUT_INFLATER_SERVICE)) - .inflate( - LIST_ITEM_LAYOUT, null); - viewHolder = new ViewHolder(); - viewHolder.setLineView((TextView) convertView.findViewById(R.id.text_preview)); - convertView.setTag(viewHolder); + /** + * Show loading dialog + */ + public void showLoadingDialog() { + // only once + Fragment frag = getActivity().getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG); + LoadingDialog loading = null; + if (frag == null) { + // Construct dialog + loading = new LoadingDialog(getResources().getString(R.string.wait_a_moment)); + FragmentManager fm = getActivity().getSupportFragmentManager(); + FragmentTransaction ft = fm.beginTransaction(); + loading.show(ft, DIALOG_WAIT_TAG); } else { - viewHolder = (ViewHolder) convertView.getTag(); + loading = (LoadingDialog) frag; + loading.setShowsDialog(true); } - viewHolder.getLineView().setText(items.get(position)); - - return convertView; - } - } - - private static class ViewHolder { - private TextView lineView; - - private ViewHolder() { } - public TextView getLineView() { - return lineView; - } - - public void setLineView(TextView lineView) { - this.lineView = lineView; + /** + * Dismiss loading dialog + */ + public void dismissLoadingDialog() { + final Fragment frag = getActivity().getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG); + if (frag != null) { + LoadingDialog loading = (LoadingDialog) frag; + loading.dismiss(); + } } } @@ -280,7 +253,7 @@ public class PreviewTextFragment extends FileFragment { getFile(), mContainerActivity.getStorageManager().getAccount(), mContainerActivity, - getSherlockActivity() + getActivity() ); mf.filter(menu); } @@ -305,6 +278,18 @@ public class PreviewTextFragment extends FileFragment { item.setVisible(false); item.setEnabled(false); } + + item = menu.findItem(R.id.action_sync_file); + if (item != null) { + item.setVisible(false); + item.setEnabled(false); + } + + item = menu.findItem(R.id.action_sync_account); + if (item != null) { + item.setVisible(false); + item.setEnabled(false); + } } /** @@ -317,6 +302,10 @@ public class PreviewTextFragment extends FileFragment { mContainerActivity.getFileOperationsHelper().shareFileWithLink(getFile()); return true; } + case R.id.action_share_with_users: { + mContainerActivity.getFileOperationsHelper().showShareFile(getFile()); + return true; + } case R.id.action_unshare_file: { mContainerActivity.getFileOperationsHelper().unshareFileWithLink(getFile()); return true; @@ -351,7 +340,7 @@ public class PreviewTextFragment extends FileFragment { /** * Update the file of the fragment with file value * - * @param file + * @param file The new file to set */ public void updateFile(OCFile file) { setFile(file); @@ -375,8 +364,6 @@ public class PreviewTextFragment extends FileFragment { public void onResume() { super.onResume(); Log_OC.e(TAG, "onResume"); - - loadAndShowTextPreview(); } @Override @@ -389,6 +376,8 @@ public class PreviewTextFragment extends FileFragment { public void onStop() { super.onStop(); Log_OC.e(TAG, "onStop"); + if (mTextLoadTask != null) + mTextLoadTask.cancel(Boolean.TRUE); } /** @@ -406,13 +395,29 @@ public class PreviewTextFragment extends FileFragment { * @return 'True' if the file can be handled by the fragment. */ public static boolean canBePreviewed(OCFile file) { - return (file != null && file.isDown() && file.isText()); + final List unsupportedTypes = new LinkedList(); + unsupportedTypes.add("text/richtext"); + unsupportedTypes.add("text/rtf"); + unsupportedTypes.add("text/vnd.abc"); + unsupportedTypes.add("text/vnd.fmi.flexstor"); + unsupportedTypes.add("text/vnd.rn-realtext"); + unsupportedTypes.add("text/vnd.wap.wml"); + unsupportedTypes.add("text/vnd.wap.wmlscript"); + return (file != null && file.isDown() && file.isText() && + !unsupportedTypes.contains(file.getMimetype()) && + !unsupportedTypes.contains(file.getMimeTypeFromName()) + ); } /** * Finishes the preview */ private void finish() { - getSherlockActivity().onBackPressed(); + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + getActivity().onBackPressed(); + } + }); } }