mirror of https://github.com/M66B/FairEmail.git
Added sort on sender
This commit is contained in:
parent
0ab8452495
commit
02a89260b4
File diff suppressed because it is too large
Load Diff
|
@ -451,13 +451,14 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
|||
}
|
||||
|
||||
if (debug) {
|
||||
String text = message.error +
|
||||
"\n" + message.uid + "/" + message.id + " " + df.format(new Date(message.received)) +
|
||||
String text = "error=" + message.error +
|
||||
"\n uid=" + message.uid + " id=" + message.id + " " + df.format(new Date(message.received)) +
|
||||
"\n" + (message.ui_hide ? "HIDDEN " : "") +
|
||||
"seen=" + message.seen + "/" + message.ui_seen + "/" + message.unseen +
|
||||
"seen=" + message.seen + "/" + message.ui_seen + " unseen=" + message.unseen +
|
||||
" found=" + message.ui_found +
|
||||
"\n" + message.msgid +
|
||||
"\n" + message.thread;
|
||||
"\n msgid=" + message.msgid +
|
||||
"\n thread=" + message.thread +
|
||||
"\n sender=" + message.sender;
|
||||
|
||||
tvError.setText(text);
|
||||
tvError.setVisibility(View.VISIBLE);
|
||||
|
|
|
@ -47,7 +47,7 @@ import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory;
|
|||
// https://developer.android.com/topic/libraries/architecture/room.html
|
||||
|
||||
@Database(
|
||||
version = 26,
|
||||
version = 27,
|
||||
entities = {
|
||||
EntityIdentity.class,
|
||||
EntityAccount.class,
|
||||
|
@ -331,6 +331,34 @@ public abstract class DB extends RoomDatabase {
|
|||
db.execSQL("ALTER TABLE `account` ADD COLUMN `browse` INTEGER NOT NULL DEFAULT " + browse);
|
||||
}
|
||||
})
|
||||
.addMigrations(new Migration(26, 27) {
|
||||
@Override
|
||||
public void migrate(SupportSQLiteDatabase db) {
|
||||
Log.i("DB migration from version " + startVersion + " to " + endVersion);
|
||||
db.execSQL("ALTER TABLE `message` ADD COLUMN `sender` TEXT");
|
||||
|
||||
Cursor cursor = null;
|
||||
try {
|
||||
cursor = db.query("SELECT `id`, `from` FROM message");
|
||||
while (cursor.moveToNext()) {
|
||||
long id = cursor.getLong(0);
|
||||
String json = cursor.getString(1);
|
||||
Address[] from = Converters.decodeAddresses(json);
|
||||
String sender = MessageHelper.getSortKey(from);
|
||||
if (sender != null)
|
||||
db.execSQL(
|
||||
"UPDATE message SET sender = ? WHERE id = ?",
|
||||
new Object[]{sender, id});
|
||||
}
|
||||
|
||||
} finally {
|
||||
if (cursor != null)
|
||||
cursor.close();
|
||||
}
|
||||
|
||||
db.execSQL("CREATE INDEX `index_message_sender` ON `message` (`sender`)");
|
||||
}
|
||||
})
|
||||
.build();
|
||||
}
|
||||
|
||||
|
|
|
@ -63,7 +63,9 @@ public interface DaoMessage {
|
|||
" AND (NOT message.ui_hide OR :debug)" +
|
||||
" GROUP BY account.id, CASE WHEN message.thread IS NULL OR NOT :threading THEN message.id ELSE message.thread END" +
|
||||
" HAVING SUM(unified) > 0" +
|
||||
" ORDER BY CASE" +
|
||||
" ORDER BY" +
|
||||
" CASE WHEN 'sender' = :sort THEN message.sender ELSE '' END," +
|
||||
" CASE" +
|
||||
" WHEN 'unread' = :sort THEN " + unseen_unified + " > 0" +
|
||||
" WHEN 'starred' = :sort THEN COUNT(message.id) - " + unflagged_unified + " > 0" +
|
||||
" ELSE 0" +
|
||||
|
@ -99,7 +101,9 @@ public interface DaoMessage {
|
|||
" AND (NOT :found OR ui_found = :found)" +
|
||||
" GROUP BY CASE WHEN message.thread IS NULL OR NOT :threading THEN message.id ELSE message.thread END" +
|
||||
" HAVING SUM(CASE WHEN folder.id = :folder THEN 1 ELSE 0 END) > 0" +
|
||||
" ORDER BY CASE" +
|
||||
" ORDER BY" +
|
||||
" CASE WHEN 'sender' = :sort THEN message.sender ELSE '' END," +
|
||||
" CASE" +
|
||||
" WHEN 'unread' = :sort THEN " + unseen_folder + " > 0" +
|
||||
" WHEN 'starred' = :sort THEN COUNT(message.id) - " + unflagged_folder + " > 0" +
|
||||
" ELSE 0" +
|
||||
|
|
|
@ -74,6 +74,7 @@ import static androidx.room.ForeignKey.SET_NULL;
|
|||
@Index(value = {"folder", "uid"}, unique = true),
|
||||
@Index(value = {"msgid", "folder"}, unique = true),
|
||||
@Index(value = {"thread"}),
|
||||
@Index(value = {"sender"}),
|
||||
@Index(value = {"received"}),
|
||||
@Index(value = {"ui_seen"}),
|
||||
@Index(value = {"ui_flagged"}),
|
||||
|
@ -103,6 +104,7 @@ public class EntityMessage implements Serializable {
|
|||
public String inreplyto;
|
||||
public String thread; // compose = null
|
||||
public String avatar; // Contact lookup URI
|
||||
public String sender; // sort key
|
||||
public Address[] from;
|
||||
public Address[] to;
|
||||
public Address[] cc;
|
||||
|
|
|
@ -1285,7 +1285,6 @@ public class FragmentCompose extends FragmentEx {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// Select identity matching from address
|
||||
String from = null;
|
||||
EntityIdentity primary = null;
|
||||
|
@ -1308,6 +1307,8 @@ public class FragmentCompose extends FragmentEx {
|
|||
result.draft.from = new InternetAddress[]{new InternetAddress(primary.email, primary.name)};
|
||||
}
|
||||
|
||||
result.draft.sender = MessageHelper.getSortKey(result.draft.from);
|
||||
|
||||
result.draft.received = new Date().getTime();
|
||||
result.draft.setContactInfo(context);
|
||||
|
||||
|
@ -1658,6 +1659,7 @@ public class FragmentCompose extends FragmentEx {
|
|||
// Update draft
|
||||
draft.identity = ident;
|
||||
draft.extra = extra;
|
||||
draft.sender = MessageHelper.getSortKey(afrom);
|
||||
draft.from = afrom;
|
||||
draft.to = ato;
|
||||
draft.cc = acc;
|
||||
|
|
|
@ -1564,6 +1564,8 @@ public class FragmentMessages extends FragmentEx {
|
|||
menu.findItem(R.id.menu_sort_on_unread).setChecked(true);
|
||||
else if ("starred".equals(sort))
|
||||
menu.findItem(R.id.menu_sort_on_starred).setChecked(true);
|
||||
else if ("sender".equals(sort))
|
||||
menu.findItem(R.id.menu_sort_on_sender).setChecked(true);
|
||||
|
||||
super.onPrepareOptionsMenu(menu);
|
||||
}
|
||||
|
@ -1591,6 +1593,12 @@ public class FragmentMessages extends FragmentEx {
|
|||
loadMessages();
|
||||
return true;
|
||||
|
||||
case R.id.menu_sort_on_sender:
|
||||
prefs.edit().putString("sort", "sender").apply();
|
||||
item.setChecked(true);
|
||||
loadMessages();
|
||||
return true;
|
||||
|
||||
case R.id.menu_zoom:
|
||||
zoom = ++zoom % 3;
|
||||
prefs.edit().putInt("zoom", zoom).apply();
|
||||
|
@ -1676,6 +1684,7 @@ public class FragmentMessages extends FragmentEx {
|
|||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||
String sort = prefs.getString("sort", "time");
|
||||
boolean debug = prefs.getBoolean("debug", false);
|
||||
Log.i("Load messages type=" + viewType + " sort=" + sort + " debug=" + debug);
|
||||
|
||||
// Sort changed
|
||||
if (messages != null)
|
||||
|
|
|
@ -463,6 +463,17 @@ public class MessageHelper {
|
|||
return TextUtils.join(", ", formatted);
|
||||
}
|
||||
|
||||
static String getSortKey(Address[] addresses) {
|
||||
if (addresses == null || addresses.length == 0)
|
||||
return null;
|
||||
InternetAddress address = (InternetAddress) addresses[0];
|
||||
String personal = address.getPersonal();
|
||||
if (TextUtils.isEmpty(personal))
|
||||
return address.getAddress();
|
||||
else
|
||||
return personal;
|
||||
}
|
||||
|
||||
String getHtml() throws MessagingException, IOException {
|
||||
return getHtml(imessage);
|
||||
}
|
||||
|
|
|
@ -2350,6 +2350,7 @@ public class ServiceSynchronize extends LifecycleService {
|
|||
message.inreplyto = helper.getInReplyTo();
|
||||
message.deliveredto = helper.getDeliveredTo();
|
||||
message.thread = helper.getThreadId(uid);
|
||||
message.sender = MessageHelper.getSortKey(helper.getFrom());
|
||||
message.from = helper.getFrom();
|
||||
message.to = helper.getTo();
|
||||
message.cc = helper.getCc();
|
||||
|
|
|
@ -25,6 +25,9 @@
|
|||
<item
|
||||
android:id="@+id/menu_sort_on_starred"
|
||||
android:title="@string/title_sort_on_starred" />
|
||||
<item
|
||||
android:id="@+id/menu_sort_on_sender"
|
||||
android:title="@string/title_sort_on_sender" />
|
||||
</group>
|
||||
</menu>
|
||||
</item>
|
||||
|
|
|
@ -334,6 +334,7 @@
|
|||
<string name="title_sort_on_time">Time</string>
|
||||
<string name="title_sort_on_unread">Unread</string>
|
||||
<string name="title_sort_on_starred">Starred</string>
|
||||
<string name="title_sort_on_sender">Sender</string>
|
||||
|
||||
<string name="title_zoom">Text size</string>
|
||||
|
||||
|
|
Loading…
Reference in New Issue