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) +}