mirror of https://github.com/M66B/FairEmail.git
Fixed/simplified unified widget update
This commit is contained in:
parent
58943f1291
commit
92332a7c78
|
@ -273,7 +273,7 @@ public interface DaoMessage {
|
||||||
" ORDER BY message.received")
|
" ORDER BY message.received")
|
||||||
LiveData<List<TupleMessageEx>> liveUnseenNotify();
|
LiveData<List<TupleMessageEx>> liveUnseenNotify();
|
||||||
|
|
||||||
@Query("SELECT message.*" +
|
String widget = "SELECT message.*" +
|
||||||
" FROM message" +
|
" FROM message" +
|
||||||
" JOIN account ON account.id = message.account" +
|
" JOIN account ON account.id = message.account" +
|
||||||
" JOIN folder ON folder.id = message.folder" +
|
" JOIN folder ON folder.id = message.folder" +
|
||||||
|
@ -281,9 +281,14 @@ public interface DaoMessage {
|
||||||
" AND folder.unified" +
|
" AND folder.unified" +
|
||||||
" AND message.ui_hide = 0" +
|
" AND message.ui_hide = 0" +
|
||||||
" AND message.ui_snoozed IS NULL" +
|
" AND message.ui_snoozed IS NULL" +
|
||||||
" ORDER BY message.received DESC")
|
" ORDER BY message.received DESC";
|
||||||
|
|
||||||
|
@Query(widget)
|
||||||
LiveData<List<EntityMessage>> liveWidgetUnified();
|
LiveData<List<EntityMessage>> liveWidgetUnified();
|
||||||
|
|
||||||
|
@Query(widget)
|
||||||
|
List<EntityMessage> getWidgetUnified();
|
||||||
|
|
||||||
@Query("SELECT COUNT(message.id) FROM message" +
|
@Query("SELECT COUNT(message.id) FROM message" +
|
||||||
" JOIN account ON account.id = message.account" +
|
" JOIN account ON account.id = message.account" +
|
||||||
" JOIN folder ON folder.id = message.folder" +
|
" JOIN folder ON folder.id = message.folder" +
|
||||||
|
|
|
@ -59,6 +59,7 @@ import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
@ -184,9 +185,39 @@ public class ServiceSynchronize extends LifecycleService {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
db.message().liveWidgetUnified().observe(cowner, new Observer<List<EntityMessage>>() {
|
||||||
|
private List<EntityMessage> last = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onChanged(List<EntityMessage> messages) {
|
||||||
|
if (messages == null)
|
||||||
|
messages = new ArrayList<>();
|
||||||
|
|
||||||
|
boolean changed = false;
|
||||||
|
if (last != null && last.size() == messages.size()) {
|
||||||
|
for (int i = 0; i < last.size(); i++) {
|
||||||
|
EntityMessage m1 = last.get(i);
|
||||||
|
EntityMessage m2 = messages.get(i);
|
||||||
|
if (!m1.id.equals(m2.id) ||
|
||||||
|
!MessageHelper.equal(m1.from, m2.from) ||
|
||||||
|
!m1.received.equals(m2.received) ||
|
||||||
|
!Objects.equals(m1.subject, m2.subject) ||
|
||||||
|
m1.ui_seen != m2.ui_seen) {
|
||||||
|
changed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
changed = true;
|
||||||
|
|
||||||
|
last = messages;
|
||||||
|
|
||||||
|
if (changed)
|
||||||
|
WidgetUnified.update(ServiceSynchronize.this);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
WorkerCleanup.queue(this);
|
WorkerCleanup.queue(this);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -22,6 +22,7 @@ package eu.faircode.email;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.appwidget.AppWidgetManager;
|
import android.appwidget.AppWidgetManager;
|
||||||
import android.appwidget.AppWidgetProvider;
|
import android.appwidget.AppWidgetProvider;
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
@ -57,4 +58,12 @@ public class WidgetUnified extends AppWidgetProvider {
|
||||||
appWidgetManager.updateAppWidget(id, views);
|
appWidgetManager.updateAppWidget(id, views);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void update(Context context) {
|
||||||
|
Log.i("Widget unified update");
|
||||||
|
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
|
||||||
|
int[] appWidgetIds = AppWidgetManager.getInstance(context).getAppWidgetIds(
|
||||||
|
new ComponentName(context, WidgetUnified.class));
|
||||||
|
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.lv);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,11 +19,9 @@ package eu.faircode.email;
|
||||||
Copyright 2018-2019 by Marcel Bokhorst (M66B)
|
Copyright 2018-2019 by Marcel Bokhorst (M66B)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import android.appwidget.AppWidgetManager;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
import android.os.Handler;
|
|
||||||
import android.text.SpannableString;
|
import android.text.SpannableString;
|
||||||
import android.text.Spanned;
|
import android.text.Spanned;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
@ -31,94 +29,35 @@ import android.text.style.StyleSpan;
|
||||||
import android.widget.RemoteViews;
|
import android.widget.RemoteViews;
|
||||||
import android.widget.RemoteViewsService;
|
import android.widget.RemoteViewsService;
|
||||||
|
|
||||||
import androidx.lifecycle.Observer;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import static android.os.Looper.getMainLooper;
|
|
||||||
|
|
||||||
public class WidgetUnifiedRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
|
public class WidgetUnifiedRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
|
||||||
private Context context;
|
private Context context;
|
||||||
private int appWidgetId;
|
private int appWidgetId;
|
||||||
|
|
||||||
private Handler handler;
|
|
||||||
private TwoStateOwner owner;
|
|
||||||
private List<EntityMessage> messages = new ArrayList<>();
|
private List<EntityMessage> messages = new ArrayList<>();
|
||||||
|
|
||||||
WidgetUnifiedRemoteViewsFactory(final Context context, final int appWidgetId) {
|
WidgetUnifiedRemoteViewsFactory(final Context context, final int appWidgetId) {
|
||||||
this.appWidgetId = appWidgetId;
|
this.appWidgetId = appWidgetId;
|
||||||
|
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.handler = new Handler(getMainLooper());
|
|
||||||
|
|
||||||
handler.post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
DB db = DB.getInstance(context);
|
|
||||||
owner = new TwoStateOwner("WidgetUnified:" + appWidgetId);
|
|
||||||
db.message().liveWidgetUnified().observe(owner, new Observer<List<EntityMessage>>() {
|
|
||||||
@Override
|
|
||||||
public void onChanged(List<EntityMessage> messages) {
|
|
||||||
if (messages == null)
|
|
||||||
messages = new ArrayList<>();
|
|
||||||
|
|
||||||
boolean changed = false;
|
|
||||||
if (WidgetUnifiedRemoteViewsFactory.this.messages.size() == messages.size()) {
|
|
||||||
for (int i = 0; i < messages.size(); i++) {
|
|
||||||
EntityMessage m1 = messages.get(i);
|
|
||||||
EntityMessage m2 = WidgetUnifiedRemoteViewsFactory.this.messages.get(i);
|
|
||||||
if (!m1.id.equals(m2.id) ||
|
|
||||||
!MessageHelper.equal(m1.from, m2.from) ||
|
|
||||||
!m1.received.equals(m2.received) ||
|
|
||||||
!Objects.equals(m1.subject, m2.subject) ||
|
|
||||||
m1.ui_seen != m2.ui_seen) {
|
|
||||||
changed = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
changed = true;
|
|
||||||
|
|
||||||
WidgetUnifiedRemoteViewsFactory.this.messages = messages;
|
|
||||||
|
|
||||||
if (changed) {
|
|
||||||
Log.i("Widget factory notify changed id=" + appWidgetId);
|
|
||||||
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
|
|
||||||
appWidgetManager.notifyAppWidgetViewDataChanged(new int[]{appWidgetId}, R.id.lv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
Log.i("Widget factory create id=" + appWidgetId);
|
Log.i("Widget factory create id=" + appWidgetId);
|
||||||
handler.post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
owner.start();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDataSetChanged() {
|
public void onDataSetChanged() {
|
||||||
Log.i("Widget factory changed id=" + appWidgetId);
|
Log.i("Widget factory changed id=" + appWidgetId);
|
||||||
|
DB db = DB.getInstance(context);
|
||||||
|
messages = db.message().getWidgetUnified();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
Log.i("Widget factory destroy id=" + appWidgetId);
|
Log.i("Widget factory destroy id=" + appWidgetId);
|
||||||
handler.post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
owner.destroy();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in New Issue