diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteConfig.java b/src/java/com/android/internal/telephony/satellite/SatelliteConfig.java
index 7aadf0d..0568d86 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteConfig.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteConfig.java
@@ -52,7 +52,7 @@
     private Map<Integer, Map<String, Set<Integer>>> mSupportedServicesPerCarrier;
     private List<String> mSatelliteRegionCountryCodes;
     private Boolean mIsSatelliteRegionAllowed;
-    private Path mSatS2FilePath;
+    private File mSatS2File;
     private SatelliteConfigData.SatelliteConfigProto mConfigData;
 
     public SatelliteConfig(SatelliteConfigData.SatelliteConfigProto configData) {
@@ -62,13 +62,14 @@
         mSatelliteRegionCountryCodes = List.of(
                 mConfigData.deviceSatelliteRegion.countryCodes);
         mIsSatelliteRegionAllowed = mConfigData.deviceSatelliteRegion.isAllowed;
-        mSatS2FilePath = null;
+        mSatS2File = null;
 
         Log.d(TAG, "mVersion:" + mVersion + " | "
                 + "mSupportedServicesPerCarrier:" + mSupportedServicesPerCarrier + " | "
-                + "mSatelliteRegionCountryCodes:" + mSatelliteRegionCountryCodes + " | "
+                + "mSatelliteRegionCountryCodes:"
+                + String.join(",", mSatelliteRegionCountryCodes) + " | "
                 + "mIsSatelliteRegionAllowed:" + mIsSatelliteRegionAllowed + " | "
-                + "s2CellFile size:" + mConfigData.deviceSatelliteRegion.s2CellFile.length);
+                + " | s2CellFile size:" + mConfigData.deviceSatelliteRegion.s2CellFile.length);
     }
 
     /**
@@ -181,23 +182,23 @@
      * @return satellite s2_cell_file path
      */
     @Nullable
-    public Path getSatelliteS2CellFile(@Nullable Context context) {
+    public File getSatelliteS2CellFile(@Nullable Context context) {
         if (context == null) {
             Log.d(TAG, "getSatelliteS2CellFile : context is null");
             return null;
         }
 
-        if (isFileExist(mSatS2FilePath)) {
-            Log.d(TAG, "File mSatS2FilePath is already exist");
-            return mSatS2FilePath;
+        if (isFileExist(mSatS2File)) {
+            Log.d(TAG, "File mSatS2File is already exist");
+            return mSatS2File;
         }
 
         if (mConfigData != null && mConfigData.deviceSatelliteRegion != null) {
-            mSatS2FilePath = copySatS2FileToPhoneDirectory(context,
-                    mConfigData.deviceSatelliteRegion.s2CellFile);
-            return mSatS2FilePath;
+            mSatS2File = copySatS2FileToPhoneDirectory(
+                    context, mConfigData.deviceSatelliteRegion.s2CellFile);
+            return mSatS2File;
         }
-        Log.d(TAG, "getSatelliteS2CellFile :"
+        Log.d(TAG, "getSatelliteS2CellFile: "
                 + "mConfigData is null or mConfigData.deviceSatelliteRegion is null");
         return null;
     }
@@ -209,7 +210,7 @@
      */
     @Nullable
     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
-    public Path copySatS2FileToPhoneDirectory(@Nullable Context context,
+    public File copySatS2FileToPhoneDirectory(@Nullable Context context,
             @Nullable byte[] byteArrayFile) {
 
         if (context == null || byteArrayFile == null) {
@@ -234,18 +235,18 @@
         } catch (IOException ex) {
             Log.e(TAG, "copySatS2FileToPhoneDirectory: ex=" + ex);
         }
-        return targetSatS2FilePath;
+        return targetSatS2FilePath.toFile();
     }
 
     /**
      * @return {@code true} if the SatS2File is already existed and {@code false} otherwise.
      */
     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
-    public boolean isFileExist(Path filePath) {
-        if (filePath == null) {
-            Log.d(TAG, "isFileExist : filePath is null");
+    public boolean isFileExist(@Nullable File file) {
+        if (file == null) {
+            Log.d(TAG, "isFileExist : file is null");
             return false;
         }
-        return Files.exists(filePath);
+        return file.exists();
     }
 }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteConfigParserTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteConfigParserTest.java
index 5e1dd05..7b4cf8d 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteConfigParserTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteConfigParserTest.java
@@ -25,6 +25,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 
 import android.testing.AndroidTestingRunner;
@@ -35,11 +36,9 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 
-import java.nio.file.Path;
-import java.nio.file.Paths;
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Base64;
 import java.util.Collections;
@@ -183,9 +182,6 @@
 
     @Test
     public void testGetSatelliteS2CellFile() {
-        final String filePath = "/data/user_de/0/com.android.phone/app_satellite/s2_cell_file";
-        Path targetSatS2FilePath = Paths.get(filePath);
-
         SatelliteConfigParser spySatelliteConfigParserNull = spy(
                 new SatelliteConfigParser((byte[]) null));
         assertNotNull(spySatelliteConfigParserNull);
@@ -201,10 +197,11 @@
         assertNotNull(spySatelliteConfigParser.getConfig());
         assertFalse(spySatelliteConfigParser.getConfig().isFileExist(null));
 
-        SatelliteConfig mockedSatelliteConfig = Mockito.mock(SatelliteConfig.class);
-        doReturn(targetSatS2FilePath).when(mockedSatelliteConfig).getSatelliteS2CellFile(any());
+        SatelliteConfig mockedSatelliteConfig = mock(SatelliteConfig.class);
+        File mMockSatS2File = mock(File.class);
+        doReturn(mMockSatS2File).when(mockedSatelliteConfig).getSatelliteS2CellFile(any());
         doReturn(mockedSatelliteConfig).when(spySatelliteConfigParser).getConfig();
-        assertEquals(targetSatS2FilePath,
+        assertEquals(mMockSatS2File,
                 spySatelliteConfigParser.getConfig().getSatelliteS2CellFile(mContext));
     }
 
