From 9669cf5db97ac24bd0068f70bd770c2be3a2a602 Mon Sep 17 00:00:00 2001 From: Sunny Shao Date: Wed, 23 Aug 2023 12:01:27 +0800 Subject: [PATCH] Fix theme differences between left/right pane problem - Add a callback class to monitor the split behavior of the activity embedding and update UI if necessary. Fixes: 279516059 Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=com.android.settings.homepage.SettingsHomepageActivity Change-Id: I32e86265638684ddde067539a0f493be4c04afae --- Android.bp | 1 + .../homepage/SettingsHomepageActivity.java | 65 ++++++++++++++++--- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/Android.bp b/Android.bp index bb5ace8c9a8..819cefab316 100644 --- a/Android.bp +++ b/Android.bp @@ -74,6 +74,7 @@ android_library { "androidx.preference_preference", "androidx.recyclerview_recyclerview", "androidx.window_window", + "androidx.window_window-java", "com.google.android.material_material", "setupcompat", "setupdesign", diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index 533fbe73c24..d96ec39507a 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -50,6 +50,7 @@ import android.widget.Toolbar; import androidx.annotation.VisibleForTesting; import androidx.core.graphics.Insets; +import androidx.core.util.Consumer; import androidx.core.view.ViewCompat; import androidx.core.view.WindowCompat; import androidx.core.view.WindowInsetsCompat; @@ -57,7 +58,10 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; +import androidx.window.embedding.SplitController; +import androidx.window.embedding.SplitInfo; import androidx.window.embedding.SplitRule; +import androidx.window.java.embedding.SplitControllerCallbackAdapter; import com.android.settings.R; import com.android.settings.Settings; @@ -77,6 +81,7 @@ import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; import com.google.android.setupcompat.util.WizardManagerHelper; import java.net.URISyntaxException; +import java.util.List; import java.util.Set; /** Settings homepage activity */ @@ -112,6 +117,9 @@ public class SettingsHomepageActivity extends FragmentActivity implements // A regular layout shows icons on homepage, whereas a simplified layout doesn't. private boolean mIsRegularLayout = true; + private SplitControllerCallbackAdapter mSplitControllerAdapter; + private SplitInfoCallback mCallback; + /** A listener receiving homepage loaded events. */ public interface HomepageLoadedListener { /** Called when the homepage is loaded. */ @@ -259,6 +267,22 @@ public class SettingsHomepageActivity extends FragmentActivity implements protected void onStart() { ((SettingsApplication) getApplication()).setHomeActivity(this); super.onStart(); + if (mIsEmbeddingActivityEnabled) { + final SplitController splitController = SplitController.getInstance(this); + mSplitControllerAdapter = new SplitControllerCallbackAdapter(splitController); + mCallback = new SplitInfoCallback(this); + mSplitControllerAdapter.addSplitListener(this, Runnable::run, mCallback); + } + } + + @Override + protected void onStop() { + super.onStop(); + if (mSplitControllerAdapter != null && mCallback != null) { + mSplitControllerAdapter.removeSplitListener(mCallback); + mCallback = null; + mSplitControllerAdapter = null; + } } @Override @@ -281,21 +305,13 @@ public class SettingsHomepageActivity extends FragmentActivity implements @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); - final boolean newTwoPaneState = ActivityEmbeddingUtils.isAlreadyEmbedded(this); - if (mIsTwoPane != newTwoPaneState) { - mIsTwoPane = newTwoPaneState; - updateHomepageAppBar(); - updateHomepageBackground(); - updateHomepagePaddings(); - } - updateSplitLayout(); + updateHomepageUI(); } private void updateSplitLayout() { if (!mIsEmbeddingActivityEnabled) { return; } - if (mIsTwoPane) { if (mIsRegularLayout == ActivityEmbeddingUtils.isRegularHomepageLayout(this)) { // Layout unchanged @@ -365,6 +381,17 @@ public class SettingsHomepageActivity extends FragmentActivity implements } } + private void updateHomepageUI() { + final boolean newTwoPaneState = ActivityEmbeddingUtils.isAlreadyEmbedded(this); + if (mIsTwoPane != newTwoPaneState) { + mIsTwoPane = newTwoPaneState; + updateHomepageAppBar(); + updateHomepageBackground(); + updateHomepagePaddings(); + } + updateSplitLayout(); + } + private void updateHomepageBackground() { if (!mIsEmbeddingActivityEnabled) { return; @@ -733,4 +760,24 @@ public class SettingsHomepageActivity extends FragmentActivity implements } } } + + /** The callback invoked while AE splitting. */ + private static class SplitInfoCallback implements Consumer> { + private final SettingsHomepageActivity mActivity; + + private boolean mIsSplitUpdatedUI = false; + + SplitInfoCallback(SettingsHomepageActivity activity) { + mActivity = activity; + } + + @Override + public void accept(List splitInfoList) { + if (!splitInfoList.isEmpty() && !mIsSplitUpdatedUI && !mActivity.isFinishing() + && ActivityEmbeddingUtils.isAlreadyEmbedded(mActivity)) { + mIsSplitUpdatedUI = true; + mActivity.updateHomepageUI(); + } + } + } }