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

Commit beedd3ab authored by Fan Zhang's avatar Fan Zhang
Browse files

Add referrer when launching search intent.

Bug: 123294739
Test: robotests
Change-Id: I600abf1d764e828d52f3b8d35ad24cdc94dfba01
parent c52a581b
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settings;

import android.app.ActionBar;
import android.app.ActivityManager;
import android.app.settings.SettingsEnums;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -287,7 +288,7 @@ public class SettingsActivity extends SettingsBaseActivity
            final Toolbar toolbar = findViewById(R.id.search_action_bar);
            setActionBar(toolbar);
            FeatureFactory.getFactory(this).getSearchFeatureProvider()
                    .initSearchToolbar(this, toolbar);
                    .initSearchToolbar(this, toolbar, SettingsEnums.SETTINGS_HOMEPAGE);
        }

        ActionBar actionBar = getActionBar();
+2 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.settings.homepage;

import android.app.settings.SettingsEnums;
import android.content.Intent;
import android.os.Bundle;
import android.util.FeatureFlagUtils;
@@ -53,7 +54,7 @@ public class SettingsHomepageActivity extends SettingsBaseActivity {

        final Toolbar toolbar = findViewById(R.id.search_action_bar);
        FeatureFactory.getFactory(this).getSearchFeatureProvider()
                .initSearchToolbar(this /* activity */, toolbar);
                .initSearchToolbar(this /* activity */, toolbar, SettingsEnums.SETTINGS_HOMEPAGE);

        final ImageView avatarView = findViewById(R.id.account_avatar);
        final AvatarViewMixin avatarViewMixin = new AvatarViewMixin(this, avatarView);
+5 −6
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.provider.Settings;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toolbar;
@@ -40,7 +39,6 @@ import com.android.settingslib.search.SearchIndexableResources;
 */
public interface SearchFeatureProvider {

    Intent SEARCH_UI_INTENT = new Intent(Settings.ACTION_APP_SEARCH_SETTINGS);
    int REQUEST_CODE = 0;

    /**
@@ -64,7 +62,7 @@ public interface SearchFeatureProvider {
    /**
     * Initializes the search toolbar.
     */
    default void initSearchToolbar(Activity activity, Toolbar toolbar) {
    default void initSearchToolbar(Activity activity, Toolbar toolbar, int pageId) {
        if (activity == null || toolbar == null) {
            return;
        }
@@ -87,9 +85,8 @@ public interface SearchFeatureProvider {
        navView.setBackground(null);

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

            if (activity.getPackageManager().queryIntentActivities(intent,
                    PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) {
@@ -97,10 +94,12 @@ public interface SearchFeatureProvider {
            }

            FeatureFactory.getFactory(context).getSlicesFeatureProvider()
                    .indexSliceDataAsync(activity.getApplicationContext());
                    .indexSliceDataAsync(context);
            FeatureFactory.getFactory(context).getMetricsFeatureProvider()
                    .action(context, SettingsEnums.ACTION_SEARCH_RESULTS);
            activity.startActivityForResult(intent, REQUEST_CODE);
        });
    }

    Intent buildSearchIntent(Context context, int pageId);
}
+18 −0
Original line number Diff line number Diff line
@@ -19,6 +19,9 @@ package com.android.settings.search;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;
import android.text.TextUtils;

import com.android.settingslib.search.SearchIndexableResources;
@@ -59,7 +62,22 @@ public class SearchFeatureProviderImpl implements SearchFeatureProvider {
        return mSearchIndexableResources;
    }

    @Override
    public Intent buildSearchIntent(Context context, int pageId) {
        return new Intent(Settings.ACTION_APP_SEARCH_SETTINGS)
                .setPackage(getSettingsIntelligencePkgName(context))
                .putExtra(Intent.EXTRA_REFERRER, buildReferrer(context, pageId));
    }

    protected boolean isSignatureWhitelisted(Context context, String callerPackage) {
        return false;
    }

    private static Uri buildReferrer(Context context, int pageId) {
        return new Uri.Builder()
                .scheme("android-app")
                .authority(context.getPackageName())
                .path(String.valueOf(pageId))
                .build();
    }
}
+14 −10
Original line number Diff line number Diff line
@@ -30,11 +30,10 @@ import androidx.fragment.app.Fragment;

import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.ObservableFragment;
import com.android.settingslib.core.lifecycle.ObservablePreferenceFragment;
import com.android.settingslib.core.lifecycle.events.OnCreateOptionsMenu;

public class SearchMenuController implements LifecycleObserver, OnCreateOptionsMenu {
@@ -42,17 +41,21 @@ public class SearchMenuController implements LifecycleObserver, OnCreateOptionsM
    public static final String NEED_SEARCH_ICON_IN_ACTION_BAR = "need_search_icon_in_action_bar";

    private final Fragment mHost;
    private final int mPageId;

    public static void init(@NonNull ObservablePreferenceFragment host) {
        host.getSettingsLifecycle().addObserver(new SearchMenuController(host));
    public static void init(@NonNull InstrumentedPreferenceFragment host) {
        host.getSettingsLifecycle().addObserver(
                new SearchMenuController(host, host.getMetricsCategory()));
    }

    public static void init(@NonNull ObservableFragment host) {
        host.getSettingsLifecycle().addObserver(new SearchMenuController(host));
    public static void init(@NonNull InstrumentedFragment host) {
        host.getSettingsLifecycle().addObserver(
                new SearchMenuController(host, host.getMetricsCategory()));
    }

    private SearchMenuController(@NonNull Fragment host) {
    private SearchMenuController(@NonNull Fragment host, int pageId) {
        mHost = host;
        mPageId = pageId;
    }

    @Override
@@ -79,8 +82,9 @@ public class SearchMenuController implements LifecycleObserver, OnCreateOptionsM
        searchItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

        searchItem.setOnMenuItemClickListener(target -> {
            final Intent intent = SearchFeatureProvider.SEARCH_UI_INTENT;
            intent.setPackage(SettingsIntelligencePkgName);
            final Intent intent = FeatureFactory.getFactory(context)
                    .getSearchFeatureProvider()
                    .buildSearchIntent(context, mPageId);

            if (context.getPackageManager().queryIntentActivities(intent,
                    PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) {
Loading