-<?xml version="1.0" encoding="utf-8"?>
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/text_preview_list"
+<?xml version="1.0" encoding="utf-8"?><!--
+ ownCloud Android client application
+
+ Copyright (C) 2012-2013 ownCloud Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2,
+ as published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+-->
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="match_parent"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="gone"
- android:divider="@null"
- android:dividerHeight="0dp"
- android:focusable="false"
- android:focusableInTouchMode="false"
- android:layout_marginStart="8dp"
- android:layout_marginEnd="8dp" />
\ No newline at end of file
+ android:fillViewport="true">
+
+ <TextView
+ android:id="@+id/text_preview"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="8dp"
+ android:layout_marginEnd="8dp"
+ android:visibility="gone" />
+</ScrollView>
\ No newline at end of file
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.BaseAdapter;
-import android.widget.ListView;
+import android.widget.ScrollView;
import android.widget.TextView;
import com.actionbarsherlock.view.Menu;
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 {
private static final String TAG = PreviewTextFragment.class.getSimpleName();
private Account mAccount;
- private ListView mTextPreviewList;
+ private TextView mTextPreview;
/**
* Creates an empty fragment for previews.
View ret = inflater.inflate(R.layout.text_file_preview, container, false);
- mTextPreviewList = (ListView) ret.findViewById(R.id.text_preview_list);
- mTextPreviewList.setAdapter(new TextLineAdapter());
+ mTextPreview = (TextView) ret.findViewById(R.id.text_preview);
return ret;
}
}
private void loadAndShowTextPreview() {
- new TextLoadAsyncTask().execute(getFile().getStoragePath());
+ new TextLoadAsyncTask().execute(getFile().getStoragePath(), mTextPreview);
}
/**
* Reads the file to preview and shows its contents. Too critical to be anonymous.
*/
- private class TextLoadAsyncTask extends AsyncTask<Object, StringWriter, Void> {
- private int TEXTVIEW_WIDTH;
- private float TEXTVIEW_SIZE;
- private final Queue<Character> accumulatedText = new LinkedList<Character>();
+ private class TextLoadAsyncTask extends AsyncTask<Object, Void, StringWriter> {
private final String DIALOG_WAIT_TAG = "DIALOG_WAIT";
- private final Rect bounds = new Rect();
- private final Paint paint = new Paint();
+ private TextView mTextView;
- @SuppressLint("InflateParams")
@Override
protected void onPreExecute() {
- ((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 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 != 2)
+ throw new IllegalArgumentException("The parameters to " + TextLoadAsyncTask.class.getName() + " must be (1) the file location and (2) the text view to update");
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()) {
- 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) {
sc.close();
}
}
- //Add the remaining text, if any
- while (!accumulatedText.isEmpty()) {
- addLine();
- }
- return null;
+ return source;
}
@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(Void aVoid) {
- super.onPostExecute(aVoid);
- mTextPreviewList.setVisibility(View.VISIBLE);
+ protected void onPostExecute(final StringWriter stringWriter) {
+ mTextView.setText(new String(stringWriter.getBuffer()));
+ mTextView.setVisibility(View.VISIBLE);
dismissLoadingDialog();
}
}
}
- private class TextLineAdapter extends BaseAdapter {
- private static final int LIST_ITEM_LAYOUT = R.layout.text_file_preview_list_item;
- private final List<String> items = new ArrayList<String>();
-
- 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;
- }
- }
-
/**
* {@inheritDoc}
*/
* Finishes the preview
*/
private void finish() {
- getSherlockActivity().onBackPressed();
+ getActivity().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ getSherlockActivity().onBackPressed();
+ }
+ });
}
}