diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d456c4856..d0eef34b4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -323,6 +323,14 @@
android:resource="@xml/samsung_scrollable_flex_window_widget_meta_info"/>
+
+
+
+
+
+
= Build.VERSION_CODES.S) PendingIntent.FLAG_MUTABLE else PendingIntent.FLAG_UPDATE_CURRENT
+ )
+ appWidgetManager.requestPinAppWidget(provider, null, successCallback)
+ firebase.logEvent(R.string.event_create_widget, R.string.param_type to "settings_activity")
+ }
+ }
+
companion object {
private const val FRAG_TAG_COLOR_PICKER = "frag_tag_color_picker"
diff --git a/app/src/main/java/org/tasks/compose/settings/AddWidgetToHomeRow.kt b/app/src/main/java/org/tasks/compose/settings/AddWidgetToHomeRow.kt
new file mode 100644
index 000000000..66ce507cb
--- /dev/null
+++ b/app/src/main/java/org/tasks/compose/settings/AddWidgetToHomeRow.kt
@@ -0,0 +1,69 @@
+package org.tasks.compose.settings
+
+import android.appwidget.AppWidgetManager
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.outlined.Home
+import androidx.compose.material.icons.outlined.Widgets
+import androidx.compose.material3.Icon
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalInspectionMode
+import androidx.compose.ui.res.colorResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.core.content.pm.ShortcutManagerCompat
+import com.todoroo.andlib.utility.AndroidUtilities
+import com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo
+import org.tasks.R
+import org.tasks.compose.Constants
+import org.tasks.kmp.org.tasks.compose.settings.SettingRow
+import org.tasks.themes.TasksTheme
+
+@Composable
+fun AddWidgetToHomeRow(onClick: () -> Unit) {
+ val context = LocalContext.current
+ val isRequestPinAppWidgetSupported = LocalInspectionMode.current || remember {
+ atLeastOreo() &&
+ context.getSystemService(AppWidgetManager::class.java).isRequestPinAppWidgetSupported
+ }
+ if (isRequestPinAppWidgetSupported) {
+ SettingRow(
+ modifier = Modifier.clickable(onClick = onClick),
+ left = {
+ Box(
+ modifier = Modifier.size(48.dp),
+ contentAlignment = Alignment.Center
+ ) {
+ Icon(
+ imageVector = Icons.Outlined.Widgets,
+ contentDescription = null,
+ tint = colorResource(R.color.icon_tint_with_alpha),
+ )
+ }
+ },
+ center = {
+ Text(
+ text = stringResource(R.string.add_widget_to_home_screen),
+ modifier = Modifier.padding(start = Constants.KEYLINE_FIRST)
+ )
+ }
+ )
+ }
+}
+
+@Composable
+@Preview(showBackground = true)
+private fun AddToHomePreview() {
+ TasksTheme {
+ AddShortcutToHomeRow(onClick = {})
+ }
+}
diff --git a/app/src/main/java/org/tasks/compose/settings/ListSettingsContent.kt b/app/src/main/java/org/tasks/compose/settings/ListSettingsContent.kt
index 906bdf809..b54a24058 100644
--- a/app/src/main/java/org/tasks/compose/settings/ListSettingsContent.kt
+++ b/app/src/main/java/org/tasks/compose/settings/ListSettingsContent.kt
@@ -20,6 +20,7 @@ fun ColumnScope.ListSettingsContent(
clearColor: () -> Unit,
pickIcon: () -> Unit,
addShortcutToHome: () -> Unit,
+ addWidgetToHome: () -> Unit,
extensionContent: @Composable ColumnScope.() -> Unit,
) {
TitleInput(
@@ -43,6 +44,9 @@ fun ColumnScope.ListSettingsContent(
AddShortcutToHomeRow(
onClick = { addShortcutToHome() },
)
+ AddWidgetToHomeRow(
+ onClick = { addWidgetToHome() }
+ )
}
extensionContent()
}
diff --git a/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt b/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt
index b64d5ab51..0c5de1f05 100644
--- a/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt
+++ b/app/src/main/java/org/tasks/opentasks/OpenTasksListSettingsActivity.kt
@@ -9,6 +9,7 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.compose.settings.AddShortcutToHomeRow
+import org.tasks.compose.settings.AddWidgetToHomeRow
import org.tasks.compose.settings.ListSettingsScaffold
import org.tasks.compose.settings.SelectIconRow
import org.tasks.compose.settings.Toaster
@@ -39,6 +40,7 @@ class OpenTasksListSettingsActivity : BaseCaldavCalendarSettingsActivity() {
) {
SelectIconRow(icon = viewState.icon ?: defaultIcon) { showIconPicker() }
AddShortcutToHomeRow(onClick = { createShortcut() })
+ AddWidgetToHomeRow(onClick = { createWidget() })
}
Toaster(state = snackbar)
}
diff --git a/app/src/main/java/org/tasks/widget/RequestPinWidgetReceiver.kt b/app/src/main/java/org/tasks/widget/RequestPinWidgetReceiver.kt
new file mode 100644
index 000000000..d30722a6f
--- /dev/null
+++ b/app/src/main/java/org/tasks/widget/RequestPinWidgetReceiver.kt
@@ -0,0 +1,35 @@
+package org.tasks.widget
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import dagger.hilt.android.AndroidEntryPoint
+import org.tasks.preferences.Preferences
+import timber.log.Timber
+import javax.inject.Inject
+
+@AndroidEntryPoint
+class RequestPinWidgetReceiver : BroadcastReceiver() {
+ @Inject lateinit var preferences: Preferences
+ @Inject lateinit var appWidgetManager: AppWidgetManager
+
+ override fun onReceive(context: Context, intent: Intent) {
+ val widgetId = intent.getIntExtra(android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID, -1)
+ if (widgetId == -1) {
+ Timber.e("Missing widgetId")
+ return
+ }
+ val filter = intent.getStringExtra(EXTRA_FILTER)
+ val color = intent.getIntExtra(EXTRA_COLOR, 0)
+ val widgetPreferences = WidgetPreferences(context, preferences, widgetId)
+ widgetPreferences.setFilter(filter)
+ widgetPreferences.setColor(color)
+ appWidgetManager.reconfigureWidgets()
+ }
+
+ companion object {
+ const val ACTION_CONFIGURE_WIDGET = "org.tasks.CONFIGURE_WIDGET"
+ const val EXTRA_FILTER = "extra_filter"
+ const val EXTRA_COLOR = "extra_color"
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml
index 1899ea993..b1140ac41 100644
--- a/app/src/main/res/values/keys.xml
+++ b/app/src/main/res/values/keys.xml
@@ -425,6 +425,7 @@
complete_task
request_review
create_shortcut
+ create_widget
type
map_theme
picker_mode_date
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b45183041..8b3f49fa9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -735,4 +735,5 @@ File %1$s contained %2$s.\n\n
Descending
Not available for tags, filters, or places
Add shortcut to home screen
+ Add widget to home screen