diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index c52a28ecf9..6e0104d427 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -177,6 +177,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc private SwitchCompat swAnalyze; private SwitchCompat swAutoVacuum; private SwitchCompat swSyncExtra; + private SwitchCompat swUnicode61; private TextView tvSqliteCache; private SeekBar sbSqliteCache; private TextView tvChunkSize; @@ -382,6 +383,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swAnalyze = view.findViewById(R.id.swAnalyze); swAutoVacuum = view.findViewById(R.id.swAutoVacuum); swSyncExtra = view.findViewById(R.id.swSyncExtra); + swUnicode61 = view.findViewById(R.id.swUnicode61); tvSqliteCache = view.findViewById(R.id.tvSqliteCache); sbSqliteCache = view.findViewById(R.id.sbSqliteCache); ibSqliteCache = view.findViewById(R.id.ibSqliteCache); @@ -505,7 +507,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc SQLiteDatabase sdb = Fts4DbHelper.getInstance(context); Fts4DbHelper.delete(sdb); Fts4DbHelper.optimize(sdb); - } catch (SQLiteDatabaseCorruptException ex) { + } catch (Throwable ex) { Log.e(ex); Fts4DbHelper.delete(context); } @@ -1182,6 +1184,37 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc } }); + swUnicode61.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton v, boolean checked) { + prefs.edit() + .putBoolean("fts", false) + .putBoolean("sqlite_unicode61", checked) + .apply(); + WorkerFts.init(getContext(), true); + + new SimpleTask() { + @Override + protected Void onExecute(Context context, Bundle args) throws Throwable { + Fts4DbHelper.delete(context); + Fts5DbHelper.delete(context); + return null; + } + + @Override + protected void onExecuted(Bundle args, Void data) { + prefs.edit().putBoolean("fts", true).apply(); + WorkerFts.init(getContext(), true); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(getParentFragmentManager(), ex); + } + }.execute(FragmentOptionsMisc.this, new Bundle(), "unicode61"); + } + }); + sbSqliteCache.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { @@ -2050,6 +2083,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swAnalyze.setChecked(prefs.getBoolean("sqlite_analyze", true)); swAutoVacuum.setChecked(prefs.getBoolean("sqlite_auto_vacuum", false)); swSyncExtra.setChecked(prefs.getBoolean("sqlite_sync_extra", true)); + swUnicode61.setChecked(prefs.getBoolean("sqlite_unicode61", false)); int sqlite_cache = prefs.getInt("sqlite_cache", DB.DEFAULT_CACHE_SIZE); Integer cache_size = DB.getCacheSizeKb(getContext()); diff --git a/app/src/main/java/eu/faircode/email/Fts4DbHelper.java b/app/src/main/java/eu/faircode/email/Fts4DbHelper.java index eab05a1eaa..95a96f4841 100644 --- a/app/src/main/java/eu/faircode/email/Fts4DbHelper.java +++ b/app/src/main/java/eu/faircode/email/Fts4DbHelper.java @@ -56,8 +56,9 @@ public class Fts4DbHelper extends SQLiteOpenHelper { } static SQLiteDatabase getInstance(Context context) { - if (instance == null) { - if (!context.getDatabasePath(DATABASE_NAME).exists()) { + boolean exists = context.getDatabasePath(DATABASE_NAME).exists(); + if (instance == null || !exists) { + if (!exists) { Fts5DbHelper.delete(context); DB.getInstance(context).message().resetFts(); } @@ -73,8 +74,8 @@ public class Fts4DbHelper extends SQLiteOpenHelper { // https://www.sqlite.org/fts3.html#tokenizer // https://unicode.org/reports/tr29/ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - boolean unicode61 = prefs.getBoolean("unicode61", BuildConfig.DEBUG); - String tokenizer = (unicode61 ? "tokenize=unicode61 \"remove_diacritics=0\"" : null); + boolean unicode61 = prefs.getBoolean("sqlite_unicode61", false); + String tokenizer = (unicode61 ? "tokenize=unicode61 \"remove_diacritics=2\"" : null); db.execSQL("CREATE VIRTUAL TABLE `message`" + " USING fts4" + diff --git a/app/src/main/java/eu/faircode/email/Fts5DbHelper.java b/app/src/main/java/eu/faircode/email/Fts5DbHelper.java index a7bc02c064..d9dd24d086 100644 --- a/app/src/main/java/eu/faircode/email/Fts5DbHelper.java +++ b/app/src/main/java/eu/faircode/email/Fts5DbHelper.java @@ -50,8 +50,12 @@ public class Fts5DbHelper extends SQLiteOpenHelper { } static SQLiteDatabase getInstance(Context context) { - if (instance == null) + boolean exists = context.getDatabasePath(DATABASE_NAME).exists(); + if (instance == null || !exists) { + if (!exists) + DB.getInstance(context).message().resetFts(); instance = new Fts5DbHelper(context); + } return instance.getWritableDatabase(); } diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml index 0ed5203ff1..11e3e8bb7f 100644 --- a/app/src/main/res/layout/fragment_options_misc.xml +++ b/app/src/main/res/layout/fragment_options_misc.xml @@ -1119,6 +1119,17 @@ app:layout_constraintTop_toBottomOf="@id/swAutoVacuum" app:switchPadding="12dp" /> + + + app:layout_constraintTop_toBottomOf="@id/swUnicode61" /> sqlite analyze sqlite auto vacuum sqlite sync extra + sqlite unicode61 tokenizer sqlite cache: %1$s %% - %2$s Chunk size: %1$d Thread range: %1$d days