diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/PermissionInfoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/PermissionInfoTest.java
index 6f4f288badb0d..e0cc2edc75996 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/PermissionInfoTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/PermissionInfoTest.java
@@ -4,6 +4,9 @@
 
 package org.chromium.chrome.browser.site_settings;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
 import androidx.test.filters.SmallTest;
 
 import org.junit.AfterClass;
@@ -19,6 +22,7 @@ import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.CriteriaHelper;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.Features.EnableFeatures;
 import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge;
 import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
 import org.chromium.chrome.browser.browsing_data.TimePeriod;
@@ -30,10 +34,12 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
 import org.chromium.components.browser_ui.site_settings.PermissionInfo;
+import org.chromium.components.browser_ui.site_settings.PermissionInfo.GeolocationSetting;
 import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridgeJni;
 import org.chromium.components.content_settings.ContentSettingValues;
 import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.components.content_settings.SessionModel;
+import org.chromium.components.permissions.PermissionsAndroidFeatureList;
 import org.chromium.content_public.common.ContentSwitches;
 
 import java.util.concurrent.Callable;
@@ -270,4 +276,45 @@ public class PermissionInfoTest {
                 regularProfile,
                 ContentSettingValues.ASK);
     }
+
+    @Test
+    @SmallTest
+    @Feature({"Preferences"})
+    @EnableFeatures("ApproximateGeolocationPermission")
+    public void testGeolocationPermissionMockValues() throws Throwable {
+        PermissionsAndroidFeatureList.APPROXIMATE_GEOLOCATION_SAMPLE_DATA.setForTesting(true);
+        Profile regularProfile = getRegularProfile();
+        var permissionSiteInfo =
+                new PermissionInfo(
+                        ContentSettingsType.GEOLOCATION,
+                        "https://permission.site",
+                        "https://permission.site",
+                        false,
+                        SessionModel.DURABLE);
+        assertEquals(
+                new GeolocationSetting(ContentSettingValues.ALLOW, ContentSettingValues.BLOCK),
+                permissionSiteInfo.getGeolocationSetting(regularProfile));
+
+        GeolocationSetting allow_precise =
+                new GeolocationSetting(ContentSettingValues.ALLOW, ContentSettingValues.ALLOW);
+        permissionSiteInfo.setGeolocationSetting(regularProfile, allow_precise);
+        assertEquals(allow_precise, permissionSiteInfo.getGeolocationSetting(regularProfile));
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"Preferences"})
+    @EnableFeatures("ApproximateGeolocationPermission")
+    public void testGeolocationPermissionDefault() throws Throwable {
+        PermissionsAndroidFeatureList.APPROXIMATE_GEOLOCATION_SAMPLE_DATA.setForTesting(false);
+        Profile regularProfile = getRegularProfile();
+        var permissionSiteInfo =
+                new PermissionInfo(
+                        ContentSettingsType.GEOLOCATION,
+                        "https://permission.site",
+                        "https://permission.site",
+                        false,
+                        SessionModel.DURABLE);
+        assertNull(permissionSiteInfo.getGeolocationSetting(regularProfile));
+    }
 }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/PermissionInfo.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/PermissionInfo.java
index 8a769fe5832b7..e506fa24fe5bd 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/PermissionInfo.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/PermissionInfo.java
@@ -9,9 +9,12 @@ import org.chromium.build.annotations.Nullable;
 import org.chromium.components.content_settings.ContentSettingValues;
 import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.components.content_settings.SessionModel;
+import org.chromium.components.permissions.PermissionsAndroidFeatureList;
+import org.chromium.components.permissions.PermissionsAndroidFeatureMap;
 import org.chromium.content_public.browser.BrowserContextHandle;
 
 import java.io.Serializable;
+import java.util.Objects;
 
 /** Permission information for a given origin. */
 @NullMarked
@@ -21,6 +24,7 @@ public class PermissionInfo implements Serializable {
     private final String mOrigin;
     private final @ContentSettingsType.EnumType int mContentSettingsType;
     private final @SessionModel.EnumType int mSessionModel;
+    private static @Nullable GeolocationSetting sMockSetting;
 
     public PermissionInfo(
             @ContentSettingsType.EnumType int type,
@@ -68,7 +72,7 @@ public class PermissionInfo implements Serializable {
             @ContentSettingsType.EnumType int mContentSettingsType,
             String origin,
             @Nullable String embeddingOrigin) {
-        return org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridgeJni.get()
+        return WebsitePreferenceBridgeJni.get()
                 .getPermissionSettingForOrigin(
                         browserContextHandle,
                         mContentSettingsType,
@@ -83,11 +87,36 @@ public class PermissionInfo implements Serializable {
                 browserContextHandle, mContentSettingsType, mOrigin, mEmbedder);
     }
 
+    public static final class GeolocationSetting {
+        public GeolocationSetting(
+                @ContentSettingValues int approximate, @ContentSettingValues int precise) {
+            mApproximate = approximate;
+            mPrecise = precise;
+        }
+
+        final @ContentSettingValues int mApproximate;
+        final @ContentSettingValues int mPrecise;
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            return o instanceof GeolocationSetting that
+                    && mApproximate == that.mApproximate
+                    && mPrecise == that.mPrecise;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(mApproximate, mPrecise);
+        }
+    }
 
     /** Sets the native ContentSetting value for this origin. */
     public void setContentSetting(
             BrowserContextHandle browserContextHandle, @ContentSettingValues int value) {
-        org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridgeJni.get()
+        WebsitePreferenceBridgeJni.get()
                 .setPermissionSettingForOrigin(
                         browserContextHandle,
                         mContentSettingsType,
@@ -95,4 +124,40 @@ public class PermissionInfo implements Serializable {
                         getEmbedderSafe(),
                         value);
     }
+
+    /** Returns the Geolocation permission value for this origin. */
+    public @Nullable GeolocationSetting getGeolocationSetting(
+            BrowserContextHandle browserContextHandle) {
+        assert mContentSettingsType == ContentSettingsType.GEOLOCATION;
+        assert PermissionsAndroidFeatureMap.isEnabled(
+                PermissionsAndroidFeatureList.APPROXIMATE_GEOLOCATION_PERMISSION);
+        // Return fake precise permission for maps.google.com and approximate for permission.site
+        // until we can set create real approximate permissions.
+        if (PermissionsAndroidFeatureList.APPROXIMATE_GEOLOCATION_SAMPLE_DATA.getValue()) {
+            if (mOrigin.equals("https://permission.site")) {
+                if (sMockSetting == null) {
+                    sMockSetting =
+                            new GeolocationSetting(
+                                    ContentSettingValues.ALLOW, ContentSettingValues.BLOCK);
+                }
+                return sMockSetting;
+            }
+        }
+        // TODO(crbug.com/418938557) Get value from content settings. We probably only want a
+        // base::Value API for get/set of complex permissions to avoid adding bridge methods for
+        // every such permission.
+        return null;
+    }
+
+    /** Set the Geolocation permission value for this origin. */
+    public void setGeolocationSetting(
+            BrowserContextHandle browserContextHandle, GeolocationSetting setting) {
+        assert mContentSettingsType == ContentSettingsType.GEOLOCATION;
+        if (PermissionsAndroidFeatureList.APPROXIMATE_GEOLOCATION_SAMPLE_DATA.getValue()) {
+            if (mOrigin.equals("https://permission.site")) {
+                sMockSetting = setting;
+            }
+        }
+        // TODO(crbug.com/418938557) Set new value in content settings.
+    }
 }
diff --git a/components/permissions/android/BUILD.gn b/components/permissions/android/BUILD.gn
index 95648a2668a81..0069f22f8de3d 100644
--- a/components/permissions/android/BUILD.gn
+++ b/components/permissions/android/BUILD.gn
@@ -210,6 +210,7 @@ android_library("core_java") {
   deps = [
     "//base:base_java",
     "//build/android:build_java",
+    "//components/cached_flags:java",
     "//components/content_settings/android:content_settings_enums_java",
     "//components/location/android:location_java",
     "//components/webxr/android:features_java",
diff --git a/components/permissions/android/DEPS b/components/permissions/android/DEPS
index 7d0cf580b944a..707803daba9b1 100644
--- a/components/permissions/android/DEPS
+++ b/components/permissions/android/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "+components/browser_ui/util/android",
   "+components/browser_ui/widget/android",
+  "+components/cached_flags",
   "+components/infobars/core",
   "+components/location/android",
   "+components/messages/android",
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionsAndroidFeatureList.java b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionsAndroidFeatureList.java
index e005f3e711372..ba322638d6541 100644
--- a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionsAndroidFeatureList.java
+++ b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionsAndroidFeatureList.java
@@ -5,6 +5,7 @@
 package org.chromium.components.permissions;
 
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.components.cached_flags.BooleanCachedFeatureParam;
 
 /**
  * Lists base::Features that can be accessed through {@link PermissionsAndroidFeatureMap}.
@@ -27,4 +28,8 @@ public abstract class PermissionsAndroidFeatureList {
 
     public static final String APPROXIMATE_GEOLOCATION_PERMISSION =
             "ApproximateGeolocationPermission";
+
+    public static final BooleanCachedFeatureParam APPROXIMATE_GEOLOCATION_SAMPLE_DATA =
+            PermissionsAndroidFeatureMap.newBooleanCachedFeatureParam(
+                    APPROXIMATE_GEOLOCATION_PERMISSION, "sample_data", false);
 }
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionsAndroidFeatureMap.java b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionsAndroidFeatureMap.java
index ee02cad645834..41fe5756c8bd1 100644
--- a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionsAndroidFeatureMap.java
+++ b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionsAndroidFeatureMap.java
@@ -9,6 +9,7 @@ import org.jni_zero.NativeMethods;
 
 import org.chromium.base.FeatureMap;
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.components.cached_flags.BooleanCachedFeatureParam;
 
 /** Java accessor for base::Features listed in {@link PermissionsAndroidFeatureList} */
 @JNINamespace("permissions")
@@ -30,6 +31,12 @@ public final class PermissionsAndroidFeatureMap extends FeatureMap {
         return getInstance().isEnabledInNative(featureName);
     }
 
+    public static BooleanCachedFeatureParam newBooleanCachedFeatureParam(
+            String featureName, String variationName, boolean defaultValue) {
+        return new BooleanCachedFeatureParam(
+                getInstance(), featureName, variationName, defaultValue);
+    }
+
     @Override
     protected long getNativeMap() {
         return PermissionsAndroidFeatureMapJni.get().getNativeMap();
diff --git a/components/permissions/features.cc b/components/permissions/features.cc
index 2b9bd3f3cdb2f..009f003c3e03e 100644
--- a/components/permissions/features.cc
+++ b/components/permissions/features.cc
@@ -86,6 +86,11 @@ BASE_FEATURE(kApproximateGeolocationPermission,
              "ApproximateGeolocationPermission",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+const base::FeatureParam<bool> kApproximateGeolocationPermissionSampleData(
+    &features::kApproximateGeolocationPermission,
+    "sample_data",
+    false);
+
 #else
 
 // When enabled, chooser permissions grants will have a last visited timestamp
diff --git a/components/permissions/features.h b/components/permissions/features.h
index 7e8afdc44ab9b..cfecc44c9bc45 100644
--- a/components/permissions/features.h
+++ b/components/permissions/features.h
@@ -56,6 +56,10 @@ BASE_DECLARE_FEATURE(kPermissionDedicatedCpssSettingAndroid);
 COMPONENT_EXPORT(PERMISSIONS_COMMON)
 BASE_DECLARE_FEATURE(kApproximateGeolocationPermission);
 
+COMPONENT_EXPORT(PERMISSIONS_COMMON)
+extern const base::FeatureParam<bool>
+    kApproximateGeolocationPermissionSampleData;
+
 #else
 
 COMPONENT_EXPORT(PERMISSIONS_COMMON)