mirror of https://github.com/M66B/FairEmail.git
Added advanced account option for summary only notifications
This commit is contained in:
parent
18dc1b6f93
commit
9d716427ba
|
@ -6,6 +6,10 @@ For support you can use [the contact form](https://contact.faircode.eu/?product=
|
||||||
|
|
||||||
### [Saltopus](https://en.wikipedia.org/wiki/Saltopus)
|
### [Saltopus](https://en.wikipedia.org/wiki/Saltopus)
|
||||||
|
|
||||||
|
### Next version
|
||||||
|
|
||||||
|
* Added advanced account option for summary only notifications
|
||||||
|
|
||||||
### 1.2061 - 2023-04-10
|
### 1.2061 - 2023-04-10
|
||||||
|
|
||||||
* Added filter rule groups (stop processing per group)
|
* Added filter rule groups (stop processing per group)
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -6,6 +6,10 @@ For support you can use [the contact form](https://contact.faircode.eu/?product=
|
||||||
|
|
||||||
### [Saltopus](https://en.wikipedia.org/wiki/Saltopus)
|
### [Saltopus](https://en.wikipedia.org/wiki/Saltopus)
|
||||||
|
|
||||||
|
### Next version
|
||||||
|
|
||||||
|
* Added advanced account option for summary only notifications
|
||||||
|
|
||||||
### 1.2061 - 2023-04-10
|
### 1.2061 - 2023-04-10
|
||||||
|
|
||||||
* Added filter rule groups (stop processing per group)
|
* Added filter rule groups (stop processing per group)
|
||||||
|
|
|
@ -7978,6 +7978,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
||||||
log("accountColor changed", next.id);
|
log("accountColor changed", next.id);
|
||||||
}
|
}
|
||||||
// accountNotify
|
// accountNotify
|
||||||
|
// accountSummary
|
||||||
// accountAutoSeen
|
// accountAutoSeen
|
||||||
if (!prev.folderName.equals(next.folderName)) {
|
if (!prev.folderName.equals(next.folderName)) {
|
||||||
same = false;
|
same = false;
|
||||||
|
|
|
@ -5331,10 +5331,15 @@ class Core {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean summary = (notify_summary ||
|
||||||
|
(group != 0 &&
|
||||||
|
groupMessages.get(group).size() > 0 &&
|
||||||
|
groupMessages.get(group).get(0).accountSummary));
|
||||||
|
|
||||||
// Build notifications
|
// Build notifications
|
||||||
List<NotificationCompat.Builder> notifications = getNotificationUnseen(context,
|
List<NotificationCompat.Builder> notifications = getNotificationUnseen(context,
|
||||||
group, groupMessages.get(group),
|
group, groupMessages.get(group),
|
||||||
notify_summary, current - prev, current,
|
summary, current - prev, current,
|
||||||
redacted);
|
redacted);
|
||||||
|
|
||||||
Log.i("Notify group=" + group +
|
Log.i("Notify group=" + group +
|
||||||
|
@ -5373,7 +5378,7 @@ class Core {
|
||||||
if ((id == 0 && !prev.equals(current)) || add.contains(id)) {
|
if ((id == 0 && !prev.equals(current)) || add.contains(id)) {
|
||||||
// https://developer.android.com/training/wearables/notifications/bridger#non-bridged
|
// https://developer.android.com/training/wearables/notifications/bridger#non-bridged
|
||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
if (!notify_summary)
|
if (!summary)
|
||||||
builder.setLocalOnly(true);
|
builder.setLocalOnly(true);
|
||||||
} else {
|
} else {
|
||||||
if (wearable_preview ? id < 0 : update.contains(id))
|
if (wearable_preview ? id < 0 : update.contains(id))
|
||||||
|
@ -5537,6 +5542,9 @@ class Core {
|
||||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||||
.setAllowSystemGeneratedContextualActions(false);
|
.setAllowSystemGeneratedContextualActions(false);
|
||||||
|
|
||||||
|
if (group != 0 && messages.size() > 0)
|
||||||
|
builder.setSubText(messages.get(0).accountName);
|
||||||
|
|
||||||
if (notify_summary) {
|
if (notify_summary) {
|
||||||
builder.setOnlyAlertOnce(new_messages <= 0);
|
builder.setOnlyAlertOnce(new_messages <= 0);
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ import javax.mail.internet.InternetAddress;
|
||||||
// https://developer.android.com/topic/libraries/architecture/room.html
|
// https://developer.android.com/topic/libraries/architecture/room.html
|
||||||
|
|
||||||
@Database(
|
@Database(
|
||||||
version = 278,
|
version = 279,
|
||||||
entities = {
|
entities = {
|
||||||
EntityIdentity.class,
|
EntityIdentity.class,
|
||||||
EntityAccount.class,
|
EntityAccount.class,
|
||||||
|
@ -2297,8 +2297,8 @@ public abstract class DB extends RoomDatabase {
|
||||||
logMigration(startVersion, endVersion);
|
logMigration(startVersion, endVersion);
|
||||||
db.execSQL("CREATE INDEX `index_account_synchronize` ON `account` (`synchronize`)");
|
db.execSQL("CREATE INDEX `index_account_synchronize` ON `account` (`synchronize`)");
|
||||||
db.execSQL("CREATE INDEX `index_account_category` ON `account` (`category`)");
|
db.execSQL("CREATE INDEX `index_account_category` ON `account` (`category`)");
|
||||||
db.execSQL("DROP VIEW IF EXISTS `account_view`");
|
//db.execSQL("DROP VIEW IF EXISTS `account_view`");
|
||||||
db.execSQL("CREATE VIEW IF NOT EXISTS `account_view` AS " + TupleAccountView.query);
|
//db.execSQL("CREATE VIEW IF NOT EXISTS `account_view` AS " + TupleAccountView.query);
|
||||||
}
|
}
|
||||||
}).addMigrations(new Migration(214, 215) {
|
}).addMigrations(new Migration(214, 215) {
|
||||||
@Override
|
@Override
|
||||||
|
@ -2805,6 +2805,14 @@ public abstract class DB extends RoomDatabase {
|
||||||
logMigration(startVersion, endVersion);
|
logMigration(startVersion, endVersion);
|
||||||
db.execSQL("ALTER TABLE `rule` ADD COLUMN `group` TEXT");
|
db.execSQL("ALTER TABLE `rule` ADD COLUMN `group` TEXT");
|
||||||
}
|
}
|
||||||
|
}).addMigrations(new Migration(278, 279) {
|
||||||
|
@Override
|
||||||
|
public void migrate(@NonNull SupportSQLiteDatabase db) {
|
||||||
|
logMigration(startVersion, endVersion);
|
||||||
|
db.execSQL("ALTER TABLE `account` ADD COLUMN `summary` INTEGER NOT NULL DEFAULT 0");
|
||||||
|
db.execSQL("DROP VIEW IF EXISTS `account_view`");
|
||||||
|
db.execSQL("CREATE VIEW IF NOT EXISTS `account_view` AS " + TupleAccountView.query);
|
||||||
|
}
|
||||||
}).addMigrations(new Migration(998, 999) {
|
}).addMigrations(new Migration(998, 999) {
|
||||||
@Override
|
@Override
|
||||||
public void migrate(@NonNull SupportSQLiteDatabase db) {
|
public void migrate(@NonNull SupportSQLiteDatabase db) {
|
||||||
|
|
|
@ -48,7 +48,7 @@ public interface DaoMessage {
|
||||||
@SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
|
@SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
|
||||||
@Query("SELECT message.*" +
|
@Query("SELECT message.*" +
|
||||||
", account.pop AS accountProtocol, account.name AS accountName, account.category AS accountCategory, COALESCE(identity.color, folder.color, account.color) AS accountColor" +
|
", account.pop AS accountProtocol, account.name AS accountName, account.category AS accountCategory, COALESCE(identity.color, folder.color, account.color) AS accountColor" +
|
||||||
", account.notify AS accountNotify, account.leave_deleted AS accountLeaveDeleted, account.auto_seen AS accountAutoSeen" +
|
", account.notify AS accountNotify, account.summary AS accountSummary, account.leave_deleted AS accountLeaveDeleted, account.auto_seen AS accountAutoSeen" +
|
||||||
", folder.name AS folderName, folder.color AS folderColor, folder.display AS folderDisplay, folder.type AS folderType, NULL AS folderInheritedType, folder.unified AS folderUnified, folder.read_only AS folderReadOnly" +
|
", folder.name AS folderName, folder.color AS folderColor, folder.display AS folderDisplay, folder.type AS folderType, NULL AS folderInheritedType, folder.unified AS folderUnified, folder.read_only AS folderReadOnly" +
|
||||||
", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" +
|
", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" +
|
||||||
", '[' || group_concat(message.`from`, ',') || ']' AS senders" +
|
", '[' || group_concat(message.`from`, ',') || ']' AS senders" +
|
||||||
|
@ -127,7 +127,7 @@ public interface DaoMessage {
|
||||||
@SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
|
@SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
|
||||||
@Query("SELECT message.*" +
|
@Query("SELECT message.*" +
|
||||||
", account.pop AS accountProtocol, account.name AS accountName, account.category AS accountCategory, COALESCE(identity.color, folder.color, account.color) AS accountColor" +
|
", account.pop AS accountProtocol, account.name AS accountName, account.category AS accountCategory, COALESCE(identity.color, folder.color, account.color) AS accountColor" +
|
||||||
", account.notify AS accountNotify, account.leave_deleted AS accountLeaveDeleted, account.auto_seen AS accountAutoSeen" +
|
", account.notify AS accountNotify, account.summary AS accountSummary, account.leave_deleted AS accountLeaveDeleted, account.auto_seen AS accountAutoSeen" +
|
||||||
", folder.name AS folderName, folder.color AS folderColor, folder.display AS folderDisplay, folder.type AS folderType, f.inherited_type AS folderInheritedType, folder.unified AS folderUnified, folder.read_only AS folderReadOnly" +
|
", folder.name AS folderName, folder.color AS folderColor, folder.display AS folderDisplay, folder.type AS folderType, f.inherited_type AS folderInheritedType, folder.unified AS folderUnified, folder.read_only AS folderReadOnly" +
|
||||||
", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" +
|
", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" +
|
||||||
", '[' || group_concat(message.`from`, ',') || ']' AS senders" +
|
", '[' || group_concat(message.`from`, ',') || ']' AS senders" +
|
||||||
|
@ -199,7 +199,7 @@ public interface DaoMessage {
|
||||||
@Transaction
|
@Transaction
|
||||||
@Query("SELECT message.*" +
|
@Query("SELECT message.*" +
|
||||||
", account.pop AS accountProtocol, account.name AS accountName, account.category AS accountCategory, COALESCE(identity.color, folder.color, account.color) AS accountColor" +
|
", account.pop AS accountProtocol, account.name AS accountName, account.category AS accountCategory, COALESCE(identity.color, folder.color, account.color) AS accountColor" +
|
||||||
", account.notify AS accountNotify, account.leave_deleted AS accountLeaveDeleted, account.auto_seen AS accountAutoSeen" +
|
", account.notify AS accountNotify, account.summary AS accountSummary, account.leave_deleted AS accountLeaveDeleted, account.auto_seen AS accountAutoSeen" +
|
||||||
", folder.name AS folderName, folder.color AS folderColor, folder.display AS folderDisplay, folder.type AS folderType, NULL AS folderInheritedType, folder.unified AS folderUnified, folder.read_only AS folderReadOnly" +
|
", folder.name AS folderName, folder.color AS folderColor, folder.display AS folderDisplay, folder.type AS folderType, NULL AS folderInheritedType, folder.unified AS folderUnified, folder.read_only AS folderReadOnly" +
|
||||||
", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" +
|
", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" +
|
||||||
", message.`from` AS senders" +
|
", message.`from` AS senders" +
|
||||||
|
@ -505,7 +505,7 @@ public interface DaoMessage {
|
||||||
|
|
||||||
@Query("SELECT message.*" +
|
@Query("SELECT message.*" +
|
||||||
", account.pop AS accountProtocol, account.name AS accountName, account.category AS accountCategory, identity.color AS accountColor" +
|
", account.pop AS accountProtocol, account.name AS accountName, account.category AS accountCategory, identity.color AS accountColor" +
|
||||||
", account.notify AS accountNotify, account.leave_deleted AS accountLeaveDeleted, account.auto_seen AS accountAutoSeen" +
|
", account.notify AS accountNotify, account.summary AS accountSummary, account.leave_deleted AS accountLeaveDeleted, account.auto_seen AS accountAutoSeen" +
|
||||||
", folder.name AS folderName, folder.color AS folderColor, folder.display AS folderDisplay, folder.type AS folderType, NULL AS folderInheritedType, folder.unified AS folderUnified, folder.read_only AS folderReadOnly" +
|
", folder.name AS folderName, folder.color AS folderColor, folder.display AS folderDisplay, folder.type AS folderType, NULL AS folderInheritedType, folder.unified AS folderUnified, folder.read_only AS folderReadOnly" +
|
||||||
", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" +
|
", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" +
|
||||||
", message.`from` AS senders" +
|
", message.`from` AS senders" +
|
||||||
|
@ -536,7 +536,7 @@ public interface DaoMessage {
|
||||||
@Transaction
|
@Transaction
|
||||||
@Query("SELECT message.*" +
|
@Query("SELECT message.*" +
|
||||||
", account.pop AS accountProtocol, account.name AS accountName, account.category AS accountCategory, COALESCE(identity.color, folder.color, account.color) AS accountColor" +
|
", account.pop AS accountProtocol, account.name AS accountName, account.category AS accountCategory, COALESCE(identity.color, folder.color, account.color) AS accountColor" +
|
||||||
", account.notify AS accountNotify, account.leave_deleted AS accountLeaveDeleted, account.auto_seen AS accountAutoSeen" +
|
", account.notify AS accountNotify, account.summary AS accountSummary, account.leave_deleted AS accountLeaveDeleted, account.auto_seen AS accountAutoSeen" +
|
||||||
", folder.name AS folderName, folder.color AS folderColor, folder.display AS folderDisplay, folder.type AS folderType, NULL AS folderInheritedType, folder.unified AS folderUnified, folder.read_only AS folderReadOnly" +
|
", folder.name AS folderName, folder.color AS folderColor, folder.display AS folderDisplay, folder.type AS folderType, NULL AS folderInheritedType, folder.unified AS folderUnified, folder.read_only AS folderReadOnly" +
|
||||||
", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" +
|
", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" +
|
||||||
", message.`from` AS senders" +
|
", message.`from` AS senders" +
|
||||||
|
|
|
@ -112,6 +112,8 @@ public class EntityAccount extends EntityOrder implements Serializable {
|
||||||
@NonNull
|
@NonNull
|
||||||
public Boolean notify = false;
|
public Boolean notify = false;
|
||||||
@NonNull
|
@NonNull
|
||||||
|
public Boolean summary = false;
|
||||||
|
@NonNull
|
||||||
public Boolean browse = true;
|
public Boolean browse = true;
|
||||||
@NonNull
|
@NonNull
|
||||||
public Boolean leave_on_server = true;
|
public Boolean leave_on_server = true;
|
||||||
|
|
|
@ -123,6 +123,7 @@ public class FragmentAccount extends FragmentBase {
|
||||||
private CheckBox cbPrimary;
|
private CheckBox cbPrimary;
|
||||||
private CheckBox cbNotify;
|
private CheckBox cbNotify;
|
||||||
private TextView tvNotifyRemark;
|
private TextView tvNotifyRemark;
|
||||||
|
private CheckBox cbSummary;
|
||||||
private TextView tvNotifyPro;
|
private TextView tvNotifyPro;
|
||||||
private CheckBox cbBrowse;
|
private CheckBox cbBrowse;
|
||||||
private CheckBox cbAutoSeen;
|
private CheckBox cbAutoSeen;
|
||||||
|
@ -243,6 +244,7 @@ public class FragmentAccount extends FragmentBase {
|
||||||
cbPrimary = view.findViewById(R.id.cbPrimary);
|
cbPrimary = view.findViewById(R.id.cbPrimary);
|
||||||
cbNotify = view.findViewById(R.id.cbNotify);
|
cbNotify = view.findViewById(R.id.cbNotify);
|
||||||
tvNotifyRemark = view.findViewById(R.id.tvNotifyRemark);
|
tvNotifyRemark = view.findViewById(R.id.tvNotifyRemark);
|
||||||
|
cbSummary = view.findViewById(R.id.cbSummary);
|
||||||
tvNotifyPro = view.findViewById(R.id.tvNotifyPro);
|
tvNotifyPro = view.findViewById(R.id.tvNotifyPro);
|
||||||
cbBrowse = view.findViewById(R.id.cbBrowse);
|
cbBrowse = view.findViewById(R.id.cbBrowse);
|
||||||
cbAutoSeen = view.findViewById(R.id.cbAutoSeen);
|
cbAutoSeen = view.findViewById(R.id.cbAutoSeen);
|
||||||
|
@ -503,6 +505,13 @@ public class FragmentAccount extends FragmentBase {
|
||||||
Helper.hide(view.findViewById(R.id.tvNotifyPro));
|
Helper.hide(view.findViewById(R.id.tvNotifyPro));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cbNotify.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||||
|
cbSummary.setEnabled(cbNotify.isEnabled() && isChecked);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
tvNotifyRemark.setOnClickListener(new View.OnClickListener() {
|
tvNotifyRemark.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
|
@ -938,6 +947,7 @@ public class FragmentAccount extends FragmentBase {
|
||||||
args.putBoolean("ondemand", cbOnDemand.isChecked());
|
args.putBoolean("ondemand", cbOnDemand.isChecked());
|
||||||
args.putBoolean("primary", cbPrimary.isChecked());
|
args.putBoolean("primary", cbPrimary.isChecked());
|
||||||
args.putBoolean("notify", cbNotify.isChecked());
|
args.putBoolean("notify", cbNotify.isChecked());
|
||||||
|
args.putBoolean("summary", cbSummary.isChecked());
|
||||||
args.putBoolean("browse", cbBrowse.isChecked());
|
args.putBoolean("browse", cbBrowse.isChecked());
|
||||||
args.putBoolean("auto_seen", cbAutoSeen.isChecked());
|
args.putBoolean("auto_seen", cbAutoSeen.isChecked());
|
||||||
args.putString("interval", etInterval.getText().toString());
|
args.putString("interval", etInterval.getText().toString());
|
||||||
|
@ -1014,6 +1024,7 @@ public class FragmentAccount extends FragmentBase {
|
||||||
boolean ondemand = args.getBoolean("ondemand");
|
boolean ondemand = args.getBoolean("ondemand");
|
||||||
boolean primary = args.getBoolean("primary");
|
boolean primary = args.getBoolean("primary");
|
||||||
boolean notify = args.getBoolean("notify");
|
boolean notify = args.getBoolean("notify");
|
||||||
|
boolean summary = args.getBoolean("summary");
|
||||||
boolean browse = args.getBoolean("browse");
|
boolean browse = args.getBoolean("browse");
|
||||||
boolean auto_seen = args.getBoolean("auto_seen");
|
boolean auto_seen = args.getBoolean("auto_seen");
|
||||||
String interval = args.getString("interval");
|
String interval = args.getString("interval");
|
||||||
|
@ -1062,8 +1073,10 @@ public class FragmentAccount extends FragmentBase {
|
||||||
category = null;
|
category = null;
|
||||||
if (color == Color.TRANSPARENT || !pro)
|
if (color == Color.TRANSPARENT || !pro)
|
||||||
color = null;
|
color = null;
|
||||||
if (!pro)
|
if (!pro) {
|
||||||
notify = false;
|
notify = false;
|
||||||
|
summary = false;
|
||||||
|
}
|
||||||
|
|
||||||
long now = new Date().getTime();
|
long now = new Date().getTime();
|
||||||
|
|
||||||
|
@ -1120,6 +1133,8 @@ public class FragmentAccount extends FragmentBase {
|
||||||
return true;
|
return true;
|
||||||
if (!Objects.equals(account.notify, notify))
|
if (!Objects.equals(account.notify, notify))
|
||||||
return true;
|
return true;
|
||||||
|
if (!Objects.equals(account.summary, summary))
|
||||||
|
return true;
|
||||||
if (!Objects.equals(account.browse, browse))
|
if (!Objects.equals(account.browse, browse))
|
||||||
return true;
|
return true;
|
||||||
if (!Objects.equals(account.auto_seen, auto_seen))
|
if (!Objects.equals(account.auto_seen, auto_seen))
|
||||||
|
@ -1271,6 +1286,7 @@ public class FragmentAccount extends FragmentBase {
|
||||||
account.ondemand = ondemand;
|
account.ondemand = ondemand;
|
||||||
account.primary = (account.synchronize && primary);
|
account.primary = (account.synchronize && primary);
|
||||||
account.notify = notify;
|
account.notify = notify;
|
||||||
|
account.summary = summary;
|
||||||
account.browse = browse;
|
account.browse = browse;
|
||||||
account.auto_seen = auto_seen;
|
account.auto_seen = auto_seen;
|
||||||
|
|
||||||
|
@ -1647,9 +1663,8 @@ public class FragmentAccount extends FragmentBase {
|
||||||
etCategory.setText(account == null ? null : account.category);
|
etCategory.setText(account == null ? null : account.category);
|
||||||
btnColor.setColor(account == null ? null : account.color);
|
btnColor.setColor(account == null ? null : account.color);
|
||||||
|
|
||||||
boolean pro = ActivityBilling.isPro(context);
|
cbNotify.setChecked(account != null && account.notify);
|
||||||
cbNotify.setChecked(account != null && account.notify && pro);
|
cbSummary.setChecked(account != null && account.summary);
|
||||||
cbNotify.setEnabled(pro);
|
|
||||||
|
|
||||||
cbSynchronize.setChecked(account == null ? true : account.synchronize);
|
cbSynchronize.setChecked(account == null ? true : account.synchronize);
|
||||||
cbIgnoreSchedule.setChecked(jcondition.optBoolean("ignore_schedule"));
|
cbIgnoreSchedule.setChecked(jcondition.optBoolean("ignore_schedule"));
|
||||||
|
@ -1710,6 +1725,9 @@ public class FragmentAccount extends FragmentBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
Helper.setViewsEnabled(view, true);
|
Helper.setViewsEnabled(view, true);
|
||||||
|
boolean pro = ActivityBilling.isPro(context);
|
||||||
|
cbNotify.setEnabled(pro);
|
||||||
|
cbSummary.setEnabled(pro && cbNotify.isChecked());
|
||||||
|
|
||||||
if (auth != AUTH_TYPE_PASSWORD) {
|
if (auth != AUTH_TYPE_PASSWORD) {
|
||||||
etUser.setEnabled(false);
|
etUser.setEnabled(false);
|
||||||
|
|
|
@ -93,6 +93,8 @@ public class FragmentPop extends FragmentBase {
|
||||||
private CheckBox cbOnDemand;
|
private CheckBox cbOnDemand;
|
||||||
private CheckBox cbPrimary;
|
private CheckBox cbPrimary;
|
||||||
private CheckBox cbNotify;
|
private CheckBox cbNotify;
|
||||||
|
private TextView tvNotifyRemark;
|
||||||
|
private CheckBox cbSummary;
|
||||||
private TextView tvNotifyPro;
|
private TextView tvNotifyPro;
|
||||||
private CheckBox cbAutoSeen;
|
private CheckBox cbAutoSeen;
|
||||||
private CheckBox cbLeaveServer;
|
private CheckBox cbLeaveServer;
|
||||||
|
@ -169,6 +171,8 @@ public class FragmentPop extends FragmentBase {
|
||||||
cbOnDemand = view.findViewById(R.id.cbOnDemand);
|
cbOnDemand = view.findViewById(R.id.cbOnDemand);
|
||||||
cbPrimary = view.findViewById(R.id.cbPrimary);
|
cbPrimary = view.findViewById(R.id.cbPrimary);
|
||||||
cbNotify = view.findViewById(R.id.cbNotify);
|
cbNotify = view.findViewById(R.id.cbNotify);
|
||||||
|
tvNotifyRemark = view.findViewById(R.id.tvNotifyRemark);
|
||||||
|
cbSummary = view.findViewById(R.id.cbSummary);
|
||||||
tvNotifyPro = view.findViewById(R.id.tvNotifyPro);
|
tvNotifyPro = view.findViewById(R.id.tvNotifyPro);
|
||||||
cbAutoSeen = view.findViewById(R.id.cbAutoSeen);
|
cbAutoSeen = view.findViewById(R.id.cbAutoSeen);
|
||||||
cbLeaveServer = view.findViewById(R.id.cbLeaveServer);
|
cbLeaveServer = view.findViewById(R.id.cbLeaveServer);
|
||||||
|
@ -288,11 +292,26 @@ public class FragmentPop extends FragmentBase {
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||||
Helper.hide(cbNotify);
|
Helper.hide(cbNotify);
|
||||||
|
Helper.hide(tvNotifyRemark);
|
||||||
Helper.hide(view.findViewById(R.id.tvNotifyPro));
|
Helper.hide(view.findViewById(R.id.tvNotifyPro));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tvNotifyRemark.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
Helper.viewFAQ(v.getContext(), 145);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Helper.linkPro(tvNotifyPro);
|
Helper.linkPro(tvNotifyPro);
|
||||||
|
|
||||||
|
cbNotify.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||||
|
cbSummary.setEnabled(cbNotify.isEnabled() && isChecked);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
cbLeaveServer.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
cbLeaveServer.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||||
|
@ -369,6 +388,7 @@ public class FragmentPop extends FragmentBase {
|
||||||
args.putBoolean("ondemand", cbOnDemand.isChecked());
|
args.putBoolean("ondemand", cbOnDemand.isChecked());
|
||||||
args.putBoolean("primary", cbPrimary.isChecked());
|
args.putBoolean("primary", cbPrimary.isChecked());
|
||||||
args.putBoolean("notify", cbNotify.isChecked());
|
args.putBoolean("notify", cbNotify.isChecked());
|
||||||
|
args.putBoolean("summary", cbSummary.isChecked());
|
||||||
args.putBoolean("auto_seen", cbAutoSeen.isChecked());
|
args.putBoolean("auto_seen", cbAutoSeen.isChecked());
|
||||||
|
|
||||||
args.putBoolean("leave_server", cbLeaveServer.isChecked());
|
args.putBoolean("leave_server", cbLeaveServer.isChecked());
|
||||||
|
@ -425,6 +445,7 @@ public class FragmentPop extends FragmentBase {
|
||||||
boolean ondemand = args.getBoolean("ondemand");
|
boolean ondemand = args.getBoolean("ondemand");
|
||||||
boolean primary = args.getBoolean("primary");
|
boolean primary = args.getBoolean("primary");
|
||||||
boolean notify = args.getBoolean("notify");
|
boolean notify = args.getBoolean("notify");
|
||||||
|
boolean summary = args.getBoolean("summary");
|
||||||
boolean auto_seen = args.getBoolean("auto_seen");
|
boolean auto_seen = args.getBoolean("auto_seen");
|
||||||
boolean leave_server = args.getBoolean("leave_server");
|
boolean leave_server = args.getBoolean("leave_server");
|
||||||
boolean client_delete = args.getBoolean("client_delete");
|
boolean client_delete = args.getBoolean("client_delete");
|
||||||
|
@ -466,8 +487,10 @@ public class FragmentPop extends FragmentBase {
|
||||||
category = null;
|
category = null;
|
||||||
if (color == Color.TRANSPARENT || !pro)
|
if (color == Color.TRANSPARENT || !pro)
|
||||||
color = null;
|
color = null;
|
||||||
if (!pro)
|
if (!pro) {
|
||||||
notify = false;
|
notify = false;
|
||||||
|
summary = false;
|
||||||
|
}
|
||||||
|
|
||||||
long now = new Date().getTime();
|
long now = new Date().getTime();
|
||||||
|
|
||||||
|
@ -516,6 +539,8 @@ public class FragmentPop extends FragmentBase {
|
||||||
return true;
|
return true;
|
||||||
if (!Objects.equals(account.notify, notify))
|
if (!Objects.equals(account.notify, notify))
|
||||||
return true;
|
return true;
|
||||||
|
if (!Objects.equals(account.summary, summary))
|
||||||
|
return true;
|
||||||
if (!Objects.equals(account.auto_seen, auto_seen))
|
if (!Objects.equals(account.auto_seen, auto_seen))
|
||||||
return true;
|
return true;
|
||||||
if (!Objects.equals(account.leave_on_server, leave_server))
|
if (!Objects.equals(account.leave_on_server, leave_server))
|
||||||
|
@ -608,6 +633,7 @@ public class FragmentPop extends FragmentBase {
|
||||||
account.ondemand = ondemand;
|
account.ondemand = ondemand;
|
||||||
account.primary = (account.synchronize && primary);
|
account.primary = (account.synchronize && primary);
|
||||||
account.notify = notify;
|
account.notify = notify;
|
||||||
|
account.summary = summary;
|
||||||
account.auto_seen = auto_seen;
|
account.auto_seen = auto_seen;
|
||||||
account.leave_on_server = leave_server;
|
account.leave_on_server = leave_server;
|
||||||
account.client_delete = client_delete;
|
account.client_delete = client_delete;
|
||||||
|
@ -799,9 +825,8 @@ public class FragmentPop extends FragmentBase {
|
||||||
cbOnDemand.setChecked(account == null ? false : account.ondemand);
|
cbOnDemand.setChecked(account == null ? false : account.ondemand);
|
||||||
cbPrimary.setChecked(account == null ? false : account.primary);
|
cbPrimary.setChecked(account == null ? false : account.primary);
|
||||||
|
|
||||||
boolean pro = ActivityBilling.isPro(getContext());
|
cbNotify.setChecked(account != null && account.notify);
|
||||||
cbNotify.setChecked(account != null && account.notify && pro);
|
cbSummary.setChecked(account != null && account.summary);
|
||||||
cbNotify.setEnabled(pro);
|
|
||||||
|
|
||||||
cbAutoSeen.setChecked(account == null ? true : account.auto_seen);
|
cbAutoSeen.setChecked(account == null ? true : account.auto_seen);
|
||||||
|
|
||||||
|
@ -863,6 +888,9 @@ public class FragmentPop extends FragmentBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
Helper.setViewsEnabled(view, true);
|
Helper.setViewsEnabled(view, true);
|
||||||
|
boolean pro = ActivityBilling.isPro(getContext());
|
||||||
|
cbNotify.setEnabled(pro);
|
||||||
|
cbSummary.setEnabled(pro && cbNotify.isChecked());
|
||||||
|
|
||||||
if (auth != AUTH_TYPE_PASSWORD) {
|
if (auth != AUTH_TYPE_PASSWORD) {
|
||||||
etUser.setEnabled(false);
|
etUser.setEnabled(false);
|
||||||
|
|
|
@ -31,7 +31,7 @@ import java.util.Objects;
|
||||||
value = TupleAccountView.query
|
value = TupleAccountView.query
|
||||||
)
|
)
|
||||||
public class TupleAccountView {
|
public class TupleAccountView {
|
||||||
static final String query = "SELECT id, pop, name, category, color, synchronize, notify, leave_deleted, auto_seen, created FROM account";
|
static final String query = "SELECT id, pop, name, category, color, synchronize, notify, summary, leave_deleted, auto_seen, created FROM account";
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public Long id;
|
public Long id;
|
||||||
|
@ -46,6 +46,8 @@ public class TupleAccountView {
|
||||||
@NonNull
|
@NonNull
|
||||||
public Boolean notify = false;
|
public Boolean notify = false;
|
||||||
@NonNull
|
@NonNull
|
||||||
|
public Boolean summary = false;
|
||||||
|
@NonNull
|
||||||
public Boolean leave_deleted = false;
|
public Boolean leave_deleted = false;
|
||||||
@NonNull
|
@NonNull
|
||||||
public Boolean auto_seen = true;
|
public Boolean auto_seen = true;
|
||||||
|
@ -61,6 +63,7 @@ public class TupleAccountView {
|
||||||
Objects.equals(this.color, other.color) &&
|
Objects.equals(this.color, other.color) &&
|
||||||
this.synchronize.equals(other.synchronize) &&
|
this.synchronize.equals(other.synchronize) &&
|
||||||
this.notify.equals(other.notify) &&
|
this.notify.equals(other.notify) &&
|
||||||
|
this.summary.equals(other.summary) &&
|
||||||
this.leave_deleted.equals(other.leave_deleted) &&
|
this.leave_deleted.equals(other.leave_deleted) &&
|
||||||
this.auto_seen.equals(other.auto_seen) &&
|
this.auto_seen.equals(other.auto_seen) &&
|
||||||
Objects.equals(this.created, other.created));
|
Objects.equals(this.created, other.created));
|
||||||
|
|
|
@ -39,6 +39,7 @@ public class TupleMessageEx extends EntityMessage {
|
||||||
public String accountCategory;
|
public String accountCategory;
|
||||||
public Integer accountColor;
|
public Integer accountColor;
|
||||||
public boolean accountNotify;
|
public boolean accountNotify;
|
||||||
|
public boolean accountSummary;
|
||||||
public boolean accountLeaveDeleted;
|
public boolean accountLeaveDeleted;
|
||||||
public boolean accountAutoSeen;
|
public boolean accountAutoSeen;
|
||||||
public String folderName;
|
public String folderName;
|
||||||
|
@ -146,6 +147,7 @@ public class TupleMessageEx extends EntityMessage {
|
||||||
Objects.equals(this.accountCategory, other.accountCategory) &&
|
Objects.equals(this.accountCategory, other.accountCategory) &&
|
||||||
Objects.equals(this.accountColor, other.accountColor) &&
|
Objects.equals(this.accountColor, other.accountColor) &&
|
||||||
this.accountNotify == other.accountNotify &&
|
this.accountNotify == other.accountNotify &&
|
||||||
|
this.accountSummary == other.accountSummary &&
|
||||||
this.accountLeaveDeleted == other.accountLeaveDeleted &&
|
this.accountLeaveDeleted == other.accountLeaveDeleted &&
|
||||||
this.accountAutoSeen == other.accountAutoSeen &&
|
this.accountAutoSeen == other.accountAutoSeen &&
|
||||||
this.folderName.equals(other.folderName) &&
|
this.folderName.equals(other.folderName) &&
|
||||||
|
|
|
@ -572,6 +572,16 @@
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/cbNotify" />
|
app:layout_constraintTop_toBottomOf="@id/cbNotify" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/cbSummary"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="12dp"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:text="@string/title_advanced_notify_summary"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tvNotifyRemark" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tvNotifyPro"
|
android:id="@+id/tvNotifyPro"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
@ -581,7 +591,7 @@
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||||
android:textColor="?android:attr/textColorLink"
|
android:textColor="?android:attr/textColorLink"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/tvNotifyRemark" />
|
app:layout_constraintTop_toBottomOf="@id/cbSummary" />
|
||||||
|
|
||||||
<CheckBox
|
<CheckBox
|
||||||
android:id="@+id/cbBrowse"
|
android:id="@+id/cbBrowse"
|
||||||
|
@ -1176,7 +1186,7 @@
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
app:constraint_referenced_ids="
|
app:constraint_referenced_ids="
|
||||||
cbNotify,tvNotifyRemark,tvNotifyPro,
|
cbNotify,tvNotifyRemark,cbSummary,tvNotifyPro,
|
||||||
cbSynchronize,cbIgnoreSchedule,cbOnDemand,tvLeave,cbPrimary,
|
cbSynchronize,cbIgnoreSchedule,cbOnDemand,tvLeave,cbPrimary,
|
||||||
cbBrowse,tvBrowseHint,
|
cbBrowse,tvBrowseHint,
|
||||||
cbAutoSeen,
|
cbAutoSeen,
|
||||||
|
|
|
@ -407,6 +407,31 @@
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/cbPrimary" />
|
app:layout_constraintTop_toBottomOf="@id/cbPrimary" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tvNotifyRemark"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:drawableEnd="@drawable/twotone_info_24"
|
||||||
|
android:drawablePadding="6dp"
|
||||||
|
android:text="@string/title_notify_remark"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||||
|
android:textStyle="italic"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/cbNotify" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/cbSummary"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="12dp"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:tag="ignore"
|
||||||
|
android:text="@string/title_advanced_notify_summary"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/tvNotifyRemark" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tvNotifyPro"
|
android:id="@+id/tvNotifyPro"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
@ -416,7 +441,7 @@
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||||
android:textColor="?android:attr/textColorLink"
|
android:textColor="?android:attr/textColorLink"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/cbNotify" />
|
app:layout_constraintTop_toBottomOf="@id/cbSummary" />
|
||||||
|
|
||||||
<CheckBox
|
<CheckBox
|
||||||
android:id="@+id/cbAutoSeen"
|
android:id="@+id/cbAutoSeen"
|
||||||
|
|
|
@ -6,6 +6,10 @@ For support you can use the contact form.
|
||||||
|
|
||||||
Saltopus
|
Saltopus
|
||||||
|
|
||||||
|
Next version
|
||||||
|
|
||||||
|
* Added advanced account option for summary only notifications
|
||||||
|
|
||||||
1.2061 - 2023-04-10
|
1.2061 - 2023-04-10
|
||||||
|
|
||||||
* Added filter rule groups (stop processing per group)
|
* Added filter rule groups (stop processing per group)
|
||||||
|
|
Loading…
Reference in New Issue