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

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

Merge "Search experience improvement for large screen" into sc-v2-dev

parents 0ad93a95 e427cc67
Loading
Loading
Loading
Loading
+20 −17
Original line number Diff line number Diff line
@@ -255,7 +255,8 @@ public class SettingsActivity extends SettingsBaseActivity
        // Should happen before any call to getIntent()
        getMetaData();
        final Intent intent = getIntent();
        if (launchHomepageForTwoPaneDeepLink(intent)) {
        if (shouldShowTwoPaneDeepLink(intent)) {
            launchHomepageForTwoPaneDeepLink(intent);
            finishAndRemoveTask();
            return;
        }
@@ -368,16 +369,13 @@ public class SettingsActivity extends SettingsBaseActivity
            intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false);
    }

    /** Returns true if the Activity is started by a deep link intent for large screen devices. */
    private boolean launchHomepageForTwoPaneDeepLink(Intent intent) {
        if (!shouldShowTwoPaneDeepLink(intent)) {
            return false;
        }

    /**
     * Returns the deep link trampoline intent for large screen devices.
     */
    public static Intent getTrampolineIntent(Intent intent, String highlightMenuKey) {
        final Intent detailIntent = new Intent(intent);
        // It's a deep link intent, SettingsHomepageActivity will set SplitPairRule and start it.
        final Intent trampolineIntent = new Intent(ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY);

        trampolineIntent.replaceExtras(detailIntent);

        // Relay detail intent data to prevent failure of Intent#ParseUri.
@@ -391,22 +389,27 @@ public class SettingsActivity extends SettingsBaseActivity
        trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI,
                detailIntent.toUri(Intent.URI_INTENT_SCHEME));

        if (detailIntent.getBooleanExtra(EXTRA_IS_FROM_SLICE, false)) {
            trampolineIntent.setClass(this, SliceDeepLinkHomepageActivity.class);
        trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY,
                highlightMenuKey);
        trampolineIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
        return trampolineIntent;
    }

    private void launchHomepageForTwoPaneDeepLink(Intent intent) {
        final Intent trampolineIntent;
        if (intent.getBooleanExtra(EXTRA_IS_FROM_SLICE, false)) {
            // Get menu key for slice deep link case.
            final String highlightMenuKey = detailIntent.getStringExtra(
            final String highlightMenuKey = intent.getStringExtra(
                    EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY);
            if (!TextUtils.isEmpty(highlightMenuKey)) {
                mHighlightMenuKey = highlightMenuKey;
            }
            trampolineIntent = getTrampolineIntent(intent, mHighlightMenuKey);
            trampolineIntent.setClass(this, SliceDeepLinkHomepageActivity.class);
        } else {
            trampolineIntent = getTrampolineIntent(intent, mHighlightMenuKey);
        }

        trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY,
                mHighlightMenuKey);
        trampolineIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
        startActivity(trampolineIntent);

        return true;
    }

    private boolean shouldShowTwoPaneDeepLink(Intent intent) {
+35 −4
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.FeatureFlagUtils;
import android.util.Log;
import android.view.View;
@@ -54,6 +55,7 @@ import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;

import java.net.URISyntaxException;
import java.util.Set;

/** Settings homepage activity */
public class SettingsHomepageActivity extends FragmentActivity implements
@@ -79,10 +81,27 @@ public class SettingsHomepageActivity extends FragmentActivity implements
    private View mHomepageView;
    private View mSuggestionView;
    private CategoryMixin mCategoryMixin;
    private Set<HomepageLoadedListener> mLoadedListeners;

    @Override
    public CategoryMixin getCategoryMixin() {
        return mCategoryMixin;
    /** A listener receiving homepage loaded events. */
    public interface HomepageLoadedListener {
        /** Called when the homepage is loaded. */
        void onHomepageLoaded();
    }

    /**
     *  Try to register a {@link HomepageLoadedListener}. If homepage is already loaded, the
     *  listener will not be notified.
     *
     *  @return Whether the listener should be registered.
     */
    public boolean registerHomepageLoadedListenerIfNeeded(HomepageLoadedListener listener) {
        if (mHomepageView == null) {
            return false;
        } else {
            mLoadedListeners.add(listener);
            return true;
        }
    }

    /**
@@ -97,17 +116,25 @@ public class SettingsHomepageActivity extends FragmentActivity implements
        mSuggestionView.setVisibility(showSuggestion ? View.VISIBLE : View.GONE);
        mHomepageView.setVisibility(View.VISIBLE);
        mHomepageView = null;
        mLoadedListeners.forEach(listener -> listener.onHomepageLoaded());
        mLoadedListeners.clear();
    }

    @Override
    public CategoryMixin getCategoryMixin() {
        return mCategoryMixin;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((SettingsApplication) getApplication()).setHomeActivity(this);
        setHomeActivity();
        setContentView(R.layout.settings_homepage_container);

        final View appBar = findViewById(R.id.app_bar_container);
        appBar.setMinimumHeight(getSearchBoxHeight());
        initHomepageContainer();
        mLoadedListeners = new ArraySet<>();

        final Toolbar toolbar = findViewById(R.id.search_action_bar);
        FeatureFactory.getFactory(this).getSearchFeatureProvider()
@@ -158,6 +185,10 @@ public class SettingsHomepageActivity extends FragmentActivity implements
        launchDeepLinkIntentToRight();
    }

    protected void setHomeActivity() {
        ((SettingsApplication) getApplication()).setHomeActivity(this);
    }

    private void showSuggestionFragment() {
        final Class<? extends Fragment> fragment = FeatureFactory.getFactory(this)
                .getSuggestionFeatureProvider(this).getContextualSuggestionFragment();
+5 −0
Original line number Diff line number Diff line
@@ -20,6 +20,11 @@ import android.content.ComponentName;

/** Activity for Slices to launch Settings deep link page */
public class SliceDeepLinkHomepageActivity extends SettingsHomepageActivity {
    @Override
    protected void setHomeActivity() {
        // do not overwrite homepage activity in SettingsApplication
    }

    @Override
    protected ComponentName getDeepLinkComponent() {
        return new ComponentName(getApplicationContext(), getClass());
+12 −2
Original line number Diff line number Diff line
@@ -184,6 +184,15 @@ public class TopLevelSettings extends DashboardFragment implements
        }
    }

    /** Disable highlight on the menu entry */
    public void disableMenuHighlight() {
        if (mTopLevelAdapter == null) {
            return;
        }
        mHighlightedPreferenceKey = null;
        mTopLevelAdapter.highlightPreference(mHighlightedPreferenceKey, /* scrollNeeded= */ false);
    }

    @Override
    protected boolean shouldForceRoundedIcon() {
        return getContext().getResources()
@@ -202,7 +211,8 @@ public class TopLevelSettings extends DashboardFragment implements

        Log.d(TAG, "onCreateAdapter, pref key: " + mHighlightedPreferenceKey);
        mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter(
                getActivity(), preferenceScreen, getListView(), mHighlightedPreferenceKey);
                (SettingsHomepageActivity) getActivity(), preferenceScreen, getListView(),
                mHighlightedPreferenceKey);
        return mTopLevelAdapter;
    }

+20 −5
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.settings.search;
import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO;

import android.annotation.NonNull;
import android.app.Activity;
import android.app.ActivityOptions;
import android.content.ComponentName;
import android.content.Context;
@@ -30,8 +29,12 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Toolbar;

import androidx.fragment.app.FragmentActivity;

import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.homepage.TopLevelSettings;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.search.SearchIndexableResources;

@@ -66,7 +69,7 @@ public interface SearchFeatureProvider {
    /**
     * Initializes the search toolbar.
     */
    default void initSearchToolbar(Activity activity, Toolbar toolbar, int pageId) {
    default void initSearchToolbar(FragmentActivity activity, Toolbar toolbar, int pageId) {
        if (activity == null || toolbar == null) {
            return;
        }
@@ -91,7 +94,8 @@ public interface SearchFeatureProvider {

        toolbar.setOnClickListener(tb -> {
            final Context context = activity.getApplicationContext();
            final Intent intent = buildSearchIntent(context, pageId);
            final Intent intent = buildSearchIntent(context, pageId)
                    .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

            if (activity.getPackageManager().queryIntentActivities(intent,
                    PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) {
@@ -103,8 +107,19 @@ public interface SearchFeatureProvider {

            FeatureFactory.getFactory(context).getMetricsFeatureProvider()
                    .logSettingsTileClick(KEY_HOMEPAGE_SEARCH_BAR, pageId);
            final Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(activity).toBundle();

            if (ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) {
                final TopLevelSettings fragment = (TopLevelSettings) activity
                        .getSupportFragmentManager().findFragmentById(R.id.main_content);
                if (fragment != null) {
                    fragment.disableMenuHighlight();
                }
                activity.startActivity(intent);
            } else {
                final Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(activity)
                        .toBundle();
                activity.startActivity(intent, bundle);
            }
        });
    }

Loading