X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/a957efbd3df9bc957b078f3a12b47ca3258cb699..a6afe6efd24d35d02dc9720432a2daa47b58ffdd:/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 15ae7760..27113686 100644 --- a/src/com/owncloud/android/ui/activity/Preferences.java +++ b/src/com/owncloud/android/ui/activity/Preferences.java @@ -17,51 +17,68 @@ */ package com.owncloud.android.ui.activity; -import java.io.File; -import java.util.Vector; - +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.Environment; +import android.os.Handler; import android.preference.CheckBoxPreference; -import android.preference.ListPreference; 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; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; -import com.owncloud.android.Log_OC; -import com.owncloud.android.OwnCloudSession; +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.LongClickableCheckBoxPreference; +import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.utils.Log_OC; + /** * An Activity that allows the user to change the application's settings. * * @author Bartek Przybylski - * + * @author David A. Velasco */ -public class Preferences extends SherlockPreferenceActivity implements OnPreferenceChangeListener { +public class Preferences extends SherlockPreferenceActivity implements AccountManagerCallback { private static final String TAG = "OwnCloudPreferences"; - private final int mNewSession = 47; - private final int mEditSession = 48; + + private static final String PREVIOUS_ACCOUNT_KEY = "ACCOUNT"; + private DbHandler mDbHandler; - private Vector mSessions; - private ListPreference mTrackingUpdateInterval; - private CheckBoxPreference mDeviceTracking; private CheckBoxPreference pCode; - private CheckBoxPreference pLogging; - private Preference pLoggingHistory; + //private CheckBoxPreference pLogging; + //private Preference pLoggingHistory; private Preference pAboutApp; - private int mSelectedMenuItem; + + private Account mPreviousAccount = null; + private PreferenceCategory mAccountsPrefCategory = null; + private final Handler mHandler = new Handler(); + private String mAccountName; + private boolean mShowContextMenu = false; @SuppressWarnings("deprecation") @@ -69,22 +86,45 @@ public class Preferences extends SherlockPreferenceActivity implements OnPrefere public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDbHandler = new DbHandler(getBaseContext()); - mSessions = new Vector(); addPreferencesFromResource(R.xml.preferences); - //populateAccountList(); + ActionBar actionBar = getSherlock().getActionBar(); + actionBar.setIcon(DisplayUtils.getSeasonalIconId()); actionBar.setDisplayHomeAsUpEnabled(true); - Preference p = findPreference("manage_account"); - if (p != null) - p.setOnPreferenceClickListener(new OnPreferenceClickListener() { + + if (savedInstanceState != null) { + mPreviousAccount = savedInstanceState.getParcelable(PREVIOUS_ACCOUNT_KEY); + } else { + mPreviousAccount = AccountUtils.getCurrentOwnCloudAccount(this); + } + + // Load the accounts category for adding the list of accounts + mAccountsPrefCategory = (PreferenceCategory) findPreference("accounts_category"); + + ListView listView = getListView(); + listView.setOnItemLongClickListener(new OnItemLongClickListener() { @Override - public boolean onPreferenceClick(Preference preference) { - Intent i = new Intent(getApplicationContext(), AccountSelectActivity.class); - startActivity(i); - return true; + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + ListView listView = (ListView) parent; + ListAdapter listAdapter = listView.getAdapter(); + Object obj = listAdapter.getItem(position); + + if (obj != null && obj instanceof LongClickableCheckBoxPreference) { + mShowContextMenu = true; + mAccountName = obj.toString(); + + 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() { @@ -94,11 +134,123 @@ public class Preferences extends SherlockPreferenceActivity implements OnPrefere i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "preferences"); i.putExtra(PinCodeActivity.EXTRA_NEW_STATE, newValue.toString()); startActivity(i); + return true; } - }); + }); + + } + + PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("more"); + + boolean helpEnabled = getResources().getBoolean(R.bool.help_enabled); + Preference pHelp = findPreference("help"); + if (pHelp != null ){ + if (helpEnabled) { + pHelp.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + String helpWeb =(String) getText(R.string.url_help); + if (helpWeb != null && helpWeb.length() > 0) { + Uri uriUrl = Uri.parse(helpWeb); + Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl); + startActivity(intent); + } + return true; + } + }); + } else { + preferenceCategory.removePreference(pHelp); + } + + } + + + boolean recommendEnabled = getResources().getBoolean(R.bool.recommend_enabled); + Preference pRecommend = findPreference("recommend"); + if (pRecommend != null){ + if (recommendEnabled) { + pRecommend.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + + Intent intent = new Intent(Intent.ACTION_SENDTO); + intent.setType("text/plain"); + intent.setData(Uri.parse(getString(R.string.mail_recommend))); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + String appName = getString(R.string.app_name); + String downloadUrl = getString(R.string.url_app_download); + Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(Preferences.this); + String username = currentAccount.name.substring(0, currentAccount.name.lastIndexOf('@')); + + String recommendSubject = String.format(getString(R.string.recommend_subject), appName); + String recommendText = String.format(getString(R.string.recommend_text), appName, downloadUrl, username); + + intent.putExtra(Intent.EXTRA_SUBJECT, recommendSubject); + intent.putExtra(Intent.EXTRA_TEXT, recommendText); + startActivity(intent); + + + return(true); + + } + }); + } else { + preferenceCategory.removePreference(pRecommend); + } - /* About App */ + } + + boolean feedbackEnabled = getResources().getBoolean(R.bool.feedback_enabled); + Preference pFeedback = findPreference("feedback"); + if (pFeedback != null){ + if (feedbackEnabled) { + pFeedback.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + String feedbackMail =(String) getText(R.string.mail_feedback); + String feedback =(String) getText(R.string.prefs_feedback); + Intent intent = new Intent(Intent.ACTION_SENDTO); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_SUBJECT, feedback); + + intent.setData(Uri.parse(feedbackMail)); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + + return true; + } + }); + } else { + preferenceCategory.removePreference(pFeedback); + } + + } + + boolean imprintEnabled = getResources().getBoolean(R.bool.imprint_enabled); + Preference pImprint = findPreference("imprint"); + if (pImprint != null) { + if (imprintEnabled) { + pImprint.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + String imprintWeb = (String) getText(R.string.url_imprint); + if (imprintWeb != null && imprintWeb.length() > 0) { + Uri uriUrl = Uri.parse(imprintWeb); + Intent intent = new Intent(Intent.ACTION_VIEW, uriUrl); + startActivity(intent); + } + //ImprintDialog.newInstance(true).show(preference.get, "IMPRINT_DIALOG"); + return true; + } + }); + } else { + preferenceCategory.removePreference(pImprint); + } + } + + /* About App */ pAboutApp = (Preference) findPreference("about_app"); if (pAboutApp != null) { pAboutApp.setTitle(String.format(getString(R.string.about_android), getString(R.string.app_name))); @@ -148,15 +300,77 @@ public class Preferences extends SherlockPreferenceActivity implements OnPrefere } */ - } + } + + @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 protected void onResume() { + super.onResume(); SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); boolean state = appPrefs.getBoolean("set_pincode", false); pCode.setChecked(state); - super.onResume(); + + // Populate the accounts category with the list of accounts + addAccountsCheckboxPreferences(); } @Override @@ -171,21 +385,6 @@ public class Preferences extends SherlockPreferenceActivity implements OnPrefere Intent intent; switch (item.getItemId()) { - //case R.id.addSessionItem: - case 1: - intent = new Intent(this, PreferencesNewSession.class); - startActivityForResult(intent, mNewSession); - break; - case R.id.SessionContextEdit: - intent = new Intent(this, PreferencesNewSession.class); - intent.putExtra("sessionId", mSessions.get(mSelectedMenuItem) - .getEntryId()); - intent.putExtra("sessionName", mSessions.get(mSelectedMenuItem) - .getName()); - intent.putExtra("sessionURL", mSessions.get(mSelectedMenuItem) - .getUrl()); - startActivityForResult(intent, mEditSession); - break; case android.R.id.home: intent = new Intent(getBaseContext(), FileDisplayActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); @@ -208,36 +407,110 @@ public class Preferences extends SherlockPreferenceActivity implements OnPrefere mDbHandler.close(); super.onDestroy(); } - - @Override + /** - * Updates various summaries after updates. Also starts and stops - * the + * Create the list of accounts that has been added into the app */ - public boolean onPreferenceChange(Preference preference, Object newValue) { - // Update current account summary - /*if (preference.equals(mAccountList)) { - mAccountList.setSummary(newValue.toString()); + @SuppressWarnings("deprecation") + private void addAccountsCheckboxPreferences() { + + // Remove accounts in case list is refreshing for avoiding to have + // duplicate items + if (mAccountsPrefCategory.getPreferenceCount() > 0) { + mAccountsPrefCategory.removeAll(); } - // Update tracking interval summary - else*/ if (preference.equals(mTrackingUpdateInterval)) { - String trackingSummary = getResources().getString( - R.string.prefs_trackmydevice_interval_summary); - trackingSummary = String.format(trackingSummary, - newValue.toString()); - mTrackingUpdateInterval.setSummary(trackingSummary); + AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE); + Account accounts[] = am.getAccountsByType(MainApp.getAccountType()); + Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext()); + + 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); + } + + 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)) { + p.setChecked(true); + AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), a.name); + } else { + p.setChecked(false); + } + } + 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(); + } + + } + } + + /** + * 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; + } + }); - // Start or stop tracking service - else if (preference.equals(mDeviceTracking)) { - Intent locationServiceIntent = new Intent(); - locationServiceIntent - .setAction("com.owncloud.android.location.LocationLauncher"); - locationServiceIntent.putExtra("TRACKING_SETTING", - (Boolean) newValue); - sendBroadcast(locationServiceIntent); - } - return true; } + + @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); + } + } + super.onPause(); + } + }