Merge pull request #1088 from owncloud/updated_docs_about_target_of_PRs
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / activity / FileActivity.java
index 373603e..9a952e4 100644 (file)
@@ -31,15 +31,25 @@ import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.content.res.Configuration;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
+import android.support.v4.app.ActionBarDrawerToggle;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.ActionBarActivity;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.LinearLayout;
+import android.widget.ListView;
 import android.widget.Toast;
 
-import com.actionbarsherlock.app.SherlockFragmentActivity;
+import com.owncloud.android.BuildConfig;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AccountUtils;
@@ -48,8 +58,8 @@ import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.files.FileOperationsHelper;
 import com.owncloud.android.files.services.FileDownloader;
-import com.owncloud.android.files.services.FileUploader;
 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.lib.common.operations.OnRemoteOperationListener;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
@@ -61,21 +71,28 @@ import com.owncloud.android.operations.SynchronizeFolderOperation;
 import com.owncloud.android.operations.UnshareLinkOperation;
 import com.owncloud.android.services.OperationsService;
 import com.owncloud.android.services.OperationsService.OperationsServiceBinder;
+import com.owncloud.android.ui.NavigationDrawerItem;
+import com.owncloud.android.ui.adapter.NavigationDrawerListAdapter;
 import com.owncloud.android.ui.dialog.LoadingDialog;
 import com.owncloud.android.ui.dialog.SharePasswordDialogFragment;
 import com.owncloud.android.utils.ErrorMessageAdapter;
 
+import java.util.ArrayList;
+
 
 /**
- * Activity with common behaviour for activities handling {@link OCFile}s in ownCloud {@link Account}s .
+ * Activity with common behaviour for activities handling {@link OCFile}s in ownCloud
+ * {@link Account}s .
  */
-public class FileActivity extends SherlockFragmentActivity
+public class FileActivity extends ActionBarActivity
         implements OnRemoteOperationListener, ComponentsGetter {
 
     public static final String EXTRA_FILE = "com.owncloud.android.ui.activity.FILE";
     public static final String EXTRA_ACCOUNT = "com.owncloud.android.ui.activity.ACCOUNT";
-    public static final String EXTRA_WAITING_TO_PREVIEW = "com.owncloud.android.ui.activity.WAITING_TO_PREVIEW";
-    public static final String EXTRA_FROM_NOTIFICATION = "com.owncloud.android.ui.activity.FROM_NOTIFICATION";
+    public static final String EXTRA_WAITING_TO_PREVIEW =
+            "com.owncloud.android.ui.activity.WAITING_TO_PREVIEW";
+    public static final String EXTRA_FROM_NOTIFICATION =
+            "com.owncloud.android.ui.activity.FROM_NOTIFICATION";
     
     public static final String TAG = FileActivity.class.getSimpleName();
     
@@ -83,17 +100,19 @@ public class FileActivity extends SherlockFragmentActivity
     private static final String KEY_WAITING_FOR_OP_ID = "WAITING_FOR_OP_ID";
     private static final String DIALOG_SHARE_PASSWORD = "DIALOG_SHARE_PASSWORD";
     private static final String KEY_TRY_SHARE_AGAIN = "TRY_SHARE_AGAIN";
+    private static final String KEY_ACTION_BAR_TITLE = "ACTION_BAR_TITLE";
     
     protected static final long DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS = 200;
     
     
-    /** OwnCloud {@link Account} where the main {@link OCFile} handled by the activity is located. */
+    /** OwnCloud {@link Account} where the main {@link OCFile} handled by the activity is located.*/
     private Account mAccount;
     
     /** Main {@link OCFile} handled by the activity.*/
     private OCFile mFile;
     
-    /** Flag to signal that the activity will is finishing to enforce the creation of an ownCloud {@link Account} */
+    /** Flag to signal that the activity will is finishing to enforce the creation of an ownCloud
+     * {@link Account} */
     private boolean mRedirectingToSetupAccount = false;
     
     /** Flag to signal when the value of mAccount was set */ 
@@ -122,7 +141,23 @@ public class FileActivity extends SherlockFragmentActivity
     private ServiceConnection mDownloadServiceConnection, mUploadServiceConnection = null;
 
     private boolean mTryShareAgain = false;
-    
+
+    // Navigation Drawer
+    protected DrawerLayout mDrawerLayout;
+    protected ActionBarDrawerToggle mDrawerToggle;
+    protected ListView mDrawerList;
+
+    // Slide menu items
+    protected String[] mDrawerTitles;
+    protected String[] mDrawerContentDescriptions;
+
+    protected ArrayList<NavigationDrawerItem> mDrawerItems;
+
+    protected NavigationDrawerListAdapter mNavigationDrawerAdapter = null;
+
+
+    // TODO re-enable when "Accounts" is available in Navigation Drawer
+//    protected boolean mShowAccounts = false;
     
     /**
      * Loads the ownCloud {@link Account} and main {@link OCFile} to be handled by the instance of 
@@ -144,26 +179,32 @@ public class FileActivity extends SherlockFragmentActivity
                     savedInstanceState.getLong(KEY_WAITING_FOR_OP_ID, Long.MAX_VALUE)
                     );
             mTryShareAgain = savedInstanceState.getBoolean(KEY_TRY_SHARE_AGAIN);
+            getSupportActionBar().setTitle(savedInstanceState.getString(KEY_ACTION_BAR_TITLE));
         } else {
             account = getIntent().getParcelableExtra(FileActivity.EXTRA_ACCOUNT);
             mFile = getIntent().getParcelableExtra(FileActivity.EXTRA_FILE);
-            mFromNotification = getIntent().getBooleanExtra(FileActivity.EXTRA_FROM_NOTIFICATION, false);
+            mFromNotification = getIntent().getBooleanExtra(FileActivity.EXTRA_FROM_NOTIFICATION,
+                    false);
         }
 
-        AccountUtils.updateAccountVersion(this); // best place, before any access to AccountManager or database
+        AccountUtils.updateAccountVersion(this); // best place, before any access to AccountManager
+                                                 // or database
 
         setAccount(account, savedInstanceState != null);
         
         mOperationsServiceConnection = new OperationsServiceConnection();
-        bindService(new Intent(this, OperationsService.class), mOperationsServiceConnection, Context.BIND_AUTO_CREATE);
+        bindService(new Intent(this, OperationsService.class), mOperationsServiceConnection,
+                Context.BIND_AUTO_CREATE);
         
         mDownloadServiceConnection = newTransferenceServiceConnection();
         if (mDownloadServiceConnection != null) {
-            bindService(new Intent(this, FileDownloader.class), mDownloadServiceConnection, Context.BIND_AUTO_CREATE);
+            bindService(new Intent(this, FileDownloader.class), mDownloadServiceConnection,
+                    Context.BIND_AUTO_CREATE);
         }
         mUploadServiceConnection = newTransferenceServiceConnection();
         if (mUploadServiceConnection != null) {
-            bindService(new Intent(this, FileUploader.class), mUploadServiceConnection, Context.BIND_AUTO_CREATE);
+            bindService(new Intent(this, FileUploader.class), mUploadServiceConnection,
+                    Context.BIND_AUTO_CREATE);
         }
 
     }
@@ -197,42 +238,34 @@ public class FileActivity extends SherlockFragmentActivity
     
     @Override 
     protected void onStart() {
-        Log_OC.v(TAG, "onStart() start");
         super.onStart();
 
         if (mAccountWasSet) {
             onAccountSet(mAccountWasRestored);
         }
-        Log_OC.v(TAG, "onStart() end");
     }
     
     @Override
     protected void onResume() {
-        Log_OC.v(TAG, "onResume() start");
         super.onResume();
         
         if (mOperationsServiceBinder != null) {
             doOnResumeAndBound();
         }
-        Log_OC.v(TAG, "onResume() end");
     }
     
     @Override
     protected void onPause()  {
-        Log_OC.v(TAG, "onPause() start");
-
         if (mOperationsServiceBinder != null) {
             mOperationsServiceBinder.removeOperationListener(this);
         }
         
         super.onPause();
-        Log_OC.v(TAG, "onPause() end");
     }
     
     
     @Override
     protected void onDestroy() {
-        Log_OC.v(TAG, "onDestroy() start");
         if (mOperationsServiceConnection != null) {
             unbindService(mOperationsServiceConnection);
             mOperationsServiceBinder = null;
@@ -247,10 +280,160 @@ public class FileActivity extends SherlockFragmentActivity
         }
 
         super.onDestroy();
-        Log_OC.v(TAG, "onDestroy() end");
     }
-    
-    
+
+    @Override
+    protected void onPostCreate(Bundle savedInstanceState) {
+        super.onPostCreate(savedInstanceState);
+        // Sync the toggle state after onRestoreInstanceState has occurred.
+        if (mDrawerToggle != null) {
+            mDrawerToggle.syncState();
+            if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
+                getSupportActionBar().setTitle(R.string.app_name);
+                mDrawerToggle.setDrawerIndicatorEnabled(true);
+            }
+        }
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        if (mDrawerToggle != null) {
+            mDrawerToggle.onConfigurationChanged(newConfig);
+        }
+    }
+
+    protected void initDrawer(){
+        // constant settings for action bar when navigation drawer is inited
+        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+
+
+        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+        // Notification Drawer
+        LinearLayout navigationDrawerLayout = (LinearLayout) findViewById(R.id.left_drawer);
+        mDrawerList = (ListView) navigationDrawerLayout.findViewById(R.id.drawer_list);
+
+        // TODO re-enable when "Accounts" is available in Navigation Drawer
+//        // load Account in the Drawer Title
+//        // User-Icon
+//        ImageView userIcon = (ImageView) navigationDrawerLayout.findViewById(R.id.drawer_userIcon);
+//        userIcon.setImageResource(DisplayUtils.getSeasonalIconId());
+//
+//        // Username
+//        TextView username = (TextView) navigationDrawerLayout.findViewById(R.id.drawer_username);
+//        Account account = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
+//
+//        if (account != null) {
+//            int lastAtPos = account.name.lastIndexOf("@");
+//            username.setText(account.name.substring(0, lastAtPos));
+//        }
+
+        // load slide menu items
+        mDrawerTitles = getResources().getStringArray(R.array.drawer_items);
+
+        // nav drawer content description from resources
+        mDrawerContentDescriptions = getResources().
+                getStringArray(R.array.drawer_content_descriptions);
+
+        // nav drawer items
+        mDrawerItems = new ArrayList<NavigationDrawerItem>();
+        // adding nav drawer items to array
+        // TODO re-enable when "Accounts" is available in Navigation Drawer
+        // Accounts
+        // mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[0],
+        // mDrawerContentDescriptions[0]));
+        // All Files
+        mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[0], mDrawerContentDescriptions[0]));
+
+        // TODO Enable when "On Device" is recovered
+        // On Device
+        //mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[2],
+        //        mDrawerContentDescriptions[2]));
+
+        // Settings
+        mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[1], mDrawerContentDescriptions[1]));
+        // Logs
+        if (BuildConfig.DEBUG) {
+            mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[2],
+                    mDrawerContentDescriptions[2]));
+        }
+
+        // setting the nav drawer list adapter
+        mNavigationDrawerAdapter = new NavigationDrawerListAdapter(getApplicationContext(), this,
+                mDrawerItems);
+        mDrawerList.setAdapter(mNavigationDrawerAdapter);
+
+        mDrawerToggle = new ActionBarDrawerToggle(
+                this,
+                mDrawerLayout,
+                R.drawable.ic_drawer,
+                R.string.app_name,
+                R.string.drawer_close) {
+
+            /** Called when a drawer has settled in a completely closed state. */
+            public void onDrawerClosed(View view) {
+                super.onDrawerClosed(view);
+                updateActionBarTitleAndHomeButton(null);
+                invalidateOptionsMenu();
+            }
+
+            /** Called when a drawer has settled in a completely open state. */
+            public void onDrawerOpened(View drawerView) {
+                super.onDrawerOpened(drawerView);
+                getSupportActionBar().setTitle(R.string.app_name);
+                mDrawerToggle.setDrawerIndicatorEnabled(true);
+                invalidateOptionsMenu();
+            }
+        };
+
+        //mDrawerToggle.setDrawerIndicatorEnabled(true);
+        // Set the list's click listener
+        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
+
+        // Set the drawer toggle as the DrawerListener
+        mDrawerLayout.setDrawerListener(mDrawerToggle);
+    }
+
+    /**
+     * Updates title bar and home buttons (state and icon).
+     *
+     * Assumes that navigation drawer is NOT visible.
+     */
+    protected void updateActionBarTitleAndHomeButton(OCFile chosenFile) {
+        String title = getString(R.string.default_display_name_for_root_folder);    // default
+        boolean inRoot;
+
+        /// choose the appropiate title
+        if (chosenFile == null) {
+            chosenFile = mFile;     // if no file is passed, current file decides
+        }
+        inRoot = (
+                chosenFile == null ||
+                (chosenFile.isFolder() && chosenFile.getParentId() == FileDataStorageManager.ROOT_PARENT_ID)
+        );
+        if (!inRoot) {
+            title = chosenFile.getFileName();
+        }
+
+        /// set the chosen title
+        ActionBar actionBar = getSupportActionBar();
+        actionBar.setTitle(title);
+        /// also as content description
+        View actionBarTitleView = getWindow().getDecorView().findViewById(
+                getResources().getIdentifier("action_bar_title", "id", "android")
+        );
+        if (actionBarTitleView != null) {    // it's null in Android 2.x
+            actionBarTitleView.setContentDescription(title);
+        }
+
+        /// set home button properties
+        mDrawerToggle.setDrawerIndicatorEnabled(inRoot);
+        actionBar.setDisplayHomeAsUpEnabled(true);
+        actionBar.setDisplayShowTitleEnabled(true);
+
+    }
+
+
     /**
      *  Sets and validates the ownCloud {@link Account} associated to the Activity. 
      * 
@@ -264,7 +447,8 @@ public class FileActivity extends SherlockFragmentActivity
     protected void setAccount(Account account, boolean savedAccount) {
         Account oldAccount = mAccount;
         boolean validAccount =
-                (account != null && AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), account.name));
+                (account != null && AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(),
+                        account.name));
         if (validAccount) {
             mAccount = account;
             mAccountWasSet = true;
@@ -307,13 +491,13 @@ public class FileActivity extends SherlockFragmentActivity
      */
     private void createFirstAccount() {
         AccountManager am = AccountManager.get(getApplicationContext());
-        am.addAccount(MainApp.getAccountType(), 
-                        null,
-                        null, 
-                        null, 
-                        this, 
-                        new AccountCreationCallback(),                        
-                        null);
+        am.addAccount(MainApp.getAccountType(),
+                null,
+                null,
+                null,
+                this,
+                new AccountCreationCallback(),
+                null);
     }
 
     
@@ -327,6 +511,7 @@ public class FileActivity extends SherlockFragmentActivity
         outState.putBoolean(FileActivity.EXTRA_FROM_NOTIFICATION, mFromNotification);
         outState.putLong(KEY_WAITING_FOR_OP_ID, mFileOperationsHelper.getOpIdWaitingFor());
         outState.putBoolean(KEY_TRY_SHARE_AGAIN, mTryShareAgain);
+        outState.putString(KEY_ACTION_BAR_TITLE, getSupportActionBar().getTitle().toString());
     }
     
     
@@ -351,9 +536,11 @@ public class FileActivity extends SherlockFragmentActivity
 
     
     /**
-     * Getter for the ownCloud {@link Account} where the main {@link OCFile} handled by the activity is located.
+     * Getter for the ownCloud {@link Account} where the main {@link OCFile} handled by the activity
+     * is located.
      * 
-     * @return  OwnCloud {@link Account} where the main {@link OCFile} handled by the activity is located.
+     * @return  OwnCloud {@link Account} where the main {@link OCFile} handled by the activity
+     *          is located.
      */
     public Account getAccount() {
         return mAccount;
@@ -473,7 +660,8 @@ public class FileActivity extends SherlockFragmentActivity
      */
     @Override
     public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
-        Log_OC.d(TAG, "Received result of operation in FileActivity - common behaviour for all the FileActivities ");
+        Log_OC.d(TAG, "Received result of operation in FileActivity - common behaviour for all the "
+                + "FileActivities ");
         
         mFileOperationsHelper.setOpIdWaitingFor(Long.MAX_VALUE);
         
@@ -551,15 +739,16 @@ public class FileActivity extends SherlockFragmentActivity
     }
     
     
-    private void onUnshareLinkOperationFinish(UnshareLinkOperation operation, RemoteOperationResult result) {
+    private void onUnshareLinkOperationFinish(UnshareLinkOperation operation,
+                                              RemoteOperationResult result) {
         dismissLoadingDialog();
         
         if (result.isSuccess()){
             updateFileFromDB();
             
         } else {
-            Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), 
-                    Toast.LENGTH_LONG);
+            Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result,
+                            operation, getResources()), Toast.LENGTH_LONG);
             t.show();
         } 
     }
@@ -568,8 +757,8 @@ public class FileActivity extends SherlockFragmentActivity
             SynchronizeFolderOperation operation, RemoteOperationResult result
     ) {
         if (!result.isSuccess() && result.getCode() != ResultCode.CANCELLED){
-            Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()),
-                    Toast.LENGTH_LONG);
+            Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result,
+                            operation, getResources()), Toast.LENGTH_LONG);
             t.show();
         }
     }
@@ -611,7 +800,8 @@ public class FileActivity extends SherlockFragmentActivity
         mOperationsServiceBinder.addOperationListener(FileActivity.this, mHandler);
         long waitingForOpId = mFileOperationsHelper.getOpIdWaitingFor();
         if (waitingForOpId <= Integer.MAX_VALUE) {
-            boolean wait = mOperationsServiceBinder.dispatchResultIfFinished((int)waitingForOpId, this);
+            boolean wait = mOperationsServiceBinder.dispatchResultIfFinished((int)waitingForOpId,
+                    this);
             if (!wait ) {
                 dismissLoadingDialog();
             }
@@ -661,6 +851,63 @@ public class FileActivity extends SherlockFragmentActivity
     public FileUploaderBinder getFileUploaderBinder() {
         return mUploaderBinder;
     }
-    
-    
+
+
+    public void restart(){
+        Intent i = new Intent(this, FileDisplayActivity.class);
+        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+        startActivity(i);
+    }
+
+//    TODO re-enable when "Accounts" is available in Navigation Drawer
+//    public void closeDrawer() {
+//        mDrawerLayout.closeDrawers();
+//    }
+
+    public void allFilesOption(){
+        restart();
+    }
+
+    private class DrawerItemClickListener implements ListView.OnItemClickListener {
+        @Override
+        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+            // TODO re-enable when "Accounts" is available in Navigation Drawer
+//            if (mShowAccounts && position > 0){
+//                position = position - 1;
+//            }
+            switch (position){
+                // TODO re-enable when "Accounts" is available in Navigation Drawer
+//                case 0: // Accounts
+//                    mShowAccounts = !mShowAccounts;
+//                    mNavigationDrawerAdapter.setShowAccounts(mShowAccounts);
+//                    mNavigationDrawerAdapter.notifyDataSetChanged();
+//                    break;
+
+                case 0: // All Files
+                    allFilesOption();
+                    mDrawerLayout.closeDrawers();
+                    break;
+
+                // TODO Enable when "On Device" is recovered ?
+//                case 2:
+//                    MainApp.showOnlyFilesOnDevice(true);
+//                    mDrawerLayout.closeDrawers();
+//                    break;
+
+                case 1: // Settings
+                    Intent settingsIntent = new Intent(getApplicationContext(),
+                            Preferences.class);
+                    startActivity(settingsIntent);
+                    mDrawerLayout.closeDrawers();
+                    break;
+
+                case 2: // Logs
+                    Intent loggerIntent = new Intent(getApplicationContext(),
+                            LogHistoryActivity.class);
+                    startActivity(loggerIntent);
+                    mDrawerLayout.closeDrawers();
+                    break;
+            }
+        }
+    }
 }