Refactoring of main Activities and Fragments to avoid inconsistent states leading...
authorDavid A. Velasco <dvelasco@solidgear.es>
Wed, 4 Jul 2012 12:38:52 +0000 (14:38 +0200)
committerDavid A. Velasco <dvelasco@solidgear.es>
Wed, 4 Jul 2012 12:38:52 +0000 (14:38 +0200)
AndroidManifest.xml
src/eu/alefzero/owncloud/ui/activity/FileDetailActivity.java
src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java
src/eu/alefzero/owncloud/ui/fragment/FileDetailFragment.java
src/eu/alefzero/owncloud/ui/fragment/FileListFragment.java

index 16c4472..d2d03e6 100644 (file)
@@ -18,7 +18,7 @@
  -->\r
 <manifest package="eu.alefzero.owncloud"\r
     android:versionCode="1"\r
-    android:versionName="0.1.142B" xmlns:android="http://schemas.android.com/apk/res/android">\r
+    android:versionName="0.1.143B" xmlns:android="http://schemas.android.com/apk/res/android">\r
 \r
     <uses-permission android:name="android.permission.GET_ACCOUNTS" />\r
     <uses-permission android:name="android.permission.USE_CREDENTIALS" />\r
index 00a1f83..737c00f 100644 (file)
  */\r
 package eu.alefzero.owncloud.ui.activity;\r
 \r
+import android.accounts.Account;\r
 import android.content.Intent;\r
+import android.content.res.Configuration;\r
 import android.os.Bundle;\r
 import android.support.v4.app.FragmentTransaction;\r
+import android.util.Log;\r
 \r
 import com.actionbarsherlock.app.ActionBar;\r
 import com.actionbarsherlock.app.SherlockFragmentActivity;\r
 import com.actionbarsherlock.view.MenuItem;\r
 \r
 import eu.alefzero.owncloud.R;\r
+import eu.alefzero.owncloud.datamodel.OCFile;\r
+import eu.alefzero.owncloud.files.services.FileDownloader;\r
 import eu.alefzero.owncloud.ui.fragment.FileDetailFragment;\r
 \r
 /**\r
@@ -36,21 +41,38 @@ import eu.alefzero.owncloud.ui.fragment.FileDetailFragment;
  * \r
  */\r
 public class FileDetailActivity extends SherlockFragmentActivity {\r
-    private FileDetailFragment mFileDetail;\r
+    \r
+    private boolean mConfigurationChangedToLandscape = false;\r
 \r
     @Override\r
     protected void onCreate(Bundle savedInstanceState) {\r
         super.onCreate(savedInstanceState);\r
-        setContentView(R.layout.file_activity_details);\r
 \r
-        ActionBar actionBar = getSupportActionBar();\r
-        actionBar.setDisplayHomeAsUpEnabled(true);\r
-        \r
-        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();\r
-        mFileDetail = new FileDetailFragment();\r
-        ft.replace(R.id.fragment, mFileDetail, "FileDetails");\r
-        ft.commit();\r
+        // check if configuration changed to large-land ; for a tablet being changed from portrait to landscape when in FileDetailActivity \r
+        Configuration conf = getResources().getConfiguration();\r
+        mConfigurationChangedToLandscape = (conf.orientation == Configuration.ORIENTATION_LANDSCAPE && \r
+                                                (conf.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE\r
+                                           );\r
 \r
+        if (!mConfigurationChangedToLandscape) {\r
+            setContentView(R.layout.file_activity_details);\r
+        \r
+            ActionBar actionBar = getSupportActionBar();\r
+            actionBar.setDisplayHomeAsUpEnabled(true);\r
+        \r
+            OCFile file = getIntent().getParcelableExtra(FileDetailFragment.EXTRA_FILE);\r
+            Account account = getIntent().getParcelableExtra(FileDownloader.EXTRA_ACCOUNT);\r
+            FileDetailFragment mFileDetail = new FileDetailFragment(file, account);\r
+        \r
+            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();\r
+            ft.replace(R.id.fragment, mFileDetail, FileDetailFragment.FTAG);\r
+            ft.commit();\r
+            \r
+        }  else {\r
+            backToDisplayActivity();   // the 'back' won't be effective until this.onStart() and this.onResume() are completed;\r
+        }\r
+        \r
+        \r
     }\r
 \r
     @Override\r
@@ -59,11 +81,7 @@ public class FileDetailActivity extends SherlockFragmentActivity {
         \r
         switch(item.getItemId()){\r
         case android.R.id.home:\r
-            Intent intent = new Intent(this, FileDisplayActivity.class);\r
-            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\r
-            intent.putExtra(FileDetailFragment.EXTRA_FILE, mFileDetail.getDisplayedFile());\r
-            startActivity(intent);\r
-            finish();\r
+            backToDisplayActivity();\r
             returnValue = true;\r
         }\r
         \r
@@ -74,10 +92,21 @@ public class FileDetailActivity extends SherlockFragmentActivity {
 \r
     @Override\r
     protected void onResume() {\r
+        \r
         super.onResume();\r
-        mFileDetail.updateFileDetails(getIntent());\r
+        if (!mConfigurationChangedToLandscape) { \r
+            FileDetailFragment fragment = (FileDetailFragment) getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);\r
+            fragment.updateFileDetails();\r
+        }\r
     }\r
     \r
-    \r
+\r
+    private void backToDisplayActivity() {\r
+        Intent intent = new Intent(this, FileDisplayActivity.class);\r
+        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\r
+        intent.putExtra(FileDetailFragment.EXTRA_FILE, getIntent().getParcelableExtra(FileDetailFragment.EXTRA_FILE));\r
+        startActivity(intent);\r
+        finish();\r
+    }\r
 \r
 }\r
index 98c64bf..2c4ae38 100644 (file)
@@ -39,13 +39,13 @@ import android.database.Cursor;
 import android.net.Uri;\r
 import android.os.Bundle;\r
 import android.provider.MediaStore;\r
+import android.support.v4.app.FragmentTransaction;\r
 import android.util.Log;\r
 import android.view.View;\r
 import android.view.ViewGroup;\r
 import android.widget.ArrayAdapter;\r
 import android.widget.EditText;\r
 import android.widget.TextView;\r
-import android.widget.Toast;\r
 \r
 import com.actionbarsherlock.app.ActionBar;\r
 import com.actionbarsherlock.app.ActionBar.OnNavigationListener;\r
@@ -77,7 +77,7 @@ import eu.alefzero.webdav.WebdavClient;
  */\r
 \r
 public class FileDisplayActivity extends SherlockFragmentActivity implements\r
-        OnNavigationListener, OnClickListener, android.view.View.OnClickListener  {\r
+    FileListFragment.ContainerActivity, OnNavigationListener, OnClickListener, android.view.View.OnClickListener  {\r
     \r
     private ArrayAdapter<String> mDirectories;\r
     private OCFile mCurrentDir;\r
@@ -90,6 +90,10 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
     private View mLayoutView = null;\r
     private FileListFragment mFileList;\r
     \r
+    private boolean mDualPane;\r
+    \r
+    private boolean mForcedLoginToCreateFirstAccount = false;\r
+    \r
     private static final String KEY_DIR_ARRAY = "DIR_ARRAY";\r
     private static final String KEY_CURRENT_DIR = "DIR";\r
     \r
@@ -98,8 +102,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
     private static final int DIALOG_ABOUT_APP = 2;\r
     \r
     private static final int ACTION_SELECT_FILE = 1;\r
-    //private static final int ACTION_CREATE_FIRST_ACCOUNT = 2; dvelasco: WIP\r
-\r
+    \r
     @Override\r
     public void onCreate(Bundle savedInstanceState) {\r
         Log.i(getClass().toString(), "onCreate() start");\r
@@ -110,20 +113,32 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
 \r
         Thread.setDefaultUncaughtExceptionHandler(new CrashHandler(getApplicationContext()));\r
 \r
-        if(savedInstanceState != null){\r
-            mCurrentDir = (OCFile) savedInstanceState.getParcelable(KEY_CURRENT_DIR);   // this is never saved with this key :S\r
+        if(savedInstanceState != null) {\r
+            mDirs = savedInstanceState.getStringArray(KEY_DIR_ARRAY);\r
+            mDirectories = new CustomArrayAdapter<String>(this, R.layout.sherlock_spinner_dropdown_item);\r
+            mDirectories.add("/");\r
+            if (mDirs != null)\r
+                for (String s : mDirs)\r
+                    mDirectories.insert(s, 0);\r
+            mCurrentDir = savedInstanceState.getParcelable(FileDetailFragment.EXTRA_FILE);\r
         }\r
         \r
         mLayoutView = getLayoutInflater().inflate(R.layout.files, null);  // always inflate this at onCreate() ; just once!\r
         \r
         if (AccountUtils.accountsAreSetup(this)) {\r
-            setContentView(mLayoutView);    \r
             \r
-        } else  {\r
+            initDelayedTilAccountAvailabe();\r
+            \r
+        } else {\r
+            \r
             setContentView(R.layout.no_account_available);\r
-            setProgressBarIndeterminateVisibility(false);\r
             getSupportActionBar().setNavigationMode(ActionBar.DISPLAY_SHOW_TITLE);\r
             findViewById(R.id.setup_account).setOnClickListener(this);\r
+            \r
+            Intent intent = new Intent(android.provider.Settings.ACTION_ADD_ACCOUNT);\r
+            intent.putExtra(android.provider.Settings.EXTRA_AUTHORITIES, new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });\r
+            startActivity(intent);  // although the code is here, the activity won't be created until this.onStart() and this.onResume() are finished;\r
+            mForcedLoginToCreateFirstAccount = true;\r
         }\r
         \r
         Log.i(getClass().toString(), "onCreate() end");\r
@@ -256,21 +271,8 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
     }\r
 \r
     @Override\r
-    protected void onRestoreInstanceState(Bundle savedInstanceState) {\r
-        Log.i(getClass().toString(), "onRestoreInstanceState() start");\r
-        super.onRestoreInstanceState(savedInstanceState);\r
-        mDirs = savedInstanceState.getStringArray(KEY_DIR_ARRAY);\r
-        mDirectories = new CustomArrayAdapter<String>(this, R.layout.sherlock_spinner_dropdown_item);\r
-        mDirectories.add("/");\r
-        if (mDirs != null)\r
-            for (String s : mDirs)\r
-                mDirectories.insert(s, 0);\r
-        mCurrentDir = savedInstanceState.getParcelable(FileDetailFragment.EXTRA_FILE);\r
-        Log.i(getClass().toString(), "onRestoreInstanceState() end");\r
-    }\r
-    \r
-    @Override\r
     protected void onSaveInstanceState(Bundle outState) {\r
+        // responsability of restore is prefered in onCreate() before than in onRestoreInstanceState when there are Fragments involved\r
         Log.i(getClass().toString(), "onSaveInstanceState() start");\r
         super.onSaveInstanceState(outState);\r
         if(mDirectories != null && mDirectories.getCount() != 0){\r
@@ -289,17 +291,14 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
         Log.i(getClass().toString(), "onResume() start");\r
         super.onResume();\r
 \r
-        if (!AccountUtils.accountsAreSetup(this)) {\r
-            /*Intent intent = new Intent(android.provider.Settings.ACTION_ADD_ACCOUNT);\r
-            intent.putExtra(android.provider.Settings.EXTRA_AUTHORITIES, new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });\r
-            //startActivity(intent);\r
-            startActivityForResult(intent, ACTION_CREATE_FIRST_ACCOUNT);*/\r
+        if (AccountUtils.accountsAreSetup(this)) {\r
+         // at least an account exist: normal operation\r
             \r
-        } else {    // at least an account exist: normal operation\r
-\r
             // set the layout only if it couldn't be set in onCreate\r
-            if (findViewById(R.id.file_list_view) == null)\r
-                setContentView(mLayoutView);\r
+            if (mForcedLoginToCreateFirstAccount) {\r
+                initDelayedTilAccountAvailabe();\r
+                mForcedLoginToCreateFirstAccount = false;\r
+            }\r
 \r
             // Listen for sync messages\r
             IntentFilter syncIntentFilter = new IntentFilter(FileSyncService.SYNC_MESSAGE);\r
@@ -316,9 +315,10 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
                     AccountUtils.getCurrentOwnCloudAccount(this),\r
                     getContentResolver());\r
         \r
-            // File list\r
+            // File list fragments   \r
             mFileList = (FileListFragment) getSupportFragmentManager().findFragmentById(R.id.fileList);\r
             \r
+            \r
             // Figure out what directory to list. \r
             // Priority: Intent (here), savedInstanceState (onCreate), root dir (dir is null)\r
             if(getIntent().hasExtra(FileDetailFragment.EXTRA_FILE)){\r
@@ -561,7 +561,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
         @Override\r
         public void run() {\r
             WebdavClient wdc = new WebdavClient(mAccount, getApplicationContext());\r
-    \r
+            \r
             String username = mAccount.name.substring(0,\r
                     mAccount.name.lastIndexOf('@'));\r
             String password = mAm.getPassword(mAccount);\r
@@ -667,13 +667,97 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
     @Override\r
     public void onClick(View v) {\r
         if (v.getId() == R.id.setup_account) {\r
-            Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS");\r
-            intent.putExtra("authorities", new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });\r
-            startActivity(intent);\r
+            Intent intent = new Intent(android.provider.Settings.ACTION_ADD_ACCOUNT);\r
+            intent.putExtra(android.provider.Settings.EXTRA_AUTHORITIES, new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });\r
+            startActivity(intent); \r
+            mForcedLoginToCreateFirstAccount = true;\r
         }\r
     }\r
 \r
+    \r
+    \r
+    \r
+    \r
+    /**\r
+     * {@inheritDoc}\r
+     */\r
+    @Override\r
     public DataStorageManager getStorageManager() {\r
         return mStorageManager;\r
-    }    \r
+    }\r
+    \r
+    \r
+    /**\r
+     * {@inheritDoc}\r
+     */\r
+    @Override\r
+    public void onDirectoryClick(OCFile directory) {\r
+        pushDirname(directory);\r
+        ActionBar actionBar = getSupportActionBar();\r
+        actionBar.setDisplayHomeAsUpEnabled(true);\r
+        \r
+        if (mDualPane) {\r
+            // Resets the FileDetailsFragment on Tablets so that it always displays\r
+            FileDetailFragment fileDetails = (FileDetailFragment) getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);\r
+            if (fileDetails != null) {\r
+                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();\r
+                transaction.remove(fileDetails);\r
+                transaction.add(R.id.file_details_container, new FileDetailFragment(null, null));\r
+                transaction.commit();\r
+            }\r
+        }\r
+    }\r
+    \r
+    \r
+    /**\r
+     * {@inheritDoc}\r
+     */\r
+    @Override\r
+    public void onFileClick(OCFile file) {\r
+        \r
+        // If we are on a large device -> update fragment\r
+        if (mDualPane) {\r
+            FileDetailFragment fileDetails = (FileDetailFragment) getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG);\r
+            if (fileDetails == null) {\r
+                // first selected file since the current directory was listed\r
+                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();\r
+                transaction.replace(R.id.file_details_container, new FileDetailFragment(file, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG);\r
+                transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);\r
+                transaction.commit();\r
+            } else {\r
+                // another select file\r
+                fileDetails.updateFileDetails(file, AccountUtils.getCurrentOwnCloudAccount(this));\r
+            }   \r
+            \r
+        } else {    // small or medium screen device -> new Activity\r
+            Intent showDetailsIntent = new Intent(this, FileDetailActivity.class);\r
+            showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, file);\r
+            showDetailsIntent.putExtra(FileDownloader.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));\r
+            startActivity(showDetailsIntent);\r
+        }\r
+    }\r
+    \r
+    /**\r
+     *  Operations in this method should be preferably performed in onCreate to have a lighter onResume method. \r
+     * \r
+     *  But we need to delay them to onResume for the first start of the application, when no account exists and the login activity must be shown; and \r
+     *  put instead the ugly view that shows the 'Setup' button to restart the login activity.   \r
+     *  \r
+     *  In other way, if the users cancels or presses BACK in the login page that first time (users can be cruel sometimes) would show a blank view (the \r
+     *  FragmentList view empty).\r
+     *  \r
+     *  This is temporal, until we found out how to get a result in this activity after launching the ADD_ACCOUNT Intent with startActivityForResult (not trivial)\r
+     */\r
+    private void initDelayedTilAccountAvailabe() {\r
+        setContentView(mLayoutView);    \r
+        mDualPane = (findViewById(R.id.file_details_container) != null);\r
+        if (mDualPane && getSupportFragmentManager().findFragmentByTag(FileDetailFragment.FTAG) == null) {\r
+            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();\r
+            transaction.replace(R.id.file_details_container, new FileDetailFragment(null, null)); // empty FileDetailFragment\r
+            transaction.commit();\r
+        }\r
+\r
+    }\r
+\r
+    \r
 }\r
index 9bcf9de..627c26a 100644 (file)
  */\r
 package eu.alefzero.owncloud.ui.fragment;\r
 \r
-import java.util.List;\r
-\r
 import android.accounts.Account;\r
 import android.accounts.AccountManager;\r
-import android.app.ActionBar.LayoutParams;\r
 import android.content.ActivityNotFoundException;\r
 import android.content.BroadcastReceiver;\r
 import android.content.Context;\r
 import android.content.Intent;\r
 import android.content.IntentFilter;\r
-import android.content.pm.PackageManager;\r
 import android.graphics.Bitmap;\r
 import android.graphics.BitmapFactory;\r
 import android.graphics.BitmapFactory.Options;\r
-import android.graphics.Path.FillType;\r
 import android.net.Uri;\r
 import android.os.Bundle;\r
 import android.util.Log;\r
@@ -64,47 +59,79 @@ public class FileDetailFragment extends SherlockFragment implements
         OnClickListener {\r
 \r
     public static final String EXTRA_FILE = "FILE";\r
+    public static final String EXTRA_ACCOUNT = "ACCOUNT";\r
 \r
-    private DownloadFinishReceiver mDownloadFinishReceiver;\r
-    private Intent mIntent;\r
     private int mLayout;\r
     private View mView;\r
     private OCFile mFile;\r
+    private Account mAccount;\r
+    \r
+    private DownloadFinishReceiver mDownloadFinishReceiver;\r
+\r
     private static final String TAG = "FileDetailFragment";\r
+    public static final String FTAG = "FileDetails"; \r
 \r
+    \r
     /**\r
-     * Default constructor - contains real layout\r
+     * Creates an empty details fragment.\r
+     * \r
+     * It's necessary to keep a public constructor without parameters; the system uses it when tries to reinstantiate a fragment automatically. \r
      */\r
-    public FileDetailFragment(){\r
-        mLayout = R.layout.file_details_fragment;\r
+    public FileDetailFragment() {\r
+        mFile = null;\r
+        mAccount = null;\r
+        mLayout = R.layout.file_details_empty;\r
     }\r
     \r
+    \r
     /**\r
-     * Creates a dummy layout. For use if the user never has\r
-     * tapped on a file before\r
+     * Creates a details fragment.\r
+     * \r
+     * When 'fileToDetail' or 'ocAccount' are null, creates a dummy layout (to use when a file wasn't tapped before).\r
      * \r
-     * @param useEmptyView If true, use empty layout\r
+     * @param fileToDetail      An {@link OCFile} to show in the fragment\r
+     * @param ocAccount         An ownCloud account; needed to start downloads\r
      */\r
-    public FileDetailFragment(boolean useEmptyView){\r
-        if(useEmptyView){\r
-            mLayout = R.layout.file_details_empty;\r
-        } else {\r
+    public FileDetailFragment(OCFile fileToDetail, Account ocAccount){\r
+        mFile = fileToDetail;\r
+        mAccount = ocAccount;\r
+        mLayout = R.layout.file_details_empty;\r
+        \r
+        if(fileToDetail != null && ocAccount != null) {\r
             mLayout = R.layout.file_details_fragment;\r
         }\r
     }\r
     \r
-    /**\r
-     * Use this when creating the fragment and display\r
-     * a file at the same time\r
-     * \r
-     * @param showDetailsIntent The Intent with the required parameters\r
-     * @see FileDetailFragment#updateFileDetails(Intent)\r
-     */\r
-    public FileDetailFragment(Intent showDetailsIntent) {\r
-        mIntent = showDetailsIntent;\r
-        mLayout = R.layout.file_details_fragment;\r
+    \r
+    @Override\r
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
+            Bundle savedInstanceState) {\r
+        super.onCreateView(inflater, container, savedInstanceState);\r
+        \r
+        if (savedInstanceState != null) {\r
+            mFile = savedInstanceState.getParcelable(FileDetailFragment.EXTRA_FILE);\r
+            mAccount = savedInstanceState.getParcelable(FileDetailFragment.EXTRA_ACCOUNT);\r
+        }\r
+        \r
+        View view = null;\r
+        view = inflater.inflate(mLayout, container, false);\r
+        mView = view;\r
+        \r
+        updateFileDetails();\r
+        return view;\r
+    }\r
+    \r
+\r
+    @Override\r
+    public void onSaveInstanceState(Bundle outState) {\r
+        Log.i(getClass().toString(), "onSaveInstanceState() start");\r
+        super.onSaveInstanceState(outState);\r
+        outState.putParcelable(FileDetailFragment.EXTRA_FILE, mFile);\r
+        outState.putParcelable(FileDetailFragment.EXTRA_ACCOUNT, mAccount);\r
+        Log.i(getClass().toString(), "onSaveInstanceState() end");\r
     }\r
 \r
+    \r
     @Override\r
     public void onResume() {\r
         super.onResume();\r
@@ -122,23 +149,6 @@ public class FileDetailFragment extends SherlockFragment implements
     }\r
 \r
     @Override\r
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
-            Bundle savedInstanceState) {\r
-        View view = null;\r
-        view = inflater.inflate(mLayout, container, false);\r
-        mView = view;\r
-        if(mLayout == R.layout.file_details_fragment){\r
-            // Phones will launch an activity with this intent\r
-            if(mIntent == null){\r
-                mIntent = getActivity().getIntent();\r
-            }\r
-            updateFileDetails();\r
-        }\r
-        \r
-        return view;\r
-    }\r
-\r
-    @Override\r
     public View getView() {\r
         return super.getView() == null ? mView : super.getView();\r
     }\r
@@ -147,8 +157,7 @@ public class FileDetailFragment extends SherlockFragment implements
     public void onClick(View v) {\r
         Toast.makeText(getActivity(), "Downloading", Toast.LENGTH_LONG).show();\r
         Intent i = new Intent(getActivity(), FileDownloader.class);\r
-        i.putExtra(FileDownloader.EXTRA_ACCOUNT,\r
-                mIntent.getParcelableExtra(FileDownloader.EXTRA_ACCOUNT));\r
+        i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount);\r
         i.putExtra(FileDownloader.EXTRA_REMOTE_PATH, mFile.getRemotePath());\r
         i.putExtra(FileDownloader.EXTRA_FILE_PATH, mFile.getURLDecodedRemotePath());\r
         i.putExtra(FileDownloader.EXTRA_FILE_SIZE, mFile.getFileLength());\r
@@ -167,27 +176,22 @@ public class FileDetailFragment extends SherlockFragment implements
     /**\r
      * Use this method to signal this Activity that it shall update its view.\r
      * \r
-     * @param intent The {@link Intent} that contains extra information about\r
-     *            this file The intent needs to have these extras:\r
-     *            <p>\r
-     * \r
-     *            {@link FileDetailFragment#EXTRA_FILE}: An {@link OCFile}\r
-     *            {@link FileDownloader#EXTRA_ACCOUNT}: The Account that file\r
-     *            belongs to (required for downloading)\r
+     * @param file : An {@link OCFile}\r
      */\r
-    public void updateFileDetails(Intent intent) {\r
-        mIntent = intent;\r
+    public void updateFileDetails(OCFile file, Account ocAccount) {\r
+        mFile = file;\r
+        mAccount = ocAccount;\r
         updateFileDetails();\r
     }\r
+    \r
 \r
     /**\r
      * Updates the view with all relevant details about that file.\r
      */\r
-    private void updateFileDetails() {\r
-        mFile = mIntent.getParcelableExtra(EXTRA_FILE);\r
-        Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn);\r
+    public void updateFileDetails() {\r
 \r
-        if (mFile != null) {\r
+        if (mFile != null && mLayout == R.layout.file_details_fragment) {\r
+            Button downloadButton = (Button) getView().findViewById(R.id.fdDownloadBtn);\r
             // set file details\r
             setFilename(mFile.getFileName());\r
             setFiletype(DisplayUtils.convertMIMEtoPrettyPrint(mFile\r
@@ -350,18 +354,15 @@ public class FileDetailFragment extends SherlockFragment implements
      * the time that the file was created. There is a chance that this will\r
      * be fixed in future versions. Use this method to check if this version of\r
      * ownCloud has this fix.\r
-     * @return True, if ownCloud the ownCloud version is supporting creationg time\r
+     * @return True, if ownCloud the ownCloud version is supporting creation time\r
      */\r
     private boolean ocVersionSupportsTimeCreated(){\r
-       /* if(mIntent != null){\r
-            Account ocAccount = mIntent.getParcelableExtra(FileDownloader.EXTRA_ACCOUNT);\r
-            if(ocAccount != null){\r
-                AccountManager accManager = (AccountManager) getActivity().getSystemService(Context.ACCOUNT_SERVICE);\r
-                OwnCloudVersion ocVersion = new OwnCloudVersion(accManager\r
-                        .getUserData(ocAccount, AccountAuthenticator.KEY_OC_VERSION));\r
-                if(ocVersion.compareTo(new OwnCloudVersion(0x030000)) < 0) {\r
-                    return true;\r
-                }\r
+        /*if(mAccount != null){\r
+            AccountManager accManager = (AccountManager) getActivity().getSystemService(Context.ACCOUNT_SERVICE);\r
+            OwnCloudVersion ocVersion = new OwnCloudVersion(accManager\r
+                    .getUserData(mAccount, AccountAuthenticator.KEY_OC_VERSION));\r
+            if(ocVersion.compareTo(new OwnCloudVersion(0x030000)) < 0) {\r
+                return true;\r
             }\r
         }*/\r
         return false;\r
@@ -379,11 +380,12 @@ public class FileDetailFragment extends SherlockFragment implements
                 Toast.makeText(context, R.string.downloader_download_failed , Toast.LENGTH_SHORT).show();\r
                 \r
             } else if (intent.getAction().equals(FileDownloader.DOWNLOAD_FINISH_MESSAGE)) {\r
-                ((OCFile)mIntent.getParcelableExtra(EXTRA_FILE)).setStoragePath(intent.getStringExtra(FileDownloader.EXTRA_FILE_PATH));\r
-                updateFileDetails(mIntent);\r
+                mFile.setStoragePath(intent.getStringExtra(FileDownloader.EXTRA_FILE_PATH));\r
+                updateFileDetails();\r
             }\r
         }\r
         \r
     }\r
+    \r
 \r
 }\r
index 895b3a2..069a24d 100644 (file)
@@ -19,27 +19,17 @@ package eu.alefzero.owncloud.ui.fragment;
 \r
 import java.util.Vector;\r
 \r
-import com.actionbarsherlock.app.ActionBar;\r
-\r
-import android.accounts.Account;\r
-import android.content.Intent;\r
+import android.app.Activity;\r
 import android.os.Bundle;\r
-import android.support.v4.app.FragmentTransaction;\r
 import android.util.Log;\r
 import android.view.LayoutInflater;\r
 import android.view.View;\r
 import android.view.ViewGroup;\r
 import android.widget.AdapterView;\r
-import android.widget.Toast;\r
-import eu.alefzero.owncloud.AccountUtils;\r
 import eu.alefzero.owncloud.R;\r
 import eu.alefzero.owncloud.datamodel.DataStorageManager;\r
-import eu.alefzero.owncloud.datamodel.FileDataStorageManager;\r
 import eu.alefzero.owncloud.datamodel.OCFile;\r
-import eu.alefzero.owncloud.files.services.FileDownloader;\r
 import eu.alefzero.owncloud.ui.FragmentListView;\r
-import eu.alefzero.owncloud.ui.activity.FileDetailActivity;\r
-import eu.alefzero.owncloud.ui.activity.FileDisplayActivity;\r
 import eu.alefzero.owncloud.ui.adapter.FileListListAdapter;\r
 \r
 /**\r
@@ -51,23 +41,26 @@ import eu.alefzero.owncloud.ui.adapter.FileListListAdapter;
 public class FileListFragment extends FragmentListView {\r
     private static final String TAG = "FileListFragment";\r
     \r
+    private FileListFragment.ContainerActivity mContainerActivity;\r
+    \r
     private Vector<OCFile> mFiles;    \r
-    private OCFile mFile;\r
-    private boolean mIsLargeDevice; \r
+    private OCFile mFile = null;\r
 \r
+    \r
+    /**\r
+     * {@inheritDoc}\r
+     */\r
     @Override\r
-    public void onCreate(Bundle savedInstanceState) {\r
-        Log.i(getClass().toString(), "onCreate() start");\r
-        super.onCreate(savedInstanceState);\r
-\r
-        Intent intent = getActivity().getIntent();\r
-        OCFile directory = intent.getParcelableExtra(FileDetailFragment.EXTRA_FILE);\r
-        mFile = directory;\r
-        mIsLargeDevice = false; \r
-        \r
-        Log.i(getClass().toString(), "onCreate() stop");\r
+    public void onAttach(Activity activity) {\r
+        super.onAttach(activity);\r
+        try {\r
+            mContainerActivity = (ContainerActivity) activity;\r
+        } catch (ClassCastException e) {\r
+            throw new ClassCastException(activity.toString() + " must implement FileListFragment.ContainerActivity");\r
+        }\r
     }\r
     \r
+    \r
     @Override\r
     public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
             Bundle savedInstanceState) {\r
@@ -80,21 +73,17 @@ public class FileListFragment extends FragmentListView {
         return getListView();\r
     }    \r
 \r
+\r
     @Override\r
-    public void onStart() {\r
-        Log.i(getClass().toString(), "onStart() start");\r
-        super.onStart();\r
-        // Create a placeholder upon launch\r
-        View fragmentContainer = getActivity().findViewById(R.id.file_details_container);\r
-        if (fragmentContainer != null) {\r
-            mIsLargeDevice = true;\r
-            FragmentTransaction transaction = getFragmentManager().beginTransaction();\r
-            transaction.replace(R.id.file_details_container, new FileDetailFragment(true));\r
-            transaction.commit();\r
-        }\r
-        Log.i(getClass().toString(), "onStart() end");\r
+    public void onActivityCreated(Bundle savedInstanceState) {\r
+        Log.i(getClass().toString(), "onActivityCreated() start");\r
+        \r
+        super.onCreate(savedInstanceState);\r
+        \r
+        Log.i(getClass().toString(), "onActivityCreated() stop");\r
     }\r
-\r
+    \r
+    \r
     @Override\r
     public void onItemClick(AdapterView<?> l, View v, int position, long id) {\r
         if (mFiles.size() <= position) {\r
@@ -102,49 +91,18 @@ public class FileListFragment extends FragmentListView {
         }\r
         OCFile file = mFiles.get(position);\r
         \r
-        // Update ActionBarPath\r
+        /// Click on a directory\r
         if (file.getMimetype().equals("DIR")) {\r
+            // just local updates\r
             mFile = file;\r
-            ((FileDisplayActivity) getActivity()).pushDirname(file);\r
-            ActionBar actionBar = ((FileDisplayActivity) getActivity()).getSupportActionBar();\r
-            actionBar.setDisplayHomeAsUpEnabled(true);\r
             listDirectory(file);\r
-            resetFileFragment();\r
-            return;\r
-        }\r
-\r
-        Intent showDetailsIntent = new Intent(getActivity(), FileDetailActivity.class);\r
-        showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, file);\r
-        showDetailsIntent.putExtra(FileDownloader.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(getActivity()));\r
-\r
-        // If we are on a large device -> update fragment\r
-        if (mIsLargeDevice) {\r
-            FileDetailFragment fileDetails = (FileDetailFragment) getFragmentManager().findFragmentByTag("FileDetails");\r
-            if (fileDetails == null) {\r
-                FragmentTransaction transaction = getFragmentManager().beginTransaction();\r
-                transaction.replace(R.id.file_details_container, new FileDetailFragment(showDetailsIntent), "FileDetails");\r
-                transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);\r
-                transaction.commit();\r
-            } else {\r
-                fileDetails.updateFileDetails(showDetailsIntent);\r
-            }\r
-        } else {\r
-            startActivity(showDetailsIntent);\r
-        }\r
-    }\r
-\r
-    /**\r
-     * Resets the FileDetailsFragment on Tablets so that it always displays\r
-     * "Tab on a file to display it's details"\r
-     */\r
-    private void resetFileFragment() {\r
-        FileDetailFragment fileDetails = (FileDetailFragment) getFragmentManager().findFragmentByTag("FileDetails");\r
-        if (fileDetails != null) {\r
-            FragmentTransaction transaction = getFragmentManager().beginTransaction();\r
-            transaction.remove(fileDetails);\r
-            transaction.add(R.id.file_details_container, new FileDetailFragment(true));\r
-            transaction.commit();\r
+            // any other updates are let to the container Activity\r
+            mContainerActivity.onDirectoryClick(file);\r
+            \r
+        } else {    /// Click on a file\r
+            mContainerActivity.onFileClick(file);\r
         }\r
+        \r
     }\r
 \r
     /**\r
@@ -154,13 +112,11 @@ public class FileListFragment extends FragmentListView {
         OCFile parentDir = null;\r
         \r
         if(mFile != null){\r
-            DataStorageManager storageManager = ((FileDisplayActivity)getActivity()).getStorageManager();\r
+            DataStorageManager storageManager = mContainerActivity.getStorageManager();\r
             parentDir = storageManager.getFileById(mFile.getParentId());\r
             mFile = parentDir;\r
         }\r
-        \r
         listDirectory(parentDir);\r
-        resetFileFragment();\r
     }\r
 \r
     /**\r
@@ -188,7 +144,7 @@ public class FileListFragment extends FragmentListView {
      */\r
     public void listDirectory(OCFile directory) {\r
         \r
-        DataStorageManager storageManager = ((FileDisplayActivity)getActivity()).getStorageManager();\r
+        DataStorageManager storageManager = mContainerActivity.getStorageManager();\r
 \r
         // Check input parameters for null\r
         if(directory == null){\r
@@ -208,12 +164,42 @@ public class FileListFragment extends FragmentListView {
         }\r
 \r
         mFile = directory;\r
-        \r
         mFiles = storageManager.getDirectoryContent(directory);\r
+        \r
         /*if (mFiles == null || mFiles.size() == 0) {\r
             Toast.makeText(getActivity(), "There are no files here", Toast.LENGTH_LONG).show();\r
         }*/\r
         setListAdapter(new FileListListAdapter(directory, storageManager, getActivity()));\r
     }\r
+    \r
+    \r
+    \r
+    /**\r
+     * Interface to implement by any Activity that includes some instance of FileListFragment\r
+     * \r
+     * @author David A. Velasco\r
+     */\r
+    public interface ContainerActivity {\r
+\r
+        /**\r
+         * Callback method invoked when a directory is clicked by the user on the files list\r
+         *  \r
+         * @param file\r
+         */\r
+        public void onDirectoryClick(OCFile file);\r
+        \r
+        /**\r
+         * Callback method invoked when a file (non directory) is clicked by the user on the files list\r
+         *  \r
+         * @param file\r
+         */\r
+        public void onFileClick(OCFile file);\r
+\r
+        /**\r
+         * Getter for the current DataStorageManager in the container activity\r
+         */\r
+        public DataStorageManager getStorageManager();\r
+        \r
+    }\r
 \r
 }\r