Fix AppSearchSessionCtsTest.

aosp/1795794 added a new api that will only be functional for the
Platform Backend on T+. This allows the test to assert the difference in
behavior.

Bug: 195720764
Test: AppSearchSessionCtsTest
Change-Id: Ic01d7b78524596ef54e7a934c7641df8133919c6
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
index 4714ef6..06a54f0 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
@@ -16,6 +16,8 @@
 
 package androidx.appsearch.cts.app;
 
+import static android.os.Build.VERSION_CODES;
+
 import static androidx.appsearch.app.AppSearchResult.RESULT_INVALID_SCHEMA;
 import static androidx.appsearch.app.AppSearchResult.RESULT_NOT_FOUND;
 import static androidx.appsearch.testutil.AppSearchTestUtils.checkIsBatchResultSuccess;
@@ -81,6 +83,9 @@
     protected abstract ListenableFuture<AppSearchSession> createSearchSession(
             @NonNull String dbName, @NonNull ExecutorService executor);
 
+    // Returns the Android version that the current instance of AppSearchSession is based on.
+    protected abstract int getAppSearchApiTarget();
+
     @Before
     public void setUp() throws Exception {
         Context context = ApplicationProvider.getApplicationContext();
@@ -1880,12 +1885,21 @@
         assertThat(matchInfo.getExactMatchRange()).isEqualTo(
                 new SearchResult.MatchRange(/*lower=*/29,  /*upper=*/32));
         assertThat(matchInfo.getExactMatch()).isEqualTo("foo");
-        assertThat(matchInfo.getSubmatchRange()).isEqualTo(
-                new SearchResult.MatchRange(/*lower=*/29,  /*upper=*/31));
-        assertThat(matchInfo.getSubmatch()).isEqualTo("fo");
         assertThat(matchInfo.getSnippetRange()).isEqualTo(
                 new SearchResult.MatchRange(/*lower=*/26,  /*upper=*/33));
         assertThat(matchInfo.getSnippet()).isEqualTo("is foo.");
+
+        if (getAppSearchApiTarget() <= VERSION_CODES.S) {
+            // Submatch is not support on any backend that targets a platform S or lower.
+            assertThat(matchInfo.getSubmatchRange()).isEqualTo(
+                    new SearchResult.MatchRange(/*lower=*/0,  /*upper=*/0));
+            assertThat(matchInfo.getSubmatch().length()).isEqualTo(0);
+        } else {
+            // Submatch is enabled on any backend that targets a platform beyond S.
+            assertThat(matchInfo.getSubmatchRange()).isEqualTo(
+                    new SearchResult.MatchRange(/*lower=*/29,  /*upper=*/31));
+            assertThat(matchInfo.getSubmatch()).isEqualTo("fo");
+        }
     }
 
     @Test
@@ -2008,9 +2022,18 @@
         assertThat(matchInfo.getExactMatchRange()).isEqualTo(
                 new SearchResult.MatchRange(/*lower=*/44,  /*upper=*/45));
         assertThat(matchInfo.getExactMatch()).isEqualTo("は");
-        assertThat(matchInfo.getSubmatchRange()).isEqualTo(
-                new SearchResult.MatchRange(/*lower=*/44,  /*upper=*/45));
-        assertThat(matchInfo.getSubmatch()).isEqualTo("は");
+
+        if (getAppSearchApiTarget() <= VERSION_CODES.S) {
+            // Submatch is not support on any backend that targets a platform S or lower.
+            assertThat(matchInfo.getSubmatchRange()).isEqualTo(
+                    new SearchResult.MatchRange(/*lower=*/0,  /*upper=*/0));
+            assertThat(matchInfo.getSubmatch().length()).isEqualTo(0);
+        } else {
+            // Submatch is enabled on any backend that targets a platform beyond S.
+            assertThat(matchInfo.getSubmatchRange()).isEqualTo(
+                    new SearchResult.MatchRange(/*lower=*/44,  /*upper=*/45));
+            assertThat(matchInfo.getSubmatch()).isEqualTo("は");
+        }
     }
 
     @Test
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionLocalCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionLocalCtsTest.java
index a2c17f6..f675483 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionLocalCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionLocalCtsTest.java
@@ -67,6 +67,12 @@
                         .setWorkerExecutor(executor).build());
     }
 
+    @Override
+    protected int getAppSearchApiTarget() {
+        // Any feature available in AppSearchSession is always available in the local backend.
+        return Integer.MAX_VALUE;
+    }
+
     // TODO(b/194207451) This test can be moved to CtsTestBase if customized logger is
     //  supported for platform backend.
     @Test
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionPlatformCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionPlatformCtsTest.java
index f467c77..e3f4770 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionPlatformCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionPlatformCtsTest.java
@@ -16,6 +16,8 @@
 // @exportToFramework:skipFile()
 package androidx.appsearch.cts.app;
 
+import static android.os.Build.VERSION;
+
 import android.content.Context;
 import android.os.Build;
 
@@ -46,4 +48,10 @@
                 new PlatformStorage.SearchContext.Builder(context, dbName)
                         .setWorkerExecutor(executor).build());
     }
+
+    @Override
+    protected int getAppSearchApiTarget() {
+        // Feature availability in the platform backend depends on the device's API level.
+        return VERSION.SDK_INT;
+    }
 }