diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 046af900..62f5a052 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -79,7 +79,16 @@ android:theme="@style/Theme.Transparent" /> + + + + + + @@ -108,7 +117,7 @@ @@ -122,6 +131,21 @@ android:resource="@xml/widget_digital_clock_info" /> + + + + + + + + + + diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/clock/activities/SettingsActivity.kt index a15ed0fb..c2195c22 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/activities/SettingsActivity.kt @@ -178,7 +178,7 @@ class SettingsActivity : SimpleActivity() { private fun setupCustomizeWidgetColors() { settings_customize_widget_colors_holder.setOnClickListener { - Intent(this, WidgetDateTimeConfigureActivity::class.java).apply { + Intent(this, WidgetDigitalConfigureActivity::class.java).apply { putExtra(IS_CUSTOMIZING_COLORS, true) startActivity(this) } diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/activities/WidgetAnalogueConfigureActivity.kt b/app/src/main/kotlin/com/simplemobiletools/clock/activities/WidgetAnalogueConfigureActivity.kt new file mode 100644 index 00000000..d045375d --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/clock/activities/WidgetAnalogueConfigureActivity.kt @@ -0,0 +1,123 @@ +package com.simplemobiletools.clock.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.clock.R +import com.simplemobiletools.clock.extensions.config +import com.simplemobiletools.clock.helpers.MyAnalogueTimeWidgetProvider +import com.simplemobiletools.commons.dialogs.ColorPickerDialog +import com.simplemobiletools.commons.dialogs.WidgetLockedDialog +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.IS_CUSTOMIZING_COLORS +import kotlinx.android.synthetic.main.widget_config_analogue.* + +class WidgetAnalogueConfigureActivity : SimpleActivity() { + private var mBgAlpha = 0f + private var mWidgetId = 0 + private var mBgColor = 0 + private var mBgColorWithoutTransparency = 0 + private var mWidgetLockedDialog: WidgetLockedDialog? = null + + public override fun onCreate(savedInstanceState: Bundle?) { + useDynamicTheme = false + super.onCreate(savedInstanceState) + setResult(Activity.RESULT_CANCELED) + setContentView(R.layout.widget_config_analogue) + initVariables() + + val isCustomizingColors = intent.extras?.getBoolean(IS_CUSTOMIZING_COLORS) ?: false + mWidgetId = intent.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: AppWidgetManager.INVALID_APPWIDGET_ID + + if (mWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID && !isCustomizingColors) { + finish() + } + + config_analogue_save.setOnClickListener { saveConfig() } + config_analogue_bg_color.setOnClickListener { pickBackgroundColor() } + + val primaryColor = getProperPrimaryColor() + config_analogue_bg_seekbar.setColors(getProperTextColor(), primaryColor, primaryColor) + + if (!isCustomizingColors && !isOrWasThankYouInstalled()) { + mWidgetLockedDialog = WidgetLockedDialog(this) { + if (!isOrWasThankYouInstalled()) { + finish() + } + } + } + } + + override fun onResume() { + super.onResume() + window.decorView.setBackgroundColor(0) + + if (mWidgetLockedDialog != null && isOrWasThankYouInstalled()) { + mWidgetLockedDialog?.dismissDialog() + } + } + + private fun initVariables() { + mBgColor = config.widgetBgColor + mBgAlpha = Color.alpha(mBgColor) / 255.toFloat() + mBgColorWithoutTransparency = Color.rgb(Color.red(mBgColor), Color.green(mBgColor), Color.blue(mBgColor)) + + config_analogue_bg_seekbar.setOnSeekBarChangeListener(bgSeekbarChangeListener) + config_analogue_bg_seekbar.progress = (mBgAlpha * 100).toInt() + updateBackgroundColor() + } + + 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 + } + } + + private fun pickBackgroundColor() { + ColorPickerDialog(this, mBgColorWithoutTransparency) { wasPositivePressed, color -> + if (wasPositivePressed) { + mBgColorWithoutTransparency = color + updateBackgroundColor() + } + } + } + + private fun requestWidgetUpdate() { + Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, MyAnalogueTimeWidgetProvider::class.java).apply { + putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(mWidgetId)) + sendBroadcast(this) + } + } + + private fun updateBackgroundColor() { + mBgColor = mBgColorWithoutTransparency.adjustAlpha(mBgAlpha) + config_analogue_bg_color.setFillWithStroke(mBgColor, Color.BLACK) + config_analogue_background.applyColorFilter(mBgColor) + config_analogue_save.setBackgroundColor(mBgColor) + } + + private val bgSeekbarChangeListener = object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { + mBgAlpha = progress.toFloat() / 100.toFloat() + updateBackgroundColor() + } + + override fun onStartTrackingTouch(seekBar: SeekBar) {} + + override fun onStopTrackingTouch(seekBar: SeekBar) {} + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/activities/WidgetDateTimeConfigureActivity.kt b/app/src/main/kotlin/com/simplemobiletools/clock/activities/WidgetDigitalConfigureActivity.kt similarity index 73% rename from app/src/main/kotlin/com/simplemobiletools/clock/activities/WidgetDateTimeConfigureActivity.kt rename to app/src/main/kotlin/com/simplemobiletools/clock/activities/WidgetDigitalConfigureActivity.kt index 9a7b3a11..63e5479e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/activities/WidgetDateTimeConfigureActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/activities/WidgetDigitalConfigureActivity.kt @@ -9,17 +9,15 @@ import android.widget.SeekBar import com.simplemobiletools.clock.R import com.simplemobiletools.clock.extensions.config import com.simplemobiletools.clock.extensions.getFormattedDate -import com.simplemobiletools.clock.extensions.getFormattedTime -import com.simplemobiletools.clock.helpers.MyWidgetDateTimeProvider -import com.simplemobiletools.clock.helpers.getPassedSeconds +import com.simplemobiletools.clock.helpers.MyDigitalTimeWidgetProvider import com.simplemobiletools.commons.dialogs.ColorPickerDialog import com.simplemobiletools.commons.dialogs.WidgetLockedDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.IS_CUSTOMIZING_COLORS -import kotlinx.android.synthetic.main.widget_config_date_time.* +import kotlinx.android.synthetic.main.widget_config_digital.* import java.util.* -class WidgetDateTimeConfigureActivity : SimpleActivity() { +class WidgetDigitalConfigureActivity : SimpleActivity() { private var mBgAlpha = 0f private var mWidgetId = 0 private var mBgColor = 0 @@ -31,7 +29,7 @@ class WidgetDateTimeConfigureActivity : SimpleActivity() { useDynamicTheme = false super.onCreate(savedInstanceState) setResult(Activity.RESULT_CANCELED) - setContentView(R.layout.widget_config_date_time) + setContentView(R.layout.widget_config_digital) initVariables() val isCustomizingColors = intent.extras?.getBoolean(IS_CUSTOMIZING_COLORS) ?: false @@ -41,12 +39,12 @@ class WidgetDateTimeConfigureActivity : SimpleActivity() { finish() } - config_save.setOnClickListener { saveConfig() } - config_bg_color.setOnClickListener { pickBackgroundColor() } - config_text_color.setOnClickListener { pickTextColor() } + config_digital_save.setOnClickListener { saveConfig() } + config_digital_bg_color.setOnClickListener { pickBackgroundColor() } + config_digital_text_color.setOnClickListener { pickTextColor() } val primaryColor = getProperPrimaryColor() - config_bg_seekbar.setColors(mTextColor, primaryColor, primaryColor) + config_digital_bg_seekbar.setColors(mTextColor, primaryColor, primaryColor) if (!isCustomizingColors && !isOrWasThankYouInstalled()) { mWidgetLockedDialog = WidgetLockedDialog(this) { @@ -71,8 +69,8 @@ class WidgetDateTimeConfigureActivity : SimpleActivity() { 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() + config_digital_bg_seekbar.setOnSeekBarChangeListener(bgSeekbarChangeListener) + config_digital_bg_seekbar.progress = (mBgAlpha * 100).toInt() updateBackgroundColor() updateCurrentDateTime() @@ -81,11 +79,7 @@ class WidgetDateTimeConfigureActivity : SimpleActivity() { } private fun updateCurrentDateTime() { - val calendar = Calendar.getInstance() - config_time.text = getFormattedTime(getPassedSeconds(), false, false).toString() - config_date.text = getFormattedDate(calendar) - config_time.setShadowLayer(1f, 0f, 1f, Color.BLACK) - config_date.setShadowLayer(1f, 0f, 1f, Color.BLACK) + config_digital_date.text = getFormattedDate(Calendar.getInstance()) } private fun saveConfig() { @@ -125,24 +119,24 @@ class WidgetDateTimeConfigureActivity : SimpleActivity() { } private fun requestWidgetUpdate() { - Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, MyWidgetDateTimeProvider::class.java).apply { + Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, MyDigitalTimeWidgetProvider::class.java).apply { putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(mWidgetId)) sendBroadcast(this) } } private fun updateTextColor() { - config_text_color.setFillWithStroke(mTextColor, Color.BLACK) - config_save.setTextColor(mTextColor) - config_time.setTextColor(mTextColor) - config_date.setTextColor(mTextColor) + config_digital_text_color.setFillWithStroke(mTextColor, Color.BLACK) + config_digital_save.setTextColor(mTextColor) + config_digital_time.setTextColor(mTextColor) + config_digital_date.setTextColor(mTextColor) } private fun updateBackgroundColor() { mBgColor = mBgColorWithoutTransparency.adjustAlpha(mBgAlpha) - config_bg_color.setFillWithStroke(mBgColor, Color.BLACK) - config_background.applyColorFilter(mBgColor) - config_save.setBackgroundColor(mBgColor) + config_digital_bg_color.setFillWithStroke(mBgColor, Color.BLACK) + config_digital_background.applyColorFilter(mBgColor) + config_digital_save.setBackgroundColor(mBgColor) } private val bgSeekbarChangeListener = object : SeekBar.OnSeekBarChangeListener { diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Context.kt index f7456d1a..b9bfac16 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Context.kt @@ -177,11 +177,29 @@ fun Context.hideNotification(id: Int) { fun Context.hideTimerNotification(timerId: Int) = hideNotification(timerId) fun Context.updateWidgets() { - val component = ComponentName(applicationContext, MyWidgetDateTimeProvider::class.java) + updateDigitalWidgets() + updateAnalogueWidgets() +} + +fun Context.updateDigitalWidgets() { + val component = ComponentName(applicationContext, MyDigitalTimeWidgetProvider::class.java) val widgetIds = AppWidgetManager.getInstance(applicationContext)?.getAppWidgetIds(component) ?: return if (widgetIds.isNotEmpty()) { val ids = intArrayOf(R.xml.widget_digital_clock_info) - Intent(applicationContext, MyWidgetDateTimeProvider::class.java).apply { + Intent(applicationContext, MyDigitalTimeWidgetProvider::class.java).apply { + action = AppWidgetManager.ACTION_APPWIDGET_UPDATE + putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids) + sendBroadcast(this) + } + } +} + +fun Context.updateAnalogueWidgets() { + val component = ComponentName(applicationContext, MyAnalogueTimeWidgetProvider::class.java) + val widgetIds = AppWidgetManager.getInstance(applicationContext)?.getAppWidgetIds(component) ?: return + if (widgetIds.isNotEmpty()) { + val ids = intArrayOf(R.xml.widget_analogue_clock_info) + Intent(applicationContext, MyAnalogueTimeWidgetProvider::class.java).apply { action = AppWidgetManager.ACTION_APPWIDGET_UPDATE putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids) sendBroadcast(this) diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyAnalogueTimeWidgetProvider.kt b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyAnalogueTimeWidgetProvider.kt new file mode 100644 index 00000000..f8a79b2f --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyAnalogueTimeWidgetProvider.kt @@ -0,0 +1,54 @@ +package com.simplemobiletools.clock.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.os.Bundle +import android.widget.RemoteViews +import com.simplemobiletools.clock.R +import com.simplemobiletools.clock.activities.SplashActivity +import com.simplemobiletools.clock.extensions.config +import com.simplemobiletools.commons.extensions.applyColorFilter +import com.simplemobiletools.commons.extensions.getLaunchIntent + +class MyAnalogueTimeWidgetProvider : AppWidgetProvider() { + override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { + super.onUpdate(context, appWidgetManager, appWidgetIds) + performUpdate(context) + } + + private fun performUpdate(context: Context) { + val appWidgetManager = AppWidgetManager.getInstance(context) ?: return + appWidgetManager.getAppWidgetIds(getComponentName(context)).forEach { + RemoteViews(context.packageName, R.layout.widget_analogue).apply { + updateColors(context, this) + setupAppOpenIntent(context, this) + appWidgetManager.updateAppWidget(it, this) + } + } + } + + private fun updateColors(context: Context, views: RemoteViews) { + views.apply { + applyColorFilter(R.id.widget_background, context.config.widgetBgColor) + } + } + + private fun getComponentName(context: Context) = ComponentName(context, this::class.java) + + private fun setupAppOpenIntent(context: Context, views: RemoteViews) { + (context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)).apply { + putExtra(OPEN_TAB, TAB_CLOCK) + val pendingIntent = PendingIntent.getActivity(context, OPEN_APP_INTENT_ID, this, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + views.setOnClickPendingIntent(R.id.widget_date_time_holder, pendingIntent) + } + } + + override fun onAppWidgetOptionsChanged(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int, newOptions: Bundle?) { + super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions) + performUpdate(context) + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyWidgetDateTimeProvider.kt b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyDigitalTimeWidgetProvider.kt similarity index 98% rename from app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyWidgetDateTimeProvider.kt rename to app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyDigitalTimeWidgetProvider.kt index ad6feaaa..b7804123 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyWidgetDateTimeProvider.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyDigitalTimeWidgetProvider.kt @@ -20,7 +20,7 @@ import com.simplemobiletools.commons.extensions.setText import com.simplemobiletools.commons.extensions.setVisibleIf import java.util.* -class MyWidgetDateTimeProvider : AppWidgetProvider() { +class MyDigitalTimeWidgetProvider : AppWidgetProvider() { override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { super.onUpdate(context, appWidgetManager, appWidgetIds) performUpdate(context) diff --git a/app/src/main/res/drawable-hdpi/img_widget_preview.png b/app/src/main/res/drawable-hdpi/img_digital_widget_preview.png similarity index 100% rename from app/src/main/res/drawable-hdpi/img_widget_preview.png rename to app/src/main/res/drawable-hdpi/img_digital_widget_preview.png diff --git a/app/src/main/res/drawable-xhdpi/img_widget_preview.png b/app/src/main/res/drawable-xhdpi/img_digital_widget_preview.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/img_widget_preview.png rename to app/src/main/res/drawable-xhdpi/img_digital_widget_preview.png diff --git a/app/src/main/res/drawable-xxhdpi/img_widget_preview.png b/app/src/main/res/drawable-xxhdpi/img_digital_widget_preview.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/img_widget_preview.png rename to app/src/main/res/drawable-xxhdpi/img_digital_widget_preview.png diff --git a/app/src/main/res/drawable-xxxhdpi/img_widget_preview.png b/app/src/main/res/drawable-xxxhdpi/img_digital_widget_preview.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/img_widget_preview.png rename to app/src/main/res/drawable-xxxhdpi/img_digital_widget_preview.png diff --git a/app/src/main/res/layout/widget_analogue.xml b/app/src/main/res/layout/widget_analogue.xml new file mode 100644 index 00000000..02457b9a --- /dev/null +++ b/app/src/main/res/layout/widget_analogue.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/widget_config_analogue.xml b/app/src/main/res/layout/widget_config_analogue.xml new file mode 100644 index 00000000..ab917ed0 --- /dev/null +++ b/app/src/main/res/layout/widget_config_analogue.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + +