Refactoring

pull/168/head
M66B 5 years ago
parent e7d3716084
commit 92429f8c5e

@ -1269,8 +1269,18 @@ public class ActivitySetup extends ActivityBase implements FragmentManager.OnBac
} }
private void onEditAccount(Intent intent) { private void onEditAccount(Intent intent) {
boolean pop = intent.getBooleanExtra("pop", false); int protocol = intent.getIntExtra("protocol", EntityAccount.TYPE_IMAP);
FragmentBase fragment = pop ? new FragmentPop() : new FragmentAccount(); FragmentBase fragment;
switch (protocol) {
case EntityAccount.TYPE_IMAP:
fragment = new FragmentAccount();
break;
case EntityAccount.TYPE_POP:
fragment = new FragmentPop();
break;
default:
throw new IllegalArgumentException("Unknown protocol=" + protocol);
}
fragment.setArguments(intent.getExtras()); fragment.setArguments(intent.getExtras());
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("account"); fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("account");

@ -195,7 +195,7 @@ public class AdapterAccount extends RecyclerView.Adapter<AdapterAccount.ViewHold
lbm.sendBroadcast( lbm.sendBroadcast(
new Intent(settings ? ActivitySetup.ACTION_EDIT_ACCOUNT : ActivityView.ACTION_VIEW_FOLDERS) new Intent(settings ? ActivitySetup.ACTION_EDIT_ACCOUNT : ActivityView.ACTION_VIEW_FOLDERS)
.putExtra("id", account.id) .putExtra("id", account.id)
.putExtra("pop", account.pop)); .putExtra("protocol", account.protocol));
} }
} }
@ -216,7 +216,8 @@ public class AdapterAccount extends RecyclerView.Adapter<AdapterAccount.ViewHold
popupMenu.getMenu().add(Menu.NONE, R.string.title_enabled, 1, R.string.title_enabled) popupMenu.getMenu().add(Menu.NONE, R.string.title_enabled, 1, R.string.title_enabled)
.setCheckable(true).setChecked(account.synchronize); .setCheckable(true).setChecked(account.synchronize);
if (!account.pop && account.notify && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (account.protocol == EntityAccount.TYPE_IMAP && account.notify &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String channelId = EntityAccount.getNotificationChannelId(account.id); String channelId = EntityAccount.getNotificationChannelId(account.id);
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = nm.getNotificationChannel(channelId); NotificationChannel channel = nm.getNotificationChannel(channelId);
@ -224,7 +225,7 @@ public class AdapterAccount extends RecyclerView.Adapter<AdapterAccount.ViewHold
popupMenu.getMenu().add(Menu.NONE, R.string.title_edit_channel, 2, R.string.title_edit_channel); popupMenu.getMenu().add(Menu.NONE, R.string.title_edit_channel, 2, R.string.title_edit_channel);
} }
if (!account.pop && settings) if (account.protocol == EntityAccount.TYPE_IMAP && settings)
popupMenu.getMenu().add(Menu.NONE, R.string.title_copy, 3, R.string.title_copy); popupMenu.getMenu().add(Menu.NONE, R.string.title_copy, 3, R.string.title_copy);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@ -294,6 +295,7 @@ public class AdapterAccount extends RecyclerView.Adapter<AdapterAccount.ViewHold
lbm.sendBroadcast( lbm.sendBroadcast(
new Intent(ActivitySetup.ACTION_EDIT_ACCOUNT) new Intent(ActivitySetup.ACTION_EDIT_ACCOUNT)
.putExtra("id", account.id) .putExtra("id", account.id)
.putExtra("protocol", account.protocol)
.putExtra("copy", true)); .putExtra("copy", true));
} }
}); });

@ -393,7 +393,7 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
popupMenu.getMenu().add(Menu.NONE, 0, 0, folder.getDisplayName(context)).setEnabled(false); popupMenu.getMenu().add(Menu.NONE, 0, 0, folder.getDisplayName(context)).setEnabled(false);
popupMenu.getMenu().add(Menu.NONE, R.string.title_synchronize_now, 1, R.string.title_synchronize_now); popupMenu.getMenu().add(Menu.NONE, R.string.title_synchronize_now, 1, R.string.title_synchronize_now);
if (folder.account != null && !folder.accountPop) { if (folder.account != null && folder.accountProtocol == EntityAccount.TYPE_IMAP) {
popupMenu.getMenu().add(Menu.NONE, R.string.title_synchronize_all, 2, R.string.title_synchronize_all); popupMenu.getMenu().add(Menu.NONE, R.string.title_synchronize_all, 2, R.string.title_synchronize_all);
popupMenu.getMenu().add(Menu.NONE, R.string.title_delete_local, 3, R.string.title_delete_local); popupMenu.getMenu().add(Menu.NONE, R.string.title_delete_local, 3, R.string.title_delete_local);
@ -418,7 +418,7 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
.setCheckable(true).setChecked(folder.notify); .setCheckable(true).setChecked(folder.notify);
} }
if (folder.account != null && !folder.accountPop) { if (folder.account != null && folder.accountProtocol == EntityAccount.TYPE_IMAP) {
boolean subscriptions = prefs.getBoolean("subscriptions", false); boolean subscriptions = prefs.getBoolean("subscriptions", false);
if (folder.subscribed != null && subscriptions) if (folder.subscribed != null && subscriptions)
popupMenu.getMenu().add(Menu.NONE, R.string.title_subscribe, 9, R.string.title_subscribe) popupMenu.getMenu().add(Menu.NONE, R.string.title_subscribe, 9, R.string.title_subscribe)
@ -445,7 +445,7 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
} }
} }
if (folder.account != null && !folder.accountPop) if (folder.account != null && folder.accountProtocol == EntityAccount.TYPE_IMAP)
popupMenu.getMenu().add(Menu.NONE, R.string.title_create_sub_folder, 16, R.string.title_create_sub_folder); popupMenu.getMenu().add(Menu.NONE, R.string.title_create_sub_folder, 16, R.string.title_create_sub_folder);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

@ -707,7 +707,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
view.setAlpha( view.setAlpha(
(EntityFolder.OUTBOX.equals(message.folderType) (EntityFolder.OUTBOX.equals(message.folderType)
? message.identitySynchronize == null || !message.identitySynchronize ? message.identitySynchronize == null || !message.identitySynchronize
: message.uid == null && !message.accountPop) : message.uid == null && message.accountProtocol == EntityAccount.TYPE_IMAP)
? Helper.LOW_LIGHT : 1.0f); ? Helper.LOW_LIGHT : 1.0f);
// Duplicate // Duplicate
@ -1011,7 +1011,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
ibFlagged.setImageResource(flagged > 0 ? R.drawable.baseline_star_24 : R.drawable.baseline_star_border_24); ibFlagged.setImageResource(flagged > 0 ? R.drawable.baseline_star_24 : R.drawable.baseline_star_border_24);
ibFlagged.setImageTintList(ColorStateList.valueOf(flagged > 0 ? color : textColorSecondary)); ibFlagged.setImageTintList(ColorStateList.valueOf(flagged > 0 ? color : textColorSecondary));
ibFlagged.setEnabled(message.uid != null || message.accountPop); ibFlagged.setEnabled(message.uid != null || message.accountProtocol != EntityAccount.TYPE_IMAP);
card.setCardBackgroundColor( card.setCardBackgroundColor(
flags_background && flagged > 0 && !expanded flags_background && flagged > 0 && !expanded
@ -2051,13 +2051,13 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putLong("id", message.id); args.putLong("id", message.id);
args.putBoolean("pop", message.accountPop); args.putInt("protocol", message.accountProtocol);
new SimpleTask<Void>() { new SimpleTask<Void>() {
@Override @Override
protected Void onExecute(Context context, Bundle args) { protected Void onExecute(Context context, Bundle args) {
long id = args.getLong("id"); long id = args.getLong("id");
boolean pop = args.getBoolean("pop"); int protocol = args.getInt("protocol");
DB db = DB.getInstance(context); DB db = DB.getInstance(context);
try { try {
@ -2067,7 +2067,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
if (message == null) if (message == null)
return null; return null;
if (pop) if (protocol != EntityAccount.TYPE_IMAP)
EntityOperation.queue(context, message, EntityOperation.SEEN, !message.ui_seen); EntityOperation.queue(context, message, EntityOperation.SEEN, !message.ui_seen);
else { else {
List<EntityMessage> messages = db.message().getMessagesByThread( List<EntityMessage> messages = db.message().getMessagesByThread(
@ -2230,7 +2230,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
if (account == null) if (account == null)
return null; return null;
if (account.pop) if (account.protocol != EntityAccount.TYPE_IMAP)
EntityOperation.queue(context, message, EntityOperation.FLAG, flagged); EntityOperation.queue(context, message, EntityOperation.FLAG, flagged);
else { else {
List<EntityMessage> messages = db.message().getMessagesByThread( List<EntityMessage> messages = db.message().getMessagesByThread(
@ -2949,25 +2949,25 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
popupMenu.getMenu().findItem(R.id.menu_unseen).setTitle(message.ui_seen ? R.string.title_unseen : R.string.title_seen); popupMenu.getMenu().findItem(R.id.menu_unseen).setTitle(message.ui_seen ? R.string.title_unseen : R.string.title_seen);
popupMenu.getMenu().findItem(R.id.menu_unseen).setEnabled( popupMenu.getMenu().findItem(R.id.menu_unseen).setEnabled(
(message.uid != null && !message.folderReadOnly) || message.accountPop); (message.uid != null && !message.folderReadOnly) || message.accountProtocol != EntityAccount.TYPE_IMAP);
popupMenu.getMenu().findItem(R.id.menu_hide).setTitle(message.ui_snoozed == null ? R.string.title_hide : R.string.title_unhide); popupMenu.getMenu().findItem(R.id.menu_hide).setTitle(message.ui_snoozed == null ? R.string.title_hide : R.string.title_unhide);
popupMenu.getMenu().findItem(R.id.menu_flag_color).setEnabled( popupMenu.getMenu().findItem(R.id.menu_flag_color).setEnabled(
(message.uid != null && !message.folderReadOnly) || message.accountPop); (message.uid != null && !message.folderReadOnly) || message.accountProtocol != EntityAccount.TYPE_IMAP);
popupMenu.getMenu().findItem(R.id.menu_copy).setEnabled(message.uid != null && !message.folderReadOnly); popupMenu.getMenu().findItem(R.id.menu_copy).setEnabled(message.uid != null && !message.folderReadOnly);
popupMenu.getMenu().findItem(R.id.menu_copy).setVisible(!message.accountPop); popupMenu.getMenu().findItem(R.id.menu_copy).setVisible(message.accountProtocol == EntityAccount.TYPE_IMAP);
popupMenu.getMenu().findItem(R.id.menu_delete).setVisible(!message.accountPop); popupMenu.getMenu().findItem(R.id.menu_delete).setVisible(message.accountProtocol == EntityAccount.TYPE_IMAP);
popupMenu.getMenu().findItem(R.id.menu_resync).setEnabled(message.uid != null); popupMenu.getMenu().findItem(R.id.menu_resync).setEnabled(message.uid != null);
popupMenu.getMenu().findItem(R.id.menu_resync).setVisible(!message.accountPop); popupMenu.getMenu().findItem(R.id.menu_resync).setVisible(message.accountProtocol == EntityAccount.TYPE_IMAP);
popupMenu.getMenu().findItem(R.id.menu_create_rule).setVisible(!message.accountPop); popupMenu.getMenu().findItem(R.id.menu_create_rule).setVisible(message.accountProtocol == EntityAccount.TYPE_IMAP);
popupMenu.getMenu().findItem(R.id.menu_manage_keywords).setEnabled(message.uid != null && !message.folderReadOnly); popupMenu.getMenu().findItem(R.id.menu_manage_keywords).setEnabled(message.uid != null && !message.folderReadOnly);
popupMenu.getMenu().findItem(R.id.menu_manage_keywords).setVisible(!message.accountPop); popupMenu.getMenu().findItem(R.id.menu_manage_keywords).setVisible(message.accountProtocol == EntityAccount.TYPE_IMAP);
popupMenu.getMenu().findItem(R.id.menu_junk).setEnabled(message.uid != null && !message.folderReadOnly); popupMenu.getMenu().findItem(R.id.menu_junk).setEnabled(message.uid != null && !message.folderReadOnly);
popupMenu.getMenu().findItem(R.id.menu_junk).setVisible(hasJunk && !EntityFolder.JUNK.equals(message.folderType)); popupMenu.getMenu().findItem(R.id.menu_junk).setVisible(hasJunk && !EntityFolder.JUNK.equals(message.folderType));
@ -2978,7 +2978,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
popupMenu.getMenu().findItem(R.id.menu_show_headers).setChecked(show_headers); popupMenu.getMenu().findItem(R.id.menu_show_headers).setChecked(show_headers);
popupMenu.getMenu().findItem(R.id.menu_show_headers).setEnabled(message.uid != null); popupMenu.getMenu().findItem(R.id.menu_show_headers).setEnabled(message.uid != null);
popupMenu.getMenu().findItem(R.id.menu_show_headers).setVisible(!message.accountPop); popupMenu.getMenu().findItem(R.id.menu_show_headers).setVisible(message.accountProtocol == EntityAccount.TYPE_IMAP);
popupMenu.getMenu().findItem(R.id.menu_raw_download).setEnabled( popupMenu.getMenu().findItem(R.id.menu_raw_download).setEnabled(
message.uid != null && (message.raw == null || !message.raw)); message.uid != null && (message.raw == null || !message.raw));
@ -2987,9 +2987,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
popupMenu.getMenu().findItem(R.id.menu_raw_send).setEnabled( popupMenu.getMenu().findItem(R.id.menu_raw_send).setEnabled(
message.uid != null && (message.raw != null && message.raw)); message.uid != null && (message.raw != null && message.raw));
popupMenu.getMenu().findItem(R.id.menu_raw_download).setVisible(!message.accountPop); popupMenu.getMenu().findItem(R.id.menu_raw_download).setVisible(message.accountProtocol == EntityAccount.TYPE_IMAP);
popupMenu.getMenu().findItem(R.id.menu_raw_save).setVisible(!message.accountPop); popupMenu.getMenu().findItem(R.id.menu_raw_save).setVisible(message.accountProtocol == EntityAccount.TYPE_IMAP);
popupMenu.getMenu().findItem(R.id.menu_raw_send).setVisible(!message.accountPop); popupMenu.getMenu().findItem(R.id.menu_raw_send).setVisible(message.accountProtocol == EntityAccount.TYPE_IMAP);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override @Override

@ -35,7 +35,7 @@ public interface DaoFolder {
List<EntityFolder> getFolders(long account, boolean writable, boolean selectable); List<EntityFolder> getFolders(long account, boolean writable, boolean selectable);
@Query("SELECT folder.*" + @Query("SELECT folder.*" +
", account.id AS accountId, account.pop AS accountPop, account.`order` AS accountOrder" + ", account.id AS accountId, account.pop AS accountProtocol, account.`order` AS accountOrder" +
", account.name AS accountName, account.state AS accountState" + ", account.name AS accountName, account.state AS accountState" +
", COUNT(DISTINCT CASE WHEN rule.enabled THEN rule.id ELSE NULL END) rules" + ", COUNT(DISTINCT CASE WHEN rule.enabled THEN rule.id ELSE NULL END) rules" +
", COUNT(DISTINCT CASE WHEN message.ui_hide THEN NULL ELSE message.id END) AS messages" + ", COUNT(DISTINCT CASE WHEN message.ui_hide THEN NULL ELSE message.id END) AS messages" +
@ -61,7 +61,7 @@ public interface DaoFolder {
@Query("SELECT folder.* FROM folder" + @Query("SELECT folder.* FROM folder" +
" JOIN account ON account.id = folder.account" + " JOIN account ON account.id = folder.account" +
" WHERE folder.id = :folder" + " WHERE folder.id = :folder" +
" AND (:search OR (account.synchronize AND account.browse AND NOT account.pop))") " AND (:search OR (account.synchronize AND account.browse AND account.pop = " + EntityAccount.TYPE_IMAP + "))")
EntityFolder getBrowsableFolder(long folder, boolean search); EntityFolder getBrowsableFolder(long folder, boolean search);
@Query("SELECT folder.*" + @Query("SELECT folder.*" +
@ -72,7 +72,7 @@ public interface DaoFolder {
List<TupleFolderSort> getSortedFolders(); List<TupleFolderSort> getSortedFolders();
@Query("SELECT folder.*" + @Query("SELECT folder.*" +
", account.id AS accountId, account.pop AS accountPop, account.`order` AS accountOrder" + ", account.id AS accountId, account.pop AS accountProtocol, account.`order` AS accountOrder" +
", account.name AS accountName, account.state AS accountState" + ", account.name AS accountName, account.state AS accountState" +
", COUNT(DISTINCT CASE WHEN rule.enabled THEN rule.id ELSE NULL END) rules" + ", COUNT(DISTINCT CASE WHEN rule.enabled THEN rule.id ELSE NULL END) rules" +
", COUNT(DISTINCT CASE WHEN message.ui_hide THEN NULL ELSE message.id END) AS messages" + ", COUNT(DISTINCT CASE WHEN message.ui_hide THEN NULL ELSE message.id END) AS messages" +
@ -92,7 +92,7 @@ public interface DaoFolder {
LiveData<List<TupleFolderEx>> liveFolders(Long account); LiveData<List<TupleFolderEx>> liveFolders(Long account);
@Query("SELECT folder.*" + @Query("SELECT folder.*" +
", account.id AS accountId, account.pop AS accountPop, account.`order` AS accountOrder" + ", account.id AS accountId, account.pop AS accountProtocol, account.`order` AS accountOrder" +
", account.name AS accountName, account.state AS accountState" + ", account.name AS accountName, account.state AS accountState" +
", COUNT(DISTINCT CASE WHEN rule.enabled THEN rule.id ELSE NULL END) rules" + ", COUNT(DISTINCT CASE WHEN rule.enabled THEN rule.id ELSE NULL END) rules" +
", COUNT(DISTINCT CASE WHEN message.ui_hide THEN NULL ELSE message.id END) AS messages" + ", COUNT(DISTINCT CASE WHEN message.ui_hide THEN NULL ELSE message.id END) AS messages" +
@ -130,7 +130,7 @@ public interface DaoFolder {
LiveData<Integer> liveSynchronizing(); LiveData<Integer> liveSynchronizing();
@Query("SELECT folder.*" + @Query("SELECT folder.*" +
", account.id AS accountId, account.pop AS accountPop, account.`order` AS accountOrder" + ", account.id AS accountId, account.pop AS accountProtocol, account.`order` AS accountOrder" +
", account.name AS accountName, account.state AS accountState" + ", account.name AS accountName, account.state AS accountState" +
", COUNT(DISTINCT CASE WHEN rule.enabled THEN rule.id ELSE NULL END) rules" + ", COUNT(DISTINCT CASE WHEN rule.enabled THEN rule.id ELSE NULL END) rules" +
", COUNT(DISTINCT CASE WHEN message.ui_hide THEN NULL ELSE message.id END) AS messages" + ", COUNT(DISTINCT CASE WHEN message.ui_hide THEN NULL ELSE message.id END) AS messages" +

@ -42,7 +42,7 @@ public interface DaoMessage {
String is_outbox = "folder.type = '" + EntityFolder.OUTBOX + "'"; String is_outbox = "folder.type = '" + EntityFolder.OUTBOX + "'";
@Query("SELECT message.*" + @Query("SELECT message.*" +
", account.pop AS accountPop, account.name AS accountName, COALESCE(identity.color, folder.color, account.color) AS accountColor" + ", account.pop AS accountProtocol, account.name AS accountName, COALESCE(identity.color, folder.color, account.color) AS accountColor" +
", account.notify AS accountNotify, account.auto_seen AS accountAutoSeen" + ", account.notify AS accountNotify, account.auto_seen AS accountAutoSeen" +
", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" + ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" +
", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" + ", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" +
@ -92,7 +92,7 @@ public interface DaoMessage {
boolean debug); boolean debug);
@Query("SELECT message.*" + @Query("SELECT message.*" +
", account.pop AS accountPop, account.name AS accountName, COALESCE(identity.color, folder.color, account.color) AS accountColor" + ", account.pop AS accountProtocol, account.name AS accountName, COALESCE(identity.color, folder.color, account.color) AS accountColor" +
", account.notify AS accountNotify, account.auto_seen AS accountAutoSeen" + ", account.notify AS accountNotify, account.auto_seen AS accountAutoSeen" +
", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" + ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" +
", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" + ", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" +
@ -136,7 +136,7 @@ public interface DaoMessage {
boolean debug); boolean debug);
@Query("SELECT message.*" + @Query("SELECT message.*" +
", account.pop AS accountPop, account.name AS accountName, COALESCE(identity.color, folder.color, account.color) AS accountColor" + ", account.pop AS accountProtocol, account.name AS accountName, COALESCE(identity.color, folder.color, account.color) AS accountColor" +
", account.notify AS accountNotify, account.auto_seen AS accountAutoSeen" + ", account.notify AS accountNotify, account.auto_seen AS accountAutoSeen" +
", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" + ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" +
", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" + ", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" +
@ -255,7 +255,7 @@ public interface DaoMessage {
" AND thread = :thread" + " AND thread = :thread" +
" AND (:id IS NULL OR message.id = :id)" + " AND (:id IS NULL OR message.id = :id)" +
" AND (:folder IS NULL OR message.folder = :folder)" + " AND (:folder IS NULL OR message.folder = :folder)" +
" AND (NOT uid IS NULL OR account.pop)" + " AND (NOT uid IS NULL OR account.pop <> " + EntityAccount.TYPE_IMAP + ")" +
" AND NOT ui_hide") " AND NOT ui_hide")
List<EntityMessage> getMessagesByThread(long account, String thread, Long id, Long folder); List<EntityMessage> getMessagesByThread(long account, String thread, Long id, Long folder);
@ -275,7 +275,7 @@ public interface DaoMessage {
int countMessageByMsgId(long folder, String msgid); int countMessageByMsgId(long folder, String msgid);
@Query("SELECT message.*" + @Query("SELECT message.*" +
", account.pop AS accountPop, account.name AS accountName, identity.color AS accountColor" + ", account.pop AS accountProtocol, account.name AS accountName, identity.color AS accountColor" +
", account.notify AS accountNotify, account.auto_seen AS accountAutoSeen" + ", account.notify AS accountNotify, account.auto_seen AS accountAutoSeen" +
", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" + ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" +
", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" + ", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" +
@ -309,7 +309,7 @@ public interface DaoMessage {
TupleMessageStats getUnseenWidget(); TupleMessageStats getUnseenWidget();
@Query("SELECT message.*" + @Query("SELECT message.*" +
", account.pop AS accountPop, account.name AS accountName, COALESCE(identity.color, folder.color, account.color) AS accountColor" + ", account.pop AS accountProtocol, account.name AS accountName, COALESCE(identity.color, folder.color, account.color) AS accountColor" +
", account.notify AS accountNotify, account.auto_seen AS accountAutoSeen" + ", account.notify AS accountNotify, account.auto_seen AS accountAutoSeen" +
", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" + ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" +
", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" + ", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" +

@ -28,6 +28,7 @@ import android.os.Build;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import androidx.room.ColumnInfo;
import androidx.room.Entity; import androidx.room.Entity;
import androidx.room.PrimaryKey; import androidx.room.PrimaryKey;
@ -52,11 +53,15 @@ public class EntityAccount extends EntityOrder implements Serializable {
static final int DEFAULT_KEEP_ALIVE_INTERVAL = 24; // minutes static final int DEFAULT_KEEP_ALIVE_INTERVAL = 24; // minutes
static final int DEFAULT_POLL_INTERVAL = 12; // minutes static final int DEFAULT_POLL_INTERVAL = 12; // minutes
static final int TYPE_IMAP = 0;
static final int TYPE_POP = 1;
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
public Long id; public Long id;
@NonNull @NonNull
public Boolean pop = false; @ColumnInfo(name = "pop")
public Integer protocol = TYPE_IMAP;
@NonNull @NonNull
public String host; // POP3/IMAP public String host; // POP3/IMAP
@NonNull @NonNull
@ -109,7 +114,14 @@ public class EntityAccount extends EntityOrder implements Serializable {
public Long last_connected; public Long last_connected;
String getProtocol() { String getProtocol() {
return (pop ? "pop3" : "imap") + (starttls ? "" : "s"); switch (protocol) {
case TYPE_IMAP:
return "imap" + (starttls ? "" : "s");
case TYPE_POP:
return "pop3" + (starttls ? "" : "s");
default:
throw new IllegalArgumentException("Unknown protocol=" + protocol);
}
} }
static String getNotificationChannelId(long id) { static String getNotificationChannelId(long id) {
@ -157,7 +169,7 @@ public class EntityAccount extends EntityOrder implements Serializable {
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
json.put("id", id); json.put("id", id);
json.put("order", order); json.put("order", order);
json.put("pop", pop); json.put("protocol", protocol);
json.put("host", host); json.put("host", host);
json.put("starttls", starttls); json.put("starttls", starttls);
json.put("insecure", insecure); json.put("insecure", insecure);
@ -203,8 +215,10 @@ public class EntityAccount extends EntityOrder implements Serializable {
if (json.has("order")) if (json.has("order"))
account.order = json.getInt("order"); account.order = json.getInt("order");
if (json.has("pop")) if (json.has("protocol"))
account.pop = json.getBoolean("pop"); account.protocol = json.getInt("protocol");
else if (json.has("pop"))
account.protocol = (json.getBoolean("pop") ? TYPE_POP : TYPE_IMAP);
account.host = json.getString("host"); account.host = json.getString("host");
account.starttls = (json.has("starttls") && json.getBoolean("starttls")); account.starttls = (json.has("starttls") && json.getBoolean("starttls"));
@ -251,7 +265,7 @@ public class EntityAccount extends EntityOrder implements Serializable {
if (obj instanceof EntityAccount) { if (obj instanceof EntityAccount) {
EntityAccount other = (EntityAccount) obj; EntityAccount other = (EntityAccount) obj;
return (Objects.equals(this.order, other.order) && return (Objects.equals(this.order, other.order) &&
this.pop == other.pop && this.protocol.equals(other.protocol) &&
this.host.equals(other.host) && this.host.equals(other.host) &&
this.starttls == other.starttls && this.starttls == other.starttls &&
this.insecure == other.insecure && this.insecure == other.insecure &&

@ -279,7 +279,7 @@ public class FragmentFolders extends FragmentBase {
else else
fabError.hide(); fabError.hide();
if (account == null || account.pop) if (account == null || account.protocol != EntityAccount.TYPE_IMAP)
fab.hide(); fab.hide();
else else
fab.show(); fab.show();

@ -831,11 +831,11 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
if (aid < 0) { if (aid < 0) {
List<EntityAccount> accounts = db.account().getSynchronizingAccounts(); List<EntityAccount> accounts = db.account().getSynchronizingAccounts();
for (EntityAccount account : accounts) for (EntityAccount account : accounts)
if (!account.pop) if (account.protocol == EntityAccount.TYPE_IMAP)
result.add(account); result.add(account);
} else { } else {
EntityAccount account = db.account().getAccount(aid); EntityAccount account = db.account().getAccount(aid);
if (account != null && !account.pop) if (account != null && account.protocol == EntityAccount.TYPE_IMAP)
result.add(account); result.add(account);
} }
@ -1381,7 +1381,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
if (EntityFolder.OUTBOX.equals(message.folderType)) if (EntityFolder.OUTBOX.equals(message.folderType))
return 0; return 0;
if (message.accountPop) if (message.accountProtocol != EntityAccount.TYPE_IMAP)
return makeMovementFlags(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT); return makeMovementFlags(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
TupleAccountSwipes swipes = accountSwipes.get(message.account); TupleAccountSwipes swipes = accountSwipes.get(message.account);
@ -1434,7 +1434,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
return; return;
TupleAccountSwipes swipes; TupleAccountSwipes swipes;
if (message.accountPop) { if (message.accountProtocol != EntityAccount.TYPE_IMAP) {
swipes = new TupleAccountSwipes(); swipes = new TupleAccountSwipes();
swipes.swipe_right = FragmentAccount.SWIPE_ACTION_SEEN; swipes.swipe_right = FragmentAccount.SWIPE_ACTION_SEEN;
swipes.swipe_left = 0L; swipes.swipe_left = 0L;
@ -1517,7 +1517,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
return; return;
} }
if (message.accountPop) if (message.accountProtocol != EntityAccount.TYPE_IMAP)
if (direction == ItemTouchHelper.LEFT) { if (direction == ItemTouchHelper.LEFT) {
adapter.notifyItemChanged(pos); adapter.notifyItemChanged(pos);
onSwipeDelete(message); onSwipeDelete(message);
@ -1568,7 +1568,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
return null; return null;
TupleMessageEx message = list.get(pos); TupleMessageEx message = list.get(pos);
if (message == null || (message.uid == null && !message.accountPop)) if (message == null ||
(message.uid == null && message.accountProtocol == EntityAccount.TYPE_IMAP))
return null; return null;
if (iProperties.getValue("expanded", message.id)) if (iProperties.getValue("expanded", message.id))
@ -1791,7 +1792,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
EntityAccount account = db.account().getAccount(message.account); EntityAccount account = db.account().getAccount(message.account);
if (account == null) if (account == null)
continue; continue;
if (account.pop) if (account.protocol != EntityAccount.TYPE_IMAP)
pop = true; pop = true;
if (!result.folders.contains(message.folder)) if (!result.folders.contains(message.folder))
@ -1820,7 +1821,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
EntityFolder folder = db.folder().getFolder(message.folder); EntityFolder folder = db.folder().getFolder(message.folder);
boolean isArchive = EntityFolder.ARCHIVE.equals(folder.type); boolean isArchive = EntityFolder.ARCHIVE.equals(folder.type);
boolean isTrash = (EntityFolder.TRASH.equals(folder.type) || account.pop); boolean isTrash = (EntityFolder.TRASH.equals(folder.type) || account.protocol != EntityAccount.TYPE_IMAP);
boolean isJunk = EntityFolder.JUNK.equals(folder.type); boolean isJunk = EntityFolder.JUNK.equals(folder.type);
boolean isDrafts = EntityFolder.DRAFTS.equals(folder.type); boolean isDrafts = EntityFolder.DRAFTS.equals(folder.type);
@ -1850,7 +1851,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
result.accounts = new ArrayList<>(); result.accounts = new ArrayList<>();
if (!pop) if (!pop)
for (EntityAccount account : db.account().getSynchronizingAccounts()) for (EntityAccount account : db.account().getSynchronizingAccounts())
if (!account.pop) if (account.protocol == EntityAccount.TYPE_IMAP)
result.accounts.add(account); result.accounts.add(account);
return result; return result;
@ -2186,7 +2187,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
List<EntityMessage> messages = db.message().getMessagesByThread( List<EntityMessage> messages = db.message().getMessagesByThread(
message.account, message.thread, threading ? null : id, message.folder); message.account, message.thread, threading ? null : id, message.folder);
for (EntityMessage threaded : messages) for (EntityMessage threaded : messages)
if (message.uid != null || account.pop) if (message.uid != null || account.protocol != EntityAccount.TYPE_IMAP)
ids.add(threaded.id); ids.add(threaded.id);
} }
@ -3306,7 +3307,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
if (expand != null && if (expand != null &&
(expand.content || unmetered || (expand.size != null && expand.size < download))) { (expand.content || unmetered || (expand.size != null && expand.size < download))) {
// Prevent flicker // Prevent flicker
if (expand.accountPop || if (expand.accountProtocol != EntityAccount.TYPE_IMAP ||
(expand.accountAutoSeen && !expand.ui_seen && !expand.folderReadOnly)) { (expand.accountAutoSeen && !expand.ui_seen && !expand.folderReadOnly)) {
expand.unseen = 0; expand.unseen = 0;
expand.ui_seen = true; expand.ui_seen = true;
@ -3461,7 +3462,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
if (account == null) if (account == null)
return null; return null;
if (account.pop) { if (account.protocol != EntityAccount.TYPE_IMAP) {
if (!message.ui_seen) if (!message.ui_seen)
EntityOperation.queue(context, message, EntityOperation.SEEN, true); EntityOperation.queue(context, message, EntityOperation.SEEN, true);
} else { } else {
@ -4315,7 +4316,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancel("send:" + message.identity, 1); nm.cancel("send:" + message.identity, 1);
} }
} else if (message.uid == null && !account.pop) { } else if (message.uid == null && account.protocol == EntityAccount.TYPE_IMAP) {
db.message().deleteMessage(id); db.message().deleteMessage(id);
db.folder().setFolderError(message.folder, null); db.folder().setFolderError(message.folder, null);
} else } else

@ -290,7 +290,7 @@ public class FragmentPop extends FragmentBase {
if (account == null) if (account == null)
account = new EntityAccount(); account = new EntityAccount();
account.pop = true; account.protocol = EntityAccount.TYPE_POP;
account.host = host; account.host = host;
account.starttls = starttls; account.starttls = starttls;
account.insecure = insecure; account.insecure = insecure;

@ -41,7 +41,7 @@ public class FragmentReview extends FragmentDialogBase {
lbm.sendBroadcast( lbm.sendBroadcast(
new Intent(ActivitySetup.ACTION_EDIT_ACCOUNT) new Intent(ActivitySetup.ACTION_EDIT_ACCOUNT)
.putExtra("id", account) .putExtra("id", account)
.putExtra("pop", false)); .putExtra("protocol", EntityAccount.TYPE_IMAP));
dismiss(); dismiss();
} }
}); });

@ -46,7 +46,7 @@ public class SelectionPredicateMessage extends SelectionTracker.SelectionPredica
if (message == null) // happens when restoring state if (message == null) // happens when restoring state
return true; return true;
if (message.accountPop) if (message.accountProtocol != EntityAccount.TYPE_IMAP)
return true; return true;
if (message.uid != null && !message.folderReadOnly) if (message.uid != null && !message.folderReadOnly)
@ -65,7 +65,7 @@ public class SelectionPredicateMessage extends SelectionTracker.SelectionPredica
if (message == null) // happens when restoring state if (message == null) // happens when restoring state
return true; return true;
if (message.accountPop) if (message.accountProtocol != EntityAccount.TYPE_IMAP)
return true; return true;
if (message.uid != null && !message.folderReadOnly) if (message.uid != null && !message.folderReadOnly)

@ -705,7 +705,7 @@ public class ServiceSynchronize extends ServiceBase {
this, account.getProtocol(), account.realm, account.insecure, false, debug); this, account.getProtocol(), account.realm, account.insecure, false, debug);
iservice.setPartialFetch(account.partial_fetch); iservice.setPartialFetch(account.partial_fetch);
iservice.setIgnoreBodyStructureSize(account.ignore_size); iservice.setIgnoreBodyStructureSize(account.ignore_size);
if (account.pop) if (account.protocol != EntityAccount.TYPE_IMAP)
iservice.setLeaveOnServer(account.browse); iservice.setLeaveOnServer(account.browse);
final Map<EntityFolder, IMAPFolder> mapFolders = new HashMap<>(); final Map<EntityFolder, IMAPFolder> mapFolders = new HashMap<>();
@ -840,7 +840,7 @@ public class ServiceSynchronize extends ServiceBase {
}); });
// Update folder list // Update folder list
if (!account.pop) if (account.protocol == EntityAccount.TYPE_IMAP)
Core.onSynchronizeFolders(this, account, iservice.getStore(), state); Core.onSynchronizeFolders(this, account, iservice.getStore(), state);
// Open synchronizing folders // Open synchronizing folders
@ -1047,7 +1047,7 @@ public class ServiceSynchronize extends ServiceBase {
// Get folder // Get folder
Folder ifolder = mapFolders.get(folder); // null when polling Folder ifolder = mapFolders.get(folder); // null when polling
boolean canOpen = (!account.pop || EntityFolder.INBOX.equals(folder.type)); boolean canOpen = (account.protocol == EntityAccount.TYPE_IMAP || EntityFolder.INBOX.equals(folder.type));
final boolean shouldClose = (ifolder == null && canOpen); final boolean shouldClose = (ifolder == null && canOpen);
try { try {

@ -38,7 +38,7 @@ import java.util.Objects;
public class TupleFolderEx extends EntityFolder implements Serializable { public class TupleFolderEx extends EntityFolder implements Serializable {
public Long accountId; public Long accountId;
public Boolean accountPop; public Integer accountProtocol;
public Integer accountOrder; public Integer accountOrder;
public String accountName; public String accountName;
public String accountState; public String accountState;
@ -66,7 +66,7 @@ public class TupleFolderEx extends EntityFolder implements Serializable {
TupleFolderEx other = (TupleFolderEx) obj; TupleFolderEx other = (TupleFolderEx) obj;
return (super.equals(obj) && return (super.equals(obj) &&
Objects.equals(this.accountId, other.accountId) && Objects.equals(this.accountId, other.accountId) &&
Objects.equals(this.accountPop, other.accountPop) && Objects.equals(this.accountProtocol, other.accountProtocol) &&
Objects.equals(this.accountName, other.accountName) && Objects.equals(this.accountName, other.accountName) &&
Objects.equals(this.accountState, other.accountState) && Objects.equals(this.accountState, other.accountState) &&
this.rules == other.rules && this.rules == other.rules &&

@ -28,7 +28,7 @@ import java.util.Objects;
import javax.mail.Address; import javax.mail.Address;
public class TupleMessageEx extends EntityMessage { public class TupleMessageEx extends EntityMessage {
public boolean accountPop; public Integer accountProtocol;
public String accountName; public String accountName;
public Integer accountColor; public Integer accountColor;
public boolean accountNotify; public boolean accountNotify;
@ -63,7 +63,7 @@ public class TupleMessageEx extends EntityMessage {
if (obj instanceof TupleMessageEx) { if (obj instanceof TupleMessageEx) {
TupleMessageEx other = (TupleMessageEx) obj; TupleMessageEx other = (TupleMessageEx) obj;
return (super.equals(obj) && return (super.equals(obj) &&
this.accountPop == other.accountPop && this.accountProtocol.equals(other.accountProtocol) &&
Objects.equals(this.accountName, other.accountName) && Objects.equals(this.accountName, other.accountName) &&
Objects.equals(this.accountColor, other.accountColor) && Objects.equals(this.accountColor, other.accountColor) &&
this.accountNotify == other.accountNotify && this.accountNotify == other.accountNotify &&

@ -277,7 +277,8 @@ public class ViewModelMessages extends ViewModel {
int count = ds.countItems(); int count = ds.countItems();
for (int i = 0; i < count; i += 100) for (int i = 0; i < count; i += 100)
for (TupleMessageEx message : ds.loadRange(i, Math.min(100, count - i))) for (TupleMessageEx message : ds.loadRange(i, Math.min(100, count - i)))
if ((message.uid != null && !message.folderReadOnly) || message.accountPop) if ((message.uid != null && !message.folderReadOnly) ||
message.accountProtocol != EntityAccount.TYPE_IMAP)
ids.add(message.id); ids.add(message.id);
Log.i("Loaded messages #" + ids.size()); Log.i("Loaded messages #" + ids.size());

Loading…
Cancel
Save