Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 20558e21 authored by Jacky Wang's avatar Jacky Wang
Browse files

[Catalyst] Support hybrid mode

Bug: 332202168
Flag: com.android.settings.flags.catalyst
Test: Manual
Change-Id: Ib3607a91345bb0d94cd0d63cf7f9434c5603dd91
parent fdc8eb3e
Loading
Loading
Loading
Loading
+40 −4
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.preference.PreferenceScreenCreator;
import com.android.settingslib.search.Indexable;

import java.util.ArrayList;
@@ -60,6 +61,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -98,7 +100,8 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
        mDashboardFeatureProvider =
                FeatureFactory.getFeatureFactory().getDashboardFeatureProvider();

        if (!isCatalystEnabled()) {
        PreferenceScreenCreator preferenceScreenCreator = getPreferenceScreenCreator();
        if (preferenceScreenCreator == null || !preferenceScreenCreator.hasCompleteHierarchy()) {
            // Load preference controllers from code
            final List<AbstractPreferenceController> controllersFromCode =
                    createPreferenceControllers(context);
@@ -383,8 +386,12 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
            return;
        }
        PreferenceScreen screen;
        if (isCatalystEnabled()) {
        PreferenceScreenCreator preferenceScreenCreator = getPreferenceScreenCreator();
        if (preferenceScreenCreator != null) {
            screen = createPreferenceScreen();
            if (!preferenceScreenCreator.hasCompleteHierarchy()) {
                removeControllersForHybridMode();
            }
            setPreferenceScreen(screen);
            requireActivity().setTitle(screen.getTitle());
        } else {
@@ -395,13 +402,42 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
        displayResourceTilesToScreen(screen);
    }

    /**
     * Removes preference controllers that have been migrated to catalyst.
     *
     * In hybrid mode, preference screen is inflated from XML resource, while preference metadata
     * in the preference hierarchy are used to update preference widget UI. To avoid conflict,
     * remove the preference controllers.
     */
    private void removeControllersForHybridMode() {
        Set<String> keys = getPreferenceKeysInHierarchy();
        Iterator<AbstractPreferenceController> iterator = mControllers.iterator();
        while (iterator.hasNext()) {
            AbstractPreferenceController controller = iterator.next();
            String key = controller.getPreferenceKey();
            if (keys.contains(key)) {
                Log.i(TAG, "Remove preference controller for " + key);
                iterator.remove();
                List<AbstractPreferenceController> controllers = mPreferenceControllers.get(
                        controller.getClass());
                if (controllers != null) {
                    controllers.remove(controller);
                }
            }
        }
    }

    /** Returns if catalyst is enabled on current screen. */
    protected final boolean isCatalystEnabled() {
        return getPreferenceScreenCreator() != null;
    }

    private @Nullable PreferenceScreenCreator getPreferenceScreenCreator() {
        if (!Flags.catalyst()) {
            return false;
            return null;
        }
        Context context = getContext();
        return context != null ? getPreferenceScreenCreator(context) != null : false;
        return context != null ? getPreferenceScreenCreator(context) : null;
    }

    /**