From fc2af5b03e9aeef0bcb985690dabb919984e874a Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Tue, 26 Feb 2013 12:33:28 +0100 Subject: [PATCH] Automatic preview after download in PreviewImageActivity --- AndroidManifest.xml | 2 +- .../android/ui/activity/FileDisplayActivity.java | 1 + .../android/ui/fragment/FileDownloadFragment.java | 43 +-- .../PreviewImageActivity.java | 117 +++------ .../PreviewImageFragment.java | 7 +- .../ui/preview/PreviewImagePagerAdapter.java | 288 +++++++++++++++++++++ 6 files changed, 354 insertions(+), 104 deletions(-) rename src/com/owncloud/android/ui/{activity => preview}/PreviewImageActivity.java (73%) rename src/com/owncloud/android/ui/{fragment => preview}/PreviewImageFragment.java (98%) create mode 100644 src/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f0dc61ba..218f20f8 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -86,7 +86,7 @@ - + . * */ -package com.owncloud.android.ui.activity; - -import java.util.Vector; +package com.owncloud.android.ui.preview; import android.accounts.Account; import android.app.Dialog; @@ -28,10 +26,6 @@ import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; -import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import android.util.Log; @@ -45,11 +39,9 @@ import com.owncloud.android.files.services.FileDownloader; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader; import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; +import com.owncloud.android.ui.activity.FileDetailActivity; import com.owncloud.android.ui.fragment.FileDetailFragment; -import com.owncloud.android.ui.fragment.FileDownloadFragment; import com.owncloud.android.ui.fragment.FileFragment; -import com.owncloud.android.ui.fragment.FilePreviewFragment; -import com.owncloud.android.ui.fragment.PreviewImageFragment; import com.owncloud.android.AccountUtils; import com.owncloud.android.R; @@ -78,7 +70,7 @@ public class PreviewImageActivity extends SherlockFragmentActivity implements Fi private FileDownloaderBinder mDownloaderBinder = null; private ServiceConnection mDownloadConnection, mUploadConnection = null; private FileUploaderBinder mUploaderBinder = null; - private boolean mWaitingToPreview; + private OCFile mWaitingToPreview = null; @Override @@ -113,76 +105,35 @@ public class PreviewImageActivity extends SherlockFragmentActivity implements Fi createViewPager(); if (savedInstanceState == null) { - mWaitingToPreview = false; + mWaitingToPreview = (mFile.isDown())?null:mFile; } else { - mWaitingToPreview = savedInstanceState.getBoolean(KEY_WAITING_TO_PREVIEW); + mWaitingToPreview = (OCFile) savedInstanceState.getParcelable(KEY_WAITING_TO_PREVIEW); } - mDownloadConnection = new DetailsServiceConnection(); + mDownloadConnection = new PreviewImageServiceConnection(); bindService(new Intent(this, FileDownloader.class), mDownloadConnection, Context.BIND_AUTO_CREATE); - mUploadConnection = new DetailsServiceConnection(); + mUploadConnection = new PreviewImageServiceConnection(); bindService(new Intent(this, FileUploader.class), mUploadConnection, Context.BIND_AUTO_CREATE); } private void createViewPager() { - mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(), mParentFolder); + mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(), mParentFolder, mAccount, mStorageManager); mViewPager = (ViewPager) findViewById(R.id.fragmentPager); mViewPager.setAdapter(mPreviewImagePagerAdapter); mViewPager.setOnPageChangeListener(this); } - /** - * Adapter class that provides Fragment instances - * - * @author David A. Velasco - */ - public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter { - - Vector mImageFiles; - - public PreviewImagePagerAdapter(FragmentManager fm, OCFile parentFolder) { - super(fm); - mImageFiles = mStorageManager.getDirectoryImages(parentFolder); - } - - @Override - public Fragment getItem(int i) { - Log.e(TAG, "GETTING PAGE " + i); - OCFile file = mImageFiles.get(i); - Fragment fragment = null; - if (file.isDown()) { - fragment = new PreviewImageFragment(file, mAccount); - mWaitingToPreview = false; - } else { - fragment = new FileDownloadFragment(file, mAccount); // TODO - //mWaitingToPreview = true; - } - return fragment; - } - - @Override - public int getCount() { - return mImageFiles.size(); - } - - @Override - public CharSequence getPageTitle(int position) { - return mImageFiles.get(position).getFileName(); - } - } - - @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - outState.putBoolean(KEY_WAITING_TO_PREVIEW, mWaitingToPreview); + outState.putParcelable(KEY_WAITING_TO_PREVIEW, mWaitingToPreview); } /** Defines callbacks for service binding, passed to bindService() */ - private class DetailsServiceConnection implements ServiceConnection { + private class PreviewImageServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName component, IBinder service) { @@ -190,9 +141,6 @@ public class PreviewImageActivity extends SherlockFragmentActivity implements Fi if (component.equals(new ComponentName(PreviewImageActivity.this, FileDownloader.class))) { Log.d(TAG, "Download service connected"); mDownloaderBinder = (FileDownloaderBinder) service; - if (mWaitingToPreview) { - requestForDownload(); - } } else if (component.equals(new ComponentName(PreviewImageActivity.this, FileUploader.class))) { Log.d(TAG, "Upload service connected"); @@ -201,21 +149,15 @@ public class PreviewImageActivity extends SherlockFragmentActivity implements Fi return; } - Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG); - FileDetailFragment detailsFragment = (fragment instanceof FileDetailFragment) ? (FileDetailFragment) fragment : null; - if (detailsFragment != null) { - detailsFragment.listenForTransferProgress(); - detailsFragment.updateFileDetails(mWaitingToPreview); // let the fragment gets the mDownloadBinder through getDownloadBinder() (see FileDetailFragment#updateFileDetais()) - } } @Override public void onServiceDisconnected(ComponentName component) { if (component.equals(new ComponentName(PreviewImageActivity.this, FileDownloader.class))) { - Log.d(TAG, "Download service disconnected"); + Log.d(TAG, "Download service suddenly disconnected"); mDownloaderBinder = null; } else if (component.equals(new ComponentName(PreviewImageActivity.this, FileUploader.class))) { - Log.d(TAG, "Upload service disconnected"); + Log.d(TAG, "Upload service suddenly disconnected"); mUploaderBinder = null; } } @@ -256,10 +198,6 @@ public class PreviewImageActivity extends SherlockFragmentActivity implements Fi @Override protected void onResume() { super.onResume(); - Fragment fragment = getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG); - if (fragment != null && fragment instanceof FileDetailFragment) { - ((FileDetailFragment) fragment).updateFileDetails(false); - } } @@ -330,10 +268,11 @@ public class PreviewImageActivity extends SherlockFragmentActivity implements Fi private void requestForDownload() { - if (!mDownloaderBinder.isDownloading(mAccount, mFile)) { + Log.e(TAG, "REQUEST FOR DOWNLOAD : " + mWaitingToPreview.getFileName()); + if (!mDownloaderBinder.isDownloading(mAccount, mWaitingToPreview)) { Intent i = new Intent(this, FileDownloader.class); i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount); - i.putExtra(FileDownloader.EXTRA_FILE, mFile); + i.putExtra(FileDownloader.EXTRA_FILE, mWaitingToPreview); startService(i); } } @@ -341,11 +280,16 @@ public class PreviewImageActivity extends SherlockFragmentActivity implements Fi @Override public void notifySuccessfulDownload(OCFile file, Intent intent, boolean success) { if (success) { - if (mWaitingToPreview) { - FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - transaction.replace(R.id.fragment, new FilePreviewFragment(file, mAccount), FileDetailFragment.FTAG); - transaction.commit(); - mWaitingToPreview = false; + if (mWaitingToPreview != null && mWaitingToPreview.equals(file)) { + mWaitingToPreview = null; + int position = mViewPager.getCurrentItem(); + mPreviewImagePagerAdapter.updateFile(position, file); + Log.e(TAG, "BEFORE NOTIFY DATA SET CHANGED"); + mPreviewImagePagerAdapter.notifyDataSetChanged(); + Log.e(TAG, "AFTER NOTIFY DATA SET CHANGED"); + //Log.e(TAG, "BEFORE INVALIDATE"); + //mViewPager.postInvalidate(); + //Log.e(TAG, "AFTER INVALIDATE"); } } } @@ -358,8 +302,15 @@ public class PreviewImageActivity extends SherlockFragmentActivity implements Fi */ @Override public void onPageSelected(int position) { - OCFile currentFile = ((FileFragment)mPreviewImagePagerAdapter.getItem(position)).getFile(); + OCFile currentFile = mPreviewImagePagerAdapter.getFileAt(position); getSupportActionBar().setTitle(currentFile.getFileName()); + if (currentFile.isDown()) { + mWaitingToPreview = null; + } else { + mWaitingToPreview = currentFile; + requestForDownload(); + mViewPager.invalidate(); + } } /** diff --git a/src/com/owncloud/android/ui/fragment/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java similarity index 98% rename from src/com/owncloud/android/ui/fragment/PreviewImageFragment.java rename to src/com/owncloud/android/ui/preview/PreviewImageFragment.java index d6ba33bb..4d6ad2d0 100644 --- a/src/com/owncloud/android/ui/fragment/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -15,7 +15,7 @@ * along with this program. If not, see . * */ -package com.owncloud.android.ui.fragment; +package com.owncloud.android.ui.preview; import java.io.File; import java.lang.ref.WeakReference; @@ -56,7 +56,10 @@ import com.owncloud.android.operations.OnRemoteOperationListener; import com.owncloud.android.operations.RemoteOperation; import com.owncloud.android.operations.RemoteOperationResult; import com.owncloud.android.operations.RemoveFileOperation; -import com.owncloud.android.ui.activity.PreviewImageActivity; +import com.owncloud.android.ui.fragment.ConfirmationDialogFragment; +import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.ui.fragment.ConfirmationDialogFragment.ConfirmationDialogFragmentListener; +import com.owncloud.android.ui.fragment.FileFragment.ContainerActivity; import com.owncloud.android.R; import eu.alefzero.webdav.WebdavClient; diff --git a/src/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java b/src/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java new file mode 100644 index 00000000..22aa4953 --- /dev/null +++ b/src/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java @@ -0,0 +1,288 @@ +/* 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 as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * 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 . + * + */ +package com.owncloud.android.ui.preview; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; +import java.util.Vector; + +import android.accounts.Account; +import android.os.Bundle; +import android.os.Parcelable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.view.PagerAdapter; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; + +import com.owncloud.android.datamodel.DataStorageManager; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.ui.fragment.FileDownloadFragment; + +/** + * Adapter class that provides Fragment instances + * + * @author David A. Velasco + */ +//public class PreviewImagePagerAdapter extends PagerAdapter { +public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter { + + private static final String TAG = PreviewImagePagerAdapter.class.getSimpleName(); + + private Vector mImageFiles; + private Account mAccount; + private Set mObsoleteFragments; + private DataStorageManager mStorageManager; + + /* + private final FragmentManager mFragmentManager; + private FragmentTransaction mCurTransaction = null; + private ArrayList mSavedState = new ArrayList(); + private ArrayList mFragments = new ArrayList(); + private Fragment mCurrentPrimaryItem = null; + */ + + /** + * Constructor. + * + * @param fragmentManager {@link FragmentManager} instance that will handle the {@link Fragment}s provided by the adapter. + * @param parentFolder Folder where images will be searched for. + * @param storageManager Bridge to database. + */ + public PreviewImagePagerAdapter(FragmentManager fragmentManager, OCFile parentFolder, Account account, DataStorageManager storageManager) { + super(fragmentManager); + + if (fragmentManager == null) { + throw new IllegalArgumentException("NULL FragmentManager instance"); + } + if (parentFolder == null) { + throw new IllegalArgumentException("NULL parent folder"); + } + if (storageManager == null) { + throw new IllegalArgumentException("NULL storage manager"); + } + + mAccount = account; + mStorageManager = storageManager; + mImageFiles = mStorageManager.getDirectoryImages(parentFolder); + mObsoleteFragments = new HashSet(); + } + + + /** + * Returns the image files handled by the adapter. + * + * @return A vector with the image files handled by the adapter. + */ + protected OCFile getFileAt(int position) { + return mImageFiles.get(position); + } + + + public Fragment getItem(int i) { + Log.e(TAG, "GETTING PAGE " + i); + OCFile file = mImageFiles.get(i); + Fragment fragment = null; + if (file.isDown()) { + fragment = new PreviewImageFragment(file, mAccount); + } else { + fragment = new FileDownloadFragment(file, mAccount); + } + return fragment; + } + + @Override + public int getCount() { + return mImageFiles.size(); + } + + @Override + public CharSequence getPageTitle(int position) { + return mImageFiles.get(position).getFileName(); + } + + public void updateFile(int position, OCFile file) { + mImageFiles.set(position, file); + mObsoleteFragments.add(instantiateItem(null, position)); + } + + @Override + public int getItemPosition(Object object) { + Log.e(TAG, "getItemPosition "); + if (mObsoleteFragments.contains(object)) { + return POSITION_NONE; + } + return super.getItemPosition(object); + } + + /* * + * Called when a change in the shown pages is going to start being made. + * + * @param container The containing View which is displaying this adapter's page views. + * -/ + @Override + public void startUpdate(ViewGroup container) { + Log.e(TAG, "** startUpdate"); + } + + @Override + public Object instantiateItem(ViewGroup container, int position) { + Log.e(TAG, "** instantiateItem " + position); + + if (mFragments.size() > position) { + Fragment fragment = mFragments.get(position); + if (fragment != null) { + Log.e(TAG, "** \t returning cached item"); + return fragment; + } + } + + if (mCurTransaction == null) { + mCurTransaction = mFragmentManager.beginTransaction(); + } + + Fragment fragment = getItem(position); + if (mSavedState.size() > position) { + Fragment.SavedState savedState = mSavedState.get(position); + if (savedState != null) { + // TODO WATCH OUT: + // * The Fragment must currently be attached to the FragmentManager. + // * A new Fragment created using this saved state must be the same class type as the Fragment it was created from. + // * The saved state can not contain dependencies on other fragments -- that is it can't use putFragment(Bundle, String, Fragment) + // to store a fragment reference + fragment.setInitialSavedState(savedState); + } + } + while (mFragments.size() <= position) { + mFragments.add(null); + } + fragment.setMenuVisibility(false); + mFragments.set(position, fragment); + Log.e(TAG, "** \t adding fragment at position " + position + ", containerId " + container.getId()); + mCurTransaction.add(container.getId(), fragment); + + return fragment; + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + Log.e(TAG, "** destroyItem " + position); + Fragment fragment = (Fragment)object; + + if (mCurTransaction == null) { + mCurTransaction = mFragmentManager.beginTransaction(); + } + Log.e(TAG, "** \t removing fragment at position " + position); + while (mSavedState.size() <= position) { + mSavedState.add(null); + } + mSavedState.set(position, mFragmentManager.saveFragmentInstanceState(fragment)); + mFragments.set(position, null); + + mCurTransaction.remove(fragment); + } + + @Override + public void setPrimaryItem(ViewGroup container, int position, Object object) { + Fragment fragment = (Fragment)object; + if (fragment != mCurrentPrimaryItem) { + if (mCurrentPrimaryItem != null) { + mCurrentPrimaryItem.setMenuVisibility(false); + } + if (fragment != null) { + fragment.setMenuVisibility(true); + } + mCurrentPrimaryItem = fragment; + } + } + + @Override + public void finishUpdate(ViewGroup container) { + Log.e(TAG, "** finishUpdate (start)"); + if (mCurTransaction != null) { + mCurTransaction.commitAllowingStateLoss(); + mCurTransaction = null; + mFragmentManager.executePendingTransactions(); + } + Log.e(TAG, "** finishUpdate (end)"); + } + + @Override + public boolean isViewFromObject(View view, Object object) { + return ((Fragment)object).getView() == view; + } + + @Override + public Parcelable saveState() { + Bundle state = null; + if (mSavedState.size() > 0) { + state = new Bundle(); + Fragment.SavedState[] savedStates = new Fragment.SavedState[mSavedState.size()]; + mSavedState.toArray(savedStates); + state.putParcelableArray("states", savedStates); + } + for (int i=0; i keys = bundle.keySet(); + for (String key: keys) { + if (key.startsWith("f")) { + int index = Integer.parseInt(key.substring(1)); + Fragment f = mFragmentManager.getFragment(bundle, key); + if (f != null) { + while (mFragments.size() <= index) { + mFragments.add(null); + } + f.setMenuVisibility(false); + mFragments.set(index, f); + } else { + Log.w(TAG, "Bad fragment at key " + key); + } + } + } + } + } */ + +} -- 2.11.0