Skip to content

Commit e9ebe65

Browse files
committed
adding some code related to updating specific widgets only
1 parent 3bd04a6 commit e9ebe65

File tree

10 files changed

+83
-112
lines changed

10 files changed

+83
-112
lines changed

app/src/main/kotlin/com/simplemobiletools/notes/activities/MainActivity.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,7 @@ import com.simplemobiletools.notes.BuildConfig
2525
import com.simplemobiletools.notes.R
2626
import com.simplemobiletools.notes.adapters.NotesPagerAdapter
2727
import com.simplemobiletools.notes.dialogs.*
28-
import com.simplemobiletools.notes.extensions.config
29-
import com.simplemobiletools.notes.extensions.dbHelper
30-
import com.simplemobiletools.notes.extensions.getTextSize
31-
import com.simplemobiletools.notes.extensions.updateWidget
28+
import com.simplemobiletools.notes.extensions.*
3229
import com.simplemobiletools.notes.helpers.MIME_TEXT_PLAIN
3330
import com.simplemobiletools.notes.helpers.OPEN_NOTE_ID
3431
import com.simplemobiletools.notes.helpers.TYPE_NOTE
@@ -40,7 +37,7 @@ import java.nio.charset.Charset
4037
class MainActivity : SimpleActivity(), ViewPager.OnPageChangeListener {
4138
private var mAdapter: NotesPagerAdapter? = null
4239

43-
lateinit var mCurrentNote: Note
40+
private lateinit var mCurrentNote: Note
4441
private var mNotes = ArrayList<Note>()
4542

4643
private var noteViewWithTextSelected: MyEditText? = null
@@ -533,7 +530,7 @@ class MainActivity : SimpleActivity(), ViewPager.OnPageChangeListener {
533530
updateSelectedNote(firstNoteId)
534531
if (config.widgetNoteId == note.id) {
535532
config.widgetNoteId = mCurrentNote.id
536-
updateWidget()
533+
updateNoteWidget(mCurrentNote.id)
537534
}
538535
invalidateOptionsMenu()
539536
initViewPager()

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

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@ package com.simplemobiletools.notes.activities
33
import android.content.Intent
44
import android.content.res.Resources
55
import android.os.Bundle
6-
import android.view.View
76
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
87
import com.simplemobiletools.commons.extensions.*
98
import com.simplemobiletools.commons.helpers.IS_CUSTOMIZING_COLORS
109
import com.simplemobiletools.commons.models.RadioItem
1110
import com.simplemobiletools.notes.R
1211
import com.simplemobiletools.notes.extensions.config
1312
import com.simplemobiletools.notes.extensions.dbHelper
14-
import com.simplemobiletools.notes.extensions.updateWidget
13+
import com.simplemobiletools.notes.extensions.updateWidgets
1514
import com.simplemobiletools.notes.helpers.*
1615
import com.simplemobiletools.notes.models.Note
1716
import kotlinx.android.synthetic.main.activity_settings.*
@@ -45,7 +44,6 @@ class SettingsActivity : SimpleActivity() {
4544
setupEnableLineWrap()
4645
setupFontSize()
4746
setupGravity()
48-
setupWidgetNote()
4947
setupCursorPlacement()
5048
setupCustomizeWidgetColors()
5149
updateTextColors(settings_scrollview)
@@ -167,7 +165,7 @@ class SettingsActivity : SimpleActivity() {
167165
RadioGroupDialog(this@SettingsActivity, items, config.fontSize) {
168166
config.fontSize = it as Int
169167
settings_font_size.text = getFontSizeText()
170-
updateWidget()
168+
updateWidgets()
171169
}
172170
}
173171
}
@@ -190,7 +188,7 @@ class SettingsActivity : SimpleActivity() {
190188
RadioGroupDialog(this@SettingsActivity, items, config.gravity) {
191189
config.gravity = it as Int
192190
settings_gravity.text = getGravityText()
193-
updateWidget()
191+
updateWidgets()
194192
}
195193
}
196194
}
@@ -201,24 +199,6 @@ class SettingsActivity : SimpleActivity() {
201199
else -> R.string.right
202200
})
203201

204-
private fun setupWidgetNote() {
205-
if (notes.size <= 1) {
206-
settings_widget_note_holder.visibility = View.GONE
207-
return
208-
}
209-
210-
settings_widget_note.text = getCurrentWidgetNoteTitle(config.widgetNoteId, notes)
211-
settings_widget_note_holder.setOnClickListener {
212-
val items = notes.map { RadioItem(it.id, it.title) } as ArrayList
213-
214-
RadioGroupDialog(this@SettingsActivity, items, config.widgetNoteId) {
215-
config.widgetNoteId = it as Int
216-
settings_widget_note.text = getCurrentWidgetNoteTitle(it, notes)
217-
updateWidget()
218-
}
219-
}
220-
}
221-
222202
private fun setupCursorPlacement() {
223203
settings_cursor_placement.isChecked = config.placeCursorToEnd
224204
settings_cursor_placement_holder.setOnClickListener {
@@ -227,9 +207,6 @@ class SettingsActivity : SimpleActivity() {
227207
}
228208
}
229209

230-
private fun getCurrentWidgetNoteTitle(currentNoteId: Int, notes: List<Note>) =
231-
notes.firstOrNull { it.id == currentNoteId }?.title ?: ""
232-
233210
private fun setupCustomizeWidgetColors() {
234211
settings_customize_widget_colors_holder.setOnClickListener {
235212
Intent(this, WidgetConfigureActivity::class.java).apply {

app/src/main/kotlin/com/simplemobiletools/notes/adapters/WidgetAdapter.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,17 @@ import com.simplemobiletools.notes.extensions.dbHelper
1414
import com.simplemobiletools.notes.extensions.getTextSize
1515
import com.simplemobiletools.notes.helpers.GRAVITY_CENTER
1616
import com.simplemobiletools.notes.helpers.GRAVITY_RIGHT
17+
import com.simplemobiletools.notes.helpers.NOTE_ID
1718
import com.simplemobiletools.notes.helpers.OPEN_NOTE_ID
1819

19-
class WidgetAdapter(val context: Context) : RemoteViewsService.RemoteViewsFactory {
20+
class WidgetAdapter(val context: Context, val intent: Intent) : RemoteViewsService.RemoteViewsFactory {
2021
private val textIds = arrayOf(R.id.widget_text_left, R.id.widget_text_center, R.id.widget_text_right)
2122
private val widgetTextColor = context.config.widgetTextColor
2223

2324
override fun getViewAt(position: Int): RemoteViews {
25+
val noteId = intent.getIntExtra(NOTE_ID, 1)
2426
val views = RemoteViews(context.packageName, R.layout.widget_text_layout).apply {
25-
val note = context.dbHelper.getNote(context.config.widgetNoteId)
27+
val note = context.dbHelper.getNoteWithId(noteId)
2628
if (note != null) {
2729
val noteText = note.getNoteStoredValue() ?: ""
2830
val textSize = context.getTextSize() / context.resources.displayMetrics.density
@@ -35,7 +37,7 @@ class WidgetAdapter(val context: Context) : RemoteViewsService.RemoteViewsFactor
3537
}
3638

3739
Intent().apply {
38-
putExtra(OPEN_NOTE_ID, context.config.widgetNoteId)
40+
putExtra(OPEN_NOTE_ID, noteId)
3941
setOnClickFillInIntent(widget_text_holder, this)
4042
}
4143

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

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.simplemobiletools.notes.extensions
22

3-
import android.appwidget.AppWidgetManager
4-
import android.content.ComponentName
53
import android.content.Context
64
import android.content.Intent
75
import com.simplemobiletools.notes.R
@@ -11,20 +9,26 @@ val Context.config: Config get() = Config.newInstance(applicationContext)
119

1210
val Context.dbHelper: DBHelper get() = DBHelper.newInstance(applicationContext)
1311

14-
fun Context.getTextSize() =
15-
when (config.fontSize) {
16-
FONT_SIZE_SMALL -> resources.getDimension(R.dimen.smaller_text_size)
17-
FONT_SIZE_LARGE -> resources.getDimension(R.dimen.big_text_size)
18-
FONT_SIZE_EXTRA_LARGE -> resources.getDimension(R.dimen.extra_big_text_size)
19-
else -> resources.getDimension(R.dimen.bigger_text_size)
20-
}
12+
fun Context.getTextSize() = when (config.fontSize) {
13+
FONT_SIZE_SMALL -> resources.getDimension(R.dimen.smaller_text_size)
14+
FONT_SIZE_LARGE -> resources.getDimension(R.dimen.big_text_size)
15+
FONT_SIZE_EXTRA_LARGE -> resources.getDimension(R.dimen.extra_big_text_size)
16+
else -> resources.getDimension(R.dimen.bigger_text_size)
17+
}
18+
19+
fun Context.updateWidgets() {
20+
dbHelper.getNotes().forEach {
21+
updateNoteWidget(it.id)
22+
}
23+
}
2124

22-
fun Context.updateWidget() {
23-
val widgetIDs = AppWidgetManager.getInstance(this).getAppWidgetIds(ComponentName(this, MyWidgetProvider::class.java))
24-
if (widgetIDs.isNotEmpty()) {
25+
fun Context.updateNoteWidget(noteId: Int) {
26+
val widgetIds = dbHelper.getNoteWidgetIds(noteId)
27+
widgetIds.forEach {
2528
Intent(this, MyWidgetProvider::class.java).apply {
26-
action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
27-
putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIDs)
29+
action = UPDATE_WIDGET
30+
putExtra(WIDGET_ID, it)
31+
putExtra(NOTE_ID, noteId)
2832
sendBroadcast(this)
2933
}
3034
}

app/src/main/kotlin/com/simplemobiletools/notes/fragments/NoteFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import com.simplemobiletools.notes.activities.MainActivity
2222
import com.simplemobiletools.notes.extensions.config
2323
import com.simplemobiletools.notes.extensions.dbHelper
2424
import com.simplemobiletools.notes.extensions.getTextSize
25-
import com.simplemobiletools.notes.extensions.updateWidget
25+
import com.simplemobiletools.notes.extensions.updateNoteWidget
2626
import com.simplemobiletools.notes.helpers.*
2727
import com.simplemobiletools.notes.models.Note
2828
import com.simplemobiletools.notes.models.TextHistory
@@ -156,7 +156,7 @@ class NoteFragment : Fragment() {
156156
if (newText != null && (newText != oldText || force)) {
157157
note.value = newText
158158
saveNoteValue(note)
159-
context!!.updateWidget()
159+
context!!.updateNoteWidget(note.id)
160160
}
161161
}
162162

app/src/main/kotlin/com/simplemobiletools/notes/helpers/Constants.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.simplemobiletools.notes.helpers
22

33
const val NOTE_ID = "note_id"
44
const val OPEN_NOTE_ID = "open_note_id"
5+
const val UPDATE_WIDGET = "update_widget"
6+
const val WIDGET_ID = "widget_id"
57

68
// shared preferences
79
const val CURRENT_NOTE_ID = "current_note_id"

app/src/main/kotlin/com/simplemobiletools/notes/helpers/DBHelper.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,4 +219,22 @@ class DBHelper private constructor(private val mContext: Context) : SQLiteOpenHe
219219
}
220220

221221
fun isValidId(id: Int) = id > 0
222+
223+
fun getNoteWidgetIds(noteId: Int): ArrayList<Int> {
224+
val widgetIds = ArrayList<Int>()
225+
val cols = arrayOf(COL_WIDGET_ID)
226+
val selection = "$COL_NOTE_ID = ?"
227+
val selectionArgs = arrayOf(noteId.toString())
228+
var cursor: Cursor? = null
229+
try {
230+
cursor = mDb.query(WIDGETS_TABLE_NAME, cols, selection, selectionArgs, null, null, null)
231+
if (cursor?.moveToFirst() == true) {
232+
val widgetId = cursor.getIntValue(COL_WIDGET_ID)
233+
widgetIds.add(widgetId)
234+
}
235+
} finally {
236+
cursor?.close()
237+
}
238+
return widgetIds
239+
}
222240
}

app/src/main/kotlin/com/simplemobiletools/notes/helpers/MyWidgetProvider.kt

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.simplemobiletools.notes.helpers
33
import android.app.PendingIntent
44
import android.appwidget.AppWidgetManager
55
import android.appwidget.AppWidgetProvider
6-
import android.content.ComponentName
76
import android.content.Context
87
import android.content.Intent
98
import android.net.Uri
@@ -16,34 +15,32 @@ import com.simplemobiletools.notes.extensions.config
1615
import com.simplemobiletools.notes.services.WidgetService
1716

1817
class MyWidgetProvider : AppWidgetProvider() {
19-
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
20-
performUpdate(context)
21-
}
18+
private fun performUpdate(context: Context, intent: Intent) {
19+
val noteId = intent.getIntExtra(NOTE_ID, -1)
20+
val widgetId = intent.getIntExtra(WIDGET_ID, -1)
21+
if (noteId == -1 || widgetId == -1) {
22+
return
23+
}
2224

23-
private fun performUpdate(context: Context) {
2425
val appWidgetManager = AppWidgetManager.getInstance(context)
25-
appWidgetManager.getAppWidgetIds(getComponentName(context)).forEach {
26-
val views = RemoteViews(context.packageName, R.layout.widget)
27-
views.setBackgroundColor(R.id.notes_widget_holder, context.config.widgetBgColor)
28-
setupAppOpenIntent(context, views, R.id.notes_widget_holder)
29-
30-
Intent(context, WidgetService::class.java).apply {
31-
data = Uri.parse(this.toUri(Intent.URI_INTENT_SCHEME))
32-
views.setRemoteAdapter(R.id.notes_widget_listview, this)
33-
}
34-
35-
val widgetId = context.config.widgetNoteId
36-
val startActivityIntent = context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)
37-
startActivityIntent.putExtra(OPEN_NOTE_ID, widgetId)
38-
val startActivityPendingIntent = PendingIntent.getActivity(context, widgetId, startActivityIntent, PendingIntent.FLAG_UPDATE_CURRENT)
39-
views.setPendingIntentTemplate(R.id.notes_widget_listview, startActivityPendingIntent)
40-
41-
appWidgetManager.updateAppWidget(it, views)
42-
appWidgetManager.notifyAppWidgetViewDataChanged(it, R.id.notes_widget_listview)
26+
val views = RemoteViews(context.packageName, R.layout.widget)
27+
views.setBackgroundColor(R.id.notes_widget_holder, context.config.widgetBgColor)
28+
setupAppOpenIntent(context, views, R.id.notes_widget_holder)
29+
30+
Intent(context, WidgetService::class.java).apply {
31+
putExtra(NOTE_ID, noteId)
32+
data = Uri.parse(this.toUri(Intent.URI_INTENT_SCHEME))
33+
views.setRemoteAdapter(R.id.notes_widget_listview, this)
4334
}
44-
}
4535

46-
private fun getComponentName(context: Context) = ComponentName(context, MyWidgetProvider::class.java)
36+
val startActivityIntent = context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)
37+
startActivityIntent.putExtra(OPEN_NOTE_ID, widgetId)
38+
val startActivityPendingIntent = PendingIntent.getActivity(context, widgetId, startActivityIntent, PendingIntent.FLAG_UPDATE_CURRENT)
39+
views.setPendingIntentTemplate(R.id.notes_widget_listview, startActivityPendingIntent)
40+
41+
appWidgetManager.updateAppWidget(widgetId, views)
42+
appWidgetManager.notifyAppWidgetViewDataChanged(widgetId, R.id.notes_widget_listview)
43+
}
4744

4845
private fun setupAppOpenIntent(context: Context, views: RemoteViews, id: Int) {
4946
val widgetId = context.config.widgetNoteId
@@ -52,4 +49,13 @@ class MyWidgetProvider : AppWidgetProvider() {
5249
val pendingIntent = PendingIntent.getActivity(context, widgetId, intent, 0)
5350
views.setOnClickPendingIntent(id, pendingIntent)
5451
}
52+
53+
// use only this way of updating widgets instead of onUpdate, so that we can pass a widget ID too
54+
override fun onReceive(context: Context, intent: Intent) {
55+
val action = intent.action
56+
when (action) {
57+
UPDATE_WIDGET -> performUpdate(context, intent)
58+
else -> super.onReceive(context, intent)
59+
}
60+
}
5561
}

app/src/main/kotlin/com/simplemobiletools/notes/services/WidgetService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ import android.widget.RemoteViewsService
55
import com.simplemobiletools.notes.adapters.WidgetAdapter
66

77
class WidgetService : RemoteViewsService() {
8-
override fun onGetViewFactory(intent: Intent) = WidgetAdapter(applicationContext)
8+
override fun onGetViewFactory(intent: Intent) = WidgetAdapter(applicationContext, intent)
99
}

app/src/main/res/layout/activity_settings.xml

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -483,40 +483,5 @@
483483
android:text="@string/customize_widget_colors"/>
484484

485485
</RelativeLayout>
486-
487-
<RelativeLayout
488-
android:id="@+id/settings_widget_note_holder"
489-
android:layout_width="match_parent"
490-
android:layout_height="wrap_content"
491-
android:layout_marginTop="@dimen/medium_margin"
492-
android:background="?attr/selectableItemBackground"
493-
android:paddingBottom="@dimen/activity_margin"
494-
android:paddingLeft="@dimen/normal_margin"
495-
android:paddingRight="@dimen/normal_margin"
496-
android:paddingTop="@dimen/activity_margin">
497-
498-
<com.simplemobiletools.commons.views.MyTextView
499-
android:id="@+id/settings_widget_note_label"
500-
android:layout_width="match_parent"
501-
android:layout_height="wrap_content"
502-
android:layout_centerVertical="true"
503-
android:layout_toLeftOf="@+id/settings_widget_note"
504-
android:layout_toStartOf="@+id/settings_widget_note"
505-
android:paddingLeft="@dimen/medium_margin"
506-
android:paddingRight="@dimen/medium_margin"
507-
android:text="@string/widget_note"/>
508-
509-
<com.simplemobiletools.commons.views.MyTextView
510-
android:id="@+id/settings_widget_note"
511-
android:layout_width="wrap_content"
512-
android:layout_height="wrap_content"
513-
android:layout_alignParentEnd="true"
514-
android:layout_alignParentRight="true"
515-
android:layout_marginEnd="@dimen/medium_margin"
516-
android:layout_marginRight="@dimen/medium_margin"
517-
android:background="@null"
518-
android:clickable="false"/>
519-
520-
</RelativeLayout>
521486
</LinearLayout>
522487
</ScrollView>

0 commit comments

Comments
 (0)