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();
+ }
}