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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/widget_date.xml b/app/src/main/res/layout/widget_date.xml
new file mode 100644
index 000000000..d7e63569f
--- /dev/null
+++ b/app/src/main/res/layout/widget_date.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/widget_date_info.xml b/app/src/main/res/xml/widget_date_info.xml
new file mode 100644
index 000000000..c991f536d
--- /dev/null
+++ b/app/src/main/res/xml/widget_date_info.xml
@@ -0,0 +1,11 @@
+
+