/** Deleting single note but keeping attachments */ public boolean deleteNote(Note note, boolean keepAttachments) { int deletedNotes; boolean result = true; SQLiteDatabase db = getDatabase(true); // Delete notes deletedNotes = db.delete(TABLE_NOTES, KEY_ID + " = ?", new String[] {String.valueOf(note.get_id())}); if (!keepAttachments) { // Delete note's attachments int deletedAttachments = db.delete( TABLE_ATTACHMENTS, KEY_ATTACHMENT_NOTE_ID + " = ?", new String[] {String.valueOf(note.get_id())}); result = result && deletedAttachments == note.getAttachmentsList().size(); } // Check on correct and complete deletion result = result && deletedNotes == 1; return result; }
/** Notes sharing */ public void shareNote(Note note) { String titleText = note.getTitle(); String contentText = titleText + System.getProperty("line.separator") + note.getContent(); Intent shareIntent = new Intent(); // Prepare sharing intent with only text if (note.getAttachmentsList().size() == 0) { shareIntent.setAction(Intent.ACTION_SEND); shareIntent.setType("text/plain"); shareIntent.putExtra(Intent.EXTRA_SUBJECT, titleText); shareIntent.putExtra(Intent.EXTRA_TEXT, contentText); // Intent with single image attachment } else if (note.getAttachmentsList().size() == 1) { shareIntent.setAction(Intent.ACTION_SEND); shareIntent.setType(note.getAttachmentsList().get(0).getMime_type()); shareIntent.putExtra(Intent.EXTRA_STREAM, note.getAttachmentsList().get(0).getUri()); shareIntent.putExtra(Intent.EXTRA_SUBJECT, titleText); shareIntent.putExtra(Intent.EXTRA_TEXT, contentText); // Intent with multiple images } else if (note.getAttachmentsList().size() > 1) { shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); ArrayList<Uri> uris = new ArrayList<>(); // A check to decide the mime type of attachments to share is done here HashMap<String, Boolean> mimeTypes = new HashMap<>(); for (Attachment attachment : note.getAttachmentsList()) { uris.add(attachment.getUri()); mimeTypes.put(attachment.getMime_type(), true); } // If many mime types are present a general type is assigned to intent if (mimeTypes.size() > 1) { shareIntent.setType("*/*"); } else { shareIntent.setType((String) mimeTypes.keySet().toArray()[0]); } shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); shareIntent.putExtra(Intent.EXTRA_SUBJECT, titleText); shareIntent.putExtra(Intent.EXTRA_TEXT, contentText); } startActivity( Intent.createChooser( shareIntent, getResources().getString(R.string.share_message_chooser))); }
@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; }
// 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; }