package com.simplemobiletools.calculator.activities import android.app.Activity import android.appwidget.AppWidgetManager import android.content.Intent import android.content.res.ColorStateList import android.graphics.Color import android.os.Bundle import android.widget.RemoteViews import android.widget.SeekBar import android.widget.TextView import com.simplemobiletools.calculator.R import com.simplemobiletools.calculator.databinding.WidgetConfigBinding import com.simplemobiletools.calculator.extensions.config import com.simplemobiletools.calculator.extensions.viewBinding import com.simplemobiletools.calculator.helpers.MyWidgetProvider import com.simplemobiletools.commons.dialogs.ColorPickerDialog import com.simplemobiletools.commons.dialogs.FeatureLockedDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.IS_CUSTOMIZING_COLORS class WidgetConfigureActivity : SimpleActivity() { private var mBgAlpha = 0f private var mWidgetId = 0 private var mBgColor = 0 private var mTextColor = 0 private var mBgColorWithoutTransparency = 0 private var mFeatureLockedDialog: FeatureLockedDialog? = null private val binding by viewBinding(WidgetConfigBinding::inflate) public override fun onCreate(savedInstanceState: Bundle?) { useDynamicTheme = false super.onCreate(savedInstanceState) setResult(Activity.RESULT_CANCELED) setContentView(binding.root) 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() } binding.configSave.setOnClickListener { saveConfig() } binding.configBgColor.setOnClickListener { pickBackgroundColor() } binding.configTextColor.setOnClickListener { pickTextColor() } val primaryColor = getProperPrimaryColor() binding.configBgSeekbar.setColors(mTextColor, primaryColor, primaryColor) if (!isCustomizingColors && !isOrWasThankYouInstalled()) { mFeatureLockedDialog = FeatureLockedDialog(this) { if (!isOrWasThankYouInstalled()) { finish() } } } } override fun onResume() { super.onResume() window.decorView.setBackgroundColor(0) if (mFeatureLockedDialog != null && isOrWasThankYouInstalled()) { mFeatureLockedDialog?.dismissDialog() } } private fun initVariables() { mBgColor = config.widgetBgColor mBgAlpha = Color.alpha(mBgColor) / 255.toFloat() binding.configCalc.btnReset.beVisible() mBgColorWithoutTransparency = Color.rgb(Color.red(mBgColor), Color.green(mBgColor), Color.blue(mBgColor)) binding.configBgSeekbar.setOnSeekBarChangeListener(seekbarChangeListener) binding.configBgSeekbar.progress = (mBgAlpha * 100).toInt() updateBackgroundColor() mTextColor = config.widgetTextColor if (mTextColor == resources.getColor(com.simplemobiletools.commons.R.color.default_widget_text_color, theme) && config.isUsingSystemTheme) { mTextColor = resources.getColor(com.simplemobiletools.commons.R.color.you_primary_color, theme) } updateTextColor() binding.configCalc.formula.text = "15,937*5" binding.configCalc.result.text = "79,685" } private fun saveConfig() { val appWidgetManager = AppWidgetManager.getInstance(this) ?: return val views = RemoteViews(packageName, R.layout.widget).apply { applyColorFilter(binding.widgetBackground.id, mBgColor) } appWidgetManager.updateAppWidget(mWidgetId, views) storeWidgetColors() requestWidgetUpdate() Intent().apply { putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mWidgetId) setResult(Activity.RESULT_OK, this) } finish() } private fun storeWidgetColors() { config.apply { widgetBgColor = mBgColor widgetTextColor = mTextColor } } private fun requestWidgetUpdate() { Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, MyWidgetProvider::class.java).apply { putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(mWidgetId)) sendBroadcast(this) } } private fun updateBackgroundColor() { mBgColor = mBgColorWithoutTransparency.adjustAlpha(mBgAlpha) binding.widgetBackground.applyColorFilter(mBgColor) binding.configBgColor.setFillWithStroke(mBgColor, mBgColor) binding.configSave.backgroundTintList = ColorStateList.valueOf(getProperPrimaryColor()) } private fun updateTextColor() { binding.configTextColor.setFillWithStroke(mTextColor, mTextColor) val viewIds = intArrayOf( R.id.btn_0, R.id.btn_1, R.id.btn_2, R.id.btn_3, R.id.btn_4, R.id.btn_5, R.id.btn_6, R.id.btn_7, R.id.btn_8, R.id.btn_9, R.id.btn_percent, R.id.btn_power, R.id.btn_root, R.id.btn_clear, R.id.btn_reset, R.id.btn_divide, R.id.btn_multiply, R.id.btn_minus, R.id.btn_plus, R.id.btn_decimal, R.id.btn_equals ) binding.configCalc.result.setTextColor(mTextColor) binding.configCalc.formula.setTextColor(mTextColor) binding.configSave.setTextColor(getProperPrimaryColor().getContrastColor()) viewIds.forEach { (findViewById(it)).setTextColor(mTextColor) (findViewById(it)).background = null } } private fun pickBackgroundColor() { ColorPickerDialog(this, mBgColorWithoutTransparency) { wasPositivePressed, color -> if (wasPositivePressed) { mBgColorWithoutTransparency = color updateBackgroundColor() } } } private fun pickTextColor() { ColorPickerDialog(this, mTextColor) { wasPositivePressed, color -> if (wasPositivePressed) { mTextColor = color updateTextColor() } } } private val seekbarChangeListener = 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) {} } }