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
This commit is contained in:
Sunny Shao
2023-08-23 12:01:27 +08:00
parent 84c4ec936a
commit 9669cf5db9
2 changed files with 57 additions and 9 deletions

View File

@@ -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",

View File

@@ -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<List<SplitInfo>> {
private final SettingsHomepageActivity mActivity;
private boolean mIsSplitUpdatedUI = false;
SplitInfoCallback(SettingsHomepageActivity activity) {
mActivity = activity;
}
@Override
public void accept(List<SplitInfo> splitInfoList) {
if (!splitInfoList.isEmpty() && !mIsSplitUpdatedUI && !mActivity.isFinishing()
&& ActivityEmbeddingUtils.isAlreadyEmbedded(mActivity)) {
mIsSplitUpdatedUI = true;
mActivity.updateHomepageUI();
}
}
}
}