Skip to content

Commit de1b9f2

Browse files
committed
fix #69, add a bright display widget
1 parent 9a47a82 commit de1b9f2

File tree

12 files changed

+281
-21
lines changed

12 files changed

+281
-21
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,16 @@
4040
android:theme="@style/AppTheme" />
4141

4242
<activity
43-
android:name=".activities.WidgetConfigureActivity"
43+
android:name=".activities.WidgetTorchConfigureActivity"
44+
android:screenOrientation="portrait"
45+
android:theme="@style/MyWidgetConfigTheme">
46+
<intent-filter>
47+
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
48+
</intent-filter>
49+
</activity>
50+
51+
<activity
52+
android:name=".activities.WidgetBrightDisplayConfigureActivity"
4453
android:screenOrientation="portrait"
4554
android:theme="@style/MyWidgetConfigTheme">
4655
<intent-filter>
@@ -79,7 +88,7 @@
7988
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity" />
8089

8190
<receiver
82-
android:name=".helpers.MyWidgetProvider"
91+
android:name=".helpers.MyWidgetTorchProvider"
8392
android:icon="@drawable/ic_flashlight">
8493
<intent-filter>
8594
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
@@ -90,6 +99,18 @@
9099
android:resource="@xml/widget_torch" />
91100
</receiver>
92101

102+
<receiver
103+
android:name=".helpers.MyWidgetBrightDisplayProvider"
104+
android:icon="@drawable/ic_bright_display">
105+
<intent-filter>
106+
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
107+
</intent-filter>
108+
109+
<meta-data
110+
android:name="android.appwidget.provider"
111+
android:resource="@xml/widget_bright_display" />
112+
</receiver>
113+
93114
<service
94115
android:name=".helpers.MyTileService"
95116
android:icon="@drawable/img_widget_preview"

app/src/main/kotlin/com/simplemobiletools/flashlight/activities/SettingsActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class SettingsActivity : SimpleActivity() {
5555

5656
private fun setupCustomizeWidgetColors() {
5757
settings_customize_widget_colors_holder.setOnClickListener {
58-
Intent(this, WidgetConfigureActivity::class.java).apply {
58+
Intent(this, WidgetTorchConfigureActivity::class.java).apply {
5959
putExtra(IS_CUSTOMIZING_COLORS, true)
6060
startActivity(this)
6161
}

app/src/main/kotlin/com/simplemobiletools/flashlight/activities/WidgetConfigureActivity.kt renamed to app/src/main/kotlin/com/simplemobiletools/flashlight/activities/WidgetBrightDisplayConfigureActivity.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ import com.simplemobiletools.commons.helpers.DEFAULT_WIDGET_BG_COLOR
1414
import com.simplemobiletools.commons.helpers.IS_CUSTOMIZING_COLORS
1515
import com.simplemobiletools.flashlight.R
1616
import com.simplemobiletools.flashlight.extensions.config
17-
import com.simplemobiletools.flashlight.helpers.MyWidgetProvider
18-
import kotlinx.android.synthetic.main.widget_config.*
17+
import com.simplemobiletools.flashlight.helpers.MyWidgetBrightDisplayProvider
18+
import kotlinx.android.synthetic.main.widget_bright_display_config.*
1919

20-
class WidgetConfigureActivity : SimpleActivity() {
20+
class WidgetBrightDisplayConfigureActivity : SimpleActivity() {
2121
private var mWidgetAlpha = 0f
2222
private var mWidgetId = 0
2323
private var mWidgetColor = 0
@@ -27,7 +27,7 @@ class WidgetConfigureActivity : SimpleActivity() {
2727
useDynamicTheme = false
2828
super.onCreate(savedInstanceState)
2929
setResult(Activity.RESULT_CANCELED)
30-
setContentView(R.layout.widget_config)
30+
setContentView(R.layout.widget_bright_display_config)
3131
initVariables()
3232

3333
val isCustomizingColors = intent.extras?.getBoolean(IS_CUSTOMIZING_COLORS) ?: false
@@ -76,7 +76,7 @@ class WidgetConfigureActivity : SimpleActivity() {
7676
}
7777

7878
private fun requestWidgetUpdate() {
79-
Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, MyWidgetProvider::class.java).apply {
79+
Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, MyWidgetBrightDisplayProvider::class.java).apply {
8080
putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(mWidgetId))
8181
sendBroadcast(this)
8282
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package com.simplemobiletools.flashlight.activities
2+
3+
import android.app.Activity
4+
import android.appwidget.AppWidgetManager
5+
import android.content.Intent
6+
import android.graphics.Color
7+
import android.os.Bundle
8+
import android.widget.SeekBar
9+
import com.simplemobiletools.commons.dialogs.ColorPickerDialog
10+
import com.simplemobiletools.commons.extensions.adjustAlpha
11+
import com.simplemobiletools.commons.extensions.applyColorFilter
12+
import com.simplemobiletools.commons.extensions.setFillWithStroke
13+
import com.simplemobiletools.commons.helpers.DEFAULT_WIDGET_BG_COLOR
14+
import com.simplemobiletools.commons.helpers.IS_CUSTOMIZING_COLORS
15+
import com.simplemobiletools.flashlight.R
16+
import com.simplemobiletools.flashlight.extensions.config
17+
import com.simplemobiletools.flashlight.extensions.updateBrightDisplayWidget
18+
import com.simplemobiletools.flashlight.helpers.MyWidgetTorchProvider
19+
import kotlinx.android.synthetic.main.widget_torch_config.*
20+
21+
class WidgetTorchConfigureActivity : SimpleActivity() {
22+
private var mWidgetAlpha = 0f
23+
private var mWidgetId = 0
24+
private var mWidgetColor = 0
25+
private var mWidgetColorWithoutTransparency = 0
26+
27+
public override fun onCreate(savedInstanceState: Bundle?) {
28+
useDynamicTheme = false
29+
super.onCreate(savedInstanceState)
30+
setResult(Activity.RESULT_CANCELED)
31+
setContentView(R.layout.widget_torch_config)
32+
initVariables()
33+
34+
val isCustomizingColors = intent.extras?.getBoolean(IS_CUSTOMIZING_COLORS) ?: false
35+
mWidgetId = intent.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: AppWidgetManager.INVALID_APPWIDGET_ID
36+
37+
if (mWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID && !isCustomizingColors) {
38+
finish()
39+
}
40+
41+
config_save.setOnClickListener { saveConfig() }
42+
config_widget_color.setOnClickListener { pickBackgroundColor() }
43+
}
44+
45+
private fun initVariables() {
46+
mWidgetColor = config.widgetBgColor
47+
mWidgetAlpha = if (mWidgetColor == DEFAULT_WIDGET_BG_COLOR) {
48+
1f
49+
} else {
50+
Color.alpha(mWidgetColor) / 255.toFloat()
51+
}
52+
53+
mWidgetColorWithoutTransparency = Color.rgb(Color.red(mWidgetColor), Color.green(mWidgetColor), Color.blue(mWidgetColor))
54+
config_widget_seekbar.setOnSeekBarChangeListener(seekbarChangeListener)
55+
config_widget_seekbar.progress = (mWidgetAlpha * 100).toInt()
56+
updateColors()
57+
}
58+
59+
private fun saveConfig() {
60+
config.widgetBgColor = mWidgetColor
61+
requestWidgetUpdate()
62+
63+
Intent().apply {
64+
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mWidgetId)
65+
setResult(Activity.RESULT_OK, this)
66+
}
67+
finish()
68+
}
69+
70+
private fun pickBackgroundColor() {
71+
ColorPickerDialog(this, mWidgetColorWithoutTransparency) { wasPositivePressed, color ->
72+
if (wasPositivePressed) {
73+
mWidgetColorWithoutTransparency = color
74+
updateColors()
75+
}
76+
}
77+
}
78+
79+
private fun requestWidgetUpdate() {
80+
Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, MyWidgetTorchProvider::class.java).apply {
81+
putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(mWidgetId))
82+
sendBroadcast(this)
83+
}
84+
85+
updateBrightDisplayWidget()
86+
}
87+
88+
private fun updateColors() {
89+
mWidgetColor = mWidgetColorWithoutTransparency.adjustAlpha(mWidgetAlpha)
90+
config_widget_color.setFillWithStroke(mWidgetColor, Color.BLACK)
91+
config_image.background.mutate().applyColorFilter(mWidgetColor)
92+
}
93+
94+
private val seekbarChangeListener = object : SeekBar.OnSeekBarChangeListener {
95+
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
96+
mWidgetAlpha = progress.toFloat() / 100.toFloat()
97+
updateColors()
98+
}
99+
100+
override fun onStartTrackingTouch(seekBar: SeekBar) {}
101+
102+
override fun onStopTrackingTouch(seekBar: SeekBar) {}
103+
}
104+
}

app/src/main/kotlin/com/simplemobiletools/flashlight/extensions/Context.kt

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,32 @@ import android.content.Intent
77
import android.graphics.Bitmap
88
import android.graphics.Canvas
99
import android.graphics.drawable.Drawable
10-
import com.simplemobiletools.flashlight.helpers.Config
11-
import com.simplemobiletools.flashlight.helpers.IS_ENABLED
12-
import com.simplemobiletools.flashlight.helpers.MyWidgetProvider
13-
import com.simplemobiletools.flashlight.helpers.TOGGLE_WIDGET_UI
10+
import com.simplemobiletools.flashlight.helpers.*
1411

1512
val Context.config: Config get() = Config.newInstance(applicationContext)
1613

1714
fun Context.updateWidgets(isEnabled: Boolean) {
18-
val widgetIDs = AppWidgetManager.getInstance(applicationContext).getAppWidgetIds(ComponentName(applicationContext, MyWidgetProvider::class.java))
15+
val widgetIDs = AppWidgetManager.getInstance(applicationContext).getAppWidgetIds(ComponentName(applicationContext, MyWidgetTorchProvider::class.java))
1916
if (widgetIDs.isNotEmpty()) {
20-
Intent(applicationContext, MyWidgetProvider::class.java).apply {
17+
Intent(applicationContext, MyWidgetTorchProvider::class.java).apply {
2118
action = TOGGLE_WIDGET_UI
2219
putExtra(IS_ENABLED, isEnabled)
2320
sendBroadcast(this)
2421
}
2522
}
23+
24+
updateBrightDisplayWidget()
25+
}
26+
27+
fun Context.updateBrightDisplayWidget() {
28+
val widgetIDs = AppWidgetManager.getInstance(applicationContext).getAppWidgetIds(ComponentName(applicationContext, MyWidgetBrightDisplayProvider::class.java))
29+
if (widgetIDs.isNotEmpty()) {
30+
Intent(applicationContext, MyWidgetBrightDisplayProvider::class.java).apply {
31+
action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
32+
putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIDs)
33+
sendBroadcast(this)
34+
}
35+
}
2636
}
2737

2838
fun Context.drawableToBitmap(drawable: Drawable): Bitmap {
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.simplemobiletools.flashlight.helpers
2+
3+
import android.app.PendingIntent
4+
import android.appwidget.AppWidgetManager
5+
import android.appwidget.AppWidgetProvider
6+
import android.content.ComponentName
7+
import android.content.Context
8+
import android.content.Intent
9+
import android.graphics.Bitmap
10+
import android.graphics.Color
11+
import android.widget.RemoteViews
12+
import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor
13+
import com.simplemobiletools.flashlight.R
14+
import com.simplemobiletools.flashlight.activities.BrightDisplayActivity
15+
import com.simplemobiletools.flashlight.extensions.config
16+
import com.simplemobiletools.flashlight.extensions.drawableToBitmap
17+
18+
class MyWidgetBrightDisplayProvider : AppWidgetProvider() {
19+
private val OPEN_APP_INTENT_ID = 1
20+
21+
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
22+
appWidgetManager.getAppWidgetIds(getComponentName(context)).forEach {
23+
RemoteViews(context.packageName, R.layout.widget_bright_display).apply {
24+
setupAppOpenIntent(context, this)
25+
26+
val selectedColor = context.config.widgetBgColor
27+
val alpha = Color.alpha(selectedColor)
28+
29+
val bmp = getColoredIcon(context, selectedColor, alpha)
30+
setImageViewBitmap(R.id.bright_display_btn, bmp)
31+
32+
appWidgetManager.updateAppWidget(it, this)
33+
}
34+
}
35+
}
36+
37+
private fun getComponentName(context: Context) = ComponentName(context, MyWidgetBrightDisplayProvider::class.java)
38+
39+
private fun setupAppOpenIntent(context: Context, views: RemoteViews) {
40+
Intent(context, BrightDisplayActivity::class.java).apply {
41+
val pendingIntent = PendingIntent.getActivity(context, OPEN_APP_INTENT_ID, this, PendingIntent.FLAG_UPDATE_CURRENT)
42+
views.setOnClickPendingIntent(R.id.bright_display_btn, pendingIntent)
43+
}
44+
}
45+
46+
private fun getColoredIcon(context: Context, color: Int, alpha: Int): Bitmap {
47+
val drawable = context.resources.getColoredDrawableWithColor(R.drawable.ic_bright_display, color, alpha)
48+
return context.drawableToBitmap(drawable)
49+
}
50+
}

app/src/main/kotlin/com/simplemobiletools/flashlight/helpers/MyWidgetProvider.kt renamed to app/src/main/kotlin/com/simplemobiletools/flashlight/helpers/MyWidgetTorchProvider.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@ import com.simplemobiletools.flashlight.R
1414
import com.simplemobiletools.flashlight.extensions.config
1515
import com.simplemobiletools.flashlight.extensions.drawableToBitmap
1616

17-
class MyWidgetProvider : AppWidgetProvider() {
17+
class MyWidgetTorchProvider : AppWidgetProvider() {
1818
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
1919
performUpdate(context)
2020
}
2121

2222
private fun performUpdate(context: Context) {
2323
val selectedColor = context.config.widgetBgColor
2424
val alpha = Color.alpha(selectedColor)
25-
val bmp = getColoredCircles(context, Color.WHITE, alpha)
26-
val intent = Intent(context, MyWidgetProvider::class.java)
25+
val bmp = getColoredIcon(context, Color.WHITE, alpha)
26+
val intent = Intent(context, MyWidgetTorchProvider::class.java)
2727
intent.action = TOGGLE
2828

2929
val appWidgetManager = AppWidgetManager.getInstance(context)
@@ -37,7 +37,7 @@ class MyWidgetProvider : AppWidgetProvider() {
3737
}
3838
}
3939

40-
private fun getComponentName(context: Context) = ComponentName(context, MyWidgetProvider::class.java)
40+
private fun getComponentName(context: Context) = ComponentName(context, MyWidgetTorchProvider::class.java)
4141

4242
override fun onReceive(context: Context, intent: Intent) {
4343
when (intent.action) {
@@ -57,7 +57,7 @@ class MyWidgetProvider : AppWidgetProvider() {
5757
val widgetBgColor = context.config.widgetBgColor
5858
val alpha = Color.alpha(widgetBgColor)
5959
val selectedColor = if (enable) widgetBgColor else Color.WHITE
60-
val bmp = getColoredCircles(context, selectedColor, alpha)
60+
val bmp = getColoredIcon(context, selectedColor, alpha)
6161

6262
val appWidgetManager = AppWidgetManager.getInstance(context)
6363
appWidgetManager.getAppWidgetIds(getComponentName(context)).forEach {
@@ -68,7 +68,7 @@ class MyWidgetProvider : AppWidgetProvider() {
6868
}
6969
}
7070

71-
private fun getColoredCircles(context: Context, color: Int, alpha: Int): Bitmap {
71+
private fun getColoredIcon(context: Context, color: Int, alpha: Int): Bitmap {
7272
val drawable = context.resources.getColoredDrawableWithColor(R.drawable.ic_flashlight, color, alpha)
7373
return context.drawableToBitmap(drawable)
7474
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:id="@+id/bright_display_btn"
4+
android:layout_width="wrap_content"
5+
android:layout_height="wrap_content"
6+
android:layout_margin="5dp" />
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="wrap_content"
5+
android:layout_centerHorizontal="true"
6+
android:layout_margin="@dimen/activity_margin"
7+
android:paddingBottom="@dimen/activity_margin">
8+
9+
<RelativeLayout
10+
android:layout_width="match_parent"
11+
android:layout_height="match_parent"
12+
android:layout_above="@+id/config_widget_color"
13+
android:layout_marginBottom="@dimen/activity_margin"
14+
android:gravity="center">
15+
16+
<ImageView
17+
android:id="@+id/config_image"
18+
android:layout_width="@dimen/main_button_size"
19+
android:layout_height="@dimen/main_button_size"
20+
android:background="@drawable/ic_bright_display" />
21+
</RelativeLayout>
22+
23+
<ImageView
24+
android:id="@+id/config_widget_color"
25+
android:layout_width="@dimen/widget_colorpicker_size"
26+
android:layout_height="@dimen/widget_colorpicker_size"
27+
android:layout_above="@+id/config_save" />
28+
29+
<RelativeLayout
30+
android:id="@+id/config_widget_seekbar_holder"
31+
android:layout_width="match_parent"
32+
android:layout_height="match_parent"
33+
android:layout_alignTop="@+id/config_widget_color"
34+
android:layout_alignBottom="@+id/config_widget_color"
35+
android:layout_toRightOf="@+id/config_widget_color"
36+
android:background="@android:color/white">
37+
38+
<SeekBar
39+
android:id="@+id/config_widget_seekbar"
40+
android:layout_width="match_parent"
41+
android:layout_height="wrap_content"
42+
android:layout_centerVertical="true"
43+
android:paddingLeft="@dimen/activity_margin"
44+
android:paddingRight="@dimen/activity_margin" />
45+
</RelativeLayout>
46+
47+
<Button
48+
android:id="@+id/config_save"
49+
android:layout_width="wrap_content"
50+
android:layout_height="wrap_content"
51+
android:layout_alignParentRight="true"
52+
android:layout_alignParentBottom="true"
53+
android:background="@color/gradient_grey_start"
54+
android:fontFamily="sans-serif-light"
55+
android:paddingLeft="@dimen/activity_margin"
56+
android:paddingRight="@dimen/activity_margin"
57+
android:text="@string/ok"
58+
android:textColor="@color/color_primary"
59+
android:textSize="@dimen/big_text_size" />
60+
61+
</RelativeLayout>

0 commit comments

Comments
 (0)