Support customize layout in CollapsingToolbarBaseActivity

We introduced the collapsing toolbar on S. To enable this feature needs
to correspondingly adjust the theme that the activity uses. However
these changes might cause some mainline module apps get crashed when
running on R. A customize layout is allowed to use for some cases that
need to roll back to the layout used in R.

Bug: 192395187
Test: visual verified
Change-Id: I9b409842198a2d52a6440cdd9ad68268293681f2
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp b/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp
index e500196..2f911c4 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/Android.bp
@@ -18,6 +18,7 @@
         "androidx.core_core",
         "com.google.android.material_material",
         "SettingsLibSettingsTransition",
+        "SettingsLibUtils",
     ],
     sdk_version: "system_current",
     min_sdk_version: "29",
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
index a1cd3718..84a6b36 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java
@@ -28,6 +28,8 @@
 import androidx.coordinatorlayout.widget.CoordinatorLayout;
 import androidx.fragment.app.FragmentActivity;
 
+import com.android.settingslib.utils.BuildCompatUtils;
+
 import com.google.android.material.appbar.AppBarLayout;
 import com.google.android.material.appbar.CollapsingToolbarLayout;
 import com.google.android.material.resources.TextAppearanceConfig;
@@ -44,10 +46,15 @@
     private CollapsingToolbarLayout mCollapsingToolbarLayout;
     @Nullable
     private AppBarLayout mAppBarLayout;
+    private int mCustomizeLayoutResId = 0;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        if (mCustomizeLayoutResId > 0 && !BuildCompatUtils.isAtLeastS()) {
+            super.setContentView(mCustomizeLayoutResId);
+            return;
+        }
         // Force loading font synchronously for collapsing toolbar layout
         TextAppearanceConfig.setShouldLoadFontSynchronously(true);
         super.setContentView(R.layout.collapsing_toolbar_base_layout);
@@ -81,12 +88,27 @@
 
     @Override
     public void setContentView(View view) {
-        ((ViewGroup) findViewById(R.id.content_frame)).addView(view);
+        final ViewGroup parent = findViewById(R.id.content_frame);
+        if (parent != null) {
+            parent.addView(view);
+        }
     }
 
     @Override
     public void setContentView(View view, ViewGroup.LayoutParams params) {
-        ((ViewGroup) findViewById(R.id.content_frame)).addView(view, params);
+        final ViewGroup parent = findViewById(R.id.content_frame);
+        if (parent != null) {
+            parent.addView(view, params);
+        }
+    }
+
+    /**
+     * This method allows an activity to replace the default layout with a customize layout. Notice
+     * that it will no longer apply the features being provided by this class when this method
+     * gets called.
+     */
+    protected void setCustomizeContentView(int layoutResId) {
+        mCustomizeLayoutResId = layoutResId;
     }
 
     @Override