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

Commit 0237c3cd authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Expand more buttons for ActionButtonPreference"

parents 926571dc 15f2fe95
Loading
Loading
Loading
Loading
+16 −10
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingStart="8dp"
    android:paddingEnd="8dp"
    android:orientation="horizontal">

    <Button
@@ -28,19 +27,26 @@
        style="@style/SettingsActionButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingTop="20dp"
        android:paddingBottom="20dp"/>
    <Space
        android:layout_width="8dp"
        android:layout_height="wrap_content" />
        android:layout_weight="1"/>

    <Button
        android:id="@+id/button2"
        style="@style/SettingsActionButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingTop="20dp"
        android:paddingBottom="20dp"/>
        android:layout_weight="1"/>

    <Button
        android:id="@+id/button3"
        style="@style/SettingsActionButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

    <Button
        android:id="@+id/button4"
        style="@style/SettingsActionButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
</LinearLayout>
 No newline at end of file
+3 −0
Original line number Diff line number Diff line
@@ -408,6 +408,9 @@
    <style name="SettingsActionButton" parent="android:Widget.DeviceDefault.Button.Borderless.Colored">
        <item name="android:drawablePadding">4dp</item>
        <item name="android:drawableTint">@*android:color/btn_colored_borderless_text_material</item>
        <item name="android:layout_marginEnd">8dp</item>
        <item name="android:paddingTop">20dp</item>
        <item name="android:paddingBottom">20dp</item>
    </style>

    <style name="LockPatternContainerStyle">
+148 −14
Original line number Diff line number Diff line
@@ -32,11 +32,30 @@ import androidx.preference.PreferenceViewHolder;

import com.android.settings.R;

/**
 * This preference provides a four buttons layout with Settings style.
 * It looks like below
 *
 * --------------------------------------------------
 *  button1     | button2   | button3   | button4   |
 * --------------------------------------------------
 *
 * User can set title / icon / click listener for each button.
 *
 * By default, four buttons are visible.
 * However, there are two cases which button should be invisible(View.GONE).
 *
 * 1. User sets invisible for button. ex: ActionButtonPreference.setButton1Visible(false)
 * 2. User doesn't set any title or icon for button.
 *
 */
public class ActionButtonPreference extends Preference {

    private final String TAG = "ActionButtonPreference";
    private final ButtonInfo mButton1Info = new ButtonInfo();
    private final ButtonInfo mButton2Info = new ButtonInfo();
    private final ButtonInfo mButton3Info = new ButtonInfo();
    private final ButtonInfo mButton4Info = new ButtonInfo();

    public ActionButtonPreference(Context context, AttributeSet attrs,
            int defStyleAttr, int defStyleRes) {
@@ -60,7 +79,7 @@ public class ActionButtonPreference extends Preference {
    }

    private void init() {
        setLayoutResource(R.layout.two_action_buttons);
        setLayoutResource(R.layout.settings_action_buttons);
        setSelectable(false);
    }

@@ -72,9 +91,21 @@ public class ActionButtonPreference extends Preference {

        mButton1Info.mButton = (Button) holder.findViewById(R.id.button1);
        mButton2Info.mButton = (Button) holder.findViewById(R.id.button2);
        mButton3Info.mButton = (Button) holder.findViewById(R.id.button3);
        mButton4Info.mButton = (Button) holder.findViewById(R.id.button4);

        mButton1Info.setUpButton();
        mButton2Info.setUpButton();
        mButton3Info.setUpButton();
        mButton4Info.setUpButton();
    }

    public ActionButtonPreference setButton1Visible(boolean isVisible) {
        if (isVisible != mButton1Info.mIsVisible) {
            mButton1Info.mIsVisible = isVisible;
            notifyChanged();
        }
        return this;
    }

    public ActionButtonPreference setButton1Text(@StringRes int textResId) {
@@ -110,6 +141,22 @@ public class ActionButtonPreference extends Preference {
        return this;
    }

    public ActionButtonPreference setButton1OnClickListener(View.OnClickListener listener) {
        if (listener != mButton1Info.mListener) {
            mButton1Info.mListener = listener;
            notifyChanged();
        }
        return this;
    }

    public ActionButtonPreference setButton2Visible(boolean isVisible) {
        if (isVisible != mButton2Info.mIsVisible) {
            mButton2Info.mIsVisible = isVisible;
            notifyChanged();
        }
        return this;
    }

    public ActionButtonPreference setButton2Text(@StringRes int textResId) {
        final String newText = getContext().getString(textResId);
        if (!TextUtils.equals(newText, mButton2Info.mText)) {
@@ -143,33 +190,107 @@ public class ActionButtonPreference extends Preference {
        return this;
    }

    public ActionButtonPreference setButton1OnClickListener(View.OnClickListener listener) {
        if (listener != mButton1Info.mListener) {
            mButton1Info.mListener = listener;
    public ActionButtonPreference setButton2OnClickListener(View.OnClickListener listener) {
        if (listener != mButton2Info.mListener) {
            mButton2Info.mListener = listener;
            notifyChanged();
        }
        return this;
    }

    public ActionButtonPreference setButton2OnClickListener(View.OnClickListener listener) {
        if (listener != mButton2Info.mListener) {
            mButton2Info.mListener = listener;
    public ActionButtonPreference setButton3Visible(boolean isVisible) {
        if (isVisible != mButton3Info.mIsVisible) {
            mButton3Info.mIsVisible = isVisible;
            notifyChanged();
        }
        return this;
    }

    public ActionButtonPreference setButton1Visible(boolean isVisible) {
        if (isVisible != mButton1Info.mIsVisible) {
            mButton1Info.mIsVisible = isVisible;
    public ActionButtonPreference setButton3Text(@StringRes int textResId) {
        final String newText = getContext().getString(textResId);
        if (!TextUtils.equals(newText, mButton3Info.mText)) {
            mButton3Info.mText = newText;
            notifyChanged();
        }
        return this;
    }

    public ActionButtonPreference setButton2Visible(boolean isVisible) {
        if (isVisible != mButton2Info.mIsVisible) {
            mButton2Info.mIsVisible = isVisible;
    public ActionButtonPreference setButton3Icon(@DrawableRes int iconResId) {
        if (iconResId == 0) {
            return this;
        }

        final Drawable icon;
        try {
            icon = getContext().getDrawable(iconResId);
            mButton3Info.mIcon = icon;
            notifyChanged();
        } catch (Resources.NotFoundException exception) {
            Log.e(TAG, "Resource does not exist: " + iconResId);
        }
        return this;
    }

    public ActionButtonPreference setButton3Enabled(boolean isEnabled) {
        if (isEnabled != mButton3Info.mIsEnabled) {
            mButton3Info.mIsEnabled = isEnabled;
            notifyChanged();
        }
        return this;
    }

    public ActionButtonPreference setButton3OnClickListener(View.OnClickListener listener) {
        if (listener != mButton3Info.mListener) {
            mButton3Info.mListener = listener;
            notifyChanged();
        }
        return this;
    }

    public ActionButtonPreference setButton4Visible(boolean isVisible) {
        if (isVisible != mButton4Info.mIsVisible) {
            mButton4Info.mIsVisible = isVisible;
            notifyChanged();
        }
        return this;
    }

    public ActionButtonPreference setButton4Text(@StringRes int textResId) {
        final String newText = getContext().getString(textResId);
        if (!TextUtils.equals(newText, mButton4Info.mText)) {
            mButton4Info.mText = newText;
            notifyChanged();
        }
        return this;
    }

    public ActionButtonPreference setButton4Icon(@DrawableRes int iconResId) {
        if (iconResId == 0) {
            return this;
        }

        final Drawable icon;
        try {
            icon = getContext().getDrawable(iconResId);
            mButton4Info.mIcon = icon;
            notifyChanged();
        } catch (Resources.NotFoundException exception) {
            Log.e(TAG, "Resource does not exist: " + iconResId);
        }
        return this;
    }

    public ActionButtonPreference setButton4Enabled(boolean isEnabled) {
        if (isEnabled != mButton4Info.mIsEnabled) {
            mButton4Info.mIsEnabled = isEnabled;
            notifyChanged();
        }
        return this;
    }

    public ActionButtonPreference setButton4OnClickListener(View.OnClickListener listener) {
        if (listener != mButton4Info.mListener) {
            mButton4Info.mListener = listener;
            notifyChanged();
        }
        return this;
@@ -189,11 +310,24 @@ public class ActionButtonPreference extends Preference {
            mButton.setEnabled(mIsEnabled);
            mButton.setCompoundDrawablesWithIntrinsicBounds(
                    null /* left */, mIcon /* top */, null /* right */, null /* bottom */);
            if (mIsVisible) {

            if (shouldBeVisible()) {
                mButton.setVisibility(View.VISIBLE);
            } else {
                mButton.setVisibility(View.GONE);
            }
        }

        /**
         * By default, four buttons are visible.
         * However, there are two cases which button should be invisible.
         *
         * 1. User set invisible for this button. ex: mIsVisible = false.
         * 2. User didn't set any title or icon.
         *
         */
        private boolean shouldBeVisible() {
            return mIsVisible && (!TextUtils.isEmpty(mText) || mIcon != null);
        }
    }
}
 No newline at end of file
+2 −1
Original line number Diff line number Diff line
@@ -55,7 +55,8 @@ public class BluetoothDetailsButtonsControllerTest extends BluetoothDetailsContr
    public void setUp() {
        super.setUp();
        final View buttons = View.inflate(
                RuntimeEnvironment.application, R.layout.two_action_buttons, null /* parent */);
                RuntimeEnvironment.application, R.layout.settings_action_buttons,
                null /* parent */);
        mConnectButton = buttons.findViewById(R.id.button2);
        mForgetButton = buttons.findViewById(R.id.button1);
        mController =
+144 −8
Original line number Diff line number Diff line
@@ -50,52 +50,175 @@ public class ActionButtonPreferenceTest {
    @Before
    public void setUp() {
        mContext = RuntimeEnvironment.application;
        mRootView = View.inflate(mContext, R.layout.two_action_buttons, null /* parent */);
        mRootView = View.inflate(mContext, R.layout.settings_action_buttons, null /* parent */);
        mHolder = PreferenceViewHolder.createInstanceForTests(mRootView);
        mPref = new ActionButtonPreference(mContext);
    }

    @Test
    public void setVisibility_shouldUpdateButtonVisibility() {
        mPref.setButton1Visible(false).setButton2Visible(false);
    public void onBindViewHolder_setTitle_shouldShowButtonByDefault() {
        mPref.setButton1Text(R.string.settings_label);
        mPref.setButton2Text(R.string.settings_label);
        mPref.setButton3Text(R.string.settings_label);
        mPref.setButton4Text(R.string.settings_label);

        mPref.onBindViewHolder(mHolder);

        assertThat(mRootView.findViewById(R.id.button1).getVisibility())
                .isEqualTo(View.VISIBLE);
        assertThat(mRootView.findViewById(R.id.button2).getVisibility())
                .isEqualTo(View.VISIBLE);
        assertThat(mRootView.findViewById(R.id.button3).getVisibility())
                .isEqualTo(View.VISIBLE);
        assertThat(mRootView.findViewById(R.id.button4).getVisibility())
                .isEqualTo(View.VISIBLE);
    }

    @Test
    public void onBindViewHolder_setIcon_shouldShowButtonByDefault() {
        mPref.setButton1Icon(R.drawable.ic_settings);
        mPref.setButton2Icon(R.drawable.ic_settings);
        mPref.setButton3Icon(R.drawable.ic_settings);
        mPref.setButton4Icon(R.drawable.ic_settings);

        mPref.onBindViewHolder(mHolder);

        assertThat(mRootView.findViewById(R.id.button1).getVisibility())
                .isEqualTo(View.VISIBLE);
        assertThat(mRootView.findViewById(R.id.button2).getVisibility())
                .isEqualTo(View.VISIBLE);
        assertThat(mRootView.findViewById(R.id.button3).getVisibility())
                .isEqualTo(View.VISIBLE);
        assertThat(mRootView.findViewById(R.id.button4).getVisibility())
                .isEqualTo(View.VISIBLE);
    }

    @Test
    public void onBindViewHolder_notSetTitleOrIcon_shouldNotShowButtonByDefault() {
        mPref.onBindViewHolder(mHolder);

        assertThat(mRootView.findViewById(R.id.button1).getVisibility())
                .isEqualTo(View.GONE);
        assertThat(mRootView.findViewById(R.id.button2).getVisibility())
                .isEqualTo(View.GONE);
        assertThat(mRootView.findViewById(R.id.button3).getVisibility())
                .isEqualTo(View.GONE);
        assertThat(mRootView.findViewById(R.id.button4).getVisibility())
                .isEqualTo(View.GONE);
    }

    @Test
    public void onBindViewHolder_setVisibleIsGoneAndSetTitle_shouldNotShowButton() {
        mPref.setButton1Text(R.string.settings_label).setButton1Visible(false);
        mPref.setButton2Text(R.string.settings_label).setButton2Visible(false);
        mPref.setButton3Text(R.string.settings_label).setButton3Visible(false);
        mPref.setButton4Text(R.string.settings_label).setButton4Visible(false);

        mPref.onBindViewHolder(mHolder);

        assertThat(mRootView.findViewById(R.id.button1).getVisibility())
                .isEqualTo(View.GONE);
        assertThat(mRootView.findViewById(R.id.button2).getVisibility())
                .isEqualTo(View.GONE);
        assertThat(mRootView.findViewById(R.id.button3).getVisibility())
                .isEqualTo(View.GONE);
        assertThat(mRootView.findViewById(R.id.button4).getVisibility())
                .isEqualTo(View.GONE);
    }

    @Test
    public void onBindViewHolder_setVisibleIsGoneAndSetIcon_shouldNotShowButton() {
        mPref.setButton1Icon(R.drawable.ic_settings).setButton1Visible(false);
        mPref.setButton2Icon(R.drawable.ic_settings).setButton2Visible(false);
        mPref.setButton3Icon(R.drawable.ic_settings).setButton3Visible(false);
        mPref.setButton4Icon(R.drawable.ic_settings).setButton4Visible(false);

        mPref.onBindViewHolder(mHolder);

        assertThat(mRootView.findViewById(R.id.button1).getVisibility())
                .isEqualTo(View.GONE);
        assertThat(mRootView.findViewById(R.id.button2).getVisibility())
                .isEqualTo(View.GONE);
        assertThat(mRootView.findViewById(R.id.button3).getVisibility())
                .isEqualTo(View.GONE);
        assertThat(mRootView.findViewById(R.id.button4).getVisibility())
                .isEqualTo(View.GONE);
    }

    @Test
    public void onBindViewHolder_setVisibility_shouldUpdateButtonVisibility() {
        mPref.setButton1Text(R.string.settings_label).setButton1Visible(false);
        mPref.setButton2Text(R.string.settings_label).setButton2Visible(false);
        mPref.setButton3Text(R.string.settings_label).setButton3Visible(false);
        mPref.setButton4Text(R.string.settings_label).setButton4Visible(false);

        mPref.onBindViewHolder(mHolder);

        assertThat(mRootView.findViewById(R.id.button1).getVisibility())
                .isEqualTo(View.GONE);
        assertThat(mRootView.findViewById(R.id.button2).getVisibility())
                .isEqualTo(View.GONE);
        assertThat(mRootView.findViewById(R.id.button3).getVisibility())
                .isEqualTo(View.GONE);
        assertThat(mRootView.findViewById(R.id.button4).getVisibility())
                .isEqualTo(View.GONE);

        mPref.setButton1Visible(true);
        mPref.setButton2Visible(true);
        mPref.setButton3Visible(true);
        mPref.setButton4Visible(true);

        mPref.setButton1Visible(true).setButton2Visible(true);
        mPref.onBindViewHolder(mHolder);

        assertThat(mRootView.findViewById(R.id.button1).getVisibility())
                .isEqualTo(View.VISIBLE);
        assertThat(mRootView.findViewById(R.id.button2).getVisibility())
                .isEqualTo(View.VISIBLE);
        assertThat(mRootView.findViewById(R.id.button3).getVisibility())
                .isEqualTo(View.VISIBLE);
        assertThat(mRootView.findViewById(R.id.button4).getVisibility())
                .isEqualTo(View.VISIBLE);
    }

    @Test
    public void setEnabled_shouldEnableButton() {
        mPref.setButton1Enabled(true).setButton2Enabled(false);
    public void onBindViewHolder_setEnabled_shouldEnableButton() {
        mPref.setButton1Enabled(true);
        mPref.setButton2Enabled(false);
        mPref.setButton3Enabled(true);
        mPref.setButton4Enabled(false);

        mPref.onBindViewHolder(mHolder);

        assertThat(mRootView.findViewById(R.id.button1).isEnabled()).isTrue();
        assertThat(mRootView.findViewById(R.id.button2).isEnabled()).isFalse();
        assertThat(mRootView.findViewById(R.id.button3).isEnabled()).isTrue();
        assertThat(mRootView.findViewById(R.id.button4).isEnabled()).isFalse();
    }

    @Test
    public void setText_shouldShowSameText() {
    public void onBindViewHolder_setText_shouldShowSameText() {
        mPref.setButton1Text(R.string.settings_label);
        mPref.setButton2Text(R.string.settings_label);
        mPref.setButton3Text(R.string.settings_label);
        mPref.setButton4Text(R.string.settings_label);

        mPref.onBindViewHolder(mHolder);

        assertThat(((Button) mRootView.findViewById(R.id.button1)).getText())
                .isEqualTo(mContext.getText(R.string.settings_label));
        assertThat(((Button) mRootView.findViewById(R.id.button2)).getText())
                .isEqualTo(mContext.getText(R.string.settings_label));
        assertThat(((Button) mRootView.findViewById(R.id.button3)).getText())
                .isEqualTo(mContext.getText(R.string.settings_label));
        assertThat(((Button) mRootView.findViewById(R.id.button4)).getText())
                .isEqualTo(mContext.getText(R.string.settings_label));
    }

    @Test
    public void setButtonIcon_iconMustDisplayAboveText() {
    public void onBindViewHolder_setButtonIcon_iconMustDisplayAboveText() {
        mPref.setButton1Text(R.string.settings_label);
        mPref.setButton1Icon(R.drawable.ic_settings);

        mPref.onBindViewHolder(mHolder);
        final Drawable[] drawablesAroundText =
                ((Button) mRootView.findViewById(R.id.button1))
@@ -108,6 +231,7 @@ public class ActionButtonPreferenceTest {
    public void setButtonIcon_iconResourceIdIsZero_shouldNotDisplayIcon() {
        mPref.setButton1Text(R.string.settings_label);
        mPref.setButton1Icon(0);

        mPref.onBindViewHolder(mHolder);
        final Drawable[] drawablesAroundText =
                ((Button) mRootView.findViewById(R.id.button1))
@@ -142,6 +266,18 @@ public class ActionButtonPreferenceTest {
        when(pref.setButton2Enabled(anyBoolean())).thenReturn(pref);
        when(pref.setButton2Visible(anyBoolean())).thenReturn(pref);
        when(pref.setButton2OnClickListener(any(View.OnClickListener.class))).thenReturn(pref);

        when(pref.setButton3Text(anyInt())).thenReturn(pref);
        when(pref.setButton3Icon(anyInt())).thenReturn(pref);
        when(pref.setButton3Enabled(anyBoolean())).thenReturn(pref);
        when(pref.setButton3Visible(anyBoolean())).thenReturn(pref);
        when(pref.setButton3OnClickListener(any(View.OnClickListener.class))).thenReturn(pref);

        when(pref.setButton4Text(anyInt())).thenReturn(pref);
        when(pref.setButton4Icon(anyInt())).thenReturn(pref);
        when(pref.setButton4Enabled(anyBoolean())).thenReturn(pref);
        when(pref.setButton4Visible(anyBoolean())).thenReturn(pref);
        when(pref.setButton4OnClickListener(any(View.OnClickListener.class))).thenReturn(pref);
        return pref;
    }
}
 No newline at end of file