diff --git a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamPreference.java b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamPreference.java index 071cf57c715..175e0377bea 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamPreference.java +++ b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamPreference.java @@ -43,23 +43,12 @@ class AudioStreamPreference extends TwoTargetPreference { * Update preference UI based on connection status * * @param isConnected Is this stream connected - * @param summary Summary text - * @param onPreferenceClickListener Click listener for the preference */ - void setIsConnected( - boolean isConnected, - String summary, - @Nullable OnPreferenceClickListener onPreferenceClickListener) { - if (mIsConnected == isConnected - && getSummary() == summary - && getOnPreferenceClickListener() == onPreferenceClickListener) { - // Nothing to update. - return; + void setIsConnected(boolean isConnected) { + if (mIsConnected != isConnected) { + mIsConnected = isConnected; + notifyChanged(); } - mIsConnected = isConnected; - setSummary(summary); - setOnPreferenceClickListener(onPreferenceClickListener); - notifyChanged(); } @VisibleForTesting diff --git a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamStateHandler.java b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamStateHandler.java index 4bb84751b36..758984fe432 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamStateHandler.java +++ b/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamStateHandler.java @@ -16,8 +16,12 @@ package com.android.settings.connecteddevice.audiosharing.audiostreams; +import static android.text.Spanned.SPAN_EXCLUSIVE_INCLUSIVE; + import android.os.Handler; import android.os.Looper; +import android.text.SpannableString; +import android.text.style.ForegroundColorSpan; import android.util.Log; import androidx.annotation.Nullable; @@ -26,6 +30,7 @@ import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.Utils; import com.android.settingslib.bluetooth.BluetoothUtils; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.utils.ThreadUtils; @@ -68,15 +73,31 @@ class AudioStreamStateHandler { // Update UI ThreadUtils.postOnMainThread( - () -> - preference.setIsConnected( - newState - == AudioStreamsProgressCategoryController.AudioStreamState - .SOURCE_ADDED, - getSummary() != EMPTY_STRING_RES - ? preference.getContext().getString(getSummary()) - : "", - getOnClickListener(controller))); + () -> { + String summary = + getSummary() != EMPTY_STRING_RES + ? preference.getContext().getString(getSummary()) + : ""; + if (newState + == AudioStreamsProgressCategoryController.AudioStreamState + .ADD_SOURCE_BAD_CODE) { + SpannableString summarySpan = new SpannableString(summary); + int colorError = Utils.getColorErrorDefaultColor(preference.getContext()); + summarySpan.setSpan( + new ForegroundColorSpan(colorError), + 0, + summary.length(), + SPAN_EXCLUSIVE_INCLUSIVE); + preference.setSummary(summarySpan); + } else { + preference.setSummary(summary); + } + preference.setIsConnected( + newState + == AudioStreamsProgressCategoryController.AudioStreamState + .SOURCE_ADDED); + preference.setOnPreferenceClickListener(getOnClickListener(controller)); + }); } /** diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamPreferenceTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamPreferenceTest.java index c8f93588c78..2515668e39a 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamPreferenceTest.java @@ -28,7 +28,6 @@ import android.content.Context; import android.view.LayoutInflater; import android.view.View; -import androidx.preference.Preference.OnPreferenceClickListener; import androidx.preference.PreferenceViewHolder; import androidx.test.core.app.ApplicationProvider; @@ -93,17 +92,6 @@ public class AudioStreamPreferenceTest { assertThat(divider.getVisibility()).isEqualTo(View.GONE); } - @Test - public void setConnected_shouldUpdatePreferenceUI() { - String summary = "Connected"; - OnPreferenceClickListener listener = mock(OnPreferenceClickListener.class); - mPreference.setIsConnected(true, summary, listener); - - assertThat(mPreference.getSummary()).isNotNull(); - assertThat(mPreference.getSummary().toString()).isEqualTo(summary); - assertThat(mPreference.getOnPreferenceClickListener()).isEqualTo(listener); - } - @Test public void setAudioStreamMetadata_shouldUpdateMetadata() { AudioStreamPreference p = @@ -147,7 +135,7 @@ public class AudioStreamPreferenceTest { @Test public void shouldHideSecondTarget_connected() { - mPreference.setIsConnected(true, "", null); + mPreference.setIsConnected(true); assertThat(mPreference.shouldHideSecondTarget()).isTrue(); } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamStateHandlerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamStateHandlerTest.java index adc77a183f6..e44dee90e70 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamStateHandlerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/audiostreams/AudioStreamStateHandlerTest.java @@ -21,7 +21,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -31,6 +30,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.text.SpannableString; import androidx.preference.Preference; import androidx.test.core.app.ApplicationProvider; @@ -39,6 +39,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -75,7 +76,9 @@ public class AudioStreamStateHandlerTest { verify(mPreference, never()).setAudioStreamState(any()); verify(mHandler, never()).performAction(any(), any(), any()); - verify(mPreference, never()).setIsConnected(anyBoolean(), anyString(), any()); + verify(mPreference, never()).setIsConnected(anyBoolean()); + verify(mPreference, never()).setSummary(any()); + verify(mPreference, never()).setOnPreferenceClickListener(any()); } @Test @@ -93,7 +96,9 @@ public class AudioStreamStateHandlerTest { .setAudioStreamState( AudioStreamsProgressCategoryController.AudioStreamState.SOURCE_ADDED); verify(mHandler).performAction(any(), any(), any()); - verify(mPreference).setIsConnected(eq(true), eq(""), eq(null)); + verify(mPreference).setIsConnected(eq(true)); + verify(mPreference).setSummary(eq("")); + verify(mPreference).setOnPreferenceClickListener(eq(null)); } @Test @@ -119,7 +124,13 @@ public class AudioStreamStateHandlerTest { AudioStreamsProgressCategoryController.AudioStreamState .ADD_SOURCE_BAD_CODE); verify(mHandler).performAction(any(), any(), any()); - verify(mPreference).setIsConnected(eq(false), eq(SUMMARY), eq(listener)); + verify(mPreference).setIsConnected(eq(false)); + ArgumentCaptor argumentCaptor = + ArgumentCaptor.forClass(SpannableString.class); + verify(mPreference).setSummary(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()).isNotNull(); + assertThat(argumentCaptor.getValue().toString()).isEqualTo(SUMMARY); + verify(mPreference).setOnPreferenceClickListener(eq(listener)); } @Test