Allow Safety Center to render off-screen items for smoother animations

Test: manual

Bug: 240140603
Change-Id: I7bed3b4ae1ed4c61e7d77b35bed22ac99e055957
diff --git a/PermissionController/res/layout-v33/safety_center_scroll_wrapper.xml b/PermissionController/res/layout-v33/safety_center_scroll_wrapper.xml
new file mode 100644
index 0000000..449e6da
--- /dev/null
+++ b/PermissionController/res/layout-v33/safety_center_scroll_wrapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2022 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.
+  -->
+<androidx.core.widget.NestedScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:clipChildren="false">
+
+    <androidx.fragment.app.FragmentContainerView
+        android:id="@+id/fragment_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+</androidx.core.widget.NestedScrollView>
\ No newline at end of file
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java
index 23f84f9..3f02eba 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java
@@ -28,12 +28,11 @@
 import android.util.Log;
 
 import androidx.annotation.RequiresApi;
-import androidx.preference.PreferenceFragmentCompat;
+import androidx.fragment.app.Fragment;
 
 import com.android.permissioncontroller.Constants;
 import com.android.permissioncontroller.PermissionControllerStatsLog;
 import com.android.permissioncontroller.R;
-import com.android.permissioncontroller.permission.utils.Utils;
 import com.android.settingslib.collapsingtoolbar.CollapsingToolbarBaseActivity;
 
 /** Entry-point activity for SafetyCenter. */
@@ -51,16 +50,14 @@
 
         if (maybeRedirectIfDisabled()) return;
 
-        PreferenceFragmentCompat frag;
+        Fragment frag;
         if (getIntent().getAction().equals(PRIVACY_CONTROLS_ACTION)) {
             setTitle(R.string.privacy_controls_title);
             frag = PrivacyControlsFragment.newInstance();
         } else {
             logPrivacySourceMetric();
             setTitle(getString(R.string.safety_center_dashboard_page_title));
-            frag = SafetyCenterDashboardFragment.newInstance(
-                    Utils.getOrGenerateSessionId(getIntent()),
-                    /* isQuickSettingsFragment= */ false);
+            frag = new SafetyCenterScrollWrapperFragment();
         }
         if (savedInstanceState == null) {
             getSupportFragmentManager()
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterScrollWrapperFragment.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterScrollWrapperFragment.kt
new file mode 100644
index 0000000..beda65e
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterScrollWrapperFragment.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2022 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.permissioncontroller.safetycenter.ui
+
+import android.os.Build
+import android.os.Bundle
+import androidx.annotation.RequiresApi
+import androidx.fragment.app.Fragment
+import com.android.permissioncontroller.R
+import com.android.permissioncontroller.permission.utils.Utils
+
+@RequiresApi(Build.VERSION_CODES.TIRAMISU)
+internal class SafetyCenterScrollWrapperFragment : Fragment(R.layout.safety_center_scroll_wrapper) {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        if (savedInstanceState == null) {
+            childFragmentManager.beginTransaction()
+                    .add(R.id.fragment_container,
+                            SafetyCenterDashboardFragment.newInstance(
+                                    Utils.getOrGenerateSessionId(requireActivity().getIntent()),
+                                    /* isQuickSettingsFragment= */ false))
+                    .commitNow()
+        }
+    }
+}
\ No newline at end of file