pull/155/head
M66B 7 years ago
parent 748715f798
commit 85eb09461b

File diff suppressed because it is too large Load Diff

@ -51,7 +51,7 @@ import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory;
// https://developer.android.com/topic/libraries/architecture/room.html
@Database(
version = 67,
version = 68,
entities = {
EntityIdentity.class,
EntityAccount.class,
@ -716,6 +716,14 @@ public abstract class DB extends RoomDatabase {
db.execSQL("ALTER TABLE `message` ADD COLUMN `revision` INTEGER");
}
})
.addMigrations(new Migration(67, 68) {
@Override
public void migrate(SupportSQLiteDatabase db) {
Log.i("DB migration from version " + startVersion + " to " + endVersion);
db.execSQL("ALTER TABLE `message` ADD COLUMN `revisions` INTEGER");
db.execSQL("UPDATE message SET revisions = revision");
}
})
.build();
}

@ -336,6 +336,9 @@ public interface DaoMessage {
@Query("UPDATE message SET revision = :revision WHERE id = :id")
int setMessageRevision(long id, Integer revision);
@Query("UPDATE message SET revisions = :revisions WHERE id = :id")
int setMessageRevisions(long id, Integer revisions);
@Query("UPDATE message SET content = :content, preview = :preview, warning = :warning WHERE id = :id")
int setMessageContent(long id, boolean content, String preview, String warning);

@ -137,6 +137,7 @@ public class EntityMessage implements Serializable {
public Boolean ui_browsed = false;
public Long ui_snoozed;
public Integer revision; // compose
public Integer revisions; // compose
public String warning; // persistent
public String error; // volatile
public Long last_attempt; // send

@ -1914,7 +1914,8 @@ public class FragmentCompose extends FragmentBase {
grpHeader.setVisibility(View.VISIBLE);
grpAddresses.setVisibility("reply_all".equals(action) ? View.VISIBLE : View.GONE);
bottom_navigation.getMenu().findItem(R.id.action_undo).setEnabled(draft.revision != null);
bottom_navigation.getMenu().findItem(R.id.action_undo).setEnabled(draft.revision != null && draft.revision > 1);
bottom_navigation.getMenu().findItem(R.id.action_redo).setEnabled(draft.revision != null && !draft.revision.equals(draft.revisions));
getActivity().invalidateOptionsMenu();
@ -2187,32 +2188,46 @@ public class FragmentCompose extends FragmentBase {
db.message().updateMessage(draft);
}
String previous = Helper.readText(draft.getFile(context));
if (!body.equals(previous) || action == R.id.action_undo) {
dirty = true;
if (action == R.id.action_undo || action == R.id.action_redo) {
if (draft.revision != null && draft.revisions != null) {
dirty = true;
if (action == R.id.action_undo) {
if (draft.revision > 1)
draft.revision--;
} else {
if (draft.revision < draft.revisions)
draft.revision++;
}
if (action == R.id.action_undo) {
body = Helper.readText(draft.getFile(context, draft.revision));
Helper.writeText(draft.getFile(context), body);
if (draft.revision > 1)
draft.revision--;
else
draft.revision = null;
} else {
if (draft.revision == null)
draft.revision = 1;
else
draft.revision++;
db.message().setMessageRevision(draft.id, draft.revision);
Helper.writeText(draft.getFile(context, draft.revision), previous);
db.message().setMessageContent(draft.id, true, HtmlHelper.getPreview(body), null);
Core.updateMessageSize(context, draft.id);
}
} else {
String previous = Helper.readText(draft.getFile(context));
if (!body.equals(previous)) {
dirty = true;
Helper.writeText(draft.getFile(context), body);
if (draft.revisions == null)
draft.revisions = 1;
else
draft.revisions++;
draft.revision = draft.revisions;
db.message().setMessageRevision(draft.id, draft.revision);
db.message().setMessageContent(draft.id, true, HtmlHelper.getPreview(body), null);
Helper.writeText(draft.getFile(context), body);
Helper.writeText(draft.getFile(context, draft.revisions), body);
Core.updateMessageSize(context, draft.id);
db.message().setMessageRevision(draft.id, draft.revision);
db.message().setMessageRevisions(draft.id, draft.revisions);
db.message().setMessageContent(draft.id, true, HtmlHelper.getPreview(body), null);
Core.updateMessageSize(context, draft.id);
}
}
// Remove unused inline images
@ -2253,7 +2268,10 @@ public class FragmentCompose extends FragmentBase {
}
});
}
} else if (action == R.id.action_save || action == R.id.action_undo || action == R.id.menu_encrypt) {
} else if (action == R.id.action_save ||
action == R.id.action_undo ||
action == R.id.action_redo ||
action == R.id.menu_encrypt) {
if (BuildConfig.DEBUG || dirty)
EntityOperation.queue(context, db, draft, EntityOperation.ADD);
@ -2333,13 +2351,14 @@ public class FragmentCompose extends FragmentBase {
etCc.setText(MessageHelper.formatAddressesCompose(draft.cc));
etBcc.setText(MessageHelper.formatAddressesCompose(draft.bcc));
bottom_navigation.getMenu().findItem(R.id.action_undo).setEnabled(draft.revision != null);
bottom_navigation.getMenu().findItem(R.id.action_undo).setEnabled(draft.revision != null && draft.revision > 1);
bottom_navigation.getMenu().findItem(R.id.action_redo).setEnabled(draft.revision != null && !draft.revision.equals(draft.revisions));
if (action == R.id.action_delete) {
autosave = false;
finish();
} else if (action == R.id.action_undo) {
} else if (action == R.id.action_undo || action == R.id.action_redo) {
showDraft(draft);
} else if (action == R.id.action_save) {
@ -2439,7 +2458,8 @@ public class FragmentCompose extends FragmentBase {
edit_bar.setVisibility(style ? View.VISIBLE : View.GONE);
bottom_navigation.setVisibility(View.VISIBLE);
Helper.setViewsEnabled(view, true);
bottom_navigation.getMenu().findItem(R.id.action_undo).setEnabled(draft.revision != null);
bottom_navigation.getMenu().findItem(R.id.action_undo).setEnabled(draft.revision != null && draft.revision > 1);
bottom_navigation.getMenu().findItem(R.id.action_redo).setEnabled(draft.revision != null && !draft.revision.equals(draft.revisions));
getActivity().invalidateOptionsMenu();
}

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M18.4,10.6C16.55,8.99 14.15,8 11.5,8c-4.65,0 -8.58,3.03 -9.96,7.22L3.9,16c1.05,-3.19 4.05,-5.5 7.6,-5.5 1.95,0 3.73,0.72 5.12,1.88L13,16h9V7l-3.6,3.6z"/>
</vector>

@ -16,6 +16,11 @@
android:icon="@drawable/baseline_undo_24"
android:title="@string/title_undo" />
<item
android:id="@+id/action_redo"
android:icon="@drawable/baseline_redo_24"
android:title="@string/title_redo" />
<item
android:id="@+id/action_send"
android:icon="@drawable/baseline_send_24"

@ -565,6 +565,7 @@
<string name="title_yes">Yes</string>
<string name="title_no">No</string>
<string name="title_undo">Undo</string>
<string name="title_redo">Redo</string>
<string name="title_add">Add</string>
<string name="title_browse">Browse</string>
<string name="title_info">Info</string>

Loading…
Cancel
Save