private boolean checkForToken() { if (!actFmPreferenceService.isLoggedIn()) { return false; } token = actFmPreferenceService.getToken(); return true; }
private void write(GtasksTaskContainer task) throws IOException { // merge astrid dates with google dates if (!task.task.isSaved() && actFmPreferenceService.isLoggedIn()) titleMatchWithActFm(task.task); if (task.task.isSaved()) { Task local = PluginServices.getTaskService() .fetchById(task.task.getId(), Task.DUE_DATE, Task.COMPLETION_DATE); if (local == null) { task.task.clearValue(Task.ID); } else { mergeDates(task.task, local); if (task.task.isCompleted() && !local.isCompleted()) StatisticsService.reportEvent(StatisticsConstants.GTASKS_TASK_COMPLETED); } } else { // Set default importance and reminders for remotely created tasks task.task.setValue( Task.IMPORTANCE, Preferences.getIntegerFromString( R.string.p_default_importance_key, Task.IMPORTANCE_SHOULD_DO)); TaskDao.setDefaultReminders(task.task); } if (!TextUtils.isEmpty(task.task.getValue(Task.TITLE))) { task.task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); gtasksMetadataService.saveTaskAndMetadata(task); } }
public void loadViewForTaskID(long t) { try { fetchTask(t); } catch (SQLiteException e) { StartupService.handleSQLiteError(ContextManager.getContext(), e); } if (task == null) { return; } setUpInterface(); setUpListAdapter(); if (actFmPreferenceService.isLoggedIn()) { long pushedAt = task.getValue(Task.USER_ACTIVITIES_PUSHED_AT); if (DateUtilities.now() - pushedAt > DateUtilities.ONE_HOUR / 2) { refreshData(); } else { loadingText.setText(R.string.ENA_no_comments); if (items.size() == 0) loadingText.setVisibility(View.VISIBLE); } } }
/** * Save sharing settings * * @param toast toast to show after saving is finished * @return false if login is required & save should be halted */ @SuppressWarnings("nls") public boolean saveSharingSettings(String toast) { if (task == null) return false; saveToast = toast; boolean dirty = false; try { JSONObject userJson = null; TextView assignedView = null; if (assignedCustom.getVisibility() == View.VISIBLE) { userJson = PeopleContainer.createUserJson(assignedCustom); assignedView = assignedCustom; } else if (assignedSpinner.getSelectedItem() != null) { userJson = ((AssignedToUser) assignedSpinner.getSelectedItem()).user; } if (userJson != null && userJson.optString("email").indexOf('@') == -1) { throw new ParseSharedException( assignedView, activity.getString(R.string.actfm_EPA_invalid_email, userJson.optString("email"))); } if (userJson == null || userJson.optLong("id", -1) == 0) { dirty = task.getValue(Task.USER_ID) == 0L ? dirty : true; task.setValue(Task.USER_ID, 0L); if (!TextUtils.isEmpty(task.getValue(Task.USER))) task.setValue(Task.USER, "{}"); } else { String user = userJson.toString(); long taskUserId = -1; String taskUserEmail = ""; try { JSONObject taskUser = new JSONObject(task.getValue(Task.USER)); taskUserId = taskUser.optLong("id", -1); taskUserEmail = taskUser.optString("email"); } catch (JSONException e) { // sad times } long userId = userJson.optLong("id", -1); String userEmail = userJson.optString("email"); boolean match = (userId == taskUserId && userId != -1); match = match || (userEmail.equals(taskUserEmail) && !TextUtils.isEmpty(userEmail)); dirty = match ? dirty : true; task.setValue(Task.USER_ID, userJson.optLong("id", -1)); task.setValue(Task.USER, user); } JSONObject sharedWith = parseSharedWithAndTags(); dirty = dirty || sharedWith.has("p"); if (!TextUtils.isEmpty(task.getValue(Task.SHARED_WITH)) || sharedWith.length() != 0) task.setValue(Task.SHARED_WITH, sharedWith.toString()); if (dirty) taskService.save(task); if (dirty && !actFmPreferenceService.isLoggedIn()) { activity.startActivityForResult( new Intent(activity, ActFmLoginActivity.class), loginRequestCode); return false; } if (dirty) shareTask(sharedWith); else showSaveToast(); return true; } catch (JSONException e) { exceptionService.displayAndReportError(activity, "save-people", e); } catch (ParseSharedException e) { if (e.view != null) { e.view.setTextColor(Color.RED); e.view.requestFocus(); } DialogUtilities.okDialog(activity, e.message, null); } return false; }
private void sync() { try { int batchSize = 4; List<ClientToServerMessage<?>> messageBatch = new ArrayList<ClientToServerMessage<?>>(); while (true) { synchronized (monitor) { while ((pendingMessages.isEmpty() && !timeForBackgroundSync()) || !actFmPreferenceService.isLoggedIn() || !syncMigration) { try { if ((pendingMessages.isEmpty() || !actFmPreferenceService.isLoggedIn()) && notificationId >= 0) { notificationManager.cancel(notificationId); notificationId = -1; } monitor.wait(); AndroidUtilities.sleepDeep( 500L); // Wait briefly for large database operations to finish (e.g. adding a task // with several tags may trigger a message before all saves are done--fix // this?) if (!syncMigration) { syncMigration = Preferences.getBoolean(AstridNewSyncMigrator.PREF_SYNC_MIGRATION, false); } } catch (InterruptedException e) { // Ignored } } } boolean recordSyncSuccess = true; if (timeForBackgroundSync()) { repopulateQueueFromOutstandingTables(); enqueueMessage( BriefMe.instantiateBriefMeForClass( TaskListMetadata.class, NameMaps.PUSHED_AT_TASK_LIST_METADATA), DEFAULT_REFRESH_RUNNABLE); enqueueMessage( BriefMe.instantiateBriefMeForClass(Task.class, NameMaps.PUSHED_AT_TASKS), DEFAULT_REFRESH_RUNNABLE); enqueueMessage( BriefMe.instantiateBriefMeForClass(TagData.class, NameMaps.PUSHED_AT_TAGS), DEFAULT_REFRESH_RUNNABLE); enqueueMessage( BriefMe.instantiateBriefMeForClass(User.class, NameMaps.PUSHED_AT_USERS), DEFAULT_REFRESH_RUNNABLE); setTimeForBackgroundSync(false); } while (messageBatch.size() < batchSize && !pendingMessages.isEmpty()) { ClientToServerMessage<?> message = pendingMessages.remove(0); if (message != null) { messageBatch.add(message); } } if (!messageBatch.isEmpty() && checkForToken()) { JSONPayloadBuilder payload = new JSONPayloadBuilder(); MultipartEntity entity = new MultipartEntity(); boolean containsChangesHappened = false; for (int i = 0; i < messageBatch.size(); i++) { ClientToServerMessage<?> message = messageBatch.get(i); boolean success = payload.addMessage(message, entity); if (success) { if (message instanceof ChangesHappened) { containsChangesHappened = true; } } else { messageBatch.remove(i); i--; } } if (payload.getMessageCount() == 0) { messageBatch.clear(); continue; } setupNotification(); payload.addJSONObject(getClientVersion()); JSONArray errors = null; try { JSONObject response = actFmInvoker.postSync( payload.closeAndReturnString(), entity, containsChangesHappened, token); // process responses String time = response.optString("time"); JSONArray serverMessagesJson = response.optJSONArray("messages"); if (serverMessagesJson != null) { setWidgetSuppression(true); for (int i = 0; i < serverMessagesJson.length(); i++) { JSONObject serverMessageJson = serverMessagesJson.optJSONObject(i); if (serverMessageJson != null) { ServerToClientMessage serverMessage = ServerToClientMessage.instantiateMessage(serverMessageJson); if (serverMessage != null) { serverMessage.processMessage(time); } else { syncLog( "Index " + i + " unable to instantiate message " + serverMessageJson.toString()); } } } errors = response.optJSONArray("errors"); boolean errorsExist = (errors != null && errors.length() > 0); replayOutstandingChanges(errorsExist); setWidgetSuppression(false); } batchSize = Math.max(12, Math.min(batchSize, messageBatch.size()) * 2); if (recordSyncSuccess) { actFmPreferenceService.setLastError(null, null); actFmPreferenceService.recordSuccessfulSync(); } } catch (IOException e) { Log.e(ERROR_TAG, "IOException", e); batchSize = Math.max(batchSize / 2, 1); } Set<SyncMessageCallback> callbacksExecutedThisLoop = new HashSet<SyncMessageCallback>(); Map<Integer, List<JSONArray>> errorMap = buildErrorMap(errors); for (int i = 0; i < messageBatch.size(); i++) { ClientToServerMessage<?> message = messageBatch.get(i); try { SyncMessageCallback r = pendingCallbacks.remove(message); if (r != null && !callbacksExecutedThisLoop.contains(r)) { List<JSONArray> errorList = errorMap.get(i); if (errorList == null || errorList.isEmpty()) { r.runOnSuccess(); } else { r.runOnErrors(errorList); } callbacksExecutedThisLoop.add(r); } } catch (Exception e) { Log.e(ERROR_TAG, "Unexpected exception executing sync callback", e); } } messageBatch.clear(); } } } catch (Exception e) { // In the worst case, restart thread if something goes wrong Log.e(ERROR_TAG, "Unexpected sync thread exception", e); thread = null; startSyncThread(); } }
@Override public void onReceive(Context context, Intent intent) { if (!Preferences.getBoolean(R.string.p_rmd_enabled, true)) return; DependencyInjectionService.getInstance().inject(this); int reengagementReminders = Preferences.getInt(ReengagementService.PREF_REENGAGEMENT_COUNT, 1); Preferences.setInt(ReengagementService.PREF_REENGAGEMENT_COUNT, reengagementReminders + 1); Intent notifIntent = new Intent(context, TaskListActivity.class); QueryTemplate template = new QueryTemplate().where(TaskCriteria.activeVisibleMine()); String sql = SortHelper.adjustQueryForFlagsAndSort(template.toString(), 0, SortHelper.SORT_AUTO) + " LIMIT " + TASK_LIMIT; //$NON-NLS-1$ boolean hasTasks = false; TodorooCursor<Task> tasks = taskService.query( Query.select(Task.ID).where(TaskCriteria.activeVisibleMine()).limit(TASK_LIMIT)); try { hasTasks = tasks.getCount() > 0; } finally { tasks.close(); } String title = Notifications.getRandomReminder( context.getResources().getStringArray(R.array.rmd_reengage_notif_titles)); if (title.contains("%s")) { // $NON-NLS-1$ String name = ""; // $NON-NLS-1$ if (actFmPreferenceService.isLoggedIn()) { JSONObject thisUser = ActFmPreferenceService.thisUser(); name = thisUser.optString("first_name"); // $NON-NLS-1$ if (TextUtils.isEmpty(name)) name = thisUser.optString("name"); // $NON-NLS-1$ if (TextUtils.isEmpty(name)) name = context.getString(R.string.rmd_reengage_name_default); } title = String.format(title, name); } String text = Notifications.getRandomReminder( context .getResources() .getStringArray( hasTasks ? R.array.rmd_reengage_dialog_options : R.array.rmd_reengage_dialog_empty_options)); FilterWithCustomIntent filter = new FilterWithCustomIntent( context.getString(R.string.rmd_NoA_filter), context.getString(R.string.rmd_NoA_filter), sql, null); filter.customTaskList = new ComponentName(context, ReengagementFragment.class); filter.customExtras = new Bundle(); filter.customExtras.putString(ReengagementFragment.EXTRA_TEXT, text); notifIntent.setAction("NOTIFY_reengagement"); // $NON-NLS-1$ notifIntent.putExtra(TaskListFragment.TOKEN_FILTER, filter); notifIntent.putExtra(ReengagementFragment.EXTRA_TEXT, text); notifIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); notifIntent.putExtra(TaskListActivity.TOKEN_SOURCE, Constants.SOURCE_REENGAGEMENT); NotificationManager manager = new AndroidNotificationManager(context); Notification notification = new Notification(R.drawable.notif_astrid, text, System.currentTimeMillis()); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT); notification.setLatestEventInfo(context, title, text, pendingIntent); notification.flags |= Notification.FLAG_AUTO_CANCEL; if (Preferences.getBoolean(R.string.p_rmd_persistent, true)) { notification.flags |= Notification.FLAG_NO_CLEAR | Notification.FLAG_SHOW_LIGHTS; notification.ledOffMS = 5000; notification.ledOnMS = 700; notification.ledARGB = Color.YELLOW; } else { notification.defaults = Notification.DEFAULT_LIGHTS; } manager.notify(0, notification); Flags.set(Flags.REFRESH); // Forces a reload when app launches ReengagementService.scheduleReengagementAlarm(context); }