diff --git a/packages/SettingsLib/RadioButtonPreference/res/drawable/ic_settings_accent.xml b/packages/SettingsLib/RadioButtonPreference/res/drawable/ic_settings_accent.xml new file mode 100644 index 0000000000000..6521bc9e0fb9d --- /dev/null +++ b/packages/SettingsLib/RadioButtonPreference/res/drawable/ic_settings_accent.xml @@ -0,0 +1,29 @@ + + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml b/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml index b4b4c633b73ff..5ff0dc7a84f4d 100644 --- a/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml +++ b/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml @@ -92,16 +92,32 @@ android:textAlignment="viewEnd" android:textColor="?android:attr/textColorSecondary" android:maxLines="1" + android:visibility="gone" android:ellipsize="end"/> - + + + + diff --git a/packages/SettingsLib/RadioButtonPreference/res/values/strings.xml b/packages/SettingsLib/RadioButtonPreference/res/values/strings.xml new file mode 100644 index 0000000000000..ff3f90cfffd3e --- /dev/null +++ b/packages/SettingsLib/RadioButtonPreference/res/values/strings.xml @@ -0,0 +1,23 @@ + + + + + + + Settings + + \ No newline at end of file diff --git a/packages/SettingsLib/RadioButtonPreference/src/com/android/settingslib/widget/RadioButtonPreference.java b/packages/SettingsLib/RadioButtonPreference/src/com/android/settingslib/widget/RadioButtonPreference.java index 05e008c39ef4c..f50127f6e21ff 100644 --- a/packages/SettingsLib/RadioButtonPreference/src/com/android/settingslib/widget/RadioButtonPreference.java +++ b/packages/SettingsLib/RadioButtonPreference/src/com/android/settingslib/widget/RadioButtonPreference.java @@ -20,7 +20,7 @@ import android.content.Context; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; -import android.widget.TextView; +import android.widget.ImageView; import androidx.preference.CheckBoxPreference; import androidx.preference.PreferenceViewHolder; @@ -34,6 +34,9 @@ import androidx.preference.PreferenceViewHolder; * In other words, there's no "RadioButtonPreferenceGroup" in this * implementation. When you check one RadioButtonPreference, if you want to * uncheck all the other preferences, you should do that by code yourself. + * + * RadioButtonPreference can assign a extraWidgetListener to show a gear icon + * on the right side that can open another page. */ public class RadioButtonPreference extends CheckBoxPreference { @@ -53,6 +56,10 @@ public class RadioButtonPreference extends CheckBoxPreference { private View mAppendix; private int mAppendixVisibility = -1; + private View mExtraWidgetContainer; + private ImageView mExtraWidget; + + private View.OnClickListener mExtraWidgetOnClickListener; /** * Perform inflation from XML and apply a class-specific base style. @@ -69,7 +76,6 @@ public class RadioButtonPreference extends CheckBoxPreference { init(); } - /** * Perform inflation from XML and apply a class-specific base style. * @@ -136,11 +142,10 @@ public class RadioButtonPreference extends CheckBoxPreference { } } - TextView title = (TextView) holder.findViewById(android.R.id.title); - if (title != null) { - title.setSingleLine(false); - title.setMaxLines(3); - } + mExtraWidget = (ImageView) holder.findViewById(R.id.radio_extra_widget); + mExtraWidgetContainer = holder.findViewById(R.id.radio_extra_widget_container); + + setExtraWidgetOnClickListener(mExtraWidgetOnClickListener); } /** @@ -155,6 +160,24 @@ public class RadioButtonPreference extends CheckBoxPreference { mAppendixVisibility = visibility; } + /** + * Sets the callback to be invoked when extra widget is clicked by the user. + * + * @param listener The callback to be invoked + */ + public void setExtraWidgetOnClickListener(View.OnClickListener listener) { + mExtraWidgetOnClickListener = listener; + + if (mExtraWidget == null || mExtraWidgetContainer == null) { + return; + } + + mExtraWidget.setOnClickListener(mExtraWidgetOnClickListener); + + mExtraWidgetContainer.setVisibility((mExtraWidgetOnClickListener != null) + ? View.VISIBLE : View.GONE); + } + private void init() { setWidgetLayoutResource(R.layout.preference_widget_radiobutton); setLayoutResource(R.layout.preference_radio); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/RadioButtonPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/RadioButtonPreferenceTest.java index d58e68a3b387d..a5028ff30d730 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/RadioButtonPreferenceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/RadioButtonPreferenceTest.java @@ -40,10 +40,30 @@ public class RadioButtonPreferenceTest { private Application mContext; private RadioButtonPreference mPreference; + private View mExtraWidgetContainer; + private View mExtraWidget; + + private boolean mIsClickListenerCalled; + private View.OnClickListener mClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + mIsClickListenerCalled = true; + } + }; + @Before public void setUp() { mContext = RuntimeEnvironment.application; mPreference = new RadioButtonPreference(mContext); + + View view = LayoutInflater.from(mContext) + .inflate(R.layout.preference_radio, null /* root */); + PreferenceViewHolder preferenceViewHolder = + PreferenceViewHolder.createInstanceForTests(view); + mPreference.onBindViewHolder(preferenceViewHolder); + + mExtraWidgetContainer = view.findViewById(R.id.radio_extra_widget_container); + mExtraWidget = view.findViewById(R.id.radio_extra_widget); } @Test @@ -57,26 +77,30 @@ public class RadioButtonPreferenceTest { } @Test - public void summary_containerShouldBeVisible() { + public void onBindViewHolder_withSummary_containerShouldBeVisible() { mPreference.setSummary("some summary"); View summaryContainer = new View(mContext); View view = mock(View.class); when(view.findViewById(R.id.summary_container)).thenReturn(summaryContainer); PreferenceViewHolder preferenceViewHolder = PreferenceViewHolder.createInstanceForTests(view); + mPreference.onBindViewHolder(preferenceViewHolder); + assertEquals(View.VISIBLE, summaryContainer.getVisibility()); } @Test - public void emptySummary_containerShouldBeGone() { + public void onBindViewHolder_emptySummary_containerShouldBeGone() { mPreference.setSummary(""); View summaryContainer = new View(mContext); View view = mock(View.class); when(view.findViewById(R.id.summary_container)).thenReturn(summaryContainer); PreferenceViewHolder preferenceViewHolder = PreferenceViewHolder.createInstanceForTests(view); + mPreference.onBindViewHolder(preferenceViewHolder); + assertEquals(View.GONE, summaryContainer.getVisibility()); } @@ -93,11 +117,36 @@ public class RadioButtonPreferenceTest { } @Test - public void hideAppendix_shouldBeGone() { + public void setAppendixVisibility_setGone_shouldBeGone() { mPreference.setAppendixVisibility(View.GONE); - View view = LayoutInflater.from(mContext).inflate(R.layout.preference_radio, null); + + View view = LayoutInflater.from(mContext) + .inflate(R.layout.preference_radio, null /* root */); PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(view); mPreference.onBindViewHolder(holder); assertThat(holder.findViewById(R.id.appendix).getVisibility()).isEqualTo(View.GONE); } + + @Test + public void setExtraWidgetListener_setNull_extraWidgetShouldInvisible() { + mPreference.setExtraWidgetOnClickListener(null); + + assertEquals(View.GONE, mExtraWidgetContainer.getVisibility()); + } + + @Test + public void setExtraWidgetListener_extraWidgetShouldVisible() { + mPreference.setExtraWidgetOnClickListener(mClickListener); + + assertEquals(View.VISIBLE, mExtraWidgetContainer.getVisibility()); + } + + @Test + public void onClickListener_setExtraWidgetOnClickListener_ShouldCalled() { + mPreference.setExtraWidgetOnClickListener(mClickListener); + + assertThat(mIsClickListenerCalled).isFalse(); + mExtraWidget.callOnClick(); + assertThat(mIsClickListenerCalled).isTrue(); + } }