// Inserting or updating single note public Note updateNote(Note note, boolean updateLastModification) { SQLiteDatabase db = getDatabase(true); String content; if (note.isLocked()) { content = Security.encrypt(note.getContent(), prefs.getString(Constants.PREF_PASSWORD, "")); } else { content = note.getContent(); } // To ensure note and attachments insertions are atomical and boost performances transaction are // used db.beginTransaction(); ContentValues values = new ContentValues(); values.put(KEY_TITLE, note.getTitle()); values.put(KEY_CONTENT, content); values.put( KEY_CREATION, note.getCreation() != null ? note.getCreation() : Calendar.getInstance().getTimeInMillis()); values.put( KEY_LAST_MODIFICATION, updateLastModification ? Calendar.getInstance().getTimeInMillis() : (note.getLastModification() != null ? note.getLastModification() : Calendar.getInstance().getTimeInMillis())); values.put(KEY_ARCHIVED, note.isArchived()); values.put(KEY_TRASHED, note.isTrashed()); values.put(KEY_REMINDER, note.getAlarm()); values.put(KEY_REMINDER_FIRED, note.isReminderFired()); values.put(KEY_RECURRENCE_RULE, note.getRecurrenceRule()); values.put(KEY_LATITUDE, note.getLatitude()); values.put(KEY_LONGITUDE, note.getLongitude()); values.put(KEY_ADDRESS, note.getAddress()); values.put(KEY_CATEGORY, note.getCategory() != null ? note.getCategory().getId() : null); boolean locked = note.isLocked() != null ? note.isLocked() : false; values.put(KEY_LOCKED, locked); boolean checklist = note.isChecklist() != null ? note.isChecklist() : false; values.put(KEY_CHECKLIST, checklist); db.insertWithOnConflict(TABLE_NOTES, KEY_ID, values, SQLiteDatabase.CONFLICT_REPLACE); Log.d(Constants.TAG, "Updated note titled '" + note.getTitle() + "'"); // Updating attachments List<Attachment> deletedAttachments = note.getAttachmentsListOld(); for (Attachment attachment : note.getAttachmentsList()) { updateAttachment( note.get_id() != null ? note.get_id() : values.getAsLong(KEY_CREATION), attachment, db); deletedAttachments.remove(attachment); } // Remove from database deleted attachments for (Attachment attachmentDeleted : deletedAttachments) { db.delete( TABLE_ATTACHMENTS, KEY_ATTACHMENT_ID + " = ?", new String[] {String.valueOf(attachmentDeleted.getId())}); } db.setTransactionSuccessful(); db.endTransaction(); // Fill the note with correct data before returning it note.setCreation( note.getCreation() != null ? note.getCreation() : values.getAsLong(KEY_CREATION)); note.setLastModification(values.getAsLong(KEY_LAST_MODIFICATION)); return note; }
@SuppressLint("NewApi") @Override public View getView(int position, View convertView, ViewGroup parent) { Note note = notes.get(position); NoteAdapterViewHolder holder; if (convertView == null) { convertView = inflater.inflate(layout, parent, false); // Overrides font sizes with the one selected from user Fonts.overrideTextSize( mActivity, mActivity.getSharedPreferences(Constants.PREFS_NAME, Context.MODE_MULTI_PROCESS), convertView); holder = new NoteAdapterViewHolder(); holder.root = convertView.findViewById(R.id.root); holder.cardLayout = convertView.findViewById(R.id.card_layout); holder.categoryMarker = convertView.findViewById(R.id.category_marker); holder.title = (TextView) convertView.findViewById(R.id.note_title); holder.content = (TextView) convertView.findViewById(R.id.note_content); holder.date = (TextView) convertView.findViewById(R.id.note_date); holder.archiveIcon = (ImageView) convertView.findViewById(R.id.archivedIcon); // holder.trashIcon = (ImageView) convertView.findViewById(R.id.trashedIcon); holder.locationIcon = (ImageView) convertView.findViewById(R.id.locationIcon); holder.alarmIcon = (ImageView) convertView.findViewById(R.id.alarmIcon); holder.lockedIcon = (ImageView) convertView.findViewById(R.id.lockedIcon); if (!expandedView) holder.attachmentIcon = (ImageView) convertView.findViewById(R.id.attachmentIcon); holder.attachmentThumbnail = (SquareImageView) convertView.findViewById(R.id.attachmentThumbnail); convertView.setTag(holder); } else { holder = (NoteAdapterViewHolder) convertView.getTag(); } try { // if (note.isChecklist()) { TextWorkerTask task = new TextWorkerTask(mActivity, holder.title, holder.content, expandedView); if (Build.VERSION.SDK_INT >= 11) { task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, note); } else { task.execute(note); } // } else { // Spanned[] titleAndContent = TextHelper.parseTitleAndContent(mActivity, note); // holder.title.setText(titleAndContent[0]); // holder.content.setText(titleAndContent[1]); // } } catch (RejectedExecutionException e) { Log.w(Constants.TAG, "Oversized tasks pool to load texts!"); } // Evaluates the archived state... holder.archiveIcon.setVisibility(note.isArchived() ? View.VISIBLE : View.GONE); // .. the trashed state // holder.trashIcon.setVisibility(note.isTrashed() ? View.VISIBLE : View.GONE); // ...the location holder.locationIcon.setVisibility( note.getLongitude() != null && note.getLongitude() != 0 ? View.VISIBLE : View.GONE); // ...the presence of an alarm holder.alarmIcon.setVisibility(note.getAlarm() != null ? View.VISIBLE : View.GONE); // ...the locked with password state holder.lockedIcon.setVisibility(note.isLocked() ? View.VISIBLE : View.GONE); // ...the attachment icon for contracted view if (!expandedView) { holder.attachmentIcon.setVisibility( note.getAttachmentsList().size() > 0 ? View.VISIBLE : View.GONE); } String dateText = getDateText(mActivity, note); holder.date.setText(dateText); // Highlighted if is part of multiselection of notes. Remember to search for child with card ui if (selectedItems.get(position)) { holder.cardLayout.setBackgroundColor( mActivity.getResources().getColor(R.color.list_bg_selected)); } else { restoreDrawable(note, holder.cardLayout, holder); } // Attachment thumbnail if (expandedView) { // If note is locked or without attachments nothing is shown if ((note.isLocked() && !mActivity .getSharedPreferences(Constants.PREFS_NAME, mActivity.MODE_MULTI_PROCESS) .getBoolean("settings_password_access", false)) || note.getAttachmentsList().size() == 0) { holder.attachmentThumbnail.setImageResource(0); holder.attachmentThumbnail.setVisibility(View.GONE); } // Otherwise... else { Attachment mAttachment = note.getAttachmentsList().get(0); loadThumbnail(holder, mAttachment); } } // Animation animation = AnimationUtils.loadAnimation(mActivity, R.animator.fade_in); // animation.setDuration(60); // convertView.startAnimation(animation); return convertView; }
/** Retrieves statistics data based on app usage */ public Stats getStats() { Stats mStats = new Stats(); // Categories mStats.setCategories(getCategories().size()); // Everything about notes and their text stats int notesActive = 0, notesArchived = 0, notesTrashed = 0, reminders = 0, remindersFuture = 0, checklists = 0, notesMasked = 0, tags = 0, locations = 0; int totalWords = 0, totalChars = 0, maxWords = 0, maxChars = 0, avgWords = 0, avgChars = 0; int words, chars; List<Note> notes = getAllNotes(false); for (Note note : notes) { if (note.isTrashed()) { notesTrashed++; } else if (note.isArchived()) { notesArchived++; } else { notesActive++; } if (note.getAlarm() != null && Long.parseLong(note.getAlarm()) > 0) { if (Long.parseLong(note.getAlarm()) > Calendar.getInstance().getTimeInMillis()) { remindersFuture++; } else { reminders++; } } if (note.isChecklist()) { checklists++; } if (note.isLocked()) { notesMasked++; } tags += TagsHelper.retrieveTags(note).size(); if (note.getLongitude() != null && note.getLongitude() != 0) { locations++; } words = getWords(note); chars = getChars(note); if (words > maxWords) { maxWords = words; } if (chars > maxChars) { maxChars = chars; } totalWords += words; totalChars += chars; } mStats.setNotesActive(notesActive); mStats.setNotesArchived(notesArchived); mStats.setNotesTrashed(notesTrashed); mStats.setReminders(reminders); mStats.setRemindersFutures(remindersFuture); mStats.setNotesChecklist(checklists); mStats.setNotesMasked(notesMasked); mStats.setTags(tags); mStats.setLocation(locations); avgWords = totalWords / (notes.size() != 0 ? notes.size() : 1); avgChars = totalChars / (notes.size() != 0 ? notes.size() : 1); mStats.setWords(totalWords); mStats.setWordsMax(maxWords); mStats.setWordsAvg(avgWords); mStats.setChars(totalChars); mStats.setCharsMax(maxChars); mStats.setCharsAvg(avgChars); // Everything about attachments int attachmentsAll = 0, images = 0, videos = 0, audioRecordings = 0, sketches = 0, files = 0; List<Attachment> attachments = getAllAttachments(); for (Attachment attachment : attachments) { if (Constants.MIME_TYPE_IMAGE.equals(attachment.getMime_type())) { images++; } else if (Constants.MIME_TYPE_VIDEO.equals(attachment.getMime_type())) { videos++; } else if (Constants.MIME_TYPE_AUDIO.equals(attachment.getMime_type())) { audioRecordings++; } else if (Constants.MIME_TYPE_SKETCH.equals(attachment.getMime_type())) { sketches++; } else if (Constants.MIME_TYPE_FILES.equals(attachment.getMime_type())) { files++; } } mStats.setAttachments(attachmentsAll); mStats.setImages(images); mStats.setVideos(videos); mStats.setAudioRecordings(audioRecordings); mStats.setSketches(sketches); mStats.setFiles(files); return mStats; }