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

Commit 21e60a9d authored by Hyunyoung Song's avatar Hyunyoung Song
Browse files

Add Initial SearchUIManager

Bug:162234997

Test: builds, locally ran cts tests

CTS tests: ag/13129468

[Meeting notes with Svet/Sunny/Winson] go/aaplus-search-api
[Design diagrams] go/aaplus-search-supl

Change-Id: I4589cd411e124dc9d7ea132a71651f6b9f9656ae
parent b1ecff76
Loading
Loading
Loading
Loading
+146 −0
Original line number Diff line number Diff line
@@ -129,6 +129,7 @@ package android {
    field public static final String MANAGE_ONE_TIME_PERMISSION_SESSIONS = "android.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS";
    field public static final String MANAGE_ROLE_HOLDERS = "android.permission.MANAGE_ROLE_HOLDERS";
    field public static final String MANAGE_ROLLBACKS = "android.permission.MANAGE_ROLLBACKS";
    field public static final String MANAGE_SEARCH_UI = "android.permission.MANAGE_SEARCH_UI";
    field public static final String MANAGE_SENSOR_PRIVACY = "android.permission.MANAGE_SENSOR_PRIVACY";
    field public static final String MANAGE_SOUND_TRIGGER = "android.permission.MANAGE_SOUND_TRIGGER";
    field public static final String MANAGE_SUBSCRIPTION_PLANS = "android.permission.MANAGE_SUBSCRIPTION_PLANS";
@@ -1385,6 +1386,137 @@ package android.app.role {
}
package android.app.search {
  public final class Query implements android.os.Parcelable {
    ctor public Query(@NonNull String, long, @Nullable android.os.Bundle);
    method public int describeContents();
    method @Nullable public android.os.Bundle getExtras();
    method @NonNull public String getInput();
    method @NonNull public long getTimestamp();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.search.Query> CREATOR;
  }
  public final class SearchAction implements android.os.Parcelable {
    method public int describeContents();
    method @Nullable public CharSequence getContentDescription();
    method @Nullable public android.os.Bundle getExtras();
    method @Nullable public android.graphics.drawable.Icon getIcon();
    method @NonNull public String getId();
    method @Nullable public android.content.Intent getIntent();
    method @Nullable public android.app.PendingIntent getPendingIntent();
    method @Nullable public CharSequence getSubtitle();
    method @NonNull public CharSequence getTitle();
    method @Nullable public android.os.UserHandle getUserHandle();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.search.SearchAction> CREATOR;
  }
  public static final class SearchAction.Builder {
    ctor public SearchAction.Builder(@NonNull String, @NonNull String);
    method @NonNull public android.app.search.SearchAction build();
    method @NonNull public android.app.search.SearchAction.Builder setContentDescription(@Nullable CharSequence);
    method @NonNull public android.app.search.SearchAction.Builder setExtras(@Nullable android.os.Bundle);
    method @NonNull public android.app.search.SearchAction.Builder setIcon(@Nullable android.graphics.drawable.Icon);
    method @NonNull public android.app.search.SearchAction.Builder setIntent(@Nullable android.content.Intent);
    method @NonNull public android.app.search.SearchAction.Builder setPendingIntent(@Nullable android.app.PendingIntent);
    method @NonNull public android.app.search.SearchAction.Builder setSubtitle(@Nullable CharSequence);
    method @NonNull public android.app.search.SearchAction.Builder setUserHandle(@Nullable android.os.UserHandle);
  }
  public final class SearchContext implements android.os.Parcelable {
    ctor public SearchContext(int, int, @Nullable android.os.Bundle);
    method public int describeContents();
    method @Nullable public android.os.Bundle getExtras();
    method @Nullable public String getPackageName();
    method @NonNull public int getResultTypes();
    method @NonNull public int getTimeoutMillis();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.search.SearchContext> CREATOR;
  }
  public final class SearchSession implements java.lang.AutoCloseable {
    method public void close();
    method public void destroy();
    method protected void finalize();
    method public void notifyEvent(@NonNull android.app.search.Query, @NonNull android.app.search.SearchTargetEvent);
    method @Nullable public void query(@NonNull android.app.search.Query, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.util.List<android.app.search.SearchTarget>>);
  }
  public final class SearchSessionId implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.search.SearchSessionId> CREATOR;
  }
  public final class SearchTarget implements android.os.Parcelable {
    method public int describeContents();
    method @Nullable public android.appwidget.AppWidgetProviderInfo getAppWidgetProviderInfo();
    method @Nullable public android.os.Bundle getExtras();
    method @NonNull public String getId();
    method @NonNull public String getLayoutType();
    method @NonNull public String getPackageName();
    method @NonNull public String getParentId();
    method public int getResultType();
    method public float getScore();
    method @Nullable public android.app.search.SearchAction getSearchAction();
    method @Nullable public android.content.pm.ShortcutInfo getShortcutInfo();
    method @Nullable public android.net.Uri getSliceUri();
    method @NonNull public android.os.UserHandle getUserHandle();
    method public boolean shouldHide();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.search.SearchTarget> CREATOR;
  }
  public static final class SearchTarget.Builder {
    ctor public SearchTarget.Builder(int, @NonNull String, @NonNull String);
    method @NonNull public android.app.search.SearchTarget build();
    method @NonNull public android.app.search.SearchTarget.Builder setAppWidgetProviderInfo(@NonNull android.appwidget.AppWidgetProviderInfo);
    method @NonNull public android.app.search.SearchTarget.Builder setExtras(@Nullable android.os.Bundle);
    method @NonNull public android.app.search.SearchTarget.Builder setPackageName(@NonNull String);
    method @NonNull public android.app.search.SearchTarget.Builder setParentId(@NonNull String);
    method @NonNull public android.app.search.SearchTarget.Builder setScore(float);
    method @NonNull public android.app.search.SearchTarget.Builder setSearchAction(@Nullable android.app.search.SearchAction);
    method @NonNull public android.app.search.SearchTarget.Builder setShortcutInfo(@NonNull android.content.pm.ShortcutInfo);
    method @NonNull public android.app.search.SearchTarget.Builder setShouldHide(boolean);
    method @NonNull public android.app.search.SearchTarget.Builder setSliceUri(@NonNull android.net.Uri);
    method @NonNull public android.app.search.SearchTarget.Builder setUserHandle(@NonNull android.os.UserHandle);
  }
  public final class SearchTargetEvent implements android.os.Parcelable {
    method public int describeContents();
    method public int getAction();
    method public int getFlags();
    method @Nullable public String getLaunchLocation();
    method @NonNull public String getTargetId();
    method @NonNull public java.util.List<java.lang.String> getTargetIds();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field public static final int ACTION_DRAGNDROP = 7; // 0x7
    field public static final int ACTION_LAUNCH_KEYBOARD_FOCUS = 6; // 0x6
    field public static final int ACTION_LAUNCH_TOUCH = 5; // 0x5
    field public static final int ACTION_LONGPRESS = 4; // 0x4
    field public static final int ACTION_SURFACE_INVISIBLE = 8; // 0x8
    field public static final int ACTION_SURFACE_VISIBLE = 1; // 0x1
    field public static final int ACTION_TAP = 3; // 0x3
    field @NonNull public static final android.os.Parcelable.Creator<android.app.search.SearchTargetEvent> CREATOR;
    field public static final int FLAG_IME_SHOWN = 1; // 0x1
  }
  public static final class SearchTargetEvent.Builder {
    ctor public SearchTargetEvent.Builder(@NonNull String, int);
    ctor public SearchTargetEvent.Builder(@NonNull java.util.List<java.lang.String>, int);
    method @NonNull public android.app.search.SearchTargetEvent build();
    method @NonNull public android.app.search.SearchTargetEvent.Builder setFlags(int);
    method @NonNull public android.app.search.SearchTargetEvent.Builder setLaunchLocation(@Nullable String);
  }
  public final class SearchUiManager {
    method @NonNull public android.app.search.SearchSession createSearchSession(@NonNull android.app.search.SearchContext);
  }
}
package android.app.time {
  public final class TimeManager {
@@ -1805,6 +1937,7 @@ package android.content {
    field public static final String PERMISSION_SERVICE = "permission";
    field public static final String PERSISTENT_DATA_BLOCK_SERVICE = "persistent_data_block";
    field public static final String ROLLBACK_SERVICE = "rollback";
    field public static final String SEARCH_UI_SERVICE = "search_ui";
    field public static final String SECURE_ELEMENT_SERVICE = "secure_element";
    field public static final String STATS_MANAGER = "stats";
    field public static final String STATUS_BAR_SERVICE = "statusbar";
@@ -9589,6 +9722,19 @@ package android.service.resolver {
}
package android.service.search {
  public abstract class SearchUiService extends android.app.Service {
    ctor public SearchUiService();
    method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent);
    method public void onCreateSearchSession(@NonNull android.app.search.SearchContext, @NonNull android.app.search.SearchSessionId);
    method @MainThread public abstract void onDestroy(@NonNull android.app.search.SearchSessionId);
    method @MainThread public abstract void onNotifyEvent(@NonNull android.app.search.SearchSessionId, @NonNull android.app.search.Query, @NonNull android.app.search.SearchTargetEvent);
    method @MainThread public abstract void onQuery(@NonNull android.app.search.SearchSessionId, @NonNull android.app.search.Query, @NonNull java.util.function.Consumer<java.util.List<android.app.search.SearchTarget>>);
  }
}
package android.service.settings.suggestions {
  public final class Suggestion implements android.os.Parcelable {
+10 −0
Original line number Diff line number Diff line
@@ -19,6 +19,10 @@ GenericException: android.service.autofill.augmented.FillWindow#finalize():
    


IntentBuilderName: android.app.search.SearchAction#getIntent():
    


KotlinKeyword: android.app.Notification#when:
    

@@ -248,3 +252,9 @@ SamShouldBeLast: android.view.accessibility.AccessibilityManager#addTouchExplora
    
SamShouldBeLast: android.webkit.WebChromeClient#onShowFileChooser(android.webkit.WebView, android.webkit.ValueCallback<android.net.Uri[]>, android.webkit.WebChromeClient.FileChooserParams):
    


UserHandleName: android.app.search.SearchAction.Builder#setUserHandle(android.os.UserHandle):
    Method taking UserHandle should be named `doFooAsUser` or `queryFooForUser`, was `setUserHandle`
UserHandleName: android.app.search.SearchTarget.Builder#setUserHandle(android.os.UserHandle):
    
+11 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.app.job.JobSchedulerFrameworkInitializer;
import android.app.prediction.AppPredictionManager;
import android.app.role.RoleControllerManager;
import android.app.role.RoleManager;
import android.app.search.SearchUiManager;
import android.app.slice.SliceManager;
import android.app.time.TimeManager;
import android.app.timedetector.TimeDetector;
@@ -1172,6 +1173,16 @@ public final class SystemServiceRegistry {
                return null;
            }});

        registerService(Context.SEARCH_UI_SERVICE, SearchUiManager.class,
            new CachedServiceFetcher<SearchUiManager>() {
                @Override
                public SearchUiManager createService(ContextImpl ctx)
                    throws ServiceNotFoundException {
                    IBinder b = ServiceManager.getService(Context.SEARCH_UI_SERVICE);
                    return b == null ? null : new SearchUiManager(ctx);
                }
            });

        registerService(Context.APP_PREDICTION_SERVICE, AppPredictionManager.class,
                new CachedServiceFetcher<AppPredictionManager>() {
            @Override
+27 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.app.search;

import android.content.pm.ParceledListSlice;

/**
 * @hide
 */
oneway interface ISearchCallback {

    void onResult(in ParceledListSlice result);
}
+40 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.app.search;

import android.app.search.Query;
import android.app.search.SearchTarget;
import android.app.search.SearchTargetEvent;
import android.app.search.SearchSessionId;
import android.app.search.SearchContext;
import android.app.search.ISearchCallback;
import android.content.pm.ParceledListSlice;

/**
 * @hide
 */
interface ISearchUiManager {

    void createSearchSession(in SearchContext context, in SearchSessionId sessionId,
            in IBinder token);

    void query(in SearchSessionId sessionId, in Query input, in ISearchCallback callback);

    void notifyEvent(in SearchSessionId sessionId, in Query input, in SearchTargetEvent event);

    void destroySearchSession(in SearchSessionId sessionId);
}
Loading