X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/b22dc8bce6f43c832468b4fa0c0ba0d1d4eb59d8..7cc88a22d183a5bc82ddbd30945789d58e0a753b:/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 new file mode 100644 index 00000000..d0a678c8 --- /dev/null +++ b/src/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -0,0 +1,341 @@ +package com.owncloud.android.ui.preview; + +import android.accounts.Account; +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ProgressBar; +import android.widget.ScrollView; +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.RemoveFileDialogFragment; +import com.owncloud.android.ui.fragment.FileFragment; + +import java.io.BufferedWriter; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.StringWriter; +import java.util.Scanner; + +public class PreviewTextFragment extends FileFragment { + private static final String EXTRA_FILE = "FILE"; + private static final String EXTRA_ACCOUNT = "ACCOUNT"; + private static final String TAG = PreviewTextFragment.class.getSimpleName(); + + private Account mAccount; + private TextView mTextPreview; + private ProgressBar mProgressBar; + private ScrollView mScrollView; + + /** + * Creates an empty fragment for previews. + *

+ * MUST BE KEPT: the system uses it when tries to reinstantiate a fragment automatically + * (for instance, when the device is turned a aside). + *

+ * DO NOT CALL IT: an {@link OCFile} and {@link Account} must be provided for a successful + * construction + */ + public PreviewTextFragment() { + super(); + mAccount = null; + } + + /** + * {@inheritDoc} + */ + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + Log_OC.e(TAG, "onCreateView"); + + + 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); + + return ret; + } + + /** + * {@inheritDoc} + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + OCFile file = getFile(); + + Bundle args = getArguments(); + + if (file == null) + file = args.getParcelable(FileDisplayActivity.EXTRA_FILE); + + if (mAccount == null) + mAccount = args.getParcelable(FileDisplayActivity.EXTRA_ACCOUNT); + + + if (savedInstanceState == null) { + if (file == null) { + throw new IllegalStateException("Instanced with a NULL OCFile"); + } + if (mAccount == null) { + throw new IllegalStateException("Instanced with a NULL ownCloud Account"); + } + } else { + file = savedInstanceState.getParcelable(EXTRA_FILE); + mAccount = savedInstanceState.getParcelable(EXTRA_ACCOUNT); + } + setFile(file); + setHasOptionsMenu(true); + } + + /** + * {@inheritDoc} + */ + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putParcelable(PreviewImageFragment.EXTRA_FILE, getFile()); + outState.putParcelable(PreviewImageFragment.EXTRA_ACCOUNT, mAccount); + } + + @Override + 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); + } + + /** + * Reads the file to preview and shows its contents. Too critical to be anonymous. + */ + private class TextLoadAsyncTask extends AsyncTask { + TextView mTextView; + + @Override + protected void onPreExecute() { + mProgressBar.setVisibility(View.VISIBLE); + } + + @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"); + 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"); + } + bufferedWriter.close(); + IOException exc = sc.ioException(); + if (exc != null) throw exc; + } catch (IOException e) { + finish(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + finish(); + } + } + if (sc != null) { + sc.close(); + } + } + return source; + } + + @Override + protected void onPostExecute(final StringWriter stringWriter) { + super.onPostExecute(stringWriter); + mProgressBar.setVisibility(View.GONE); + mScrollView.setVisibility(View.VISIBLE); + mTextView.setText(new String(stringWriter.getBuffer())); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + inflater.inflate(R.menu.file_actions_menu, menu); + } + + /** + * {@inheritDoc} + */ + @Override + public void onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + + if (mContainerActivity.getStorageManager() != null) { + FileMenuFilter mf = new FileMenuFilter( + getFile(), + mContainerActivity.getStorageManager().getAccount(), + mContainerActivity, + getSherlockActivity() + ); + mf.filter(menu); + } + + // additional restriction for this fragment + MenuItem item = menu.findItem(R.id.action_rename_file); + if (item != null) { + item.setVisible(false); + item.setEnabled(false); + } + + // additional restriction for this fragment + item = menu.findItem(R.id.action_move); + if (item != null) { + item.setVisible(false); + item.setEnabled(false); + } + + // this one doesn't make sense since the file has to be down in order to be previewed + item = menu.findItem(R.id.action_download_file); + if (item != null) { + item.setVisible(false); + item.setEnabled(false); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_share_file: { + mContainerActivity.getFileOperationsHelper().shareFileWithLink(getFile()); + return true; + } + case R.id.action_unshare_file: { + mContainerActivity.getFileOperationsHelper().unshareFileWithLink(getFile()); + return true; + } + case R.id.action_open_file_with: { + openFile(); + return true; + } + case R.id.action_remove_file: { + RemoveFileDialogFragment dialog = RemoveFileDialogFragment.newInstance(getFile()); + dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION); + return true; + } + case R.id.action_see_details: { + seeDetails(); + return true; + } + case R.id.action_send_file: { + sendFile(); + return true; + } + case R.id.action_sync_file: { + mContainerActivity.getFileOperationsHelper().syncFile(getFile()); + return true; + } + + default: + return false; + } + } + + /** + * Update the file of the fragment with file value + * + * @param file + */ + public void updateFile(OCFile file) { + setFile(file); + } + + private void sendFile() { + mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile()); + } + + private void seeDetails() { + mContainerActivity.showDetails(getFile()); + } + + @Override + public void onPause() { + Log_OC.e(TAG, "onPause"); + super.onPause(); + } + + @Override + public void onResume() { + super.onResume(); + Log_OC.e(TAG, "onResume"); + } + + @Override + public void onDestroy() { + Log_OC.e(TAG, "onDestroy"); + super.onDestroy(); + } + + @Override + public void onStop() { + super.onStop(); + Log_OC.e(TAG, "onStop"); + } + + /** + * Opens the previewed file with an external application. + */ + private void openFile() { + mContainerActivity.getFileOperationsHelper().openFile(getFile()); + finish(); + } + + /** + * Helper method to test if an {@link OCFile} can be passed to a {@link PreviewTextFragment} to be previewed. + * + * @param file File to test if can be previewed. + * @return 'True' if the file can be handled by the fragment. + */ + public static boolean canBePreviewed(OCFile file) { + return (file != null && file.isDown() && file.isText()); + } + + /** + * Finishes the preview + */ + private void finish() { + getSherlockActivity().onBackPressed(); + } +}