From afcb9825b3ccea6c761ea9d5c4dce039ee1bd210 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 4 May 2020 22:32:59 +0200 Subject: [PATCH] fix #993, adding a widget showing just the current date --- app/src/main/AndroidManifest.xml | 21 +++ .../activities/WidgetDateConfigureActivity.kt | 141 ++++++++++++++++++ .../calendar/pro/extensions/Context.kt | 12 ++ .../calendar/pro/helpers/Formatter.kt | 5 + .../pro/helpers/MyWidgetDateProvider.kt | 46 ++++++ .../main/res/layout/widget_config_date.xml | 84 +++++++++++ app/src/main/res/layout/widget_date.xml | 41 +++++ app/src/main/res/xml/widget_date_info.xml | 11 ++ 8 files changed, 361 insertions(+) create mode 100644 app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/WidgetDateConfigureActivity.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MyWidgetDateProvider.kt create mode 100644 app/src/main/res/layout/widget_config_date.xml create mode 100644 app/src/main/res/layout/widget_date.xml create mode 100644 app/src/main/res/xml/widget_date_info.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cee3b05d5..e7fa284c8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -94,6 +94,15 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/WidgetDateConfigureActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/WidgetDateConfigureActivity.kt new file mode 100644 index 000000000..8852bb13d --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/activities/WidgetDateConfigureActivity.kt @@ -0,0 +1,141 @@ +package com.simplemobiletools.calendar.pro.activities + +import android.app.Activity +import android.appwidget.AppWidgetManager +import android.content.Intent +import android.graphics.Color +import android.os.Bundle +import android.widget.SeekBar +import com.simplemobiletools.calendar.pro.R +import com.simplemobiletools.calendar.pro.extensions.config +import com.simplemobiletools.calendar.pro.helpers.Formatter +import com.simplemobiletools.calendar.pro.helpers.LOW_ALPHA +import com.simplemobiletools.calendar.pro.helpers.MyWidgetDateProvider +import com.simplemobiletools.commons.dialogs.ColorPickerDialog +import com.simplemobiletools.commons.extensions.adjustAlpha +import com.simplemobiletools.commons.extensions.applyColorFilter +import com.simplemobiletools.commons.extensions.setFillWithStroke +import kotlinx.android.synthetic.main.widget_config_date.* + +class WidgetDateConfigureActivity : SimpleActivity() { + private var mBgAlpha = 0f + private var mWidgetId = 0 + private var mBgColorWithoutTransparency = 0 + private var mBgColor = 0 + private var mTextColorWithoutTransparency = 0 + private var mTextColor = 0 + private var mWeakTextColor = 0 + private var mPrimaryColor = 0 + + public override fun onCreate(savedInstanceState: Bundle?) { + useDynamicTheme = false + super.onCreate(savedInstanceState) + setResult(Activity.RESULT_CANCELED) + setContentView(R.layout.widget_config_date) + initVariables() + + val extras = intent.extras + if (extras != null) + mWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID) + + if (mWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) + finish() + + config_save.setOnClickListener { saveConfig() } + config_bg_color.setOnClickListener { pickBackgroundColor() } + config_text_color.setOnClickListener { pickTextColor() } + config_bg_seekbar.setColors(mTextColor, mPrimaryColor, mPrimaryColor) + widget_date_label.text = Formatter.getTodayDayNumber() + widget_month_label.text = Formatter.getCurrentMonthShort() + } + + override fun onResume() { + super.onResume() + window.decorView.setBackgroundColor(0) + } + + private fun initVariables() { + mTextColorWithoutTransparency = config.widgetTextColor + updateColors() + + mBgColor = config.widgetBgColor + mBgAlpha = Color.alpha(mBgColor) / 255.toFloat() + + mBgColorWithoutTransparency = Color.rgb(Color.red(mBgColor), Color.green(mBgColor), Color.blue(mBgColor)) + config_bg_seekbar.setOnSeekBarChangeListener(bgSeekbarChangeListener) + config_bg_seekbar.progress = (mBgAlpha * 100).toInt() + updateBgColor() + } + + private fun saveConfig() { + storeWidgetColors() + requestWidgetUpdate() + + Intent().apply { + putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mWidgetId) + setResult(Activity.RESULT_OK, this) + } + finish() + } + + private fun storeWidgetColors() { + config.apply { + widgetBgColor = mBgColor + widgetTextColor = mTextColorWithoutTransparency + } + } + + private fun pickBackgroundColor() { + ColorPickerDialog(this, mBgColorWithoutTransparency) { wasPositivePressed, color -> + if (wasPositivePressed) { + mBgColorWithoutTransparency = color + updateBgColor() + } + } + } + + private fun pickTextColor() { + ColorPickerDialog(this, mTextColor) { wasPositivePressed, color -> + if (wasPositivePressed) { + mTextColorWithoutTransparency = color + updateColors() + } + } + } + + private fun requestWidgetUpdate() { + Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, MyWidgetDateProvider::class.java).apply { + putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(mWidgetId)) + sendBroadcast(this) + } + } + + private fun updateColors() { + mTextColor = mTextColorWithoutTransparency + mWeakTextColor = mTextColorWithoutTransparency.adjustAlpha(LOW_ALPHA) + mPrimaryColor = config.primaryColor + + config_text_color.setFillWithStroke(mTextColor, Color.BLACK) + config_save.setTextColor(mTextColor) + widget_date_label.setTextColor(mTextColor) + widget_month_label.setTextColor(mTextColor) + } + + private fun updateBgColor() { + mBgColor = mBgColorWithoutTransparency.adjustAlpha(mBgAlpha) + config_date_time_wrapper.background.applyColorFilter(mBgColor) + config_bg_color.setFillWithStroke(mBgColor, Color.BLACK) + config_save.setBackgroundColor(mBgColor) + } + + private val bgSeekbarChangeListener = object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { + mBgAlpha = progress.toFloat() / 100.toFloat() + updateBgColor() + } + + override fun onStartTrackingTouch(seekBar: SeekBar) {} + + override fun onStopTrackingTouch(seekBar: SeekBar) {} + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt index be7ae0fc6..f979bb15d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt @@ -56,6 +56,7 @@ fun Context.updateWidgets() { } updateListWidget() + updateDateWidget() } fun Context.updateListWidget() { @@ -69,6 +70,17 @@ fun Context.updateListWidget() { } } +fun Context.updateDateWidget() { + val widgetIDs = AppWidgetManager.getInstance(applicationContext).getAppWidgetIds(ComponentName(applicationContext, MyWidgetDateProvider::class.java)) + if (widgetIDs.isNotEmpty()) { + Intent(applicationContext, MyWidgetDateProvider::class.java).apply { + action = AppWidgetManager.ACTION_APPWIDGET_UPDATE + putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIDs) + sendBroadcast(this) + } + } +} + fun Context.scheduleAllEvents() { val events = eventsDB.getEventsAtReboot(getNowSeconds()) events.forEach { diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt index 5a2dd697f..e24ffcf82 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Formatter.kt @@ -13,6 +13,7 @@ object Formatter { const val DAYCODE_PATTERN = "YYYYMMdd" const val YEAR_PATTERN = "YYYY" const val TIME_PATTERN = "HHmmss" + private const val MONTH_PATTERN = "MMM" private const val DAY_PATTERN = "d" private const val DAY_OF_WEEK_PATTERN = "EEE" private const val LONGEST_PATTERN = "MMMM d YYYY (EEEE)" @@ -60,6 +61,10 @@ object Formatter { fun getTodayCode() = getDayCodeFromTS(getNowSeconds()) + fun getTodayDayNumber() = getDateTimeFromTS(getNowSeconds()).toString(DAY_PATTERN) + + fun getCurrentMonthShort() = getDateTimeFromTS(getNowSeconds()).toString(MONTH_PATTERN) + fun getHours(context: Context, dateTime: DateTime) = dateTime.toString(getHourPattern(context)) fun getTime(context: Context, dateTime: DateTime) = dateTime.toString(getTimePattern(context)) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MyWidgetDateProvider.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MyWidgetDateProvider.kt new file mode 100644 index 000000000..eef8a9ada --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/MyWidgetDateProvider.kt @@ -0,0 +1,46 @@ +package com.simplemobiletools.calendar.pro.helpers + +import android.app.PendingIntent +import android.appwidget.AppWidgetManager +import android.appwidget.AppWidgetProvider +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.widget.RemoteViews +import com.simplemobiletools.calendar.pro.R +import com.simplemobiletools.calendar.pro.activities.SplashActivity +import com.simplemobiletools.calendar.pro.extensions.config +import com.simplemobiletools.commons.extensions.applyColorFilter +import com.simplemobiletools.commons.extensions.getLaunchIntent +import com.simplemobiletools.commons.extensions.setText + +class MyWidgetDateProvider : AppWidgetProvider() { + private val OPEN_APP_INTENT_ID = 1 + + override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { + appWidgetManager.getAppWidgetIds(getComponentName(context)).forEach { + val views = RemoteViews(context.packageName, R.layout.widget_date).apply { + applyColorFilter(R.id.widget_date_background, context.config.widgetBgColor) + setText(R.id.widget_date_label, Formatter.getTodayDayNumber()) + setText(R.id.widget_month_label, Formatter.getCurrentMonthShort()) + + setTextColor(R.id.widget_date_label, context.config.widgetTextColor) + setTextColor(R.id.widget_month_label, context.config.widgetTextColor) + + setupAppOpenIntent(context, this) + appWidgetManager.updateAppWidget(it, this) + } + + appWidgetManager.notifyAppWidgetViewDataChanged(it, R.id.widget_date_holder) + } + } + + private fun getComponentName(context: Context) = ComponentName(context, MyWidgetDateProvider::class.java) + + private fun setupAppOpenIntent(context: Context, views: RemoteViews) { + (context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)).apply { + val pendingIntent = PendingIntent.getActivity(context, OPEN_APP_INTENT_ID, this, PendingIntent.FLAG_UPDATE_CURRENT) + views.setOnClickPendingIntent(R.id.widget_date_holder, pendingIntent) + } + } +} diff --git a/app/src/main/res/layout/widget_config_date.xml b/app/src/main/res/layout/widget_config_date.xml new file mode 100644 index 000000000..2a3e5e892 --- /dev/null +++ b/app/src/main/res/layout/widget_config_date.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + +