Forráskód Böngészése

Automatic preview after download in PreviewImageActivity

David A. Velasco 12 éve
szülő
commit
fc2af5b03e

+ 1 - 1
AndroidManifest.xml

@@ -86,7 +86,7 @@
         <activity android:name=".ui.activity.PreferencesNewSessionewSession" >
         </activity>
         
-		<activity	android:name="com.owncloud.android.ui.activity.PreviewImageActivity" />
+		<activity	android:name="com.owncloud.android.ui.preview.PreviewImageActivity" />
 		        
         <activity	android:name="com.owncloud.android.ui.activity.PreviewVideoActivity"
 					android:label="@string/app_name"

+ 1 - 0
src/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -92,6 +92,7 @@ import com.owncloud.android.ui.fragment.FileDetailFragment;
 import com.owncloud.android.ui.fragment.FileFragment;
 import com.owncloud.android.ui.fragment.FilePreviewFragment;
 import com.owncloud.android.ui.fragment.OCFileListFragment;
+import com.owncloud.android.ui.preview.PreviewImageActivity;
 
 import com.owncloud.android.R;
 import eu.alefzero.webdav.WebdavClient;

+ 25 - 18
src/com/owncloud/android/ui/fragment/FileDownloadFragment.java

@@ -65,6 +65,7 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
     
     private DownloadFinishReceiver mDownloadFinishReceiver;
     public ProgressListener mProgressListener;
+    private boolean mListening;
     
     private static final String TAG = FileDownloadFragment.class.getSimpleName();
 
@@ -79,6 +80,7 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
         mAccount = null;
         mStorageManager = null;
         mProgressListener = null;
+        mListening = false;
     }
     
     
@@ -95,6 +97,7 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
         mAccount = ocAccount;
         mStorageManager = null; // we need a context to init this; the container activity is not available yet at this moment 
         mProgressListener = null;
+        mListening = false;
     }
     
     
@@ -123,7 +126,7 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
         view = inflater.inflate(R.layout.file_download_fragment, container, false);
         mView = view;
         
-        ProgressBar progressBar = (ProgressBar)mView.findViewById(R.id.fdProgressBar);
+        ProgressBar progressBar = (ProgressBar)mView.findViewById(R.id.progressBar);
         mProgressListener = new ProgressListener(progressBar);
         
         return view;
@@ -136,6 +139,7 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
     @Override
     public void onAttach(Activity activity) {
         super.onAttach(activity);
+        Log.e(TAG, "PREVIEW_DOWNLOAD_FRAGMENT ONATTACH " + ((mFile == null)?" (NULL)":mFile.getFileName()));
         try {
             mContainerActivity = (ContainerActivity) activity;
             
@@ -151,6 +155,7 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
+        Log.e(TAG, "PREVIEW_DOWNLOAD_FRAGMENT ONACTIVITYCREATED " + ((mFile == null)?" (NULL)":mFile.getFileName()));
         if (mAccount != null) {
             mStorageManager = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());;
         }
@@ -209,6 +214,9 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
     
     @Override
     public View getView() {
+        if (!mListening) {
+            listenForTransferProgress();
+        }
         return super.getView() == null ? mView : super.getView();
     }
 
@@ -244,11 +252,14 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
     
     /**
      * Updates the view depending upon the state of the downloading file.
+     * 
+     * @param   transferring    When true, the view must be updated assuming that the holded file is 
+     *                          downloading, no matter what the downloaderBinder says.
      */
-    public void updateView() {
+    public void updateView(boolean transferring) {
         // configure UI for depending upon local state of the file
         FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();
-        if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, mFile)) {
+        if (transferring || (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, mFile))) {
             setButtonsForTransferring();
             
         } else if (mFile.isDown()) {
@@ -270,9 +281,9 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
         downloadButton.setText(R.string.common_cancel);
     
         // show the progress bar for the transfer
-        ProgressBar progressBar = (ProgressBar)getView().findViewById(R.id.fdProgressBar);
+        ProgressBar progressBar = (ProgressBar)getView().findViewById(R.id.progressBar);
         progressBar.setVisibility(View.VISIBLE);
-        TextView progressText = (TextView)getView().findViewById(R.id.fdProgressText);
+        TextView progressText = (TextView)getView().findViewById(R.id.progressText);
         progressText.setText(R.string.downloader_download_in_progress_ticker);
     }
     
@@ -285,11 +296,11 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
         downloadButton.setVisibility(View.GONE);
     
         // hides the progress bar
-        ProgressBar progressBar = (ProgressBar)getView().findViewById(R.id.fdProgressBar);
+        ProgressBar progressBar = (ProgressBar)getView().findViewById(R.id.progressBar);
         progressBar.setVisibility(View.GONE);
         
         // updates the text message
-        TextView progressText = (TextView)getView().findViewById(R.id.fdProgressText);
+        TextView progressText = (TextView)getView().findViewById(R.id.progressText);
         progressText.setText(R.string.common_loading);
     }
 
@@ -303,11 +314,11 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
         //downloadButton.setText(R.string.filedetails_download);
         
         // hides the progress bar
-        ProgressBar progressBar = (ProgressBar)getView().findViewById(R.id.fdProgressBar);
+        ProgressBar progressBar = (ProgressBar)getView().findViewById(R.id.progressBar);
         progressBar.setVisibility(View.GONE);
         
         // updates the text message
-        TextView progressText = (TextView)getView().findViewById(R.id.fdProgressText);
+        TextView progressText = (TextView)getView().findViewById(R.id.progressText);
         progressText.setText(R.string.downloader_not_downloaded_yet);
     }
     
@@ -326,9 +337,9 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
                     if (downloadWasFine) {
                         mFile = mStorageManager.getFileByPath(downloadedRemotePath);
                     }
-                    mContainerActivity.notifySuccessfulDownload(mFile, intent, downloadWasFine);
+                    updateView(false);
                     getActivity().removeStickyBroadcast(intent);
-                    updateView();
+                    mContainerActivity.notifySuccessfulDownload(mFile, intent, downloadWasFine);
                 }
             }
         }
@@ -336,12 +347,11 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
     
     
     public void listenForTransferProgress() {
-        if (mProgressListener != null) {
+        if (mProgressListener != null && !mListening) {
             if (mContainerActivity.getFileDownloaderBinder() != null) {
                 mContainerActivity.getFileDownloaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, mFile);
-            }
-            if (mContainerActivity.getFileUploaderBinder() != null) {
-                mContainerActivity.getFileUploaderBinder().addDatatransferProgressListener(mProgressListener, mAccount, mFile);
+                mListening = true;
+                setButtonsForTransferring();
             }
         }
     }
@@ -352,9 +362,6 @@ public class FileDownloadFragment extends SherlockFragment implements OnClickLis
             if (mContainerActivity.getFileDownloaderBinder() != null) {
                 mContainerActivity.getFileDownloaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, mFile);
             }
-            if (mContainerActivity.getFileUploaderBinder() != null) {
-                mContainerActivity.getFileUploaderBinder().removeDatatransferProgressListener(mProgressListener, mAccount, mFile);
-            }
         }
     }
 

+ 34 - 83
src/com/owncloud/android/ui/activity/PreviewImageActivity.java → src/com/owncloud/android/ui/preview/PreviewImageActivity.java

@@ -3,7 +3,7 @@
  *
  *   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 3 of the License, or
+ *   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,
@@ -15,9 +15,7 @@
  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  */
-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<OCFile> 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();
+        }
     }
     
     /**

+ 5 - 2
src/com/owncloud/android/ui/fragment/PreviewImageFragment.java → src/com/owncloud/android/ui/preview/PreviewImageFragment.java

@@ -15,7 +15,7 @@
  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  */
-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;

+ 288 - 0
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 <http://www.gnu.org/licenses/>.
+ *
+ */
+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<OCFile> mImageFiles;
+    private Account mAccount;
+    private Set<Object> mObsoleteFragments;
+    private DataStorageManager 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;
+    */
+
+    /**
+     * 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<Object>();
+    }
+
+    
+    /**
+     * 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<mFragments.size(); i++) {
+            Fragment fragment = mFragments.get(i);
+            if (fragment != null) {
+                if (state == null) {
+                    state = new Bundle();
+                }
+                String key = "f" + i;
+                mFragmentManager.putFragment(state, key, fragment);
+            }
+        }
+        return state;
+    }
+
+    @Override
+    public void restoreState(Parcelable state, ClassLoader loader) {
+        if (state != null) {
+            Bundle bundle = (Bundle)state;
+            bundle.setClassLoader(loader);
+            Parcelable[] states = bundle.getParcelableArray("states");
+            mSavedState.clear();
+            mFragments.clear();
+            if (states != null) {
+                for (int i=0; i<states.length; i++) {
+                    mSavedState.add((Fragment.SavedState)states[i]);
+                }
+            }
+            Iterable<String> 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);
+                    }
+                }
+            }
+        }
+    } */
+    
+}