Select widget account

pull/162/head
M66B 5 years ago
parent 7b7b7a4189
commit fcd3c5c15a

@ -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

@ -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<EntityAccount> 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<EntityAccount>());
adapter.setDropDownViewResource(R.layout.spinner_item1_dropdown);
spAccount.setAdapter(adapter);
grpReady.setVisibility(View.GONE);
pbWait.setVisibility(View.VISIBLE);
setResult(RESULT_CANCELED, resultValue);
new SimpleTask<List<EntityAccount>>() {
@Override
protected List<EntityAccount> onExecute(Context context, Bundle args) {
DB db = DB.getInstance(context);
return db.account().getSynchronizingAccounts();
}
@Override
protected void onExecuted(Bundle args, List<EntityAccount> 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");
}
}

@ -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);
}
}
}

@ -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);
}
}
}

@ -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<TupleMessageWidget> 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<TupleMessageWidget> 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);
}

@ -5,13 +5,31 @@
android:layout_height="match_parent"
android:padding="12dp">
<TextView
android:id="@+id/tvAccount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/title_widget_account"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Spinner
android:id="@+id/spAccount"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvAccount" />
<CheckBox
android:id="@+id/cbUnseen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/title_widget_unseen"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toBottomOf="@+id/spAccount" />
<CheckBox
android:id="@+id/cbFlagged"
@ -30,4 +48,21 @@
android:text="@string/title_save"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbFlagged" />
<eu.faircode.email.ContentLoadingProgressBar
android:id="@+id/pbWait"
style="@style/Base.Widget.AppCompat.ProgressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Group
android:id="@+id/grpReady"
android:layout_width="0dp"
android:layout_height="0dp"
app:constraint_referenced_ids="tvAccount,spAccount,cbUnseen,cbFlagged,btnSave" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -864,6 +864,8 @@
<string name="title_search_special_flagged">starred</string>
<string name="title_search_special_snoozed">snoozed</string>
<string name="title_widget_account">Account</string>
<string name="title_widget_account_all">All</string>
<string name="title_widget_unseen">Unread messages only</string>
<string name="title_widget_flagged">Starred messages only</string>

Loading…
Cancel
Save