Limit widget task list size on Android 16+

Android 16 really slows down on large binder transactions
pull/3719/head
Alex Baker 5 months ago
parent e30c583d5a
commit c7336589cd

@ -75,6 +75,10 @@ object AndroidUtilities {
return Build.VERSION.SDK_INT >= VERSION_CODES.TIRAMISU
}
fun atLeastAndroid16(): Boolean {
return Build.VERSION.SDK_INT >= VERSION_CODES.BAKLAVA
}
fun assertMainThread() {
check(!(BuildConfig.DEBUG && !isMainThread)) { "Should be called from main thread" }
}

@ -5,6 +5,7 @@ import android.content.Intent
import android.view.View
import android.widget.RemoteViews
import android.widget.RemoteViewsService.RemoteViewsFactory
import com.todoroo.andlib.utility.AndroidUtilities.atLeastAndroid16
import com.todoroo.astrid.core.SortHelper
import com.todoroo.astrid.subtasks.SubtasksHelper
import kotlinx.coroutines.runBlocking
@ -50,6 +51,7 @@ internal class TasksWidgetViewFactory(
private val markdown: Markdown,
private val headerFormatter: HeaderFormatter,
) : RemoteViewsFactory {
private val taskLimit = if (atLeastAndroid16()) 25 + 1 else Int.MAX_VALUE
private val indentPadding = (20 * context.resources.displayMetrics.density).toInt()
private val settings = widgetPreferences.getWidgetListSettings()
private val hPad = context.resources.getDimension(R.dimen.widget_padding).toInt()
@ -87,10 +89,11 @@ internal class TasksWidgetViewFactory(
override fun onDestroy() {}
override fun getCount() = tasks.size
override fun getCount() = tasks.size.coerceAtMost(taskLimit)
override fun getViewAt(position: Int): RemoteViews? = tasks.let {
when {
position == taskLimit - 1 && it.size > taskLimit -> buildFooter()
it.isHeader(position) -> buildHeader(it.getSection(position))
position < it.size -> buildUpdate(it.getItem(position))
else -> null
@ -99,10 +102,11 @@ internal class TasksWidgetViewFactory(
override fun getLoadingView(): RemoteViews = newRemoteView()
override fun getViewTypeCount(): Int = 2
override fun getViewTypeCount(): Int = 3
override fun getItemId(position: Int) = tasks.let {
when {
position == taskLimit - 1 && it.size > taskLimit -> 0
it.isHeader(position) -> it.getSection(position).value
position < it.size -> it.getItem(position).id
else -> 0
@ -113,6 +117,16 @@ internal class TasksWidgetViewFactory(
private fun newRemoteView() = RemoteViews(BuildConfig.APPLICATION_ID, R.layout.widget_row)
private fun buildFooter(): RemoteViews {
return RemoteViews(BuildConfig.APPLICATION_ID, R.layout.widget_footer).apply {
setOnClickFillInIntent(
R.id.widget_view_more,
Intent(WidgetClickActivity.OPEN_TASK_LIST)
.putExtra(WidgetClickActivity.EXTRA_FILTER, filter)
)
}
}
private fun buildHeader(section: AdapterSection): RemoteViews {
val sortGroup = section.value
val header: String? = if (filter.supportsSorting()) {

@ -57,6 +57,16 @@ class WidgetClickActivity : AppCompatActivity(), OnDismissHandler {
)
finish()
}
OPEN_TASK_LIST -> {
val filter = intent.getParcelableExtra<Filter?>(EXTRA_FILTER)
Timber.tag("$action filter=$filter")
startActivity(
TaskIntents
.getTaskListIntent(this, filter)
.putExtra(FINISH_AFFINITY, true)
)
finish()
}
TOGGLE_SUBTASKS -> {
val task = task
val collapsed = intent.getBooleanExtra(EXTRA_COLLAPSED, false)
@ -110,6 +120,7 @@ class WidgetClickActivity : AppCompatActivity(), OnDismissHandler {
companion object {
const val COMPLETE_TASK = "COMPLETE_TASK"
const val EDIT_TASK = "EDIT_TASK"
const val OPEN_TASK_LIST = "OPEN_TASK_LIST"
const val TOGGLE_SUBTASKS = "TOGGLE_SUBTASKS"
const val RESCHEDULE_TASK = "RESCHEDULE_TASK"
const val TOGGLE_GROUP = "TOGGLE_GROUP"

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/widget_view_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@string/widget_view_more_tasks"
android:textSize="14sp"
android:padding="8dp" />
</RelativeLayout>

@ -726,4 +726,5 @@ File %1$s contained %2$s.\n\n
<string name="sync_warning_google_tasks_title">About Google Task sync</string>
<string name="sync_warning_google_tasks">Not all task details sync with Google Tasks</string>
<string name="button_learn_more">Learn more</string>
<string name="widget_view_more_tasks">View more tasks</string>
</resources>

Loading…
Cancel
Save