70f3362bd79bacde49bef92f5159149403bce1a5
[pub/Android/ownCloud.git] / src / eu / alefzero / owncloud / ui / activity / Preferences.java
1 /* ownCloud Android client application
2 * Copyright (C) 2011 Bartek Przybylski
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 *
17 */
18 package eu.alefzero.owncloud.ui.activity;
19
20 import java.net.URI;
21 import java.net.URISyntaxException;
22 import java.util.Vector;
23
24 import android.accounts.Account;
25 import android.accounts.AccountManager;
26 import android.app.Activity;
27 import android.content.Intent;
28 import android.os.Bundle;
29 import android.preference.ListPreference;
30 import android.preference.Preference;
31 import android.preference.Preference.OnPreferenceChangeListener;
32 import android.preference.PreferenceScreen;
33 import android.util.Log;
34 import android.view.ContextMenu;
35 import android.view.ContextMenu.ContextMenuInfo;
36 import android.view.View;
37 import android.widget.AdapterView.AdapterContextMenuInfo;
38
39 import com.actionbarsherlock.app.ActionBar;
40 import com.actionbarsherlock.app.SherlockPreferenceActivity;
41 import com.actionbarsherlock.view.Menu;
42 import com.actionbarsherlock.view.MenuInflater;
43 import com.actionbarsherlock.view.MenuItem;
44
45 import eu.alefzero.owncloud.OwnCloudSession;
46 import eu.alefzero.owncloud.R;
47 import eu.alefzero.owncloud.authenticator.AccountAuthenticator;
48 import eu.alefzero.owncloud.authenticator.AuthUtils;
49 import eu.alefzero.owncloud.db.DbHandler;
50
51 /**
52 * An Activity that allows the user to change the application's settings.
53 * @author Bartek Przybylski
54 *
55 */
56 public class Preferences extends SherlockPreferenceActivity implements OnPreferenceChangeListener {
57 private static final String TAG = "OwnCloudPreferences";
58 private final int mNewSession = 47;
59 private final int mEditSession = 48;
60 private DbHandler mDbHandler;
61 private Vector<OwnCloudSession> mSessions;
62 private Account[] mAccounts;
63 private ListPreference mAccountList;
64 private int mSelectedMenuItem;
65
66 @Override
67 public void onCreate(Bundle savedInstanceState){
68 super.onCreate(savedInstanceState);
69 mDbHandler = new DbHandler(getBaseContext());
70 mSessions = new Vector<OwnCloudSession>();
71 addPreferencesFromResource(R.xml.preferences);
72 registerForContextMenu(getListView());
73 populateAccountList();
74 ActionBar actionBar = getSherlock().getActionBar();
75 actionBar.setDisplayHomeAsUpEnabled(true);
76 //populateSessionList();
77 }
78
79 private void populateSessionList() {
80 mSessions.clear();
81 mSessions = mDbHandler.getSessionList();
82 PreferenceScreen ps = getPreferenceScreen();
83 ps.removeAll();
84 addPreferencesFromResource(R.xml.preferences);
85 for (int i = 0; i < mSessions.size(); i++) {
86 Preference preference = new Preference(getBaseContext());
87 preference.setTitle(mSessions.get(i).getName());
88 URI uri;
89 try {
90 uri = new URI(mSessions.get(i).getUrl());
91 } catch (URISyntaxException e) {
92 e.printStackTrace(); // should never happen
93 continue;
94 }
95 preference.setSummary(uri.getScheme() + "://" + uri.getHost()+uri.getPath());
96 ps.addPreference(preference);
97 }
98 }
99
100 /**
101 * Populates the account selector
102 */
103 private void populateAccountList(){
104 AccountManager accMan = AccountManager.get(this);
105 mAccounts = accMan.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);
106 mAccountList = (ListPreference) findPreference("select_oc_account");
107 mAccountList.setOnPreferenceChangeListener(this);
108
109 // Display the name of the current account if there is any
110 Account defaultAccount = AuthUtils.getCurrentOwnCloudAccount(this);
111 if(defaultAccount != null){
112 mAccountList.setSummary(defaultAccount.name);
113 }
114
115 // Transform accounts into array of string for preferences to use
116 String[] accNames = new String[mAccounts.length];
117 for(int i = 0; i < mAccounts.length; i++){
118 Account account = mAccounts[i];
119 accNames[i] = account.name;
120 }
121
122 mAccountList.setEntries(accNames);
123 mAccountList.setEntryValues(accNames);
124 }
125
126 @Override
127 public boolean onCreateOptionsMenu(Menu menu) {
128 super.onCreateOptionsMenu(menu);
129 MenuInflater inflater = getSherlock().getMenuInflater();
130 inflater.inflate(R.menu.prefs_menu, menu);
131 return true;
132 }
133
134 @Override
135 public boolean onMenuItemSelected(int featureId, MenuItem item) {
136 super.onMenuItemSelected(featureId, item);
137 Intent intent;
138
139 switch (item.getItemId()) {
140 case R.id.addSessionItem:
141 intent = new Intent(this, PreferencesNewSession.class);
142 startActivityForResult(intent, mNewSession);
143 break;
144 case R.id.SessionContextEdit:
145 intent = new Intent(this, PreferencesNewSession.class);
146 intent.putExtra("sessionId", mSessions.get(mSelectedMenuItem).getEntryId());
147 intent.putExtra("sessionName", mSessions.get(mSelectedMenuItem).getName());
148 intent.putExtra("sessionURL", mSessions.get(mSelectedMenuItem).getUrl());
149 startActivityForResult(intent, mEditSession);
150 break;
151 case R.id.SessionContextRemove:
152 OwnCloudSession ocs = mSessions.get(mSelectedMenuItem);
153 mDbHandler.removeSessionWithId(ocs.getEntryId());
154 mSessions.remove(ocs);
155 getPreferenceScreen().removePreference(getPreferenceScreen().getPreference(mSelectedMenuItem+1));
156 break;
157 case android.R.id.home:
158 intent = new Intent(getBaseContext(), LandingActivity.class);
159 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
160 startActivity(intent);
161 break;
162 default:
163 Log.w(TAG, "Unknown menu item triggered");
164 return false;
165 }
166 return true;
167 }
168
169 @Override
170 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
171 super.onActivityResult(requestCode, resultCode, data);
172 if (resultCode == Activity.RESULT_OK) {
173 switch (requestCode) {
174 case mNewSession:
175 mDbHandler.addSession(data.getStringExtra("sessionName"),
176 data.getStringExtra("sessionURL"));
177 getPreferenceScreen().removeAll();
178 addPreferencesFromResource(R.xml.preferences);
179 populateSessionList();
180 break;
181 case mEditSession:
182 mDbHandler.changeSessionFields(data.getIntExtra("sessionId", -1),
183 data.getStringExtra("sessionName"),
184 data.getStringExtra("sessionURL"));
185 populateSessionList();
186 break;
187 }
188 }
189 }
190
191 @Override
192 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
193 super.onCreateContextMenu(menu, v, menuInfo);
194 AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
195 mSelectedMenuItem = info.position-1;
196 menu.setHeaderTitle(mSessions.get(mSelectedMenuItem).getName());
197
198 MenuInflater inflater = getSherlock().getMenuInflater();
199 inflater.inflate(R.menu.session_context_menu, (Menu) menu);
200
201 }
202
203 @Override
204 protected void onDestroy() {
205 mDbHandler.close();
206 super.onDestroy();
207 }
208
209 @Override
210 /**
211 * Updates the summary of the account selector after a new account has
212 * been selected
213 */
214 public boolean onPreferenceChange(Preference preference, Object newValue) {
215 if(preference.equals(mAccountList)) {
216 mAccountList.setSummary(newValue.toString());
217 }
218 return true;
219 }
220
221 }