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

Commit 585a7f3c authored by Diego Vela's avatar Diego Vela Committed by Chris Li
Browse files

Update ActivityEmbedding usage.

Bug: 259592300
Test: build.
Change-Id: I8e4aa8daf51cb9c669d06b152cc5a2fc69a06571
Merged-In: I8e4aa8daf51cb9c669d06b152cc5a2fc69a06571
(cherry picked from commit a9394d17)
(cherry picked from commit 65bb5a09)
(cherry picked from commit d2dfc428)
parent 8f77a3bf
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -154,7 +154,7 @@ public class SettingsInitialize extends BroadcastReceiver {
                DeepLinkHomepageActivity.class);
                DeepLinkHomepageActivity.class);
        final ComponentName searchStateReceiver = new ComponentName(context,
        final ComponentName searchStateReceiver = new ComponentName(context,
                SearchStateReceiver.class);
                SearchStateReceiver.class);
        final int enableState = SplitController.getInstance().isSplitSupported()
        final int enableState = SplitController.getInstance(context).isSplitSupported()
                ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
                : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
        pm.setComponentEnabledSetting(deepLinkHome, enableState, PackageManager.DONT_KILL_APP);
        pm.setComponentEnabledSetting(deepLinkHome, enableState, PackageManager.DONT_KILL_APP);
+53 −33
Original line number Original line Diff line number Diff line
@@ -22,11 +22,11 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.util.FeatureFlagUtils;
import android.util.FeatureFlagUtils;
import android.util.LayoutDirection;
import android.util.Log;
import android.util.Log;


import androidx.window.embedding.ActivityFilter;
import androidx.window.embedding.ActivityFilter;
import androidx.window.embedding.ActivityRule;
import androidx.window.embedding.ActivityRule;
import androidx.window.embedding.SplitAttributes;
import androidx.window.embedding.SplitController;
import androidx.window.embedding.SplitController;
import androidx.window.embedding.SplitPairFilter;
import androidx.window.embedding.SplitPairFilter;
import androidx.window.embedding.SplitPairRule;
import androidx.window.embedding.SplitPairRule;
@@ -46,6 +46,7 @@ import com.android.settings.homepage.SettingsHomepageActivity;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.users.AvatarPickerActivity;
import com.android.settingslib.users.AvatarPickerActivity;


import java.util.Collection;
import java.util.HashSet;
import java.util.HashSet;
import java.util.Set;
import java.util.Set;


@@ -60,7 +61,7 @@ public class ActivityEmbeddingRulesController {


    public ActivityEmbeddingRulesController(Context context) {
    public ActivityEmbeddingRulesController(Context context) {
        mContext = context;
        mContext = context;
        mSplitController = SplitController.getInstance();
        mSplitController = SplitController.getInstance(context);
    }
    }


    /**
    /**
@@ -85,8 +86,8 @@ public class ActivityEmbeddingRulesController {
            ComponentName primaryComponent,
            ComponentName primaryComponent,
            ComponentName secondaryComponent,
            ComponentName secondaryComponent,
            String secondaryIntentAction,
            String secondaryIntentAction,
            int finishPrimaryWithSecondary,
            SplitRule.FinishBehavior finishPrimaryWithSecondary,
            int finishSecondaryWithPrimary,
            SplitRule.FinishBehavior finishSecondaryWithPrimary,
            boolean clearTop) {
            boolean clearTop) {
        if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) {
        if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) {
            return;
            return;
@@ -95,14 +96,20 @@ public class ActivityEmbeddingRulesController {
        filters.add(new SplitPairFilter(primaryComponent, secondaryComponent,
        filters.add(new SplitPairFilter(primaryComponent, secondaryComponent,
                secondaryIntentAction));
                secondaryIntentAction));


        SplitController.getInstance().registerRule(new SplitPairRule(filters,
        SplitAttributes attributes = new SplitAttributes.Builder()
                finishPrimaryWithSecondary,
                .setSplitType(SplitAttributes.SplitType.ratio(
                finishSecondaryWithPrimary,
                        ActivityEmbeddingUtils.getSplitRatio(context)))
                clearTop,
                .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
                ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context),
                .build();
                ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context),
        SplitPairRule splitPairRule = new SplitPairRule.Builder(filters)
                ActivityEmbeddingUtils.getSplitRatio(context),
                .setFinishPrimaryWithSecondary(finishPrimaryWithSecondary)
                LayoutDirection.LOCALE));
                .setFinishSecondaryWithPrimary(finishSecondaryWithPrimary)
                .setClearTop(clearTop)
                .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp())
                .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp())
                .setDefaultSplitAttributes(attributes)
                .build();
        SplitController.getInstance(context).addRule(splitPairRule);
    }
    }


    /**
    /**
@@ -123,8 +130,10 @@ public class ActivityEmbeddingRulesController {
                new ComponentName(context, Settings.class),
                new ComponentName(context, Settings.class),
                secondaryComponent,
                secondaryComponent,
                secondaryIntentAction,
                secondaryIntentAction,
                finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
                finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT
                finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
                        : SplitRule.FinishBehavior.NEVER,
                finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT
                        : SplitRule.FinishBehavior.NEVER,
                clearTop);
                clearTop);


        registerTwoPanePairRule(
        registerTwoPanePairRule(
@@ -132,8 +141,10 @@ public class ActivityEmbeddingRulesController {
                new ComponentName(context, SettingsHomepageActivity.class),
                new ComponentName(context, SettingsHomepageActivity.class),
                secondaryComponent,
                secondaryComponent,
                secondaryIntentAction,
                secondaryIntentAction,
                finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
                finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT
                finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
                        : SplitRule.FinishBehavior.NEVER,
                finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT
                        : SplitRule.FinishBehavior.NEVER,
                clearTop);
                clearTop);


        // We should finish HomePageActivity altogether even if it shows in single pane for all deep
        // We should finish HomePageActivity altogether even if it shows in single pane for all deep
@@ -143,8 +154,10 @@ public class ActivityEmbeddingRulesController {
                new ComponentName(context, DeepLinkHomepageActivity.class),
                new ComponentName(context, DeepLinkHomepageActivity.class),
                secondaryComponent,
                secondaryComponent,
                secondaryIntentAction,
                secondaryIntentAction,
                finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER,
                finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS
                finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER,
                        : SplitRule.FinishBehavior.NEVER,
                finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS
                        : SplitRule.FinishBehavior.NEVER,
                clearTop);
                clearTop);


        registerTwoPanePairRule(
        registerTwoPanePairRule(
@@ -152,8 +165,10 @@ public class ActivityEmbeddingRulesController {
                new ComponentName(context, DeepLinkHomepageActivityInternal.class),
                new ComponentName(context, DeepLinkHomepageActivityInternal.class),
                secondaryComponent,
                secondaryComponent,
                secondaryIntentAction,
                secondaryIntentAction,
                finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER,
                finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS
                finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER,
                        : SplitRule.FinishBehavior.NEVER,
                finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS
                        : SplitRule.FinishBehavior.NEVER,
                clearTop);
                clearTop);
    }
    }


@@ -204,17 +219,20 @@ public class ActivityEmbeddingRulesController {


        final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class);
        final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class);
        intent.putExtra(SettingsActivity.EXTRA_IS_SECOND_LAYER_PAGE, true);
        intent.putExtra(SettingsActivity.EXTRA_IS_SECOND_LAYER_PAGE, true);
        final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule(
        SplitAttributes attributes = new SplitAttributes.Builder()
                activityFilters,
                .setSplitType(SplitAttributes.SplitType.ratio(
                intent,
                        ActivityEmbeddingUtils.getSplitRatio(mContext)))
                false /* stickyPlaceholder */,
                .build();
                SplitRule.FINISH_ADJACENT,
        final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule.Builder(
                ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(mContext),
                activityFilters, intent)
                ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(mContext),
                .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp())
                ActivityEmbeddingUtils.getSplitRatio(mContext),
                .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp())
                LayoutDirection.LOCALE);
                .setSticky(false)
                .setFinishPrimaryWithPlaceholder(SplitRule.FinishBehavior.ADJACENT)
                .setDefaultSplitAttributes(attributes)
                .build();


        mSplitController.registerRule(placeholderRule);
        mSplitController.addRule(placeholderRule);
    }
    }


    private void registerAlwaysExpandRule() {
    private void registerAlwaysExpandRule() {
@@ -229,14 +247,16 @@ public class ActivityEmbeddingRulesController {
        addActivityFilter(activityFilters, FingerprintEnrollIntroductionInternal.class);
        addActivityFilter(activityFilters, FingerprintEnrollIntroductionInternal.class);
        addActivityFilter(activityFilters, FingerprintEnrollEnrolling.class);
        addActivityFilter(activityFilters, FingerprintEnrollEnrolling.class);
        addActivityFilter(activityFilters, AvatarPickerActivity.class);
        addActivityFilter(activityFilters, AvatarPickerActivity.class);
        mSplitController.registerRule(new ActivityRule(activityFilters, true /* alwaysExpand */));
        ActivityRule activityRule = new ActivityRule.Builder(activityFilters).setAlwaysExpand(true)
                .build();
        mSplitController.addRule(activityRule);
    }
    }


    private static void addActivityFilter(Set<ActivityFilter> activityFilters, Intent intent) {
    private static void addActivityFilter(Set<ActivityFilter> activityFilters, Intent intent) {
        activityFilters.add(new ActivityFilter(COMPONENT_NAME_WILDCARD, intent.getAction()));
        activityFilters.add(new ActivityFilter(COMPONENT_NAME_WILDCARD, intent.getAction()));
    }
    }


    private void addActivityFilter(Set<ActivityFilter> activityFilters,
    private void addActivityFilter(Collection<ActivityFilter> activityFilters,
            Class<? extends Activity> activityClass) {
            Class<? extends Activity> activityClass) {
        activityFilters.add(new ActivityFilter(new ComponentName(mContext, activityClass),
        activityFilters.add(new ActivityFilter(new ComponentName(mContext, activityClass),
                null /* intentAction */));
                null /* intentAction */));
+9 −13
Original line number Original line Diff line number Diff line
@@ -30,29 +30,25 @@ import com.android.settings.R;
/** An util class collecting all common methods for the embedding activity features. */
/** An util class collecting all common methods for the embedding activity features. */
public class ActivityEmbeddingUtils {
public class ActivityEmbeddingUtils {
    // The smallest value of current width of the window when the split should be used.
    // The smallest value of current width of the window when the split should be used.
    private static final float MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 720f;
    private static final int MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 720;
    // The smallest value of the smallest-width (sw) of the window in any rotation when
    // The smallest value of the smallest-width (sw) of the window in any rotation when
    // the split should be used.
    // the split should be used.
    private static final float MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP = 600f;
    private static final int MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP = 600;
    // The minimum width of the activity to show the regular homepage layout.
    // The minimum width of the activity to show the regular homepage layout.
    private static final float MIN_REGULAR_HOMEPAGE_LAYOUT_WIDTH_DP = 380f;
    private static final float MIN_REGULAR_HOMEPAGE_LAYOUT_WIDTH_DP = 380f;
    private static final String TAG = "ActivityEmbeddingUtils";
    private static final String TAG = "ActivityEmbeddingUtils";


    /** Get the smallest pixel value of width of the window when the split should be used. */
    /** Get the smallest width dp of the window when the split should be used. */
    public static int getMinCurrentScreenSplitWidthPx(Context context) {
    public static int getMinCurrentScreenSplitWidthDp() {
        final DisplayMetrics dm = context.getResources().getDisplayMetrics();
        return MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP;
        return (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP, dm);
    }
    }


    /**
    /**
     * Get the smallest pixel value of the smallest-width (sw) of the window in any rotation when
     * Get the smallest dp value of the smallest-width (sw) of the window in any rotation when
     * the split should be used.
     * the split should be used.
     */
     */
    public static int getMinSmallestScreenSplitWidthPx(Context context) {
    public static int getMinSmallestScreenSplitWidthDp() {
        final DisplayMetrics dm = context.getResources().getDisplayMetrics();
        return MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP;
        return (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP, dm);
    }
    }


    /**
    /**
@@ -67,7 +63,7 @@ public class ActivityEmbeddingUtils {
    public static boolean isEmbeddingActivityEnabled(Context context) {
    public static boolean isEmbeddingActivityEnabled(Context context) {
        final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context,
        final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context,
                FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN);
                FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN);
        final boolean isSplitSupported = SplitController.getInstance().isSplitSupported();
        final boolean isSplitSupported = SplitController.getInstance(context).isSplitSupported();


        Log.d(TAG, "isFlagEnabled = " + isFlagEnabled);
        Log.d(TAG, "isFlagEnabled = " + isFlagEnabled);
        Log.d(TAG, "isSplitSupported = " + isSplitSupported);
        Log.d(TAG, "isSplitSupported = " + isSplitSupported);
+5 −5
Original line number Original line Diff line number Diff line
@@ -190,7 +190,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements
        setupEdgeToEdge();
        setupEdgeToEdge();
        setContentView(R.layout.settings_homepage_container);
        setContentView(R.layout.settings_homepage_container);


        mSplitController = SplitController.getInstance();
        mSplitController = SplitController.getInstance(this);
        mIsTwoPane = mSplitController.isActivityEmbedded(this);
        mIsTwoPane = mSplitController.isActivityEmbedded(this);


        updateAppBarMinHeight();
        updateAppBarMinHeight();
@@ -518,15 +518,15 @@ public class SettingsHomepageActivity extends FragmentActivity implements
                new ComponentName(getApplicationContext(), getClass()),
                new ComponentName(getApplicationContext(), getClass()),
                targetComponentName,
                targetComponentName,
                targetIntent.getAction(),
                targetIntent.getAction(),
                SplitRule.FINISH_ALWAYS,
                SplitRule.FinishBehavior.ALWAYS,
                SplitRule.FINISH_ALWAYS,
                SplitRule.FinishBehavior.ALWAYS,
                true /* clearTop */);
                true /* clearTop */);
        ActivityEmbeddingRulesController.registerTwoPanePairRule(this,
        ActivityEmbeddingRulesController.registerTwoPanePairRule(this,
                new ComponentName(getApplicationContext(), Settings.class),
                new ComponentName(getApplicationContext(), Settings.class),
                targetComponentName,
                targetComponentName,
                targetIntent.getAction(),
                targetIntent.getAction(),
                SplitRule.FINISH_ALWAYS,
                SplitRule.FinishBehavior.ALWAYS,
                SplitRule.FINISH_ALWAYS,
                SplitRule.FinishBehavior.ALWAYS,
                true /* clearTop */);
                true /* clearTop */);


        final UserHandle user = intent.getParcelableExtra(EXTRA_USER_HANDLE, UserHandle.class);
        final UserHandle user = intent.getParcelableExtra(EXTRA_USER_HANDLE, UserHandle.class);
+12 −3
Original line number Original line Diff line number Diff line
@@ -65,6 +65,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi
    private int mPaddingHorizontal;
    private int mPaddingHorizontal;
    private boolean mScrollNeeded = true;
    private boolean mScrollNeeded = true;
    private boolean mFirstStarted = true;
    private boolean mFirstStarted = true;
    private SplitController mSplitController;


    public TopLevelSettings() {
    public TopLevelSettings() {
        final Bundle args = new Bundle();
        final Bundle args = new Bundle();
@@ -143,7 +144,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi
            return;
            return;
        }
        }


        boolean activityEmbedded = SplitController.getInstance().isActivityEmbedded(getActivity());
        boolean activityEmbedded = isActivityEmbedded();
        if (icicle != null) {
        if (icicle != null) {
            mHighlightMixin = icicle.getParcelable(SAVED_HIGHLIGHT_MIXIN);
            mHighlightMixin = icicle.getParcelable(SAVED_HIGHLIGHT_MIXIN);
            mScrollNeeded = !mHighlightMixin.isActivityEmbedded() && activityEmbedded;
            mScrollNeeded = !mHighlightMixin.isActivityEmbedded() && activityEmbedded;
@@ -154,6 +155,14 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi
        }
        }
    }
    }


    /** Wrap SplitController#isActivityEmbedded for testing. */
    public boolean isActivityEmbedded() {
        if (mSplitController == null) {
            mSplitController = SplitController.getInstance(getActivity());
        }
        return mSplitController.isActivityEmbedded(getActivity());
    }

    @Override
    @Override
    public void onStart() {
    public void onStart() {
        if (mFirstStarted) {
        if (mFirstStarted) {
@@ -161,7 +170,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi
            FeatureFactory.getFactory(getContext()).getSearchFeatureProvider().sendPreIndexIntent(
            FeatureFactory.getFactory(getContext()).getSearchFeatureProvider().sendPreIndexIntent(
                    getContext());
                    getContext());
        } else if (mIsEmbeddingActivityEnabled && isOnlyOneActivityInTask()
        } else if (mIsEmbeddingActivityEnabled && isOnlyOneActivityInTask()
                && !SplitController.getInstance().isActivityEmbedded(getActivity())) {
                && !isActivityEmbedded()) {
            // Set default highlight menu key for 1-pane homepage since it will show the placeholder
            // Set default highlight menu key for 1-pane homepage since it will show the placeholder
            // page once changing back to 2-pane.
            // page once changing back to 2-pane.
            Log.i(TAG, "Set default menu key");
            Log.i(TAG, "Set default menu key");
@@ -286,7 +295,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi
         * 3. the current activity is embedded */
         * 3. the current activity is embedded */
        return mHighlightMixin != null
        return mHighlightMixin != null
                && TextUtils.equals(pref.getKey(), mHighlightMixin.getHighlightPreferenceKey())
                && TextUtils.equals(pref.getKey(), mHighlightMixin.getHighlightPreferenceKey())
                && SplitController.getInstance().isActivityEmbedded(getActivity());
                && isActivityEmbedded();
    }
    }


    /** Show/hide the highlight on the menu entry for the search page presence */
    /** Show/hide the highlight on the menu entry for the search page presence */
Loading