diff --git a/Android-PullToRefresh/bin/android-pulltorefresh.jar b/Android-PullToRefresh/bin/android-pulltorefresh.jar index bd0395aa..f4eff970 100644 Binary files a/Android-PullToRefresh/bin/android-pulltorefresh.jar and b/Android-PullToRefresh/bin/android-pulltorefresh.jar differ diff --git a/SWADroid/src/es/ugr/swad/swadroid/Preferences.java b/SWADroid/src/es/ugr/swad/swadroid/Preferences.java index 6a01a951..d48972f8 100644 --- a/SWADroid/src/es/ugr/swad/swadroid/Preferences.java +++ b/SWADroid/src/es/ugr/swad/swadroid/Preferences.java @@ -19,9 +19,7 @@ package es.ugr.swad.swadroid; -import android.accounts.Account; import android.app.AlertDialog; -import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -590,6 +588,14 @@ public class Preferences extends PreferenceActivity implements OnPreferenceChang Log.i(TAG, "Database has been cleaned"); } + + private void logoutClean(String key) { + Constants.setLogged(false); + Log.i(TAG, "Forced logout due to " + key + " change in preferences"); + + cleanDatabase(); + Constants.setPreferencesChanged(); + } /** * Initializes preferences of activity. @@ -657,12 +663,8 @@ public class Preferences extends PreferenceActivity implements OnPreferenceChang //Restore preferences addPreferencesFromResource(R.xml.preferences); - this.ctx = getBaseContext(); - - if(prefs == null) { - prefs = PreferenceManager.getDefaultSharedPreferences(this.ctx); - editor = prefs.edit(); - } + ctx = getBaseContext(); + getPreferences(ctx); //Initialize database try { @@ -674,18 +676,6 @@ public class Preferences extends PreferenceActivity implements OnPreferenceChang error(TAG, ex.getMessage(), ex, true); } - userID = prefs.getString(USERIDPREF, ""); - userPassword = prefs.getString(USERPASSWORDPREF, ""); - server = prefs.getString(SERVERPREF, Constants.DEFAULT_SERVER); - lastVersion = prefs.getInt(LASTVERSIONPREF, 0); - lastCourseSelected = prefs.getInt(LASTCOURSESELECTEDPREF, 0); - syncEnabled = prefs.getBoolean(SYNCENABLEPREF, true); - lastSyncTime = prefs.getLong(LASTSYNCTIMEPREF, 0); - notifLimit = prefs.getInt(NOTIFLIMITPREF, 25); - notifSoundEnabled = prefs.getBoolean(NOTIFSOUNDENABLEPREF, true); - notifVibrateEnabled = prefs.getBoolean(NOTIFVIBRATEENABLEPREF, true); - notifLightsEnabled = prefs.getBoolean(NOTIFLIGHTSENABLEPREF, true); - userIDPref = findPreference(USERIDPREF); userPasswordPref = findPreference(USERPASSWORDPREF); currentVersionPref = findPreference(CURRENTVERSIONPREF); @@ -865,27 +855,42 @@ public class Preferences extends PreferenceActivity implements OnPreferenceChang //Reset user password on userid change setUserPassword(""); userPasswordPref.setSummary(""); - Log.i(TAG, "Resetted user password due to userid change"); + Log.i(TAG, "Resetted user password due to userid change"); + + //If preferences have changed, logout + logoutClean(key); } else if (USERPASSWORDPREF.equals(key)) { try { userPassword = Crypto.encryptPassword((String) newValue); preference.setSummary(getStarsSequence(STARS_LENGTH)); + + //If preferences have changed, logout + Constants.setLogged(false); + Log.i(TAG, "Forced logout due to " + key + " change in preferences"); } catch (NoSuchAlgorithmException ex) { error(TAG, ex.getMessage(), ex, true); } } else if (SERVERPREF.equals(key)) { - server = (String) newValue; + server = (String) newValue; + + //If preferences have changed, logout + logoutClean(key); } else if(SYNCENABLEPREF.equals(key)) { //boolean masterSyncEnabled = ContentResolver.getMasterSyncAutomatically(); syncEnabled = (Boolean) newValue; - Account account = new Account(getString(R.string.app_name), Constants.ACCOUNT_TYPE); + //Account account = new Account(getString(R.string.app_name), Constants.ACCOUNT_TYPE); //Configure automatic synchronization /*if(syncEnabled && !masterSyncEnabled) { ContentResolver.setMasterSyncAutomatically(syncEnabled); - }*/ + } - ContentResolver.setSyncAutomatically(account, Constants.AUTHORITY, syncEnabled); + ContentResolver.setSyncAutomatically(account, Constants.AUTHORITY, syncEnabled);*/ + if(syncEnabled) { + SyncUtils.addPeriodicSync(Constants.AUTHORITY, Bundle.EMPTY, Long.valueOf(syncTime), ctx); + } else { + SyncUtils.removePeriodicSync(Constants.AUTHORITY, Bundle.EMPTY, ctx); + } syncEnablePref.setChecked(syncEnabled); } else if(SYNCTIMEPREF.equals(key)) { @@ -896,10 +901,10 @@ public class Preferences extends PreferenceActivity implements OnPreferenceChang int prefSyncTimeIndex = prefSyncTimeValues.indexOf(syncTime); String prefSyncTimeEntry = prefSyncTimeEntries.get(prefSyncTimeIndex); - SyncUtils.removePeriodicSync(Constants.AUTHORITY, Bundle.EMPTY, getApplicationContext()); + SyncUtils.removePeriodicSync(Constants.AUTHORITY, Bundle.EMPTY, ctx); - if (!syncTime.equals("0")) { - SyncUtils.addPeriodicSync(Constants.AUTHORITY, Bundle.EMPTY, Long.parseLong(syncTime), getApplicationContext()); + if (!syncTime.equals("0") && syncEnabled) { + SyncUtils.addPeriodicSync(Constants.AUTHORITY, Bundle.EMPTY, Long.parseLong(syncTime), ctx); } if(lastSyncTime == 0) { @@ -929,18 +934,6 @@ public class Preferences extends PreferenceActivity implements OnPreferenceChang notifLightsEnabled = (Boolean) newValue; notifLightsEnablePref.setChecked(notifLightsEnabled); } - - //If preferences have changed, logout - if (USERIDPREF.equals(key) || SERVERPREF.equals(key)) { - Constants.setLogged(false); - Log.i(TAG, "Forced logout due to userid or server change in preferences"); - - cleanDatabase(); - Constants.setPreferencesChanged(); - } else if (USERPASSWORDPREF.equals(key)) { - Constants.setLogged(false); - Log.i(TAG, "Forced logout due to user password change in preferences"); - } //Refresh preferences screen //((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged(); diff --git a/SWADroid/src/es/ugr/swad/swadroid/SWADMain.java b/SWADroid/src/es/ugr/swad/swadroid/SWADMain.java index 0e044041..99b81805 100644 --- a/SWADroid/src/es/ugr/swad/swadroid/SWADMain.java +++ b/SWADroid/src/es/ugr/swad/swadroid/SWADMain.java @@ -66,7 +66,6 @@ import es.ugr.swad.swadroid.modules.rollcall.Rollcall; import es.ugr.swad.swadroid.modules.tests.Tests; import es.ugr.swad.swadroid.ssl.SecureConnection; import es.ugr.swad.swadroid.sync.AccountAuthenticator; -import es.ugr.swad.swadroid.sync.SyncUtils; import es.ugr.swad.swadroid.utils.Utils; /** @@ -286,10 +285,9 @@ public class SWADMain extends MenuExpandableListActivity { showConfigurationDialog(); //Configure automatic synchronization + prefs.setSyncTime(String.valueOf(Constants.DEFAULT_SYNC_TIME)); activity = new Intent(getBaseContext(), AccountAuthenticator.class); startActivity(activity); - SyncUtils.addPeriodicSync(Constants.AUTHORITY, Bundle.EMPTY, Constants.DEFAULT_SYNC_TIME, this); - prefs.setSyncTime(String.valueOf(Constants.DEFAULT_SYNC_TIME)); prefs.setLastVersion(currentVersion); firstRun = true; @@ -316,12 +314,10 @@ public class SWADMain extends MenuExpandableListActivity { } //Configure automatic synchronization - if(Preferences.isSyncEnabled()) { - activity = new Intent(getBaseContext(), AccountAuthenticator.class); - startActivity(activity); + /*if(Preferences.isSyncEnabled()) { SyncUtils.removePeriodicSync(Constants.AUTHORITY, Bundle.EMPTY, this); SyncUtils.addPeriodicSync(Constants.AUTHORITY, Bundle.EMPTY, Long.valueOf(prefs.getSyncTime()), this); - } + }*/ prefs.setLastVersion(currentVersion); } diff --git a/SWADroid/src/es/ugr/swad/swadroid/gui/MenuActivity.java b/SWADroid/src/es/ugr/swad/swadroid/gui/MenuActivity.java index 17704ea5..1c38e256 100644 --- a/SWADroid/src/es/ugr/swad/swadroid/gui/MenuActivity.java +++ b/SWADroid/src/es/ugr/swad/swadroid/gui/MenuActivity.java @@ -47,7 +47,7 @@ public class MenuActivity extends Activity { /** * Application preferences. */ - private static final Preferences prefs = new Preferences(); + protected static final Preferences prefs = new Preferences(); /** * Database Helper. */ diff --git a/SWADroid/src/es/ugr/swad/swadroid/model/DataBaseHelper.java b/SWADroid/src/es/ugr/swad/swadroid/model/DataBaseHelper.java index 04844c6b..e093e751 100644 --- a/SWADroid/src/es/ugr/swad/swadroid/model/DataBaseHelper.java +++ b/SWADroid/src/es/ugr/swad/swadroid/model/DataBaseHelper.java @@ -385,10 +385,16 @@ public class DataBaseHelper { * @return A Model's subclass object * or null if the row does not exist in the specified table */ - public Model getRow(String table, String fieldName, String fieldValue) { - List rows = db.getEntityList(table, fieldName + " = '" + fieldValue + "'"); + public Model getRow(String table, String fieldName, Object fieldValue) { + List rows; Entity ent; Model row = null; + + if(fieldValue instanceof String) { + rows = db.getEntityList(table, fieldName + " = '" + fieldValue + "'"); + } else { + rows = db.getEntityList(table, fieldName + " = " + fieldValue + ""); + } if (rows.size() > 0) { ent = rows.get(0); @@ -406,10 +412,16 @@ public class DataBaseHelper { * @return The user found * or null if the user does not exist */ - public User getUser(String fieldName, String fieldValue) { - List rows = db.getEntityList(Constants.DB_TABLE_USERS, fieldName + " = '" + fieldValue + "'"); + public User getUser(String fieldName, Object fieldValue) { + List rows; Entity ent; User user = null; + + if(fieldValue instanceof String) { + rows = db.getEntityList(Constants.DB_TABLE_USERS, fieldName + " = '" + fieldValue + "'"); + } else { + rows = db.getEntityList(Constants.DB_TABLE_USERS, fieldName + " = " + fieldValue + ""); + } if (rows.size() > 0) { ent = rows.get(0); diff --git a/SWADroid/src/es/ugr/swad/swadroid/modules/Module.java b/SWADroid/src/es/ugr/swad/swadroid/modules/Module.java index 5d6fb044..16ba8b0b 100644 --- a/SWADroid/src/es/ugr/swad/swadroid/modules/Module.java +++ b/SWADroid/src/es/ugr/swad/swadroid/modules/Module.java @@ -43,7 +43,6 @@ import java.security.NoSuchAlgorithmException; import java.util.concurrent.TimeoutException; import es.ugr.swad.swadroid.Constants; -import es.ugr.swad.swadroid.Preferences; import es.ugr.swad.swadroid.R; import es.ugr.swad.swadroid.gui.MenuActivity; import es.ugr.swad.swadroid.utils.Utils; @@ -70,10 +69,6 @@ public abstract class Module extends MenuActivity { * SERVER param for webservice request. */ private String SERVER; // = "swad.ugr.es"; - /** - * Preferences of the activity. - */ - protected static Preferences prefs = new Preferences(); /** * Async Task for background jobs */ @@ -102,10 +97,6 @@ public abstract class Module extends MenuActivity { * Connection available flag */ protected static boolean isConnected; - /** - * Application debuggable flag - */ - protected static boolean isDebuggable; /** * Class Module's tag name for Logcat */ @@ -194,24 +185,6 @@ public abstract class Module extends MenuActivity { this.SOAP_ACTION = SOAP_ACTION; } - /** - * Gets preferences of activity. - * - * @return Preferences of activity. - */ - public Preferences getPrefs() { - return prefs; - } - - /** - * Sets preferences of activity. - * - * @param prefs Preferences of activity. - */ - public void setPrefs(Preferences prefs) { - Module.prefs = prefs; - } - /** * Gets webservice request. * diff --git a/SWADroid/src/es/ugr/swad/swadroid/modules/notifications/Notifications.java b/SWADroid/src/es/ugr/swad/swadroid/modules/notifications/Notifications.java index 453472c6..95bed969 100644 --- a/SWADroid/src/es/ugr/swad/swadroid/modules/notifications/Notifications.java +++ b/SWADroid/src/es/ugr/swad/swadroid/modules/notifications/Notifications.java @@ -322,28 +322,30 @@ public class Notifications extends Module { } /* (non-Javadoc) - * @see es.ugr.swad.swadroid.modules.Module#onResume() + * @see es.ugr.swad.swadroid.modules.Module#onStart() */ @Override - protected void onResume() { - super.onResume(); + protected void onStart() { + super.onStart(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(NotificationsSyncAdapterService.START_SYNC); intentFilter.addAction(NotificationsSyncAdapterService.STOP_SYNC); intentFilter.addAction(Intent.CATEGORY_DEFAULT); registerReceiver(receiver, intentFilter); + Log.i(TAG, "Registered receiver for automatic synchronization"); refreshScreen(); } /* (non-Javadoc) - * @see es.ugr.swad.swadroid.modules.Module#onPause() + * @see es.ugr.swad.swadroid.modules.Module#onStop() */ @Override - protected void onPause() { - super.onPause(); + protected void onStop() { + super.onStop(); unregisterReceiver(receiver); + Log.i(TAG, "Unregistered receiver for automatic synchronization"); } /* (non-Javadoc) @@ -356,11 +358,14 @@ public class Notifications extends Module { //Download new notifications from the server SIZE_LIMIT = prefs.getNotifLimit(); - account = new Account(getString(R.string.app_name), accountType); if (ContentResolver.getSyncAutomatically(account, authority)) { + Log.i(TAG, "Automatic synchronization is enabled. Requesting asynchronous sync operation"); + //Call synchronization service ContentResolver.requestSync(account, authority, new Bundle()); } else { + Log.i(TAG, "Automatic synchronization is disabled. Requesting manual sync operation"); + //Calculates next timestamp to be requested Long timestamp = Long.valueOf(dbHelper.getFieldOfLastNotification("eventTime")); timestamp++; diff --git a/SWADroid/src/es/ugr/swad/swadroid/modules/notifications/NotificationsSyncAdapterService.java b/SWADroid/src/es/ugr/swad/swadroid/modules/notifications/NotificationsSyncAdapterService.java index e3d6ce06..c6a61ab2 100644 --- a/SWADroid/src/es/ugr/swad/swadroid/modules/notifications/NotificationsSyncAdapterService.java +++ b/SWADroid/src/es/ugr/swad/swadroid/modules/notifications/NotificationsSyncAdapterService.java @@ -316,6 +316,10 @@ public class NotificationsSyncAdapterService extends Service { createRequest(); addParam("userID", prefs.getUserID()); addParam("userPassword", prefs.getUserPassword()); + Log.d(TAG, "[logUser] SERVER="+SERVER); + Log.d(TAG, "[logUser] SIZE_LIMIT="+SIZE_LIMIT); + Log.d(TAG, "[logUser] userID="+prefs.getUserID()); + Log.d(TAG, "[logUser] userPassword="+prefs.getUserPassword()); addParam("appKey", Constants.SWAD_APP_KEY); sendRequest(User.class, true); diff --git a/SWADroid/src/es/ugr/swad/swadroid/modules/rollcall/students/StudentsHistory.java b/SWADroid/src/es/ugr/swad/swadroid/modules/rollcall/students/StudentsHistory.java index 4c148a36..3f0b130f 100644 --- a/SWADroid/src/es/ugr/swad/swadroid/modules/rollcall/students/StudentsHistory.java +++ b/SWADroid/src/es/ugr/swad/swadroid/modules/rollcall/students/StudentsHistory.java @@ -43,6 +43,7 @@ import java.util.List; * Students history module. * * @author Antonio Aguilera Malagon + * @author Juan Miguel Boyero Corral */ public class StudentsHistory extends Module { private List studentsList; @@ -84,7 +85,7 @@ public class StudentsHistory extends Module { studentsList = new ArrayList(); for (Long userCode : idList) { - User u = dbHelper.getUser("userCode", String.valueOf(userCode)); + User u = dbHelper.getUser("userCode", userCode); studentsList.add(new StudentItemModel(u)); } // Arrange the list alphabetically diff --git a/SWADroid/src/es/ugr/swad/swadroid/modules/rollcall/students/StudentsList.java b/SWADroid/src/es/ugr/swad/swadroid/modules/rollcall/students/StudentsList.java index b303a654..569afe09 100644 --- a/SWADroid/src/es/ugr/swad/swadroid/modules/rollcall/students/StudentsList.java +++ b/SWADroid/src/es/ugr/swad/swadroid/modules/rollcall/students/StudentsList.java @@ -43,6 +43,7 @@ import java.util.List; * Students list module. * * @author Antonio Aguilera Malagon + * @author Juan Miguel Boyero Corral */ public class StudentsList extends Module { private Dialog studentsDialog; @@ -88,7 +89,7 @@ public class StudentsList extends Module { List studentsList = new ArrayList(); for (long userCode : userIds) { - User u = dbHelper.getUser("userCode", String.valueOf(userCode)); + User u = dbHelper.getUser("userCode", userCode); studentsList.add(new StudentItemModel(u)); } // Arrange the list alphabetically diff --git a/SWADroid/src/es/ugr/swad/swadroid/sync/AccountAuthenticator.java b/SWADroid/src/es/ugr/swad/swadroid/sync/AccountAuthenticator.java index 61965db1..708fc3d7 100644 --- a/SWADroid/src/es/ugr/swad/swadroid/sync/AccountAuthenticator.java +++ b/SWADroid/src/es/ugr/swad/swadroid/sync/AccountAuthenticator.java @@ -6,11 +6,17 @@ import android.accounts.AccountAuthenticatorResponse; import android.accounts.AccountManager; import android.content.ContentResolver; import android.os.Bundle; +import android.util.Log; import es.ugr.swad.swadroid.Constants; import es.ugr.swad.swadroid.Preferences; import es.ugr.swad.swadroid.R; public class AccountAuthenticator extends AccountAuthenticatorActivity { + /** + * Login tag name for Logcat + */ + public static final String TAG = Constants.APP_TAG + " AccountAuthenticator"; + @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); @@ -21,20 +27,32 @@ public class AccountAuthenticator extends AccountAuthenticatorActivity { boolean accountCreated = am.addAccountExplicitly(account, getString(R.string.app_name), null); Bundle extras = getIntent().getExtras(); - if (extras != null) { - if (accountCreated) { //Pass the new account back to the account manager - AccountAuthenticatorResponse response = extras.getParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE); - Bundle result = new Bundle(); - result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name); - result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type); - response.onResult(result); + + Log.d(TAG, "accountCreated=" + accountCreated); + Log.d(TAG, "extras=" + extras); + + if (accountCreated) { //Pass the new account back to the account manager + if (extras != null) { + AccountAuthenticatorResponse response = extras.getParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE); + Bundle result = new Bundle(); + result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name); + result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type); + response.onResult(result); } + + Log.i(TAG, "Account for automatic synchronization created successfully"); + } else { + Log.w(TAG, "Account for automatic synchronization was not created"); } //Configure automatic synchronization ContentResolver.setIsSyncable(account, Constants.AUTHORITY, 1); - ContentResolver.setMasterSyncAutomatically(true); - ContentResolver.setSyncAutomatically(account, Constants.AUTHORITY, true); + Log.i(TAG, "Account setted as syncable"); + + ContentResolver.setMasterSyncAutomatically(true); + Log.i(TAG, "Master auto-sync setting enabled"); + + SyncUtils.addPeriodicSync(Constants.AUTHORITY, Bundle.EMPTY, Long.valueOf(prefs.getSyncTime()), this); finish(); } diff --git a/SWADroid/src/es/ugr/swad/swadroid/sync/SyncUtils.java b/SWADroid/src/es/ugr/swad/swadroid/sync/SyncUtils.java index d46154ac..14eb13f2 100644 --- a/SWADroid/src/es/ugr/swad/swadroid/sync/SyncUtils.java +++ b/SWADroid/src/es/ugr/swad/swadroid/sync/SyncUtils.java @@ -20,13 +20,13 @@ package es.ugr.swad.swadroid.sync; import android.accounts.Account; import android.accounts.AccountManager; -import android.annotation.SuppressLint; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.ContentResolver; import android.content.Context; import android.os.Bundle; import android.os.SystemClock; +import android.util.Log; import es.ugr.swad.swadroid.Constants; /** @@ -34,8 +34,11 @@ import es.ugr.swad.swadroid.Constants; * * @author Juan Miguel Boyero Corral */ -@SuppressLint("NewApi") public class SyncUtils { + /** + * Login tag name for Logcat + */ + public static final String TAG = Constants.APP_TAG + " SyncUtils"; public static void addPeriodicSync(String authority, Bundle extras, long frequency, Context context) { long pollFrequencyMsec = frequency * 60000; @@ -48,12 +51,19 @@ public class SyncUtils { PendingIntent operation = PeriodicSyncReceiver.createPendingIntent(context, authority, extras); manager.setInexactRepeating(type, triggerAtTime, pollFrequencyMsec, operation); + + Log.i(TAG, "Added periodic alarm with pollFrequency=" + pollFrequencyMsec); } else { AccountManager am = AccountManager.get(context); Account[] accounts = am.getAccountsByType(Constants.ACCOUNT_TYPE); + Log.d(TAG, "[addPeriodicSync] Number of accounts with type " + Constants.ACCOUNT_TYPE + " = " + accounts.length); for (Account a : accounts) { + ContentResolver.setSyncAutomatically(a, Constants.AUTHORITY, true); ContentResolver.addPeriodicSync(a, authority, extras, frequency * 60); + + Log.i(TAG, "Added periodic synchronization with pollFrequency=" + (frequency * 60) + + " for account " + a.toString()); } } } @@ -63,12 +73,18 @@ public class SyncUtils { AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); PendingIntent operation = PeriodicSyncReceiver.createPendingIntent(context, authority, extras); manager.cancel(operation); + + Log.i(TAG, "Removed periodic alarm"); } else { AccountManager am = AccountManager.get(context); Account[] accounts = am.getAccountsByType(Constants.ACCOUNT_TYPE); + Log.d(TAG, "[removePeriodicSync] Number of accounts with type " + Constants.ACCOUNT_TYPE + " = " + accounts.length); for (Account a : accounts) { + ContentResolver.setSyncAutomatically(a, Constants.AUTHORITY, false); ContentResolver.removePeriodicSync(a, authority, extras); + + Log.i(TAG, "Removed periodic synchronization for account " + a.toString()); } } }