From 8c1d5ff5b6859bdcf878a1947f96a1ecf560d8e5 Mon Sep 17 00:00:00 2001 From: Kevin Liu Date: Fri, 3 May 2024 19:38:12 +0000 Subject: [PATCH 1/7] Add strict_mode: false As strict mode is in place, the default strict_mode is now set to true. We are encourage teams to write tests in strict_mode to make tests Bivalent (able to run on device and devicelessly) For more info on strict mode: go/roboStrictMode Test: atest SettingsRoboTests Bug: 334089788 Change-Id: I4381446dac381a34747043c564cf5288a2e16725 Merged-In: I4381446dac381a34747043c564cf5288a2e16725 --- tests/robotests/Android.bp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/robotests/Android.bp b/tests/robotests/Android.bp index ea58f6efb3b..5749873856c 100644 --- a/tests/robotests/Android.bp +++ b/tests/robotests/Android.bp @@ -95,6 +95,8 @@ android_robolectric_test { ], upstream: true, + + strict_mode: false, } java_library { From bdfd24ed5a777b802ae8245142585a3ba040d669 Mon Sep 17 00:00:00 2001 From: Hakjun Choi Date: Mon, 17 Jun 2024 05:53:47 +0000 Subject: [PATCH 2/7] Add a condition for preventing NPE when accessing SatelliteManager There could be a case that FEATURE_TELEPHONY_SATELLITE is false but KEY_SATELLITE_ATTACH_SUPPORTED_BOOL it true Since SatelliteManager can be returned only when FEATURE_TELEPHONY_SATELLITE is enabled, added a condition checks whether SatelliteManager is null or not Bug: 347057183 Test: atest SatelliteManagerTest SatelliteManagerTestOnMockServiceTest manually e2e test with FEATURE_TELEPHONY_SATELLITE disabled Change-Id: I3f51e6805ccab3366d9d01be2e999818cd18354f --- .../settings/network/telephony/SatelliteSetting.java | 9 ++++++++- .../telephony/SatelliteSettingPreferenceController.java | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/network/telephony/SatelliteSetting.java b/src/com/android/settings/network/telephony/SatelliteSetting.java index 314fb3ac4c8..7e9e61d07ed 100644 --- a/src/com/android/settings/network/telephony/SatelliteSetting.java +++ b/src/com/android/settings/network/telephony/SatelliteSetting.java @@ -92,6 +92,14 @@ public class SatelliteSetting extends RestrictedDashboardFragment { } mActivity = getActivity(); + + mSatelliteManager = mActivity.getSystemService(SatelliteManager.class); + if (mSatelliteManager == null) { + Log.d(TAG, "SatelliteManager is null, do nothing."); + finish(); + return; + } + mSubId = mActivity.getIntent().getIntExtra(SUB_ID, SubscriptionManager.INVALID_SUBSCRIPTION_ID); @@ -104,7 +112,6 @@ public class SatelliteSetting extends RestrictedDashboardFragment { } mTelephonymanager = mActivity.getSystemService(TelephonyManager.class); - mSatelliteManager = mActivity.getSystemService(SatelliteManager.class); } @Override diff --git a/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java b/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java index 153698c381b..9ca0294ebe6 100644 --- a/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java +++ b/src/com/android/settings/network/telephony/SatelliteSettingPreferenceController.java @@ -64,6 +64,10 @@ public class SatelliteSettingPreferenceController extends return UNSUPPORTED_ON_DEVICE; } + if (mSatelliteManager == null) { + return UNSUPPORTED_ON_DEVICE; + } + final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(subId); final boolean isSatelliteAttachSupported = carrierConfig.getBoolean( CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL); From 52cbe2156973794f8e09965e7a062a50ffd9768f Mon Sep 17 00:00:00 2001 From: Yiyi Shen Date: Mon, 17 Jun 2024 16:00:49 +0800 Subject: [PATCH 3/7] [Audiosharing] Add audio sharing loggings (P4) Bug: 331515891 Test: atest Change-Id: I05e1c138f9cc32c4e873852f93bac65d3d0dc3ca --- ...udioSharingDevicePreferenceController.java | 13 +++ .../AudioSharingDialogHandler.java | 32 ++++-- .../AudioSharingStopDialogFragment.java | 7 ++ .../AudioSharingSwitchBarController.java | 62 ++++++----- ...SharingDevicePreferenceControllerTest.java | 32 +++++- .../AudioSharingDialogHandlerTest.java | 101 +++++++++++++++++- .../AudioSharingSwitchBarControllerTest.java | 83 ++++++++++++++ 7 files changed, 287 insertions(+), 43 deletions(-) diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java index b932a7e28ef..cc883fe57c1 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java +++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceController.java @@ -18,6 +18,7 @@ package com.android.settings.connecteddevice.audiosharing; import static com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast.EXTRA_BLUETOOTH_DEVICE; +import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothLeBroadcastAssistant; @@ -44,6 +45,7 @@ import com.android.settings.bluetooth.Utils; import com.android.settings.connecteddevice.DevicePreferenceCallback; import com.android.settings.core.BasePreferenceController; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.BluetoothCallback; import com.android.settingslib.bluetooth.BluetoothEventManager; @@ -56,6 +58,7 @@ import com.android.settingslib.bluetooth.LeAudioProfile; import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import java.util.Locale; import java.util.concurrent.Executor; @@ -80,6 +83,7 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro @Nullable private final LocalBluetoothProfileManager mProfileManager; @Nullable private final LocalBluetoothLeBroadcastAssistant mAssistant; private final Executor mExecutor; + private final MetricsFeatureProvider mMetricsFeatureProvider; @Nullable private PreferenceGroup mPreferenceGroup; @Nullable private Preference mAudioSharingSettingsPreference; @Nullable private BluetoothDeviceUpdater mBluetoothDeviceUpdater; @@ -114,6 +118,10 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro @NonNull BluetoothDevice sink, @NonNull BluetoothLeBroadcastMetadata source, int reason) { + mMetricsFeatureProvider.action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_JOIN_FAILED, + SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY); AudioSharingUtils.toastMessage( mContext, String.format( @@ -143,6 +151,10 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro @Override public void onSourceRemoveFailed( @NonNull BluetoothDevice sink, int sourceId, int reason) { + mMetricsFeatureProvider.action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_LEAVE_FAILED, + SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY); AudioSharingUtils.toastMessage( mContext, String.format( @@ -183,6 +195,7 @@ public class AudioSharingDevicePreferenceController extends BasePreferenceContro ? null : mProfileManager.getLeAudioBroadcastAssistantProfile(); mExecutor = Executors.newSingleThreadExecutor(); + mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider(); } @Override diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandler.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandler.java index 8d69cf6232c..15e3de90e7a 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandler.java +++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandler.java @@ -60,7 +60,9 @@ public class AudioSharingDialogHandler { @Nullable private final LocalBluetoothLeBroadcast mBroadcast; @Nullable private final LocalBluetoothLeBroadcastAssistant mAssistant; private final MetricsFeatureProvider mMetricsFeatureProvider; - private List mTargetSinks = new ArrayList<>(); + // The target sinks to join broadcast onPlaybackStarted + @Nullable private List mTargetSinks; + private boolean mIsStoppingBroadcast = false; @VisibleForTesting final BluetoothLeBroadcast.Callback mBroadcastCallback = @@ -78,8 +80,15 @@ public class AudioSharingDialogHandler { @Override public void onBroadcastStartFailed(int reason) { Log.d(TAG, "onBroadcastStartFailed(), reason = " + reason); - AudioSharingUtils.toastMessage( - mContext, "Fail to start broadcast, reason " + reason); + if (mTargetSinks != null) { + mMetricsFeatureProvider.action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_START_FAILED, + SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY); + AudioSharingUtils.toastMessage( + mContext, "Fail to start broadcast, reason " + reason); + mTargetSinks = null; + } } @Override @@ -101,13 +110,21 @@ public class AudioSharingDialogHandler { + reason + ", broadcastId = " + broadcastId); + mIsStoppingBroadcast = false; } @Override public void onBroadcastStopFailed(int reason) { Log.d(TAG, "onBroadcastStopFailed(), reason = " + reason); - AudioSharingUtils.toastMessage( - mContext, "Fail to stop broadcast, reason " + reason); + if (mIsStoppingBroadcast) { + mMetricsFeatureProvider.action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_STOP_FAILED, + SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY); + AudioSharingUtils.toastMessage( + mContext, "Fail to stop broadcast, reason " + reason); + mIsStoppingBroadcast = false; + } } @Override @@ -124,7 +141,7 @@ public class AudioSharingDialogHandler { + reason + ", broadcastId = " + broadcastId); - if (!mTargetSinks.isEmpty()) { + if (mTargetSinks != null) { AudioSharingUtils.addSourceToTargetSinks(mTargetSinks, mLocalBtManager); new SubSettingLauncher(mContext) .setDestination(AudioSharingDashboardFragment.class.getName()) @@ -134,7 +151,7 @@ public class AudioSharingDialogHandler { .getMetricsCategory() : SettingsEnums.PAGE_UNKNOWN) .launch(); - mTargetSinks = new ArrayList<>(); + mTargetSinks = null; } } @@ -203,6 +220,7 @@ public class AudioSharingDialogHandler { AudioSharingStopDialogFragment.DialogEventListener listener = () -> { cachedDevice.setActive(); + mIsStoppingBroadcast = true; AudioSharingUtils.stopBroadcasting(mLocalBtManager); }; Pair[] eventData = diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java index 59593ba340f..b8da290f6e5 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java +++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingStopDialogFragment.java @@ -140,6 +140,13 @@ public class AudioSharingStopDialogFragment extends InstrumentedDialogFragment { return sCachedDevice; } + /** Test only: get the {@link DialogEventListener} passed to the dialog. */ + @VisibleForTesting + @Nullable + DialogEventListener getListener() { + return sListener; + } + /** Test only: get the event data passed to the dialog. */ @VisibleForTesting @NonNull diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java index 89d2c953a57..97055661686 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java +++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java @@ -134,8 +134,11 @@ public class AudioSharingSwitchBarController extends BasePreferenceController @Override public void onBroadcastStartFailed(int reason) { Log.d(TAG, "onBroadcastStartFailed(), reason = " + reason); - // TODO: handle broadcast start fail updateSwitch(); + mMetricsFeatureProvider.action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_START_FAILED, + SettingsEnums.AUDIO_SHARING_SETTINGS); } @Override @@ -164,8 +167,11 @@ public class AudioSharingSwitchBarController extends BasePreferenceController @Override public void onBroadcastStopFailed(int reason) { Log.d(TAG, "onBroadcastStopFailed(), reason = " + reason); - // TODO: handle broadcast stop fail updateSwitch(); + mMetricsFeatureProvider.action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_STOP_FAILED, + SettingsEnums.AUDIO_SHARING_SETTINGS); } @Override @@ -189,7 +195,8 @@ public class AudioSharingSwitchBarController extends BasePreferenceController public void onPlaybackStopped(int reason, int broadcastId) {} }; - private final BluetoothLeBroadcastAssistant.Callback mBroadcastAssistantCallback = + @VisibleForTesting + final BluetoothLeBroadcastAssistant.Callback mBroadcastAssistantCallback = new BluetoothLeBroadcastAssistant.Callback() { @Override public void onSearchStarted(int reason) {} @@ -207,16 +214,8 @@ public class AudioSharingSwitchBarController extends BasePreferenceController public void onSourceFound(@NonNull BluetoothLeBroadcastMetadata source) {} @Override - public void onSourceAdded(@NonNull BluetoothDevice sink, int sourceId, int reason) { - Log.d( - TAG, - "onSourceAdded(), sink = " - + sink - + ", sourceId = " - + sourceId - + ", reason = " - + reason); - } + public void onSourceAdded( + @NonNull BluetoothDevice sink, int sourceId, int reason) {} @Override public void onSourceAddFailed( @@ -231,6 +230,10 @@ public class AudioSharingSwitchBarController extends BasePreferenceController + source + ", reason = " + reason); + mMetricsFeatureProvider.action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_JOIN_FAILED, + SettingsEnums.AUDIO_SHARING_SETTINGS); AudioSharingUtils.toastMessage( mContext, String.format( @@ -318,15 +321,17 @@ public class AudioSharingSwitchBarController extends BasePreferenceController public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // Filter out unnecessary callbacks when switch is disabled. if (!buttonView.isEnabled()) return; + if (mBroadcast == null || mAssistant == null) { + mSwitchBar.setChecked(false); + Log.d(TAG, "Skip onCheckedChanged, profile not support."); + return; + } + mSwitchBar.setEnabled(false); + boolean isBroadcasting = AudioSharingUtils.isBroadcasting(mBtManager); if (isChecked) { - mSwitchBar.setEnabled(false); - boolean isBroadcasting = AudioSharingUtils.isBroadcasting(mBtManager); - if (mAssistant == null || mBroadcast == null || isBroadcasting) { - Log.d(TAG, "Skip startAudioSharing, already broadcasting or not support."); + if (isBroadcasting) { + Log.d(TAG, "Skip startAudioSharing, already broadcasting."); mSwitchBar.setEnabled(true); - if (!isBroadcasting) { - mSwitchBar.setChecked(false); - } return; } // FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST is always true in @@ -352,6 +357,11 @@ public class AudioSharingSwitchBarController extends BasePreferenceController } startAudioSharing(); } else { + if (!isBroadcasting) { + Log.d(TAG, "Skip stopAudioSharing, already not broadcasting."); + mSwitchBar.setEnabled(true); + return; + } stopAudioSharing(); } } @@ -454,18 +464,18 @@ public class AudioSharingSwitchBarController extends BasePreferenceController } if (mBroadcast != null) { mBroadcast.startPrivateBroadcast(); + mMetricsFeatureProvider.action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_MAIN_SWITCH_ON, + deviceItems.size()); } } private void stopAudioSharing() { - mSwitchBar.setEnabled(false); - if (!AudioSharingUtils.isBroadcasting(mBtManager)) { - Log.d(TAG, "Skip stopAudioSharing, already not broadcasting or broadcast not support."); - mSwitchBar.setEnabled(true); - return; - } if (mBroadcast != null) { mBroadcast.stopBroadcast(mBroadcast.getLatestBroadcastId()); + mMetricsFeatureProvider.action( + mContext, SettingsEnums.ACTION_AUDIO_SHARING_MAIN_SWITCH_OFF); } } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceControllerTest.java index 18f75ba2b85..f3f32ae4e31 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDevicePreferenceControllerTest.java @@ -30,9 +30,11 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; +import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothLeBroadcastAssistant; @@ -57,6 +59,7 @@ import androidx.test.core.app.ApplicationProvider; import com.android.settings.SettingsActivity; import com.android.settings.bluetooth.Utils; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; import com.android.settings.testutils.shadow.ShadowBluetoothUtils; import com.android.settings.testutils.shadow.ShadowFragment; @@ -136,6 +139,7 @@ public class AudioSharingDevicePreferenceControllerTest { private LifecycleOwner mLifecycleOwner; private PreferenceCategory mPreferenceGroup; private Preference mAudioSharingPreference; + private FakeFeatureFactory mFeatureFactory; @Before public void setUp() { @@ -148,6 +152,7 @@ public class AudioSharingDevicePreferenceControllerTest { BluetoothStatusCodes.FEATURE_SUPPORTED); mLifecycleOwner = () -> mLifecycle; mLifecycle = new Lifecycle(mLifecycleOwner); + mFeatureFactory = FakeFeatureFactory.setupForTest(); ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBtManager; mLocalBtManager = Utils.getLocalBtManager(mContext); when(mLocalBtManager.getEventManager()).thenReturn(mEventManager); @@ -175,6 +180,7 @@ public class AudioSharingDevicePreferenceControllerTest { .thenReturn(mAudioSharingPreference); when(mScreen.findPreference(KEY)).thenReturn(mPreferenceGroup); mController = new AudioSharingDevicePreferenceController(mContext); + mController.init(mFragment); mController.setBluetoothDeviceUpdater(mBluetoothDeviceUpdater); mController.setDialogHandler(mDialogHandler); doReturn(mActivity).when(mFragment).getActivity(); @@ -526,6 +532,25 @@ public class AudioSharingDevicePreferenceControllerTest { verify(mBluetoothDeviceUpdater, times(2)).forceUpdate(); } + @Test + public void testBluetoothLeBroadcastAssistantCallbacks_logAction() { + mController.mBroadcastAssistantCallback.onSourceAddFailed( + mDevice, mSource, /* reason= */ 1); + verify(mFeatureFactory.metricsFeatureProvider) + .action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_JOIN_FAILED, + SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY); + + mController.mBroadcastAssistantCallback.onSourceRemoveFailed( + mDevice, /* sourceId= */ 1, /* reason= */ 1); + verify(mFeatureFactory.metricsFeatureProvider) + .action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_LEAVE_FAILED, + SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY); + } + @Test public void testBluetoothLeBroadcastAssistantCallbacks_doNothing() { mController.mBroadcastAssistantCallback.onSearchStarted(/* reason= */ 1); @@ -534,10 +559,6 @@ public class AudioSharingDevicePreferenceControllerTest { mController.mBroadcastAssistantCallback.onSearchStopFailed(/* reason= */ 1); mController.mBroadcastAssistantCallback.onSourceAdded( mDevice, /* sourceId= */ 1, /* reason= */ 1); - mController.mBroadcastAssistantCallback.onSourceAddFailed( - mDevice, mSource, /* reason= */ 1); - mController.mBroadcastAssistantCallback.onSourceRemoveFailed( - mDevice, /* sourceId= */ 1, /* reason= */ 1); mController.mBroadcastAssistantCallback.onSourceModified( mDevice, /* sourceId= */ 1, /* reason= */ 1); mController.mBroadcastAssistantCallback.onSourceModifyFailed( @@ -546,7 +567,8 @@ public class AudioSharingDevicePreferenceControllerTest { mController.mBroadcastAssistantCallback.onSourceLost(/* broadcastId= */ 1); shadowOf(Looper.getMainLooper()).idle(); - // Above callbacks won't update group preference + // Above callbacks won't update group preference and log actions verify(mBluetoothDeviceUpdater, never()).forceUpdate(); + verifyNoMoreInteractions(mFeatureFactory.metricsFeatureProvider); } } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandlerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandlerTest.java index 4c060d4356d..a7e6f5698d2 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandlerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingDialogHandlerTest.java @@ -25,6 +25,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; @@ -288,6 +289,8 @@ public class AudioSharingDialogHandlerTest { assertThat(listener).isNotNull(); listener.onShareClick(); verify(mBroadcast).startPrivateBroadcast(); + listener.onCancelClick(); + verify(mCachedDevice1).setActive(); } @Test @@ -330,6 +333,8 @@ public class AudioSharingDialogHandlerTest { 1)); AudioSharingJoinDialogFragment.DialogEventListener listener = fragment.getListener(); assertThat(listener).isNotNull(); + listener.onCancelClick(); + verify(mAssistant, never()).addSource(mDevice1, mMetadata, /* isGroupOp= */ false); listener.onShareClick(); verify(mAssistant).addSource(mDevice1, mMetadata, /* isGroupOp= */ false); } @@ -397,7 +402,7 @@ public class AudioSharingDialogHandlerTest { @Test public void handleNonLeaDeviceConnected_sharing_showStopDialog() { setUpBroadcast(true); - ImmutableList deviceList = ImmutableList.of(mDevice2); + ImmutableList deviceList = ImmutableList.of(mDevice1); when(mAssistant.getDevicesMatchingConnectionStates( new int[] {BluetoothProfile.STATE_CONNECTED})) .thenReturn(deviceList); @@ -487,6 +492,8 @@ public class AudioSharingDialogHandlerTest { assertThat(listener).isNotNull(); listener.onShareClick(); verify(mBroadcast).startPrivateBroadcast(); + listener.onCancelClick(); + verify(mCachedDevice1, never()).setActive(); } @Test @@ -529,6 +536,8 @@ public class AudioSharingDialogHandlerTest { 1)); AudioSharingJoinDialogFragment.DialogEventListener listener = fragment.getListener(); assertThat(listener).isNotNull(); + listener.onCancelClick(); + verify(mAssistant, never()).addSource(mDevice1, mMetadata, /* isGroupOp= */ false); listener.onShareClick(); verify(mAssistant).addSource(mDevice1, mMetadata, /* isGroupOp= */ false); } @@ -604,11 +613,38 @@ public class AudioSharingDialogHandlerTest { SettingsEnums.DIALOG_START_AUDIO_SHARING); } + @Test + public void closeOpeningDialogsForLeaDevice_closeDisconnectDialog() { + // Show disconnect dialog + setUpBroadcast(true); + ImmutableList deviceList = ImmutableList.of(mDevice1, mDevice3, mDevice4); + when(mAssistant.getDevicesMatchingConnectionStates( + new int[] {BluetoothProfile.STATE_CONNECTED})) + .thenReturn(deviceList); + when(mAssistant.getAllSources(mDevice1)).thenReturn(ImmutableList.of()); + when(mAssistant.getAllSources(mDevice3)).thenReturn(ImmutableList.of(mState)); + when(mAssistant.getAllSources(mDevice4)).thenReturn(ImmutableList.of(mState)); + mHandler.handleDeviceConnected(mCachedDevice1, /* userTriggered= */ false); + shadowOf(Looper.getMainLooper()).idle(); + assertThat(mParentFragment.getChildFragmentManager().getFragments()) + .comparingElementsUsing(TAG_EQUALS) + .containsExactly(AudioSharingDisconnectDialogFragment.tag()); + // Close opening dialogs + mHandler.closeOpeningDialogsForLeaDevice(mCachedDevice1); + shadowOf(Looper.getMainLooper()).idle(); + assertThat(mParentFragment.getChildFragmentManager().getFragments()).isEmpty(); + verify(mFeatureFactory.metricsFeatureProvider) + .action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_DIALOG_AUTO_DISMISS, + SettingsEnums.DIALOG_AUDIO_SHARING_SWITCH_DEVICE); + } + @Test public void closeOpeningDialogsForNonLeaDevice_closeStopDialog() { // Show stop dialog setUpBroadcast(true); - ImmutableList deviceList = ImmutableList.of(mDevice2); + ImmutableList deviceList = ImmutableList.of(mDevice1); when(mAssistant.getDevicesMatchingConnectionStates( new int[] {BluetoothProfile.STATE_CONNECTED})) .thenReturn(deviceList); @@ -677,6 +713,34 @@ public class AudioSharingDialogHandlerTest { verify(mBroadcast).unregisterServiceCallBack(any(BluetoothLeBroadcast.Callback.class)); } + @Test + public void onBroadcastStartFailed_logAction() { + setUpBroadcast(false); + ImmutableList deviceList = ImmutableList.of(mDevice1, mDevice3); + when(mAssistant.getDevicesMatchingConnectionStates( + new int[] {BluetoothProfile.STATE_CONNECTED})) + .thenReturn(deviceList); + when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of()); + mHandler.handleDeviceConnected(mCachedDevice1, /* userTriggered= */ false); + shadowOf(Looper.getMainLooper()).idle(); + List childFragments = mParentFragment.getChildFragmentManager().getFragments(); + assertThat(childFragments) + .comparingElementsUsing(TAG_EQUALS) + .containsExactly(AudioSharingJoinDialogFragment.tag()); + AudioSharingJoinDialogFragment fragment = + (AudioSharingJoinDialogFragment) Iterables.getOnlyElement(childFragments); + AudioSharingJoinDialogFragment.DialogEventListener listener = fragment.getListener(); + assertThat(listener).isNotNull(); + listener.onShareClick(); + + mHandler.mBroadcastCallback.onBroadcastStartFailed(/* reason= */ 1); + verify(mFeatureFactory.metricsFeatureProvider) + .action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_START_FAILED, + SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY); + } + @Test public void onPlaybackStarted_addSource() { setUpBroadcast(false); @@ -705,16 +769,42 @@ public class AudioSharingDialogHandlerTest { verify(mAssistant).addSource(mDevice3, mMetadata, /* isGroupOp= */ false); } + @Test + public void onBroadcastStopFailed_logAction() { + setUpBroadcast(true); + ImmutableList deviceList = ImmutableList.of(mDevice1); + when(mAssistant.getDevicesMatchingConnectionStates( + new int[] {BluetoothProfile.STATE_CONNECTED})) + .thenReturn(deviceList); + when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of(mState)); + mHandler.handleDeviceConnected(mCachedDevice2, /* userTriggered= */ false); + shadowOf(Looper.getMainLooper()).idle(); + List childFragments = mParentFragment.getChildFragmentManager().getFragments(); + assertThat(childFragments) + .comparingElementsUsing(TAG_EQUALS) + .containsExactly(AudioSharingStopDialogFragment.tag()); + + AudioSharingStopDialogFragment fragment = + (AudioSharingStopDialogFragment) Iterables.getOnlyElement(childFragments); + AudioSharingStopDialogFragment.DialogEventListener listener = fragment.getListener(); + assertThat(listener).isNotNull(); + listener.onStopSharingClick(); + + mHandler.mBroadcastCallback.onBroadcastStopFailed(/* reason= */ 1); + verify(mFeatureFactory.metricsFeatureProvider) + .action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_STOP_FAILED, + SettingsEnums.SETTINGS_CONNECTED_DEVICE_CATEGORY); + } + @Test public void testBluetoothLeBroadcastCallbacks_doNothing() { mHandler.mBroadcastCallback.onBroadcastStarted(/* reason= */ 1, /* broadcastId= */ 1); - mHandler.mBroadcastCallback.onBroadcastStopped(/* reason= */ 1, /* broadcastId= */ 1); mHandler.mBroadcastCallback.onBroadcastMetadataChanged(/* reason= */ 1, mMetadata); mHandler.mBroadcastCallback.onBroadcastUpdated(/* reason= */ 1, /* broadcastId= */ 1); mHandler.mBroadcastCallback.onPlaybackStarted(/* reason= */ 1, /* broadcastId= */ 1); mHandler.mBroadcastCallback.onPlaybackStopped(/* reason= */ 1, /* broadcastId= */ 1); - mHandler.mBroadcastCallback.onBroadcastStartFailed(/* reason= */ 1); - mHandler.mBroadcastCallback.onBroadcastStopFailed(/* reason= */ 1); mHandler.mBroadcastCallback.onBroadcastUpdateFailed(/* reason= */ 1, /* broadcastId= */ 1); verify(mAssistant, never()) @@ -723,6 +813,7 @@ public class AudioSharingDialogHandlerTest { any(BluetoothLeBroadcastMetadata.class), anyBoolean()); verify(mAssistant, never()).removeSource(any(BluetoothDevice.class), anyInt()); + verifyNoMoreInteractions(mFeatureFactory.metricsFeatureProvider); } private void setUpBroadcast(boolean isBroadcasting) { diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java index 45d99c7adde..d68b68bcc78 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarControllerTest.java @@ -30,6 +30,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; @@ -39,6 +40,7 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothLeBroadcast; import android.bluetooth.BluetoothLeBroadcastAssistant; import android.bluetooth.BluetoothLeBroadcastMetadata; +import android.bluetooth.BluetoothLeBroadcastReceiveState; import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothStatusCodes; import android.content.BroadcastReceiver; @@ -430,6 +432,38 @@ public class AudioSharingSwitchBarControllerTest { verify(mBroadcast).stopBroadcast(1); } + @Test + public void onPlaybackStarted_notInit_noDialog() { + FeatureFlagUtils.setEnabled( + mContext, FeatureFlagUtils.SETTINGS_NEED_CONNECTED_BLE_DEVICE_FOR_BROADCAST, true); + when(mBtnView.isEnabled()).thenReturn(true); + when(mAssistant.getDevicesMatchingConnectionStates( + new int[] {BluetoothProfile.STATE_CONNECTED})) + .thenReturn(ImmutableList.of(mDevice2, mDevice1)); + doNothing().when(mBroadcast).startPrivateBroadcast(); + mController = + new AudioSharingSwitchBarController( + mContext, + mSwitchBar, + new AudioSharingSwitchBarController.OnAudioSharingStateChangedListener() { + @Override + public void onAudioSharingStateChanged() {} + + @Override + public void onAudioSharingProfilesConnected() {} + }); + mController.onCheckedChanged(mBtnView, /* isChecked= */ true); + verify(mBroadcast).startPrivateBroadcast(); + mController.mBroadcastCallback.onPlaybackStarted(0, 0); + shadowOf(Looper.getMainLooper()).idle(); + + verify(mFeatureFactory.metricsFeatureProvider) + .action(any(Context.class), eq(SettingsEnums.ACTION_AUTO_JOIN_AUDIO_SHARING)); + + List childFragments = mParentFragment.getChildFragmentManager().getFragments(); + assertThat(childFragments).isEmpty(); + } + @Test public void onPlaybackStarted_showJoinAudioSharingDialog() { FeatureFlagUtils.setEnabled( @@ -485,6 +519,11 @@ public class AudioSharingSwitchBarControllerTest { shadowOf(Looper.getMainLooper()).idle(); assertThat(mSwitchBar.isChecked()).isFalse(); assertThat(mOnAudioSharingStateChanged).isFalse(); + verify(mFeatureFactory.metricsFeatureProvider) + .action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_START_FAILED, + SettingsEnums.AUDIO_SHARING_SETTINGS); when(mBroadcast.isEnabled(any())).thenReturn(true); mController.mBroadcastCallback.onBroadcastStarted(/* reason= */ 1, /* broadcastId= */ 1); @@ -497,6 +536,11 @@ public class AudioSharingSwitchBarControllerTest { shadowOf(Looper.getMainLooper()).idle(); assertThat(mSwitchBar.isChecked()).isTrue(); assertThat(mOnAudioSharingStateChanged).isFalse(); + verify(mFeatureFactory.metricsFeatureProvider) + .action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_STOP_FAILED, + SettingsEnums.AUDIO_SHARING_SETTINGS); when(mBroadcast.isEnabled(any())).thenReturn(false); mController.mBroadcastCallback.onBroadcastStopped(/* reason= */ 1, /* broadcastId= */ 1); @@ -517,4 +561,43 @@ public class AudioSharingSwitchBarControllerTest { verify(mSwitchBar, never()).setChecked(anyBoolean()); assertThat(mOnAudioSharingStateChanged).isFalse(); } + + @Test + public void testBluetoothLeBroadcastAssistantCallbacks_logAction() { + BluetoothLeBroadcastMetadata metadata = mock(BluetoothLeBroadcastMetadata.class); + mController.mBroadcastAssistantCallback.onSourceAddFailed( + mDevice1, metadata, /* reason= */ 1); + verify(mFeatureFactory.metricsFeatureProvider) + .action( + mContext, + SettingsEnums.ACTION_AUDIO_SHARING_JOIN_FAILED, + SettingsEnums.AUDIO_SHARING_SETTINGS); + } + + @Test + public void testBluetoothLeBroadcastAssistantCallbacks_doNothing() { + BluetoothLeBroadcastReceiveState state = mock(BluetoothLeBroadcastReceiveState.class); + BluetoothLeBroadcastMetadata metadata = mock(BluetoothLeBroadcastMetadata.class); + + // Do nothing + mController.mBroadcastAssistantCallback.onReceiveStateChanged( + mDevice1, /* sourceId= */ 1, state); + mController.mBroadcastAssistantCallback.onSearchStarted(/* reason= */ 1); + mController.mBroadcastAssistantCallback.onSearchStartFailed(/* reason= */ 1); + mController.mBroadcastAssistantCallback.onSearchStopped(/* reason= */ 1); + mController.mBroadcastAssistantCallback.onSearchStopFailed(/* reason= */ 1); + mController.mBroadcastAssistantCallback.onSourceAdded( + mDevice1, /* sourceId= */ 1, /* reason= */ 1); + mController.mBroadcastAssistantCallback.onSourceRemoved( + mDevice1, /* sourceId= */ 1, /* reason= */ 1); + mController.mBroadcastAssistantCallback.onSourceRemoveFailed( + mDevice1, /* sourceId= */ 1, /* reason= */ 1); + mController.mBroadcastAssistantCallback.onSourceModified( + mDevice1, /* sourceId= */ 1, /* reason= */ 1); + mController.mBroadcastAssistantCallback.onSourceModifyFailed( + mDevice1, /* sourceId= */ 1, /* reason= */ 1); + mController.mBroadcastAssistantCallback.onSourceFound(metadata); + mController.mBroadcastAssistantCallback.onSourceLost(/* broadcastId= */ 1); + verifyNoMoreInteractions(mFeatureFactory.metricsFeatureProvider); + } } From 80a81431f45e0960b9145eb336d51dd11654e175 Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Tue, 18 Jun 2024 14:39:49 +0800 Subject: [PATCH 4/7] Use Kotlin List & NonNull String To avoid Room compiler error / warning. Bug: 332487783 Test: m Settings Flag: EXEMPT refactor Change-Id: I79a4991c1a0009e347f0916f4f204229dc07581a --- .../fuelgauge/batteryusage/db/BatteryReattributeDao.kt | 4 +--- .../batteryusage/db/BatteryReattributeEntity.java | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryReattributeDao.kt b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryReattributeDao.kt index 79c9d0039a5..4151a5be690 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryReattributeDao.kt +++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryReattributeDao.kt @@ -21,11 +21,9 @@ import androidx.room.Insert; import androidx.room.OnConflictStrategy; import androidx.room.Query; -import java.util.List; - /** DAO for accessing {@link BatteryReattributeEntity} in the database. */ @Dao -public interface BatteryReattributeDao { +interface BatteryReattributeDao { /** Inserts a {@link BatteryReattributeEntity} data into the database. */ @Insert(onConflict = OnConflictStrategy.REPLACE) diff --git a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryReattributeEntity.java b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryReattributeEntity.java index aa7e50ea9be..6abfb81bf83 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/db/BatteryReattributeEntity.java +++ b/src/com/android/settings/fuelgauge/batteryusage/db/BatteryReattributeEntity.java @@ -18,14 +18,14 @@ package com.android.settings.fuelgauge.batteryusage.db; import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.utcToLocalTimeForLogging; -import com.android.settings.fuelgauge.batteryusage.BatteryReattribute; -import com.android.settings.fuelgauge.batteryusage.ConvertUtils; - import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.room.Entity; import androidx.room.PrimaryKey; +import com.android.settings.fuelgauge.batteryusage.BatteryReattribute; +import com.android.settings.fuelgauge.batteryusage.ConvertUtils; + /** A {@link Entity} for battery usage reattribution data in the database. */ @Entity public class BatteryReattributeEntity { @@ -38,7 +38,7 @@ public class BatteryReattributeEntity { public final long timestampEnd; /** The battery usage reattribution data for corresponding uids. */ - public final String reattributeData; + @NonNull public final String reattributeData; public BatteryReattributeEntity(@NonNull BatteryReattribute batteryReattribute) { this( From e01855dcdb14b1f333995ca869d7274e4d95c413 Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Tue, 18 Jun 2024 06:59:56 +0000 Subject: [PATCH 5/7] Fix SubscriptionInfoListViewModelTest Fix: 329160337 Test: unit test (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:10f5bdabb468b806d634a2b9061b9908b2e8d430) Merged-In: I7a3d27cb53c930a56ab0f0896b545807bf4f9dc0 Change-Id: I7a3d27cb53c930a56ab0f0896b545807bf4f9dc0 --- .../SubscriptionInfoListViewModelTest.kt | 26 ++++++------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/tests/spa_unit/src/com/android/settings/network/SubscriptionInfoListViewModelTest.kt b/tests/spa_unit/src/com/android/settings/network/SubscriptionInfoListViewModelTest.kt index 020a4706997..6eb7c586b3c 100644 --- a/tests/spa_unit/src/com/android/settings/network/SubscriptionInfoListViewModelTest.kt +++ b/tests/spa_unit/src/com/android/settings/network/SubscriptionInfoListViewModelTest.kt @@ -23,12 +23,9 @@ import android.content.Context import android.platform.test.flag.junit.SetFlagsRule import android.telephony.SubscriptionInfo import android.telephony.SubscriptionManager -import android.telephony.TelephonyCallback -import android.telephony.TelephonyManager import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.internal.telephony.flags.Flags -import com.android.settings.network.telephony.CallStateFlowTest import com.android.settingslib.spa.testutils.toListWithTimeout import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.async @@ -42,7 +39,6 @@ import org.mockito.kotlin.doAnswer import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.spy -import org.mockito.kotlin.stub @RunWith(AndroidJUnit4::class) class SubscriptionInfoListViewModelTest { @@ -62,8 +58,7 @@ class SubscriptionInfoListViewModelTest { on { getSystemService(SubscriptionManager::class.java) } doReturn mockSubscriptionManager } - private val subscriptionInfoListViewModel: SubscriptionInfoListViewModel = - SubscriptionInfoListViewModel(context as Application); + private fun createViewModel() = SubscriptionInfoListViewModel(context as Application) private var activeSubscriptionInfoList: List? = null @@ -72,7 +67,7 @@ class SubscriptionInfoListViewModelTest { activeSubscriptionInfoList = listOf(SUB_INFO_1, SUB_INFO_2) val listDeferred = async { - subscriptionInfoListViewModel.subscriptionInfoListFlow.toListWithTimeout() + createViewModel().subscriptionInfoListFlow.toListWithTimeout() } delay(100) subInfoListener?.onSubscriptionsChanged() @@ -83,49 +78,44 @@ class SubscriptionInfoListViewModelTest { @Test fun onSubscriptionsChanged_hasProvisioning_filterProvisioning() = runBlocking { activeSubscriptionInfoList = listOf(SUB_INFO_1, SUB_INFO_2, SUB_INFO_3) - val expectation = listOf(SUB_INFO_1, SUB_INFO_2) val listDeferred = async { - subscriptionInfoListViewModel.subscriptionInfoListFlow.toListWithTimeout() + createViewModel().subscriptionInfoListFlow.toListWithTimeout() } delay(100) subInfoListener?.onSubscriptionsChanged() - assertThat(listDeferred.await()).contains(expectation) + assertThat(listDeferred.await()).contains(listOf(SUB_INFO_1, SUB_INFO_2)) } @Test fun onSubscriptionsChanged_flagOffHasNonTerrestrialNetwork_filterNonTerrestrialNetwork() = runBlocking { mSetFlagsRule.disableFlags(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) - activeSubscriptionInfoList = listOf(SUB_INFO_1, SUB_INFO_2, SUB_INFO_4) - val expectation = listOf(SUB_INFO_1, SUB_INFO_2, SUB_INFO_4) val listDeferred = async { - subscriptionInfoListViewModel.subscriptionInfoListFlow.toListWithTimeout() + createViewModel().subscriptionInfoListFlow.toListWithTimeout() } delay(100) subInfoListener?.onSubscriptionsChanged() - assertThat(listDeferred.await()).contains(expectation) + assertThat(listDeferred.await()).contains(listOf(SUB_INFO_1, SUB_INFO_2, SUB_INFO_4)) } @Test fun onSubscriptionsChanged_flagOnHasNonTerrestrialNetwork_filterNonTerrestrialNetwork() = runBlocking { mSetFlagsRule.enableFlags(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) - activeSubscriptionInfoList = listOf(SUB_INFO_1, SUB_INFO_2, SUB_INFO_4) - val expectation = listOf(SUB_INFO_1, SUB_INFO_2) val listDeferred = async { - subscriptionInfoListViewModel.subscriptionInfoListFlow.toListWithTimeout() + createViewModel().subscriptionInfoListFlow.toListWithTimeout() } delay(100) subInfoListener?.onSubscriptionsChanged() - assertThat(listDeferred.await()).contains(expectation) + assertThat(listDeferred.await()).contains(listOf(SUB_INFO_1, SUB_INFO_2)) } private companion object { From b5a82c2f91b6e0dd271a54df7ec77d29e25e1949 Mon Sep 17 00:00:00 2001 From: "J. Eason" Date: Tue, 18 Jun 2024 07:52:20 +0000 Subject: [PATCH 6/7] Update the icon for the adb wireless pairing code preference. The new icon is more specific to adb wireless pairing and will now react correctly to system theme accent color changes. Bug: 347710454 Change-Id: I7bd25661b2dda83403b41c7ebdf1941437d1d0f8 --- res/drawable/ic_password_adb_wireless.xml | 35 +++++++++++++++++++++++ res/xml/adb_wireless_settings.xml | 2 +- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 res/drawable/ic_password_adb_wireless.xml diff --git a/res/drawable/ic_password_adb_wireless.xml b/res/drawable/ic_password_adb_wireless.xml new file mode 100644 index 00000000000..b9c32d7763a --- /dev/null +++ b/res/drawable/ic_password_adb_wireless.xml @@ -0,0 +1,35 @@ + + + + + + + + \ No newline at end of file diff --git a/res/xml/adb_wireless_settings.xml b/res/xml/adb_wireless_settings.xml index 7d372070f37..4bf5544da1f 100644 --- a/res/xml/adb_wireless_settings.xml +++ b/res/xml/adb_wireless_settings.xml @@ -53,7 +53,7 @@ settings:controller="com.android.settings.development.AdbQrCodePreferenceController"/> From c956160fe754283e2932a71a0c2c4baaeb2c26e9 Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Tue, 18 Jun 2024 17:26:21 +0800 Subject: [PATCH 7/7] Lazy create InternetPreferenceRepository In InternetPreferenceControllerV2, to not created in search indexing for better performance. Bug: 339884322 Flag: com.android.settings.flags.internet_preference_controller_v2 Test: manual - on Internet Change-Id: I9e0e36ba6296d48d3761714db52074c90f635233 --- .../android/settings/network/InternetPreferenceControllerV2.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/network/InternetPreferenceControllerV2.kt b/src/com/android/settings/network/InternetPreferenceControllerV2.kt index a181abd2ef0..3c793420dbc 100644 --- a/src/com/android/settings/network/InternetPreferenceControllerV2.kt +++ b/src/com/android/settings/network/InternetPreferenceControllerV2.kt @@ -28,7 +28,7 @@ import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle class InternetPreferenceControllerV2(context: Context, preferenceKey: String) : BasePreferenceController(context, preferenceKey) { - private val repository = InternetPreferenceRepository(mContext) + private val repository by lazy { InternetPreferenceRepository(mContext) } private var preference: Preference? = null override fun getAvailabilityStatus() =