X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/471d64a16ca536a01e4e6536d616b4c6f665207e..ec19a11a385ff21d3e85a94e618d48d8be9ef20d:/src/com/owncloud/android/ui/activity/Preferences.java diff --git a/src/com/owncloud/android/ui/activity/Preferences.java b/src/com/owncloud/android/ui/activity/Preferences.java index e549ec21..d078b1e2 100644 --- a/src/com/owncloud/android/ui/activity/Preferences.java +++ b/src/com/owncloud/android/ui/activity/Preferences.java @@ -19,18 +19,28 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; import android.accounts.AccountManager; +import android.accounts.AccountManagerCallback; +import android.accounts.AccountManagerFuture; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceCategory; import android.preference.PreferenceManager; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.View; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemLongClickListener; +import android.widget.ListAdapter; +import android.widget.ListView; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.SherlockPreferenceActivity; @@ -39,10 +49,11 @@ import com.actionbarsherlock.view.MenuItem; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.db.DbHandler; -import com.owncloud.android.ui.PreferenceMultiline; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.ui.LongClickableCheckBoxPreference; import com.owncloud.android.utils.DisplayUtils; -import com.owncloud.android.utils.Log_OC; /** @@ -51,19 +62,19 @@ import com.owncloud.android.utils.Log_OC; * @author Bartek Przybylski * @author David A. Velasco */ -public class Preferences extends SherlockPreferenceActivity { +public class Preferences extends SherlockPreferenceActivity implements AccountManagerCallback { private static final String TAG = "OwnCloudPreferences"; - private static final String PREVIOUS_ACCOUNT_KEY = "ACCOUNT"; - private DbHandler mDbHandler; private CheckBoxPreference pCode; - //private CheckBoxPreference pLogging; - //private Preference pLoggingHistory; private Preference pAboutApp; - private Account mPreviousAccount = null; + private PreferenceCategory mAccountsPrefCategory = null; + private final Handler mHandler = new Handler(); + private String mAccountName; + private boolean mShowContextMenu = false; + private String mUploadPath; @SuppressWarnings("deprecation") @@ -72,41 +83,41 @@ public class Preferences extends SherlockPreferenceActivity { super.onCreate(savedInstanceState); mDbHandler = new DbHandler(getBaseContext()); addPreferencesFromResource(R.xml.preferences); - //populateAccountList(); + ActionBar actionBar = getSherlock().getActionBar(); actionBar.setIcon(DisplayUtils.getSeasonalIconId()); actionBar.setDisplayHomeAsUpEnabled(true); - - if (savedInstanceState != null) { - mPreviousAccount = savedInstanceState.getParcelable(PREVIOUS_ACCOUNT_KEY); - } else { - mPreviousAccount = AccountUtils.getCurrentOwnCloudAccount(this); - } + actionBar.setTitle(R.string.actionbar_settings); + + loadInstantUploadPath(); // Load the accounts category for adding the list of accounts - PreferenceCategory accountsPrefCategory = (PreferenceCategory) findPreference("accounts_category"); + mAccountsPrefCategory = (PreferenceCategory) findPreference("accounts_category"); - // Populate the accounts category with the list of accounts - createAccountsCheckboxPreferences(accountsPrefCategory); + ListView listView = getListView(); + listView.setOnItemLongClickListener(new OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + ListView listView = (ListView) parent; + ListAdapter listAdapter = listView.getAdapter(); + Object obj = listAdapter.getItem(position); - // Show Create Account if Multiaccount is enabled - if (!getResources().getBoolean(R.bool.multiaccount_support)) { - PreferenceMultiline addAccountPreference = (PreferenceMultiline) findPreference("add_account"); - accountsPrefCategory.removePreference(addAccountPreference); - } + if (obj != null && obj instanceof LongClickableCheckBoxPreference) { + mShowContextMenu = true; + mAccountName = obj.toString(); - Preference pAddAccount = findPreference("add_account"); - if (pAddAccount != null) - pAddAccount.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - AccountManager am = AccountManager.get(getApplicationContext()); - am.addAccount(MainApp.getAccountType(), null, null, null, Preferences.this, null, null); - return true; + Preferences.this.openContextMenu(listView); + + View.OnLongClickListener longListener = (View.OnLongClickListener) obj; + return longListener.onLongClick(view); + } + return false; } }); - + // Register context menu for list of preferences. + registerForContextMenu(getListView()); + pCode = (CheckBoxPreference) findPreference("set_pincode"); if (pCode != null){ pCode.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @@ -231,6 +242,16 @@ public class Preferences extends SherlockPreferenceActivity { preferenceCategory.removePreference(pImprint); } } + + Preference pInstantUploadPathApp = (Preference) findPreference("instant_upload_path"); + + pInstantUploadPathApp.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + mUploadPath = updateInstantUploadPath(newValue.toString()); + return true; + } + }); /* About App */ pAboutApp = (Preference) findPreference("about_app"); @@ -244,44 +265,72 @@ public class Preferences extends SherlockPreferenceActivity { Log_OC.e(TAG, "Error while showing about dialog", e); } } - - /* DISABLED FOR RELEASE UNTIL FIXED - pLogging = (CheckBoxPreference) findPreference("log_to_file"); - if (pLogging != null) { - pLogging.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - - String logpath = Environment.getExternalStorageDirectory()+File.separator+"owncloud"+File.separator+"log"; - - if(!pLogging.isChecked()) { - Log_OC.d("Debug", "start logging"); - Log_OC.v("PATH", logpath); - Log_OC.startLogging(logpath); - } - else { - Log_OC.d("Debug", "stop logging"); - Log_OC.stopLogging(); - } - return true; - } - }); - } - - pLoggingHistory = (Preference) findPreference("log_history"); - if (pLoggingHistory != null) { - pLoggingHistory.setOnPreferenceClickListener(new OnPreferenceClickListener() { - - @Override - public boolean onPreferenceClick(Preference preference) { - Intent intent = new Intent(getApplicationContext(),LogHistoryActivity.class); - startActivity(intent); - return true; + } + + @Override + protected void onPause() { + saveInstantUploadPathOnPreferences(); + super.onPause(); + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { + + // Filter for only showing contextual menu when long press on the + // accounts + if (mShowContextMenu) { + getMenuInflater().inflate(R.menu.account_picker_long_click, menu); + mShowContextMenu = false; + } + super.onCreateContextMenu(menu, v, menuInfo); + } + + /** + * Called when the user clicked on an item into the context menu created at + * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} for + * every ownCloud {@link Account} , containing 'secondary actions' for them. + * + * {@inheritDoc} + */ + @Override + public boolean onContextItemSelected(android.view.MenuItem item) { + AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE); + Account accounts[] = am.getAccountsByType(MainApp.getAccountType()); + for (Account a : accounts) { + if (a.name.equals(mAccountName)) { + if (item.getItemId() == R.id.change_password) { + + // Change account password + Intent updateAccountCredentials = new Intent(this, AuthenticatorActivity.class); + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACCOUNT, a); + updateAccountCredentials.putExtra(AuthenticatorActivity.EXTRA_ACTION, + AuthenticatorActivity.ACTION_UPDATE_TOKEN); + startActivity(updateAccountCredentials); + + } else if (item.getItemId() == R.id.delete_account) { + + // Remove account + am.removeAccount(a, this, mHandler); + } } - }); - } - */ - + } + + return true; + } + + @Override + public void run(AccountManagerFuture future) { + if (future.isDone()) { + Account a = AccountUtils.getCurrentOwnCloudAccount(this); + String accountName = ""; + if (a == null) { + Account[] accounts = AccountManager.get(this).getAccountsByType(MainApp.getAccountType()); + if (accounts.length != 0) + accountName = accounts[0].name; + AccountUtils.setCurrentOwnCloudAccount(this, accountName); + } + addAccountsCheckboxPreferences(); + } } @Override @@ -290,6 +339,9 @@ public class Preferences extends SherlockPreferenceActivity { SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); boolean state = appPrefs.getBoolean("set_pincode", false); pCode.setChecked(state); + + // Populate the accounts category with the list of accounts + addAccountsCheckboxPreferences(); } @Override @@ -328,64 +380,148 @@ public class Preferences extends SherlockPreferenceActivity { } /** - * Create the list of accounts that have been added into the app - * - * @param accountsPrefCategory + * Create the list of accounts that has been added into the app */ - private void createAccountsCheckboxPreferences(PreferenceCategory accountsPrefCategory) { + @SuppressWarnings("deprecation") + private void addAccountsCheckboxPreferences() { + + // Remove accounts in case list is refreshing for avoiding to have + // duplicate items + if (mAccountsPrefCategory.getPreferenceCount() > 0) { + mAccountsPrefCategory.removeAll(); + } + AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE); Account accounts[] = am.getAccountsByType(MainApp.getAccountType()); Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext()); - for (Account a : accounts) { - CheckBoxPreference checkBoxPreference = new CheckBoxPreference(this); - checkBoxPreference.setKey(a.name); - checkBoxPreference.setTitle(a.name); - // Check the current account that is being used - if (a.name.equals(currentAccount.name)) { - checkBoxPreference.setChecked(true); - } + if (am.getAccountsByType(MainApp.getAccountType()).length == 0) { + // Show create account screen if there isn't any account + am.addAccount(MainApp.getAccountType(), null, null, null, this, + null, + null); + } + else { + + for (Account a : accounts) { + LongClickableCheckBoxPreference accountPreference = new LongClickableCheckBoxPreference(this); + accountPreference.setKey(a.name); + accountPreference.setTitle(a.name); + mAccountsPrefCategory.addPreference(accountPreference); + + // Check the current account that is being used + if (a.name.equals(currentAccount.name)) { + accountPreference.setChecked(true); + } else { + accountPreference.setChecked(false); + } - checkBoxPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - String key = preference.getKey(); - AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE); - Account accounts[] = am.getAccountsByType(MainApp.getAccountType()); - for (Account a : accounts) { - @SuppressWarnings("deprecation") - CheckBoxPreference p = (CheckBoxPreference) findPreference(a.name); - if (key.equals(a.name)) { - p.setChecked(true); - AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), a.name); - } else { - p.setChecked(false); + accountPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + String key = preference.getKey(); + AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE); + Account accounts[] = am.getAccountsByType(MainApp.getAccountType()); + for (Account a : accounts) { + CheckBoxPreference p = (CheckBoxPreference) findPreference(a.name); + if (key.equals(a.name)) { + boolean accountChanged = !p.isChecked(); + p.setChecked(true); + AccountUtils.setCurrentOwnCloudAccount( + getApplicationContext(), + a.name + ); + if (accountChanged) { + // restart the main activity + Intent i = new Intent( + Preferences.this, + FileDisplayActivity.class + ); + i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(i); + } else { + finish(); + } + } else { + p.setChecked(false); + } } + return (Boolean) newValue; } - return (Boolean) newValue; - } - }); + }); + + } + + // Add Create Account preference at the end of account list if + // Multiaccount is enabled + if (getResources().getBoolean(R.bool.multiaccount_support)) { + createAddAccountPreference(); + } - accountsPrefCategory.addPreference(checkBoxPreference); } } - @Override - protected void onPause() { - if (this.isFinishing()) { - Account current = AccountUtils.getCurrentOwnCloudAccount(this); - if ((mPreviousAccount == null && current != null) - || (mPreviousAccount != null && !mPreviousAccount.equals(current))) { - // the account set as default changed since this activity was - // created - - // restart the main activity - Intent i = new Intent(this, FileDisplayActivity.class); - i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(i); + /** + * Create the preference for allow adding new accounts + */ + private void createAddAccountPreference() { + Preference addAccountPref = new Preference(this); + addAccountPref.setKey("add_account"); + addAccountPref.setTitle(getString(R.string.prefs_add_account)); + mAccountsPrefCategory.addPreference(addAccountPref); + + addAccountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + AccountManager am = AccountManager.get(getApplicationContext()); + am.addAccount(MainApp.getAccountType(), null, null, null, Preferences.this, null, null); + return true; } + }); + + } + + /** + * Update the upload path checking that it is a correct path + * @param uploadPath: path write by user + * @return String: uploadPath + */ + private String updateInstantUploadPath(String uploadPath) { + String slashString = "/"; + + // If slashes are duplicated, replace them for only one slash + uploadPath = uploadPath.replaceAll("/+", slashString); + + // Remove last slash from path + if (uploadPath.length() > 0 && uploadPath.charAt(uploadPath.length()-1) == slashString.charAt(0)) { + uploadPath = uploadPath.substring(0, uploadPath.length()-1); } - super.onPause(); + + if (uploadPath.isEmpty()) { // Set default instant upload path + uploadPath = getString(R.string.instant_upload_path); + }else { + if (!uploadPath.startsWith(slashString)) { // Add initial slash on path if necessary + uploadPath = slashString.concat(uploadPath); + } + } + return uploadPath; } + /** + * Load upload path set on preferences + */ + private void loadInstantUploadPath() { + SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + mUploadPath = appPrefs.getString("instant_upload_path", getString(R.string.instant_upload_path)); + } + + /** + * Save the "Instant Upload Path" on preferences + */ + private void saveInstantUploadPathOnPreferences() { + SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + SharedPreferences.Editor editor = appPrefs.edit(); + editor.putString("instant_upload_path", mUploadPath); + editor.commit(); + } }