Search in sources :

Example 16 with Flag

use of com.fsck.k9.mail.Flag in project k-9 by k9mail.

the class Account method save.

public synchronized void save(Preferences preferences) {
    StorageEditor editor = preferences.getStorage().edit();
    if (!preferences.getStorage().getString("accountUuids", "").contains(mUuid)) {
        /*
             * When the account is first created we assign it a unique account number. The
             * account number will be unique to that account for the lifetime of the account.
             * So, we get all the existing account numbers, sort them ascending, loop through
             * the list and check if the number is greater than 1 + the previous number. If so
             * we use the previous number + 1 as the account number. This refills gaps.
             * mAccountNumber starts as -1 on a newly created account. It must be -1 for this
             * algorithm to work.
             *
             * I bet there is a much smarter way to do this. Anyone like to suggest it?
             */
        List<Account> accounts = preferences.getAccounts();
        int[] accountNumbers = new int[accounts.size()];
        for (int i = 0; i < accounts.size(); i++) {
            accountNumbers[i] = accounts.get(i).getAccountNumber();
        }
        Arrays.sort(accountNumbers);
        for (int accountNumber : accountNumbers) {
            if (accountNumber > mAccountNumber + 1) {
                break;
            }
            mAccountNumber = accountNumber;
        }
        mAccountNumber++;
        String accountUuids = preferences.getStorage().getString("accountUuids", "");
        accountUuids += (accountUuids.length() != 0 ? "," : "") + mUuid;
        editor.putString("accountUuids", accountUuids);
    }
    editor.putString(mUuid + ".storeUri", Base64.encode(mStoreUri));
    editor.putString(mUuid + ".localStorageProvider", mLocalStorageProviderId);
    editor.putString(mUuid + ".transportUri", Base64.encode(mTransportUri));
    editor.putString(mUuid + ".description", mDescription);
    editor.putString(mUuid + ".alwaysBcc", mAlwaysBcc);
    editor.putInt(mUuid + ".automaticCheckIntervalMinutes", mAutomaticCheckIntervalMinutes);
    editor.putInt(mUuid + ".idleRefreshMinutes", mIdleRefreshMinutes);
    editor.putBoolean(mUuid + ".pushPollOnConnect", mPushPollOnConnect);
    editor.putInt(mUuid + ".displayCount", mDisplayCount);
    editor.putLong(mUuid + ".latestOldMessageSeenTime", mLatestOldMessageSeenTime);
    editor.putBoolean(mUuid + ".notifyNewMail", mNotifyNewMail);
    editor.putString(mUuid + ".folderNotifyNewMailMode", mFolderNotifyNewMailMode.name());
    editor.putBoolean(mUuid + ".notifySelfNewMail", mNotifySelfNewMail);
    editor.putBoolean(mUuid + ".notifyContactsMailOnly", mNotifyContactsMailOnly);
    editor.putBoolean(mUuid + ".notifyMailCheck", mNotifySync);
    editor.putInt(mUuid + ".deletePolicy", mDeletePolicy.setting);
    editor.putString(mUuid + ".inboxFolderName", mInboxFolderName);
    editor.putString(mUuid + ".draftsFolderName", mDraftsFolderName);
    editor.putString(mUuid + ".sentFolderName", mSentFolderName);
    editor.putString(mUuid + ".trashFolderName", mTrashFolderName);
    editor.putString(mUuid + ".archiveFolderName", mArchiveFolderName);
    editor.putString(mUuid + ".spamFolderName", mSpamFolderName);
    editor.putString(mUuid + ".autoExpandFolderName", mAutoExpandFolderName);
    editor.putInt(mUuid + ".accountNumber", mAccountNumber);
    editor.putString(mUuid + ".sortTypeEnum", mSortType.name());
    editor.putBoolean(mUuid + ".sortAscending", mSortAscending.get(mSortType));
    editor.putString(mUuid + ".showPicturesEnum", mShowPictures.name());
    editor.putString(mUuid + ".folderDisplayMode", mFolderDisplayMode.name());
    editor.putString(mUuid + ".folderSyncMode", mFolderSyncMode.name());
    editor.putString(mUuid + ".folderPushMode", mFolderPushMode.name());
    editor.putString(mUuid + ".folderTargetMode", mFolderTargetMode.name());
    editor.putBoolean(mUuid + ".signatureBeforeQuotedText", this.mIsSignatureBeforeQuotedText);
    editor.putString(mUuid + ".expungePolicy", mExpungePolicy.name());
    editor.putBoolean(mUuid + ".syncRemoteDeletions", mSyncRemoteDeletions);
    editor.putInt(mUuid + ".maxPushFolders", mMaxPushFolders);
    editor.putString(mUuid + ".searchableFolders", searchableFolders.name());
    editor.putInt(mUuid + ".chipColor", mChipColor);
    editor.putBoolean(mUuid + ".goToUnreadMessageSearch", goToUnreadMessageSearch);
    editor.putBoolean(mUuid + ".subscribedFoldersOnly", subscribedFoldersOnly);
    editor.putInt(mUuid + ".maximumPolledMessageAge", maximumPolledMessageAge);
    editor.putInt(mUuid + ".maximumAutoDownloadMessageSize", maximumAutoDownloadMessageSize);
    if (MessageFormat.AUTO.equals(mMessageFormat)) {
        // saving MessageFormat.AUTO as is to the database will cause downgrades to crash on
        // startup, so we save as MessageFormat.TEXT instead with a separate flag for auto.
        editor.putString(mUuid + ".messageFormat", Account.MessageFormat.TEXT.name());
        mMessageFormatAuto = true;
    } else {
        editor.putString(mUuid + ".messageFormat", mMessageFormat.name());
        mMessageFormatAuto = false;
    }
    editor.putBoolean(mUuid + ".messageFormatAuto", mMessageFormatAuto);
    editor.putBoolean(mUuid + ".messageReadReceipt", mMessageReadReceipt);
    editor.putString(mUuid + ".quoteStyle", mQuoteStyle.name());
    editor.putString(mUuid + ".quotePrefix", mQuotePrefix);
    editor.putBoolean(mUuid + ".defaultQuotedTextShown", mDefaultQuotedTextShown);
    editor.putBoolean(mUuid + ".replyAfterQuote", mReplyAfterQuote);
    editor.putBoolean(mUuid + ".stripSignature", mStripSignature);
    editor.putLong(mUuid + ".cryptoKey", mCryptoKey);
    editor.putBoolean(mUuid + ".allowRemoteSearch", mAllowRemoteSearch);
    editor.putBoolean(mUuid + ".remoteSearchFullText", mRemoteSearchFullText);
    editor.putInt(mUuid + ".remoteSearchNumResults", mRemoteSearchNumResults);
    editor.putBoolean(mUuid + ".enabled", mEnabled);
    editor.putBoolean(mUuid + ".markMessageAsReadOnView", mMarkMessageAsReadOnView);
    editor.putBoolean(mUuid + ".alwaysShowCcBcc", mAlwaysShowCcBcc);
    editor.putBoolean(mUuid + ".vibrate", mNotificationSetting.shouldVibrate());
    editor.putInt(mUuid + ".vibratePattern", mNotificationSetting.getVibratePattern());
    editor.putInt(mUuid + ".vibrateTimes", mNotificationSetting.getVibrateTimes());
    editor.putBoolean(mUuid + ".ring", mNotificationSetting.shouldRing());
    editor.putString(mUuid + ".ringtone", mNotificationSetting.getRingtone());
    editor.putBoolean(mUuid + ".led", mNotificationSetting.isLed());
    editor.putInt(mUuid + ".ledColor", mNotificationSetting.getLedColor());
    for (NetworkType type : NetworkType.values()) {
        Boolean useCompression = compressionMap.get(type);
        if (useCompression != null) {
            editor.putBoolean(mUuid + ".useCompression." + type, useCompression);
        }
    }
    saveIdentities(preferences.getStorage(), editor);
    editor.commit();
}
Also used : NetworkType(com.fsck.k9.mail.NetworkType) StorageEditor(com.fsck.k9.preferences.StorageEditor)

Example 17 with Flag

use of com.fsck.k9.mail.Flag in project k-9 by k9mail.

the class LocalMessage method populateFromGetMessageCursor.

void populateFromGetMessageCursor(Cursor cursor) throws MessagingException {
    final String subject = cursor.getString(0);
    this.setSubject(subject == null ? "" : subject);
    Address[] from = Address.unpack(cursor.getString(1));
    if (from.length > 0) {
        this.setFrom(from[0]);
    }
    this.setInternalSentDate(new Date(cursor.getLong(2)));
    this.setUid(cursor.getString(3));
    String flagList = cursor.getString(4);
    if (flagList != null && flagList.length() > 0) {
        String[] flags = flagList.split(",");
        for (String flag : flags) {
            try {
                this.setFlagInternal(Flag.valueOf(flag), true);
            } catch (Exception e) {
                if (!"X_BAD_FLAG".equals(flag)) {
                    Timber.w("Unable to parse flag %s", flag);
                }
            }
        }
    }
    this.mId = cursor.getLong(5);
    this.setRecipients(RecipientType.TO, Address.unpack(cursor.getString(6)));
    this.setRecipients(RecipientType.CC, Address.unpack(cursor.getString(7)));
    this.setRecipients(RecipientType.BCC, Address.unpack(cursor.getString(8)));
    this.setReplyTo(Address.unpack(cursor.getString(9)));
    this.mAttachmentCount = cursor.getInt(10);
    this.setInternalDate(new Date(cursor.getLong(11)));
    this.setMessageId(cursor.getString(12));
    String previewTypeString = cursor.getString(24);
    DatabasePreviewType databasePreviewType = DatabasePreviewType.fromDatabaseValue(previewTypeString);
    previewType = databasePreviewType.getPreviewType();
    if (previewType == PreviewType.TEXT) {
        mPreview = cursor.getString(14);
    } else {
        mPreview = "";
    }
    if (this.mFolder == null) {
        LocalFolder f = new LocalFolder(this.localStore, cursor.getInt(13));
        f.open(LocalFolder.OPEN_MODE_RW);
        this.mFolder = f;
    }
    mThreadId = (cursor.isNull(15)) ? -1 : cursor.getLong(15);
    mRootId = (cursor.isNull(16)) ? -1 : cursor.getLong(16);
    boolean deleted = (cursor.getInt(17) == 1);
    boolean read = (cursor.getInt(18) == 1);
    boolean flagged = (cursor.getInt(19) == 1);
    boolean answered = (cursor.getInt(20) == 1);
    boolean forwarded = (cursor.getInt(21) == 1);
    setFlagInternal(Flag.DELETED, deleted);
    setFlagInternal(Flag.SEEN, read);
    setFlagInternal(Flag.FLAGGED, flagged);
    setFlagInternal(Flag.ANSWERED, answered);
    setFlagInternal(Flag.FORWARDED, forwarded);
    setMessagePartId(cursor.getLong(22));
    mimeType = cursor.getString(23);
    byte[] header = cursor.getBlob(25);
    if (header != null) {
        MessageHeaderParser.parse(this, new ByteArrayInputStream(header));
    } else {
        Timber.d("No headers available for this message!");
    }
    headerNeedsUpdating = false;
}
Also used : Address(com.fsck.k9.mail.Address) ByteArrayInputStream(java.io.ByteArrayInputStream) Date(java.util.Date) IOException(java.io.IOException) MessagingException(com.fsck.k9.mail.MessagingException) WrappedException(com.fsck.k9.mailstore.LockableDatabase.WrappedException)

Example 18 with Flag

use of com.fsck.k9.mail.Flag in project k-9 by k9mail.

the class MigrationTo46 method addMessagesFlagColumns.

public static void addMessagesFlagColumns(SQLiteDatabase db, MigrationsHelper migrationsHelper) {
    db.execSQL("ALTER TABLE messages ADD read INTEGER default 0");
    db.execSQL("ALTER TABLE messages ADD flagged INTEGER default 0");
    db.execSQL("ALTER TABLE messages ADD answered INTEGER default 0");
    db.execSQL("ALTER TABLE messages ADD forwarded INTEGER default 0");
    String[] projection = { "id", "flags" };
    ContentValues cv = new ContentValues();
    List<Flag> extraFlags = new ArrayList<>();
    Cursor cursor = db.query("messages", projection, null, null, null, null, null);
    try {
        while (cursor.moveToNext()) {
            long id = cursor.getLong(0);
            String flagList = cursor.getString(1);
            boolean read = false;
            boolean flagged = false;
            boolean answered = false;
            boolean forwarded = false;
            if (flagList != null && flagList.length() > 0) {
                String[] flags = flagList.split(",");
                for (String flagStr : flags) {
                    try {
                        Flag flag = Flag.valueOf(flagStr);
                        switch(flag) {
                            case ANSWERED:
                                {
                                    answered = true;
                                    break;
                                }
                            case DELETED:
                                {
                                    // Don't store this in column 'flags'
                                    break;
                                }
                            case FLAGGED:
                                {
                                    flagged = true;
                                    break;
                                }
                            case FORWARDED:
                                {
                                    forwarded = true;
                                    break;
                                }
                            case SEEN:
                                {
                                    read = true;
                                    break;
                                }
                            case DRAFT:
                            case RECENT:
                            case X_DESTROYED:
                            case X_DOWNLOADED_FULL:
                            case X_DOWNLOADED_PARTIAL:
                            case X_REMOTE_COPY_STARTED:
                            case X_SEND_FAILED:
                            case X_SEND_IN_PROGRESS:
                                {
                                    extraFlags.add(flag);
                                    break;
                                }
                        }
                    } catch (Exception e) {
                    // Ignore bad flags
                    }
                }
            }
            cv.put("flags", migrationsHelper.serializeFlags(extraFlags));
            cv.put("read", read);
            cv.put("flagged", flagged);
            cv.put("answered", answered);
            cv.put("forwarded", forwarded);
            db.update("messages", cv, "id = ?", new String[] { Long.toString(id) });
            cv.clear();
            extraFlags.clear();
        }
    } finally {
        cursor.close();
    }
    db.execSQL("CREATE INDEX IF NOT EXISTS msg_read ON messages (read)");
    db.execSQL("CREATE INDEX IF NOT EXISTS msg_flagged ON messages (flagged)");
}
Also used : ContentValues(android.content.ContentValues) ArrayList(java.util.ArrayList) Cursor(android.database.Cursor) Flag(com.fsck.k9.mail.Flag)

Example 19 with Flag

use of com.fsck.k9.mail.Flag in project k-9 by k9mail.

the class MigrationTo51 method updateFlagsForMessage.

private static void updateFlagsForMessage(SQLiteDatabase db, long messageId, String messageFlags, MigrationsHelper migrationsHelper) {
    List<Flag> extraFlags = new ArrayList<>();
    if (messageFlags != null && messageFlags.length() > 0) {
        String[] flags = messageFlags.split(",");
        for (String flagStr : flags) {
            try {
                Flag flag = Flag.valueOf(flagStr);
                extraFlags.add(flag);
            } catch (Exception e) {
            // Ignore bad flags
            }
        }
    }
    extraFlags.add(Flag.X_MIGRATED_FROM_V50);
    String flagsString = migrationsHelper.serializeFlags(extraFlags);
    db.execSQL("UPDATE messages SET flags = ? WHERE id = ?", new Object[] { flagsString, messageId });
}
Also used : ArrayList(java.util.ArrayList) Flag(com.fsck.k9.mail.Flag) IOException(java.io.IOException)

Example 20 with Flag

use of com.fsck.k9.mail.Flag in project k-9 by k9mail.

the class MessageListFragment method setFlag.

private void setFlag(int adapterPosition, final Flag flag, final boolean newState) {
    if (adapterPosition == AdapterView.INVALID_POSITION) {
        return;
    }
    Cursor cursor = (Cursor) adapter.getItem(adapterPosition);
    Account account = preferences.getAccount(cursor.getString(ACCOUNT_UUID_COLUMN));
    if (showingThreadedList && cursor.getInt(THREAD_COUNT_COLUMN) > 1) {
        long threadRootId = cursor.getLong(THREAD_ROOT_COLUMN);
        messagingController.setFlagForThreads(account, Collections.singletonList(threadRootId), flag, newState);
    } else {
        long id = cursor.getLong(ID_COLUMN);
        messagingController.setFlag(account, Collections.singletonList(id), flag, newState);
    }
    computeBatchDirection();
}
Also used : Account(com.fsck.k9.Account) Cursor(android.database.Cursor)

Aggregations

MessagingException (com.fsck.k9.mail.MessagingException)10 Message (com.fsck.k9.mail.Message)9 MimeMessage (com.fsck.k9.mail.internet.MimeMessage)9 LocalMessage (com.fsck.k9.mailstore.LocalMessage)9 Flag (com.fsck.k9.mail.Flag)8 LocalFolder (com.fsck.k9.mailstore.LocalFolder)8 LocalStore (com.fsck.k9.mailstore.LocalStore)8 ArrayList (java.util.ArrayList)8 Folder (com.fsck.k9.mail.Folder)7 PendingSetFlag (com.fsck.k9.controller.MessagingControllerCommands.PendingSetFlag)6 Store (com.fsck.k9.mail.Store)6 Pop3Store (com.fsck.k9.mail.store.pop3.Pop3Store)6 Account (com.fsck.k9.Account)5 IOException (java.io.IOException)5 SuppressLint (android.annotation.SuppressLint)4 Cursor (android.database.Cursor)4 EmailProviderCache (com.fsck.k9.cache.EmailProviderCache)4 FetchProfile (com.fsck.k9.mail.FetchProfile)4 OldPendingCommand (com.fsck.k9.mailstore.migrations.MigrationTo60.OldPendingCommand)4 Date (java.util.Date)4