EMMA Coverage Report (generated Tue Jun 26 14:54:12 CEST 2012)
[all classes][org.tomdroid.ui]

COVERAGE SUMMARY FOR SOURCE FILE [PreferencesActivity.java]

nameclass, %method, %block, %line, %
PreferencesActivity.java67%  (4/6)38%  (9/24)50%  (203/406)45%  (42,4/94)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class PreferencesActivity$40%   (0/1)0%   (0/2)0%   (0/48)0%   (0/15)
PreferencesActivity$4 (PreferencesActivity, ProgressDialog): void 0%   (0/1)0%   (0/9)0%   (0/1)
handleMessage (Message): void 0%   (0/1)0%   (0/39)0%   (0/14)
     
class PreferencesActivity$50%   (0/1)0%   (0/2)0%   (0/9)0%   (0/3)
PreferencesActivity$5 (PreferencesActivity): void 0%   (0/1)0%   (0/6)0%   (0/1)
onClick (DialogInterface, int): void 0%   (0/1)0%   (0/3)0%   (0/2)
     
class PreferencesActivity$1100% (1/1)50%  (1/2)23%  (6/26)17%  (1/6)
onPreferenceChange (Preference, Object): boolean 0%   (0/1)0%   (0/20)0%   (0/5)
PreferencesActivity$1 (PreferencesActivity): void 100% (1/1)100% (6/6)100% (1/1)
     
class PreferencesActivity$2100% (1/1)50%  (1/2)23%  (6/26)17%  (1/6)
onPreferenceChange (Preference, Object): boolean 0%   (0/1)0%   (0/20)0%   (0/5)
PreferencesActivity$2 (PreferencesActivity): void 100% (1/1)100% (6/6)100% (1/1)
     
class PreferencesActivity100% (1/1)36%  (5/14)60%  (159/265)60%  (37,4/62)
access$000 (PreferencesActivity): ListPreference 0%   (0/1)0%   (0/3)0%   (0/1)
access$100 (PreferencesActivity, String): void 0%   (0/1)0%   (0/4)0%   (0/1)
access$200 (PreferencesActivity, String): void 0%   (0/1)0%   (0/4)0%   (0/1)
access$300 (PreferencesActivity): void 0%   (0/1)0%   (0/3)0%   (0/1)
access$400 (PreferencesActivity): void 0%   (0/1)0%   (0/3)0%   (0/1)
authenticate (String): void 0%   (0/1)0%   (0/35)0%   (0/9)
connectionFailed (): void 0%   (0/1)0%   (0/19)0%   (0/2)
resetLocalDatabase (): void 0%   (0/1)0%   (0/14)0%   (0/4)
syncServiceChanged (String): void 0%   (0/1)0%   (0/16)0%   (0/7)
setDefaults (): void 100% (1/1)88%  (29/33)89%  (8/9)
setServer (String): void 100% (1/1)94%  (17/18)83%  (5/6)
PreferencesActivity (): void 100% (1/1)100% (12/12)100% (4/4)
fillServices (): void 100% (1/1)100% (44/44)100% (9/9)
onCreate (Bundle): void 100% (1/1)100% (57/57)100% (12/12)
     
class PreferencesActivity$3100% (1/1)100% (2/2)100% (32/32)100% (6/6)
PreferencesActivity$3 (PreferencesActivity): void 100% (1/1)100% (6/6)100% (1/1)
onPreferenceClick (Preference): boolean 100% (1/1)100% (26/26)100% (5/5)

1/*
2 * Tomdroid
3 * Tomboy on Android
4 * http://www.launchpad.net/tomdroid
5 * 
6 * Copyright 2009, Benoit Garret <benoit.garret_launchpad@gadz.org>
7 * Copyright 2010, 2011 Olivier Bilodeau <olivier@bottomlesspit.org>
8 * 
9 * This file is part of Tomdroid.
10 * 
11 * Tomdroid is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation, either version 3 of the License, or
14 * (at your option) any later version.
15 * 
16 * Tomdroid is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 * GNU General Public License for more details.
20 * 
21 * You should have received a copy of the GNU General Public License
22 * along with Tomdroid.  If not, see <http://www.gnu.org/licenses/>.
23 */
24package org.tomdroid.ui;
25 
26import java.util.ArrayList;
27 
28import org.tomdroid.NoteManager;
29import org.tomdroid.R;
30import org.tomdroid.sync.ServiceAuth;
31import org.tomdroid.sync.SyncManager;
32import org.tomdroid.sync.SyncService;
33import org.tomdroid.util.FirstNote;
34import org.tomdroid.util.Preferences;
35import org.tomdroid.util.SearchSuggestionProvider;
36 
37import android.app.AlertDialog;
38import android.app.ProgressDialog;
39import android.content.DialogInterface;
40import android.content.Intent;
41import android.content.DialogInterface.OnClickListener;
42import android.net.Uri;
43import android.os.Bundle;
44import android.os.Handler;
45import android.os.Message;
46import android.preference.EditTextPreference;
47import android.preference.ListPreference;
48import android.preference.Preference;
49import android.preference.PreferenceActivity;
50import android.preference.Preference.OnPreferenceChangeListener;
51import android.preference.Preference.OnPreferenceClickListener;
52import android.provider.SearchRecentSuggestions;
53import android.util.Log;
54import android.widget.Toast;
55 
56public class PreferencesActivity extends PreferenceActivity {
57        
58        private static final String TAG = "PreferencesActivity";
59        
60        // TODO: put the various preferences in fields and figure out what to do on activity suspend/resume
61        private EditTextPreference syncServer = null;
62        private ListPreference syncService = null;
63        private Preference clearSearchHistory = null;
64        
65        @Override
66        protected void onCreate(Bundle savedInstanceState) {
67                
68                super.onCreate(savedInstanceState);
69                addPreferencesFromResource(R.xml.preferences);
70                
71                // Fill the Preferences fields
72                syncServer = (EditTextPreference)findPreference(Preferences.Key.SYNC_SERVER.getName());
73                syncService = (ListPreference)findPreference(Preferences.Key.SYNC_SERVICE.getName());
74                clearSearchHistory = (Preference)findPreference(Preferences.Key.CLEAR_SEARCH_HISTORY.getName());
75                
76                // Set the default values if nothing exists
77                this.setDefaults();
78                
79                // Fill the services combo list
80                this.fillServices();
81                
82                // Enable or disable the server field depending on the selected sync service
83                setServer(syncService.getValue());
84                
85                syncService.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
86                        
87                        public boolean onPreferenceChange(Preference preference, Object newValue) {
88                                String selectedSyncServiceKey = (String)newValue;
89                                
90                                // did the selection change?
91                                if (!syncService.getValue().contentEquals(selectedSyncServiceKey)) {
92                                        Log.d(TAG, "preference change triggered");
93                                        
94                                        syncServiceChanged(selectedSyncServiceKey);
95                                }
96                                return true;
97                        }
98                });
99                
100                // Re-authenticate if the sync server changes
101                syncServer.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
102 
103                        public boolean onPreferenceChange(Preference preference,
104                                        Object serverUri) {
105                                
106                                if (serverUri == null) {
107                                        Toast.makeText(PreferencesActivity.this,
108                                                        getString(R.string.prefServerEmpty),
109                                                        Toast.LENGTH_SHORT).show();
110                                        return false;
111                                }
112                            
113                                authenticate((String) serverUri);
114                                return true;
115                        }
116                        
117                });
118                
119                //delete Search History
120                clearSearchHistory.setOnPreferenceClickListener(new OnPreferenceClickListener() {
121                public boolean onPreferenceClick(Preference preference) {
122                    SearchRecentSuggestions suggestions = new SearchRecentSuggestions(PreferencesActivity.this,
123                            SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE);
124                    suggestions.clearHistory();
125                            
126                        Toast.makeText(getBaseContext(),
127                        getString(R.string.deletedSearchHistory),
128                        Toast.LENGTH_LONG).show();
129                        Log.d(TAG, "Deleted search history.");
130                        
131                        return true;
132                }
133            });
134        }
135        
136        private void authenticate(String serverUri) {
137 
138                // update the value before doing anything
139                Preferences.putString(Preferences.Key.SYNC_SERVER, serverUri);
140 
141                SyncService currentService = SyncManager.getInstance().getCurrentService();
142 
143                if (!currentService.needsAuth()) {
144                        return;
145                }
146 
147                // service needs authentication
148                Log.i(TAG, "Creating dialog");
149 
150                final ProgressDialog authProgress = ProgressDialog.show(this, "",
151                                getString(R.string.prefSyncCompleteAuth), true, false);
152 
153                Handler handler = new Handler() {
154 
155                        @Override
156                        public void handleMessage(Message msg) {
157 
158                                boolean wasSuccsessful = false;
159                                Uri authorizationUri = (Uri) msg.obj;
160                                if (authorizationUri != null) {
161 
162                                        Intent i = new Intent(Intent.ACTION_VIEW, authorizationUri);
163                                        startActivity(i);
164                                        wasSuccsessful = true;
165 
166                                } else {
167                                        // Auth failed, don't update the value
168                                        wasSuccsessful = false;
169                                }
170 
171                                if (authProgress != null)
172                                        authProgress.dismiss();
173 
174                                if (wasSuccsessful) {
175                                        resetLocalDatabase();
176                                } else {
177                                        connectionFailed();
178                                }
179                        }
180                };
181 
182                ((ServiceAuth) currentService).getAuthUri(serverUri, handler);
183        }
184        
185        private void fillServices()
186        {
187                ArrayList<SyncService> availableServices = SyncManager.getInstance().getServices();
188                CharSequence[] entries = new CharSequence[availableServices.size()];
189                CharSequence[] entryValues = new CharSequence[availableServices.size()];
190                
191                for (int i = 0; i < availableServices.size(); i++) {
192                        entries[i] = availableServices.get(i).getDescription();
193                        entryValues[i] = availableServices.get(i).getName();
194                }
195                
196                syncService.setEntries(entries);
197                syncService.setEntryValues(entryValues);
198        }
199        
200        private void setDefaults()
201        {
202                String defaultServer = (String)Preferences.Key.SYNC_SERVER.getDefault();
203                syncServer.setDefaultValue(defaultServer);
204                if(syncServer.getText() == null)
205                        syncServer.setText(defaultServer);
206 
207                String defaultService = (String)Preferences.Key.SYNC_SERVICE.getDefault();
208                syncService.setDefaultValue(defaultService);
209                if(syncService.getValue() == null)
210                        syncService.setValue(defaultService);
211        
212        }
213 
214        private void setServer(String syncServiceKey) {
215 
216                SyncService service = SyncManager.getInstance().getService(syncServiceKey);
217 
218                if (service == null)
219                        return;
220 
221                syncServer.setEnabled(service.needsServer());
222                syncService.setSummary(service.getDescription());
223        }
224                
225        private void connectionFailed() {
226                new AlertDialog.Builder(this)
227                        .setMessage(getString(R.string.prefSyncConnectionFailed))
228                        .setNeutralButton(getString(R.string.btnOk), new OnClickListener() {
229                                public void onClick(DialogInterface dialog, int which) {
230                                        dialog.dismiss();
231                                }})
232                        .show();
233        }
234 
235        //TODO use LocalStorage wrapper from two-way-sync branch when it get's merged
236        private void resetLocalDatabase() {
237                getContentResolver().delete(Tomdroid.CONTENT_URI, null, null);
238                Preferences.putLong(Preferences.Key.LATEST_SYNC_REVISION, 0);
239                
240                // add a first explanatory note
241                // TODO this will be problematic with two-way sync
242                NoteManager.putNote(this, FirstNote.createFirstNote());
243        }
244        
245        /**
246         * Housekeeping when a syncServer changes
247         * @param syncServiceKey - key of the new sync service 
248         */
249        private void syncServiceChanged(String syncServiceKey) {
250                
251                setServer(syncServiceKey);
252                
253                // TODO this should be refactored further, notice that setServer performs the same operations 
254                SyncService service = SyncManager.getInstance().getService(syncServiceKey);
255                
256                if (service == null)
257                        return;
258 
259                // reset if no-auth required
260                // I believe it's done this way because if needsAuth the database is reset when they successfully auth for the first time
261                // TODO we should graphically warn the user that his database is about to be dropped
262                if (!service.needsAuth()){
263                    resetLocalDatabase();
264                }
265        }
266}

[all classes][org.tomdroid.ui]
EMMA 0.0.0 (unsupported private build) (C) Vladimir Roubtsov