Added sort on sender

This commit is contained in:
M66B 2018-12-27 11:32:20 +00:00
parent 0ab8452495
commit 02a89260b4
11 changed files with 1341 additions and 9 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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);

View File

@ -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();
}

View File

@ -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" +

View File

@ -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;

View File

@ -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;

View File

@ -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)

View File

@ -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);
}

View File

@ -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();

View File

@ -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>

View File

@ -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>