From f4863b813a55543e1eab8776bf9c50f12bd7acde Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 24 Dec 2024 05:36:25 -0600 Subject: [PATCH] Add "Add widget to home screen" to list settings --- app/src/main/AndroidManifest.xml | 8 +++ .../activities/BaseListSettingsActivity.kt | 32 +++++++++ .../compose/settings/AddWidgetToHomeRow.kt | 69 +++++++++++++++++++ .../compose/settings/ListSettingsContent.kt | 4 ++ .../OpenTasksListSettingsActivity.kt | 2 + .../tasks/widget/RequestPinWidgetReceiver.kt | 35 ++++++++++ app/src/main/res/values/keys.xml | 1 + app/src/main/res/values/strings.xml | 1 + 8 files changed, 152 insertions(+) create mode 100644 app/src/main/java/org/tasks/compose/settings/AddWidgetToHomeRow.kt create mode 100644 app/src/main/java/org/tasks/widget/RequestPinWidgetReceiver.kt 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