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

Commit 7bfe3e86 authored by Jason Chiu's avatar Jason Chiu Committed by Android (Google) Code Review
Browse files

Merge "Revise homepage highlight mechanism" into sc-v2-dev

parents 50bfe197 a305c23f
Loading
Loading
Loading
Loading
+6 −24
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import android.content.Intent;
import android.util.LayoutDirection;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.window.embedding.ActivityFilter;
import androidx.window.embedding.ActivityRule;
import androidx.window.embedding.SplitController;
@@ -114,7 +113,7 @@ public class ActivityEmbeddingRulesController {

        registerTwoPanePairRule(
                context,
                getComponentName(context, Settings.class),
                new ComponentName(context, Settings.class),
                secondaryComponent,
                secondaryIntentAction,
                finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
@@ -123,7 +122,7 @@ public class ActivityEmbeddingRulesController {

        registerTwoPanePairRule(
                context,
                getComponentName(context, SettingsHomepageActivity.class),
                new ComponentName(context, SettingsHomepageActivity.class),
                secondaryComponent,
                secondaryIntentAction,
                finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER,
@@ -143,7 +142,7 @@ public class ActivityEmbeddingRulesController {

        registerTwoPanePairRule(
                context,
                getComponentName(context, SliceDeepLinkHomepageActivity.class),
                new ComponentName(context, SliceDeepLinkHomepageActivity.class),
                secondaryComponent,
                secondaryIntentAction,
                finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER,
@@ -179,7 +178,7 @@ public class ActivityEmbeddingRulesController {

        registerTwoPanePairRuleForSettingsHome(
                context,
                getComponentName(context, SubSettings.class),
                new ComponentName(context, SubSettings.class),
                null /* secondaryIntentAction */,
                clearTop);
    }
@@ -191,8 +190,7 @@ public class ActivityEmbeddingRulesController {
        addActivityFilter(activityFilters, SliceDeepLinkHomepageActivity.class);
        addActivityFilter(activityFilters, Settings.class);

        final Intent intent = new Intent();
        intent.setComponent(getComponentName(Settings.NetworkDashboardActivity.class));
        final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class);
        final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule(
                activityFilters,
                intent,
@@ -215,23 +213,7 @@ public class ActivityEmbeddingRulesController {

    private void addActivityFilter(Set<ActivityFilter> activityFilters,
            Class<? extends Activity> activityClass) {
        activityFilters.add(new ActivityFilter(getComponentName(activityClass),
        activityFilters.add(new ActivityFilter(new ComponentName(mContext, activityClass),
                null /* intentAction */));
    }

    private void addActivityFilter(Set<ActivityFilter> activityFilters,
            ComponentName componentName) {
        activityFilters.add(new ActivityFilter(componentName, null /* intentAction */));
    }

    @NonNull
    private ComponentName getComponentName(Class<? extends Activity> activityClass) {
        return getComponentName(mContext, activityClass);
    }

    @NonNull
    private static ComponentName getComponentName(Context context,
            Class<? extends Activity> activityClass) {
        return new ComponentName(context.getPackageName(), activityClass.getName());
    }
}
+16 −18
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITL
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface.OnCancelListener;
import android.content.IContentProvider;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -63,6 +62,7 @@ import com.android.settings.Utils;
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
import com.android.settings.homepage.TopLevelHighlightMixin;
import com.android.settings.homepage.TopLevelSettings;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.PrimarySwitchPreference;
@@ -170,27 +170,23 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
                if (action != null) {
                    intent.setAction(action);
                }
                pref.setOnPreferenceClickListener(preference -> {
                    OnCancelListener listener = null;
                    if (fragment instanceof TopLevelSettings
                            && ActivityEmbeddingUtils.isEmbeddingActivityEnabled(mContext)) {
                // Register the rule for injected apps.
                ActivityEmbeddingRulesController.registerTwoPanePairRuleForSettingsHome(
                        mContext,
                        new ComponentName(tile.getPackageName(), tile.getComponentName()),
                                null /* secondaryIntentAction */,
                        action,
                        true /* clearTop */);

                        // Highlight preference ui.
                pref.setOnPreferenceClickListener(preference -> {
                    TopLevelHighlightMixin highlightMixin = null;
                    if (fragment instanceof TopLevelSettings
                            && ActivityEmbeddingUtils.isEmbeddingActivityEnabled(mContext)) {
                        // Highlight the preference whenever it's clicked
                        final TopLevelSettings topLevelSettings = (TopLevelSettings) fragment;
                        // Highlight the tile immediately whenever it's clicked
                        topLevelSettings.setHighlightPreferenceKey(key);
                        // If the tile allows users to select profile, the pop-op dialog may be
                        // cancelled and then the previous highlight entry should be restored.
                        listener = dialog -> topLevelSettings.restorePreviousHighlight();
                        highlightMixin = topLevelSettings.getHighlightMixin();
                    }
                    launchIntentOrSelectProfile(activity, tile, intent, sourceMetricsCategory,
                            listener);
                            highlightMixin);
                    return true;
                });
            }
@@ -223,7 +219,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
                        SettingsEnums.DASHBOARD_SUMMARY)
                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        launchIntentOrSelectProfile(activity, tile, intent, SettingsEnums.DASHBOARD_SUMMARY,
                /* listener= */ null);
                /* highlightMixin= */ null);
    }

    private DynamicDataObserver createDynamicDataObserver(String method, Uri uri, Preference pref) {
@@ -438,7 +434,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
    }

    private void launchIntentOrSelectProfile(FragmentActivity activity, Tile tile, Intent intent,
            int sourceMetricCategory, OnCancelListener listener) {
            int sourceMetricCategory, TopLevelHighlightMixin highlightMixin) {
        if (!isIntentResolvable(intent)) {
            Log.w(TAG, "Cannot resolve intent, skipping. " + intent);
            return;
@@ -469,7 +465,9 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
            }

            ProfileSelectDialog.show(activity.getSupportFragmentManager(), tile,
                    sourceMetricCategory, listener);
                    sourceMetricCategory, /* onShowListener= */ highlightMixin,
                    /* onDismissListener= */ highlightMixin,
                    /* onCancelListener= */ highlightMixin);
        }
    }

+30 −3
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.DialogInterface.OnShowListener;
import android.content.Intent;
import android.os.Bundle;
import android.os.UserHandle;
@@ -45,23 +47,30 @@ public class ProfileSelectDialog extends DialogFragment implements OnClickListen

    private int mSourceMetricCategory;
    private Tile mSelectedTile;
    private OnShowListener mOnShowListener;
    private OnCancelListener mOnCancelListener;
    private OnDismissListener mOnDismissListener;

    /**
     * Display the profile select dialog, adding the fragment to the given FragmentManager.
     * @param manager The FragmentManager this fragment will be added to.
     * @param tile The tile for this fragment.
     * @param sourceMetricCategory The source metric category.
     * @param listener The listener listens to the dialog cancelling event.
     * @param onShowListener The listener listens to the dialog showing event.
     * @param onDismissListener The listener listens to the dialog dismissing event.
     * @param onCancelListener The listener listens to the dialog cancelling event.
     */
    public static void show(FragmentManager manager, Tile tile, int sourceMetricCategory,
            OnCancelListener listener) {
            OnShowListener onShowListener, OnDismissListener onDismissListener,
            OnCancelListener onCancelListener) {
        final ProfileSelectDialog dialog = new ProfileSelectDialog();
        final Bundle args = new Bundle();
        args.putParcelable(ARG_SELECTED_TILE, tile);
        args.putInt(ARG_SOURCE_METRIC_CATEGORY, sourceMetricCategory);
        dialog.setArguments(args);
        dialog.mOnCancelListener = listener;
        dialog.mOnShowListener = onShowListener;
        dialog.mOnDismissListener = onDismissListener;
        dialog.mOnCancelListener = onCancelListener;
        dialog.show(manager, "select_profile");
    }

@@ -96,13 +105,31 @@ public class ProfileSelectDialog extends DialogFragment implements OnClickListen
        getActivity().startActivityAsUser(intent, user);
    }

    @Override
    public void onStart() {
        super.onStart();
        // The fragment shows the dialog within onStart()
        if (mOnShowListener != null) {
            mOnShowListener.onShow(getDialog());
        }
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        super.onCancel(dialog);
        if (mOnCancelListener != null) {
            mOnCancelListener.onCancel(dialog);
        }
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        if (mOnDismissListener != null) {
            mOnDismissListener.onDismiss(dialog);
        }
    }

    public static void updateUserHandlesIfNeeded(Context context, Tile tile) {
        final List<UserHandle> userHandles = tile.userHandle;
        if (tile.userHandle == null || tile.userHandle.size() <= 1) {
+5 −5
Original line number Diff line number Diff line
@@ -63,6 +63,11 @@ public class TopLevelWallpaperPreferenceController extends BasePreferenceControl
        super.displayPreference(screen);
        Preference preference = screen.findPreference(getPreferenceKey());
        preference.setTitle(getTitle());
        ActivityEmbeddingRulesController.registerTwoPanePairRuleForSettingsHome(
                mContext,
                getComponentName(),
                null /* secondaryIntentAction */,
                true /* clearTop */);
    }

    public String getTitle() {
@@ -103,11 +108,6 @@ public class TopLevelWallpaperPreferenceController extends BasePreferenceControl
                    mContext)) {
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            }
            ActivityEmbeddingRulesController.registerTwoPanePairRuleForSettingsHome(
                    mContext,
                    intent.getComponent(),
                    null /* secondaryIntentAction */,
                    true /* clearTop */);
            preference.getContext().startActivity(intent);
            return true;
        }
+32 −21
Original line number Diff line number Diff line
@@ -76,7 +76,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements
    public static final String EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_DATA =
            "settings_large_screen_deep_link_intent_data";

    private static final int DEFAULT_HIGHLIGHT_MENU_KEY = R.string.menu_key_network;
    static final int DEFAULT_HIGHLIGHT_MENU_KEY = R.string.menu_key_network;
    private static final long HOMEPAGE_LOADING_TIMEOUT_MS = 300;

    private TopLevelSettings mMainFragment;
@@ -94,6 +94,10 @@ public class SettingsHomepageActivity extends FragmentActivity implements
        void onHomepageLoaded();
    }

    private interface FragmentBuilder<T extends Fragment>  {
        T build();
    }

    /**
     * Try to add a {@link HomepageLoadedListener}. If homepage is already loaded, the listener
     * will not be notified.
@@ -168,13 +172,15 @@ public class SettingsHomepageActivity extends FragmentActivity implements
            initAvatarView();
            showSuggestionFragment();
            if (FeatureFlagUtils.isEnabled(this, FeatureFlags.CONTEXTUAL_HOME)) {
                showFragment(new ContextualCardsFragment(), R.id.contextual_cards_content);
                showFragment(() -> new ContextualCardsFragment(), R.id.contextual_cards_content);
            }
        }
        mMainFragment = new TopLevelSettings();
        mMainFragment.getArguments().putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY,
        mMainFragment = showFragment(() -> {
            final TopLevelSettings fragment = new TopLevelSettings();
            fragment.getArguments().putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY,
                    getHighlightMenuKey());
        showFragment(mMainFragment, R.id.main_content);
            return fragment;
        }, R.id.main_content);

        ((FrameLayout) findViewById(R.id.main_content))
                .getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
@@ -260,9 +266,9 @@ public class SettingsHomepageActivity extends FragmentActivity implements
    }

    private void showSuggestionFragment() {
        final Class<? extends Fragment> fragment = FeatureFactory.getFactory(this)
        final Class<? extends Fragment> fragmentClass = FeatureFactory.getFactory(this)
                .getSuggestionFeatureProvider(this).getContextualSuggestionFragment();
        if (fragment == null) {
        if (fragmentClass == null) {
            return;
        }

@@ -274,28 +280,33 @@ public class SettingsHomepageActivity extends FragmentActivity implements
        // Schedule a timer to show the homepage and hide the suggestion on timeout.
        mHomepageView.postDelayed(() -> showHomepageWithSuggestion(false),
                HOMEPAGE_LOADING_TIMEOUT_MS);
        final FragmentBuilder<?> fragmentBuilder = () -> {
            try {
            showFragment(fragment.getConstructor().newInstance(), R.id.suggestion_content);
            if (mIsEmbeddingActivityEnabled) {
                showFragment(fragment.getConstructor().newInstance(),
                        R.id.two_pane_suggestion_content);
            }
                return fragmentClass.getConstructor().newInstance();
            } catch (Exception e) {
                Log.w(TAG, "Cannot show fragment", e);
            }
            return null;
        };
        showFragment(fragmentBuilder, R.id.suggestion_content);
        if (mIsEmbeddingActivityEnabled) {
            showFragment(fragmentBuilder, R.id.two_pane_suggestion_content);
        }
    }

    private void showFragment(Fragment fragment, int id) {
    private <T extends Fragment> T showFragment(FragmentBuilder<T> fragmentBuilder, int id) {
        final FragmentManager fragmentManager = getSupportFragmentManager();
        final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        final Fragment showFragment = fragmentManager.findFragmentById(id);
        T showFragment = (T) fragmentManager.findFragmentById(id);

        if (showFragment == null) {
            fragmentTransaction.add(id, fragment);
            showFragment = fragmentBuilder.build();
            fragmentTransaction.add(id, showFragment);
        } else {
            fragmentTransaction.show(showFragment);
        }
        fragmentTransaction.commit();
        return showFragment;
    }

    private void launchDeepLinkIntentToRight() {
@@ -365,7 +376,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements
                SplitRule.FINISH_ALWAYS,
                true /* clearTop */);
        ActivityEmbeddingRulesController.registerTwoPanePairRule(this,
                new ComponentName(Settings.class.getPackageName(), Settings.class.getName()),
                new ComponentName(getApplicationContext(), Settings.class),
                targetComponentName,
                targetIntent.getAction(),
                SplitRule.FINISH_ALWAYS,
Loading