package com.kescoode.xmail.domain; import android.content.Context; import android.database.Cursor; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.NetworkType; import com.fsck.k9.mail.Transport; import com.fsck.k9.mail.store.RemoteStore; import com.fsck.k9.mail.store.StoreConfig; import com.kescoode.xmail.R; import com.kescoode.xmail.db.EmailConfigDao; import com.kescoode.xmail.db.FolderDao; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * 邮件帐户业务对象 * * @author Kesco Lin */ public class Account implements StoreConfig { private static final String INBOX = "INBOX"; private static final String OUTBOX = "K9MAIL_INTERNAL_OUTBOX"; private final Context context; private volatile long id = -1; public final String name; public final String passwd; private final EmailConfig emailConfig; private final String transportUri; private final String storeUri; private volatile Transport transport = null; private volatile RemoteStore remoteStore = null; private final LocalStore loaclStore; private final Map<NetworkType, Boolean> compressionMap; private volatile String inboxFolder; private volatile String draftFolder = null; private volatile String trashFolder = null; private volatile String spamFolder = null; private volatile String sentFolder = null; private volatile String autoExpandFolder = null; private int maximumAutoDownloadMessageSize = 32768; public Account(Context context, Cursor cursor) { this.context = context; // TODO: 目前默认所有连接方式都压缩,以后待功能稳定后,重构为可选择 compressionMap = new ConcurrentHashMap<>(); compressionMap.put(NetworkType.MOBILE, true); compressionMap.put(NetworkType.OTHER, true); compressionMap.put(NetworkType.WIFI, true); inboxFolder = INBOX; this.loaclStore = new LocalStore(context, this); /* 读取数据库 */ id = cursor.getLong(0); name = cursor.getString(1); passwd = cursor.getString(2); int configId = cursor.getInt(3); EmailConfigDao dao = new EmailConfigDao(context); emailConfig = dao.selectConfigFromDB(configId); String[] uris = emailConfig.getDefaultServerSettingUri(name, passwd); transportUri = uris[0]; storeUri = uris[1]; } public Account(Context context, String name, String passwd, EmailConfig config) { this.context = context; this.compressionMap = new ConcurrentHashMap<>(); // TODO: 目前默认所有连接方式都压缩,以后待功能稳定后,重构为可选择 this.compressionMap.put(NetworkType.MOBILE, true); this.compressionMap.put(NetworkType.OTHER, true); this.compressionMap.put(NetworkType.WIFI, true); inboxFolder = INBOX; this.loaclStore = new LocalStore(context, this); this.name = name; this.passwd = passwd; this.emailConfig = config; String[] uris = config.getDefaultServerSettingUri(name, passwd); this.transportUri = uris[0]; this.storeUri = uris[1]; } public synchronized RemoteStore getRemoteStore() { if (remoteStore == null) { try { remoteStore = (RemoteStore) RemoteStore.getInstance(context, this); } catch (MessagingException e) { throw new RuntimeException("Can not initial RemoteStore"); } } return remoteStore; } public synchronized Transport getTransport() { if (transport == null) { try { transport = Transport.getInstance(context, this); } catch (MessagingException e) { throw new RuntimeException("Can not initial Transport"); } } return transport; } public LocalStore getLocalStore() { return this.loaclStore; } public long getId() { return id; } public synchronized void setId(long id) { this.id = id; } public synchronized long getConfigId() { if (emailConfig.getId() == -1) { EmailConfigDao dao = new EmailConfigDao(context); dao.insertConfig2DB(emailConfig); } return emailConfig.getId(); } @Override public String getStoreUri() { return storeUri; } @Override public String getTransportUri() { return transportUri; } @Override public boolean subscribedFoldersOnly() { /* 从K-9源码来看,这里都为false */ return false; } @Override public boolean useCompression(NetworkType type) { Boolean useCompression = compressionMap.get(type); if (useCompression == null) { return true; } return useCompression; } @Override public String getInboxFolderName() { return inboxFolder; } @Override public String getOutboxFolderName() { return OUTBOX; } @Override public String getDraftsFolderName() { /* 目前没有实现草稿箱部分,所以置为null, 而在K9库中,有影响的只有WebDav协议 */ return draftFolder; } @Override public void setDraftsFolderName(String name) { draftFolder = name; } @Override public void setTrashFolderName(String name) { trashFolder = name; } @Override public void setSpamFolderName(String name) { spamFolder = name; } @Override public void setSentFolderName(String name) { sentFolder = name; } @Override public void setAutoExpandFolderName(String name) { autoExpandFolder = name; } @Override public synchronized void setInboxFolderName(String name) { inboxFolder = name; } @Override public int getMaximumAutoDownloadMessageSize() { return maximumAutoDownloadMessageSize; } @Override public boolean allowRemoteSearch() { return false; } @Override public boolean isRemoteSearchFullText() { return false; } @Override public boolean isPushPollOnConnect() { return true; } @Override public int getDisplayCount() { return 25; } @Override public int getIdleRefreshMinutes() { return 24; } public String getUserEmail() { return name; } public String getDisplayFolderName(String folder) { if (folder.equals(inboxFolder)) { return context.getString(R.string.inbox); } else { return null; } } public LocalFolder getFolder(String folder) { FolderDao dao = new FolderDao(context); return dao.selectFolder4Name(this, folder); } }