X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/47343ca29931255e0e0526dc4f5686a83947b0c5..fc40765890415abe9f2569a44adcbe88412ea1ba:/src/com/owncloud/android/ui/activity/FileActivity.java diff --git a/src/com/owncloud/android/ui/activity/FileActivity.java b/src/com/owncloud/android/ui/activity/FileActivity.java index fbb62edd..1c21cab4 100644 --- a/src/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/com/owncloud/android/ui/activity/FileActivity.java @@ -31,15 +31,27 @@ 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.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.ActionBarDrawerToggle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; 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 +60,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; @@ -57,78 +69,104 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.operations.CreateShareOperation; +import com.owncloud.android.operations.SynchronizeFileOperation; 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 AppCompatActivity 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(); - + private static final String DIALOG_WAIT_TAG = "DIALOG_WAIT"; 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 */ + + /** Flag to signal when the value of mAccount was set */ protected boolean mAccountWasSet; - - /** Flag to signal when the value of mAccount was restored from a saved state */ + + /** Flag to signal when the value of mAccount was restored from a saved state */ protected boolean mAccountWasRestored; - + /** Flag to signal if the activity is launched by a notification */ private boolean mFromNotification; - + /** Messages handler associated to the main thread and the life cycle of the activity */ private Handler mHandler; - + /** Access point to the cached database for the current ownCloud {@link Account} */ private FileDataStorageManager mStorageManager = null; - + private FileOperationsHelper mFileOperationsHelper; - + private ServiceConnection mOperationsServiceConnection = null; - + private OperationsServiceBinder mOperationsServiceBinder = null; - + protected FileDownloaderBinder mDownloaderBinder = null; protected FileUploaderBinder mUploaderBinder = null; 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 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 + * Loads the ownCloud {@link Account} and main {@link OCFile} to be handled by the instance of * the {@link FileActivity}. - * - * Grants that a valid ownCloud {@link Account} is associated to the instance, or that the user + * + * Grants that a valid ownCloud {@link Account} is associated to the instance, or that the user * is requested to create a new one. */ @Override @@ -144,26 +182,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); } } @@ -179,8 +223,8 @@ public class FileActivity extends SherlockFragmentActivity } /** - * Since ownCloud {@link Account}s can be managed from the system setting menu, - * the existence of the {@link Account} associated to the instance must be checked + * Since ownCloud {@link Account}s can be managed from the system setting menu, + * the existence of the {@link Account} associated to the instance must be checked * every time it is restarted. */ @Override @@ -194,8 +238,8 @@ public class FileActivity extends SherlockFragmentActivity Log_OC.v(TAG, "onRestart() end"); } - - @Override + + @Override protected void onStart() { super.onStart(); @@ -203,26 +247,26 @@ public class FileActivity extends SherlockFragmentActivity onAccountSet(mAccountWasRestored); } } - + @Override protected void onResume() { super.onResume(); - + if (mOperationsServiceBinder != null) { doOnResumeAndBound(); } } - + @Override protected void onPause() { if (mOperationsServiceBinder != null) { mOperationsServiceBinder.removeOperationListener(this); } - + super.onPause(); } - - + + @Override protected void onDestroy() { if (mOperationsServiceConnection != null) { @@ -240,51 +284,240 @@ public class FileActivity extends SherlockFragmentActivity super.onDestroy(); } - - + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + // Sync the toggle state after onRestoreInstanceState has occurred. + if (mDrawerToggle != null) { + mDrawerToggle.syncState(); + if (isDrawerOpen()) { + getSupportActionBar().setTitle(R.string.app_name); + mDrawerToggle.setDrawerIndicatorEnabled(true); + } + } + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + if (mDrawerToggle != null) { + mDrawerToggle.onConfigurationChanged(newConfig); + } + } + + @Override + public void onBackPressed() { + if (isDrawerOpen()) { + closeNavDrawer(); + return; + } + super.onBackPressed(); + } + + /** + * checks if the drawer exists and is opened. + * + * @return true if the drawer is open, else false + */ + public boolean isDrawerOpen() { + if(mDrawerLayout != null) { + return mDrawerLayout.isDrawerOpen(GravityCompat.START); + } else { + return false; + } + } + /** - * Sets and validates the ownCloud {@link Account} associated to the Activity. - * + * closes the navigation drawer. + */ + public void closeNavDrawer() { + if(mDrawerLayout != null) { + mDrawerLayout.closeDrawer(GravityCompat.START); + } + } + + 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 + RelativeLayout navigationDrawerLayout = (RelativeLayout) 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)); +// } + + // Display username in drawer + Account account = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext()); + if (account != null) { + TextView username = (TextView) navigationDrawerLayout.findViewById(R.id.drawer_username); + 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(); + // 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], + R.drawable.ic_folder_open)); + + // 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], + R.drawable.ic_settings)); + // Logs + if (BuildConfig.DEBUG) { + mDrawerItems.add(new NavigationDrawerItem(mDrawerTitles[2], + mDrawerContentDescriptions[2],R.drawable.ic_log)); + } + + // setting the nav drawer list adapter + mNavigationDrawerAdapter = new NavigationDrawerListAdapter(getApplicationContext(), this, + mDrawerItems); + mDrawerList.setAdapter(mNavigationDrawerAdapter); + + + mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,R.string.drawer_open,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(); + } + }; + + // Set the list's click listener + mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); + + // Set the drawer toggle as the DrawerListener + mDrawerLayout.setDrawerListener(mDrawerToggle); + mDrawerToggle.setDrawerIndicatorEnabled(false); + } + + /** + * 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. + * * If not valid, tries to swap it for other valid and existing ownCloud {@link Account}. - * - * POSTCONDITION: updates {@link #mAccountWasSet} and {@link #mAccountWasRestored}. - * + * + * POSTCONDITION: updates {@link #mAccountWasSet} and {@link #mAccountWasRestored}. + * * @param account New {@link Account} to set. * @param savedAccount When 'true', account was retrieved from a saved instance state. */ 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; mAccountWasRestored = (savedAccount || mAccount.equals(oldAccount)); - + } else { swapToDefaultAccount(); } } - + /** - * Tries to swap the current ownCloud {@link Account} for other valid and existing. - * - * If no valid ownCloud {@link Account} exists, the the user is requested + * Tries to swap the current ownCloud {@link Account} for other valid and existing. + * + * If no valid ownCloud {@link Account} exists, the the user is requested * to create a new ownCloud {@link Account}. - * + * * POSTCONDITION: updates {@link #mAccountWasSet} and {@link #mAccountWasRestored}. */ private void swapToDefaultAccount() { // default to the most recently used account - Account newAccount = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext()); + Account newAccount = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext()); if (newAccount == null) { /// no account available: force account creation createFirstAccount(); mRedirectingToSetupAccount = true; mAccountWasSet = false; mAccountWasRestored = false; - + } else { mAccountWasSet = true; mAccountWasRestored = (newAccount.equals(mAccount)); @@ -298,16 +531,16 @@ 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); } - + /** * {@inheritDoc} */ @@ -318,33 +551,40 @@ 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); + if(getSupportActionBar().getTitle() != null) { + // Null check in case the actionbar is used in ActionBar.NAVIGATION_MODE_LIST + // since it doesn't have a title then + outState.putString(KEY_ACTION_BAR_TITLE, getSupportActionBar().getTitle().toString()); + } } - - + + /** * Getter for the main {@link OCFile} handled by the activity. - * + * * @return Main {@link OCFile} handled by the activity. */ public OCFile getFile() { return mFile; } - + /** * Setter for the main {@link OCFile} handled by the activity. - * + * * @param file Main {@link OCFile} to be handled by the activity. */ public void setFile(OCFile file) { mFile = file; } - + /** - * 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. + * 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. */ public Account getAccount() { return mAccount; @@ -360,9 +600,9 @@ public class FileActivity extends SherlockFragmentActivity public boolean fromNotification() { return mFromNotification; } - + /** - * @return 'True' when the Activity is finishing to enforce the setup of a new account. + * @return 'True' when the Activity is finishing to enforce the setup of a new account. */ protected boolean isRedirectingToSetupAccount() { return mRedirectingToSetupAccount; @@ -375,11 +615,11 @@ public class FileActivity extends SherlockFragmentActivity public void setTryShareAgain(boolean tryShareAgain) { mTryShareAgain = tryShareAgain; } - + public OperationsServiceBinder getOperationsServiceBinder() { return mOperationsServiceBinder; } - + protected ServiceConnection newTransferenceServiceConnection() { return null; } @@ -387,7 +627,7 @@ public class FileActivity extends SherlockFragmentActivity /** * Helper class handling a callback from the {@link AccountManager} after the creation of * a new ownCloud {@link Account} finished, successfully or not. - * + * * At this moment, only called after the creation of the first account. */ public class AccountCreationCallback implements AccountManagerCallback { @@ -408,11 +648,11 @@ public class FileActivity extends SherlockFragmentActivity } } catch (OperationCanceledException e) { Log_OC.d(TAG, "Account creation canceled"); - + } catch (Exception e) { Log_OC.e(TAG, "Account creation finished in exception: ", e); } - + } else { Log_OC.e(TAG, "Account creation callback with null bundle"); } @@ -420,19 +660,19 @@ public class FileActivity extends SherlockFragmentActivity moveTaskToBack(true); } } - + } - - + + /** * Called when the ownCloud {@link Account} associated to the Activity was just updated. - * + * * Child classes must grant that state depending on the {@link Account} is updated. */ protected void onAccountSet(boolean stateWasRecovered) { if (getAccount() != null) { mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver()); - + } else { Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!"); } @@ -452,30 +692,31 @@ public class FileActivity extends SherlockFragmentActivity public Handler getHandler() { return mHandler; } - + public FileOperationsHelper getFileOperationsHelper() { return mFileOperationsHelper; } - + /** - * + * * @param operation Removal operation performed. * @param result Result of the removal. */ @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); - + if (!result.isSuccess() && ( - result.getCode() == ResultCode.UNAUTHORIZED || + result.getCode() == ResultCode.UNAUTHORIZED || result.isIdPRedirection() || (result.isException() && result.getException() instanceof AuthenticatorException) )) { - + requestCredentialsUpdate(); - + if (result.getCode() == ResultCode.UNAUTHORIZED) { dismissLoadingDialog(); Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, @@ -487,13 +728,16 @@ public class FileActivity extends SherlockFragmentActivity } else if (operation instanceof CreateShareOperation) { onCreateShareOperationFinish((CreateShareOperation) operation, result); - + } else if (operation instanceof UnshareLinkOperation) { onUnshareLinkOperationFinish((UnshareLinkOperation)operation, result); - + } else if (operation instanceof SynchronizeFolderOperation) { onSynchronizeFolderOperationFinish((SynchronizeFolderOperation)operation, result); + }else if (operation instanceof SynchronizeFileOperation) { + onSynchronizeFileOperationFinish((SynchronizeFileOperation)operation, result); + } } @@ -501,12 +745,13 @@ public class FileActivity extends SherlockFragmentActivity Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, getAccount()); updateAccountCredentials.putExtra( - AuthenticatorActivity.EXTRA_ACTION, + AuthenticatorActivity.EXTRA_ACTION, AuthenticatorActivity.ACTION_UPDATE_EXPIRED_TOKEN); updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); startActivity(updateAccountCredentials); } - + + private void onCreateShareOperationFinish(CreateShareOperation operation, RemoteOperationResult result) { @@ -514,7 +759,7 @@ public class FileActivity extends SherlockFragmentActivity if (result.isSuccess()) { mTryShareAgain = false; updateFileFromDB(); - + Intent sendIntent = operation.getSendIntent(); startActivity(sendIntent); } else { @@ -538,33 +783,56 @@ public class FileActivity extends SherlockFragmentActivity Toast.LENGTH_LONG); t.show(); } - } + } } - - - 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(); - } + } } private void onSynchronizeFolderOperationFinish( 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(); } } - + + private void onSynchronizeFileOperationFinish(SynchronizeFileOperation operation, + RemoteOperationResult result) { + dismissLoadingDialog(); + OCFile syncedFile = operation.getLocalFile(); + if (!result.isSuccess()) { + if (result.getCode() == ResultCode.SYNC_CONFLICT) { + Intent i = new Intent(this, ConflictsResolveActivity.class); + i.putExtra(ConflictsResolveActivity.EXTRA_FILE, syncedFile); + i.putExtra(ConflictsResolveActivity.EXTRA_ACCOUNT, getAccount()); + startActivity(i); + } + + } else { + if (!operation.transferWasRequested()) { + Toast msg = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, + operation, getResources()), Toast.LENGTH_LONG); + msg.show(); + } + invalidateOptionsMenu(); + } + } + protected void updateFileFromDB(){ OCFile file = getFile(); if (file != null) { @@ -572,9 +840,10 @@ public class FileActivity extends SherlockFragmentActivity setFile(file); } } - + + /** - * Show loading dialog + * Show loading dialog */ public void showLoadingDialog() { // Construct dialog @@ -582,14 +851,14 @@ public class FileActivity extends SherlockFragmentActivity FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); loading.show(ft, DIALOG_WAIT_TAG); - + } - + /** * Dismiss loading dialog */ - public void dismissLoadingDialog(){ + public void dismissLoadingDialog() { Fragment frag = getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_TAG); if (frag != null) { LoadingDialog loading = (LoadingDialog) frag; @@ -597,12 +866,13 @@ public class FileActivity extends SherlockFragmentActivity } } - + private void doOnResumeAndBound() { 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(); } @@ -610,8 +880,8 @@ public class FileActivity extends SherlockFragmentActivity } - /** - * Implements callback methods for service binding. Passed as a parameter to { + /** + * Implements callback methods for service binding. Passed as a parameter to { */ private class OperationsServiceConnection implements ServiceConnection { @@ -629,7 +899,7 @@ public class FileActivity extends SherlockFragmentActivity return; } } - + @Override public void onServiceDisconnected(ComponentName component) { @@ -652,6 +922,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; + } + } + } }