From e1e4cb8fd368a6b47576dd0e5a4823fdba76bd88 Mon Sep 17 00:00:00 2001 From: Shamali P Date: Fri, 17 Jan 2025 20:35:18 +0000 Subject: [PATCH 01/44] Delete the outdated button widget demo code. - "rv" is not recommended and "glance" is the preferred widget framework. - Sizing on those widgets is off. The new canonical layouts are recommended. --- .../appwidgets/src/main/AndroidManifest.xml | 12 -- .../glance/buttons/ButtonsGlanceWidget.kt | 173 ------------------ .../appwidgets/rv/buttons/ButtonsAppWidget.kt | 160 ---------------- .../drawable-nodpi/buttons_widget_preview.png | Bin 6378 -> 0 bytes .../src/main/res/layout/widget_buttons.xml | 38 ---- .../res/layout/widget_buttons_preview.xml | 47 ----- .../src/main/res/values/strings.xml | 3 - .../res/xml/app_widget_buttons_glance.xml | 28 --- .../main/res/xml/app_widget_buttons_rv.xml | 32 ---- 9 files changed, 493 deletions(-) delete mode 100644 samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/glance/buttons/ButtonsGlanceWidget.kt delete mode 100644 samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/buttons/ButtonsAppWidget.kt delete mode 100644 samples/user-interface/appwidgets/src/main/res/drawable-nodpi/buttons_widget_preview.png delete mode 100644 samples/user-interface/appwidgets/src/main/res/layout/widget_buttons.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/layout/widget_buttons_preview.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/xml/app_widget_buttons_glance.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/xml/app_widget_buttons_rv.xml diff --git a/samples/user-interface/appwidgets/src/main/AndroidManifest.xml b/samples/user-interface/appwidgets/src/main/AndroidManifest.xml index c5501a42..00d64b8f 100644 --- a/samples/user-interface/appwidgets/src/main/AndroidManifest.xml +++ b/samples/user-interface/appwidgets/src/main/AndroidManifest.xml @@ -221,18 +221,6 @@ android:name="android.appwidget.provider" android:resource="@xml/app_widget_weather_forecast_glance" /> - - - - - - - (), - ) - } - item { - CheckBox( - text = "Checkbox", - checked = currentState(key = CheckboxKey) ?: false, - onCheckedChange = actionRunCallback( - actionParametersOf(SelectedKey to CheckboxKey.name), - ), - ) - } - item { - Switch( - text = "Switch", - checked = currentState(key = SwitchKey) ?: false, - onCheckedChange = actionRunCallback( - actionParametersOf(SelectedKey to SwitchKey.name), - ), - ) - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - item { - // Radio buttons are not implemented yet in Glance, using the interop - // composable to use the RemoteView + XML - AndroidRemoteViews( - remoteViews = RemoteViews( - LocalContext.current.packageName, - R.layout.item_radio_buttons, - ).apply { - // This code will check the item_radio_button2 in the - // item_radio_group RadioGroup - setRadioGroupChecked( - R.id.item_radio_group, - R.id.item_radio_button2, - ) - }, - ) - } - } - } - } - } - } -} - -private val CheckboxKey = booleanPreferencesKey("checkbox") -private val SwitchKey = booleanPreferencesKey("switch") -private val SelectedKey = ActionParameters.Key("key") - -class CompoundButtonAction : ActionCallback { - override suspend fun onAction( - context: Context, - glanceId: GlanceId, - parameters: ActionParameters, - ) { - // The framework automatically sets the value of the toggled action (true/false) - // Retrieve it using the ToggleableStateKey - val toggled = parameters[ToggleableStateKey] ?: false - updateAppWidgetState(context, glanceId) { prefs -> - // Get which button the action came from - val key = booleanPreferencesKey(parameters[SelectedKey] ?: return@updateAppWidgetState) - // Update the state - prefs[key] = toggled - } - ButtonsGlanceWidget().update(context, glanceId) - } -} - -class ButtonsGlanceWidgetReceiver : GlanceAppWidgetReceiver() { - override val glanceAppWidget: GlanceAppWidget = ButtonsGlanceWidget() -} diff --git a/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/buttons/ButtonsAppWidget.kt b/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/buttons/ButtonsAppWidget.kt deleted file mode 100644 index c822126b..00000000 --- a/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/buttons/ButtonsAppWidget.kt +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.platform.ui.appwidgets.rv.buttons - -import android.app.PendingIntent -import android.appwidget.AppWidgetManager -import android.appwidget.AppWidgetProvider -import android.content.Context -import android.content.Intent -import android.os.Build -import android.widget.RemoteViews -import android.widget.Toast -import androidx.annotation.LayoutRes -import androidx.core.widget.RemoteViewsCompat -import androidx.core.widget.RemoteViewsCompat.RemoteCollectionItems -import com.example.platform.ui.appwidgets.R -import com.example.platform.ui.appwidgets.rv.buttons.WidgetItems.EXTRA_VIEW_ID -import com.example.platform.ui.appwidgets.rv.buttons.WidgetItems.REQUEST_CODE -import com.example.platform.ui.appwidgets.rv.buttons.WidgetItems.REQUEST_CODE_FROM_COLLECTION_WIDGET - - -/** - * Implementation of App Widget functionality that demonstrates the difference of how the list of - * items are inflated with API level 31 and older API levels. - * This widget also demonstrates the compound buttons (Checkbox, RadioButton, Switch), that are now - * supported in widgets starting from API level 31. - */ -class ButtonsAppWidget : AppWidgetProvider() { - - override fun onUpdate( - context: Context, - appWidgetManager: AppWidgetManager, - appWidgetIds: IntArray, - ) { - val remoteViews = RemoteViews(context.packageName, R.layout.widget_buttons) - appWidgetIds.forEach { id -> - RemoteViewsCompat.setRemoteAdapter( - context = context, - remoteViews = remoteViews, - appWidgetId = id, - viewId = R.id.buttons_list_view, - items = WidgetItems.getRemoteCollectionItems(context) - ) - } - appWidgetManager.updateAppWidget(appWidgetIds, remoteViews) - } - - override fun onReceive(context: Context?, intent: Intent?) { - super.onReceive(context, intent) - if (Build.VERSION.SDK_INT >= 31 && - intent?.extras?.getInt(REQUEST_CODE) == REQUEST_CODE_FROM_COLLECTION_WIDGET - ) { - val checked = intent.extras?.getBoolean(RemoteViews.EXTRA_CHECKED, false) - Toast.makeText( - context, - "ViewId : ${intent.extras?.getInt(EXTRA_VIEW_ID)}'s checked status is now : $checked", - Toast.LENGTH_SHORT - ).show() - } - } -} - - -private object WidgetItems { - val items = listOf( - R.layout.item_buttons, - R.layout.item_checkboxes, - R.layout.item_radio_buttons, - R.layout.item_switches, - ) - - const val REQUEST_CODE_FROM_COLLECTION_WIDGET = 2 - const val EXTRA_VIEW_ID = "extra_view_id" - const val REQUEST_CODE = "request_code" - - fun getRemoteCollectionItems(context: Context): RemoteCollectionItems { - val builder = RemoteCollectionItems.Builder() - items.forEachIndexed { index, layoutId -> - builder.addItem(index.toLong(), constructRemoteViews(context, layoutId)) - } - return builder.setHasStableIds(true).setViewTypeCount(items.count()).build() - } - - private fun constructRemoteViews(context: Context, @LayoutRes layoutId: Int): RemoteViews { - val remoteViews = RemoteViews(context.packageName, layoutId) - if (Build.VERSION.SDK_INT < 31) { - return remoteViews - } - // Compound buttons in a widget are stateless. You need to change the state and register for - // the state change events. - when (layoutId) { - R.layout.item_buttons -> { - val activityIntent = PendingIntent.getActivity( - context, - 0, - context.packageManager.getLaunchIntentForPackage(context.packageName)!!, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE - ) - remoteViews.setOnClickPendingIntent(R.id.item_button, activityIntent) - } - - R.layout.item_checkboxes -> { - // This code will check the Checkbox - remoteViews.setCompoundButtonChecked(R.id.item_checkbox, true) - } - - R.layout.item_radio_buttons -> { - // This code will check the item_radio_button2 in the item_radio_group RadioGroup - remoteViews.setRadioGroupChecked( - R.id.item_radio_group, - R.id.item_radio_button2 - ) - } - - R.layout.item_switches -> { - val viewId = R.id.item_switch - val onCheckedChangePendingIntent = PendingIntent.getBroadcast( - context, - REQUEST_CODE_FROM_COLLECTION_WIDGET, - Intent(context, ButtonsAppWidget::class.java).apply { - putExtra(EXTRA_VIEW_ID, viewId) - putExtra(REQUEST_CODE, REQUEST_CODE_FROM_COLLECTION_WIDGET) - }, - // API level 31 requires specifying either of - // PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_MUTABLE - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE - ) - // Listen for change events. - // RemoteResponse.fromPendingIntent works on an individual item whereas you can set - // a PendingIntent template using RemoteViews.setPendingIntentTemplate and - // distinguish individual on-click by calling RemoteResponse.fromFillInIntent. - // See - // https://developer.android.com/reference/android/widget/RemoteViews.RemoteResponse#fromPendingIntent(android.app.PendingIntent) - // https://developer.android.com/reference/android/widget/RemoteViews.RemoteResponse#fromFillInIntent(android.content.Intent) - // for more details. - remoteViews.setOnCheckedChangeResponse( - viewId, - RemoteViews.RemoteResponse.fromPendingIntent( - onCheckedChangePendingIntent - ) - ) - } - } - return remoteViews - } -} \ No newline at end of file diff --git a/samples/user-interface/appwidgets/src/main/res/drawable-nodpi/buttons_widget_preview.png b/samples/user-interface/appwidgets/src/main/res/drawable-nodpi/buttons_widget_preview.png deleted file mode 100644 index af068e36fa5a174378260907beb6f2e4f713edc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6378 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 - - - - - - \ No newline at end of file diff --git a/samples/user-interface/appwidgets/src/main/res/layout/widget_buttons_preview.xml b/samples/user-interface/appwidgets/src/main/res/layout/widget_buttons_preview.xml deleted file mode 100644 index 8f0e7cd5..00000000 --- a/samples/user-interface/appwidgets/src/main/res/layout/widget_buttons_preview.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/user-interface/appwidgets/src/main/res/values/strings.xml b/samples/user-interface/appwidgets/src/main/res/values/strings.xml index eaa048ed..9935de2a 100644 --- a/samples/user-interface/appwidgets/src/main/res/values/strings.xml +++ b/samples/user-interface/appwidgets/src/main/res/values/strings.xml @@ -44,9 +44,6 @@ Radio Button 2 Check box Switch - Widget for collection of items - Glance Widget of CompoundButtons - Items collection Weather Glance Weather Random Images diff --git a/samples/user-interface/appwidgets/src/main/res/xml/app_widget_buttons_glance.xml b/samples/user-interface/appwidgets/src/main/res/xml/app_widget_buttons_glance.xml deleted file mode 100644 index 2f43f399..00000000 --- a/samples/user-interface/appwidgets/src/main/res/xml/app_widget_buttons_glance.xml +++ /dev/null @@ -1,28 +0,0 @@ - - \ No newline at end of file diff --git a/samples/user-interface/appwidgets/src/main/res/xml/app_widget_buttons_rv.xml b/samples/user-interface/appwidgets/src/main/res/xml/app_widget_buttons_rv.xml deleted file mode 100644 index 565b83af..00000000 --- a/samples/user-interface/appwidgets/src/main/res/xml/app_widget_buttons_rv.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - \ No newline at end of file From cf2468b5e4149dc58fe9b409672519be759e2743 Mon Sep 17 00:00:00 2001 From: Shamali P Date: Fri, 17 Jan 2025 20:48:11 +0000 Subject: [PATCH 02/44] Delete the outdated list widget demo code. - "rv" is not recommended and "glance" is the preferred widget framework. - Sizing on those widgets is off. The new canonical layout contain example of lists and are recommended. --- .../appwidgets/src/main/AndroidManifest.xml | 43 ----- .../glance/list/ListGlanceWidget.kt | 168 ------------------ .../ui/appwidgets/rv/list/ListAppWidget.kt | 117 ------------ .../appwidgets/rv/list/ListSharedPrefsUtil.kt | 48 ----- .../rv/list/ListWidgetConfigureActivity.kt | 78 -------- .../grocery_list_widget_preview.png | Bin 5182 -> 0 bytes .../todo_list_glance_widget_preview.png | Bin 18971 -> 0 bytes .../configure_activity_list_background.xml | 24 --- ...e_activity_list_background_with_ripple.xml | 27 --- .../src/main/res/drawable/ic_add_24.xml | 25 --- .../res/drawable/ic_android_black_24dp.xml | 5 - .../res/layout/activity_widget_configure.xml | 101 ----------- .../src/main/res/layout/item_buttons.xml | 28 --- .../src/main/res/layout/item_checkboxes.xml | 29 --- .../main/res/layout/item_radio_buttons.xml | 37 ---- .../src/main/res/layout/item_switches.xml | 32 ---- .../widget_checkbox_list_title_region.xml | 45 ----- .../main/res/layout/widget_grocery_grid.xml | 79 -------- .../main/res/layout/widget_grocery_list.xml | 26 --- .../layout/widget_grocery_list_left_items.xml | 47 ----- .../src/main/res/layout/widget_todo_list.xml | 42 ----- .../widget_todo_list_glance_preview.xml | 87 --------- .../src/main/res/values/strings.xml | 27 +-- .../main/res/xml/app_widget_list_glance.xml | 31 ---- .../src/main/res/xml/app_widget_list_rv.xml | 52 ------ 25 files changed, 1 insertion(+), 1197 deletions(-) delete mode 100644 samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/glance/list/ListGlanceWidget.kt delete mode 100644 samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/list/ListAppWidget.kt delete mode 100644 samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/list/ListSharedPrefsUtil.kt delete mode 100644 samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/list/ListWidgetConfigureActivity.kt delete mode 100644 samples/user-interface/appwidgets/src/main/res/drawable-nodpi/grocery_list_widget_preview.png delete mode 100644 samples/user-interface/appwidgets/src/main/res/drawable-nodpi/todo_list_glance_widget_preview.png delete mode 100644 samples/user-interface/appwidgets/src/main/res/drawable/configure_activity_list_background.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/drawable/configure_activity_list_background_with_ripple.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/drawable/ic_add_24.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/drawable/ic_android_black_24dp.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/layout/activity_widget_configure.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/layout/item_buttons.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/layout/item_checkboxes.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/layout/item_radio_buttons.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/layout/item_switches.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/layout/widget_checkbox_list_title_region.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/layout/widget_grocery_grid.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/layout/widget_grocery_list.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/layout/widget_grocery_list_left_items.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/layout/widget_todo_list.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/layout/widget_todo_list_glance_preview.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/xml/app_widget_list_glance.xml delete mode 100644 samples/user-interface/appwidgets/src/main/res/xml/app_widget_list_rv.xml diff --git a/samples/user-interface/appwidgets/src/main/AndroidManifest.xml b/samples/user-interface/appwidgets/src/main/AndroidManifest.xml index 00d64b8f..89f2166b 100644 --- a/samples/user-interface/appwidgets/src/main/AndroidManifest.xml +++ b/samples/user-interface/appwidgets/src/main/AndroidManifest.xml @@ -30,15 +30,6 @@ android:name="com.example.platform.ui.appwidgets.AppWidgetPinnedReceiver" android:exported="false" /> - - - - - - @@ -162,28 +153,6 @@ android:resource="@xml/sample_image_grid_widget_info" /> - - - - - - - - - - - - - - - - - - - - - - CheckBoxItem(id) - } - } - } - } - } -} - -@Composable -private fun CheckBoxItem(id: Int) { - val prefs = currentState() - val checked = prefs[booleanPreferencesKey(id.toString())] ?: false - CheckBox( - text = LocalContext.current.getString(id), - checked = checked, - onCheckedChange = actionRunCallback( - actionParametersOf( - toggledStringIdKey to id.toString(), - ), - ), - modifier = GlanceModifier.padding(12.dp), - ) -} - -@Composable -private fun CountChecked() { - val prefs = currentState() - val checkedCount = groceryStringIds.filter { - prefs[booleanPreferencesKey(it.toString())] ?: false - }.size - - Text( - text = "$checkedCount checkboxes checked", - modifier = GlanceModifier.padding(start = 8.dp), - ) -} - -private val toggledStringIdKey = ActionParameters.Key("ToggledStringIdKey") - -private val groceryStringIds = listOf( - R.string.grocery_list_milk, - R.string.grocery_list_eggs, - R.string.grocery_list_tomatoes, - R.string.grocery_list_bacon, - R.string.grocery_list_butter, - R.string.grocery_list_cheese, - R.string.grocery_list_potatoes, - R.string.grocery_list_broccoli, - R.string.grocery_list_salmon, - R.string.grocery_list_yogurt, -) - -class CheckboxClickAction : ActionCallback { - override suspend fun onAction( - context: Context, - glanceId: GlanceId, - parameters: ActionParameters, - ) { - val toggledStringId = requireNotNull(parameters[toggledStringIdKey]) { - "Add $toggledStringIdKey parameter in the ActionParameters." - } - - // The checked state of the clicked checkbox can be added implicitly to the parameters and - // can be retrieved by using the ToggleableStateKey - val checked = requireNotNull(parameters[ToggleableStateKey]) { - "This action should only be called in response to toggleable events" - } - updateAppWidgetState(context, glanceId) { state -> - state[booleanPreferencesKey(toggledStringId)] = checked - } - ListGlanceWidget().update(context, glanceId) - } -} - -class ListGlanceWidgetReceiver : GlanceAppWidgetReceiver() { - - override val glanceAppWidget: GlanceAppWidget = ListGlanceWidget() -} diff --git a/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/list/ListAppWidget.kt b/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/list/ListAppWidget.kt deleted file mode 100644 index ffc40f95..00000000 --- a/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/list/ListAppWidget.kt +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.platform.ui.appwidgets.rv.list - -import android.annotation.SuppressLint -import android.app.PendingIntent -import android.appwidget.AppWidgetManager -import android.appwidget.AppWidgetProvider -import android.content.Context -import android.content.Intent -import android.widget.RemoteViews -import androidx.annotation.LayoutRes -import androidx.core.util.SizeFCompat -import androidx.core.widget.createResponsiveSizeAppWidget -import com.example.platform.ui.appwidgets.R - -/** - * Implementation of a list app widget. - */ -class ListAppWidget : AppWidgetProvider() { - - override fun onUpdate( - context: Context, - appWidgetManager: AppWidgetManager, - appWidgetIds: IntArray, - ) { - // There may be multiple widgets active, so update all of them - for (appWidgetId in appWidgetIds) { - updateAppWidget(context, appWidgetManager, appWidgetId) - } - } - - override fun onDeleted(context: Context, appWidgetIds: IntArray) { - // When the user deletes the widget, delete the preference associated with it. - for (appWidgetId in appWidgetIds) { - ListSharedPrefsUtil.deleteWidgetLayoutIdPref(context, appWidgetId) - } - } - - companion object { - - private const val REQUEST_CODE_OPEN_ACTIVITY = 1 - - @SuppressLint("RemoteViewLayout") - internal fun updateAppWidget( - context: Context, - appWidgetManager: AppWidgetManager, - appWidgetId: Int, - ) { - // TODO use deeplink - val activityIntent = - context.packageManager.getLaunchIntentForPackage(context.packageName)!!.apply { - flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK - } - val appOpenIntent = PendingIntent.getActivity( - context, - REQUEST_CODE_OPEN_ACTIVITY, - activityIntent, - // API level 31 requires specifying either of - // PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_MUTABLE - // See https://developer.android.com/about/versions/12/behavior-changes-12#pending-intent-mutability - PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) - - fun constructRemoteViews( - @LayoutRes widgetLayoutId: Int, - ) = RemoteViews(context.packageName, widgetLayoutId).apply { - if (widgetLayoutId == R.layout.widget_grocery_list || - widgetLayoutId == R.layout.widget_grocery_grid - ) { - setTextViewText( - R.id.checkbox_list_title, - context.resources.getText(R.string.grocery_list) - ) - } else if (widgetLayoutId == R.layout.widget_todo_list) { - setTextViewText( - R.id.checkbox_list_title, - context.resources.getText(R.string.todo_list) - ) - } - setOnClickPendingIntent(R.id.checkbox_list_title, appOpenIntent) - } - - val layoutId = ListSharedPrefsUtil.loadWidgetLayoutIdPref(context, appWidgetId) - val remoteViews = if (layoutId == R.layout.widget_grocery_list) { - // Specify the maximum width and height in dp and a layout, which you want to use - // for the specified size - val sizes = listOf(SizeFCompat(150f, 150f), SizeFCompat(250f, 150f)) - createResponsiveSizeAppWidget(appWidgetManager, appWidgetId, sizes) { size -> - val id = if (size == sizes[0]) { - R.layout.widget_grocery_list - } else { - R.layout.widget_grocery_grid - } - constructRemoteViews(id) - } - } else { - constructRemoteViews(layoutId) - } - appWidgetManager.updateAppWidget(appWidgetId, remoteViews) - } - } -} diff --git a/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/list/ListSharedPrefsUtil.kt b/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/list/ListSharedPrefsUtil.kt deleted file mode 100644 index 9b33ec77..00000000 --- a/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/list/ListSharedPrefsUtil.kt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.platform.ui.appwidgets.rv.list - -import android.content.Context -import android.content.SharedPreferences -import androidx.annotation.LayoutRes -import androidx.core.content.edit -import com.example.platform.ui.appwidgets.R - -object ListSharedPrefsUtil { - private const val PREFS_NAME = "com.example.android.appwidget.GroceryListWidget" - private const val PREF_PREFIX_KEY = "appwidget_" - - internal fun saveWidgetLayoutIdPref( - context: Context, - appWidgetId: Int, - @LayoutRes layoutId: Int, - ) { - context.getSharedPreferences(PREFS_NAME, 0).edit { - putInt(PREF_PREFIX_KEY + appWidgetId, layoutId) - } - } - - internal fun loadWidgetLayoutIdPref(context: Context, appWidgetId: Int): Int = - context.getSharedPreferences(PREFS_NAME, 0) - .getInt(PREF_PREFIX_KEY + appWidgetId, R.layout.widget_grocery_list) - - internal fun deleteWidgetLayoutIdPref(context: Context, appWidgetId: Int) { - context.getSharedPreferences(PREFS_NAME, 0).edit { - remove(PREF_PREFIX_KEY + appWidgetId) - } - } -} \ No newline at end of file diff --git a/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/list/ListWidgetConfigureActivity.kt b/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/list/ListWidgetConfigureActivity.kt deleted file mode 100644 index dda5b46c..00000000 --- a/samples/user-interface/appwidgets/src/main/java/com/example/platform/ui/appwidgets/rv/list/ListWidgetConfigureActivity.kt +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.example.platform.ui.appwidgets.rv.list - -import android.appwidget.AppWidgetManager -import android.content.Intent -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.annotation.LayoutRes -import com.example.platform.ui.appwidgets.R -import com.example.platform.ui.appwidgets.databinding.ActivityWidgetConfigureBinding - -/** - * The configuration screen for the [ListAppWidget] widget. - */ -class ListWidgetConfigureActivity : ComponentActivity() { - - private var appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID - - public override fun onCreate(icicle: Bundle?) { - super.onCreate(icicle) - - // Find the widget id from the intent. - appWidgetId = intent?.extras?.getInt( - AppWidgetManager.EXTRA_APPWIDGET_ID, - AppWidgetManager.INVALID_APPWIDGET_ID - ) ?: AppWidgetManager.INVALID_APPWIDGET_ID - - // If this activity was started with an intent without an app widget ID, just finish. - if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { - finish() - return - } - - // Set the result to CANCELED. This will cause the widget host to cancel - // out of the widget placement if the user presses the back button. - // Make sure we pass back the original appWidgetId. - val resultData = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) - setResult(RESULT_CANCELED, resultData) - - val binding = ActivityWidgetConfigureBinding.inflate(layoutInflater) - setContentView(binding.root) - title = getString(R.string.select_list_for_widget) - - binding.groceryListContainer.setOnClickListener { - onWidgetContainerClicked(R.layout.widget_grocery_list) - } - binding.todoListContainer.setOnClickListener { - onWidgetContainerClicked(R.layout.widget_todo_list) - } - } - - private fun onWidgetContainerClicked(@LayoutRes widgetLayoutResId: Int) { - ListSharedPrefsUtil.saveWidgetLayoutIdPref(this, appWidgetId, widgetLayoutResId) - // It is the responsibility of the configuration activity to update the app widget - val appWidgetManager = AppWidgetManager.getInstance(this) - ListAppWidget.updateAppWidget(this, appWidgetManager, appWidgetId) - - // Make sure we pass back the original appWidgetId. - val resultData = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) - setResult(RESULT_OK, resultData) - finish() - } -} diff --git a/samples/user-interface/appwidgets/src/main/res/drawable-nodpi/grocery_list_widget_preview.png b/samples/user-interface/appwidgets/src/main/res/drawable-nodpi/grocery_list_widget_preview.png deleted file mode 100644 index b5dce20118e00a32b16d168a6bea2e15700ffec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5182 zcma)AcQoAJw*LkRq9$Z87zsh5iy9;&O9o_2Pw@Yil$ zTcp^h0KhP$s-*D3H)Dg~XUgDkLB8$Ab1&2s+CUetCR6ck_z^a^AoA3o5>-iHpP&2ki-{Rw$c z`Me@{R`{YzZntlde~mPhf|)|86?&KC z2FWcE`VS%h!Wzn~tKBC`o$}vwWd`+ndJ02ivkgl6Ws4zgendgm;;m#`iz2~?LwujF zYsCs(T+CQyCzB{h(GCdg$q@Q&>7OQJyKEJp$ku-2zgk6(J|Kwql zNlY~snEMkl8fG}PaT=TfUF6}mm_X5s*m?e-N|@B5ti6*|G$k*8j`P-+LI_kPc&*>< zFLE0UX;C2kI^Oulq(xb1D+)^S{vW#XQP5Pm$k(Ms-4~waTX~d<4*eo6P-)*imL{Sm zMlFczNiKoMA8q)sq|p1M4isUP&I-Qc{U~TTa+uGkYkjSTZ-jJgO&km}GgG%=XcM6$ zwhq=*wPaWKBjQfO$^*LQvdnq1?nMjPUPIp5`Fc6m{um45?p;wZldcc>3ySmw@p_#{QtYyM2^m3%^q z8hKwT7$kpDNGJb?4b1-Z;f!w$%WSZbg&qj&f4$vae$f}skPxk}S6F7@AUzYkem#xy zbTMDAZ7$4Sg9^#2?jc=Id|S58@Q*3xBO-MyeCV#)>MLypCp&_g{g|L zwzs;v!k@If+Vzgops`Ps-cIUm=%0Dobqx{WH?;k}{e@fJIle7Fd&Ut<7RT=LZGoj@ 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 E3llBjS^xk5 diff --git a/samples/user-interface/appwidgets/src/main/res/drawable-nodpi/todo_list_glance_widget_preview.png b/samples/user-interface/appwidgets/src/main/res/drawable-nodpi/todo_list_glance_widget_preview.png deleted file mode 100644 index 12e492d8b962b9c468798f325ae0b0846b1803ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18971 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 P00000NkvXXu0mjfjHEp4 diff --git a/samples/user-interface/appwidgets/src/main/res/drawable/configure_activity_list_background.xml b/samples/user-interface/appwidgets/src/main/res/drawable/configure_activity_list_background.xml deleted file mode 100644 index 6ce338a4..00000000 --- a/samples/user-interface/appwidgets/src/main/res/drawable/configure_activity_list_background.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/samples/user-interface/appwidgets/src/main/res/drawable/configure_activity_list_background_with_ripple.xml b/samples/user-interface/appwidgets/src/main/res/drawable/configure_activity_list_background_with_ripple.xml deleted file mode 100644 index 60b36291..00000000 --- a/samples/user-interface/appwidgets/src/main/res/drawable/configure_activity_list_background_with_ripple.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/user-interface/appwidgets/src/main/res/drawable/ic_add_24.xml b/samples/user-interface/appwidgets/src/main/res/drawable/ic_add_24.xml deleted file mode 100644 index f1825731..00000000 --- a/samples/user-interface/appwidgets/src/main/res/drawable/ic_add_24.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - diff --git a/samples/user-interface/appwidgets/src/main/res/drawable/ic_android_black_24dp.xml b/samples/user-interface/appwidgets/src/main/res/drawable/ic_android_black_24dp.xml deleted file mode 100644 index fe512307..00000000 --- a/samples/user-interface/appwidgets/src/main/res/drawable/ic_android_black_24dp.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/samples/user-interface/appwidgets/src/main/res/layout/activity_widget_configure.xml b/samples/user-interface/appwidgets/src/main/res/layout/activity_widget_configure.xml deleted file mode 100644 index f7a2b149..00000000 --- a/samples/user-interface/appwidgets/src/main/res/layout/activity_widget_configure.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/user-interface/appwidgets/src/main/res/layout/item_buttons.xml b/samples/user-interface/appwidgets/src/main/res/layout/item_buttons.xml deleted file mode 100644 index b6af1b4c..00000000 --- a/samples/user-interface/appwidgets/src/main/res/layout/item_buttons.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - -