From 3f82135f067eae5f548086fcbd0aba08ac8fd95e Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Thu, 9 Apr 2020 20:14:58 -0700 Subject: [PATCH] Add AllAppsSearchPlugin Bug: 151089843 Change-Id: I6d61fb9c7855bafee731f47147b3070a1b672071 --- res/layout/all_apps_content_layout.xml | 27 ++++++++ src/com/android/launcher3/Launcher.java | 1 + .../allapps/AllAppsTransitionController.java | 63 +++++++++++++++++-- .../launcher3/allapps/SearchUiManager.java | 13 ++++ .../search/AppsSearchContainerLayout.java | 6 ++ .../systemui/plugins/AllAppsSearchPlugin.java | 34 ++++++++++ 6 files changed, 139 insertions(+), 5 deletions(-) create mode 100644 res/layout/all_apps_content_layout.xml create mode 100644 src_plugins/com/android/systemui/plugins/AllAppsSearchPlugin.java diff --git a/res/layout/all_apps_content_layout.xml b/res/layout/all_apps_content_layout.xml new file mode 100644 index 0000000000..5698977e3e --- /dev/null +++ b/res/layout/all_apps_content_layout.xml @@ -0,0 +1,27 @@ + + + + diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index f69940b92e..cb0a0b280d 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1547,6 +1547,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, mOverlayManager.onActivityDestroyed(this); mAppTransitionManager.unregisterRemoteAnimations(); mUserChangedCallbackCloseable.close(); + mAllAppsController.onActivityDestroyed(); } public LauncherAccessibilityDelegate getAccessibilityDelegate() { diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index 68b070617d..071c03d23a 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -1,5 +1,6 @@ package com.android.launcher3.allapps; +import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.ALL_APPS_CONTENT; import static com.android.launcher3.LauncherState.ALL_APPS_HEADER_EXTRA; import static com.android.launcher3.LauncherState.APPS_VIEW_ITEM_MASK; @@ -17,7 +18,10 @@ import static com.android.launcher3.util.SystemUiController.UI_STATE_ALL_APPS; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; +import android.content.Context; import android.util.FloatProperty; +import android.view.View; +import android.view.ViewGroup; import android.view.animation.Interpolator; import com.android.launcher3.DeviceProfile; @@ -30,8 +34,11 @@ import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.anim.PropertySetter; import com.android.launcher3.states.StateAnimationConfig; +import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper; import com.android.launcher3.util.Themes; import com.android.launcher3.views.ScrimView; +import com.android.systemui.plugins.AllAppsSearchPlugin; +import com.android.systemui.plugins.PluginListener; /** * Handles AllApps view transition. @@ -43,7 +50,8 @@ import com.android.launcher3.views.ScrimView; * If release velocity < THRES1, snap according to either top or bottom depending on whether it's * closer to top or closer to the page indicator. */ -public class AllAppsTransitionController implements StateHandler, OnDeviceProfileChangeListener { +public class AllAppsTransitionController implements StateHandler, OnDeviceProfileChangeListener, + PluginListener { public static final FloatProperty ALL_APPS_PROGRESS = new FloatProperty("allAppsProgress") { @@ -79,6 +87,9 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil private float mScrollRangeDelta = 0; + private AllAppsSearchPlugin mPlugin; + private View mPluginContent; + public AllAppsTransitionController(Launcher l) { mLauncher = l; mShiftRange = mLauncher.getDeviceProfile().heightPx; @@ -145,6 +156,7 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil setProgress(state.getVerticalProgress(mLauncher)); setAlphas(state, new StateAnimationConfig(), NO_ANIM_PROPERTY_SETTER); onProgressAnimationEnd(); + updatePlugin(state); } /** @@ -178,6 +190,20 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil builder.add(anim); setAlphas(toState, config, builder); + + updatePlugin(toState); + } + + private void updatePlugin(LauncherState toState) { + if (mPlugin == null) return; + if (toState == ALL_APPS) { + // TODO: change this from toggle event to continuous transition event. + mPlugin.setEditText(mAppsView.getSearchUiManager().setTextSearchEnabled(true)); + } else { + mAppsView.getSearchUiManager().setTextSearchEnabled(false); + mPlugin.setEditText(null); + } + } public Animator createSpringAnimation(float... progressValues) { @@ -196,10 +222,15 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil Interpolator allAppsFade = config.getInterpolator(ANIM_ALL_APPS_FADE, LINEAR); Interpolator headerFade = config.getInterpolator(ANIM_ALL_APPS_HEADER_FADE, allAppsFade); - setter.setViewAlpha(mAppsView.getContentView(), hasAllAppsContent ? 1 : 0, allAppsFade); - setter.setViewAlpha(mAppsView.getScrollBar(), hasAllAppsContent ? 1 : 0, allAppsFade); - mAppsView.getFloatingHeaderView().setContentVisibility(hasHeaderExtra, hasAllAppsContent, - setter, headerFade, allAppsFade); + + if (mPlugin == null) { + setter.setViewAlpha(mAppsView.getContentView(), hasAllAppsContent ? 1 : 0, allAppsFade); + setter.setViewAlpha(mAppsView.getScrollBar(), hasAllAppsContent ? 1 : 0, allAppsFade); + mAppsView.getFloatingHeaderView().setContentVisibility(hasHeaderExtra, + hasAllAppsContent, setter, headerFade, allAppsFade); + } else { + setter.setViewAlpha(mPluginContent, hasAllAppsContent ? 1 : 0, allAppsFade); + } mAppsView.getSearchUiManager().setContentVisibility(visibleElements, setter, allAppsFade); setter.setInt(mScrimView, ScrimView.DRAG_HANDLE_ALPHA, @@ -215,6 +246,8 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil public void setupViews(AllAppsContainerView appsView, ScrimView scrimView) { mAppsView = appsView; mScrimView = scrimView; + PluginManagerWrapper.INSTANCE.get(mLauncher) + .addPluginListener(this, AllAppsSearchPlugin.class, false); } /** @@ -238,4 +271,24 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil mAppsView.reset(false /* animate */); } } + + @Override + public void onPluginConnected(AllAppsSearchPlugin plugin, Context context) { + mPlugin = plugin; + mPluginContent = mLauncher.getLayoutInflater().inflate( + R.layout.all_apps_content_layout, mAppsView, false); + mAppsView.addView(mPluginContent); + mPluginContent.setAlpha(0f); + mPlugin.setup((ViewGroup) mPluginContent); + } + + @Override + public void onPluginDisconnected(AllAppsSearchPlugin plugin) { + mPlugin = null; + mAppsView.removeView(mPluginContent); + } + + public void onActivityDestroyed() { + PluginManagerWrapper.INSTANCE.get(mLauncher).removePluginListener(this); + } } diff --git a/src/com/android/launcher3/allapps/SearchUiManager.java b/src/com/android/launcher3/allapps/SearchUiManager.java index cf9a0884bd..34bf636cb4 100644 --- a/src/com/android/launcher3/allapps/SearchUiManager.java +++ b/src/com/android/launcher3/allapps/SearchUiManager.java @@ -18,6 +18,9 @@ package com.android.launcher3.allapps; import android.graphics.Rect; import android.view.KeyEvent; import android.view.animation.Interpolator; +import android.widget.EditText; + +import androidx.annotation.Nullable; import com.android.launcher3.anim.PropertySetter; @@ -52,4 +55,14 @@ public interface SearchUiManager { */ void setContentVisibility(int visibleElements, PropertySetter setter, Interpolator interpolator); + + /** + * Called to control how the search UI result should be handled. + * + * @param isEnabled when {@code true}, the search is all handled inside AOSP + * and is not overlayable. + * @return the searchbox edit text object + */ + @Nullable + EditText setTextSearchEnabled(boolean isEnabled); } diff --git a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java index 9e3a862263..e72e1a8bc1 100644 --- a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java +++ b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java @@ -33,6 +33,7 @@ import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup.MarginLayoutParams; import android.view.animation.Interpolator; +import android.widget.EditText; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.DeviceProfile; @@ -214,4 +215,9 @@ public class AppsSearchContainerLayout extends ExtendedEditText Interpolator interpolator) { setter.setViewAlpha(this, (visibleElements & ALL_APPS_HEADER) != 0 ? 1 : 0, interpolator); } + + @Override + public EditText setTextSearchEnabled(boolean isEnabled) { + return this; + } } diff --git a/src_plugins/com/android/systemui/plugins/AllAppsSearchPlugin.java b/src_plugins/com/android/systemui/plugins/AllAppsSearchPlugin.java new file mode 100644 index 0000000000..b865a20909 --- /dev/null +++ b/src_plugins/com/android/systemui/plugins/AllAppsSearchPlugin.java @@ -0,0 +1,34 @@ +/* + * 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; + +import android.view.ViewGroup; +import android.widget.EditText; + +import com.android.systemui.plugins.annotations.ProvidesInterface; + +/** + * Implement this plugin interface to add a row of views to the top of the all apps drawer. + */ +@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 = 1; + + void setup(ViewGroup parent); + void setEditText(EditText editText); +}