From 53e8b46f6639332383d7f192663dd8f8137120eb Mon Sep 17 00:00:00 2001 From: Steven Ng Date: Thu, 24 Jun 2021 16:49:26 +0100 Subject: [PATCH] Measure WidgetsBottomPicker again when the number of spans changes Bug: In onMeasure, we calculate the number of spans that can be fit horizontally. If the number of spans has changed, we re-organize widgets shown in the table. However, after that, we didn't measure WidgetsBottomPicker and its children again. As a result, the newly added widget previews' dimensions are never measured. Test: Long press clock app and then click widgets. Rotates the screen and observe widgets correctly shown. Fix: 191644950 Change-Id: Iae94fba5b137807483e061d785b18d59defb013e --- .../launcher3/widget/WidgetsBottomSheet.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/com/android/launcher3/widget/WidgetsBottomSheet.java b/src/com/android/launcher3/widget/WidgetsBottomSheet.java index d0e69fa3ea..37b950d502 100644 --- a/src/com/android/launcher3/widget/WidgetsBottomSheet.java +++ b/src/com/android/launcher3/widget/WidgetsBottomSheet.java @@ -23,6 +23,7 @@ import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.util.IntProperty; +import android.util.Log; import android.util.Pair; import android.view.Gravity; import android.view.LayoutInflater; @@ -35,6 +36,8 @@ import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; +import androidx.annotation.GuardedBy; + import com.android.launcher3.DeviceProfile; import com.android.launcher3.Insettable; import com.android.launcher3.LauncherAppState; @@ -51,6 +54,7 @@ import java.util.List; * Bottom sheet for the "Widgets" system shortcut in the long-press popup. */ public class WidgetsBottomSheet extends BaseWidgetSheet implements Insettable { + private static final String TAG = "WidgetsBottomSheet"; private static final IntProperty PADDING_BOTTOM = new IntProperty("paddingBottom") { @@ -128,6 +132,32 @@ public class WidgetsBottomSheet extends BaseWidgetSheet implements Insettable { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (doMeasure(widthMeasureSpec, heightMeasureSpec)) { + boolean hasUpdated = doMeasure(widthMeasureSpec, heightMeasureSpec); + if (hasUpdated) { + Log.w(TAG, "WidgetsBottomSheet dimension has been updated after a 2nd" + + " measurement."); + } + } + } + + /** + * Measures the dimension of this view and its children. + * + *

This function takes account of the following during measurement: + *

    + *
  1. status bar and system navigation bar insets
  2. + *
  3. + * number of spans that can fit in a row. This affects the number of widgets that can + * fit in a row. + *
  4. + *
+ * + * @return {@code true} if the width or height of this view or its children have changed after + * the measurement. Otherwise, returns {@code false}. + */ + @GuardedBy("MainThread") + private boolean doMeasure(int widthMeasureSpec, int heightMeasureSpec) { DeviceProfile deviceProfile = mActivityContext.getDeviceProfile(); int widthUsed; if (mInsets.bottom > 0) { @@ -153,7 +183,9 @@ public class WidgetsBottomSheet extends BaseWidgetSheet implements Insettable { // Ensure the table layout is showing widgets in the right column after measure. mMaxHorizontalSpan = maxHorizontalSpan; onWidgetsBound(); + return true; } + return false; } @Override