From fcd3c5c15a9ea7a504d8cb6d4bd1726e89710064 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 20 Sep 2019 15:14:04 +0200 Subject: [PATCH] Select widget account --- FAQ.md | 2 +- .../faircode/email/ActivityWidgetUnified.java | 66 ++++++++++++++++++- .../main/java/eu/faircode/email/Widget.java | 8 +-- .../java/eu/faircode/email/WidgetUnified.java | 15 ++++- .../WidgetUnifiedRemoteViewsFactory.java | 41 +++++++----- .../res/layout/activity_widget_unified.xml | 37 ++++++++++- app/src/main/res/values/strings.xml | 2 + 7 files changed, 144 insertions(+), 27 deletions(-) diff --git a/FAQ.md b/FAQ.md index 8ea322713b..ef1f27fc19 100644 --- a/FAQ.md +++ b/FAQ.md @@ -69,7 +69,7 @@ Related questions: * ~~Themes~~ (a grey light and dark theme were added because this is what most people seems to want) * ~~Any day time condition~~ (any day doesn't really fit into the from/to date/time condition) * ~~Send as attachment~~ -* ~~Widget for selected account~~ (the unified inbox is / can be composed of selected folders already, so I see no real need for this complication) +* ~~Widget for selected account~~ * ~~Remind to attach files~~ * ~~Select domains to show images for~~ (this will be too complicated to use) * Search for settings diff --git a/app/src/main/java/eu/faircode/email/ActivityWidgetUnified.java b/app/src/main/java/eu/faircode/email/ActivityWidgetUnified.java index 8bafa10def..822df73898 100644 --- a/app/src/main/java/eu/faircode/email/ActivityWidgetUnified.java +++ b/app/src/main/java/eu/faircode/email/ActivityWidgetUnified.java @@ -20,18 +20,34 @@ package eu.faircode.email; */ import android.appwidget.AppWidgetManager; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; +import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckBox; +import android.widget.Spinner; +import androidx.constraintlayout.widget.Group; import androidx.preference.PreferenceManager; +import java.util.ArrayList; +import java.util.List; + public class ActivityWidgetUnified extends ActivityBase { private int appWidgetId; + private Spinner spAccount; + private CheckBox cbUnseen; + private CheckBox cbFlagged; + private Button btnSave; + private ContentLoadingProgressBar pbWait; + private Group grpReady; + + private ArrayAdapter adapter; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -48,9 +64,12 @@ public class ActivityWidgetUnified extends ActivityBase { getSupportActionBar().setSubtitle(R.string.title_folder_unified); setContentView(R.layout.activity_widget_unified); - final CheckBox cbUnseen = findViewById(R.id.cbUnseen); - final CheckBox cbFlagged = findViewById(R.id.cbFlagged); - Button btnSave = findViewById(R.id.btnSave); + spAccount = findViewById(R.id.spAccount); + cbUnseen = findViewById(R.id.cbUnseen); + cbFlagged = findViewById(R.id.cbFlagged); + btnSave = findViewById(R.id.btnSave); + pbWait = findViewById(R.id.pbWait); + grpReady = findViewById(R.id.grpReady); final Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); @@ -58,8 +77,13 @@ public class ActivityWidgetUnified extends ActivityBase { btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + EntityAccount account = (EntityAccount) spAccount.getSelectedItem(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ActivityWidgetUnified.this); SharedPreferences.Editor editor = prefs.edit(); + if (account != null && account.id > 0) + editor.putString("widget." + appWidgetId + ".name", account.name); + editor.putLong("widget." + appWidgetId + ".account", account == null ? -1L : account.id); editor.putBoolean("widget." + appWidgetId + ".unseen", cbUnseen.isChecked()); editor.putBoolean("widget." + appWidgetId + ".flagged", cbFlagged.isChecked()); editor.apply(); @@ -72,6 +96,42 @@ public class ActivityWidgetUnified extends ActivityBase { } }); + adapter = new ArrayAdapter<>(this, R.layout.spinner_item1, android.R.id.text1, new ArrayList()); + adapter.setDropDownViewResource(R.layout.spinner_item1_dropdown); + spAccount.setAdapter(adapter); + + grpReady.setVisibility(View.GONE); + pbWait.setVisibility(View.VISIBLE); + setResult(RESULT_CANCELED, resultValue); + + new SimpleTask>() { + @Override + protected List onExecute(Context context, Bundle args) { + DB db = DB.getInstance(context); + + return db.account().getSynchronizingAccounts(); + } + + @Override + protected void onExecuted(Bundle args, List accounts) { + EntityAccount all = new EntityAccount(); + all.id = -1L; + all.name = getString(R.string.title_widget_account_all); + all.primary = false; + accounts.add(0, all); + + adapter.addAll(accounts); + + grpReady.setVisibility(View.VISIBLE); + pbWait.setVisibility(View.GONE); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.e(ex); + Helper.unexpectedError(getSupportFragmentManager(), ex); + } + }.execute(this, new Bundle(), "widget:accounts"); } } diff --git a/app/src/main/java/eu/faircode/email/Widget.java b/app/src/main/java/eu/faircode/email/Widget.java index a1c1dbb2b9..57b6373743 100644 --- a/app/src/main/java/eu/faircode/email/Widget.java +++ b/app/src/main/java/eu/faircode/email/Widget.java @@ -53,15 +53,15 @@ public class Widget extends AppWidgetProvider { } private static void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, int count) { + NumberFormat nf = NumberFormat.getIntegerInstance(); + Intent view = new Intent(context, ActivityView.class); view.setAction("unified"); view.putExtra("refresh", true); view.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pi = PendingIntent.getActivity(context, ActivityView.REQUEST_UNIFIED, view, PendingIntent.FLAG_UPDATE_CURRENT); - NumberFormat nf = NumberFormat.getIntegerInstance(); - - for (int id : appWidgetIds) { + for (int appWidgetId : appWidgetIds) { RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); views.setOnClickPendingIntent(R.id.widget, pi); @@ -73,7 +73,7 @@ public class Widget extends AppWidgetProvider { else views.setTextViewText(R.id.tvCount, nf.format(count)); - appWidgetManager.updateAppWidget(id, views); + appWidgetManager.updateAppWidget(appWidgetId, views); } } } diff --git a/app/src/main/java/eu/faircode/email/WidgetUnified.java b/app/src/main/java/eu/faircode/email/WidgetUnified.java index 2e3d59631b..330e4ad0e5 100644 --- a/app/src/main/java/eu/faircode/email/WidgetUnified.java +++ b/app/src/main/java/eu/faircode/email/WidgetUnified.java @@ -25,10 +25,13 @@ import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.net.Uri; import android.view.View; import android.widget.RemoteViews; +import androidx.preference.PreferenceManager; + public class WidgetUnified extends AppWidgetProvider { @Override public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds) { @@ -51,6 +54,8 @@ public class WidgetUnified extends AppWidgetProvider { } private static void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + Intent view = new Intent(context, ActivityView.class); view.setAction("unified"); view.putExtra("refresh", true); @@ -58,15 +63,19 @@ public class WidgetUnified extends AppWidgetProvider { PendingIntent pi = PendingIntent.getActivity(context, ActivityView.REQUEST_UNIFIED, view, PendingIntent.FLAG_UPDATE_CURRENT); boolean pro = ActivityBilling.isPro(context); - for (int id : appWidgetIds) { + for (int appWidgetId : appWidgetIds) { RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_unified); views.setViewVisibility(R.id.pro, pro ? View.GONE : View.VISIBLE); if (pro) { + String name = prefs.getString("widget." + appWidgetId + ".name", null); + if (name != null) + views.setTextViewText(R.id.title, name); + views.setOnClickPendingIntent(R.id.title, pi); Intent service = new Intent(context, WidgetUnifiedService.class); - service.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id); + service.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); service.setData(Uri.parse(service.toUri(Intent.URI_INTENT_SCHEME))); views.setRemoteAdapter(R.id.lv, service); @@ -81,7 +90,7 @@ public class WidgetUnified extends AppWidgetProvider { } else views.setTextViewText(R.id.pro, context.getText(R.string.title_pro_feature)); - appWidgetManager.updateAppWidget(id, views); + appWidgetManager.updateAppWidget(appWidgetId, views); } } } diff --git a/app/src/main/java/eu/faircode/email/WidgetUnifiedRemoteViewsFactory.java b/app/src/main/java/eu/faircode/email/WidgetUnifiedRemoteViewsFactory.java index 16f7969896..c67286c4d4 100644 --- a/app/src/main/java/eu/faircode/email/WidgetUnifiedRemoteViewsFactory.java +++ b/app/src/main/java/eu/faircode/email/WidgetUnifiedRemoteViewsFactory.java @@ -28,6 +28,7 @@ import android.text.SpannableString; import android.text.Spanned; import android.text.TextUtils; import android.text.style.StyleSpan; +import android.view.View; import android.widget.RemoteViews; import android.widget.RemoteViewsService; @@ -40,6 +41,9 @@ public class WidgetUnifiedRemoteViewsFactory implements RemoteViewsService.Remot private Context context; private int appWidgetId; + private long account; + private boolean unseen; + private boolean flagged; private List messages = new ArrayList<>(); WidgetUnifiedRemoteViewsFactory(final Context context, Intent intent) { @@ -59,11 +63,17 @@ public class WidgetUnifiedRemoteViewsFactory implements RemoteViewsService.Remot Log.i("Widget factory changed id=" + appWidgetId); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - boolean unseen = prefs.getBoolean("widget." + appWidgetId + ".unseen", false); - boolean flagged = prefs.getBoolean("widget." + appWidgetId + ".flagged", false); + account = prefs.getLong("widget." + appWidgetId + ".account", -1L); + unseen = prefs.getBoolean("widget." + appWidgetId + ".unseen", false); + flagged = prefs.getBoolean("widget." + appWidgetId + ".flagged", false); + + messages.clear(); DB db = DB.getInstance(context); - messages = db.message().getWidgetUnified(unseen, flagged); + List wmessages = db.message().getWidgetUnified(unseen, flagged); + for (TupleMessageWidget wmessage : wmessages) + if (account < 0 || wmessage.account == account) + messages.add(wmessage); } @Override @@ -96,22 +106,23 @@ public class WidgetUnifiedRemoteViewsFactory implements RemoteViewsService.Remot if (message.unseen > 1) froms = context.getString(R.string.title_name_count, froms, Integer.toString(message.unseen)); - SpannableString from = new SpannableString(froms); - SpannableString time = new SpannableString(Helper.getRelativeTimeSpanString(context, message.received)); - SpannableString subject = new SpannableString(TextUtils.isEmpty(message.subject) ? "" : message.subject); - SpannableString account = new SpannableString(TextUtils.isEmpty(message.accountName) ? "" : message.accountName); + SpannableString ssFrom = new SpannableString(froms); + SpannableString ssTime = new SpannableString(Helper.getRelativeTimeSpanString(context, message.received)); + SpannableString ssSubject = new SpannableString(TextUtils.isEmpty(message.subject) ? "" : message.subject); + SpannableString ssAccount = new SpannableString(TextUtils.isEmpty(message.accountName) ? "" : message.accountName); if (!message.ui_seen) { - from.setSpan(new StyleSpan(Typeface.BOLD), 0, from.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); - time.setSpan(new StyleSpan(Typeface.BOLD), 0, time.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); - subject.setSpan(new StyleSpan(Typeface.BOLD), 0, subject.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); - account.setSpan(new StyleSpan(Typeface.BOLD), 0, account.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); + ssFrom.setSpan(new StyleSpan(Typeface.BOLD), 0, ssFrom.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); + ssTime.setSpan(new StyleSpan(Typeface.BOLD), 0, ssTime.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); + ssSubject.setSpan(new StyleSpan(Typeface.BOLD), 0, ssSubject.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); + ssAccount.setSpan(new StyleSpan(Typeface.BOLD), 0, ssAccount.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); } - views.setTextViewText(R.id.tvFrom, from); - views.setTextViewText(R.id.tvTime, time); - views.setTextViewText(R.id.tvSubject, subject); - views.setTextViewText(R.id.tvAccount, account); + views.setTextViewText(R.id.tvFrom, ssFrom); + views.setTextViewText(R.id.tvTime, ssTime); + views.setTextViewText(R.id.tvSubject, ssSubject); + views.setTextViewText(R.id.tvAccount, ssAccount); + views.setViewVisibility(R.id.tvAccount, account < 0 ? View.VISIBLE : View.GONE); } catch (Throwable ex) { Log.e(ex); } diff --git a/app/src/main/res/layout/activity_widget_unified.xml b/app/src/main/res/layout/activity_widget_unified.xml index 21d5a4b67c..e9ec03f54f 100644 --- a/app/src/main/res/layout/activity_widget_unified.xml +++ b/app/src/main/res/layout/activity_widget_unified.xml @@ -5,13 +5,31 @@ android:layout_height="match_parent" android:padding="12dp"> + + + + + app:layout_constraintTop_toBottomOf="@+id/spAccount" /> + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 42fadd6600..ee0f3cb497 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -864,6 +864,8 @@ starred snoozed + Account + All Unread messages only Starred messages only