Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 53e8b46f authored by Steven Ng's avatar Steven Ng
Browse files

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
parent 93068d1c
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -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<View> PADDING_BOTTOM =
            new IntProperty<View>("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.
     *
     * <p>This function takes account of the following during measurement:
     * <ol>
     *     <li>status bar and system navigation bar insets</li>
     *     <li>
     *         number of spans that can fit in a row. This affects the number of widgets that can
     *         fit in a row.
     *     </li>
     * </ol>
     *
     * @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