Add FAST_PAIR_SCAN_ENABLED to NearbyManager
Fix: 216590902
Test: Flashed and confirmed logs
Change-Id: I0c160fcc057be7c8d404353ca3fd16140c5e5303
diff --git a/nearby/framework/java/android/nearby/NearbyManager.java b/nearby/framework/java/android/nearby/NearbyManager.java
index 7fb14ef..a217677 100644
--- a/nearby/framework/java/android/nearby/NearbyManager.java
+++ b/nearby/framework/java/android/nearby/NearbyManager.java
@@ -24,6 +24,7 @@
import android.annotation.SystemService;
import android.content.Context;
import android.os.RemoteException;
+import android.provider.Settings;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.Preconditions;
@@ -46,7 +47,15 @@
@SystemService(Context.NEARBY_SERVICE)
public class NearbyManager {
- private static final String TAG = "NearbyManager";
+ /**
+ * Whether allows Fast Pair to scan.
+ *
+ * (0 = disabled, 1 = enabled)
+ *
+ * @hide
+ */
+ public static final String FAST_PAIR_SCAN_ENABLED = "fast_pair_scan_enabled";
+
@GuardedBy("sScanListeners")
private static final WeakHashMap<ScanCallback, WeakReference<ScanListenerTransport>>
sScanListeners = new WeakHashMap<>();
@@ -139,7 +148,6 @@
}
}
-
/**
* Start broadcasting the request using nearby specification.
*
@@ -162,6 +170,30 @@
// TODO(b/218187205): implement broadcast.
}
+ /**
+ * Read from {@link Settings} whether Fast Pair scan is enabled.
+ *
+ * @param context the {@link Context} to query the setting.
+ * @param def the default value if no setting value.
+ * @return whether the Fast Pair is enabled.
+ */
+ public static boolean getFastPairScanEnabled(@NonNull Context context, boolean def) {
+ final int enabled = Settings.Secure.getInt(
+ context.getContentResolver(), FAST_PAIR_SCAN_ENABLED, (def ? 1 : 0));
+ return enabled != 0;
+ }
+
+ /**
+ * Write into {@link Settings} whether Fast Pair scan is enabled
+ *
+ * @param context the {@link Context} to set the setting.
+ * @param enable whether the Fast Pair scan should be enabled.
+ */
+ public static void setFastPairScanEnabled(@NonNull Context context, boolean enable) {
+ Settings.Secure.putInt(
+ context.getContentResolver(), FAST_PAIR_SCAN_ENABLED, enable ? 1 : 0);
+ }
+
private static class ScanListenerTransport extends IScanListener.Stub {
private @ScanRequest.ScanType int mScanType;
diff --git a/nearby/service/java/com/android/server/nearby/fastpair/FastPairManager.java b/nearby/service/java/com/android/server/nearby/fastpair/FastPairManager.java
index 04f72f0..c111bed 100644
--- a/nearby/service/java/com/android/server/nearby/fastpair/FastPairManager.java
+++ b/nearby/service/java/com/android/server/nearby/fastpair/FastPairManager.java
@@ -16,7 +16,6 @@
package com.android.server.nearby.fastpair;
-import static com.android.server.nearby.fastpair.Constant.SETTINGS_TRUE_VALUE;
import static com.android.server.nearby.fastpair.Constant.TAG;
import android.annotation.Nullable;
@@ -147,13 +146,8 @@
.registerReceiver(mScreenBroadcastReceiver, mIntentFilter);
Locator.getFromContextWrapper(mLocatorContextWrapper, FastPairCacheManager.class);
- try {
- mScanEnabled = getScanEnabledFromSettings();
- mScanEnabled = ENFORCED_SCAN_ENABLED_VALUE;
- } catch (Settings.SettingNotFoundException e) {
- Log.w(TAG,
- "initiate: Failed to get initial scan enabled status from Settings.", e);
- }
+ mScanEnabled = NearbyManager.getFastPairScanEnabled(mLocatorContextWrapper, true);
+ mScanEnabled = ENFORCED_SCAN_ENABLED_VALUE;
registerFastPairScanChangeContentObserver(mLocatorContextWrapper.getContentResolver());
}
@@ -334,16 +328,13 @@
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
- try {
- setScanEnabled(getScanEnabledFromSettings());
- } catch (Settings.SettingNotFoundException e) {
- Log.e(TAG, "Failed to get scan switch updates in Settings page.", e);
- }
+ setScanEnabled(
+ NearbyManager.getFastPairScanEnabled(mLocatorContextWrapper, mScanEnabled));
}
};
try {
resolver.registerContentObserver(
- Settings.Secure.getUriFor(Settings.Secure.FAST_PAIR_SCAN_ENABLED),
+ Settings.Secure.getUriFor(NearbyManager.FAST_PAIR_SCAN_ENABLED),
/* notifyForDescendants= */ false,
mFastPairScanChangeContentObserver);
} catch (SecurityException e) {
@@ -378,13 +369,6 @@
return (NearbyManager) mLocatorContextWrapper
.getApplicationContext().getSystemService(Context.NEARBY_SERVICE);
}
-
- private boolean getScanEnabledFromSettings() throws Settings.SettingNotFoundException {
- return Settings.Secure.getInt(
- mLocatorContextWrapper.getContext().getContentResolver(),
- Settings.Secure.FAST_PAIR_SCAN_ENABLED) == SETTINGS_TRUE_VALUE;
- }
-
private void setScanEnabled(boolean scanEnabled) {
if (mScanEnabled == scanEnabled) {
return;
diff --git a/nearby/tests/cts/fastpair/AndroidManifest.xml b/nearby/tests/cts/fastpair/AndroidManifest.xml
index 463a926..e77d70f 100644
--- a/nearby/tests/cts/fastpair/AndroidManifest.xml
+++ b/nearby/tests/cts/fastpair/AndroidManifest.xml
@@ -18,6 +18,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.nearby.cts">
<uses-sdk android:minSdkVersion="32" android:targetSdkVersion="32" />
+ <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
+
<application>
<uses-library android:name="android.test.runner"/>
</application>
diff --git a/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyManagerTest.java b/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyManagerTest.java
index 938eab2..eedcce1 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyManagerTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyManagerTest.java
@@ -18,6 +18,8 @@
import static android.nearby.PresenceCredential.IDENTITY_TYPE_PRIVATE;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
@@ -36,6 +38,7 @@
import androidx.annotation.RequiresApi;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SdkSuppress;
+import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Before;
import org.junit.Test;
@@ -63,7 +66,10 @@
@Before
public void setUp() {
initMocks(this);
+
when(mContext.getSystemService(Context.NEARBY_SERVICE)).thenReturn(mNearbyManager);
+ when(mContext.getContentResolver()).thenReturn(
+ InstrumentationRegistry.getInstrumentation().getContext().getContentResolver());
}
@Test
@@ -110,4 +116,11 @@
callback);
mNearbyManager.stopBroadcast(callback);
}
+
+ @Test
+ @SdkSuppress(minSdkVersion = 32, codeName = "T")
+ public void testSettingsEnable() {
+ NearbyManager.setFastPairScanEnabled(mContext, false);
+ assertThat(NearbyManager.getFastPairScanEnabled(mContext, true)).isFalse();
+ }
}
diff --git a/nearby/tests/integration/privileged/src/android/nearby/integration/privileged/FastPairSettingsProviderTest.kt b/nearby/tests/integration/privileged/src/android/nearby/integration/privileged/FastPairSettingsProviderTest.kt
index 761aaf6..af3f75f 100644
--- a/nearby/tests/integration/privileged/src/android/nearby/integration/privileged/FastPairSettingsProviderTest.kt
+++ b/nearby/tests/integration/privileged/src/android/nearby/integration/privileged/FastPairSettingsProviderTest.kt
@@ -38,10 +38,10 @@
val appContext = ApplicationProvider.getApplicationContext<Context>()
val contentResolver = appContext.contentResolver
- Settings.Secure.putInt(contentResolver, Settings.Secure.FAST_PAIR_SCAN_ENABLED, flag.value)
+ Settings.Secure.putInt(contentResolver, "fast_pair_scan_enabled", flag.value)
val actualValue = Settings.Secure.getInt(
- contentResolver, Settings.Secure.FAST_PAIR_SCAN_ENABLED, /* default value */ -1)
+ contentResolver, "fast_pair_scan_enabled", /* default value */ -1)
assertThat(actualValue).isEqualTo(flag.value)
}
diff --git a/nearby/tests/integration/untrusted/src/android/nearby/integration/untrusted/FastPairSettingsProviderTest.kt b/nearby/tests/integration/untrusted/src/android/nearby/integration/untrusted/FastPairSettingsProviderTest.kt
index b73e737..c549073 100644
--- a/nearby/tests/integration/untrusted/src/android/nearby/integration/untrusted/FastPairSettingsProviderTest.kt
+++ b/nearby/tests/integration/untrusted/src/android/nearby/integration/untrusted/FastPairSettingsProviderTest.kt
@@ -40,14 +40,14 @@
@Test
fun testSettingsFastPairScan_fromUnTrustedApp_readsSucceed() {
Settings.Secure.getInt(contentResolver,
- Settings.Secure.FAST_PAIR_SCAN_ENABLED, /* default value */ -1)
+ "fast_pair_scan_enabled", /* default value */ -1)
}
/** Verify untrusted app can't write Fast Pair scan enabled setting. */
@Test
fun testSettingsFastPairScan_fromUnTrustedApp_writesFailed() {
assertFailsWith<SecurityException> {
- Settings.Secure.putInt(contentResolver, Settings.Secure.FAST_PAIR_SCAN_ENABLED, 1)
+ Settings.Secure.putInt(contentResolver, "fast_pair_scan_enabled", 1)
}
}
}