diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-11-08 00:23:45 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-11-08 00:23:45 +0000 |
commit | 7cdeafec6810587ad6f7abbe6295a749803ceb5e (patch) | |
tree | ee755fbb2256808fd6dfc48074ab4d46d90d0d1e | |
parent | 11e0c7252f2a788edc484491a1ce35ec3e7293e5 (diff) | |
parent | 6b4e6d40221192bc5fbb545bd6a18cb6e168a93a (diff) | |
download | wifi-7cdeafec6810587ad6f7abbe6295a749803ceb5e.tar.gz |
Snap for 11065517 from 6b4e6d40221192bc5fbb545bd6a18cb6e168a93a to 24Q1-release
Change-Id: I1612f174db884b74c5e9a440a61629c798b06836
8 files changed, 123 insertions, 30 deletions
diff --git a/libs/WifiTrackerLib/Android.bp b/libs/WifiTrackerLib/Android.bp index 25270137a..ae16f1a23 100644 --- a/libs/WifiTrackerLib/Android.bp +++ b/libs/WifiTrackerLib/Android.bp @@ -10,7 +10,6 @@ java_defaults { "androidx.annotation_annotation", "androidx.core_core", "androidx.lifecycle_lifecycle-runtime", - "wifi_aconfig_flags_lib", "WifiTrackerLibRes", "SettingsLibHelpUtils", ], @@ -21,6 +20,9 @@ java_defaults { android_library { name: "WifiTrackerLib", defaults: ["WifiTrackerLibDefaults"], + static_libs: [ + "wifi_aconfig_flags_lib", + ], srcs: ["src/**/*.java"], } diff --git a/libs/WifiTrackerLib/sdk_src/src/com/android/wifitrackerlib/NonSdkApiWrapper.java b/libs/WifiTrackerLib/sdk_src/src/com/android/wifitrackerlib/NonSdkApiWrapper.java index 52c51557b..4ea48626a 100644 --- a/libs/WifiTrackerLib/sdk_src/src/com/android/wifitrackerlib/NonSdkApiWrapper.java +++ b/libs/WifiTrackerLib/sdk_src/src/com/android/wifitrackerlib/NonSdkApiWrapper.java @@ -101,4 +101,12 @@ class NonSdkApiWrapper { // Return null since SUW does not have QUERY_ADMIN_POLICY permission. return null; } + + /** + * Whether the hotspot network provider battery charging status flag is enabled. + */ + static boolean isNetworkProviderBatteryChargingStatusEnabled() { + // Google3 can't access trunk stable flags, so default to false. + return false; + } } diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java index c7f6bba1f..1e11afa2a 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java @@ -830,6 +830,7 @@ public class BaseWifiTracker { Log.v(mTag, "Issuing scan request from WifiScanner"); } wifiScanner.startScan(scanSettings, mFirstScanListener); + notifyOnScanRequested(); return; } else { Log.e(mTag, "Failed to retrieve WifiScanner!"); @@ -864,6 +865,7 @@ public class BaseWifiTracker { // Remove any pending scanLoops in case possiblyStartScanning was called more than once. removeCallbacksAndMessages(null); mWifiManager.startScan(); + notifyOnScanRequested(); postDelayed(this::scanLoop, mScanIntervalMillis); } } @@ -886,6 +888,16 @@ public class BaseWifiTracker { } /** + * Posts onScanRequested callback on the main thread. + */ + @WorkerThread + private void notifyOnScanRequested() { + if (mListener != null) { + mMainHandler.post(mListener::onScanRequested); + } + } + + /** * Base callback handling Wi-Fi state changes * * Subclasses should extend this for their own needs. @@ -896,5 +908,10 @@ public class BaseWifiTracker { */ @MainThread void onWifiStateChanged(); + + @MainThread + default void onScanRequested() { + // Do nothing. + } } } diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java index 11aec21a9..4eca037a4 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/HotspotNetworkEntry.java @@ -19,8 +19,6 @@ package com.android.wifitrackerlib; import static android.net.wifi.WifiInfo.DEFAULT_MAC_ADDRESS; import static android.os.Build.VERSION_CODES; -import static com.android.wifi.flags.Flags.networkProviderBatteryChargingStatus; - import android.annotation.TargetApi; import android.content.Context; import android.icu.text.MessageFormat; @@ -348,7 +346,8 @@ public class HotspotNetworkEntry extends WifiEntry { * If the host device is currently charging its battery. */ public synchronized boolean isBatteryCharging() { - if (mHotspotNetworkData == null || !networkProviderBatteryChargingStatus()) { + if (mHotspotNetworkData == null + || !NonSdkApiWrapper.isNetworkProviderBatteryChargingStatusEnabled()) { return false; } return mHotspotNetworkData.getNetworkProviderInfo().isBatteryCharging(); diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/NonSdkApiWrapper.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/NonSdkApiWrapper.java index 0a71bcbe8..9b61c6646 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/NonSdkApiWrapper.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/NonSdkApiWrapper.java @@ -16,6 +16,8 @@ package com.android.wifitrackerlib; +import static com.android.wifi.flags.Flags.networkProviderBatteryChargingStatus; + import android.app.admin.DevicePolicyManager; import android.app.admin.WifiSsidPolicy; import android.content.Context; @@ -134,4 +136,11 @@ class NonSdkApiWrapper { } return null; } + + /** + * Whether the hotspot network provider battery charging status flag is enabled. + */ + static boolean isNetworkProviderBatteryChargingStatusEnabled() { + return networkProviderBatteryChargingStatus(); + } } diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java index c853578ff..6401f094f 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java @@ -60,6 +60,7 @@ import android.util.SparseArray; import androidx.annotation.AnyThread; import androidx.annotation.GuardedBy; +import androidx.annotation.IntDef; import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -68,6 +69,8 @@ import androidx.annotation.WorkerThread; import androidx.core.os.BuildCompat; import androidx.lifecycle.Lifecycle; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.time.Clock; import java.util.ArrayList; import java.util.Collections; @@ -344,7 +347,7 @@ public class WifiPickerTracker extends BaseWifiTracker { checkNotNull(intent, "Intent cannot be null!"); conditionallyUpdateScanResults( intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, true)); - updateWifiEntries(); + updateWifiEntries(WIFI_ENTRIES_CHANGED_REASON_SCAN_RESULTS); } @WorkerThread @@ -526,11 +529,7 @@ public class WifiPickerTracker extends BaseWifiTracker { } } - /** - * Update the list returned by getWifiEntries() with the current states of the entry caches. - */ - @WorkerThread - protected void updateWifiEntries() { + protected void updateWifiEntries(@WifiEntriesChangedReason int reason) { synchronized (mLock) { mActiveWifiEntries.clear(); mActiveWifiEntries.addAll(mStandardWifiEntryCache); @@ -639,6 +638,7 @@ public class WifiPickerTracker extends BaseWifiTracker { } Collections.sort(mWifiEntries, WifiEntry.WIFI_PICKER_COMPARATOR); if (isVerboseLoggingEnabled()) { + Log.v(TAG, "onWifiEntriesChanged: reason=" + reason); StringJoiner entryLog = new StringJoiner("\n"); int numEntries = mActiveWifiEntries.size() + mWifiEntries.size(); int index = 1; @@ -654,7 +654,16 @@ public class WifiPickerTracker extends BaseWifiTracker { Log.v(TAG, "MergedCarrierEntry: " + mMergedCarrierEntry); } } - notifyOnWifiEntriesChanged(); + notifyOnWifiEntriesChanged(reason); + } + + + /** + * Update the list returned by getWifiEntries() with the current states of the entry caches. + */ + @WorkerThread + protected void updateWifiEntries() { + updateWifiEntries(WIFI_ENTRIES_CHANGED_REASON_GENERAL); } /** @@ -693,7 +702,7 @@ public class WifiPickerTracker extends BaseWifiTracker { } } } - notifyOnWifiEntriesChanged(); + notifyOnWifiEntriesChanged(WIFI_ENTRIES_CHANGED_REASON_GENERAL); } /** @@ -1327,9 +1336,9 @@ public class WifiPickerTracker extends BaseWifiTracker { * Posts onWifiEntryChanged callback on the main thread. */ @WorkerThread - private void notifyOnWifiEntriesChanged() { + private void notifyOnWifiEntriesChanged(@WifiEntriesChangedReason int reason) { if (mListener != null) { - mMainHandler.post(mListener::onWifiEntriesChanged); + mMainHandler.post(() -> mListener.onWifiEntriesChanged(reason)); } } @@ -1353,6 +1362,17 @@ public class WifiPickerTracker extends BaseWifiTracker { } } + @Retention(RetentionPolicy.SOURCE) + @IntDef(value = { + WIFI_ENTRIES_CHANGED_REASON_GENERAL, + WIFI_ENTRIES_CHANGED_REASON_SCAN_RESULTS, + }) + + public @interface WifiEntriesChangedReason {} + + public static final int WIFI_ENTRIES_CHANGED_REASON_GENERAL = 0; + public static final int WIFI_ENTRIES_CHANGED_REASON_SCAN_RESULTS = 1; + /** * Listener for changes to the list of visible WifiEntries as well as the number of saved * networks and subscriptions. @@ -1367,7 +1387,20 @@ public class WifiPickerTracker extends BaseWifiTracker { * {@link #getMergedCarrierEntry()} */ @MainThread - void onWifiEntriesChanged(); + default void onWifiEntriesChanged() { + // Do nothing + } + + /** + * Called when there are changes to + * {@link #getConnectedWifiEntry()} + * {@link #getWifiEntries()} + * {@link #getMergedCarrierEntry()} + */ + @MainThread + default void onWifiEntriesChanged(@WifiEntriesChangedReason int reason) { + onWifiEntriesChanged(); + } /** * Called when there are changes to diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java index 637f3f5d5..235a70e88 100644 --- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java +++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/HotspotNetworkEntryTest.java @@ -20,6 +20,8 @@ import static android.net.wifi.ScanResult.WIFI_STANDARD_11N; import static android.net.wifi.WifiInfo.SECURITY_TYPE_PSK; import static android.net.wifi.WifiInfo.SECURITY_TYPE_SAE; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; import static com.android.wifitrackerlib.WifiEntry.CONNECTED_STATE_CONNECTED; import static com.android.wifitrackerlib.WifiEntry.CONNECTED_STATE_DISCONNECTED; import static com.android.wifitrackerlib.WifiEntry.MIN_FREQ_24GHZ; @@ -48,17 +50,15 @@ import android.net.wifi.sharedconnectivity.app.NetworkProviderInfo; import android.net.wifi.sharedconnectivity.app.SharedConnectivityManager; import android.os.Handler; import android.os.test.TestLooper; -import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; -import com.android.wifi.flags.Flags; - import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.mockito.MockitoSession; public class HotspotNetworkEntryTest { @Rule @@ -485,7 +485,6 @@ public class HotspotNetworkEntryTest { } @Test - @RequiresFlagsEnabled(Flags.FLAG_NETWORK_PROVIDER_BATTERY_CHARGING_STATUS) public void testIsBatteryCharging_usesHotspotNetworkData() { final HotspotNetworkEntry entry = new HotspotNetworkEntry( mMockInjector, mMockContext, mTestHandler, @@ -505,7 +504,14 @@ public class HotspotNetworkEntryTest { .addHotspotSecurityType(SECURITY_TYPE_PSK) .build()); - assertThat(entry.isBatteryCharging()).isTrue(); + MockitoSession session = mockitoSession().spyStatic(NonSdkApiWrapper.class).startMocking(); + try { + doReturn(true).when(() -> + NonSdkApiWrapper.isNetworkProviderBatteryChargingStatusEnabled()); + assertThat(entry.isBatteryCharging()).isTrue(); + } finally { + session.finishMocking(); + } } @Test diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java index 932b3a0bb..1d95568d0 100644 --- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java +++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java @@ -301,8 +301,10 @@ public class WifiPickerTrackerTest { mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); + mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_SCAN_RESULTS); } /** @@ -607,8 +609,10 @@ public class WifiPickerTrackerTest { when(mMockWifiInfo.getRssi()).thenReturn(-50); mNetworkCallbackCaptor.getValue().onCapabilitiesChanged( mMockNetwork, mMockNetworkCapabilities); + mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getWifiEntries()).isEmpty(); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isEqualTo(entry); } @@ -644,9 +648,11 @@ public class WifiPickerTrackerTest { Intent networkStateChanged = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION); networkStateChanged.putExtra(WifiManager.EXTRA_NETWORK_INFO, mockNetworkInfo); mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, networkStateChanged); + mTestLooper.dispatchAll(); // Network should be returned in getConnectedWifiEntry() even though it's not L3 connected. - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getWifiEntries()).isEmpty(); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isEqualTo(entry); assertThat(entry.isPrimaryNetwork()).isTrue(); @@ -682,9 +688,11 @@ public class WifiPickerTrackerTest { Intent networkStateChanged = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION); networkStateChanged.putExtra(WifiManager.EXTRA_NETWORK_INFO, mockNetworkInfo); mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, networkStateChanged); + mTestLooper.dispatchAll(); // Network should be returned in getConnectedWifiEntry() even though it's not L3 connected. - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNotNull(); } @@ -713,8 +721,10 @@ public class WifiPickerTrackerTest { when(mMockWifiInfo.getRssi()).thenReturn(-50); mNetworkCallbackCaptor.getValue().onCapabilitiesChanged( mMockNetwork, mMockNetworkCapabilities); + mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNotNull(); assertThat(wifiPickerTracker.getConnectedWifiEntry().getTitle()).isEqualTo("ssid"); } @@ -740,8 +750,10 @@ public class WifiPickerTrackerTest { any(), mNetworkCallbackCaptor.capture(), any()); mNetworkCallbackCaptor.getValue().onLost(mMockNetwork); + mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNull(); } @@ -773,7 +785,8 @@ public class WifiPickerTrackerTest { wifiPickerTracker.onStart(); mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNull(); } @@ -843,8 +856,10 @@ public class WifiPickerTrackerTest { when(mMockWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED); mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION)); + mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNull(); } @@ -1653,7 +1668,8 @@ public class WifiPickerTrackerTest { wifiPickerTracker.onStart(); mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry().getTitle()).isEqualTo(friendlyName); } @@ -1697,7 +1713,8 @@ public class WifiPickerTrackerTest { new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNotNull(); assertThat(wifiPickerTracker.getConnectedWifiEntry().getTitle()).isEqualTo(friendlyName); } @@ -2256,10 +2273,12 @@ public class WifiPickerTrackerTest { mTestLooper.moveTimeForward(SCAN_INTERVAL_MILLIS); mTestLooper.dispatchAll(); verify(mMockWifiManager, never()).startScan(); + verify(mMockCallback).onScanRequested(); mScanListenerCaptor.getValue().onResults(null); mTestLooper.dispatchAll(); verify(mMockWifiManager).startScan(); + verify(mMockCallback, times(2)).onScanRequested(); } /** |