Added sort on sender

pull/147/head
M66B 6 years ago
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) { if (debug) {
String text = message.error + String text = "error=" + message.error +
"\n" + message.uid + "/" + message.id + " " + df.format(new Date(message.received)) + "\n uid=" + message.uid + " id=" + message.id + " " + df.format(new Date(message.received)) +
"\n" + (message.ui_hide ? "HIDDEN " : "") + "\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 + " found=" + message.ui_found +
"\n" + message.msgid + "\n msgid=" + message.msgid +
"\n" + message.thread; "\n thread=" + message.thread +
"\n sender=" + message.sender;
tvError.setText(text); tvError.setText(text);
tvError.setVisibility(View.VISIBLE); tvError.setVisibility(View.VISIBLE);

@ -47,7 +47,7 @@ import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory;
// https://developer.android.com/topic/libraries/architecture/room.html // https://developer.android.com/topic/libraries/architecture/room.html
@Database( @Database(
version = 26, version = 27,
entities = { entities = {
EntityIdentity.class, EntityIdentity.class,
EntityAccount.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); 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(); .build();
} }

@ -63,7 +63,9 @@ public interface DaoMessage {
" AND (NOT message.ui_hide OR :debug)" + " 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" + " GROUP BY account.id, CASE WHEN message.thread IS NULL OR NOT :threading THEN message.id ELSE message.thread END" +
" HAVING SUM(unified) > 0" + " 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 'unread' = :sort THEN " + unseen_unified + " > 0" +
" WHEN 'starred' = :sort THEN COUNT(message.id) - " + unflagged_unified + " > 0" + " WHEN 'starred' = :sort THEN COUNT(message.id) - " + unflagged_unified + " > 0" +
" ELSE 0" + " ELSE 0" +
@ -99,7 +101,9 @@ public interface DaoMessage {
" AND (NOT :found OR ui_found = :found)" + " 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" + " 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" + " 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 'unread' = :sort THEN " + unseen_folder + " > 0" +
" WHEN 'starred' = :sort THEN COUNT(message.id) - " + unflagged_folder + " > 0" + " WHEN 'starred' = :sort THEN COUNT(message.id) - " + unflagged_folder + " > 0" +
" ELSE 0" + " ELSE 0" +

@ -74,6 +74,7 @@ import static androidx.room.ForeignKey.SET_NULL;
@Index(value = {"folder", "uid"}, unique = true), @Index(value = {"folder", "uid"}, unique = true),
@Index(value = {"msgid", "folder"}, unique = true), @Index(value = {"msgid", "folder"}, unique = true),
@Index(value = {"thread"}), @Index(value = {"thread"}),
@Index(value = {"sender"}),
@Index(value = {"received"}), @Index(value = {"received"}),
@Index(value = {"ui_seen"}), @Index(value = {"ui_seen"}),
@Index(value = {"ui_flagged"}), @Index(value = {"ui_flagged"}),
@ -103,6 +104,7 @@ public class EntityMessage implements Serializable {
public String inreplyto; public String inreplyto;
public String thread; // compose = null public String thread; // compose = null
public String avatar; // Contact lookup URI public String avatar; // Contact lookup URI
public String sender; // sort key
public Address[] from; public Address[] from;
public Address[] to; public Address[] to;
public Address[] cc; public Address[] cc;

@ -1285,7 +1285,6 @@ public class FragmentCompose extends FragmentEx {
} }
} }
// Select identity matching from address // Select identity matching from address
String from = null; String from = null;
EntityIdentity primary = 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.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.received = new Date().getTime();
result.draft.setContactInfo(context); result.draft.setContactInfo(context);
@ -1658,6 +1659,7 @@ public class FragmentCompose extends FragmentEx {
// Update draft // Update draft
draft.identity = ident; draft.identity = ident;
draft.extra = extra; draft.extra = extra;
draft.sender = MessageHelper.getSortKey(afrom);
draft.from = afrom; draft.from = afrom;
draft.to = ato; draft.to = ato;
draft.cc = acc; draft.cc = acc;

@ -1564,6 +1564,8 @@ public class FragmentMessages extends FragmentEx {
menu.findItem(R.id.menu_sort_on_unread).setChecked(true); menu.findItem(R.id.menu_sort_on_unread).setChecked(true);
else if ("starred".equals(sort)) else if ("starred".equals(sort))
menu.findItem(R.id.menu_sort_on_starred).setChecked(true); 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); super.onPrepareOptionsMenu(menu);
} }
@ -1591,6 +1593,12 @@ public class FragmentMessages extends FragmentEx {
loadMessages(); loadMessages();
return true; 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: case R.id.menu_zoom:
zoom = ++zoom % 3; zoom = ++zoom % 3;
prefs.edit().putInt("zoom", zoom).apply(); prefs.edit().putInt("zoom", zoom).apply();
@ -1676,6 +1684,7 @@ public class FragmentMessages extends FragmentEx {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
String sort = prefs.getString("sort", "time"); String sort = prefs.getString("sort", "time");
boolean debug = prefs.getBoolean("debug", false); boolean debug = prefs.getBoolean("debug", false);
Log.i("Load messages type=" + viewType + " sort=" + sort + " debug=" + debug);
// Sort changed // Sort changed
if (messages != null) if (messages != null)

@ -463,6 +463,17 @@ public class MessageHelper {
return TextUtils.join(", ", formatted); 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 { String getHtml() throws MessagingException, IOException {
return getHtml(imessage); return getHtml(imessage);
} }

@ -2350,6 +2350,7 @@ public class ServiceSynchronize extends LifecycleService {
message.inreplyto = helper.getInReplyTo(); message.inreplyto = helper.getInReplyTo();
message.deliveredto = helper.getDeliveredTo(); message.deliveredto = helper.getDeliveredTo();
message.thread = helper.getThreadId(uid); message.thread = helper.getThreadId(uid);
message.sender = MessageHelper.getSortKey(helper.getFrom());
message.from = helper.getFrom(); message.from = helper.getFrom();
message.to = helper.getTo(); message.to = helper.getTo();
message.cc = helper.getCc(); message.cc = helper.getCc();

@ -25,6 +25,9 @@
<item <item
android:id="@+id/menu_sort_on_starred" android:id="@+id/menu_sort_on_starred"
android:title="@string/title_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> </group>
</menu> </menu>
</item> </item>

@ -334,6 +334,7 @@
<string name="title_sort_on_time">Time</string> <string name="title_sort_on_time">Time</string>
<string name="title_sort_on_unread">Unread</string> <string name="title_sort_on_unread">Unread</string>
<string name="title_sort_on_starred">Starred</string> <string name="title_sort_on_starred">Starred</string>
<string name="title_sort_on_sender">Sender</string>
<string name="title_zoom">Text size</string> <string name="title_zoom">Text size</string>

Loading…
Cancel
Save