Work around focusSearch bug in access point pref
ButtonPasswordEditTextPreference uses the two-action layout so it needs
the same changes as CarUiTwoActionPreference.
Bug: 167994619
Test: manual, atest CarRotaryControllerRoboTests
Change-Id: I6eb745b0880ac8225706189df0ad876b8cf8424b
diff --git a/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreference.java b/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreference.java
index c7ae2e5..e185915 100644
--- a/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreference.java
+++ b/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreference.java
@@ -22,6 +22,8 @@
import androidx.preference.PreferenceViewHolder;
import com.android.car.settings.common.PasswordEditTextPreference;
+import com.android.car.ui.R;
+import com.android.car.ui.utils.CarUiUtils;
/**
* A {@link PasswordEditTextPreference} which has a second button which can perform another
@@ -60,14 +62,17 @@
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
+ View containerWithoutWidget = CarUiUtils.findViewByRefId(holder.itemView,
+ R.id.car_ui_preference_container_without_widget);
View actionContainer = getWidgetActionContainer(holder);
View widgetFrame = holder.findViewById(android.R.id.widget_frame);
- if (mIsButtonShown) {
- actionContainer.setVisibility(View.VISIBLE);
- widgetFrame.setOnClickListener(v -> performButtonClick());
- } else {
- actionContainer.setVisibility(View.GONE);
- }
+ holder.itemView.setFocusable(!mIsButtonShown);
+ containerWithoutWidget.setOnClickListener(mIsButtonShown ? this::performClick : null);
+ containerWithoutWidget.setClickable(mIsButtonShown);
+ containerWithoutWidget.setFocusable(mIsButtonShown);
+ actionContainer.setVisibility(mIsButtonShown ? View.VISIBLE : View.GONE);
+ widgetFrame.setOnClickListener(mIsButtonShown ? v -> performButtonClick() : null);
+ widgetFrame.setFocusable(mIsButtonShown);
}
/**
diff --git a/tests/robotests/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreferenceTest.java b/tests/robotests/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreferenceTest.java
index a8d9297..937064e 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreferenceTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreferenceTest.java
@@ -16,6 +16,8 @@
package com.android.car.settings.wifi;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -82,4 +84,40 @@
mButtonPreference.performButtonClick();
verify(listener, never()).onButtonClick(mButtonPreference);
}
+
+ @Test
+ public void onBindViewHolder_buttonShown() {
+ mButtonPreference.showButton(true);
+ View containerWithoutWidget = mViewHolder.findViewById(
+ com.android.car.ui.R.id.car_ui_preference_container_without_widget);
+ View actionContainer = mButtonPreference.getWidgetActionContainer(mViewHolder);
+ View widgetFrame = mViewHolder.findViewById(android.R.id.widget_frame);
+
+ mButtonPreference.onBindViewHolder(mViewHolder);
+
+ assertThat(mViewHolder.itemView.isFocusable()).isFalse();
+ assertThat(containerWithoutWidget.isClickable()).isTrue();
+ assertThat(containerWithoutWidget.isFocusable()).isTrue();
+ assertThat(actionContainer.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(widgetFrame.isClickable()).isTrue();
+ assertThat(widgetFrame.isFocusable()).isTrue();
+ }
+
+ @Test
+ public void onBindViewHolder_buttonNotShown() {
+ mButtonPreference.showButton(false);
+ View containerWithoutWidget = mViewHolder.findViewById(
+ com.android.car.ui.R.id.car_ui_preference_container_without_widget);
+ View actionContainer = mButtonPreference.getWidgetActionContainer(mViewHolder);
+ View widgetFrame = mViewHolder.findViewById(android.R.id.widget_frame);
+
+ mButtonPreference.onBindViewHolder(mViewHolder);
+
+ assertThat(mViewHolder.itemView.isFocusable()).isTrue();
+ assertThat(containerWithoutWidget.isClickable()).isFalse();
+ assertThat(containerWithoutWidget.isFocusable()).isFalse();
+ assertThat(actionContainer.getVisibility()).isEqualTo(View.GONE);
+ assertThat(widgetFrame.isClickable()).isFalse();
+ assertThat(widgetFrame.isFocusable()).isFalse();
+ }
}