From 06212ba5ff6c1d23bb9b1861d082dea75facf550 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 26 Mar 2021 07:51:53 +0100 Subject: [PATCH] Select sync widget background color --- app/src/fdroid/AndroidManifest.xml | 9 ++ app/src/github/AndroidManifest.xml | 9 ++ app/src/main/AndroidManifest.xml | 9 ++ .../eu/faircode/email/ActivityWidgetSync.java | 137 ++++++++++++++++++ .../java/eu/faircode/email/WidgetSync.java | 40 ++++- .../main/res/layout/activity_widget_sync.xml | 44 ++++++ app/src/main/res/xml/widget_sync.xml | 1 + app/src/play/AndroidManifest.xml | 9 ++ 8 files changed, 256 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/eu/faircode/email/ActivityWidgetSync.java create mode 100644 app/src/main/res/layout/activity_widget_sync.xml diff --git a/app/src/fdroid/AndroidManifest.xml b/app/src/fdroid/AndroidManifest.xml index e604a1c578..170f1dbc98 100644 --- a/app/src/fdroid/AndroidManifest.xml +++ b/app/src/fdroid/AndroidManifest.xml @@ -175,6 +175,15 @@ + + + + + + + diff --git a/app/src/github/AndroidManifest.xml b/app/src/github/AndroidManifest.xml index e604a1c578..170f1dbc98 100644 --- a/app/src/github/AndroidManifest.xml +++ b/app/src/github/AndroidManifest.xml @@ -175,6 +175,15 @@ + + + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c2f0edeb7c..12851ed2c9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -175,6 +175,15 @@ + + + + + + + diff --git a/app/src/main/java/eu/faircode/email/ActivityWidgetSync.java b/app/src/main/java/eu/faircode/email/ActivityWidgetSync.java new file mode 100644 index 0000000000..1987a67dbf --- /dev/null +++ b/app/src/main/java/eu/faircode/email/ActivityWidgetSync.java @@ -0,0 +1,137 @@ +package eu.faircode.email; + +/* + This file is part of FairEmail. + + FairEmail is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + FairEmail is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FairEmail. If not, see . + + Copyright 2018-2021 by Marcel Bokhorst (M66B) +*/ + +import android.appwidget.AppWidgetManager; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; + +import androidx.preference.PreferenceManager; + +import com.flask.colorpicker.ColorPickerView; +import com.flask.colorpicker.builder.ColorPickerClickListener; +import com.flask.colorpicker.builder.ColorPickerDialogBuilder; + +public class ActivityWidgetSync extends ActivityBase { + private int appWidgetId; + + private CheckBox cbSemiTransparent; + private Button btnColor; + private Button btnSave; + + private int background = Color.TRANSPARENT; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Bundle extras = getIntent().getExtras(); + if (extras == null) { + finish(); + return; + } + + if (savedInstanceState != null) + background = savedInstanceState.getInt("fair:color"); + + appWidgetId = extras.getInt( + AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + + getSupportActionBar().setSubtitle(R.string.title_widget_title_sync); + setContentView(R.layout.activity_widget_sync); + + cbSemiTransparent = findViewById(R.id.cbSemiTransparent); + btnColor = findViewById(R.id.btnColor); + btnSave = findViewById(R.id.btnSave); + + final Intent resultValue = new Intent(); + resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + + cbSemiTransparent.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + btnColor.setEnabled(!isChecked); + } + }); + + btnColor.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + int editTextColor = Helper.resolveColor(ActivityWidgetSync.this, android.R.attr.editTextColor); + + ColorPickerDialogBuilder + .with(ActivityWidgetSync.this) + .setTitle(R.string.title_widget_background) + .showColorEdit(true) + .setColorEditTextColor(editTextColor) + .wheelType(ColorPickerView.WHEEL_TYPE.FLOWER) + .density(6) + .lightnessSliderOnly() + .setPositiveButton(android.R.string.ok, new ColorPickerClickListener() { + @Override + public void onClick(DialogInterface dialog, int selectedColor, Integer[] allColors) { + background = selectedColor; + } + }) + .setNegativeButton(R.string.title_reset, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + background = Color.TRANSPARENT; + } + }) + .build() + .show(); + } + }); + + btnSave.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ActivityWidgetSync.this); + SharedPreferences.Editor editor = prefs.edit(); + editor.putBoolean("widget." + appWidgetId + ".semi", cbSemiTransparent.isChecked()); + editor.putInt("widget." + appWidgetId + ".background", background); + editor.apply(); + + WidgetSync.init(ActivityWidgetSync.this, appWidgetId); + + setResult(RESULT_OK, resultValue); + finish(); + } + }); + + btnColor.setEnabled(!cbSemiTransparent.isChecked()); + + setResult(RESULT_CANCELED, resultValue); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + outState.putInt("fair:color", background); + super.onSaveInstanceState(outState); + } +} diff --git a/app/src/main/java/eu/faircode/email/WidgetSync.java b/app/src/main/java/eu/faircode/email/WidgetSync.java index 1f6c7f4576..05c7fe95c8 100644 --- a/app/src/main/java/eu/faircode/email/WidgetSync.java +++ b/app/src/main/java/eu/faircode/email/WidgetSync.java @@ -26,8 +26,10 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.graphics.Color; import android.widget.RemoteViews; +import androidx.core.graphics.ColorUtils; import androidx.preference.PreferenceManager; public class WidgetSync extends AppWidgetProvider { @@ -39,17 +41,51 @@ public class WidgetSync extends AppWidgetProvider { try { Intent intent = new Intent(enabled ? ServiceExternal.ACTION_DISABLE : ServiceExternal.ACTION_ENABLE); PendingIntent pi = PendingIntent.getService(context, ServiceExternal.PI_WIDGET_ENABLE, intent, PendingIntent.FLAG_UPDATE_CURRENT); - for (int id : appWidgetIds) { + for (int appWidgetId : appWidgetIds) { + boolean semi = prefs.getBoolean("widget." + appWidgetId + ".semi", true); + int background = prefs.getInt("widget." + appWidgetId + ".background", Color.TRANSPARENT); + RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_sync); views.setOnClickPendingIntent(R.id.ivSync, pi); views.setImageViewResource(R.id.ivSync, enabled ? R.drawable.twotone_sync_24 : R.drawable.twotone_sync_disabled_24); - appWidgetManager.updateAppWidget(id, views); + + if (!semi) + views.setInt(R.id.widget, "setBackgroundColor", background); + + if (!semi && background != Color.TRANSPARENT) { + float lum = (float) ColorUtils.calculateLuminance(background); + if (lum > 0.7f) + views.setInt(R.id.ivSync, "setColorFilter", Color.BLACK); + } + + appWidgetManager.updateAppWidget(appWidgetId, views); } } catch (Throwable ex) { Log.e(ex); } } + @Override + public void onDeleted(Context context, int[] appWidgetIds) { + try { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + SharedPreferences.Editor editor = prefs.edit(); + for (int appWidgetId : appWidgetIds) { + String prefix = "widget." + appWidgetId + "."; + for (String key : prefs.getAll().keySet()) + if (key.startsWith(prefix)) + editor.remove(key); + } + editor.apply(); + } catch (Throwable ex) { + Log.e(ex); + } + } + + static void init(Context context, int appWidgetId) { + update(context); + } + static void update(Context context) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); if (appWidgetManager == null) { diff --git a/app/src/main/res/layout/activity_widget_sync.xml b/app/src/main/res/layout/activity_widget_sync.xml new file mode 100644 index 0000000000..ad5de8635a --- /dev/null +++ b/app/src/main/res/layout/activity_widget_sync.xml @@ -0,0 +1,44 @@ + + + + + + + +