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

Commit 3492b7c4 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Allows different menu icons on each side of a notification."

parents 9ba5646a eb61ce11
Loading
Loading
Loading
Loading
+55 −31
Original line number Original line Diff line number Diff line
@@ -16,17 +16,8 @@


package com.android.systemui.statusbar.notification.row;
package com.android.systemui.statusbar.notification.row;


import java.util.ArrayList;

import static com.android.systemui.SwipeHelper.SWIPED_FAR_ENOUGH_SIZE_FRACTION;
import static com.android.systemui.SwipeHelper.SWIPED_FAR_ENOUGH_SIZE_FRACTION;


import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.AlphaOptimizedImageView;
import com.android.systemui.statusbar.notification.row.NotificationGuts.GutsContent;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;

import android.animation.Animator;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator;
@@ -45,6 +36,15 @@ import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
import android.widget.FrameLayout.LayoutParams;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.AlphaOptimizedImageView;
import com.android.systemui.statusbar.notification.row.NotificationGuts.GutsContent;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;

import java.util.ArrayList;
import java.util.List;


public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnClickListener,
public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnClickListener,
        ExpandableNotificationRow.LayoutListener {
        ExpandableNotificationRow.LayoutListener {
@@ -70,7 +70,8 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
    private MenuItem mInfoItem;
    private MenuItem mInfoItem;
    private MenuItem mAppOpsItem;
    private MenuItem mAppOpsItem;
    private MenuItem mSnoozeItem;
    private MenuItem mSnoozeItem;
    private ArrayList<MenuItem> mMenuItems;
    private ArrayList<MenuItem> mLeftMenuItems;
    private ArrayList<MenuItem> mRightMenuItems;
    private OnMenuEventListener mMenuListener;
    private OnMenuEventListener mMenuListener;


    private ValueAnimator mFadeAnimator;
    private ValueAnimator mFadeAnimator;
@@ -107,12 +108,13 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
        mContext = context;
        mContext = context;
        mShouldShowMenu = context.getResources().getBoolean(R.bool.config_showNotificationGear);
        mShouldShowMenu = context.getResources().getBoolean(R.bool.config_showNotificationGear);
        mHandler = new Handler(Looper.getMainLooper());
        mHandler = new Handler(Looper.getMainLooper());
        mMenuItems = new ArrayList<>();
        mLeftMenuItems = new ArrayList<>();
        mRightMenuItems = new ArrayList<>();
    }
    }


    @Override
    @Override
    public ArrayList<MenuItem> getMenuItems(Context context) {
    public ArrayList<MenuItem> getMenuItems(Context context) {
        return mMenuItems;
        return mOnLeft ? mLeftMenuItems : mRightMenuItems;
    }
    }


    @Override
    @Override
@@ -231,7 +233,8 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
        final Resources res = mContext.getResources();
        final Resources res = mContext.getResources();
        mHorizSpaceForIcon = res.getDimensionPixelSize(R.dimen.notification_menu_icon_size);
        mHorizSpaceForIcon = res.getDimensionPixelSize(R.dimen.notification_menu_icon_size);
        mVertSpaceForIcons = res.getDimensionPixelSize(R.dimen.notification_min_height);
        mVertSpaceForIcons = res.getDimensionPixelSize(R.dimen.notification_min_height);
        mMenuItems.clear();
        mLeftMenuItems.clear();
        mRightMenuItems.clear();
        // Construct the menu items based on the notification
        // Construct the menu items based on the notification
        if (mParent != null && mParent.getStatusBarNotification() != null) {
        if (mParent != null && mParent.getStatusBarNotification() != null) {
            int flags = mParent.getStatusBarNotification().getNotification().flags;
            int flags = mParent.getStatusBarNotification().getNotification().flags;
@@ -239,24 +242,19 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
            if (!isForeground) {
            if (!isForeground) {
                // Only show snooze for non-foreground notifications
                // Only show snooze for non-foreground notifications
                mSnoozeItem = createSnoozeItem(mContext);
                mSnoozeItem = createSnoozeItem(mContext);
                mMenuItems.add(mSnoozeItem);
                mLeftMenuItems.add(mSnoozeItem);
                mRightMenuItems.add(mSnoozeItem);
            }
            }
        }
        }
        mInfoItem = createInfoItem(mContext);
        mInfoItem = createInfoItem(mContext);
        mMenuItems.add(mInfoItem);
        mLeftMenuItems.add(mInfoItem);
        mRightMenuItems.add(mInfoItem);


        mAppOpsItem = createAppOpsItem(mContext);
        mAppOpsItem = createAppOpsItem(mContext);
        mMenuItems.add(mAppOpsItem);
        mLeftMenuItems.add(mAppOpsItem);
        mRightMenuItems.add(mAppOpsItem);


        // Construct the menu views
        populateMenuViews();
        if (mMenuContainer != null) {
            mMenuContainer.removeAllViews();
        } else {
            mMenuContainer = new FrameLayout(mContext);
        }
        for (int i = 0; i < mMenuItems.size(); i++) {
            addMenuView(mMenuItems.get(i), mMenuContainer);
        }
        if (resetState) {
        if (resetState) {
            resetState(false /* notify */);
            resetState(false /* notify */);
        } else {
        } else {
@@ -268,6 +266,18 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
        }
        }
    }
    }


    private void populateMenuViews() {
        if (mMenuContainer != null) {
            mMenuContainer.removeAllViews();
        } else {
            mMenuContainer = new FrameLayout(mContext);
        }
        List<MenuItem> menuItems = mOnLeft ? mLeftMenuItems : mRightMenuItems;
        for (int i = 0; i < menuItems.size(); i++) {
            addMenuView(menuItems.get(i), mMenuContainer);
        }
    }

    private void resetState(boolean notify) {
    private void resetState(boolean notify) {
        setMenuAlpha(0f);
        setMenuAlpha(0f);
        mIconsPlaced = false;
        mIconsPlaced = false;
@@ -386,10 +396,16 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
        if (appName == null) {
        if (appName == null) {
            return;
            return;
        }
        }
        setAppName(appName, mLeftMenuItems);
        setAppName(appName, mRightMenuItems);
    }

    private void setAppName(String appName,
            ArrayList<MenuItem> menuItems) {
        Resources res = mContext.getResources();
        Resources res = mContext.getResources();
        final int count = mMenuItems.size();
        final int count = menuItems.size();
        for (int i = 0; i < count; i++) {
        for (int i = 0; i < count; i++) {
            MenuItem item = mMenuItems.get(i);
            MenuItem item = menuItems.get(i);
            String description = String.format(
            String description = String.format(
                    res.getString(R.string.notification_menu_accessibility),
                    res.getString(R.string.notification_menu_accessibility),
                    appName, item.getContentDescription());
                    appName, item.getContentDescription());
@@ -402,7 +418,9 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl


    @Override
    @Override
    public void onParentHeightUpdate() {
    public void onParentHeightUpdate() {
        if (mParent == null || mMenuItems.size() == 0 || mMenuContainer == null) {
        if (mParent == null
                || (mLeftMenuItems.isEmpty() && mRightMenuItems.isEmpty())
                || mMenuContainer == null) {
            return;
            return;
        }
        }
        int parentHeight = mParent.getActualHeight();
        int parentHeight = mParent.getActualHeight();
@@ -443,13 +461,14 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
        }
        }
        v.getLocationOnScreen(mIconLocation);
        v.getLocationOnScreen(mIconLocation);
        mParent.getLocationOnScreen(mParentLocation);
        mParent.getLocationOnScreen(mParentLocation);
        final int centerX = (int) (mHorizSpaceForIcon / 2);
        final int centerX = mHorizSpaceForIcon / 2;
        final int centerY = v.getHeight() / 2;
        final int centerY = v.getHeight() / 2;
        final int x = mIconLocation[0] - mParentLocation[0] + centerX;
        final int x = mIconLocation[0] - mParentLocation[0] + centerX;
        final int y = mIconLocation[1] - mParentLocation[1] + centerY;
        final int y = mIconLocation[1] - mParentLocation[1] + centerY;
        final int index = mMenuContainer.indexOfChild(v);
        final int index = mMenuContainer.indexOfChild(v);
        if (mMenuListener != null) {
        if (mMenuListener != null) {
            mMenuListener.onMenuClicked(mParent, x, y, mMenuItems.get(index));
            mMenuListener.onMenuClicked(mParent, x, y,
                    (mOnLeft ? mLeftMenuItems : mRightMenuItems).get(index));
        }
        }
    }
    }


@@ -469,6 +488,11 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
            // Do nothing
            // Do nothing
            return;
            return;
        }
        }
        boolean wasOnLeft = mOnLeft;
        mOnLeft = showOnLeft;
        if (wasOnLeft != showOnLeft) {
            populateMenuViews();
        }
        final int count = mMenuContainer.getChildCount();
        final int count = mMenuContainer.getChildCount();
        for (int i = 0; i < count; i++) {
        for (int i = 0; i < count; i++) {
            final View v = mMenuContainer.getChildAt(i);
            final View v = mMenuContainer.getChildAt(i);
@@ -476,7 +500,6 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
            final float right = mParent.getWidth() - (mHorizSpaceForIcon * (i + 1));
            final float right = mParent.getWidth() - (mHorizSpaceForIcon * (i + 1));
            v.setX(showOnLeft ? left : right);
            v.setX(showOnLeft ? left : right);
        }
        }
        mOnLeft = showOnLeft;
        mIconsPlaced = true;
        mIconsPlaced = true;
    }
    }


@@ -603,6 +626,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
    private void addMenuView(MenuItem item, ViewGroup parent) {
    private void addMenuView(MenuItem item, ViewGroup parent) {
        View menuView = item.getMenuView();
        View menuView = item.getMenuView();
        if (menuView != null) {
        if (menuView != null) {
            menuView.setAlpha(mAlpha);
            parent.addView(menuView);
            parent.addView(menuView);
            menuView.setOnClickListener(this);
            menuView.setOnClickListener(this);
            FrameLayout.LayoutParams lp = (LayoutParams) menuView.getLayoutParams();
            FrameLayout.LayoutParams lp = (LayoutParams) menuView.getLayoutParams();