| /* |
| * Copyright (C) 2020 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 |
| * |
| * http://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.android.launcher3.util; |
| |
| import static androidx.test.core.app.ApplicationProvider.getApplicationContext; |
| import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; |
| |
| import static com.android.launcher3.WorkspaceLayoutManager.FIRST_SCREEN_ID; |
| |
| import android.appwidget.AppWidgetHost; |
| import android.appwidget.AppWidgetManager; |
| import android.appwidget.AppWidgetProviderInfo; |
| import android.content.ComponentName; |
| import android.content.ContentResolver; |
| import android.content.Context; |
| import android.os.Bundle; |
| import android.os.Process; |
| |
| import com.android.launcher3.LauncherSettings; |
| import com.android.launcher3.model.data.ItemInfo; |
| import com.android.launcher3.model.data.LauncherAppWidgetInfo; |
| import com.android.launcher3.widget.LauncherAppWidgetHost; |
| import com.android.launcher3.widget.LauncherAppWidgetProviderInfo; |
| import com.android.launcher3.widget.PendingAddWidgetInfo; |
| import com.android.launcher3.widget.WidgetManagerHelper; |
| |
| /** |
| * Common method for widget binding |
| */ |
| public class WidgetUtils { |
| |
| /** |
| * Creates a LauncherAppWidgetInfo corresponding to {@param info} |
| * |
| * @param bindWidget if true the info is bound and a valid widgetId is assigned to |
| * the LauncherAppWidgetInfo |
| */ |
| public static LauncherAppWidgetInfo createWidgetInfo( |
| LauncherAppWidgetProviderInfo info, Context targetContext, boolean bindWidget) { |
| LauncherAppWidgetInfo item = new LauncherAppWidgetInfo( |
| LauncherAppWidgetInfo.NO_ID, info.provider); |
| item.spanX = info.minSpanX; |
| item.spanY = info.minSpanY; |
| item.minSpanX = info.minSpanX; |
| item.minSpanY = info.minSpanY; |
| item.user = info.getProfile(); |
| item.cellX = 0; |
| item.cellY = 1; |
| item.container = LauncherSettings.Favorites.CONTAINER_DESKTOP; |
| |
| if (bindWidget) { |
| PendingAddWidgetInfo pendingInfo = |
| new PendingAddWidgetInfo( |
| info, LauncherSettings.Favorites.CONTAINER_WIDGETS_TRAY); |
| pendingInfo.spanX = item.spanX; |
| pendingInfo.spanY = item.spanY; |
| pendingInfo.minSpanX = item.minSpanX; |
| pendingInfo.minSpanY = item.minSpanY; |
| Bundle options = pendingInfo.getDefaultSizeOptions(targetContext); |
| |
| AppWidgetHost host = new LauncherAppWidgetHost(targetContext); |
| int widgetId = host.allocateAppWidgetId(); |
| if (!new WidgetManagerHelper(targetContext) |
| .bindAppWidgetIdIfAllowed(widgetId, info, options)) { |
| host.deleteAppWidgetId(widgetId); |
| throw new IllegalArgumentException("Unable to bind widget id"); |
| } |
| item.appWidgetId = widgetId; |
| } |
| return item; |
| } |
| |
| /** |
| * Adds {@param item} on the homescreen on the 0th screen |
| */ |
| public static void addItemToScreen(ItemInfo item, Context targetContext) { |
| ContentResolver resolver = targetContext.getContentResolver(); |
| int screenId = FIRST_SCREEN_ID; |
| // Update the screen id counter for the provider. |
| LauncherSettings.Settings.call(resolver, |
| LauncherSettings.Settings.METHOD_NEW_SCREEN_ID); |
| |
| if (screenId > FIRST_SCREEN_ID) { |
| screenId = FIRST_SCREEN_ID; |
| } |
| |
| // Insert the item |
| ContentWriter writer = new ContentWriter(targetContext); |
| item.id = LauncherSettings.Settings.call( |
| resolver, LauncherSettings.Settings.METHOD_NEW_ITEM_ID) |
| .getInt(LauncherSettings.Settings.EXTRA_VALUE); |
| item.screenId = screenId; |
| item.onAddToDatabase(writer); |
| writer.put(LauncherSettings.Favorites._ID, item.id); |
| resolver.insert(LauncherSettings.Favorites.CONTENT_URI, |
| writer.getValues(targetContext)); |
| } |
| |
| |
| /** |
| * Creates a {@link AppWidgetProviderInfo} for the provided component name |
| */ |
| public static AppWidgetProviderInfo createAppWidgetProviderInfo(ComponentName cn) { |
| AppWidgetProviderInfo info = AppWidgetManager.getInstance(getApplicationContext()) |
| .getInstalledProvidersForPackage( |
| getInstrumentation().getContext().getPackageName(), Process.myUserHandle()) |
| .get(0); |
| info.provider = cn; |
| return info; |
| } |
| } |