Loading src/com/android/launcher3/graphics/LauncherPreviewRenderer.java +10 −1 Original line number Diff line number Diff line Loading @@ -43,6 +43,8 @@ import android.os.Build; import android.os.Handler; import android.os.Looper; import android.util.AttributeSet; import android.util.Size; import android.util.SparseArray; import android.util.SparseIntArray; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; Loading @@ -53,6 +55,8 @@ import android.view.WindowInsets; import android.view.WindowManager; import android.widget.TextClock; import androidx.annotation.Nullable; import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; Loading Loading @@ -177,10 +181,12 @@ public class LauncherPreviewRenderer extends ContextWrapper private final Map<Integer, CellLayout> mWorkspaceScreens = new HashMap<>(); private final AppWidgetHost mAppWidgetHost; private final SparseIntArray mWallpaperColorResources; private final SparseArray<Size> mLauncherWidgetSpanInfo; public LauncherPreviewRenderer(Context context, InvariantDeviceProfile idp, WallpaperColors wallpaperColorsOverride) { WallpaperColors wallpaperColorsOverride, @Nullable final SparseArray<Size> launcherWidgetSpanInfo) { super(context); mUiHandler = new Handler(Looper.getMainLooper()); Loading Loading @@ -224,6 +230,9 @@ public class LauncherPreviewRenderer extends ContextWrapper mHotseat = mRootView.findViewById(R.id.hotseat); mHotseat.resetLayout(false); mLauncherWidgetSpanInfo = launcherWidgetSpanInfo == null ? new SparseArray<>() : launcherWidgetSpanInfo; CellLayout firstScreen = mRootView.findViewById(R.id.workspace); firstScreen.setPadding(mDp.workspacePadding.left + mDp.cellLayoutPaddingPx.left, mDp.workspacePadding.top + mDp.cellLayoutPaddingPx.top, Loading src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java +54 −5 Original line number Diff line number Diff line Loading @@ -22,10 +22,13 @@ import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; import android.app.WallpaperColors; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.database.Cursor; import android.hardware.display.DisplayManager; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.util.Size; import android.util.SparseArray; import android.view.ContextThemeWrapper; import android.view.Display; import android.view.SurfaceControlViewHost; Loading @@ -34,6 +37,8 @@ import android.view.View; import android.view.WindowManager.LayoutParams; import android.view.animation.AccelerateDecelerateInterpolator; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.UiThread; import androidx.annotation.WorkerThread; Loading Loading @@ -123,6 +128,45 @@ public class PreviewSurfaceRenderer { mOnDestroyCallbacks.executeAllAndDestroy(); } /** * A function that queries for the launcher app widget span info * * @param context The context to get the content resolver from, should be related to launcher * @return A SparseArray with the app widget id being the key and the span info being the values */ @WorkerThread @Nullable public SparseArray<Size> getLoadedLauncherWidgetInfo( @NonNull final Context context) { final SparseArray<Size> widgetInfo = new SparseArray<>(); final String query = LauncherSettings.Favorites.ITEM_TYPE + " = " + LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET; try (Cursor c = context.getContentResolver().query(LauncherSettings.Favorites.CONTENT_URI, new String[] { LauncherSettings.Favorites.APPWIDGET_ID, LauncherSettings.Favorites.SPANX, LauncherSettings.Favorites.SPANY }, query, null, null)) { final int appWidgetIdIndex = c.getColumnIndexOrThrow( LauncherSettings.Favorites.APPWIDGET_ID); final int spanXIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SPANX); final int spanYIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SPANY); while (c.moveToNext()) { final int appWidgetId = c.getInt(appWidgetIdIndex); final int spanX = c.getInt(spanXIndex); final int spanY = c.getInt(spanYIndex); widgetInfo.append(appWidgetId, new Size(spanX, spanY)); } } catch (Exception e) { Log.e(TAG, "Error querying for launcher widget info", e); return null; } return widgetInfo; } /** * Generates the preview in background */ Loading Loading @@ -174,8 +218,11 @@ public class PreviewSurfaceRenderer { loadWorkspace(new ArrayList<>(), LauncherSettings.Favorites.PREVIEW_CONTENT_URI, query); final SparseArray<Size> spanInfo = getLoadedLauncherWidgetInfo(previewContext.getBaseContext()); MAIN_EXECUTOR.execute(() -> { renderView(previewContext, mBgDataModel, mWidgetProvidersMap); renderView(previewContext, mBgDataModel, mWidgetProvidersMap, spanInfo); mOnDestroyCallbacks.add(previewContext::onDestroy); }); } Loading @@ -183,7 +230,8 @@ public class PreviewSurfaceRenderer { } else { LauncherAppState.getInstance(inflationContext).getModel().loadAsync(dataModel -> { if (dataModel != null) { MAIN_EXECUTOR.execute(() -> renderView(inflationContext, dataModel, null)); MAIN_EXECUTOR.execute(() -> renderView(inflationContext, dataModel, null, null)); } else { Log.e(TAG, "Model loading failed"); } Loading @@ -201,12 +249,13 @@ public class PreviewSurfaceRenderer { @UiThread private void renderView(Context inflationContext, BgDataModel dataModel, Map<ComponentKey, AppWidgetProviderInfo> widgetProviderInfoMap) { Map<ComponentKey, AppWidgetProviderInfo> widgetProviderInfoMap, @Nullable final SparseArray<Size> launcherWidgetSpanInfo) { if (mDestroyed) { return; } View view = new LauncherPreviewRenderer(inflationContext, mIdp, mWallpaperColors) .getRenderedView(dataModel, widgetProviderInfoMap); View view = new LauncherPreviewRenderer(inflationContext, mIdp, mWallpaperColors, launcherWidgetSpanInfo).getRenderedView(dataModel, widgetProviderInfoMap); // This aspect scales the view to fit in the surface and centers it final float scale = Math.min(mWidth / (float) view.getMeasuredWidth(), mHeight / (float) view.getMeasuredHeight()); Loading Loading
src/com/android/launcher3/graphics/LauncherPreviewRenderer.java +10 −1 Original line number Diff line number Diff line Loading @@ -43,6 +43,8 @@ import android.os.Build; import android.os.Handler; import android.os.Looper; import android.util.AttributeSet; import android.util.Size; import android.util.SparseArray; import android.util.SparseIntArray; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; Loading @@ -53,6 +55,8 @@ import android.view.WindowInsets; import android.view.WindowManager; import android.widget.TextClock; import androidx.annotation.Nullable; import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; Loading Loading @@ -177,10 +181,12 @@ public class LauncherPreviewRenderer extends ContextWrapper private final Map<Integer, CellLayout> mWorkspaceScreens = new HashMap<>(); private final AppWidgetHost mAppWidgetHost; private final SparseIntArray mWallpaperColorResources; private final SparseArray<Size> mLauncherWidgetSpanInfo; public LauncherPreviewRenderer(Context context, InvariantDeviceProfile idp, WallpaperColors wallpaperColorsOverride) { WallpaperColors wallpaperColorsOverride, @Nullable final SparseArray<Size> launcherWidgetSpanInfo) { super(context); mUiHandler = new Handler(Looper.getMainLooper()); Loading Loading @@ -224,6 +230,9 @@ public class LauncherPreviewRenderer extends ContextWrapper mHotseat = mRootView.findViewById(R.id.hotseat); mHotseat.resetLayout(false); mLauncherWidgetSpanInfo = launcherWidgetSpanInfo == null ? new SparseArray<>() : launcherWidgetSpanInfo; CellLayout firstScreen = mRootView.findViewById(R.id.workspace); firstScreen.setPadding(mDp.workspacePadding.left + mDp.cellLayoutPaddingPx.left, mDp.workspacePadding.top + mDp.cellLayoutPaddingPx.top, Loading
src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java +54 −5 Original line number Diff line number Diff line Loading @@ -22,10 +22,13 @@ import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; import android.app.WallpaperColors; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.database.Cursor; import android.hardware.display.DisplayManager; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.util.Size; import android.util.SparseArray; import android.view.ContextThemeWrapper; import android.view.Display; import android.view.SurfaceControlViewHost; Loading @@ -34,6 +37,8 @@ import android.view.View; import android.view.WindowManager.LayoutParams; import android.view.animation.AccelerateDecelerateInterpolator; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.UiThread; import androidx.annotation.WorkerThread; Loading Loading @@ -123,6 +128,45 @@ public class PreviewSurfaceRenderer { mOnDestroyCallbacks.executeAllAndDestroy(); } /** * A function that queries for the launcher app widget span info * * @param context The context to get the content resolver from, should be related to launcher * @return A SparseArray with the app widget id being the key and the span info being the values */ @WorkerThread @Nullable public SparseArray<Size> getLoadedLauncherWidgetInfo( @NonNull final Context context) { final SparseArray<Size> widgetInfo = new SparseArray<>(); final String query = LauncherSettings.Favorites.ITEM_TYPE + " = " + LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET; try (Cursor c = context.getContentResolver().query(LauncherSettings.Favorites.CONTENT_URI, new String[] { LauncherSettings.Favorites.APPWIDGET_ID, LauncherSettings.Favorites.SPANX, LauncherSettings.Favorites.SPANY }, query, null, null)) { final int appWidgetIdIndex = c.getColumnIndexOrThrow( LauncherSettings.Favorites.APPWIDGET_ID); final int spanXIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SPANX); final int spanYIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SPANY); while (c.moveToNext()) { final int appWidgetId = c.getInt(appWidgetIdIndex); final int spanX = c.getInt(spanXIndex); final int spanY = c.getInt(spanYIndex); widgetInfo.append(appWidgetId, new Size(spanX, spanY)); } } catch (Exception e) { Log.e(TAG, "Error querying for launcher widget info", e); return null; } return widgetInfo; } /** * Generates the preview in background */ Loading Loading @@ -174,8 +218,11 @@ public class PreviewSurfaceRenderer { loadWorkspace(new ArrayList<>(), LauncherSettings.Favorites.PREVIEW_CONTENT_URI, query); final SparseArray<Size> spanInfo = getLoadedLauncherWidgetInfo(previewContext.getBaseContext()); MAIN_EXECUTOR.execute(() -> { renderView(previewContext, mBgDataModel, mWidgetProvidersMap); renderView(previewContext, mBgDataModel, mWidgetProvidersMap, spanInfo); mOnDestroyCallbacks.add(previewContext::onDestroy); }); } Loading @@ -183,7 +230,8 @@ public class PreviewSurfaceRenderer { } else { LauncherAppState.getInstance(inflationContext).getModel().loadAsync(dataModel -> { if (dataModel != null) { MAIN_EXECUTOR.execute(() -> renderView(inflationContext, dataModel, null)); MAIN_EXECUTOR.execute(() -> renderView(inflationContext, dataModel, null, null)); } else { Log.e(TAG, "Model loading failed"); } Loading @@ -201,12 +249,13 @@ public class PreviewSurfaceRenderer { @UiThread private void renderView(Context inflationContext, BgDataModel dataModel, Map<ComponentKey, AppWidgetProviderInfo> widgetProviderInfoMap) { Map<ComponentKey, AppWidgetProviderInfo> widgetProviderInfoMap, @Nullable final SparseArray<Size> launcherWidgetSpanInfo) { if (mDestroyed) { return; } View view = new LauncherPreviewRenderer(inflationContext, mIdp, mWallpaperColors) .getRenderedView(dataModel, widgetProviderInfoMap); View view = new LauncherPreviewRenderer(inflationContext, mIdp, mWallpaperColors, launcherWidgetSpanInfo).getRenderedView(dataModel, widgetProviderInfoMap); // This aspect scales the view to fit in the surface and centers it final float scale = Math.min(mWidth / (float) view.getMeasuredWidth(), mHeight / (float) view.getMeasuredHeight()); Loading