SearchTarget/SearchTargetEvent API

Bug: 165869384
Bug: 161599758

TL;DR;;
Also introduce some additional methods for
- all apps start and stop
- metrics logging

Change-Id: I666ff5a27a5f8befdb0db483ebb07344a90e96bc
This commit is contained in:
Hyunyoung Song 2020-08-24 16:38:02 -07:00
parent 767470e756
commit 5191fe9ba0
6 changed files with 164 additions and 13 deletions

View File

@ -25,8 +25,6 @@
<string name="main_process_initializer_class" translatable="false">com.android.quickstep.QuickstepProcessInitializer</string>
<string name="user_event_dispatcher_class" translatable="false">com.android.quickstep.logging.UserEventDispatcherExtension</string>
<string name="model_delegate_class" translatable="false">com.android.launcher3.model.QuickstepModelDelegate</string>
</resources>

View File

@ -79,7 +79,7 @@ public class AllAppsSearchBarController
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (mSearchAlgorithm instanceof PluginWrapper) {
((PluginWrapper) mSearchAlgorithm).runOnPluginIfConnected(
AllAppsSearchPlugin::startedTyping);
AllAppsSearchPlugin::startedSearchSession);
}
}
@ -113,7 +113,13 @@ public class AllAppsSearchBarController
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (FeatureFlags.ENABLE_DEVICE_SEARCH.get()) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
// selectFocusedView should return SearchTargetEvent that is passed onto onClick
if (Launcher.getLauncher(mLauncher).getAppsView().selectFocusedView(v)) {
if (mSearchAlgorithm instanceof PluginWrapper) {
((PluginWrapper) mSearchAlgorithm).runOnPluginIfConnected(plugin -> {
plugin.onClick(false, null);
});
}
return true;
}
}

View File

@ -16,9 +16,9 @@
package com.android.systemui.plugins;
import android.os.Bundle;
import com.android.systemui.plugins.annotations.ProvidesInterface;
import com.android.systemui.plugins.shared.SearchTarget;
import com.android.systemui.plugins.shared.SearchTargetEvent;
import java.util.List;
import java.util.function.Consumer;
@ -29,15 +29,28 @@ import java.util.function.Consumer;
@ProvidesInterface(action = AllAppsSearchPlugin.ACTION, version = AllAppsSearchPlugin.VERSION)
public interface AllAppsSearchPlugin extends Plugin {
String ACTION = "com.android.systemui.action.PLUGIN_ALL_APPS_SEARCH_ACTIONS";
int VERSION = 4;
int VERSION = 5;
/**
* Send signal when user enters all apps.
*/
void startAllAppsSession();
/**
* Send signal when user starts typing.
*/
void startedTyping();
void startedSearchSession();
/**
* Send over the query and get the search results.
*/
void performSearch(String query, Consumer<List<Bundle>> results);
}
void performSearch(String query, Consumer<List<SearchTarget>> results);
void onClick(boolean isTouch, SearchTargetEvent event);
/**
* Send signal when user exits all apps.
*/
void endAllAppsSession();
}

View File

@ -1,4 +0,0 @@
# When changing interface for this plugin OR when increasing version code, please add Alex
# Only add other owners if Alex is not available
per-file AllAppsSearchPlugin.java, globs = set noparent
per-file AllAppsSearchPlugin.java = alexmang@google.com, hyunyoungs@google.com, sunnygoyal@google.com, twickham@google.com

View File

@ -0,0 +1,99 @@
/*
* 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 com.android.systemui.plugins.shared;
import android.content.pm.ShortcutInfo;
import android.os.Bundle;
import java.util.List;
/**
* Used to return all apps search targets.
*/
public class SearchTarget implements Comparable<SearchTarget> {
public enum ViewType {
TOP_HIT(0),
HERO(1),
DETAIL(2),
ROW(3),
ROW_WITH_BUTTON(4),
SLICE(5);
private final int mId;
ViewType(int id) {
mId = id;
}
public int get() {
return mId;
}
}
public enum ItemType {
PLAY_RESULTS(0, "Play Store", ViewType.DETAIL),
SETTINGS_ROW(1, "Settings", ViewType.ROW),
SETTINGS_SLICE(2, "Settings", ViewType.SLICE),
APP(3, "", ViewType.TOP_HIT),
APP_HERO(4, "", ViewType.HERO);
private final int mId;
private final String mTitle;
private final ViewType mViewType;
ItemType(int id, String title, ViewType type) {
mId = id;
mTitle = title;
mViewType = type;
}
public ViewType getViewType() {
return mViewType;
}
public String getTitle() {
return mTitle;
}
public int getId() {
return mId;
}
}
public ItemType type;
public List<ShortcutInfo> shortcuts;
public Bundle bundle;
public float score;
/**
* Constructor to create the search target. Bundle is currently temporary to hold
* search target primitives that cannot be expressed as java primitive objects
* or AOSP native objects.
*
*/
public SearchTarget(ItemType itemType, List<ShortcutInfo> shortcuts,
Bundle bundle, float score) {
this.type = itemType;
this.shortcuts = shortcuts;
this.bundle = bundle;
this.score = score;
}
@Override
public int compareTo(SearchTarget o) {
return Float.compare(o.score, score);
}
}

View File

@ -0,0 +1,39 @@
/*
* 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 com.android.systemui.plugins.shared;
import android.content.pm.ShortcutInfo;
import android.os.Bundle;
/**
* Event used for the feedback loop to the plugin. (and future aiai)
*/
public class SearchTargetEvent {
public SearchTarget.ItemType type;
public ShortcutInfo shortcut;
public Bundle bundle;
public float score;
public SearchTargetEvent(SearchTarget.ItemType itemType,
ShortcutInfo shortcut,
Bundle bundle,
float score) {
this.type = itemType;
this.shortcut = shortcut;
this.bundle = bundle;
this.score = score;
}
}