X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/7cc88a22d183a5bc82ddbd30945789d58e0a753b..5aa4d0e6c88940a88069494e5a4d1678ebaac146:/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 d0a678c8..07445db5 100644 --- a/src/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -1,13 +1,21 @@ package com.owncloud.android.ui.preview; import android.accounts.Account; +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Paint; +import android.graphics.Rect; 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.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ProgressBar; -import android.widget.ScrollView; +import android.widget.BaseAdapter; +import android.widget.ListView; import android.widget.TextView; import com.actionbarsherlock.view.Menu; @@ -19,6 +27,7 @@ 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; @@ -26,6 +35,10 @@ import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.IOException; import java.io.StringWriter; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; import java.util.Scanner; public class PreviewTextFragment extends FileFragment { @@ -34,9 +47,7 @@ public class PreviewTextFragment extends FileFragment { private static final String TAG = PreviewTextFragment.class.getSimpleName(); private Account mAccount; - private TextView mTextPreview; - private ProgressBar mProgressBar; - private ScrollView mScrollView; + private ListView mTextPreviewList; /** * Creates an empty fragment for previews. @@ -64,9 +75,8 @@ public class PreviewTextFragment extends FileFragment { View ret = inflater.inflate(R.layout.text_file_preview, container, false); - mScrollView = (ScrollView) ret.findViewById(R.id.text_scrollview); - mTextPreview = (TextView) ret.findViewById(R.id.text_preview); - mProgressBar = (ProgressBar) ret.findViewById(R.id.progress_bar); + mTextPreviewList = (ListView) ret.findViewById(R.id.text_preview_list); + mTextPreviewList.setAdapter(new TextLineAdapter()); return ret; } @@ -118,44 +128,57 @@ public class PreviewTextFragment extends FileFragment { public void onStart() { super.onStart(); Log_OC.e(TAG, "onStart"); - - loadAndShowTextPreview(getFile().getStoragePath(), mTextPreview); } - private void loadAndShowTextPreview(String location, TextView textView) { - new TextLoadAsyncTask().execute(location, textView); + private void loadAndShowTextPreview() { + new TextLoadAsyncTask().execute(getFile().getStoragePath()); } /** * Reads the file to preview and shows its contents. Too critical to be anonymous. */ - private class TextLoadAsyncTask extends AsyncTask { - TextView mTextView; - + private class TextLoadAsyncTask extends AsyncTask { + private int TEXTVIEW_WIDTH; + private float TEXTVIEW_SIZE; + private final Queue accumulatedText = new LinkedList(); + private final String DIALOG_WAIT_TAG = "DIALOG_WAIT"; + private final Rect bounds = new Rect(); + private final Paint paint = new Paint(); + + @SuppressLint("InflateParams") @Override protected void onPreExecute() { - mProgressBar.setVisibility(View.VISIBLE); + ((TextLineAdapter) mTextPreviewList.getAdapter()).clear(); + DisplayMetrics displaymetrics = new DisplayMetrics(); + getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); + TEXTVIEW_WIDTH = displaymetrics.widthPixels; + TEXTVIEW_SIZE = ((TextView) ((LayoutInflater) getActivity().getApplicationContext() + .getSystemService(Context.LAYOUT_INFLATER_SERVICE)) + .inflate( + R.layout.text_file_preview_list_item, null)).getTextSize(); + showLoadingDialog(); + paint.setTextSize(TEXTVIEW_SIZE); } @Override - protected StringWriter doInBackground(java.lang.Object... params) { - if (params.length != 2) - throw new IllegalArgumentException("The parameters to " + TextLoadAsyncTask.class.getName() + " must be (1) the file location and (2) the text view to update"); + 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"); final String location = (String) params[0]; - mTextView = (TextView) params[1]; 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()) { - bufferedWriter.append(sc.nextLine()); - if (sc.hasNextLine()) bufferedWriter.append("\n"); + StringWriter target = new StringWriter(); + BufferedWriter bufferedWriter = new BufferedWriter(target); + if (sc.hasNextLine()) + bufferedWriter.write(sc.nextLine()); + bufferedWriter.close(); + publishProgress(target); } - bufferedWriter.close(); IOException exc = sc.ioException(); if (exc != null) throw exc; } catch (IOException e) { @@ -172,15 +195,145 @@ public class PreviewTextFragment extends FileFragment { sc.close(); } } - return source; + //Add the remaining text, if any + while (!accumulatedText.isEmpty()) { + addLine(); + } + return null; + } + + @Override + protected void onProgressUpdate(StringWriter... values) { + super.onProgressUpdate(values); + final char[] newTextAsCharArray = values[0].toString().toCharArray(); + for (char c : newTextAsCharArray) { + accumulatedText.add(c); + } + addLine(); + } + + private synchronized void addLine() { + StringBuilder textForThisLine = new StringBuilder(); + do { + Character polled = accumulatedText.poll(); + textForThisLine.append(polled); + } + while (!isTooLarge(textForThisLine.toString()) && !accumulatedText.isEmpty()); + String line = textForThisLine.toString(); + ((TextLineAdapter) mTextPreviewList.getAdapter()).add(line.contentEquals("null") ? "" : line); + } + + private boolean isTooLarge(String text) { + paint.getTextBounds(text, 0, text.length(), bounds); + int lineWidth = (int) Math.ceil(bounds.width()); + return lineWidth / TEXTVIEW_WIDTH > 1; } @Override - protected void onPostExecute(final StringWriter stringWriter) { - super.onPostExecute(stringWriter); - mProgressBar.setVisibility(View.GONE); - mScrollView.setVisibility(View.VISIBLE); - mTextView.setText(new String(stringWriter.getBuffer())); + protected void onPostExecute(Void aVoid) { + super.onPostExecute(aVoid); + mTextPreviewList.setVisibility(View.VISIBLE); + dismissLoadingDialog(); + } + + /** + * Show loading dialog + */ + public void showLoadingDialog() { + // Construct dialog + LoadingDialog loading = new LoadingDialog(getResources().getString(R.string.wait_a_moment)); + FragmentManager fm = getActivity().getSupportFragmentManager(); + FragmentTransaction ft = fm.beginTransaction(); + loading.show(ft, DIALOG_WAIT_TAG); + } + + /** + * Dismiss loading dialog + */ + public void dismissLoadingDialog() { + Fragment frag = getActivity().getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG); + if (frag != null) { + LoadingDialog loading = (LoadingDialog) frag; + loading.dismiss(); + } + } + } + + 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); + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + notifyDataSetChanged(); + } + }); + } + + private void clear() { + items.clear(); + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + notifyDataSetChanged(); + } + }); + } + + @Override + public int getCount() { + return items.size(); + } + + @Override + public String getItem(int position) { + if (position >= items.size()) + throw new IllegalArgumentException(); + return items.get(position); + } + + @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); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + + 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; } } @@ -230,6 +383,30 @@ public class PreviewTextFragment extends FileFragment { item.setVisible(false); item.setEnabled(false); } + + item = menu.findItem(R.id.action_settings); + if (item != null) { + item.setVisible(false); + item.setEnabled(false); + } + + item = menu.findItem(R.id.action_logger); + if (item != null) { + 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); + } } /** @@ -276,7 +453,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); @@ -300,6 +477,8 @@ public class PreviewTextFragment extends FileFragment { public void onResume() { super.onResume(); Log_OC.e(TAG, "onResume"); + + loadAndShowTextPreview(); } @Override