diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 913d528fe..b9f116152 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -90,6 +90,10 @@
android:resource="@xml/widget_list_info"/>
+
+
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetListConfigureActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetListConfigureActivity.kt
index 967d33605..14f74fe0e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetListConfigureActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetListConfigureActivity.kt
@@ -10,7 +10,7 @@ import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.SeekBar
import com.simplemobiletools.calendar.R
-import com.simplemobiletools.calendar.adapters.EventListWidgetAdapter
+import com.simplemobiletools.calendar.adapters.EventListWidgetAdapterOld
import com.simplemobiletools.calendar.extensions.adjustAlpha
import com.simplemobiletools.calendar.helpers.*
import com.simplemobiletools.calendar.helpers.Formatter
@@ -33,7 +33,7 @@ class WidgetListConfigureActivity : AppCompatActivity() {
private var mTextColorWithoutTransparency = 0
private var mTextColor = 0
- private var mEventsAdapter: EventListWidgetAdapter? = null
+ private var mEventsAdapter: EventListWidgetAdapterOld? = null
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -49,7 +49,7 @@ class WidgetListConfigureActivity : AppCompatActivity() {
if (mWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID)
finish()
- mEventsAdapter = EventListWidgetAdapter(this, getListItems())
+ mEventsAdapter = EventListWidgetAdapterOld(this, getListItems())
mEventsAdapter!!.setTextColor(mTextColor)
config_events_list.adapter = mEventsAdapter
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/EventListWidgetAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/EventListWidgetAdapter.kt
index a3e83bc49..ab0af2008 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/EventListWidgetAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/EventListWidgetAdapter.kt
@@ -1,104 +1,86 @@
package com.simplemobiletools.calendar.adapters
+import android.appwidget.AppWidgetManager
import android.content.Context
-import android.graphics.drawable.Drawable
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.BaseAdapter
-import android.widget.TextView
+import android.content.Intent
+import android.content.SharedPreferences
+import android.graphics.Color
+import android.widget.RemoteViews
+import android.widget.RemoteViewsService
import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.adjustAlpha
import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.helpers.HIGH_ALPHA
+import com.simplemobiletools.calendar.helpers.PREFS_KEY
+import com.simplemobiletools.calendar.helpers.WIDGET_TEXT_COLOR
import com.simplemobiletools.calendar.models.ListEvent
import com.simplemobiletools.calendar.models.ListItem
import com.simplemobiletools.calendar.models.ListSection
-import kotlinx.android.synthetic.main.event_item.view.*
+import org.joda.time.DateTime
+import java.util.*
-class EventListWidgetAdapter(val context: Context, val mEvents: List) : BaseAdapter() {
- val ITEM_EVENT = 0
- val ITEM_HEADER = 1
-
- private val mInflater: LayoutInflater
- private var mTopDivider: Drawable? = null
- private var mTextColor = 0
+class EventListWidgetAdapter(val context: Context, val intent: Intent) : RemoteViewsService.RemoteViewsFactory {
+ val appWidgetId: Int
+ var events: List
+ val prefs: SharedPreferences
+ val textColor: Int
init {
- mInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
- mTopDivider = context.resources.getDrawable(R.drawable.divider)
+ prefs = context.getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE)
+ textColor = prefs.getInt(WIDGET_TEXT_COLOR, Color.WHITE).adjustAlpha(HIGH_ALPHA)
+ appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID)
+ events = getListItems()
}
- override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
- var view = convertView
- val viewHolder: ViewHolder
- val type = getItemViewType(position)
+ override fun getViewAt(position: Int): RemoteViews {
+ val rv = RemoteViews(context.packageName, R.layout.event_list_section)
+ rv.setTextViewText(R.id.event_item_title, "hello")
+ rv.setInt(R.id.event_item_title, "setTextColor", textColor)
- if (view == null) {
- if (type == ITEM_EVENT) {
- view = mInflater.inflate(R.layout.event_list_item, parent, false)
- } else {
- view = mInflater.inflate(R.layout.event_list_section, parent, false)
- view.setOnClickListener(null)
- }
- viewHolder = ViewHolder(view)
- view!!.tag = viewHolder
- } else {
- viewHolder = view.tag as ViewHolder
- }
-
- if (type == ITEM_EVENT) {
- val item = mEvents[position] as ListEvent
- viewHolder.apply {
- title.text = item.title
- description?.text = item.description
- start?.text = Formatter.getTime(item.startTS)
-
- if (item.startTS == item.endTS) {
- end?.visibility = View.INVISIBLE
- } else {
- end?.text = Formatter.getTime(item.endTS)
- end?.visibility = View.VISIBLE
-
- val startCode = Formatter.getDayCodeFromTS(item.startTS)
- val endCode = Formatter.getDayCodeFromTS(item.endTS)
- if (startCode != endCode) {
- end?.append(" (${Formatter.getEventDate(context, endCode)})")
- }
- }
-
- start?.setTextColor(mTextColor)
- end?.setTextColor(mTextColor)
- title.setTextColor(mTextColor)
- description?.setTextColor(mTextColor)
- }
- } else {
- val item = mEvents[position] as ListSection
- viewHolder.title.text = item.title
- viewHolder.title.setCompoundDrawablesWithIntrinsicBounds(null, if (position == 0) null else mTopDivider, null, null)
- viewHolder.title.setTextColor(mTextColor)
- }
-
- return view
+ return rv
}
- fun setTextColor(color: Int) {
- mTextColor = color
- notifyDataSetChanged()
+ override fun getLoadingView() = null
+
+ override fun getViewTypeCount() = 1
+
+ override fun onCreate() {
}
- override fun getItemViewType(position: Int) = if (mEvents[position] is ListEvent) ITEM_EVENT else ITEM_HEADER
+ override fun getItemId(position: Int) = position.toLong()
- override fun getViewTypeCount() = 2
+ override fun onDataSetChanged() {
+ }
- override fun getCount() = mEvents.size
+ override fun hasStableIds() = true
- override fun getItem(position: Int) = mEvents[position]
+ override fun getCount() = events.size
- override fun getItemId(position: Int) = 0L
+ override fun onDestroy() {
+ }
- internal class ViewHolder(view: View) {
- val title = view.event_item_title
- val description: TextView? = view.event_item_description
- val start: TextView? = view.event_item_start
- val end: TextView? = view.event_item_end
+ private fun getListItems(): ArrayList {
+ val listItems = ArrayList(10)
+ var dateTime = DateTime.now().withTime(0, 0, 0, 0).plusDays(1)
+ var code = Formatter.getDayCodeFromTS((dateTime.millis / 1000).toInt())
+ var day = Formatter.getDayTitle(context, code)
+ listItems.add(ListSection(day))
+
+ var time = dateTime.withHourOfDay(7)
+ listItems.add(ListEvent(1, (time.millis / 1000).toInt(), (time.plusMinutes(30).millis / 1000).toInt(), "Workout", "Leg day"))
+ time = dateTime.withHourOfDay(8)
+ listItems.add(ListEvent(2, (time.millis / 1000).toInt(), (time.plusHours(1).millis / 1000).toInt(), "Meeting with John", "In Rockstone Garden"))
+
+ dateTime = dateTime.plusDays(1)
+ code = Formatter.getDayCodeFromTS((dateTime.millis / 1000).toInt())
+ day = Formatter.getDayTitle(context, code)
+ listItems.add(ListSection(day))
+
+ time = dateTime.withHourOfDay(13)
+ listItems.add(ListEvent(3, (time.millis / 1000).toInt(), (time.plusHours(1).millis / 1000).toInt(), "Lunch with Mary", "In the Plaza"))
+ time = dateTime.withHourOfDay(18)
+ listItems.add(ListEvent(4, (time.millis / 1000).toInt(), (time.plusMinutes(10).millis / 1000).toInt(), "Coffee time", ""))
+
+ return listItems
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/EventListWidgetAdapterOld.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/EventListWidgetAdapterOld.kt
new file mode 100644
index 000000000..9b6ebe32f
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/EventListWidgetAdapterOld.kt
@@ -0,0 +1,104 @@
+package com.simplemobiletools.calendar.adapters
+
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.BaseAdapter
+import android.widget.TextView
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.models.ListEvent
+import com.simplemobiletools.calendar.models.ListItem
+import com.simplemobiletools.calendar.models.ListSection
+import kotlinx.android.synthetic.main.event_item.view.*
+
+class EventListWidgetAdapterOld(val context: Context, val mEvents: List) : BaseAdapter() {
+ val ITEM_EVENT = 0
+ val ITEM_HEADER = 1
+
+ private val mInflater: LayoutInflater
+ private var mTopDivider: Drawable? = null
+ private var mTextColor = 0
+
+ init {
+ mInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
+ mTopDivider = context.resources.getDrawable(R.drawable.divider)
+ }
+
+ override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
+ var view = convertView
+ val viewHolder: ViewHolder
+ val type = getItemViewType(position)
+
+ if (view == null) {
+ if (type == ITEM_EVENT) {
+ view = mInflater.inflate(R.layout.event_list_item, parent, false)
+ } else {
+ view = mInflater.inflate(R.layout.event_list_section, parent, false)
+ view.setOnClickListener(null)
+ }
+ viewHolder = ViewHolder(view)
+ view!!.tag = viewHolder
+ } else {
+ viewHolder = view.tag as ViewHolder
+ }
+
+ if (type == ITEM_EVENT) {
+ val item = mEvents[position] as ListEvent
+ viewHolder.apply {
+ title.text = item.title
+ description?.text = item.description
+ start?.text = Formatter.getTime(item.startTS)
+
+ if (item.startTS == item.endTS) {
+ end?.visibility = View.INVISIBLE
+ } else {
+ end?.text = Formatter.getTime(item.endTS)
+ end?.visibility = View.VISIBLE
+
+ val startCode = Formatter.getDayCodeFromTS(item.startTS)
+ val endCode = Formatter.getDayCodeFromTS(item.endTS)
+ if (startCode != endCode) {
+ end?.append(" (${Formatter.getEventDate(context, endCode)})")
+ }
+ }
+
+ start?.setTextColor(mTextColor)
+ end?.setTextColor(mTextColor)
+ title.setTextColor(mTextColor)
+ description?.setTextColor(mTextColor)
+ }
+ } else {
+ val item = mEvents[position] as ListSection
+ viewHolder.title.text = item.title
+ viewHolder.title.setCompoundDrawablesWithIntrinsicBounds(null, if (position == 0) null else mTopDivider, null, null)
+ viewHolder.title.setTextColor(mTextColor)
+ }
+
+ return view
+ }
+
+ fun setTextColor(color: Int) {
+ mTextColor = color
+ notifyDataSetChanged()
+ }
+
+ override fun getItemViewType(position: Int) = if (mEvents[position] is ListEvent) ITEM_EVENT else ITEM_HEADER
+
+ override fun getViewTypeCount() = 2
+
+ override fun getCount() = mEvents.size
+
+ override fun getItem(position: Int) = mEvents[position]
+
+ override fun getItemId(position: Int) = 0L
+
+ internal class ViewHolder(view: View) {
+ val title = view.event_item_title
+ val description: TextView? = view.event_item_description
+ val start: TextView? = view.event_item_start
+ val end: TextView? = view.event_item_end
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetListProvider.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetListProvider.kt
index 0493d7519..f892f7b89 100644
--- a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetListProvider.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetListProvider.kt
@@ -1,6 +1,5 @@
package com.simplemobiletools.calendar.helpers
-import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.ComponentName
@@ -10,18 +9,11 @@ import android.content.res.Resources
import android.graphics.Color
import android.widget.RemoteViews
import com.simplemobiletools.calendar.R
-import com.simplemobiletools.calendar.activities.DayActivity
-import com.simplemobiletools.calendar.adapters.EventListWidgetAdapter
import com.simplemobiletools.calendar.extensions.adjustAlpha
-import com.simplemobiletools.calendar.models.Event
-import com.simplemobiletools.calendar.models.ListEvent
-import com.simplemobiletools.calendar.models.ListItem
-import com.simplemobiletools.calendar.models.ListSection
-import org.joda.time.DateTime
-import java.util.*
-import kotlin.comparisons.compareBy
+import com.simplemobiletools.calendar.services.WidgetService
-class MyWidgetListProvider : AppWidgetProvider(), DBHelper.GetEventsListener {
+
+class MyWidgetListProvider : AppWidgetProvider() {
companion object {
private var mTextColor = 0
@@ -34,7 +26,6 @@ class MyWidgetListProvider : AppWidgetProvider(), DBHelper.GetEventsListener {
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
initVariables(context)
- updateWidget()
super.onUpdate(context, appWidgetManager, appWidgetIds)
}
@@ -53,41 +44,13 @@ class MyWidgetListProvider : AppWidgetProvider(), DBHelper.GetEventsListener {
val bgColor = prefs.getInt(WIDGET_BG_COLOR, Color.BLACK)
mRemoteViews.setInt(R.id.widget_event_list, "setBackgroundColor", bgColor)
- }
- private fun updateWidget() {
+ val intent = Intent(context, WidgetService::class.java)
+ mRemoteViews.setRemoteAdapter(R.id.widget_event_list, intent)
+
val thisWidget = ComponentName(mContext, MyWidgetListProvider::class.java)
AppWidgetManager.getInstance(mContext).updateAppWidget(thisWidget, mRemoteViews)
-
- val fromTS = (DateTime().millis / 1000).toInt()
- val toTS = (DateTime().plusMonths(6).millis / 1000).toInt()
- DBHelper(mContext).getEvents(fromTS, toTS, this)
- }
-
- private fun setupDayOpenIntent(id: Int, dayCode: String) {
- Intent(mContext, DayActivity::class.java).apply {
- putExtra(DAY_CODE, dayCode)
- val pendingIntent = PendingIntent.getActivity(mContext, Integer.parseInt(dayCode), this, 0)
- mRemoteViews.setOnClickPendingIntent(id, pendingIntent)
- }
}
private fun initPrefs(context: Context) = context.getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE)
-
- override fun gotEvents(events: MutableList) {
- val listItems = ArrayList(events.size)
- val sorted = events.sortedWith(compareBy({ it.startTS }, { it.endTS }, { it.title }, { it.description }))
- var prevCode = ""
- sorted.forEach {
- val code = Formatter.getDayCodeFromTS(it.startTS)
- if (code != prevCode) {
- val day = Formatter.getDayTitle(mContext, code)
- listItems.add(ListSection(day))
- prevCode = code
- }
- listItems.add(ListEvent(it.id, it.startTS, it.endTS, it.title, it.description))
- }
-
- val eventsAdapter = EventListWidgetAdapter(mContext, listItems)
- }
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/services/WidgetService.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/services/WidgetService.kt
new file mode 100644
index 000000000..33e410aae
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/services/WidgetService.kt
@@ -0,0 +1,9 @@
+package com.simplemobiletools.calendar.services
+
+import android.content.Intent
+import android.widget.RemoteViewsService
+import com.simplemobiletools.calendar.adapters.EventListWidgetAdapter
+
+class WidgetService : RemoteViewsService() {
+ override fun onGetViewFactory(intent: Intent) = EventListWidgetAdapter(applicationContext, intent)
+}