-/* ownCloud Android client application
- * Copyright (C) 2012-2013 ownCloud Inc.
+/**
+ * ownCloud Android client application
+ *
+ * @author David A. Velasco
+ * Copyright (C) 2015 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
*/
package com.owncloud.android.ui.preview;
-import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
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.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.ui.fragment.FileFragment;
+import com.owncloud.android.utils.FileStorageUtils;
/**
- * Adapter class that provides Fragment instances
- *
- * @author David A. Velasco
+ * Adapter class that provides Fragment instances
*/
//public class PreviewImagePagerAdapter extends PagerAdapter {
public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter {
- private static final String TAG = PreviewImagePagerAdapter.class.getSimpleName();
-
private Vector<OCFile> mImageFiles;
private Account mAccount;
private Set<Object> mObsoleteFragments;
private Set<Integer> mObsoletePositions;
- private DataStorageManager mStorageManager;
+ private Set<Integer> mDownloadErrors;
+ private FileDataStorageManager mStorageManager;
- /*
- private final FragmentManager mFragmentManager;
- private FragmentTransaction mCurTransaction = null;
- private ArrayList<Fragment.SavedState> mSavedState = new ArrayList<Fragment.SavedState>();
- private ArrayList<Fragment> mFragments = new ArrayList<Fragment>();
- private Fragment mCurrentPrimaryItem = null;
- */
+ private Map<Integer, FileFragment> mCachedFragments;
/**
* Constructor.
*
- * @param fragmentManager {@link FragmentManager} instance that will handle the {@link Fragment}s provided by the adapter.
+ * @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) {
+ public PreviewImagePagerAdapter(FragmentManager fragmentManager, OCFile parentFolder,
+ Account account, FileDataStorageManager storageManager /*,
+ boolean onlyOnDevice*/) {
super(fragmentManager);
if (fragmentManager == null) {
mAccount = account;
mStorageManager = storageManager;
- mImageFiles = mStorageManager.getDirectoryImages(parentFolder);
+ // TODO Enable when "On Device" is recovered ?
+ mImageFiles = mStorageManager.getFolderImages(parentFolder/*, false*/);
+
+ mImageFiles = FileStorageUtils.sortFolder(mImageFiles);
+
mObsoleteFragments = new HashSet<Object>();
mObsoletePositions = new HashSet<Integer>();
+ mDownloadErrors = new HashSet<Integer>();
//mFragmentManager = fragmentManager;
+ mCachedFragments = new HashMap<Integer, FileFragment>();
}
-
/**
* Returns the image files handled by the adapter.
OCFile file = mImageFiles.get(i);
Fragment fragment = null;
if (file.isDown()) {
- fragment = new PreviewImageFragment(file, mAccount, mObsoletePositions.contains(Integer.valueOf(i)));
+ fragment = PreviewImageFragment.newInstance(file,
+ mObsoletePositions.contains(Integer.valueOf(i)));
+
+ } else if (mDownloadErrors.contains(Integer.valueOf(i))) {
+ fragment = FileDownloadFragment.newInstance(file, mAccount, true);
+ ((FileDownloadFragment)fragment).setError(true);
+ mDownloadErrors.remove(Integer.valueOf(i));
+
} else {
- fragment = new FileDownloadFragment(file, mAccount, mObsoletePositions.contains(Integer.valueOf(i)));
+ fragment = FileDownloadFragment.newInstance(
+ file, mAccount, mObsoletePositions.contains(Integer.valueOf(i))
+ );
}
+ mObsoletePositions.remove(Integer.valueOf(i));
return fragment;
}
return mImageFiles.get(position).getFileName();
}
+
public void updateFile(int position, OCFile file) {
- mObsoleteFragments.add(instantiateItem(null, position));
+ FileFragment fragmentToUpdate = mCachedFragments.get(Integer.valueOf(position));
+ if (fragmentToUpdate != null) {
+ mObsoleteFragments.add(fragmentToUpdate);
+ }
mObsoletePositions.add(Integer.valueOf(position));
mImageFiles.set(position, file);
}
+
+ public void updateWithDownloadError(int position) {
+ FileFragment fragmentToUpdate = mCachedFragments.get(Integer.valueOf(position));
+ if (fragmentToUpdate != null) {
+ mObsoleteFragments.add(fragmentToUpdate);
+ }
+ mDownloadErrors.add(Integer.valueOf(position));
+ }
+
+ public void clearErrorAt(int position) {
+ FileFragment fragmentToUpdate = mCachedFragments.get(Integer.valueOf(position));
+ if (fragmentToUpdate != null) {
+ mObsoleteFragments.add(fragmentToUpdate);
+ }
+ mDownloadErrors.remove(Integer.valueOf(position));
+ }
+
+
@Override
public int getItemPosition(Object object) {
if (mObsoleteFragments.contains(object)) {
}
+ @Override
+ public Object instantiateItem(ViewGroup container, int position) {
+ Object fragment = super.instantiateItem(container, position);
+ mCachedFragments.put(Integer.valueOf(position), (FileFragment)fragment);
+ return fragment;
+ }
+
+ @Override
+ public void destroyItem(ViewGroup container, int position, Object object) {
+ mCachedFragments.remove(Integer.valueOf(position));
+ super.destroyItem(container, position, object);
+ }
+
+
+ public boolean pendingErrorAt(int position) {
+ return mDownloadErrors.contains(Integer.valueOf(position));
+ }
+
/**
- * Should not be used for not already started fragments...
- *
- * @return
+ * Reset the image zoom to default value for each CachedFragments
*/
- protected FileFragment getFragmentAt(int position) {
- try {
- return (FileFragment) instantiateItem(null, position);
-
- } catch (Exception e) {
- return null;
+ public void resetZoom() {
+ Iterator<FileFragment> entries = mCachedFragments.values().iterator();
+ while (entries.hasNext()) {
+ FileFragment fileFragment = (FileFragment) entries.next();
+ if (fileFragment instanceof PreviewImageFragment) {
+ ((PreviewImageFragment) fileFragment).getImageView().resetZoom();
+ }
}
}
-
/* -*
* Called when a change in the shown pages is going to start being made.
*
*- /
@Override
public void startUpdate(ViewGroup container) {
- Log.e(TAG, "** startUpdate");
+ Log_OC.e(TAG, "** startUpdate");
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
- Log.e(TAG, "** instantiateItem " + position);
+ Log_OC.e(TAG, "** instantiateItem " + position);
if (mFragments.size() > position) {
Fragment fragment = mFragments.get(position);
if (fragment != null) {
- Log.e(TAG, "** \t returning cached item");
+ Log_OC.e(TAG, "** \t returning cached item");
return fragment;
}
}
}
fragment.setMenuVisibility(false);
mFragments.set(position, fragment);
- //Log.e(TAG, "** \t adding fragment at position " + position + ", containerId " + container.getId());
+ //Log_OC.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);
+ Log_OC.e(TAG, "** destroyItem " + position);
Fragment fragment = (Fragment)object;
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
- Log.e(TAG, "** \t removing fragment at position " + position);
+ Log_OC.e(TAG, "** \t removing fragment at position " + position);
while (mSavedState.size() <= position) {
mSavedState.add(null);
}
@Override
public void finishUpdate(ViewGroup container) {
- Log.e(TAG, "** finishUpdate (start)");
+ Log_OC.e(TAG, "** finishUpdate (start)");
if (mCurTransaction != null) {
mCurTransaction.commitAllowingStateLoss();
mCurTransaction = null;
mFragmentManager.executePendingTransactions();
}
- Log.e(TAG, "** finishUpdate (end)");
+ Log_OC.e(TAG, "** finishUpdate (end)");
}
@Override
f.setMenuVisibility(false);
mFragments.set(index, f);
} else {
- Log.w(TAG, "Bad fragment at key " + key);
+ Log_OC.w(TAG, "Bad fragment at key " + key);
}
}
}