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

Commit 69bd3de6 authored by Yining Liu's avatar Yining Liu
Browse files

Clean up flag notification_async_hybrid_view_inflation 2

The impact of this flag is particularly wide, so breaking down the flag
removal by method for code robustness and easier review. This change
cleans the legacy codes.

Clean up flag:
com.android.systemui.notification_async_hybrid_view_inflation

Bug: 409612328
Test: SingleLineViewInflaterTest, SingleLineViewBinderTest,
NotifUiAdjustmentProviderTest
Flag: EXEMPT flag cleanup

Change-Id: I96e854073f63b1436265eebc83790eac8dd88a15
parent a214862c
Loading
Loading
Loading
Loading
+0 −82
Original line number Original line Diff line number Diff line
@@ -31,11 +31,6 @@ import android.widget.ImageView;
import android.widget.TextView;
import android.widget.TextView;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.widget.ConversationAvatarData;
import com.android.internal.widget.ConversationAvatarData.GroupConversationAvatarData;
import com.android.internal.widget.ConversationAvatarData.OneToOneConversationAvatarData;
import com.android.internal.widget.ConversationHeaderData;
import com.android.internal.widget.ConversationLayout;
import com.android.systemui.res.R;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.notification.NotificationFadeAware;
import com.android.systemui.statusbar.notification.NotificationFadeAware;
import com.android.systemui.statusbar.notification.row.shared.AsyncHybridViewInflation;
import com.android.systemui.statusbar.notification.row.shared.AsyncHybridViewInflation;
@@ -43,8 +38,6 @@ import com.android.systemui.statusbar.notification.row.ui.viewmodel.Conversation
import com.android.systemui.statusbar.notification.row.ui.viewmodel.FacePile;
import com.android.systemui.statusbar.notification.row.ui.viewmodel.FacePile;
import com.android.systemui.statusbar.notification.row.ui.viewmodel.SingleIcon;
import com.android.systemui.statusbar.notification.row.ui.viewmodel.SingleIcon;


import java.util.Objects;

/**
/**
 * A hybrid view which may contain information about one or more conversations.
 * A hybrid view which may contain information about one or more conversations.
 */
 */
@@ -119,81 +112,6 @@ public class HybridConversationNotificationView extends HybridNotificationView {
        mTransformationHelper.addTransformedView(mConversationSenderName);
        mTransformationHelper.addTransformedView(mConversationSenderName);
    }
    }


    @Override
    public void bind(@Nullable CharSequence title, @Nullable CharSequence text,
            @Nullable View contentView) {
        AsyncHybridViewInflation.assertInLegacyMode();
        if (!(contentView instanceof ConversationLayout)) {
            super.bind(title, text, contentView);
            return;
        }

        ConversationLayout conversationLayout = (ConversationLayout) contentView;
        loadConversationAvatar(conversationLayout);
        CharSequence conversationTitle = conversationLayout.getConversationTitle();
        if (TextUtils.isEmpty(conversationTitle)) {
            conversationTitle = title;
        }
        if (conversationLayout.isOneToOne()) {
            mConversationSenderName.setVisibility(GONE);
        } else {
            mConversationSenderName.setVisibility(VISIBLE);
            mConversationSenderName.setText(conversationLayout.getConversationSenderName());
        }
        CharSequence conversationText = conversationLayout.getConversationText();
        if (TextUtils.isEmpty(conversationText)) {
            conversationText = text;
        }
        super.bind(conversationTitle, conversationText, conversationLayout);
    }

    private void loadConversationAvatar(ConversationLayout conversationLayout) {
        AsyncHybridViewInflation.assertInLegacyMode();
        loadConversationAvatarWithDrawable(conversationLayout);
    }


    private void loadConversationAvatarWithDrawable(ConversationLayout conversationLayout) {
        AsyncHybridViewInflation.assertInLegacyMode();
        final ConversationHeaderData conversationHeaderData = Objects.requireNonNull(
                conversationLayout.getConversationHeaderData(),
                /* message = */ "conversationHeaderData should not be null");
        final ConversationAvatarData conversationAvatar =
                Objects.requireNonNull(conversationHeaderData.getConversationAvatar(),
                        /* message = */"conversationAvatar should not be null");

        if (conversationAvatar instanceof OneToOneConversationAvatarData oneToOneAvatar) {
            mConversationFacePile.setVisibility(GONE);
            mConversationIconView.setVisibility(VISIBLE);
            mConversationIconView.setImageDrawable(oneToOneAvatar.mDrawable);
            setSize(mConversationIconView, mSingleAvatarSize);
        } else {
            // If there isn't an icon, generate a "face pile" based on the sender avatars
            mConversationIconView.setVisibility(GONE);
            mConversationFacePile.setVisibility(VISIBLE);

            final GroupConversationAvatarData groupAvatar =
                    (GroupConversationAvatarData) conversationAvatar;
            mConversationFacePile =
                    requireViewById(com.android.internal.R.id.conversation_face_pile);
            final ImageView facePileBottomBg = mConversationFacePile.requireViewById(
                    com.android.internal.R.id.conversation_face_pile_bottom_background);
            final ImageView facePileBottom = mConversationFacePile.requireViewById(
                    com.android.internal.R.id.conversation_face_pile_bottom);
            final ImageView facePileTop = mConversationFacePile.requireViewById(
                    com.android.internal.R.id.conversation_face_pile_top);
            conversationLayout.bindFacePileWithDrawable(facePileBottomBg, facePileBottom,
                    facePileTop, groupAvatar);
            setSize(mConversationFacePile, mFacePileSize);
            setSize(facePileBottom, mFacePileAvatarSize);
            setSize(facePileTop, mFacePileAvatarSize);
            setSize(facePileBottomBg, mFacePileAvatarSize + 2 * mFacePileProtectionWidth);
            mTransformationHelper.addViewTransformingToSimilar(facePileTop);
            mTransformationHelper.addViewTransformingToSimilar(facePileBottom);
            mTransformationHelper.addViewTransformingToSimilar(facePileBottomBg);
        }
    }

    /**
    /**
     * Set the avatar using ConversationAvatar from SingleLineViewModel
     * Set the avatar using ConversationAvatar from SingleLineViewModel
     *
     *
+0 −33
Original line number Original line Diff line number Diff line
@@ -23,7 +23,6 @@ import android.app.Notification;
import android.content.Context;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.Resources;
import android.os.Trace;
import android.os.Trace;
import android.service.notification.StatusBarNotification;
import android.util.TypedValue;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View;
@@ -32,7 +31,6 @@ import android.widget.TextView;


import com.android.internal.widget.ConversationLayout;
import com.android.internal.widget.ConversationLayout;
import com.android.systemui.res.R;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.notification.row.shared.AsyncHybridViewInflation;


/**
/**
 * A class managing hybrid groups that include {@link HybridNotificationView} and the notification
 * A class managing hybrid groups that include {@link HybridNotificationView} and the notification
@@ -92,37 +90,6 @@ public class HybridGroupManager {
        }
        }
    }
    }


    public HybridNotificationView bindFromNotification(HybridNotificationView reusableView,
            View contentView, StatusBarNotification notification,
            ViewGroup parent) {
        AsyncHybridViewInflation.assertInLegacyMode();
        boolean isNewView = false;
        if (reusableView == null) {
            Trace.beginSection("HybridGroupManager#bindFromNotification");
            reusableView = inflateHybridView(contentView, parent);
            isNewView = true;
        }

        updateReusableView(reusableView, notification, contentView);
        if (isNewView) {
            Trace.endSection();
        }
        return reusableView;
    }

    /**
     * Update the HybridNotificationView (single-line view)'s appearance
     */
    public void updateReusableView(HybridNotificationView reusableView,
            StatusBarNotification notification, View contentView) {
        AsyncHybridViewInflation.assertInLegacyMode();
        final CharSequence titleText = resolveTitle(notification.getNotification());
        final CharSequence contentText = resolveText(notification.getNotification());
        if (reusableView != null) {
            reusableView.bind(titleText, contentText, contentView);
        }
    }

    @Nullable
    @Nullable
    public static CharSequence resolveText(Notification notification) {
    public static CharSequence resolveText(Notification notification) {
        CharSequence contentText = notification.extras.getCharSequence(Notification.EXTRA_TEXT);
        CharSequence contentText = notification.extras.getCharSequence(Notification.EXTRA_TEXT);
+4 −48
Original line number Original line Diff line number Diff line
@@ -28,7 +28,6 @@ import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Build;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.Trace;
import android.service.notification.StatusBarNotification;
import android.service.notification.StatusBarNotification;
import android.util.ArrayMap;
import android.util.ArrayMap;
import android.util.AttributeSet;
import android.util.AttributeSet;
@@ -905,17 +904,12 @@ public class NotificationContentView extends FrameLayout implements Notification
            return mContractedChild != null
            return mContractedChild != null
                    ? getViewHeight(VISIBLE_TYPE_CONTRACTED) : mMinContractedHeight;
                    ? getViewHeight(VISIBLE_TYPE_CONTRACTED) : mMinContractedHeight;
        } else {
        } else {
            if (AsyncHybridViewInflation.isEnabled()) {
            if (mSingleLineView != null) {
            if (mSingleLineView != null) {
                return getViewHeight(VISIBLE_TYPE_SINGLELINE);
                return getViewHeight(VISIBLE_TYPE_SINGLELINE);
            } else {
            } else {
                //TODO(b/217799515): investigate the impact of min-height value
                //TODO(b/217799515): investigate the impact of min-height value
                return mMinSingleLineHeight;
                return mMinSingleLineHeight;
            }
            }
            } else {
                AsyncHybridViewInflation.assertInLegacyMode();
                return mSingleLineView.getHeight();
            }
        }
        }
    }
    }


@@ -1378,7 +1372,6 @@ public class NotificationContentView extends FrameLayout implements Notification
        if (mHeadsUpChild != null) {
        if (mHeadsUpChild != null) {
            mHeadsUpWrapper.setIsChildInGroup(mIsChildInGroup);
            mHeadsUpWrapper.setIsChildInGroup(mIsChildInGroup);
        }
        }
        updateAllSingleLineViews();
    }
    }


    public void onNotificationUpdated(NotificationEntry entry) {
    public void onNotificationUpdated(NotificationEntry entry) {
@@ -1394,7 +1387,6 @@ public class NotificationContentView extends FrameLayout implements Notification
        mBeforeN = NotificationBundleUi.isEnabled()
        mBeforeN = NotificationBundleUi.isEnabled()
                ? mContainingNotification.getEntryAdapter().getTargetSdk() < Build.VERSION_CODES.N
                ? mContainingNotification.getEntryAdapter().getTargetSdk() < Build.VERSION_CODES.N
                : entry.targetSdk < Build.VERSION_CODES.N;
                : entry.targetSdk < Build.VERSION_CODES.N;
        updateAllSingleLineViews();


        if (mContractedChild != null) {
        if (mContractedChild != null) {
            mContractedWrapper.onContentUpdated(mContainingNotification);
            mContractedWrapper.onContentUpdated(mContainingNotification);
@@ -1415,41 +1407,6 @@ public class NotificationContentView extends FrameLayout implements Notification
        applySystemActions(mHeadsUpChild, entry);
        applySystemActions(mHeadsUpChild, entry);
    }
    }


    private void updateAllSingleLineViews() {
        updateSingleLineView();
    }

    private void updateSingleLineView() {
        try {
            Trace.beginSection("NotifContentView#updateSingleLineView");
            if (mSbn == null) {
                return;
            }
            if (AsyncHybridViewInflation.isEnabled()) {
                return;
            }
            AsyncHybridViewInflation.assertInLegacyMode();
            if (mIsChildInGroup) {
                boolean isNewView = mSingleLineView == null;
                mSingleLineView = mHybridGroupManager.bindFromNotification(
                        /* reusableView = */ mSingleLineView,
                        /* contentView = */ mContractedChild,
                        /* notification = */ mSbn,
                        /* parent = */ this
                );
                if (isNewView && mSingleLineView != null) {
                    updateViewVisibility(mVisibleType, VISIBLE_TYPE_SINGLELINE,
                            mSingleLineView, mSingleLineView);
                }
            } else if (mSingleLineView != null) {
                removeView(mSingleLineView);
                mSingleLineView = null;
            }
        } finally {
            Trace.endSection();
        }
    }

    /**
    /**
     * Returns whether the {@link Notification} represented by entry has a free-form remote input.
     * Returns whether the {@link Notification} represented by entry has a free-form remote input.
     * Such an input can be used e.g. to implement smart reply buttons - by passing the replies
     * Such an input can be used e.g. to implement smart reply buttons - by passing the replies
@@ -2061,7 +2018,6 @@ public class NotificationContentView extends FrameLayout implements Notification
        if (mIsChildInGroup && mSingleLineView != null) {
        if (mIsChildInGroup && mSingleLineView != null) {
            removeView(mSingleLineView);
            removeView(mSingleLineView);
            mSingleLineView = null;
            mSingleLineView = null;
            updateAllSingleLineViews();
        }
        }
    }
    }


+0 −8
Original line number Original line Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.systemui.statusbar.notification.row.shared


import com.android.systemui.Flags
import com.android.systemui.Flags
import com.android.systemui.flags.FlagToken
import com.android.systemui.flags.FlagToken
import com.android.systemui.flags.RefactorFlagUtils


/** Helper for reading or using the async hybrid view inflation flag state. */
/** Helper for reading or using the async hybrid view inflation flag state. */
@Suppress("NOTHING_TO_INLINE")
@Suppress("NOTHING_TO_INLINE")
@@ -33,11 +32,4 @@ object AsyncHybridViewInflation {
    @JvmStatic
    @JvmStatic
    inline val isEnabled
    inline val isEnabled
        get() = Flags.notificationAsyncHybridViewInflation()
        get() = Flags.notificationAsyncHybridViewInflation()

    /**
     * Called to ensure code is only run when the flag is disabled. This will throw an exception if
     * the flag is enabled to ensure that the refactor author catches issues in testing.
     */
    @JvmStatic
    inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME)
}
}