From bd6defc0fa7c92cddbb8ab75896bbbb7c9a52d81 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 28 Jun 2021 11:31:19 +0200 Subject: [PATCH] Improved quota handling --- .../java/eu/faircode/email/AdapterAccount.java | 5 +---- .../eu/faircode/email/AdapterNavAccount.java | 9 +++------ .../java/eu/faircode/email/EntityAccount.java | 8 ++++++++ .../eu/faircode/email/FragmentFolders.java | 16 ++++++++++------ .../eu/faircode/email/ServiceSynchronize.java | 18 ++++++++++-------- 5 files changed, 32 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterAccount.java b/app/src/main/java/eu/faircode/email/AdapterAccount.java index 52cac20fe0..8669e976a4 100644 --- a/app/src/main/java/eu/faircode/email/AdapterAccount.java +++ b/app/src/main/java/eu/faircode/email/AdapterAccount.java @@ -218,10 +218,7 @@ public class AdapterAccount extends RecyclerView.Adapter QUOTA_WARNING) { + } else if (percent != null && percent > QUOTA_WARNING) { ivWarning.setEnabled(true); ivWarning.setImageResource(R.drawable.twotone_disc_full_24); ivWarning.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/eu/faircode/email/EntityAccount.java b/app/src/main/java/eu/faircode/email/EntityAccount.java index 39d206487b..bcdc326bed 100644 --- a/app/src/main/java/eu/faircode/email/EntityAccount.java +++ b/app/src/main/java/eu/faircode/email/EntityAccount.java @@ -205,6 +205,14 @@ public class EntityAccount extends EntityOrder implements Serializable { return id; } + Integer getQuotaPercentage() { + if (quota_usage == null || quota_limit == null) + return null; + + int percent = Math.round(quota_usage * 100f / quota_limit); + return (percent > 100 ? null : percent); + } + @Override String[] getSortTitle(Context context) { return new String[]{name, null}; diff --git a/app/src/main/java/eu/faircode/email/FragmentFolders.java b/app/src/main/java/eu/faircode/email/FragmentFolders.java index 6a7864417c..8009baff12 100644 --- a/app/src/main/java/eu/faircode/email/FragmentFolders.java +++ b/app/src/main/java/eu/faircode/email/FragmentFolders.java @@ -303,12 +303,16 @@ public class FragmentFolders extends FragmentBase { public void onChanged(@Nullable EntityAccount account) { imap = (account != null && account.protocol == EntityAccount.TYPE_IMAP); - if (account != null && account.quota_usage != null && account.quota_limit != null) { - int percent = Math.round(account.quota_usage * 100f / account.quota_limit); - setSubtitle(getString(R.string.title_name_count, - account.name, NF.format(percent) + "%")); - } else - setSubtitle(account == null ? null : account.name); + if (account == null) + setSubtitle(null); + else { + Integer percent = account.getQuotaPercentage(); + if (percent == null) + setSubtitle(account.name); + else + setSubtitle(getString(R.string.title_name_count, + account.name, NF.format(percent) + "%")); + } if (account != null && account.error != null) fabError.show(); diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index e5df90055c..0f3e6d3412 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -1311,7 +1311,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences db.account().setAccountMaxSize(account.id, iservice.getMaxSize()); if (istore instanceof IMAPStore) - updateQuota(((IMAPStore) iservice.getStore()), account); + updateQuota(this, ((IMAPStore) iservice.getStore()), account); // Listen for folder events iservice.getStore().addFolderListener(new FolderAdapter() { @@ -2183,22 +2183,24 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences } } - private void updateQuota(IMAPStore istore, EntityAccount account) { + private void updateQuota(Context context, IMAPStore istore, EntityAccount account) { DB db = DB.getInstance(this); try { if (istore.hasCapability("QUOTA")) { - // https://tools.ietf.org/id/draft-melnikov-extra-quota-00.html + // https://datatracker.ietf.org/doc/html/rfc2087 Quota[] quotas = istore.getQuota("INBOX"); if (quotas != null) { - long usage = 0; - long limit = 0; + Long usage = null; + Long limit = null; for (Quota quota : quotas) if (quota.resources != null) for (Quota.Resource resource : quota.resources) { - Log.i("Quota " + resource.name + " " + resource.usage + "/" + resource.limit); + EntityLog.log(context, "Quota " + resource.name + " " + resource.usage + "/" + resource.limit); if ("STORAGE".equalsIgnoreCase(resource.name)) { - usage += resource.usage * 1024; - limit = Math.max(limit, resource.limit * 1024); + if (resource.usage >= 0) + usage = (usage == null ? 0L : usage) + resource.usage * 1024; + if (resource.limit > 0) + limit = Math.max(limit == null ? 0L : limit, resource.limit * 1024); } } db.account().setAccountQuota(account.id, usage, limit);