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)
         }
     }
 }