package com.fsck.k9.mailstore.migrations; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import timber.log.Timber; import com.fsck.k9.Account; import com.fsck.k9.K9; import com.fsck.k9.helper.Utility; import com.fsck.k9.mail.Folder; import com.fsck.k9.preferences.Storage; class MigrationTo41 { public static void db41FoldersAddClassColumns(SQLiteDatabase db) { try { db.execSQL("ALTER TABLE folders ADD integrate INTEGER"); db.execSQL("ALTER TABLE folders ADD top_group INTEGER"); db.execSQL("ALTER TABLE folders ADD poll_class TEXT"); db.execSQL("ALTER TABLE folders ADD push_class TEXT"); db.execSQL("ALTER TABLE folders ADD display_class TEXT"); } catch (SQLiteException e) { if (!e.getMessage().startsWith("duplicate column name:")) { throw e; } } } public static void db41UpdateFolderMetadata(SQLiteDatabase db, MigrationsHelper migrationsHelper) { Cursor cursor = null; try { cursor = db.rawQuery("SELECT id, name FROM folders", null); while (cursor.moveToNext()) { try { int id = cursor.getInt(0); String name = cursor.getString(1); update41Metadata(db, migrationsHelper, id, name); } catch (Exception e) { Timber.e(e, " error trying to ugpgrade a folder class"); } } } catch (SQLiteException e) { Timber.e(e, "Exception while upgrading database to v41. folder classes may have vanished"); } finally { Utility.closeQuietly(cursor); } } private static void update41Metadata(SQLiteDatabase db, MigrationsHelper migrationsHelper, int id, String name) { Storage storage = migrationsHelper.getStorage(); Account account = migrationsHelper.getAccount(); String accountUuid = account.getUuid(); Folder.FolderClass displayClass = Folder.FolderClass.NO_CLASS; Folder.FolderClass syncClass = Folder.FolderClass.INHERITED; Folder.FolderClass pushClass = Folder.FolderClass.SECOND_CLASS; boolean inTopGroup = false; boolean integrate = false; if (account.getInboxFolderName().equals(name)) { displayClass = Folder.FolderClass.FIRST_CLASS; syncClass = Folder.FolderClass.FIRST_CLASS; pushClass = Folder.FolderClass.FIRST_CLASS; inTopGroup = true; integrate = true; } try { displayClass = Folder.FolderClass.valueOf(storage.getString(accountUuid + "." + name + ".displayMode", displayClass.name())); syncClass = Folder.FolderClass.valueOf(storage.getString(accountUuid + "." + name + ".syncMode", syncClass.name())); pushClass = Folder.FolderClass.valueOf(storage.getString(accountUuid + "." + name + ".pushMode", pushClass.name())); inTopGroup = storage.getBoolean(accountUuid + "." + name + ".inTopGroup", inTopGroup); integrate = storage.getBoolean(accountUuid + "." + name + ".integrate", integrate); } catch (Exception e) { Timber.e(e, " Throwing away an error while trying to upgrade folder metadata"); } if (displayClass == Folder.FolderClass.NONE) { displayClass = Folder.FolderClass.NO_CLASS; } if (syncClass == Folder.FolderClass.NONE) { syncClass = Folder.FolderClass.INHERITED; } if (pushClass == Folder.FolderClass.NONE) { pushClass = Folder.FolderClass.INHERITED; } db.execSQL("UPDATE folders SET integrate = ?, top_group = ?, poll_class=?, push_class =?, display_class = ? WHERE id = ?", new Object[] { integrate, inTopGroup, syncClass, pushClass, displayClass, id }); } }