Relace BuildCompat.isAtLeastS to check Build.VERSION.SDK_INT

Fixes: 191227729
Test: robotest & manual
Change-Id: I4b865b7de33a6801783dd645213fef0cda8d4dd2
diff --git a/packages/SettingsLib/ActionButtonsPreference/Android.bp b/packages/SettingsLib/ActionButtonsPreference/Android.bp
index 51c9c39..b6e1677 100644
--- a/packages/SettingsLib/ActionButtonsPreference/Android.bp
+++ b/packages/SettingsLib/ActionButtonsPreference/Android.bp
@@ -14,7 +14,8 @@
     resource_dirs: ["res"],
 
     static_libs: [
-          "androidx.preference_preference",
+        "androidx.preference_preference",
+        "SettingsLibUtils",
     ],
 
     sdk_version: "system_current",
diff --git a/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java b/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java
index 9aa511d..029c919 100644
--- a/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java
+++ b/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java
@@ -27,10 +27,11 @@
 
 import androidx.annotation.DrawableRes;
 import androidx.annotation.StringRes;
-import androidx.core.os.BuildCompat;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceViewHolder;
 
+import com.android.settingslib.utils.BuildCompatUtils;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -94,7 +95,7 @@
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
 
-        final boolean allowedDivider = !BuildCompat.isAtLeastS();
+        final boolean allowedDivider = !BuildCompatUtils.isAtLeastS();
         holder.setDividerAllowedAbove(allowedDivider);
         holder.setDividerAllowedBelow(allowedDivider);
 
diff --git a/packages/SettingsLib/BannerMessagePreference/Android.bp b/packages/SettingsLib/BannerMessagePreference/Android.bp
index c6a9562..0f7a451 100644
--- a/packages/SettingsLib/BannerMessagePreference/Android.bp
+++ b/packages/SettingsLib/BannerMessagePreference/Android.bp
@@ -16,6 +16,7 @@
     static_libs: [
         "androidx.preference_preference",
         "SettingsLibSettingsTheme",
+        "SettingsLibUtils",
     ],
 
     sdk_version: "system_current",
diff --git a/packages/SettingsLib/BannerMessagePreference/src/com/android/settingslib/widget/BannerMessagePreference.java b/packages/SettingsLib/BannerMessagePreference/src/com/android/settingslib/widget/BannerMessagePreference.java
index 9e39355..3a70d65 100644
--- a/packages/SettingsLib/BannerMessagePreference/src/com/android/settingslib/widget/BannerMessagePreference.java
+++ b/packages/SettingsLib/BannerMessagePreference/src/com/android/settingslib/widget/BannerMessagePreference.java
@@ -35,10 +35,11 @@
 import androidx.annotation.ColorRes;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.StringRes;
-import androidx.core.os.BuildCompat;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceViewHolder;
 
+import com.android.settingslib.utils.BuildCompatUtils;
+
 /**
  * Banner message is a banner displaying important information (permission request, page error etc),
  * and provide actions for user to address. It requires a user action to be dismissed.
@@ -83,7 +84,7 @@
     }
 
     private static final String TAG = "BannerPreference";
-    private static final boolean IS_AT_LEAST_S = BuildCompat.isAtLeastS();
+    private static final boolean IS_AT_LEAST_S = BuildCompatUtils.isAtLeastS();
 
     private final BannerMessagePreference.ButtonInfo mPositiveButtonInfo =
             new BannerMessagePreference.ButtonInfo();
diff --git a/packages/SettingsLib/MainSwitchPreference/Android.bp b/packages/SettingsLib/MainSwitchPreference/Android.bp
index 23ee49e..76d1ea7 100644
--- a/packages/SettingsLib/MainSwitchPreference/Android.bp
+++ b/packages/SettingsLib/MainSwitchPreference/Android.bp
@@ -16,8 +16,9 @@
     static_libs: [
         "androidx.preference_preference",
         "SettingsLibSettingsTheme",
+        "SettingsLibUtils",
     ],
 
     sdk_version: "system_current",
-    min_sdk_version: "21",
+    min_sdk_version: "28",
 }
diff --git a/packages/SettingsLib/MainSwitchPreference/AndroidManifest.xml b/packages/SettingsLib/MainSwitchPreference/AndroidManifest.xml
index 2607529..5817f77 100644
--- a/packages/SettingsLib/MainSwitchPreference/AndroidManifest.xml
+++ b/packages/SettingsLib/MainSwitchPreference/AndroidManifest.xml
@@ -19,7 +19,7 @@
           package="com.android.settingslib.widget">
 
     <uses-sdk
-        android:minSdkVersion="21"
+        android:minSdkVersion="28"
         android:targetSdkVersion="31"/>
 
 </manifest>
diff --git a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
index 91e1b93..58fc892 100644
--- a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
+++ b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java
@@ -30,7 +30,8 @@
 import android.widget.TextView;
 
 import androidx.annotation.ColorInt;
-import androidx.core.os.BuildCompat;
+
+import com.android.settingslib.utils.BuildCompatUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -74,7 +75,7 @@
 
         LayoutInflater.from(context).inflate(R.layout.settingslib_main_switch_bar, this);
 
-        if (!BuildCompat.isAtLeastS()) {
+        if (!BuildCompatUtils.isAtLeastS()) {
             final TypedArray a = context.obtainStyledAttributes(
                     new int[]{android.R.attr.colorAccent});
             mBackgroundActivatedColor = a.getColor(0, 0);
@@ -207,7 +208,7 @@
         mTextView.setEnabled(enabled);
         mSwitch.setEnabled(enabled);
 
-        if (BuildCompat.isAtLeastS()) {
+        if (BuildCompatUtils.isAtLeastS()) {
             if (enabled) {
                 mFrameView.setBackground(isChecked() ? mBackgroundOn : mBackgroundOff);
             } else {
@@ -226,7 +227,7 @@
     }
 
     private void setBackground(boolean isChecked) {
-        if (!BuildCompat.isAtLeastS()) {
+        if (!BuildCompatUtils.isAtLeastS()) {
             setBackgroundColor(isChecked ? mBackgroundActivatedColor : mBackgroundColor);
         } else {
             mFrameView.setBackground(isChecked ? mBackgroundOn : mBackgroundOff);
diff --git a/packages/SettingsLib/Utils/AndroidManifest.xml b/packages/SettingsLib/Utils/AndroidManifest.xml
index 96d9e51..fd89676 100644
--- a/packages/SettingsLib/Utils/AndroidManifest.xml
+++ b/packages/SettingsLib/Utils/AndroidManifest.xml
@@ -16,7 +16,7 @@
   -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.android.settingslib.widget">
+          package="com.android.settingslib.utils">
 
     <uses-sdk android:minSdkVersion="21" />
 
diff --git a/packages/SettingsLib/Utils/src/com/android/settingslib/utils/BuildCompatUtils.java b/packages/SettingsLib/Utils/src/com/android/settingslib/utils/BuildCompatUtils.java
new file mode 100644
index 0000000..44f6f54
--- /dev/null
+++ b/packages/SettingsLib/Utils/src/com/android/settingslib/utils/BuildCompatUtils.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.utils;
+
+import android.os.Build.VERSION;
+
+/**
+ * An util class to check whether the current OS version is higher or equal to sdk version of
+ * device.
+ */
+public final class BuildCompatUtils {
+
+    /**
+     * Implementation of BuildCompat.isAtLeast*() suitable for use in Settings
+     *
+     * <p>This still should try using BuildCompat.isAtLeastR() as source of truth, but also checking
+     * for VERSION_SDK_INT and VERSION.CODENAME in case when BuildCompat implementation returned
+     * false. Note that both checks should be >= and not = to make sure that when Android version
+     * increases (i.e., from R to S), this does not stop working.
+     *
+     * <p>Supported configurations:
+     *
+     * <ul>
+     *   <li>For current Android release: when new API is not finalized yet (CODENAME = "S", SDK_INT
+     *       = 30|31)
+     *   <li>For current Android release: when new API is finalized (CODENAME = "REL", SDK_INT = 31)
+     *   <li>For next Android release (CODENAME = "T", SDK_INT = 30+)
+     * </ul>
+     *
+     * <p>Note that Build.VERSION_CODES.S cannot be used here until final SDK is available, because
+     * it is equal to Build.VERSION_CODES.CUR_DEVELOPMENT before API finalization.
+     *
+     * @return Whether the current OS version is higher or equal to S.
+     */
+    public static boolean isAtLeastS() {
+        if (VERSION.SDK_INT < 30) {
+            return false;
+        }
+
+        return (VERSION.CODENAME.equals("REL") && VERSION.SDK_INT >= 31)
+                || (VERSION.CODENAME.length() == 1
+                && VERSION.CODENAME.compareTo("S") >= 0
+                && VERSION.CODENAME.compareTo("Z") <= 0);
+    }
+
+    private BuildCompatUtils() {}
+}
diff --git a/packages/SettingsLib/Utils/src/com/android/settingslib/utils/applications/AppUtils.java b/packages/SettingsLib/Utils/src/com/android/settingslib/utils/applications/AppUtils.java
index 4505dad..5dc0b72 100644
--- a/packages/SettingsLib/Utils/src/com/android/settingslib/utils/applications/AppUtils.java
+++ b/packages/SettingsLib/Utils/src/com/android/settingslib/utils/applications/AppUtils.java
@@ -22,7 +22,7 @@
 import android.os.UserManager;
 import android.util.Log;
 
-import com.android.settingslib.widget.R;
+import com.android.settingslib.utils.R;
 
 public class AppUtils {