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:
@@ -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",
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user