package com.kescoode.xmail.controller; import android.content.Context; import android.content.res.AssetManager; import android.support.annotation.NonNull; import com.kescoode.adk.log.Logger; import com.kescoode.xmail.AppConstant; import com.kescoode.xmail.db.AccountDao; import com.kescoode.xmail.domain.Account; import com.kescoode.xmail.domain.EmailConfig; import com.kescoode.xmail.tool.EmailUtil; import org.apache.commons.io.IOUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * 管理App全局邮件业务对象的开关类 * * @author Kesco Lin */ public class MailManager { private static volatile MailManager SINGLETON = null; private final Context context; private final List<Account> accounts = new CopyOnWriteArrayList<>(); /** * 获取MailManager的单例 * * @param context 必须是Application上下文 * @return Manager的单例 */ public static MailManager getSingleTon(@NonNull Context context) { if (SINGLETON == null) { synchronized (MailManager.class) { if (SINGLETON == null) { SINGLETON = new MailManager(context.getApplicationContext()); } } } return SINGLETON; } public MailManager(Context context) { this.context = context; } /** * 初始化整个邮件系统 */ public void init() { /* 创建需要的文件夹 */ File internalDir = context.getFilesDir(); Logger.d("Internal Directory: %s", internalDir.getAbsolutePath()); File contentDir = new File(internalDir, AppConstant.Email.CONTENT_PATH); File attachDir = new File(internalDir, AppConstant.Email.ATTACHMENT_PATH); if (!contentDir.exists()) { if (!contentDir.mkdir()) { throw new RuntimeException("Can make the content dir"); } } if (!attachDir.exists()) { if (!attachDir.mkdir()) { throw new RuntimeException("Can make the attachment dir"); } } } /** * 把数据库内所有的邮箱帐户拉出来 */ public void dB2Account() { accounts.clear(); AccountDao dao = new AccountDao(context); accounts.addAll(Arrays.asList(dao.selectAllAccounts())); } /** * 获取所有的邮箱帐户(内存中的) * * @return 邮箱帐户列表 */ public List<Account> getAccounts() { return accounts; } /** * 添加邮件帐户 * * @param account 邮件帐户 */ public void addAccount(Account account) { AccountDao dao = new AccountDao(context); dao.insertAccount2Db(account); accounts.add(account); } public Account getAccount(long accountId) { for (Account account : accounts) { if (account.getId() == accountId) { return account; } } throw new RuntimeException("The account object does not exist"); } /** * 获取Asset中的邮箱配置 * * @param email 用户邮箱地址 * @return 邮箱配置类 */ public EmailConfig getEmailConfig(String email) { String domain = EmailUtil.subDomain(email)[1]; AssetManager assetManager = context.getAssets(); try { JSONArray jArray = new JSONArray(IOUtils.toString(assetManager.open("mail_config.json"))); for (int i = 0; i < jArray.length(); i++) { JSONObject jObj = jArray.getJSONObject(i); if (jObj.getString("domain").equals(domain)) { return new EmailConfig(jObj); } } } catch (JSONException e) { throw new RuntimeException("Config file has error"); } catch (IOException e) { throw new RuntimeException("asset file has error or have no access to asset file"); } throw new RuntimeException("Config file has error"); } public File getContentDir() { File internalDir = context.getFilesDir(); return new File(internalDir, AppConstant.Email.CONTENT_PATH); } }