[Audiosharing] When user enters a bad code, apply error color on summary.
Bug: 356071392 Flag: com.android.settingslib.flags.enable_le_audio_sharing Test: atest Change-Id: I427e08a3cce8d0e85f29f821d9b779acc95217b1
This commit is contained in:
@@ -43,24 +43,13 @@ class AudioStreamPreference extends TwoTargetPreference {
|
|||||||
* Update preference UI based on connection status
|
* Update preference UI based on connection status
|
||||||
*
|
*
|
||||||
* @param isConnected Is this stream connected
|
* @param isConnected Is this stream connected
|
||||||
* @param summary Summary text
|
|
||||||
* @param onPreferenceClickListener Click listener for the preference
|
|
||||||
*/
|
*/
|
||||||
void setIsConnected(
|
void setIsConnected(boolean isConnected) {
|
||||||
boolean isConnected,
|
if (mIsConnected != isConnected) {
|
||||||
String summary,
|
|
||||||
@Nullable OnPreferenceClickListener onPreferenceClickListener) {
|
|
||||||
if (mIsConnected == isConnected
|
|
||||||
&& getSummary() == summary
|
|
||||||
&& getOnPreferenceClickListener() == onPreferenceClickListener) {
|
|
||||||
// Nothing to update.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mIsConnected = isConnected;
|
mIsConnected = isConnected;
|
||||||
setSummary(summary);
|
|
||||||
setOnPreferenceClickListener(onPreferenceClickListener);
|
|
||||||
notifyChanged();
|
notifyChanged();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
AudioStreamPreference(Context context, @Nullable AttributeSet attrs) {
|
AudioStreamPreference(Context context, @Nullable AttributeSet attrs) {
|
||||||
|
@@ -16,8 +16,12 @@
|
|||||||
|
|
||||||
package com.android.settings.connecteddevice.audiosharing.audiostreams;
|
package com.android.settings.connecteddevice.audiosharing.audiostreams;
|
||||||
|
|
||||||
|
import static android.text.Spanned.SPAN_EXCLUSIVE_INCLUSIVE;
|
||||||
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
import android.text.SpannableString;
|
||||||
|
import android.text.style.ForegroundColorSpan;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
@@ -26,6 +30,7 @@ import androidx.annotation.VisibleForTesting;
|
|||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
|
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
|
import com.android.settingslib.Utils;
|
||||||
import com.android.settingslib.bluetooth.BluetoothUtils;
|
import com.android.settingslib.bluetooth.BluetoothUtils;
|
||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||||
import com.android.settingslib.utils.ThreadUtils;
|
import com.android.settingslib.utils.ThreadUtils;
|
||||||
@@ -68,15 +73,31 @@ class AudioStreamStateHandler {
|
|||||||
|
|
||||||
// Update UI
|
// Update UI
|
||||||
ThreadUtils.postOnMainThread(
|
ThreadUtils.postOnMainThread(
|
||||||
() ->
|
() -> {
|
||||||
|
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(
|
preference.setIsConnected(
|
||||||
newState
|
newState
|
||||||
== AudioStreamsProgressCategoryController.AudioStreamState
|
== AudioStreamsProgressCategoryController.AudioStreamState
|
||||||
.SOURCE_ADDED,
|
.SOURCE_ADDED);
|
||||||
getSummary() != EMPTY_STRING_RES
|
preference.setOnPreferenceClickListener(getOnClickListener(controller));
|
||||||
? preference.getContext().getString(getSummary())
|
});
|
||||||
: "",
|
|
||||||
getOnClickListener(controller)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -28,7 +28,6 @@ import android.content.Context;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import androidx.preference.Preference.OnPreferenceClickListener;
|
|
||||||
import androidx.preference.PreferenceViewHolder;
|
import androidx.preference.PreferenceViewHolder;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
@@ -93,17 +92,6 @@ public class AudioStreamPreferenceTest {
|
|||||||
assertThat(divider.getVisibility()).isEqualTo(View.GONE);
|
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
|
@Test
|
||||||
public void setAudioStreamMetadata_shouldUpdateMetadata() {
|
public void setAudioStreamMetadata_shouldUpdateMetadata() {
|
||||||
AudioStreamPreference p =
|
AudioStreamPreference p =
|
||||||
@@ -147,7 +135,7 @@ public class AudioStreamPreferenceTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldHideSecondTarget_connected() {
|
public void shouldHideSecondTarget_connected() {
|
||||||
mPreference.setIsConnected(true, "", null);
|
mPreference.setIsConnected(true);
|
||||||
assertThat(mPreference.shouldHideSecondTarget()).isTrue();
|
assertThat(mPreference.shouldHideSecondTarget()).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -21,7 +21,6 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
import static org.mockito.ArgumentMatchers.anyString;
|
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
@@ -31,6 +30,7 @@ import static org.mockito.Mockito.verify;
|
|||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.text.SpannableString;
|
||||||
|
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
@@ -39,6 +39,7 @@ import org.junit.Before;
|
|||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.junit.MockitoJUnit;
|
import org.mockito.junit.MockitoJUnit;
|
||||||
import org.mockito.junit.MockitoRule;
|
import org.mockito.junit.MockitoRule;
|
||||||
@@ -75,7 +76,9 @@ public class AudioStreamStateHandlerTest {
|
|||||||
|
|
||||||
verify(mPreference, never()).setAudioStreamState(any());
|
verify(mPreference, never()).setAudioStreamState(any());
|
||||||
verify(mHandler, never()).performAction(any(), any(), 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
|
@Test
|
||||||
@@ -93,7 +96,9 @@ public class AudioStreamStateHandlerTest {
|
|||||||
.setAudioStreamState(
|
.setAudioStreamState(
|
||||||
AudioStreamsProgressCategoryController.AudioStreamState.SOURCE_ADDED);
|
AudioStreamsProgressCategoryController.AudioStreamState.SOURCE_ADDED);
|
||||||
verify(mHandler).performAction(any(), any(), any());
|
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
|
@Test
|
||||||
@@ -119,7 +124,13 @@ public class AudioStreamStateHandlerTest {
|
|||||||
AudioStreamsProgressCategoryController.AudioStreamState
|
AudioStreamsProgressCategoryController.AudioStreamState
|
||||||
.ADD_SOURCE_BAD_CODE);
|
.ADD_SOURCE_BAD_CODE);
|
||||||
verify(mHandler).performAction(any(), any(), any());
|
verify(mHandler).performAction(any(), any(), any());
|
||||||
verify(mPreference).setIsConnected(eq(false), eq(SUMMARY), eq(listener));
|
verify(mPreference).setIsConnected(eq(false));
|
||||||
|
ArgumentCaptor<SpannableString> 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
|
@Test
|
||||||
|
Reference in New Issue
Block a user