X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/054180baa7ba0436409ed34778a37dd0afeff6b8..9b9b02c384b4453b3debd703c52e24b6136540f8:/src/eu/alefzero/owncloud/ui/fragment/FileDetailFragment.java diff --git a/src/eu/alefzero/owncloud/ui/fragment/FileDetailFragment.java b/src/eu/alefzero/owncloud/ui/fragment/FileDetailFragment.java index 1ab92842..505ff6c7 100644 --- a/src/eu/alefzero/owncloud/ui/fragment/FileDetailFragment.java +++ b/src/eu/alefzero/owncloud/ui/fragment/FileDetailFragment.java @@ -17,21 +17,18 @@ */ package eu.alefzero.owncloud.ui.fragment; -import java.util.List; - import android.accounts.Account; import android.accounts.AccountManager; -import android.app.ActionBar.LayoutParams; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; -import android.graphics.Path.FillType; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.util.Log; @@ -49,10 +46,8 @@ import com.actionbarsherlock.app.SherlockFragment; import eu.alefzero.owncloud.DisplayUtils; import eu.alefzero.owncloud.R; -import eu.alefzero.owncloud.authenticator.AccountAuthenticator; import eu.alefzero.owncloud.datamodel.OCFile; import eu.alefzero.owncloud.files.services.FileDownloader; -import eu.alefzero.owncloud.utils.OwnCloudVersion; /** * This Fragment is used to display the details about a file. @@ -64,48 +59,80 @@ public class FileDetailFragment extends SherlockFragment implements OnClickListener { public static final String EXTRA_FILE = "FILE"; + public static final String EXTRA_ACCOUNT = "ACCOUNT"; - private DownloadFinishReceiver mDownloadFinishReceiver; - private Intent mIntent; private int mLayout; private View mView; private OCFile mFile; + private Account mAccount; + + private DownloadFinishReceiver mDownloadFinishReceiver; + private static final String TAG = "FileDetailFragment"; + public static final String FTAG = "FileDetails"; + /** - * Default constructor - contains real layout + * Creates an empty details fragment. + * + * It's necessary to keep a public constructor without parameters; the system uses it when tries to reinstantiate a fragment automatically. */ - public FileDetailFragment(){ - mLayout = R.layout.file_details_fragment; + public FileDetailFragment() { + mFile = null; + mAccount = null; + mLayout = R.layout.file_details_empty; } + /** - * Creates a dummy layout. For use if the user never has - * tapped on a file before + * Creates a details fragment. * - * @param useEmptyView If true, use empty layout + * When 'fileToDetail' or 'ocAccount' are null, creates a dummy layout (to use when a file wasn't tapped before). + * + * @param fileToDetail An {@link OCFile} to show in the fragment + * @param ocAccount An ownCloud account; needed to start downloads */ - public FileDetailFragment(boolean useEmptyView){ - if(useEmptyView){ - mLayout = R.layout.file_details_empty; - } else { + public FileDetailFragment(OCFile fileToDetail, Account ocAccount){ + mFile = fileToDetail; + mAccount = ocAccount; + mLayout = R.layout.file_details_empty; + + if(fileToDetail != null && ocAccount != null) { mLayout = R.layout.file_details_fragment; } } - /** - * Use this when creating the fragment and display - * a file at the same time - * - * @param showDetailsIntent The Intent with the required parameters - * @see FileDetailFragment#updateFileDetails(Intent) - */ - public FileDetailFragment(Intent showDetailsIntent) { - mIntent = showDetailsIntent; - mLayout = R.layout.file_details_fragment; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + + if (savedInstanceState != null) { + mFile = savedInstanceState.getParcelable(FileDetailFragment.EXTRA_FILE); + mAccount = savedInstanceState.getParcelable(FileDetailFragment.EXTRA_ACCOUNT); + } + + View view = null; + view = inflater.inflate(mLayout, container, false); + mView = view; + + updateFileDetails(); + return view; } + @Override + public void onSaveInstanceState(Bundle outState) { + Log.i(getClass().toString(), "onSaveInstanceState() start"); + super.onSaveInstanceState(outState); + outState.putParcelable(FileDetailFragment.EXTRA_FILE, mFile); + outState.putParcelable(FileDetailFragment.EXTRA_ACCOUNT, mAccount); + Log.i(getClass().toString(), "onSaveInstanceState() end"); + } + + + @Override public void onResume() { super.onResume(); mDownloadFinishReceiver = new DownloadFinishReceiver(); @@ -122,23 +149,6 @@ public class FileDetailFragment extends SherlockFragment implements } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View view = null; - view = inflater.inflate(mLayout, container, false); - mView = view; - if(mLayout == R.layout.file_details_fragment){ - // Phones will launch an activity with this intent - if(mIntent == null){ - mIntent = getActivity().getIntent(); - } - updateFileDetails(); - } - - return view; - } - - @Override public View getView() { return super.getView() == null ? mView : super.getView(); } @@ -147,14 +157,25 @@ public class FileDetailFragment extends SherlockFragment implements public void onClick(View v) { Toast.makeText(getActivity(), "Downloading", Toast.LENGTH_LONG).show(); Intent i = new Intent(getActivity(), FileDownloader.class); - i.putExtra(FileDownloader.EXTRA_ACCOUNT, - mIntent.getParcelableExtra(FileDownloader.EXTRA_ACCOUNT)); + i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount); i.putExtra(FileDownloader.EXTRA_REMOTE_PATH, mFile.getRemotePath()); i.putExtra(FileDownloader.EXTRA_FILE_PATH, mFile.getURLDecodedRemotePath()); i.putExtra(FileDownloader.EXTRA_FILE_SIZE, mFile.getFileLength()); + v.setEnabled(false); getActivity().startService(i); } + + /** + * Check if the fragment was created with an empty layout. An empty fragment can't show file details, must be replaced. + * + * @return True when the fragment was created with the empty layout. + */ + public boolean isEmpty() { + return mLayout == R.layout.file_details_empty; + } + + /** * Can be used to get the file that is currently being displayed. * @return The file on the screen. @@ -166,27 +187,23 @@ public class FileDetailFragment extends SherlockFragment implements /** * Use this method to signal this Activity that it shall update its view. * - * @param intent The {@link Intent} that contains extra information about - * this file The intent needs to have these extras: - *
- * - * {@link FileDetailFragment#EXTRA_FILE}: An {@link OCFile} - * {@link FileDownloader#EXTRA_ACCOUNT}: The Account that file - * belongs to (required for downloading) + * @param file : An {@link OCFile} */ - public void updateFileDetails(Intent intent) { - mIntent = intent; + public void updateFileDetails(OCFile file, Account ocAccount) { + mFile = file; + mAccount = ocAccount; updateFileDetails(); } + /** * Updates the view with all relevant details about that file. */ - private void updateFileDetails() { - mFile = mIntent.getParcelableExtra(EXTRA_FILE); - Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn); + public void updateFileDetails() { - if (mFile != null) { + if (mFile != null && mAccount != null && mLayout == R.layout.file_details_fragment) { + + Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn); // set file details setFilename(mFile.getFileName()); setFiletype(DisplayUtils.convertMIMEtoPrettyPrint(mFile @@ -198,8 +215,8 @@ public class FileDetailFragment extends SherlockFragment implements setTimeModified(mFile.getModificationTimestamp()); - // Update preview if (mFile.getStoragePath() != null) { + // Update preview ImageView preview = (ImageView) getView().findViewById(R.id.fdPreview); try { if (mFile.getMimetype().startsWith("image/")) { @@ -215,17 +232,21 @@ public class FileDetailFragment extends SherlockFragment implements Bitmap bmp = BitmapFactory.decodeFile(mFile.getStoragePath(), options); - int width = options.outWidth; - int height = options.outHeight; - int scale = 1; - if (width >= 2048 || height >= 2048) { - scale = (int) (Math.ceil(Math.max(height, width)/2048.)); - options.inSampleSize = scale; - bmp.recycle(); + if (bmp != null) { + int width = options.outWidth; + int height = options.outHeight; + int scale = 1; + if (width >= 2048 || height >= 2048) { + scale = (int) (Math.ceil(Math.max(height, width)/2048.)); + options.inSampleSize = scale; + bmp.recycle(); - bmp = BitmapFactory.decodeFile(mFile.getStoragePath(), options); + bmp = BitmapFactory.decodeFile(mFile.getStoragePath(), options); + } + } + if (bmp != null) { + preview.setImageBitmap(bmp); } - preview.setImageBitmap(bmp); } } catch (OutOfMemoryError e) { preview.setVisibility(View.INVISIBLE); @@ -239,6 +260,8 @@ public class FileDetailFragment extends SherlockFragment implements preview.setVisibility(View.INVISIBLE); Log.e(TAG, "Unexpected error while creating image preview " + mFile.getFileLength(), t); } + + // Change download button to open button downloadButton.setText(R.string.filedetails_open); downloadButton.setOnClickListener(new OnClickListener() { @Override @@ -257,7 +280,7 @@ public class FileDetailFragment extends SherlockFragment implements try { Intent i = new Intent(Intent.ACTION_VIEW); mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1)); - if (mimeType != mFile.getMimetype()) { + if (mimeType != null && !mimeType.equals(mFile.getMimetype())) { i.setDataAndType(Uri.parse("file://"+mFile.getStoragePath()), mimeType); i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); startActivity(i); @@ -289,6 +312,7 @@ public class FileDetailFragment extends SherlockFragment implements } } + /** * Updates the filename in view * @param filename to set @@ -349,20 +373,17 @@ public class FileDetailFragment extends SherlockFragment implements * the time that the file was created. There is a chance that this will * be fixed in future versions. Use this method to check if this version of * ownCloud has this fix. - * @return True, if ownCloud the ownCloud version is supporting creationg time + * @return True, if ownCloud the ownCloud version is supporting creation time */ private boolean ocVersionSupportsTimeCreated(){ - if(mIntent != null){ - Account ocAccount = mIntent.getParcelableExtra(FileDownloader.EXTRA_ACCOUNT); - if(ocAccount != null){ - AccountManager accManager = (AccountManager) getActivity().getSystemService(Context.ACCOUNT_SERVICE); - OwnCloudVersion ocVersion = new OwnCloudVersion(accManager - .getUserData(ocAccount, AccountAuthenticator.KEY_OC_VERSION)); - if(ocVersion.compareTo(new OwnCloudVersion(0x030000)) < 0) { - return true; - } + /*if(mAccount != null){ + AccountManager accManager = (AccountManager) getActivity().getSystemService(Context.ACCOUNT_SERVICE); + OwnCloudVersion ocVersion = new OwnCloudVersion(accManager + .getUserData(mAccount, AccountAuthenticator.KEY_OC_VERSION)); + if(ocVersion.compareTo(new OwnCloudVersion(0x030000)) < 0) { + return true; } - } + }*/ return false; } @@ -373,15 +394,16 @@ public class FileDetailFragment extends SherlockFragment implements private class DownloadFinishReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { + getView().findViewById(R.id.fdDownloadBtn).setEnabled(true); if (intent.getAction().equals(FileDownloader.BAD_DOWNLOAD_MESSAGE)) { Toast.makeText(context, R.string.downloader_download_failed , Toast.LENGTH_SHORT).show(); } else if (intent.getAction().equals(FileDownloader.DOWNLOAD_FINISH_MESSAGE)) { - ((OCFile)mIntent.getParcelableExtra(EXTRA_FILE)).setStoragePath(intent.getStringExtra(FileDownloader.EXTRA_FILE_PATH)); - updateFileDetails(mIntent); + mFile.setStoragePath(intent.getStringExtra(FileDownloader.EXTRA_FILE_PATH)); + updateFileDetails(); } } } - + }