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

Commit d2d8e97a authored by Sebastian Franco's avatar Sebastian Franco Committed by Sebastián Franco
Browse files

Make the text for the drop target buttons fit if it's too long.

The text "Don't suggest app" is too long when the device language
is GE or JA, or if you make the text bigger in settings.

Before truncating the text completely we are going to try to make
the text smaller until it gets to a predefined value
(button_drop_target_min_text_size).

Test: Change the language to German (Deutch) and install a new app and drag it to the workspace to see the button "App nicht vorschlagen"
Test: Also, a nice way to test is to go to SecondaryDropTarget#setupUi and hardcode the option to always show "Don't suggest app"
Fix: 221480721
Change-Id: I99def4e23cd17109a297aecaa620cef7a0d137e7
parent b9879a0b
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -61,6 +61,10 @@
    <dimen name="drop_target_top_margin">36dp</dimen>
    <dimen name="drop_target_bottom_margin">16dp</dimen>

    <!-- Button drop target bar -->
    <dimen name="button_drop_target_min_text_size">10sp</dimen>
    <dimen name="button_drop_target_resize_text_increment">1sp</dimen>

<!-- App Widget resize frame -->
    <dimen name="widget_handle_margin">13dp</dimen>
    <dimen name="resize_frame_background_padding">24dp</dimen>
+35 −1
Original line number Diff line number Diff line
@@ -324,6 +324,40 @@ public abstract class ButtonDropTarget extends TextView
        hideTooltip();
    }


    /**
     * Reduce the size of the text until it fits or reaches a minimum.
     *
     * The minimum size is defined by {@code R.dimen.button_drop_target_min_text_size} and
     * it diminishes by intervals defined by
     * {@code R.dimen.button_drop_target_resize_text_increment}
     * This functionality is very similar to the option
     * {@link TextView#setAutoSizeTextTypeWithDefaults(int)} but can't be used in this view because
     * the layout width is {@code WRAP_CONTENT}.
     *
     * @param availableWidth Available width in the button to fit the text, used in
     *        {@code ButtonDropTarget#isTextTruncated(int)}
     * @return The biggest text size in SP that makes the text fit or if the text can't fit returns
     *         the min available value
     */
    public float resizeTextToFit(int availableWidth) {
        float minSize = Utilities.pxToSp(getResources()
                .getDimensionPixelSize(R.dimen.button_drop_target_min_text_size));
        float step = Utilities.pxToSp(getResources()
                .getDimensionPixelSize(R.dimen.button_drop_target_resize_text_increment));
        float textSize = Utilities.pxToSp(getTextSize());

        while (textSize > minSize) {
            if (isTextTruncated(availableWidth)) {
                textSize -= step;
                setTextSize(textSize);
            } else {
                return textSize;
            }
        }
        return minSize;
    }

    public boolean isTextTruncated(int availableWidth) {
        availableWidth -= (getPaddingLeft() + getPaddingRight() + mDrawable.getIntrinsicWidth()
                + getCompoundDrawablePadding());
+16 −3
Original line number Diff line number Diff line
@@ -140,9 +140,22 @@ public class DropTargetBar extends FrameLayout
        if (visibleCount > 0) {
            int availableWidth = width / visibleCount;
            boolean textVisible = true;
            for (ButtonDropTarget buttons : mDropTargets) {
                if (buttons.getVisibility() != GONE) {
                    textVisible = textVisible && !buttons.isTextTruncated(availableWidth);
            boolean textResized = false;
            float textSize = mDropTargets[0].getTextSize();
            for (ButtonDropTarget button : mDropTargets) {
                if (button.getVisibility() == GONE) {
                    continue;
                }
                if (button.isTextTruncated(availableWidth)) {
                    textSize = Math.min(textSize, button.resizeTextToFit(availableWidth));
                    textResized = true;
                }
                textVisible = textVisible && !button.isTextTruncated(availableWidth);
            }

            if (textResized) {
                for (ButtonDropTarget button : mDropTargets) {
                    button.setTextSize(textSize);
                }
            }

+5 −0
Original line number Diff line number Diff line
@@ -483,6 +483,11 @@ public final class Utilities {
        return res.getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
    }

    /** Converts a pixel value (px) to scale pixel value (SP) for the current device. */
    public static float pxToSp(float size) {
        return size / Resources.getSystem().getDisplayMetrics().scaledDensity;
    }

    public static float dpiFromPx(float size, int densityDpi) {
        float densityRatio = (float) densityDpi / DisplayMetrics.DENSITY_DEFAULT;
        return (size / densityRatio);