Merge "Add AllAppsRow plugin interface" into ub-launcher3-master

This commit is contained in:
Tony Wickham 2018-10-17 20:47:51 +00:00 committed by Android (Google) Code Review
commit a937981b87
5 changed files with 125 additions and 8 deletions

View File

@ -53,7 +53,6 @@ LOCAL_SRC_FILES := \
LOCAL_SDK_VERSION := current LOCAL_SDK_VERSION := current
LOCAL_MIN_SDK_VERSION := 28 LOCAL_MIN_SDK_VERSION := 28
LOCAL_MODULE := LauncherPluginLib LOCAL_MODULE := LauncherPluginLib
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_STATIC_JAVA_LIBRARY) include $(BUILD_STATIC_JAVA_LIBRARY)
@ -69,7 +68,7 @@ LOCAL_STATIC_ANDROID_LIBRARIES := \
androidx.recyclerview_recyclerview \ androidx.recyclerview_recyclerview \
androidx.dynamicanimation_dynamicanimation androidx.dynamicanimation_dynamicanimation
LOCAL_STATIC_JAVA_LIBRARIES := libPluginCore LOCAL_STATIC_JAVA_LIBRARIES := LauncherPluginLib
LOCAL_SRC_FILES := \ LOCAL_SRC_FILES := \
$(call all-proto-files-under, protos) \ $(call all-proto-files-under, protos) \

View File

@ -43,7 +43,12 @@ public class PluginManagerWrapper {
} }
public void addPluginListener(PluginListener<? extends Plugin> listener, Class<?> pluginClass) { public void addPluginListener(PluginListener<? extends Plugin> listener, Class<?> pluginClass) {
mPluginManager.addPluginListener(listener, pluginClass); addPluginListener(listener, pluginClass, false);
}
public void addPluginListener(PluginListener<? extends Plugin> listener, Class<?> pluginClass,
boolean allowMultiple) {
mPluginManager.addPluginListener(listener, pluginClass, allowMultiple);
} }
public void removePluginListener(PluginListener<? extends Plugin> listener) { public void removePluginListener(PluginListener<? extends Plugin> listener) {

View File

@ -25,16 +25,22 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import com.android.launcher3.R;
import com.android.launcher3.anim.PropertySetter;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.android.launcher3.R;
import com.android.launcher3.anim.PropertySetter;
import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
import com.android.systemui.plugins.AllAppsRow;
import com.android.systemui.plugins.PluginListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FloatingHeaderView extends LinearLayout implements public class FloatingHeaderView extends LinearLayout implements
ValueAnimator.AnimatorUpdateListener { ValueAnimator.AnimatorUpdateListener, PluginListener<AllAppsRow> {
private final Rect mClip = new Rect(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE); private final Rect mClip = new Rect(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE);
private final ValueAnimator mAnimator = ValueAnimator.ofInt(0, 0); private final ValueAnimator mAnimator = ValueAnimator.ofInt(0, 0);
@ -64,6 +70,9 @@ public class FloatingHeaderView extends LinearLayout implements
private AllAppsRecyclerView mMainRV; private AllAppsRecyclerView mMainRV;
private AllAppsRecyclerView mWorkRV; private AllAppsRecyclerView mWorkRV;
private AllAppsRecyclerView mCurrentRV; private AllAppsRecyclerView mCurrentRV;
protected final Map<AllAppsRow, View> mPluginRows;
// Contains just the values of the above map so we can iterate without extracting a new list.
protected final List<View> mPluginRowViews;
private ViewGroup mParent; private ViewGroup mParent;
private boolean mHeaderCollapsed; private boolean mHeaderCollapsed;
private int mSnappedScrolledY; private int mSnappedScrolledY;
@ -82,6 +91,8 @@ public class FloatingHeaderView extends LinearLayout implements
public FloatingHeaderView(@NonNull Context context, @Nullable AttributeSet attrs) { public FloatingHeaderView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs); super(context, attrs);
mPluginRows = new HashMap<>();
mPluginRowViews = new ArrayList<>();
} }
@Override @Override
@ -90,6 +101,38 @@ public class FloatingHeaderView extends LinearLayout implements
mTabLayout = findViewById(R.id.tabs); mTabLayout = findViewById(R.id.tabs);
} }
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
PluginManagerWrapper.INSTANCE.get(getContext()).addPluginListener(this,
AllAppsRow.class, true /* allowMultiple */);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
PluginManagerWrapper.INSTANCE.get(getContext()).removePluginListener(this);
}
@Override
public void onPluginConnected(AllAppsRow allAppsRowPlugin, Context context) {
mPluginRows.put(allAppsRowPlugin, null);
setupPluginRows();
allAppsRowPlugin.setOnHeightUpdatedListener(this::onPluginRowHeightUpdated);
}
protected void onPluginRowHeightUpdated() {
}
@Override
public void onPluginDisconnected(AllAppsRow plugin) {
View pluginRowView = mPluginRows.get(plugin);
removeView(pluginRowView);
mPluginRows.remove(plugin);
mPluginRowViews.remove(pluginRowView);
onPluginRowHeightUpdated();
}
public void setup(AllAppsContainerView.AdapterHolder[] mAH, boolean tabsHidden) { public void setup(AllAppsContainerView.AdapterHolder[] mAH, boolean tabsHidden) {
mTabsHidden = tabsHidden; mTabsHidden = tabsHidden;
mTabLayout.setVisibility(tabsHidden ? View.GONE : View.VISIBLE); mTabLayout.setVisibility(tabsHidden ? View.GONE : View.VISIBLE);
@ -97,9 +140,24 @@ public class FloatingHeaderView extends LinearLayout implements
mWorkRV = setupRV(mWorkRV, mAH[AllAppsContainerView.AdapterHolder.WORK].recyclerView); mWorkRV = setupRV(mWorkRV, mAH[AllAppsContainerView.AdapterHolder.WORK].recyclerView);
mParent = (ViewGroup) mMainRV.getParent(); mParent = (ViewGroup) mMainRV.getParent();
setMainActive(mMainRVActive || mWorkRV == null); setMainActive(mMainRVActive || mWorkRV == null);
setupPluginRows();
reset(false); reset(false);
} }
private void setupPluginRows() {
for (Map.Entry<AllAppsRow, View> rowPluginEntry : mPluginRows.entrySet()) {
if (rowPluginEntry.getValue() == null) {
View pluginRow = rowPluginEntry.getKey().setup(this);
addView(pluginRow, indexOfChild(mTabLayout));
rowPluginEntry.setValue(pluginRow);
mPluginRowViews.add(pluginRow);
}
}
for (View plugin : mPluginRowViews) {
plugin.setVisibility(mHeaderCollapsed ? GONE : VISIBLE);
}
}
private AllAppsRecyclerView setupRV(AllAppsRecyclerView old, AllAppsRecyclerView updated) { private AllAppsRecyclerView setupRV(AllAppsRecyclerView old, AllAppsRecyclerView updated) {
if (old != updated && updated != null ) { if (old != updated && updated != null ) {
updated.addOnScrollListener(mOnScrollListener); updated.addOnScrollListener(mOnScrollListener);

View File

@ -0,0 +1,51 @@
/*
* Copyright (C) 2018 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.View;
import android.view.ViewGroup;
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 = AllAppsRow.ACTION, version = AllAppsRow.VERSION)
public interface AllAppsRow extends Plugin {
String ACTION = "com.android.systemui.action.PLUGIN_ALL_APPS_ACTIONS";
int VERSION = 1;
/**
* Setup the row and return the parent view.
* @param parent The ViewGroup to which launcher will add this row.
*/
View setup(ViewGroup parent);
/**
* @return The height to reserve in all apps for your views.
*/
int getExpectedHeight();
/**
* Update launcher whenever {@link #getExpectedHeight()} changes.
*/
void setOnHeightUpdatedListener(OnHeightUpdatedListener onHeightUpdatedListener);
interface OnHeightUpdatedListener {
void onHeightUpdated();
}
}

View File

@ -31,6 +31,10 @@ public class PluginManagerWrapper {
public void addPluginListener(PluginListener<? extends Plugin> listener, Class<?> pluginClass) { public void addPluginListener(PluginListener<? extends Plugin> listener, Class<?> pluginClass) {
} }
public void addPluginListener(PluginListener<? extends Plugin> listener, Class<?> pluginClass,
boolean allowMultiple) {
}
public void removePluginListener(PluginListener<? extends Plugin> listener) { public void removePluginListener(PluginListener<? extends Plugin> listener) {
} }
} }