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

Commit a937981b authored by Tony Wickham's avatar Tony Wickham Committed by Android (Google) Code Review
Browse files

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

parents 785a3795 5c5c118c
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -53,7 +53,6 @@ LOCAL_SRC_FILES := \
LOCAL_SDK_VERSION := current
LOCAL_MIN_SDK_VERSION := 28
LOCAL_MODULE := LauncherPluginLib
LOCAL_PRIVILEGED_MODULE := true

include $(BUILD_STATIC_JAVA_LIBRARY)

@@ -69,7 +68,7 @@ LOCAL_STATIC_ANDROID_LIBRARIES := \
    androidx.recyclerview_recyclerview \
    androidx.dynamicanimation_dynamicanimation

LOCAL_STATIC_JAVA_LIBRARIES := libPluginCore
LOCAL_STATIC_JAVA_LIBRARIES := LauncherPluginLib

LOCAL_SRC_FILES := \
    $(call all-proto-files-under, protos) \
+6 −1
Original line number Diff line number Diff line
@@ -43,7 +43,12 @@ public class PluginManagerWrapper {
    }

    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) {
+63 −5
Original line number Diff line number Diff line
@@ -25,16 +25,22 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
import android.widget.LinearLayout;

import com.android.launcher3.R;
import com.android.launcher3.anim.PropertySetter;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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
        ValueAnimator.AnimatorUpdateListener {
        ValueAnimator.AnimatorUpdateListener, PluginListener<AllAppsRow> {

    private final Rect mClip = new Rect(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE);
    private final ValueAnimator mAnimator = ValueAnimator.ofInt(0, 0);
@@ -64,6 +70,9 @@ public class FloatingHeaderView extends LinearLayout implements
    private AllAppsRecyclerView mMainRV;
    private AllAppsRecyclerView mWorkRV;
    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 boolean mHeaderCollapsed;
    private int mSnappedScrolledY;
@@ -82,6 +91,8 @@ public class FloatingHeaderView extends LinearLayout implements

    public FloatingHeaderView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mPluginRows = new HashMap<>();
        mPluginRowViews = new ArrayList<>();
    }

    @Override
@@ -90,6 +101,38 @@ public class FloatingHeaderView extends LinearLayout implements
        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) {
        mTabsHidden = tabsHidden;
        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);
        mParent = (ViewGroup) mMainRV.getParent();
        setMainActive(mMainRVActive || mWorkRV == null);
        setupPluginRows();
        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) {
        if (old != updated && updated != null ) {
            updated.addOnScrollListener(mOnScrollListener);
+51 −0
Original line number Diff line number Diff line
/*
 * 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();
    }
}
+4 −0
Original line number Diff line number Diff line
@@ -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,
            boolean allowMultiple) {
    }

    public void removePluginListener(PluginListener<? extends Plugin> listener) {
    }
}