Update the audio sharing QR code logic to enable OEMs providing customized QR code image

Test: atest AudioSharingFeatureProviderImplTest
Bug: b/397137711
Flag: EXEMPT no-op

Change-Id: I124d6ded50faf9fa0ca06bd5b34d72e9399f3e59
This commit is contained in:
yqian
2025-02-17 16:14:02 +08:00
parent 87a9cdf16f
commit d4774b37aa
10 changed files with 279 additions and 43 deletions

View File

@@ -40,7 +40,9 @@ import com.android.settings.R;
import com.android.settings.bluetooth.BluetoothPairingDetail; import com.android.settings.bluetooth.BluetoothPairingDetail;
import com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamsQrCodeFragment; import com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamsQrCodeFragment;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.bluetooth.BluetoothLeBroadcastMetadataExt;
import com.android.settingslib.bluetooth.BluetoothUtils; import com.android.settingslib.bluetooth.BluetoothUtils;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
@@ -75,6 +77,9 @@ public class AudioSharingDialogFragment extends InstrumentedDialogFragment {
private static Pair<Integer, Object>[] sEventData = new Pair[0]; private static Pair<Integer, Object>[] sEventData = new Pair[0];
@Nullable private static Fragment sHost; @Nullable private static Fragment sHost;
AudioSharingFeatureProvider audioSharingFeatureProvider =
FeatureFactory.getFeatureFactory().getAudioSharingFeatureProvider();
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
return SettingsEnums.DIALOG_AUDIO_SHARING_ADD_DEVICE; return SettingsEnums.DIALOG_AUDIO_SHARING_ADD_DEVICE;
@@ -158,6 +163,9 @@ public class AudioSharingDialogFragment extends InstrumentedDialogFragment {
Log.d(TAG, "Create dialog error: null deviceItems"); Log.d(TAG, "Create dialog error: null deviceItems");
return builder.build(); return builder.build();
} }
BluetoothLeBroadcastMetadata metadata = arguments.getParcelable(
BUNDLE_KEY_BROADCAST_METADATA, BluetoothLeBroadcastMetadata.class);
Drawable qrCodeDrawable = null;
if (deviceItems.isEmpty()) { if (deviceItems.isEmpty()) {
builder.setTitle(R.string.audio_sharing_share_dialog_title) builder.setTitle(R.string.audio_sharing_share_dialog_title)
.setCustomPositiveButton( .setCustomPositiveButton(
@@ -181,9 +189,7 @@ public class AudioSharingDialogFragment extends InstrumentedDialogFragment {
} }
launcher.launch(); launcher.launch();
}); });
BluetoothLeBroadcastMetadata metadata = arguments.getParcelable( qrCodeDrawable = metadata == null ? null : getQrCodeDrawable(metadata,
BUNDLE_KEY_BROADCAST_METADATA, BluetoothLeBroadcastMetadata.class);
Drawable qrCodeDrawable = metadata == null ? null : getQrCodeDrawable(metadata,
getContext()).orElse(null); getContext()).orElse(null);
if (qrCodeDrawable != null) { if (qrCodeDrawable != null) {
String broadcastName = String broadcastName =
@@ -195,8 +201,7 @@ public class AudioSharingDialogFragment extends InstrumentedDialogFragment {
new String(metadata.getBroadcastCode(), StandardCharsets.UTF_8)) : new String(metadata.getBroadcastCode(), StandardCharsets.UTF_8)) :
getString(R.string.audio_sharing_dialog_qr_code_content_no_password, getString(R.string.audio_sharing_dialog_qr_code_content_no_password,
broadcastName); broadcastName);
builder.setCustomImage(qrCodeDrawable) builder.setCustomMessage(message)
.setCustomMessage(message)
.setCustomMessage2(R.string.audio_sharing_dialog_pair_new_device_content) .setCustomMessage2(R.string.audio_sharing_dialog_pair_new_device_content)
.setCustomNegativeButton(R.string.audio_streams_dialog_close, .setCustomNegativeButton(R.string.audio_streams_dialog_close,
v -> onCancelClick()); v -> onCancelClick());
@@ -251,7 +256,17 @@ public class AudioSharingDialogFragment extends InstrumentedDialogFragment {
.setCustomNegativeButton( .setCustomNegativeButton(
com.android.settings.R.string.cancel, v -> onCancelClick()); com.android.settings.R.string.cancel, v -> onCancelClick());
} }
return builder.build(); Dialog dialog = builder.build();
dialog.show();
if (deviceItems.isEmpty() && qrCodeDrawable != null) {
audioSharingFeatureProvider.setQrCode(
this,
dialog.getWindow().getDecorView(),
R.id.description_image,
qrCodeDrawable,
BluetoothLeBroadcastMetadataExt.INSTANCE.toQrCodeString(metadata));
}
return dialog;
} }
private void onCancelClick() { private void onCancelClick() {

View File

@@ -0,0 +1,43 @@
/*
* Copyright (C) 2025 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.connecteddevice.audiosharing;
import android.annotation.IdRes;
import androidx.annotation.NonNull;
import android.graphics.drawable.Drawable;
import android.view.View;
import androidx.fragment.app.Fragment;
/** Feature provider for the audio sharing features. */
public interface AudioSharingFeatureProvider {
/**
* Sets the QR code for audio sharing dialogs
*
* @param fragment the fragment to be updated
* @param qrcodeContainer the view to be updated
* @param qrCodeImageViewId the view ID to search for
* @param drawable the drawable asset of the QR code
* @param qrCode the value of the qrCode
*/
public void setQrCode(
@NonNull Fragment fragment,
@NonNull View qrcodeContainer,
@IdRes int qrCodeImageViewId,
@NonNull Drawable drawable,
@NonNull String qrCode);
}

View File

@@ -0,0 +1,39 @@
/*
* Copyright (C) 2025 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.connecteddevice.audiosharing;
import android.annotation.IdRes;
import androidx.annotation.NonNull;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.ImageView;
import androidx.fragment.app.Fragment;
/** Default implementation for {@link AudioSharingFeatureProvider} */
public class AudioSharingFeatureProviderImpl implements AudioSharingFeatureProvider {
public void setQrCode(
@NonNull Fragment fragment,
@NonNull View qrcodeContainer,
@IdRes int qrCodeImageViewId,
@NonNull Drawable drawable,
@NonNull String qrCode) {
ImageView imageView = ((ImageView) qrcodeContainer.requireViewById(qrCodeImageViewId));
imageView.setImageDrawable(drawable);
imageView.setVisibility(View.VISIBLE);
}
}

View File

@@ -37,11 +37,13 @@ import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.bluetooth.Utils; import com.android.settings.bluetooth.Utils;
import com.android.settings.connecteddevice.audiosharing.AudioSharingFeatureProvider;
import com.android.settings.core.InstrumentedFragment; import com.android.settings.core.InstrumentedFragment;
import com.android.settingslib.bluetooth.BluetoothLeBroadcastMetadataExt; import com.android.settingslib.bluetooth.BluetoothLeBroadcastMetadataExt;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast; import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
import com.android.settingslib.qrcode.QrCodeGenerator; import com.android.settingslib.qrcode.QrCodeGenerator;
import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.utils.ThreadUtils;
import com.android.settings.overlay.FeatureFactory;
import com.google.zxing.WriterException; import com.google.zxing.WriterException;
@@ -52,6 +54,9 @@ import java.util.Optional;
public class AudioStreamsQrCodeFragment extends InstrumentedFragment { public class AudioStreamsQrCodeFragment extends InstrumentedFragment {
private static final String TAG = "AudioStreamsQrCodeFragment"; private static final String TAG = "AudioStreamsQrCodeFragment";
AudioSharingFeatureProvider audioSharingFeatureProvider =
FeatureFactory.getFeatureFactory().getAudioSharingFeatureProvider();
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
return SettingsEnums.AUDIO_STREAM_QR_CODE; return SettingsEnums.AUDIO_STREAM_QR_CODE;
@@ -68,42 +73,52 @@ public class AudioStreamsQrCodeFragment extends InstrumentedFragment {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
// Collapse or expand the app bar based on orientation for better display the qr code image. // Collapse or expand the app bar based on orientation for better display the qr code image.
AudioStreamsHelper.configureAppBarByOrientation(getActivity()); AudioStreamsHelper.configureAppBarByOrientation(getActivity());
var unused = ThreadUtils.postOnBackgroundThread( var unused =
() -> { ThreadUtils.postOnBackgroundThread(
BluetoothLeBroadcastMetadata broadcastMetadata = getBroadcastMetadata(); () -> {
if (broadcastMetadata == null) { BluetoothLeBroadcastMetadata broadcastMetadata = getBroadcastMetadata();
return; if (broadcastMetadata == null) {
} return;
Drawable drawable = getQrCodeDrawable(broadcastMetadata, getActivity()).orElse( }
null); Drawable drawable =
if (drawable == null) { getQrCodeDrawable(broadcastMetadata, getActivity())
return; .orElse(null);
} if (drawable == null) {
return;
}
ThreadUtils.postOnMainThread( ThreadUtils.postOnMainThread(
() -> { () -> {
((ImageView) view.requireViewById(R.id.qrcode_view)) audioSharingFeatureProvider.setQrCode(
.setImageDrawable(drawable); this,
if (broadcastMetadata.getBroadcastCode() != null) { view,
String password = R.id.qrcode_view,
new String( drawable,
broadcastMetadata.getBroadcastCode(), BluetoothLeBroadcastMetadataExt.INSTANCE
StandardCharsets.UTF_8); .toQrCodeString(broadcastMetadata));
String passwordText = if (broadcastMetadata.getBroadcastCode() != null) {
getString( String password =
R.string.audio_streams_qr_code_page_password, new String(
password); broadcastMetadata.getBroadcastCode(),
((TextView) view.requireViewById(R.id.password)) StandardCharsets.UTF_8);
.setText(passwordText); String passwordText =
} getString(
TextView summaryView = view.requireViewById(android.R.id.summary); R.string
String summary = .audio_streams_qr_code_page_password,
getString( password);
R.string.audio_streams_qr_code_page_description, ((TextView) view.requireViewById(R.id.password))
broadcastMetadata.getBroadcastName()); .setText(passwordText);
summaryView.setText(summary); }
}); TextView summaryView =
}); view.requireViewById(android.R.id.summary);
String summary =
getString(
R.string
.audio_streams_qr_code_page_description,
broadcastMetadata.getBroadcastName());
summaryView.setText(summary);
});
});
} }
/** Gets an optional drawable from metadata. */ /** Gets an optional drawable from metadata. */

View File

@@ -25,6 +25,7 @@ import com.android.settings.biometrics.BiometricsFeatureProvider
import com.android.settings.biometrics.face.FaceFeatureProvider import com.android.settings.biometrics.face.FaceFeatureProvider
import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider
import com.android.settings.bluetooth.BluetoothFeatureProvider import com.android.settings.bluetooth.BluetoothFeatureProvider
import com.android.settings.connecteddevice.audiosharing.AudioSharingFeatureProvider
import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider
import com.android.settings.connecteddevice.stylus.StylusFeatureProvider import com.android.settings.connecteddevice.stylus.StylusFeatureProvider
import com.android.settings.dashboard.DashboardFeatureProvider import com.android.settings.dashboard.DashboardFeatureProvider
@@ -179,6 +180,11 @@ abstract class FeatureFactory {
*/ */
abstract val fastPairFeatureProvider: FastPairFeatureProvider abstract val fastPairFeatureProvider: FastPairFeatureProvider
/**
* Gets implementation for audio sharing related feature.
*/
abstract val audioSharingFeatureProvider: AudioSharingFeatureProvider
/** /**
* Gets implementation for Private Space account login feature. * Gets implementation for Private Space account login feature.
*/ */

View File

@@ -37,6 +37,8 @@ import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider
import com.android.settings.biometrics.fingerprint.FingerprintFeatureProviderImpl import com.android.settings.biometrics.fingerprint.FingerprintFeatureProviderImpl
import com.android.settings.bluetooth.BluetoothFeatureProvider import com.android.settings.bluetooth.BluetoothFeatureProvider
import com.android.settings.bluetooth.BluetoothFeatureProviderImpl import com.android.settings.bluetooth.BluetoothFeatureProviderImpl
import com.android.settings.connecteddevice.audiosharing.AudioSharingFeatureProvider
import com.android.settings.connecteddevice.audiosharing.AudioSharingFeatureProviderImpl
import com.android.settings.connecteddevice.dock.DockUpdaterFeatureProviderImpl import com.android.settings.connecteddevice.dock.DockUpdaterFeatureProviderImpl
import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider
import com.android.settings.connecteddevice.fastpair.FastPairFeatureProviderImpl import com.android.settings.connecteddevice.fastpair.FastPairFeatureProviderImpl
@@ -194,6 +196,10 @@ open class FeatureFactoryImpl : FeatureFactory() {
FastPairFeatureProviderImpl() FastPairFeatureProviderImpl()
} }
override val audioSharingFeatureProvider: AudioSharingFeatureProvider by lazy {
AudioSharingFeatureProviderImpl()
}
override val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider by lazy { override val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider by lazy {
PrivateSpaceLoginFeatureProviderImpl() PrivateSpaceLoginFeatureProviderImpl()
} }

View File

@@ -0,0 +1,93 @@
/*
* Copyright (C) 2025 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.connecteddevice.audiosharing;
import static com.google.common.truth.Truth.assertThat;
import static junit.framework.Assert.assertEquals;
import static org.mockito.Mockito.verify;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.robolectric.RobolectricTestRunner;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import com.android.settings.R;
import com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamsQrCodeFragment;
import androidx.fragment.app.Fragment;
import androidx.test.core.app.ApplicationProvider;
@RunWith(RobolectricTestRunner.class)
public class AudioSharingFeatureProviderImplTest {
private AudioSharingFeatureProvider mFeatureProvider;
@Mock private Fragment mFragment;
@Mock private View mockView;
private Context mContext;
@Mock private Drawable mDrawable;
@Before
public void setup() {
mContext = ApplicationProvider.getApplicationContext();
mFeatureProvider = new AudioSharingFeatureProviderImpl();
}
@Test
public void setQrCode_correctDialogLayout() {
mFragment = new AudioSharingDialogFragment();
View view =
LayoutInflater.from(mContext)
.inflate(R.layout.dialog_custom_body_audio_sharing, null);
mFeatureProvider.setQrCode(mFragment, view, R.id.description_image, mDrawable, "");
ImageView imageView = view.findViewById(R.id.description_image);
assertThat(imageView.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(imageView.getDrawable()).isEqualTo(mDrawable);
}
@Test
public void setQrCode_correctLayout() {
mFragment = new AudioStreamsQrCodeFragment();
View view =
LayoutInflater.from(mContext)
.inflate(R.layout.bluetooth_audio_streams_qr_code, null);
mFeatureProvider.setQrCode(mFragment, view, R.id.qrcode_view, mDrawable, "");
ImageView imageView = view.findViewById(R.id.qrcode_view);
assertThat(imageView.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(imageView.getDrawable()).isEqualTo(mDrawable);
}
@Test(expected = IllegalArgumentException.class)
public void setQrCode_nonExistedViewId() {
mFragment = new AudioStreamsQrCodeFragment();
View view =
LayoutInflater.from(mContext)
.inflate(R.layout.bluetooth_audio_streams_qr_code, null);
mFeatureProvider.setQrCode(mFragment, view, R.id.description_image, mDrawable, "");
}
}

View File

@@ -28,6 +28,7 @@ import com.android.settings.biometrics.BiometricsFeatureProvider;
import com.android.settings.biometrics.face.FaceFeatureProvider; import com.android.settings.biometrics.face.FaceFeatureProvider;
import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider; import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider;
import com.android.settings.bluetooth.BluetoothFeatureProvider; import com.android.settings.bluetooth.BluetoothFeatureProvider;
import com.android.settings.connecteddevice.audiosharing.AudioSharingFeatureProvider;
import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider; import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider;
import com.android.settings.connecteddevice.stylus.StylusFeatureProvider; import com.android.settings.connecteddevice.stylus.StylusFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProvider;
@@ -105,6 +106,7 @@ public class FakeFeatureFactory extends FeatureFactory {
public DisplayFeatureProvider mDisplayFeatureProvider; public DisplayFeatureProvider mDisplayFeatureProvider;
public SyncAcrossDevicesFeatureProvider mSyncAcrossDevicesFeatureProvider; public SyncAcrossDevicesFeatureProvider mSyncAcrossDevicesFeatureProvider;
public AccessibilityFeedbackFeatureProvider mAccessibilityFeedbackFeatureProvider; public AccessibilityFeedbackFeatureProvider mAccessibilityFeedbackFeatureProvider;
public AudioSharingFeatureProvider mAudioSharingFeatureProvider;
/** /**
* Call this in {@code @Before} method of the test class to use fake factory. * Call this in {@code @Before} method of the test class to use fake factory.
@@ -155,6 +157,7 @@ public class FakeFeatureFactory extends FeatureFactory {
mPrivateSpaceLoginFeatureProvider = mock(PrivateSpaceLoginFeatureProvider.class); mPrivateSpaceLoginFeatureProvider = mock(PrivateSpaceLoginFeatureProvider.class);
mDisplayFeatureProvider = mock(DisplayFeatureProvider.class); mDisplayFeatureProvider = mock(DisplayFeatureProvider.class);
mSyncAcrossDevicesFeatureProvider = mock(SyncAcrossDevicesFeatureProvider.class); mSyncAcrossDevicesFeatureProvider = mock(SyncAcrossDevicesFeatureProvider.class);
mAudioSharingFeatureProvider = mock(AudioSharingFeatureProvider.class);
} }
@Override @Override
@@ -347,4 +350,9 @@ public class FakeFeatureFactory extends FeatureFactory {
public AccessibilityFeedbackFeatureProvider getAccessibilityFeedbackFeatureProvider() { public AccessibilityFeedbackFeatureProvider getAccessibilityFeedbackFeatureProvider() {
return mAccessibilityFeedbackFeatureProvider; return mAccessibilityFeedbackFeatureProvider;
} }
}
@Override
public AudioSharingFeatureProvider getAudioSharingFeatureProvider() {
return mAudioSharingFeatureProvider;
}
}

View File

@@ -26,6 +26,7 @@ import com.android.settings.biometrics.BiometricsFeatureProvider
import com.android.settings.biometrics.face.FaceFeatureProvider import com.android.settings.biometrics.face.FaceFeatureProvider
import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider
import com.android.settings.bluetooth.BluetoothFeatureProvider import com.android.settings.bluetooth.BluetoothFeatureProvider
import com.android.settings.connecteddevice.audiosharing.AudioSharingFeatureProvider
import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider
import com.android.settings.connecteddevice.stylus.StylusFeatureProvider import com.android.settings.connecteddevice.stylus.StylusFeatureProvider
import com.android.settings.dashboard.DashboardFeatureProvider import com.android.settings.dashboard.DashboardFeatureProvider
@@ -148,4 +149,6 @@ class FakeFeatureFactory : FeatureFactory() {
get() = TODO("Not yet implemented") get() = TODO("Not yet implemented")
override val syncAcrossDevicesFeatureProvider: SyncAcrossDevicesFeatureProvider override val syncAcrossDevicesFeatureProvider: SyncAcrossDevicesFeatureProvider
get() = TODO("Not yet implemented") get() = TODO("Not yet implemented")
override val audioSharingFeatureProvider: AudioSharingFeatureProvider
get() = TODO("Not yet implemented")
} }

View File

@@ -28,6 +28,7 @@ import com.android.settings.biometrics.BiometricsFeatureProvider;
import com.android.settings.biometrics.face.FaceFeatureProvider; import com.android.settings.biometrics.face.FaceFeatureProvider;
import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider; import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider;
import com.android.settings.bluetooth.BluetoothFeatureProvider; import com.android.settings.bluetooth.BluetoothFeatureProvider;
import com.android.settings.connecteddevice.audiosharing.AudioSharingFeatureProvider;
import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider; import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider;
import com.android.settings.connecteddevice.stylus.StylusFeatureProvider; import com.android.settings.connecteddevice.stylus.StylusFeatureProvider;
import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProvider;
@@ -104,6 +105,7 @@ public class FakeFeatureFactory extends FeatureFactory {
public DisplayFeatureProvider mDisplayFeatureProvider; public DisplayFeatureProvider mDisplayFeatureProvider;
public SyncAcrossDevicesFeatureProvider mSyncAcrossDevicesFeatureProvider; public SyncAcrossDevicesFeatureProvider mSyncAcrossDevicesFeatureProvider;
public AccessibilityFeedbackFeatureProvider mAccessibilityFeedbackFeatureProvider; public AccessibilityFeedbackFeatureProvider mAccessibilityFeedbackFeatureProvider;
public AudioSharingFeatureProvider mAudioSharingFeatureProvider;
/** Call this in {@code @Before} method of the test class to use fake factory. */ /** Call this in {@code @Before} method of the test class to use fake factory. */
public static FakeFeatureFactory setupForTest() { public static FakeFeatureFactory setupForTest() {
@@ -156,6 +158,7 @@ public class FakeFeatureFactory extends FeatureFactory {
mPrivateSpaceLoginFeatureProvider = mock(PrivateSpaceLoginFeatureProvider.class); mPrivateSpaceLoginFeatureProvider = mock(PrivateSpaceLoginFeatureProvider.class);
mDisplayFeatureProvider = mock(DisplayFeatureProvider.class); mDisplayFeatureProvider = mock(DisplayFeatureProvider.class);
mSyncAcrossDevicesFeatureProvider = mock(SyncAcrossDevicesFeatureProvider.class); mSyncAcrossDevicesFeatureProvider = mock(SyncAcrossDevicesFeatureProvider.class);
mAudioSharingFeatureProvider = mock(AudioSharingFeatureProvider.class);
} }
@Override @Override
@@ -348,4 +351,9 @@ public class FakeFeatureFactory extends FeatureFactory {
public AccessibilityFeedbackFeatureProvider getAccessibilityFeedbackFeatureProvider() { public AccessibilityFeedbackFeatureProvider getAccessibilityFeedbackFeatureProvider() {
return mAccessibilityFeedbackFeatureProvider; return mAccessibilityFeedbackFeatureProvider;
} }
}
@Override
public AudioSharingFeatureProvider getAudioSharingFeatureProvider() {
return mAudioSharingFeatureProvider;
}
}