diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 5e5f3871782ca..179c50879e8c9 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -1647,6 +1647,7 @@ package android.app.cloudsearch { method public int getResultNumber(); method public int getResultOffset(); method @NonNull public android.os.Bundle getSearchConstraints(); + method @NonNull public String getSource(); method public void writeToParcel(@NonNull android.os.Parcel, int); field public static final String CONSTRAINT_IS_PRESUBMIT_SUGGESTION = "IS_PRESUBMIT_SUGGESTION"; field public static final String CONSTRAINT_SEARCH_PROVIDER_FILTER = "SEARCH_PROVIDER_FILTER"; diff --git a/core/api/test-current.txt b/core/api/test-current.txt index bcba21b0b351e..9634252939102 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -605,6 +605,14 @@ package android.app.blob { } +package android.app.cloudsearch { + + public static final class SearchRequest.Builder { + method @NonNull public android.app.cloudsearch.SearchRequest.Builder setSource(@NonNull String); + } + +} + package android.app.contentsuggestions { public final class ContentSuggestionsManager { diff --git a/core/java/android/app/cloudsearch/SearchRequest.java b/core/java/android/app/cloudsearch/SearchRequest.java index 0c5c30c23d7bc..ef66c0cf9a442 100644 --- a/core/java/android/app/cloudsearch/SearchRequest.java +++ b/core/java/android/app/cloudsearch/SearchRequest.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.StringDef; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -91,6 +92,14 @@ public final class SearchRequest implements Parcelable { @NonNull private Bundle mSearchConstraints; + /** Auto set by system servier, and the caller cannot set it. + * + * The caller's package name. + * + */ + @NonNull + private String mSource; + private SearchRequest(Parcel in) { this.mQuery = in.readString(); this.mResultOffset = in.readInt(); @@ -98,15 +107,17 @@ public final class SearchRequest implements Parcelable { this.mMaxLatencyMillis = in.readFloat(); this.mSearchConstraints = in.readBundle(); this.mId = in.readString(); + this.mSource = in.readString(); } private SearchRequest(String query, int resultOffset, int resultNumber, float maxLatencyMillis, - Bundle searchConstraints) { + Bundle searchConstraints, String source) { mQuery = query; mResultOffset = resultOffset; mResultNumber = resultNumber; mMaxLatencyMillis = maxLatencyMillis; mSearchConstraints = searchConstraints; + mSource = source; } /** Returns the original query. */ @@ -136,35 +147,37 @@ public final class SearchRequest implements Parcelable { return mSearchConstraints; } + /** Gets the caller's package name. */ + @NonNull + public String getSource() { + return mSource; + } + /** Returns the search request id, which is used to identify the request. */ @NonNull public String getRequestId() { if (mId == null || mId.length() == 0) { - boolean isPresubmit = - mSearchConstraints.containsKey(CONSTRAINT_IS_PRESUBMIT_SUGGESTION) - && mSearchConstraints.getBoolean(CONSTRAINT_IS_PRESUBMIT_SUGGESTION); - - String searchProvider = "EMPTY"; - if (mSearchConstraints.containsKey(CONSTRAINT_SEARCH_PROVIDER_FILTER)) { - searchProvider = mSearchConstraints.getString(CONSTRAINT_SEARCH_PROVIDER_FILTER); - } - - String rawContent = String.format("%s\t%d\t%d\t%f\t%b\t%s", - mQuery, mResultOffset, mResultNumber, mMaxLatencyMillis, - isPresubmit, searchProvider); - - mId = String.valueOf(rawContent.hashCode()); + mId = String.valueOf(toString().hashCode()); } return mId; } + /** Sets the caller, and this will be set by the system server. + * + * @hide + */ + public void setSource(@NonNull String source) { + this.mSource = source; + } + private SearchRequest(Builder b) { mQuery = requireNonNull(b.mQuery); mResultOffset = b.mResultOffset; mResultNumber = b.mResultNumber; mMaxLatencyMillis = b.mMaxLatencyMillis; mSearchConstraints = requireNonNull(b.mSearchConstraints); + mSource = requireNonNull(b.mSource); } /** @@ -192,6 +205,7 @@ public final class SearchRequest implements Parcelable { dest.writeFloat(this.mMaxLatencyMillis); dest.writeBundle(this.mSearchConstraints); dest.writeString(getRequestId()); + dest.writeString(this.mSource); } @Override @@ -214,13 +228,30 @@ public final class SearchRequest implements Parcelable { && mResultOffset == that.mResultOffset && mResultNumber == that.mResultNumber && mMaxLatencyMillis == that.mMaxLatencyMillis - && Objects.equals(mSearchConstraints, that.mSearchConstraints); + && Objects.equals(mSearchConstraints, that.mSearchConstraints) + && Objects.equals(mSource, that.mSource); + } + + @Override + public String toString() { + boolean isPresubmit = + mSearchConstraints.containsKey(CONSTRAINT_IS_PRESUBMIT_SUGGESTION) + && mSearchConstraints.getBoolean(CONSTRAINT_IS_PRESUBMIT_SUGGESTION); + + String searchProvider = "EMPTY"; + if (mSearchConstraints.containsKey(CONSTRAINT_SEARCH_PROVIDER_FILTER)) { + searchProvider = mSearchConstraints.getString(CONSTRAINT_SEARCH_PROVIDER_FILTER); + } + + return String.format("SearchRequest: {query:%s,offset:%d;number:%d;max_latency:%f;" + + "is_presubmit:%b;search_provider:%s;source:%s}", mQuery, mResultOffset, + mResultNumber, mMaxLatencyMillis, isPresubmit, searchProvider, mSource); } @Override public int hashCode() { return Objects.hash(mQuery, mResultOffset, mResultNumber, mMaxLatencyMillis, - mSearchConstraints); + mSearchConstraints, mSource); } /** @@ -235,6 +266,7 @@ public final class SearchRequest implements Parcelable { private int mResultNumber; private float mMaxLatencyMillis; private Bundle mSearchConstraints; + private String mSource; /** * @@ -250,6 +282,7 @@ public final class SearchRequest implements Parcelable { mResultNumber = 10; mMaxLatencyMillis = 200; mSearchConstraints = Bundle.EMPTY; + mSource = "DEFAULT_CALLER"; } /** Sets the input query. */ @@ -288,6 +321,17 @@ public final class SearchRequest implements Parcelable { return this; } + /** Sets the caller, and this will be set by the system server. + * + * @hide + */ + @NonNull + @TestApi + public Builder setSource(@NonNull String source) { + this.mSource = source; + return this; + } + /** Builds a SearchRequest based-on the given params. */ @NonNull public SearchRequest build() { @@ -297,7 +341,7 @@ public final class SearchRequest implements Parcelable { } return new SearchRequest(mQuery, mResultOffset, mResultNumber, mMaxLatencyMillis, - mSearchConstraints); + mSearchConstraints, mSource); } } } diff --git a/services/cloudsearch/java/com/android/server/cloudsearch/CloudSearchManagerService.java b/services/cloudsearch/java/com/android/server/cloudsearch/CloudSearchManagerService.java index dafe7a470de0b..daead0a5ff9d8 100644 --- a/services/cloudsearch/java/com/android/server/cloudsearch/CloudSearchManagerService.java +++ b/services/cloudsearch/java/com/android/server/cloudsearch/CloudSearchManagerService.java @@ -58,11 +58,14 @@ public class CloudSearchManagerService extends private final ActivityTaskManagerInternal mActivityTaskManagerInternal; + private final Context mContext; + public CloudSearchManagerService(Context context) { super(context, new FrameworkResourcesServiceNameResolver(context, R.string.config_defaultCloudSearchService), null, PACKAGE_UPDATE_POLICY_NO_REFRESH | PACKAGE_RESTART_POLICY_NO_REFRESH); mActivityTaskManagerInternal = LocalServices.getService(ActivityTaskManagerInternal.class); + mContext = context; } @Override @@ -106,6 +109,8 @@ public class CloudSearchManagerService extends @Override public void search(@NonNull SearchRequest searchRequest, @NonNull ICloudSearchManagerCallback callBack) { + searchRequest.setSource( + mContext.getPackageManager().getNameForUid(Binder.getCallingUid())); runForUserLocked("search", searchRequest.getRequestId(), (service) -> service.onSearchLocked(searchRequest, callBack)); }