mirror of
https://github.com/M66B/FairEmail.git
synced 2026-04-01 22:56:33 +02:00
@@ -50,14 +50,18 @@ import android.widget.TextView;
|
||||
import java.text.Collator;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
public class ActivityView extends ActivityBase implements FragmentManager.OnBackStackChangedListener, SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
private boolean newIntent = false;
|
||||
private DrawerLayout drawerLayout;
|
||||
private ListView drawerList;
|
||||
private ActionBarDrawerToggle drawerToggle;
|
||||
private ExecutorService executor = Executors.newSingleThreadExecutor();
|
||||
|
||||
static final int LOADER_ACCOUNT_PUT = 1;
|
||||
static final int LOADER_IDENTITY_PUT = 2;
|
||||
@@ -66,6 +70,7 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack
|
||||
static final int LOADER_MESSAGE_MOVE = 5;
|
||||
|
||||
static final int REQUEST_VIEW = 1;
|
||||
static final int REQUEST_UNSEEN = 2;
|
||||
|
||||
static final String ACTION_VIEW_MESSAGES = BuildConfig.APPLICATION_ID + ".VIEW_MESSAGES";
|
||||
static final String ACTION_VIEW_MESSAGE = BuildConfig.APPLICATION_ID + ".VIEW_MESSAGE";
|
||||
@@ -153,6 +158,8 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack
|
||||
|
||||
if (getSupportFragmentManager().getFragments().size() == 0)
|
||||
init();
|
||||
|
||||
checkIntent(getIntent());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -198,8 +205,8 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack
|
||||
|
||||
@Override
|
||||
protected void onNewIntent(Intent intent) {
|
||||
Log.i(Helper.TAG, "View new intent=" + intent);
|
||||
newIntent = true;
|
||||
checkIntent(intent);
|
||||
super.onNewIntent(intent);
|
||||
}
|
||||
|
||||
@@ -256,6 +263,28 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack
|
||||
}
|
||||
}
|
||||
|
||||
private void checkIntent(Intent intent) {
|
||||
Log.i(Helper.TAG, "View intent=" + intent + " action=" + intent.getAction());
|
||||
String action = intent.getAction();
|
||||
intent.setAction(null);
|
||||
setIntent(intent);
|
||||
|
||||
final long now = new Date().getTime();
|
||||
|
||||
if ("unseen".equals(action))
|
||||
executor.submit(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
DaoAccount dao = DB.getInstance(ActivityView.this).account();
|
||||
for (EntityAccount account : dao.getAccounts(true)) {
|
||||
account.seen_until = now;
|
||||
dao.updateAccount(account);
|
||||
}
|
||||
Log.i(Helper.TAG, "Updated seen until");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void init() {
|
||||
invalidateOptionsMenu();
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ import javax.mail.internet.InternetAddress;
|
||||
EntityAttachment.class,
|
||||
EntityOperation.class
|
||||
},
|
||||
version = 5,
|
||||
version = 6,
|
||||
exportSchema = true
|
||||
)
|
||||
|
||||
@@ -89,6 +89,7 @@ public abstract class DB extends RoomDatabase {
|
||||
.addMigrations(MIGRATION_2_3)
|
||||
.addMigrations(MIGRATION_3_4)
|
||||
.addMigrations(MIGRATION_4_5)
|
||||
.addMigrations(MIGRATION_5_6)
|
||||
.build();
|
||||
}
|
||||
|
||||
@@ -132,6 +133,14 @@ public abstract class DB extends RoomDatabase {
|
||||
}
|
||||
};
|
||||
|
||||
private static final Migration MIGRATION_5_6 = new Migration(5, 6) {
|
||||
@Override
|
||||
public void migrate(SupportSQLiteDatabase db) {
|
||||
Log.i(Helper.TAG, "DB migration from version " + startVersion + " to " + endVersion);
|
||||
db.execSQL("ALTER TABLE `account` ADD COLUMN `seen_until` INTEGER");
|
||||
}
|
||||
};
|
||||
|
||||
public static class Converters {
|
||||
@TypeConverter
|
||||
public static String[] fromStringArray(String value) {
|
||||
|
||||
@@ -55,8 +55,11 @@ public interface DaoAccount {
|
||||
" JOIN account ON account.id = message.account" +
|
||||
" WHERE synchronize) AS operations" +
|
||||
", (SELECT COUNT(*) FROM message" +
|
||||
" JOIN account ON account.id = message.account" +
|
||||
" JOIN folder ON folder.id = message.folder" +
|
||||
" WHERE NOT ui_seen AND folder.type = '" + EntityFolder.TYPE_INBOX + "') AS unseen")
|
||||
" WHERE NOT message.ui_seen AND NOT message.ui_hide" +
|
||||
" AND (account.seen_until IS NULL OR message.received > account.seen_until)" +
|
||||
" AND folder.type = '" + EntityFolder.TYPE_INBOX + "') AS unseen")
|
||||
LiveData<TupleAccountStats> liveStats();
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
|
||||
@@ -46,6 +46,7 @@ public class EntityAccount {
|
||||
public Boolean primary;
|
||||
@NonNull
|
||||
public Boolean synchronize;
|
||||
public Long seen_until;
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
|
||||
@@ -123,7 +123,7 @@ public class ServiceSynchronize extends LifecycleService {
|
||||
public void onCreate() {
|
||||
Log.i(Helper.TAG, "Service create");
|
||||
super.onCreate();
|
||||
startForeground(NOTIFICATION_SYNCHRONIZE, getNotification(0, 0).build());
|
||||
startForeground(NOTIFICATION_SYNCHRONIZE, getNotificationService(0, 0).build());
|
||||
|
||||
// Listen for network changes
|
||||
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
@@ -140,13 +140,12 @@ public class ServiceSynchronize extends LifecycleService {
|
||||
if (stats != null) {
|
||||
NotificationManager nm = getSystemService(NotificationManager.class);
|
||||
nm.notify(NOTIFICATION_SYNCHRONIZE,
|
||||
getNotification(stats.accounts, stats.operations).build());
|
||||
getNotificationService(stats.accounts, stats.operations).build());
|
||||
|
||||
if (stats.unseen > 0) {
|
||||
if (stats.unseen != prev_unseen) {
|
||||
boolean sound = (stats.unseen > prev_unseen);
|
||||
if (stats.unseen > prev_unseen) {
|
||||
nm.cancel(NOTIFICATION_UNSEEN);
|
||||
nm.notify(NOTIFICATION_UNSEEN, getNotification(stats.unseen, sound).build());
|
||||
nm.notify(NOTIFICATION_UNSEEN, getNotificationUnseen(stats.unseen).build());
|
||||
}
|
||||
} else
|
||||
nm.cancel(NOTIFICATION_UNSEEN);
|
||||
@@ -182,7 +181,7 @@ public class ServiceSynchronize extends LifecycleService {
|
||||
return START_STICKY;
|
||||
}
|
||||
|
||||
private Notification.Builder getNotification(int accounts, int operations) {
|
||||
private Notification.Builder getNotificationService(int accounts, int operations) {
|
||||
// Build pending intent
|
||||
Intent intent = new Intent(this, ActivityView.class);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
@@ -210,12 +209,15 @@ public class ServiceSynchronize extends LifecycleService {
|
||||
return builder;
|
||||
}
|
||||
|
||||
private Notification.Builder getNotification(int unseen, boolean sound) {
|
||||
private Notification.Builder getNotificationUnseen(int unseen) {
|
||||
// Build pending intent
|
||||
Intent intent = new Intent(this, ActivityView.class);
|
||||
intent.setAction("unseen");
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
PendingIntent pi = PendingIntent.getActivity(
|
||||
this, ActivityView.REQUEST_VIEW, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
this, ActivityView.REQUEST_UNSEEN, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
|
||||
|
||||
// Build notification
|
||||
Notification.Builder builder;
|
||||
@@ -228,21 +230,17 @@ public class ServiceSynchronize extends LifecycleService {
|
||||
.setSmallIcon(R.drawable.baseline_mail_24)
|
||||
.setContentTitle(getString(R.string.title_notification_unseen, unseen))
|
||||
.setContentIntent(pi)
|
||||
.setAutoCancel(true)
|
||||
.setShowWhen(false) // when of first or last new email?
|
||||
.setSound(uri)
|
||||
.setOngoing(true)
|
||||
.setShowWhen(false)
|
||||
.setPriority(Notification.PRIORITY_DEFAULT)
|
||||
.setCategory(Notification.CATEGORY_STATUS)
|
||||
.setVisibility(Notification.VISIBILITY_PUBLIC);
|
||||
|
||||
if (sound) {
|
||||
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
|
||||
builder.setSound(uri);
|
||||
}
|
||||
|
||||
return builder;
|
||||
}
|
||||
|
||||
private Notification.Builder getNotification(String action, Throwable ex) {
|
||||
private Notification.Builder getNotificationError(String action, Throwable ex) {
|
||||
// Build pending intent
|
||||
Intent intent = new Intent(this, ActivityView.class);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
@@ -275,7 +273,7 @@ public class ServiceSynchronize extends LifecycleService {
|
||||
if (!(ex instanceof IllegalStateException) && // This operation is not allowed on a closed folder
|
||||
!(ex instanceof FolderClosedException)) {
|
||||
NotificationManager nm = getSystemService(NotificationManager.class);
|
||||
nm.notify(action, 1, getNotification(action, ex).build());
|
||||
nm.notify(action, 1, getNotificationError(action, ex).build());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user