X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/6cfa24f55ab605770df08a6bed889bfccf0c0888..52bd01bcedf1b8f13c49b67ee40a848bae1a9d40:/src/com/owncloud/android/ui/preview/PreviewImageFragment.java diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index fe94f641..8df06bfe 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -2,9 +2,8 @@ * 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 as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. + * 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 @@ -37,7 +36,6 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.FragmentStatePagerAdapter; -import android.util.Log; import android.view.Display; import android.view.LayoutInflater; import android.view.View; @@ -45,6 +43,7 @@ import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.webkit.MimeTypeMap; import android.widget.ImageView; +import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; @@ -54,7 +53,6 @@ import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.network.OwnCloudClientUtils; import com.owncloud.android.operations.OnRemoteOperationListener; import com.owncloud.android.operations.RemoteOperation; import com.owncloud.android.operations.RemoteOperationResult; @@ -62,8 +60,8 @@ import com.owncloud.android.operations.RemoveFileOperation; import com.owncloud.android.ui.fragment.ConfirmationDialogFragment; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.Log_OC; import com.owncloud.android.R; -import eu.alefzero.webdav.WebdavClient; import eu.alefzero.webdav.WebdavUtils; @@ -88,6 +86,7 @@ public class PreviewImageFragment extends SherlockFragment implements FileFrag private FileDataStorageManager mStorageManager; private ImageView mImageView; private TextView mMessageView; + private ProgressBar mProgressWheel; public Bitmap mBitmap = null; @@ -151,9 +150,12 @@ public class PreviewImageFragment extends SherlockFragment implements FileFrag super.onCreateView(inflater, container, savedInstanceState); mView = inflater.inflate(R.layout.preview_image_fragment, container, false); mImageView = (ImageView)mView.findViewById(R.id.image); + mImageView.setVisibility(View.GONE); mView.setOnTouchListener((OnTouchListener)getActivity()); // WATCH OUT THAT CAST mMessageView = (TextView)mView.findViewById(R.id.message); mMessageView.setVisibility(View.GONE); + mProgressWheel = (ProgressBar)mView.findViewById(R.id.progressWheel); + mProgressWheel.setVisibility(View.VISIBLE); return mView; } @@ -211,7 +213,7 @@ public class PreviewImageFragment extends SherlockFragment implements FileFrag public void onStart() { super.onStart(); if (mFile != null) { - BitmapLoader bl = new BitmapLoader(mImageView, mMessageView); + BitmapLoader bl = new BitmapLoader(mImageView, mMessageView, mProgressWheel); bl.execute(new String[]{mFile.getStoragePath()}); } } @@ -277,7 +279,7 @@ public class PreviewImageFragment extends SherlockFragment implements FileFrag @Override public void onResume() { super.onResume(); - Log.e(TAG, "FRAGMENT, ONRESUME"); + //Log.e(TAG, "FRAGMENT, ONRESUME"); /* mDownloadFinishReceiver = new DownloadFinishReceiver(); IntentFilter filter = new IntentFilter( @@ -335,7 +337,7 @@ public class PreviewImageFragment extends SherlockFragment implements FileFrag startActivity(i); } catch (Throwable t) { - Log.e(TAG, "Fail when trying to open with the mimeType provided from the ownCloud server: " + mFile.getMimetype()); + Log_OC.e(TAG, "Fail when trying to open with the mimeType provided from the ownCloud server: " + mFile.getMimetype()); boolean toastIt = true; String mimeType = ""; try { @@ -354,13 +356,13 @@ public class PreviewImageFragment extends SherlockFragment implements FileFrag } } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "Trying to find out MIME type of a file without extension: " + storagePath); + Log_OC.e(TAG, "Trying to find out MIME type of a file without extension: " + storagePath); } catch (ActivityNotFoundException e) { - Log.e(TAG, "No activity found to handle: " + storagePath + " with MIME type " + mimeType + " obtained from extension"); + Log_OC.e(TAG, "No activity found to handle: " + storagePath + " with MIME type " + mimeType + " obtained from extension"); } catch (Throwable th) { - Log.e(TAG, "Unexpected problem when opening: " + storagePath, th); + Log_OC.e(TAG, "Unexpected problem when opening: " + storagePath, th); } finally { if (toastIt) { @@ -400,8 +402,7 @@ public class PreviewImageFragment extends SherlockFragment implements FileFrag mLastRemoteOperation = new RemoveFileOperation( mFile, // TODO we need to review the interface with RemoteOperations, and use OCFile IDs instead of OCFile objects as parameters true, mStorageManager); - WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getSherlockActivity().getApplicationContext()); - mLastRemoteOperation.execute(wc, this, mHandler); + mLastRemoteOperation.execute(mAccount, getSherlockActivity(), this, mHandler, getSherlockActivity()); getActivity().showDialog(PreviewImageActivity.DIALOG_SHORT_WAIT); } @@ -476,7 +477,18 @@ public class PreviewImageFragment extends SherlockFragment implements FileFrag private final WeakReference mMessageViewRef; - private Throwable mThrowable; + /** + * Weak reference to the target {@link Progressbar} shown while the load is in progress. + * + * Using a weak reference will avoid memory leaks if the target ImageView is retired from memory before the load finishes. + */ + private final WeakReference mProgressWheelRef; + + + /** + * Error message to show when a load fails + */ + private int mErrorMessageId; /** @@ -484,10 +496,10 @@ public class PreviewImageFragment extends SherlockFragment implements FileFrag * * @param imageView Target {@link ImageView} where the bitmap will be loaded into. */ - public BitmapLoader(ImageView imageView, TextView messageView) { + public BitmapLoader(ImageView imageView, TextView messageView, ProgressBar progressWheel) { mImageViewRef = new WeakReference(imageView); mMessageViewRef = new WeakReference(messageView); - mThrowable = null; + mProgressWheelRef = new WeakReference(progressWheel); } @@ -517,14 +529,6 @@ public class PreviewImageFragment extends SherlockFragment implements FileFrag int height = options.outHeight; int scale = 1; - /* - if (width >= 2048 || height >= 2048) { - // try to scale down the image to save memory - scale = (int) Math.ceil((Math.ceil(Math.max(height, width) / 2048.))); - options.inSampleSize = scale; - } - */ - Display display = getActivity().getWindowManager().getDefaultDisplay(); Point size = new Point(); int screenWidth; @@ -539,70 +543,91 @@ public class PreviewImageFragment extends SherlockFragment implements FileFrag } if (width > screenWidth) { - // second try to scale down the image , this time depending upon the screen size; WTF... - scale = (int) Math.ceil((float)width / screenWidth); - options.inSampleSize = scale; + // second try to scale down the image , this time depending upon the screen size + scale = (int) Math.floor((float)width / screenWidth); } if (height > screenHeight) { - scale = Math.max(scale, (int) Math.ceil((float)height / screenHeight)); + scale = Math.max(scale, (int) Math.floor((float)height / screenHeight)); } - + options.inSampleSize = scale; // really load the bitmap options.inJustDecodeBounds = false; // the next decodeFile call will be real result = BitmapFactory.decodeFile(storagePath, options); - //Log.d(TAG, "Image loaded - width: " + options.outWidth + ", loaded height: " + options.outHeight); + //Log_OC.d(TAG, "Image loaded - width: " + options.outWidth + ", loaded height: " + options.outHeight); + if (result == null) { + mErrorMessageId = R.string.preview_image_error_unknown_format; + Log_OC.e(TAG, "File could not be loaded as a bitmap: " + storagePath); + } + + } catch (OutOfMemoryError e) { + mErrorMessageId = R.string.preview_image_error_unknown_format; + Log_OC.e(TAG, "Out of memory occured for file " + storagePath, e); + + } catch (NoSuchFieldError e) { + mErrorMessageId = R.string.common_error_unknown; + Log_OC.e(TAG, "Error from access to unexisting field despite protection; file " + storagePath, e); + } catch (Throwable t) { - result = null; - mThrowable = t; // error processing is delayed to #onPostExecute(Bitmap) - Log.e(TAG, "Unexpected error while creating image preview " + storagePath, t); + mErrorMessageId = R.string.common_error_unknown; + Log_OC.e(TAG, "Unexpected error loading " + mFile.getStoragePath(), t); + } return result; } @Override protected void onPostExecute(Bitmap result) { - if (mImageViewRef != null && result != null) { + hideProgressWheel(); + if (result != null) { + showLoadedImage(result); + } else { + showErrorMessage(); + } + } + + private void showLoadedImage(Bitmap result) { + if (mImageViewRef != null) { final ImageView imageView = mImageViewRef.get(); if (imageView != null) { imageView.setImageBitmap(result); + imageView.setVisibility(View.VISIBLE); mBitmap = result; - if (mMessageViewRef != null) { - final TextView messageView = mMessageViewRef.get(); - if (messageView != null) { - messageView.setVisibility(View.GONE); - } - } } // else , silently finish, the fragment was destroyed - - } else if (mMessageViewRef != null && result == null) { - // error - int messageId; - if (mThrowable == null) { - messageId = R.string.preview_image_error_unknown_format; - Log.e(TAG, "File could not be loaded as a bitmap: " + mFile.getStoragePath()); - - } else if (mThrowable instanceof OutOfMemoryError) { - messageId = R.string.preview_image_error_unknown_format; - Log.e(TAG, "Out of memory occured for file " + mFile.getStoragePath(), mThrowable); - - } else if (mThrowable instanceof NoSuchFieldError) { - messageId = R.string.common_error_unknown; - Log.e(TAG, "Error from access to unexisting field despite protection; file " + mFile.getStoragePath(), mThrowable); - - } else { - messageId = R.string.common_error_unknown; - Log.e(TAG, "Unexpected error loading " + mFile.getStoragePath(), mThrowable); - } + } + if (mMessageViewRef != null) { + final TextView messageView = mMessageViewRef.get(); + if (messageView != null) { + messageView.setVisibility(View.GONE); + } // else , silently finish, the fragment was destroyed + } + } + + private void showErrorMessage() { + if (mImageViewRef != null) { + final ImageView imageView = mImageViewRef.get(); + if (imageView != null) { + // shows the default error icon + imageView.setVisibility(View.VISIBLE); + } // else , silently finish, the fragment was destroyed + } + if (mMessageViewRef != null) { final TextView messageView = mMessageViewRef.get(); if (messageView != null) { - messageView.setText(messageId); + messageView.setText(mErrorMessageId); messageView.setVisibility(View.VISIBLE); } // else , silently finish, the fragment was destroyed - } - + } + + private void hideProgressWheel() { + if (mProgressWheelRef != null) { + final ProgressBar progressWheel = mProgressWheelRef.get(); + if (progressWheel != null) { + progressWheel.setVisibility(View.GONE); + } + } } }