ExpandableNotificationRow.java revision e5726a20824c3cb2ff369207c8d75bfcdb814f69
151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren/*
251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren * Copyright (C) 2013 The Android Open Source Project
351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren *
451c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren * Licensed under the Apache License, Version 2.0 (the "License");
551c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren * you may not use this file except in compliance with the License.
651c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren * You may obtain a copy of the License at
751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren *
851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren *      http://www.apache.org/licenses/LICENSE-2.0
951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren *
1051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren * Unless required by applicable law or agreed to in writing, software
1151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren * distributed under the License is distributed on an "AS IS" BASIS,
1251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren * See the License for the specific language governing permissions and
1451c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren * limitations under the License.
1551c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren */
1651c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
1751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wrenpackage com.android.systemui.statusbar;
1851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
194b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellorimport android.animation.Animator;
204b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellorimport android.animation.AnimatorListenerAdapter;
214b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellorimport android.animation.ObjectAnimator;
224b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellorimport android.animation.ValueAnimator.AnimatorUpdateListener;
23ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinekimport android.annotation.Nullable;
2451c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wrenimport android.content.Context;
25cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinekimport android.graphics.drawable.AnimatedVectorDrawable;
26cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinekimport android.graphics.drawable.AnimationDrawable;
27b5605e58cb8080c8c887b1885336b707596c8094Selim Cinekimport android.graphics.drawable.ColorDrawable;
28cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinekimport android.graphics.drawable.Drawable;
29da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinekimport android.os.Build;
30e9bad242f38bebadae481a22b647cc153f093070Selim Cinekimport android.os.Bundle;
31b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggiimport android.service.notification.StatusBarNotification;
3251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wrenimport android.util.AttributeSet;
33b0a824687f56b6950338aad169d8d837f8ed657bMady Mellorimport android.util.FloatProperty;
34b0a824687f56b6950338aad169d8d837f8ed657bMady Mellorimport android.util.Property;
3501af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinekimport android.view.LayoutInflater;
366183d12926a189b08cc3be8d9c78470617e63db0Selim Cinekimport android.view.MotionEvent;
37eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinekimport android.view.NotificationHeaderView;
38a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandlerimport android.view.View;
39b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggiimport android.view.ViewStub;
40fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggiimport android.view.accessibility.AccessibilityEvent;
41e9bad242f38bebadae481a22b647cc153f093070Selim Cinekimport android.view.accessibility.AccessibilityNodeInfo;
4298713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinekimport android.widget.Chronometer;
43cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinekimport android.widget.ImageView;
44b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
45698b1706be196de41fc6bf03cf15971c82a11949Chris Wrenimport com.android.internal.logging.MetricsLogger;
46698b1706be196de41fc6bf03cf15971c82a11949Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent;
474bb593492ccf560382fac9ae533a7429cec53c94Selim Cinekimport com.android.internal.util.NotificationColorUtil;
48a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandlerimport com.android.systemui.R;
490e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport com.android.systemui.classifier.FalsingManager;
50c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinekimport com.android.systemui.statusbar.notification.HybridNotificationView;
51b5605e58cb8080c8c887b1885336b707596c8094Selim Cinekimport com.android.systemui.statusbar.phone.NotificationGroupManager;
5231aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinekimport com.android.systemui.statusbar.policy.HeadsUpManager;
53b5605e58cb8080c8c887b1885336b707596c8094Selim Cinekimport com.android.systemui.statusbar.stack.NotificationChildrenContainer;
54e9bad242f38bebadae481a22b647cc153f093070Selim Cinekimport com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
55b5605e58cb8080c8c887b1885336b707596c8094Selim Cinekimport com.android.systemui.statusbar.stack.StackScrollState;
56b5605e58cb8080c8c887b1885336b707596c8094Selim Cinekimport com.android.systemui.statusbar.stack.StackStateAnimator;
57b5605e58cb8080c8c887b1885336b707596c8094Selim Cinekimport com.android.systemui.statusbar.stack.StackViewState;
58b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
594b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellorimport java.util.ArrayList;
60b5605e58cb8080c8c887b1885336b707596c8094Selim Cinekimport java.util.List;
61a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler
624222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggipublic class ExpandableNotificationRow extends ActivatableNotificationView {
63b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
64b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private static final int DEFAULT_DIVIDER_ALPHA = 0x29;
65b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private static final int COLORED_DIVIDER_ALPHA = 0x7B;
6601af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    private int mNotificationMinHeightLegacy;
6701af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    private int mMaxHeadsUpHeightLegacy;
6801af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    private int mMaxHeadsUpHeight;
6901af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    private int mNotificationMinHeight;
7001af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    private int mNotificationMaxHeight;
71b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    private int mIncreasedPaddingBetweenElements;
7251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
731685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /** Does this row contain layouts that can adapt to row expansion */
7451c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    private boolean mExpandable;
751685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /** Has the user actively changed the expansion state of this row */
761685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    private boolean mHasUserChangedExpansion;
771685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /** If {@link #mHasUserChangedExpansion}, has the user expanded this row */
7851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    private boolean mUserExpanded;
7931aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek
8031aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek    /**
8131aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek     * Has this notification been expanded while it was pinned
8231aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek     */
8331aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek    private boolean mExpandedWhenPinned;
841685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /** Is the user touching this row */
8551c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    private boolean mUserLocked;
861685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /** Are we showing the "public" version */
87a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler    private boolean mShowingPublic;
88ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    private boolean mSensitive;
893c76d509d362cf5086a63722ab41e04f5d539182Selim Cinek    private boolean mSensitiveHiddenInGeneral;
90ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    private boolean mShowingPublicInitialized;
9160122be6747c4f79b96f6808158f8f7e7548b7d3Selim Cinek    private boolean mHideSensitiveForIntrinsicHeight;
9251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
931685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
941685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * Is this notification expanded by the system. The expansion state can be overridden by the
951685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * user expansion.
961685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     */
971685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    private boolean mIsSystemExpanded;
98dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi
99dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi    /**
10083bc78338437a460076a4b5778ded38440ac3501Selim Cinek     * Whether the notification is on the keyguard and the expansion is disabled.
101dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi     */
10283bc78338437a460076a4b5778ded38440ac3501Selim Cinek    private boolean mOnKeyguard;
103dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi
104b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    private Animator mTranslateAnim;
1054b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    private ArrayList<View> mTranslateableViews;
106be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    private NotificationContentView mPublicLayout;
107be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    private NotificationContentView mPrivateLayout;
1081685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    private int mMaxExpandHeight;
1098d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    private int mHeadsUpHeight;
110863834bd96bdebcf21f4c4a7d8285d4858c061e4Selim Cinek    private View mVetoButton;
1114bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek    private int mNotificationColor;
11278403d79739605511ea88b653564d81d7bf4bbbaChris Wren    private ExpansionLogger mLogger;
11378403d79739605511ea88b653564d81d7bf4bbbaChris Wren    private String mLoggingKey;
1144b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    private NotificationSettingsIconRow mSettingsIconRow;
1158d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    private NotificationGuts mGuts;
116da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek    private NotificationData.Entry mEntry;
117b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi    private StatusBarNotification mStatusBarNotification;
1183fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor    private String mAppName;
1191a521f3ea841f6db9686bbec7f950a3883d075aaSelim Cinek    private boolean mIsHeadsUp;
12098713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    private boolean mLastChronometerRunning = true;
121b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private ViewStub mChildrenContainerStub;
122b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private NotificationGroupManager mGroupManager;
123b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private boolean mChildrenExpanded;
124263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    private boolean mIsSummaryWithChildren;
125b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private NotificationChildrenContainer mChildrenContainer;
1264b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    private ViewStub mSettingsIconRowStub;
127ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek    private ViewStub mGutsStub;
128b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private boolean mIsSystemChildExpanded;
129684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    private boolean mIsPinned;
1300e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    private FalsingManager mFalsingManager;
13131aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek    private HeadsUpManager mHeadsUpManager;
132b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi
1335eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    private boolean mJustClicked;
1345a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek    private boolean mIconAnimationRunning;
13534d93b0985063090a9bad88a1b80e1b99bae3332Selim Cinek    private boolean mShowNoBackground;
136388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek    private ExpandableNotificationRow mNotificationParent;
137570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek    private OnExpandClickListener mOnExpandClickListener;
138b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    private boolean mGroupExpansionChanging;
139b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
140eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek    private OnClickListener mExpandClickListener = new OnClickListener() {
141eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        @Override
142eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        public void onClick(View v) {
143624c02db7f1d24ec1e307530ff32d4fd5859feaeSelim Cinek            if (!mShowingPublic && mGroupManager.isSummaryOfGroup(mStatusBarNotification)) {
1441a5d8eadd56b435843dfbc1adf3779aa7286081bMady Mellor                mGroupExpansionChanging = true;
145698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                final boolean wasExpanded = mGroupManager.isGroupExpanded(mStatusBarNotification);
146698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                boolean nowExpanded = mGroupManager.toggleGroupExpansion(mStatusBarNotification);
147698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                mOnExpandClickListener.onExpandClicked(mEntry, nowExpanded);
148698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                MetricsLogger.action(mContext, MetricsEvent.ACTION_NOTIFICATION_GROUP_EXPANDER,
149698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                        nowExpanded);
150698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                logExpansionEvent(true /* userAction */, wasExpanded);
151eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek            } else {
152e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                if (v.isAccessibilityFocused()) {
153e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                    mPrivateLayout.setFocusOnVisibilityChange();
154e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                }
15531aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                boolean nowExpanded;
15631aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                if (isPinned()) {
15731aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                    nowExpanded = !mExpandedWhenPinned;
15831aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                    mExpandedWhenPinned = nowExpanded;
15931aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                } else {
16031aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                    nowExpanded = !isExpanded();
16131aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                    setUserExpanded(nowExpanded);
16231aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                }
163eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek                notifyHeightChanged(true);
16431aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                mOnExpandClickListener.onExpandClicked(mEntry, nowExpanded);
165698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                MetricsLogger.action(mContext, MetricsEvent.ACTION_NOTIFICATION_EXPANDER,
166698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                        nowExpanded);
167eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek            }
168eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        }
169eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek    };
1701b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek    private boolean mForceUnlocked;
1713f19f60d654421eee5b35a92129081f08c977629Selim Cinek    private boolean mDismissed;
1723f19f60d654421eee5b35a92129081f08c977629Selim Cinek    private boolean mKeepInParent;
1733f19f60d654421eee5b35a92129081f08c977629Selim Cinek    private boolean mRemoved;
174b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    private static final Property<ExpandableNotificationRow, Float> TRANSLATE_CONTENT =
175b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            new FloatProperty<ExpandableNotificationRow>("translate") {
176b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                @Override
177b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                public void setValue(ExpandableNotificationRow object, float value) {
178b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    object.setTranslation(value);
179b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                }
180b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
181b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                @Override
182b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                public Float get(ExpandableNotificationRow object) {
183b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    return object.getTranslation();
184b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                }
185b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    };
186ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek    private OnClickListener mOnClickListener;
18773cf02a0783e3857cae21fece9c292abcc9e1409Selim Cinek    private boolean mHeadsupDisappearRunning;
188e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    private View mChildAfterViewWhenDismissed;
189e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    private View mGroupParentWhenDismissed;
190e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    private boolean mRefocusOnDismiss;
191b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
192b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public boolean isGroupExpansionChanging() {
193b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (isChildInGroup()) {
194b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            return mNotificationParent.isGroupExpansionChanging();
195b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        }
196b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        return mGroupExpansionChanging;
197b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    }
198b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
199b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public void setGroupExpansionChanging(boolean changing) {
200b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        mGroupExpansionChanging = changing;
201b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    }
2025eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi
203599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos    @Override
204599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos    public void setActualHeightAnimating(boolean animating) {
205599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos        if (mPrivateLayout != null) {
206599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos            mPrivateLayout.setContentHeightAnimating(animating);
207599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos        }
208599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos    }
209599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos
2108d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    public NotificationContentView getPrivateLayout() {
2118d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        return mPrivateLayout;
2128d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    }
2138d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek
2148d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    public NotificationContentView getPublicLayout() {
2158d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        return mPublicLayout;
2168d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    }
2178d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek
218cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    public void setIconAnimationRunning(boolean running) {
219cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        setIconAnimationRunning(running, mPublicLayout);
220cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        setIconAnimationRunning(running, mPrivateLayout);
2215a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek        if (mIsSummaryWithChildren) {
222b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            setIconAnimationRunningForChild(running, mChildrenContainer.getHeaderView());
2235a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek            List<ExpandableNotificationRow> notificationChildren =
2245a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek                    mChildrenContainer.getNotificationChildren();
2255a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek            for (int i = 0; i < notificationChildren.size(); i++) {
2265a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek                ExpandableNotificationRow child = notificationChildren.get(i);
2275a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek                child.setIconAnimationRunning(running);
2285a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek            }
2295a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek        }
2305a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek        mIconAnimationRunning = running;
231cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    }
232cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek
233cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    private void setIconAnimationRunning(boolean running, NotificationContentView layout) {
234cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        if (layout != null) {
235cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            View contractedChild = layout.getContractedChild();
236cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            View expandedChild = layout.getExpandedChild();
2378d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek            View headsUpChild = layout.getHeadsUpChild();
238cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            setIconAnimationRunningForChild(running, contractedChild);
239cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            setIconAnimationRunningForChild(running, expandedChild);
2408d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek            setIconAnimationRunningForChild(running, headsUpChild);
241cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        }
242cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    }
243cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek
244cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    private void setIconAnimationRunningForChild(boolean running, View child) {
245cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        if (child != null) {
246cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            ImageView icon = (ImageView) child.findViewById(com.android.internal.R.id.icon);
247cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            setIconRunning(icon, running);
248cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            ImageView rightIcon = (ImageView) child.findViewById(
249cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                    com.android.internal.R.id.right_icon);
250cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            setIconRunning(rightIcon, running);
251cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        }
252cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    }
253cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek
254cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    private void setIconRunning(ImageView imageView, boolean running) {
255cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        if (imageView != null) {
256cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            Drawable drawable = imageView.getDrawable();
257cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            if (drawable instanceof AnimationDrawable) {
258cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                AnimationDrawable animationDrawable = (AnimationDrawable) drawable;
259cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                if (running) {
260cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                    animationDrawable.start();
261cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                } else {
262cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                    animationDrawable.stop();
263cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                }
264cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            } else if (drawable instanceof AnimatedVectorDrawable) {
265cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                AnimatedVectorDrawable animationDrawable = (AnimatedVectorDrawable) drawable;
266cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                if (running) {
267cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                    animationDrawable.start();
268cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                } else {
269cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                    animationDrawable.stop();
270cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                }
271cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            }
272cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        }
273cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    }
274cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek
275da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek    public void onNotificationUpdated(NotificationData.Entry entry) {
276da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        mEntry = entry;
277da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        mStatusBarNotification = entry.notification;
278b88b1a1dbde3364cd92d6a69a41ef2d4e2877294Adrian Roos        mPrivateLayout.onNotificationUpdated(entry);
279b88b1a1dbde3364cd92d6a69a41ef2d4e2877294Adrian Roos        mPublicLayout.onNotificationUpdated(entry);
280757d879966fdbff1b67c9ec6fd4b6c75152b991aSelim Cinek        mShowingPublicInitialized = false;
2814bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek        updateNotificationColor();
2828fc93c90839e5d9dd52bca9dd97c198c0fe68af1Selim Cinek        if (mIsSummaryWithChildren) {
283b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mChildrenContainer.recreateNotificationHeader(mExpandClickListener, mEntry.notification);
284c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek            mChildrenContainer.onNotificationUpdated();
2858fc93c90839e5d9dd52bca9dd97c198c0fe68af1Selim Cinek        }
2865a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek        if (mIconAnimationRunning) {
2875a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek            setIconAnimationRunning(true);
2885a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek        }
289ea4bef7386ca6c6260f292bf006d16a99b93f698Selim Cinek        if (mNotificationParent != null) {
290ea4bef7386ca6c6260f292bf006d16a99b93f698Selim Cinek            mNotificationParent.updateChildrenHeaderAppearance();
291ea4bef7386ca6c6260f292bf006d16a99b93f698Selim Cinek        }
292263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        onChildrenCountChanged();
293624c02db7f1d24ec1e307530ff32d4fd5859feaeSelim Cinek        // The public layouts expand button is always visible
294624c02db7f1d24ec1e307530ff32d4fd5859feaeSelim Cinek        mPublicLayout.updateExpandButtons(true);
295da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        updateLimits();
296da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek    }
297da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek
298da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek    private void updateLimits() {
299a1744872f4447dd370002a607c32776dffe519f5Selim Cinek        updateLimitsForView(mPrivateLayout);
300a1744872f4447dd370002a607c32776dffe519f5Selim Cinek        updateLimitsForView(mPublicLayout);
301a1744872f4447dd370002a607c32776dffe519f5Selim Cinek    }
302a1744872f4447dd370002a607c32776dffe519f5Selim Cinek
303a1744872f4447dd370002a607c32776dffe519f5Selim Cinek    private void updateLimitsForView(NotificationContentView layout) {
304a1744872f4447dd370002a607c32776dffe519f5Selim Cinek        boolean customView = layout.getContractedChild().getId()
305da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek                != com.android.internal.R.id.status_bar_latest_event_content;
306da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        boolean beforeN = mEntry.targetSdk < Build.VERSION_CODES.N;
307da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        int minHeight = customView && beforeN && !mIsSummaryWithChildren ?
308da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek                mNotificationMinHeightLegacy : mNotificationMinHeight;
309a1744872f4447dd370002a607c32776dffe519f5Selim Cinek        boolean headsUpCustom = layout.getHeadsUpChild() != null &&
310a1744872f4447dd370002a607c32776dffe519f5Selim Cinek                layout.getHeadsUpChild().getId()
311a1744872f4447dd370002a607c32776dffe519f5Selim Cinek                        != com.android.internal.R.id.status_bar_latest_event_content;
31277019c72332cb31dd1cb713ea4c66e267e6cbf39Selim Cinek        int headsUpheight = headsUpCustom && beforeN ? mMaxHeadsUpHeightLegacy
31377019c72332cb31dd1cb713ea4c66e267e6cbf39Selim Cinek                : mMaxHeadsUpHeight;
314a1744872f4447dd370002a607c32776dffe519f5Selim Cinek        layout.setHeights(minHeight, headsUpheight, mNotificationMaxHeight);
315b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi    }
316b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi
317b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi    public StatusBarNotification getStatusBarNotification() {
318b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi        return mStatusBarNotification;
319b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi    }
320b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi
321b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    public boolean isHeadsUp() {
322b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        return mIsHeadsUp;
323b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    }
324b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek
3251a521f3ea841f6db9686bbec7f950a3883d075aaSelim Cinek    public void setHeadsUp(boolean isHeadsUp) {
326c80fdb11f55f4c1f3ca9b5cdc7035afa2a0b9e91Selim Cinek        int intrinsicBefore = getIntrinsicHeight();
3271a521f3ea841f6db9686bbec7f950a3883d075aaSelim Cinek        mIsHeadsUp = isHeadsUp;
3288d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        mPrivateLayout.setHeadsUp(isHeadsUp);
329b41b2f6fc2bcce6da6d6ae855a2a36cfa6f7f99dSelim Cinek        if (mIsSummaryWithChildren) {
330b41b2f6fc2bcce6da6d6ae855a2a36cfa6f7f99dSelim Cinek            // The overflow might change since we allow more lines as HUN.
331b41b2f6fc2bcce6da6d6ae855a2a36cfa6f7f99dSelim Cinek            mChildrenContainer.updateGroupOverflow();
332b41b2f6fc2bcce6da6d6ae855a2a36cfa6f7f99dSelim Cinek        }
333c80fdb11f55f4c1f3ca9b5cdc7035afa2a0b9e91Selim Cinek        if (intrinsicBefore != getIntrinsicHeight()) {
334c80fdb11f55f4c1f3ca9b5cdc7035afa2a0b9e91Selim Cinek            notifyHeightChanged(false  /* needsAnimation */);
335c80fdb11f55f4c1f3ca9b5cdc7035afa2a0b9e91Selim Cinek        }
3361a521f3ea841f6db9686bbec7f950a3883d075aaSelim Cinek    }
3371a521f3ea841f6db9686bbec7f950a3883d075aaSelim Cinek
338b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void setGroupManager(NotificationGroupManager groupManager) {
339b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mGroupManager = groupManager;
34083bc78338437a460076a4b5778ded38440ac3501Selim Cinek        mPrivateLayout.setGroupManager(groupManager);
341b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
342b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
343b88b1a1dbde3364cd92d6a69a41ef2d4e2877294Adrian Roos    public void setRemoteInputController(RemoteInputController r) {
344b88b1a1dbde3364cd92d6a69a41ef2d4e2877294Adrian Roos        mPrivateLayout.setRemoteInputController(r);
345b88b1a1dbde3364cd92d6a69a41ef2d4e2877294Adrian Roos    }
346b88b1a1dbde3364cd92d6a69a41ef2d4e2877294Adrian Roos
3473fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor    public void setAppName(String appName) {
3483fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor        mAppName = appName;
3493fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor        if (mSettingsIconRow != null) {
3503fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor            mSettingsIconRow.setAppName(mAppName);
3513fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor        }
3523fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor    }
3533fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor
354b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void addChildNotification(ExpandableNotificationRow row) {
355b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        addChildNotification(row, -1);
356b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
357b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
358b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    /**
359b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     * Add a child notification to this view.
360b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     *
361b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     * @param row the row to add
362b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     * @param childIndex the index to add it at, if -1 it will be added at the end
363b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     */
364b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void addChildNotification(ExpandableNotificationRow row, int childIndex) {
365b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        if (mChildrenContainer == null) {
366b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            mChildrenContainerStub.inflate();
367b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
368b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mChildrenContainer.addNotification(row, childIndex);
369263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        onChildrenCountChanged();
370263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        row.setIsChildInGroup(true, this);
371b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
372b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
373b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void removeChildNotification(ExpandableNotificationRow row) {
374b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        if (mChildrenContainer != null) {
375b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            mChildrenContainer.removeNotification(row);
376b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
377263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        onChildrenCountChanged();
378263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        row.setIsChildInGroup(false, null);
379263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    }
380263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek
381263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    public boolean isChildInGroup() {
382a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        return mNotificationParent != null;
383263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    }
384263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek
385388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek    public ExpandableNotificationRow getNotificationParent() {
386388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek        return mNotificationParent;
387388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek    }
388388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek
389263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    /**
390263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek     * @param isChildInGroup Is this notification now in a group
391263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek     * @param parent the new parent notification
392263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek     */
393a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek    public void setIsChildInGroup(boolean isChildInGroup, ExpandableNotificationRow parent) {;
394a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        boolean childInGroup = BaseStatusBar.ENABLE_CHILD_NOTIFICATIONS && isChildInGroup;
395a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        mNotificationParent = childInGroup ? parent : null;
396a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        mPrivateLayout.setIsChildInGroup(childInGroup);
397c7d65b4e9c784a8235424c30620bacd54cc0892eMady Mellor        resetBackgroundAlpha();
398b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        updateBackgroundForGroupState();
399ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        updateClickAndFocus();
400b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (mNotificationParent != null) {
401b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mNotificationParent.updateBackgroundForGroupState();
402b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        }
40334d93b0985063090a9bad88a1b80e1b99bae3332Selim Cinek    }
40434d93b0985063090a9bad88a1b80e1b99bae3332Selim Cinek
40534d93b0985063090a9bad88a1b80e1b99bae3332Selim Cinek    @Override
4067210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek    public boolean onTouchEvent(MotionEvent event) {
4077210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek        if (event.getActionMasked() != MotionEvent.ACTION_DOWN
4087210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek                || !isChildInGroup() || isGroupExpanded()) {
4097210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek            return super.onTouchEvent(event);
4107210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek        } else {
4117210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek            return false;
4127210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek        }
4137210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek    }
4147210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek
4157210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek    @Override
416f062580d395a8c99631c104d6aec250f961152ddMady Mellor    protected boolean handleSlideBack() {
417f062580d395a8c99631c104d6aec250f961152ddMady Mellor        if (mSettingsIconRow != null && mSettingsIconRow.isVisible()) {
418f062580d395a8c99631c104d6aec250f961152ddMady Mellor            animateTranslateNotification(0 /* targetLeft */);
419f062580d395a8c99631c104d6aec250f961152ddMady Mellor            return true;
420f062580d395a8c99631c104d6aec250f961152ddMady Mellor        }
421f062580d395a8c99631c104d6aec250f961152ddMady Mellor        return false;
422f062580d395a8c99631c104d6aec250f961152ddMady Mellor    }
423f062580d395a8c99631c104d6aec250f961152ddMady Mellor
424f062580d395a8c99631c104d6aec250f961152ddMady Mellor    @Override
42534d93b0985063090a9bad88a1b80e1b99bae3332Selim Cinek    protected boolean shouldHideBackground() {
42634d93b0985063090a9bad88a1b80e1b99bae3332Selim Cinek        return super.shouldHideBackground() || mShowNoBackground;
427263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    }
428263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek
429263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    @Override
430263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    public boolean isSummaryWithChildren() {
431263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        return mIsSummaryWithChildren;
432b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
433b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
434b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    @Override
435b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public boolean areChildrenExpanded() {
436b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        return mChildrenExpanded;
437b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
438b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
439b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public List<ExpandableNotificationRow> getNotificationChildren() {
440b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        return mChildrenContainer == null ? null : mChildrenContainer.getNotificationChildren();
441b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
442b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
443eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek    public int getNumberOfNotificationChildren() {
444eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek        if (mChildrenContainer == null) {
445eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek            return 0;
446eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek        }
447eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek        return mChildrenContainer.getNotificationChildren().size();
448eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek    }
449eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek
450b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    /**
451b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     * Apply the order given in the list to the children.
452b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     *
453b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     * @param childOrder the new list order
454b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     * @return whether the list order has changed
455b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     */
456b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public boolean applyChildOrder(List<ExpandableNotificationRow> childOrder) {
457b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        return mChildrenContainer != null && mChildrenContainer.applyChildOrder(childOrder);
458b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
459b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
460b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void getChildrenStates(StackScrollState resultState) {
46183bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (mIsSummaryWithChildren) {
462b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            StackViewState parentState = resultState.getViewStateForView(this);
463b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            mChildrenContainer.getState(resultState, parentState);
464b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
465b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
466b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
467b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void applyChildrenState(StackScrollState state) {
46883bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (mIsSummaryWithChildren) {
469b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            mChildrenContainer.applyState(state);
470b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
471b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
472b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
473b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void prepareExpansionChanged(StackScrollState state) {
47483bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (mIsSummaryWithChildren) {
475b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            mChildrenContainer.prepareExpansionChanged(state);
476b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
477b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
478b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
479b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void startChildAnimation(StackScrollState finalState,
4809969559da02f54fcbd7832de9810507a581d98d8Selim Cinek            StackStateAnimator stateAnimator, long delay, long duration) {
48183bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (mIsSummaryWithChildren) {
4829969559da02f54fcbd7832de9810507a581d98d8Selim Cinek            mChildrenContainer.startAnimationToState(finalState, stateAnimator, delay,
483b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek                    duration);
484b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
485b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
486b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
487b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public ExpandableNotificationRow getViewAtPosition(float y) {
48843d30f03f45f3f9ad3955f5c83f4d21f26891de6Selim Cinek        if (!mIsSummaryWithChildren || !mChildrenExpanded) {
489b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            return this;
490b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        } else {
491b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            ExpandableNotificationRow view = mChildrenContainer.getViewAtPosition(y);
492b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            return view == null ? this : view;
493b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
494b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
495b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
496ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek    public NotificationGuts getGuts() {
497ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek        return mGuts;
498ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek    }
499ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek
500684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    /**
501684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * Set this notification to be pinned to the top if {@link #isHeadsUp()} is true. By doing this
502684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * the notification will be rendered on top of the screen.
503684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     *
504684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * @param pinned whether it is pinned
505684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     */
506684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void setPinned(boolean pinned) {
507def35a86530200958384191d43d321dbcda16e2aSelim Cinek        int intrinsicHeight = getIntrinsicHeight();
508684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        mIsPinned = pinned;
509def35a86530200958384191d43d321dbcda16e2aSelim Cinek        if (intrinsicHeight != getIntrinsicHeight()) {
510bb42b7dd4892a8ab99f2f702cad931235d1d463eSelim Cinek            notifyHeightChanged(false /* needsAnimation */);
511def35a86530200958384191d43d321dbcda16e2aSelim Cinek        }
51231aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        if (pinned) {
51331aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            setIconAnimationRunning(true);
51431aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            mExpandedWhenPinned = false;
51531aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        } else if (mExpandedWhenPinned) {
51631aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            setUserExpanded(true);
51731aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        }
51898713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        setChronometerRunning(mLastChronometerRunning);
519b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    }
520b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek
521684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public boolean isPinned() {
522684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        return mIsPinned;
523b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    }
524b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek
52531aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek    /**
52631aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek     * @param atLeastMinHeight should the value returned be at least the minimum height.
52731aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek     *                         Used to avoid cyclic calls
52831aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek     * @return the height of the heads up notification when pinned
52931aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek     */
53031aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek    public int getPinnedHeadsUpHeight(boolean atLeastMinHeight) {
53177019c72332cb31dd1cb713ea4c66e267e6cbf39Selim Cinek        if (mIsSummaryWithChildren) {
53277019c72332cb31dd1cb713ea4c66e267e6cbf39Selim Cinek            return mChildrenContainer.getIntrinsicHeight();
53377019c72332cb31dd1cb713ea4c66e267e6cbf39Selim Cinek        }
53431aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        if(mExpandedWhenPinned) {
53531aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            return Math.max(getMaxExpandHeight(), mHeadsUpHeight);
53631aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        } else if (atLeastMinHeight) {
537567e845d99840a6e556595739a15e16132eb2f1eSelim Cinek            return Math.max(getCollapsedHeight(), mHeadsUpHeight);
53831aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        } else {
53931aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            return mHeadsUpHeight;
54031aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        }
541b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    }
542b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek
5435eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    /**
5445eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi     * Mark whether this notification was just clicked, i.e. the user has just clicked this
5455eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi     * notification in this frame.
5465eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi     */
5475eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    public void setJustClicked(boolean justClicked) {
5485eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi        mJustClicked = justClicked;
5495eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    }
5505eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi
5515eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    /**
5525eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi     * @return true if this notification has been clicked in this frame, false otherwise
5535eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi     */
5545eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    public boolean wasJustClicked() {
5555eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi        return mJustClicked;
5565eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    }
5575eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi
55898713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    public void setChronometerRunning(boolean running) {
55998713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        mLastChronometerRunning = running;
56098713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        setChronometerRunning(running, mPrivateLayout);
56198713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        setChronometerRunning(running, mPublicLayout);
56298713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        if (mChildrenContainer != null) {
56398713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            List<ExpandableNotificationRow> notificationChildren =
56498713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek                    mChildrenContainer.getNotificationChildren();
56598713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            for (int i = 0; i < notificationChildren.size(); i++) {
56698713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek                ExpandableNotificationRow child = notificationChildren.get(i);
56798713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek                child.setChronometerRunning(running);
56898713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            }
56998713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        }
57098713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    }
57198713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek
57298713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    private void setChronometerRunning(boolean running, NotificationContentView layout) {
57398713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        if (layout != null) {
57498713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            running = running || isPinned();
57598713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            View contractedChild = layout.getContractedChild();
57698713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            View expandedChild = layout.getExpandedChild();
57798713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            View headsUpChild = layout.getHeadsUpChild();
57898713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            setChronometerRunningForChild(running, contractedChild);
57998713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            setChronometerRunningForChild(running, expandedChild);
58098713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            setChronometerRunningForChild(running, headsUpChild);
58198713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        }
58298713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    }
58398713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek
58498713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    private void setChronometerRunningForChild(boolean running, View child) {
58598713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        if (child != null) {
58698713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            View chronometer = child.findViewById(com.android.internal.R.id.chronometer);
58798713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            if (chronometer instanceof Chronometer) {
58898713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek                ((Chronometer) chronometer).setStarted(running);
58998713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            }
59098713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        }
59198713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    }
59298713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek
593ea4bef7386ca6c6260f292bf006d16a99b93f698Selim Cinek    public NotificationHeaderView getNotificationHeader() {
594b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (mIsSummaryWithChildren) {
595b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            return mChildrenContainer.getHeaderView();
5968d6440dbaba4310cb517ab2a725d75be1ef934f4Selim Cinek        }
597ea4bef7386ca6c6260f292bf006d16a99b93f698Selim Cinek        return mPrivateLayout.getNotificationHeader();
5988d6440dbaba4310cb517ab2a725d75be1ef934f4Selim Cinek    }
5998d6440dbaba4310cb517ab2a725d75be1ef934f4Selim Cinek
60034eda5ed70863320e41b6860a550ba6a4248c652Selim Cinek    private NotificationHeaderView getVisibleNotificationHeader() {
601aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek        if (mIsSummaryWithChildren && !mShowingPublic) {
602b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            return mChildrenContainer.getHeaderView();
60334eda5ed70863320e41b6860a550ba6a4248c652Selim Cinek        }
60434eda5ed70863320e41b6860a550ba6a4248c652Selim Cinek        return getShowingLayout().getVisibleNotificationHeader();
60534eda5ed70863320e41b6860a550ba6a4248c652Selim Cinek    }
60634eda5ed70863320e41b6860a550ba6a4248c652Selim Cinek
607570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek    public void setOnExpandClickListener(OnExpandClickListener onExpandClickListener) {
608570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek        mOnExpandClickListener = onExpandClickListener;
609570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek    }
610570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek
611ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek    @Override
612ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek    public void setOnClickListener(@Nullable OnClickListener l) {
613ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        super.setOnClickListener(l);
614ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        mOnClickListener = l;
615ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        updateClickAndFocus();
616ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek    }
617ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek
618ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek    private void updateClickAndFocus() {
619ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        boolean normalChild = !isChildInGroup() || isGroupExpanded();
620ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        boolean clickable = mOnClickListener != null && normalChild;
621ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        if (isFocusable() != normalChild) {
622ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek            setFocusable(normalChild);
623ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        }
624ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        if (isClickable() != clickable) {
625ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek            setClickable(clickable);
626ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        }
627ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek    }
628ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek
62931aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek    public void setHeadsUpManager(HeadsUpManager headsUpManager) {
63031aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        mHeadsUpManager = headsUpManager;
63131aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek    }
63231aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek
63301af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    public void reInflateViews() {
63401af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek        initDimens();
63501af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek        if (mIsSummaryWithChildren) {
63601af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            if (mChildrenContainer != null) {
637b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                mChildrenContainer.reInflateViews(mExpandClickListener, mEntry.notification);
63801af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            }
63901af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek        }
64001af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek        if (mGuts != null) {
64101af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            View oldGuts = mGuts;
64201af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            int index = indexOfChild(oldGuts);
64301af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            removeView(oldGuts);
64401af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            mGuts = (NotificationGuts) LayoutInflater.from(mContext).inflate(
64501af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek                    R.layout.notification_guts, this, false);
64601af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            mGuts.setVisibility(oldGuts.getVisibility());
64701af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            addView(mGuts, index);
64801af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek        }
6494b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        if (mSettingsIconRow != null) {
6504b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            View oldSettings = mSettingsIconRow;
6514b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            int settingsIndex = indexOfChild(oldSettings);
6524b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            removeView(oldSettings);
6534b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mSettingsIconRow = (NotificationSettingsIconRow) LayoutInflater.from(mContext).inflate(
6544b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor                    R.layout.notification_settings_icon_row, this, false);
6554b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mSettingsIconRow.setNotificationRowParent(ExpandableNotificationRow.this);
6563fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor            mSettingsIconRow.setAppName(mAppName);
6574b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mSettingsIconRow.setVisibility(oldSettings.getVisibility());
6584b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            addView(mSettingsIconRow, settingsIndex);
6594b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
6604b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
661de33a4ad5696173942dca363339027c892927e8dSelim Cinek        mPrivateLayout.reInflateViews();
662de33a4ad5696173942dca363339027c892927e8dSelim Cinek        mPublicLayout.reInflateViews();
66301af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    }
66401af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek
665c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek    public void setContentBackground(int customBackgroundColor, boolean animate,
666c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek            NotificationContentView notificationContentView) {
667c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek        if (getShowingLayout() == notificationContentView) {
668c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek            setTintColor(customBackgroundColor, animate);
669c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek        }
670c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek    }
671c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek
6720bd8a4b29bf92a901855d889c53186383dd2c5e7Adrian Roos    public void closeRemoteInput() {
6730bd8a4b29bf92a901855d889c53186383dd2c5e7Adrian Roos        mPrivateLayout.closeRemoteInput();
6740bd8a4b29bf92a901855d889c53186383dd2c5e7Adrian Roos        mPublicLayout.closeRemoteInput();
6750bd8a4b29bf92a901855d889c53186383dd2c5e7Adrian Roos    }
6760bd8a4b29bf92a901855d889c53186383dd2c5e7Adrian Roos
677c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    /**
678c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek     * Set by how much the single line view should be indented.
679c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek     */
680c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    public void setSingleLineWidthIndention(int indention) {
681c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek        mPrivateLayout.setSingleLineWidthIndention(indention);
682c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    }
683c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek
684c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    public int getNotificationColor() {
6854bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek        return mNotificationColor;
6864bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek    }
6874bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek
6884bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek    private void updateNotificationColor() {
6894bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek        mNotificationColor = NotificationColorUtil.resolveContrastColor(mContext,
6904bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek                getStatusBarNotification().getNotification().color);
691c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    }
692c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek
693c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    public HybridNotificationView getSingleLineView() {
694c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek        return mPrivateLayout.getSingleLineView();
695c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    }
696c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek
697f07d06212b08939809aa4128f153bd5179f81fc7Selim Cinek    public boolean isOnKeyguard() {
698f07d06212b08939809aa4128f153bd5179f81fc7Selim Cinek        return mOnKeyguard;
699f07d06212b08939809aa4128f153bd5179f81fc7Selim Cinek    }
700f07d06212b08939809aa4128f153bd5179f81fc7Selim Cinek
701c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek    public void removeAllChildren() {
702c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek        List<ExpandableNotificationRow> notificationChildren
703c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek                = mChildrenContainer.getNotificationChildren();
704c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek        ArrayList<ExpandableNotificationRow> clonedList = new ArrayList<>(notificationChildren);
705c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek        for (int i = 0; i < clonedList.size(); i++) {
706c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek            ExpandableNotificationRow row = clonedList.get(i);
7073f19f60d654421eee5b35a92129081f08c977629Selim Cinek            if (row.keepInParent()) {
7083f19f60d654421eee5b35a92129081f08c977629Selim Cinek                continue;
7093f19f60d654421eee5b35a92129081f08c977629Selim Cinek            }
710c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek            mChildrenContainer.removeNotification(row);
711c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek            row.setIsChildInGroup(false, null);
712c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek        }
713c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek        onChildrenCountChanged();
714c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek    }
715c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek
7161b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek    public void setForceUnlocked(boolean forceUnlocked) {
7171b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek        mForceUnlocked = forceUnlocked;
7181b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek        if (mIsSummaryWithChildren) {
7191b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek            List<ExpandableNotificationRow> notificationChildren = getNotificationChildren();
7201b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek            for (ExpandableNotificationRow child : notificationChildren) {
7211b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek                child.setForceUnlocked(forceUnlocked);
7221b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek            }
7231b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek        }
7241b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek    }
7251b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek
726e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    public void setDismissed(boolean dismissed, boolean fromAccessibility) {
7273f19f60d654421eee5b35a92129081f08c977629Selim Cinek        mDismissed = dismissed;
728e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        mGroupParentWhenDismissed = mNotificationParent;
729e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        mRefocusOnDismiss = fromAccessibility;
730e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        mChildAfterViewWhenDismissed = null;
731e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        if (isChildInGroup()) {
732e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            List<ExpandableNotificationRow> notificationChildren =
733e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                    mNotificationParent.getNotificationChildren();
734e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            int i = notificationChildren.indexOf(this);
735e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            if (i != -1 && i < notificationChildren.size() - 1) {
736e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                mChildAfterViewWhenDismissed = notificationChildren.get(i + 1);
737e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            }
738e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        }
7393f19f60d654421eee5b35a92129081f08c977629Selim Cinek    }
7403f19f60d654421eee5b35a92129081f08c977629Selim Cinek
7413f19f60d654421eee5b35a92129081f08c977629Selim Cinek    public boolean isDismissed() {
7423f19f60d654421eee5b35a92129081f08c977629Selim Cinek        return mDismissed;
7433f19f60d654421eee5b35a92129081f08c977629Selim Cinek    }
7443f19f60d654421eee5b35a92129081f08c977629Selim Cinek
7453f19f60d654421eee5b35a92129081f08c977629Selim Cinek    public boolean keepInParent() {
7463f19f60d654421eee5b35a92129081f08c977629Selim Cinek        return mKeepInParent;
7473f19f60d654421eee5b35a92129081f08c977629Selim Cinek    }
7483f19f60d654421eee5b35a92129081f08c977629Selim Cinek
7493f19f60d654421eee5b35a92129081f08c977629Selim Cinek    public void setKeepInParent(boolean keepInParent) {
7503f19f60d654421eee5b35a92129081f08c977629Selim Cinek        mKeepInParent = keepInParent;
7513f19f60d654421eee5b35a92129081f08c977629Selim Cinek    }
7523f19f60d654421eee5b35a92129081f08c977629Selim Cinek
7533f19f60d654421eee5b35a92129081f08c977629Selim Cinek    public boolean isRemoved() {
7543f19f60d654421eee5b35a92129081f08c977629Selim Cinek        return mRemoved;
7553f19f60d654421eee5b35a92129081f08c977629Selim Cinek    }
7563f19f60d654421eee5b35a92129081f08c977629Selim Cinek
757d009ab1e2a57648cac9de93912964e2a36ae1762Adrian Roos    public void setRemoved() {
758d009ab1e2a57648cac9de93912964e2a36ae1762Adrian Roos        mRemoved = true;
759d009ab1e2a57648cac9de93912964e2a36ae1762Adrian Roos
760d009ab1e2a57648cac9de93912964e2a36ae1762Adrian Roos        mPrivateLayout.setRemoved();
7613f19f60d654421eee5b35a92129081f08c977629Selim Cinek    }
7623f19f60d654421eee5b35a92129081f08c977629Selim Cinek
763d13956475e97da9de83f6519eab514770118e7afSelim Cinek    public NotificationChildrenContainer getChildrenContainer() {
764d13956475e97da9de83f6519eab514770118e7afSelim Cinek        return mChildrenContainer;
765d13956475e97da9de83f6519eab514770118e7afSelim Cinek    }
766d13956475e97da9de83f6519eab514770118e7afSelim Cinek
76773cf02a0783e3857cae21fece9c292abcc9e1409Selim Cinek    public void setHeadsupDisappearRunning(boolean running) {
76873cf02a0783e3857cae21fece9c292abcc9e1409Selim Cinek        mHeadsupDisappearRunning = running;
76973cf02a0783e3857cae21fece9c292abcc9e1409Selim Cinek        mPrivateLayout.setHeadsupDisappearRunning(running);
77073cf02a0783e3857cae21fece9c292abcc9e1409Selim Cinek    }
77173cf02a0783e3857cae21fece9c292abcc9e1409Selim Cinek
772e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    public View getChildAfterViewWhenDismissed() {
773e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        return mChildAfterViewWhenDismissed;
774e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    }
775e9bad242f38bebadae481a22b647cc153f093070Selim Cinek
776e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    public View getGroupParentWhenDismissed() {
777e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        return mGroupParentWhenDismissed;
778e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    }
779e9bad242f38bebadae481a22b647cc153f093070Selim Cinek
7809e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    public void performDismiss() {
7819e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek        mVetoButton.performClick();
7829e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    }
7839e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek
7849e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    public void setOnDismissListener(OnClickListener listener) {
7859e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek        mVetoButton.setOnClickListener(listener);
7869e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    }
7879e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek
78878403d79739605511ea88b653564d81d7bf4bbbaChris Wren    public interface ExpansionLogger {
78978403d79739605511ea88b653564d81d7bf4bbbaChris Wren        public void logNotificationExpansion(String key, boolean userAction, boolean expanded);
79078403d79739605511ea88b653564d81d7bf4bbbaChris Wren    }
7911685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
79251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public ExpandableNotificationRow(Context context, AttributeSet attrs) {
79351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        super(context, attrs);
7940e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        mFalsingManager = FalsingManager.getInstance(context);
79501af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek        initDimens();
79601af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    }
79701af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek
79801af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    private void initDimens() {
799f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        mNotificationMinHeightLegacy = getFontScaledHeight(R.dimen.notification_min_height_legacy);
800f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        mNotificationMinHeight = getFontScaledHeight(R.dimen.notification_min_height);
801f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        mNotificationMaxHeight = getFontScaledHeight(R.dimen.notification_max_height);
802f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        mMaxHeadsUpHeightLegacy = getFontScaledHeight(
80377019c72332cb31dd1cb713ea4c66e267e6cbf39Selim Cinek                R.dimen.notification_max_heads_up_height_legacy);
804f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        mMaxHeadsUpHeight = getFontScaledHeight(R.dimen.notification_max_heads_up_height);
805b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        mIncreasedPaddingBetweenElements = getResources()
806b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                .getDimensionPixelSize(R.dimen.notification_divider_height_increased);
807f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek    }
808f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek
809f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek    /**
810f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek     * @param dimenId the dimen to look up
811f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek     * @return the font scaled dimen as if it were in sp but doesn't shrink sizes below dp
812f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek     */
813f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek    private int getFontScaledHeight(int dimenId) {
814f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        int dimensionPixelSize = getResources().getDimensionPixelSize(dimenId);
815f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        float factor = Math.max(1.0f, getResources().getDisplayMetrics().scaledDensity /
816f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek                getResources().getDisplayMetrics().density);
817f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        return (int) (dimensionPixelSize * factor);
81851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
81951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
820a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer    /**
821a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer     * Resets this view so it can be re-used for an updated notification.
822a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer     */
82322f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer    @Override
824a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer    public void reset() {
82522f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer        super.reset();
82678403d79739605511ea88b653564d81d7bf4bbbaChris Wren        final boolean wasExpanded = isExpanded();
827a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer        mExpandable = false;
828a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer        mHasUserChangedExpansion = false;
829a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer        mUserLocked = false;
830a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer        mShowingPublic = false;
831ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        mSensitive = false;
832ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        mShowingPublicInitialized = false;
833a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer        mIsSystemExpanded = false;
83483bc78338437a460076a4b5778ded38440ac3501Selim Cinek        mOnKeyguard = false;
83551d94917c7dc53845701702bfd63f102a3a2dbc8Selim Cinek        mPublicLayout.reset();
83651d94917c7dc53845701702bfd63f102a3a2dbc8Selim Cinek        mPrivateLayout.reset();
83731094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        resetHeight();
8384b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        resetTranslation();
83931094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        logExpansionEvent(false, wasExpanded);
84031094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek    }
84131094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek
84231094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek    public void resetHeight() {
84331094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        onHeightReset();
8446e28a678c7f9fe2cae5a51bfdbab3071a2d8d0baSelim Cinek        requestLayout();
845a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer    }
846a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer
847251957d76e57eb6e5f8068b37346144e10e586a4Jorim Jaggi    @Override
848251957d76e57eb6e5f8068b37346144e10e586a4Jorim Jaggi    protected void onFinishInflate() {
849251957d76e57eb6e5f8068b37346144e10e586a4Jorim Jaggi        super.onFinishInflate();
850be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi        mPublicLayout = (NotificationContentView) findViewById(R.id.expandedPublic);
851fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek        mPublicLayout.setContainingNotification(this);
852be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi        mPrivateLayout = (NotificationContentView) findViewById(R.id.expanded);
853eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        mPrivateLayout.setExpandClickListener(mExpandClickListener);
854fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek        mPrivateLayout.setContainingNotification(this);
855eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        mPublicLayout.setExpandClickListener(mExpandClickListener);
8564b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mSettingsIconRowStub = (ViewStub) findViewById(R.id.settings_icon_row_stub);
8574b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mSettingsIconRowStub.setOnInflateListener(new ViewStub.OnInflateListener() {
8584b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            @Override
8594b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            public void onInflate(ViewStub stub, View inflated) {
8604b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor                mSettingsIconRow = (NotificationSettingsIconRow) inflated;
8614b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor                mSettingsIconRow.setNotificationRowParent(ExpandableNotificationRow.this);
8623fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor                mSettingsIconRow.setAppName(mAppName);
8634b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            }
8644b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        });
865ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek        mGutsStub = (ViewStub) findViewById(R.id.notification_guts_stub);
866ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek        mGutsStub.setOnInflateListener(new ViewStub.OnInflateListener() {
867b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi            @Override
868b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi            public void onInflate(ViewStub stub, View inflated) {
869b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi                mGuts = (NotificationGuts) inflated;
870b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi                mGuts.setClipTopAmount(getClipTopAmount());
871b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi                mGuts.setActualHeight(getActualHeight());
872ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek                mGutsStub = null;
873b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi            }
874b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi        });
875b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mChildrenContainerStub = (ViewStub) findViewById(R.id.child_container_stub);
876b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mChildrenContainerStub.setOnInflateListener(new ViewStub.OnInflateListener() {
877b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
878b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            @Override
879b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            public void onInflate(ViewStub stub, View inflated) {
880b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek                mChildrenContainer = (NotificationChildrenContainer) inflated;
881388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek                mChildrenContainer.setNotificationParent(ExpandableNotificationRow.this);
882c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek                mChildrenContainer.onNotificationUpdated();
8834b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor                mTranslateableViews.add(mChildrenContainer);
884b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            }
885b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        });
886863834bd96bdebcf21f4c4a7d8285d4858c061e4Selim Cinek        mVetoButton = findViewById(R.id.veto);
8879e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek        mVetoButton.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
8889e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek        mVetoButton.setContentDescription(mContext.getString(
8899e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek                R.string.accessibility_remove_notification));
8904b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
8914b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        // Add the views that we translate to reveal the gear
8924b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mTranslateableViews = new ArrayList<View>();
8934b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        for (int i = 0; i < getChildCount(); i++) {
8944b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mTranslateableViews.add(getChildAt(i));
8954b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
8964b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        // Remove views that don't translate
8974b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mTranslateableViews.remove(mVetoButton);
8984b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mTranslateableViews.remove(mSettingsIconRowStub);
8994b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mTranslateableViews.remove(mChildrenContainerStub);
9004b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mTranslateableViews.remove(mGutsStub);
9014b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    }
9024b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
9039e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    public View getVetoButton() {
9049e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek        return mVetoButton;
9059e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    }
9069e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek
9074b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    public void resetTranslation() {
90832c638a597dccbe4be600fd483060ee1466fdb04Mady Mellor        if (mTranslateAnim != null) {
90932c638a597dccbe4be600fd483060ee1466fdb04Mady Mellor            mTranslateAnim.cancel();
91032c638a597dccbe4be600fd483060ee1466fdb04Mady Mellor        }
9114b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        if (mTranslateableViews != null) {
9124b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            for (int i = 0; i < mTranslateableViews.size(); i++) {
9134b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor                mTranslateableViews.get(i).setTranslationX(0);
9144b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            }
9154b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
916b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        invalidateOutline();
9174b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        if (mSettingsIconRow != null) {
9184b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mSettingsIconRow.resetState();
9194b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
9204b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    }
9214b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
9224b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    public void animateTranslateNotification(final float leftTarget) {
9234b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        if (mTranslateAnim != null) {
9244b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mTranslateAnim.cancel();
9254b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
926b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        mTranslateAnim = getTranslateViewAnimator(leftTarget, null /* updateListener */);
92734958fa272c9216db4002546c3efad692b3d7775Mady Mellor        if (mTranslateAnim != null) {
92834958fa272c9216db4002546c3efad692b3d7775Mady Mellor            mTranslateAnim.start();
92934958fa272c9216db4002546c3efad692b3d7775Mady Mellor        }
93034958fa272c9216db4002546c3efad692b3d7775Mady Mellor    }
93134958fa272c9216db4002546c3efad692b3d7775Mady Mellor
93234958fa272c9216db4002546c3efad692b3d7775Mady Mellor    @Override
93334958fa272c9216db4002546c3efad692b3d7775Mady Mellor    public void setTranslation(float translationX) {
93434958fa272c9216db4002546c3efad692b3d7775Mady Mellor        if (areGutsExposed()) {
93534958fa272c9216db4002546c3efad692b3d7775Mady Mellor            // Don't translate if guts are showing.
93634958fa272c9216db4002546c3efad692b3d7775Mady Mellor            return;
93734958fa272c9216db4002546c3efad692b3d7775Mady Mellor        }
93834958fa272c9216db4002546c3efad692b3d7775Mady Mellor        // Translate the group of views
93934958fa272c9216db4002546c3efad692b3d7775Mady Mellor        for (int i = 0; i < mTranslateableViews.size(); i++) {
94034958fa272c9216db4002546c3efad692b3d7775Mady Mellor            if (mTranslateableViews.get(i) != null) {
94134958fa272c9216db4002546c3efad692b3d7775Mady Mellor                mTranslateableViews.get(i).setTranslationX(translationX);
94234958fa272c9216db4002546c3efad692b3d7775Mady Mellor            }
94334958fa272c9216db4002546c3efad692b3d7775Mady Mellor        }
944b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        invalidateOutline();
94534958fa272c9216db4002546c3efad692b3d7775Mady Mellor        if (mSettingsIconRow != null) {
94634958fa272c9216db4002546c3efad692b3d7775Mady Mellor            mSettingsIconRow.updateSettingsIcons(translationX, getMeasuredWidth());
94734958fa272c9216db4002546c3efad692b3d7775Mady Mellor        }
94834958fa272c9216db4002546c3efad692b3d7775Mady Mellor    }
94934958fa272c9216db4002546c3efad692b3d7775Mady Mellor
95034958fa272c9216db4002546c3efad692b3d7775Mady Mellor    @Override
95134958fa272c9216db4002546c3efad692b3d7775Mady Mellor    public float getTranslation() {
95234958fa272c9216db4002546c3efad692b3d7775Mady Mellor        if (mTranslateableViews != null && mTranslateableViews.size() > 0) {
95334958fa272c9216db4002546c3efad692b3d7775Mady Mellor            // All of the views in the list should have same translation, just use first one.
95434958fa272c9216db4002546c3efad692b3d7775Mady Mellor            return mTranslateableViews.get(0).getTranslationX();
95534958fa272c9216db4002546c3efad692b3d7775Mady Mellor        }
95634958fa272c9216db4002546c3efad692b3d7775Mady Mellor        return 0;
95734958fa272c9216db4002546c3efad692b3d7775Mady Mellor    }
95834958fa272c9216db4002546c3efad692b3d7775Mady Mellor
95934958fa272c9216db4002546c3efad692b3d7775Mady Mellor    public Animator getTranslateViewAnimator(final float leftTarget,
96034958fa272c9216db4002546c3efad692b3d7775Mady Mellor            AnimatorUpdateListener listener) {
961723f1f996fd78f08e5e91ed57420bd431e11f903Mady Mellor        if (mTranslateAnim != null) {
962723f1f996fd78f08e5e91ed57420bd431e11f903Mady Mellor            mTranslateAnim.cancel();
963723f1f996fd78f08e5e91ed57420bd431e11f903Mady Mellor        }
96434958fa272c9216db4002546c3efad692b3d7775Mady Mellor        if (areGutsExposed()) {
96534958fa272c9216db4002546c3efad692b3d7775Mady Mellor            // No translation if guts are exposed.
96634958fa272c9216db4002546c3efad692b3d7775Mady Mellor            return null;
96734958fa272c9216db4002546c3efad692b3d7775Mady Mellor        }
968b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        final ObjectAnimator translateAnim = ObjectAnimator.ofFloat(this, TRANSLATE_CONTENT,
969b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                leftTarget);
970b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (listener != null) {
971b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            translateAnim.addUpdateListener(listener);
972b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        }
973b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        translateAnim.addListener(new AnimatorListenerAdapter() {
974b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            boolean cancelled = false;
975723f1f996fd78f08e5e91ed57420bd431e11f903Mady Mellor
976b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            @Override
977b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            public void onAnimationCancel(Animator anim) {
978b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                cancelled = true;
979b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            }
980723f1f996fd78f08e5e91ed57420bd431e11f903Mady Mellor
981b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            @Override
982b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            public void onAnimationEnd(Animator anim) {
983b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                if (!cancelled && mSettingsIconRow != null && leftTarget == 0) {
984b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    mSettingsIconRow.resetState();
985b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    mTranslateAnim = null;
986723f1f996fd78f08e5e91ed57420bd431e11f903Mady Mellor                }
9874b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            }
988b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        });
989b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        mTranslateAnim = translateAnim;
990b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        return translateAnim;
9914b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    }
9924b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
9934b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    public float getSpaceForGear() {
9944b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        if (mSettingsIconRow != null) {
9954b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            return mSettingsIconRow.getSpaceForGear();
9964b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
9974b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        return 0;
9984b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    }
9994b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
10004b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    public NotificationSettingsIconRow getSettingsRow() {
10014b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        if (mSettingsIconRow == null) {
10024b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mSettingsIconRowStub.inflate();
10034b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
10044b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        return mSettingsIconRow;
10054b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    }
10064b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
1007ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek    public void inflateGuts() {
1008ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek        if (mGuts == null) {
1009ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek            mGutsStub.inflate();
1010ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek        }
1011ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek    }
1012ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek
1013da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek    private void updateChildrenVisibility() {
1014d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        mPrivateLayout.setVisibility(!mShowingPublic && !mIsSummaryWithChildren ? VISIBLE
1015d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                : INVISIBLE);
1016ef5127ea5f34f7a4c961021f6b691174bcb81d2eSelim Cinek        if (mChildrenContainer != null) {
1017ef5127ea5f34f7a4c961021f6b691174bcb81d2eSelim Cinek            mChildrenContainer.setVisibility(!mShowingPublic && mIsSummaryWithChildren ? VISIBLE
1018ef5127ea5f34f7a4c961021f6b691174bcb81d2eSelim Cinek                    : INVISIBLE);
1019b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mChildrenContainer.updateHeaderVisibility(!mShowingPublic && mIsSummaryWithChildren
1020b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    ? VISIBLE
1021ef5127ea5f34f7a4c961021f6b691174bcb81d2eSelim Cinek                    : INVISIBLE);
1022b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
1023da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        // The limits might have changed if the view suddenly became a group or vice versa
1024da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        updateLimits();
1025b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
1026b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
1027fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi    @Override
1028a54956a0bc611b1e9b3914edc7a604b59688f6b7Alan Viverette    public boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) {
1029a54956a0bc611b1e9b3914edc7a604b59688f6b7Alan Viverette        if (super.onRequestSendAccessibilityEventInternal(child, event)) {
1030fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            // Add a record for the entire layout since its content is somehow small.
1031fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            // The event comes from a leaf view that is interacted with.
1032fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            AccessibilityEvent record = AccessibilityEvent.obtain();
1033fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            onInitializeAccessibilityEvent(record);
1034fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            dispatchPopulateAccessibilityEvent(record);
1035fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            event.appendRecord(record);
1036fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            return true;
1037fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi        }
1038fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi        return false;
1039c5dc0d0cce373fbf292e13633c114a431d747167Jorim Jaggi    }
104051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
1041e15452bb49d2531eee3086acb4763dd125f8053aJohn Spurlock    @Override
10424e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    public void setDark(boolean dark, boolean fade, long delay) {
10434e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        super.setDark(dark, fade, delay);
1044e15452bb49d2531eee3086acb4763dd125f8053aJohn Spurlock        final NotificationContentView showing = getShowingLayout();
1045e15452bb49d2531eee3086acb4763dd125f8053aJohn Spurlock        if (showing != null) {
10464e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            showing.setDark(dark, fade, delay);
1047e15452bb49d2531eee3086acb4763dd125f8053aJohn Spurlock        }
10489c7712d45ccec56a80873a83e56a83f810624b43Selim Cinek        if (mIsSummaryWithChildren) {
1049c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek            mChildrenContainer.setDark(dark, fade, delay);
10509c7712d45ccec56a80873a83e56a83f810624b43Selim Cinek        }
1051e15452bb49d2531eee3086acb4763dd125f8053aJohn Spurlock    }
1052e15452bb49d2531eee3086acb4763dd125f8053aJohn Spurlock
105351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public boolean isExpandable() {
1054388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek        if (mIsSummaryWithChildren && !mShowingPublic) {
1055388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek            return !mChildrenExpanded;
1056388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek        }
105751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        return mExpandable;
105851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
105951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
106051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public void setExpandable(boolean expandable) {
106151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        mExpandable = expandable;
1062eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        mPrivateLayout.updateExpandButtons(isExpandable());
106351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
106451c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
10654ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek    @Override
10664ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek    public void setClipToActualHeight(boolean clipToActualHeight) {
1067084c16b8b380e7ff0d38d9e2846db321f0214931Selim Cinek        super.setClipToActualHeight(clipToActualHeight || isUserLocked());
1068084c16b8b380e7ff0d38d9e2846db321f0214931Selim Cinek        getShowingLayout().setClipToActualHeight(clipToActualHeight || isUserLocked());
10694ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek    }
10704ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek
10711685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
10721685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * @return whether the user has changed the expansion state
10731685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     */
10741685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    public boolean hasUserChangedExpansion() {
10751685e634fb0b14033bd436af8d7174436699ffecSelim Cinek        return mHasUserChangedExpansion;
10761685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    }
10771685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
107851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public boolean isUserExpanded() {
107951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        return mUserExpanded;
108051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
108151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
10821685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
10831685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * Set this notification to be expanded by the user
10841685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     *
10851685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * @param userExpanded whether the user wants this notification to be expanded
10861685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     */
108751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public void setUserExpanded(boolean userExpanded) {
1088388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek        setUserExpanded(userExpanded, false /* allowChildExpansion */);
1089388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek    }
1090388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek
1091388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek    /**
1092388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek     * Set this notification to be expanded by the user
1093388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek     *
1094388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek     * @param userExpanded whether the user wants this notification to be expanded
1095388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek     * @param allowChildExpansion whether a call to this method allows expanding children
1096388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek     */
1097388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek    public void setUserExpanded(boolean userExpanded, boolean allowChildExpansion) {
10980e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        mFalsingManager.setNotificationExpanded();
1099388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek        if (mIsSummaryWithChildren && !mShowingPublic && allowChildExpansion) {
1100698b1706be196de41fc6bf03cf15971c82a11949Chris Wren            final boolean wasExpanded = mGroupManager.isGroupExpanded(mStatusBarNotification);
1101388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek            mGroupManager.setGroupExpanded(mStatusBarNotification, userExpanded);
1102698b1706be196de41fc6bf03cf15971c82a11949Chris Wren            logExpansionEvent(true /* userAction */, wasExpanded);
1103388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek            return;
1104388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek        }
1105a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer        if (userExpanded && !mExpandable) return;
110678403d79739605511ea88b653564d81d7bf4bbbaChris Wren        final boolean wasExpanded = isExpanded();
11071685e634fb0b14033bd436af8d7174436699ffecSelim Cinek        mHasUserChangedExpansion = true;
110851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        mUserExpanded = userExpanded;
110978403d79739605511ea88b653564d81d7bf4bbbaChris Wren        logExpansionEvent(true, wasExpanded);
111051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
111151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
1112ccd14fbcfe613eae71f0e00c39f38e5125749389Selim Cinek    public void resetUserExpansion() {
1113ccd14fbcfe613eae71f0e00c39f38e5125749389Selim Cinek        mHasUserChangedExpansion = false;
1114ccd14fbcfe613eae71f0e00c39f38e5125749389Selim Cinek        mUserExpanded = false;
1115ccd14fbcfe613eae71f0e00c39f38e5125749389Selim Cinek    }
1116ccd14fbcfe613eae71f0e00c39f38e5125749389Selim Cinek
111751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public boolean isUserLocked() {
11181b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek        return mUserLocked && !mForceUnlocked;
111951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
112051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
112151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public void setUserLocked(boolean userLocked) {
112251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        mUserLocked = userLocked;
11238f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek        mPrivateLayout.setUserExpanding(userLocked);
112442357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        if (mIsSummaryWithChildren) {
112542357e030c095867b95e2e8a718649587c5ebf52Selim Cinek            mChildrenContainer.setUserLocked(userLocked);
11267baaa9e82bebc6b3e7735828dbf67340eebc5821Selim Cinek            if (userLocked || !isGroupExpanded()) {
1127b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                updateBackgroundForGroupState();
1128b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            }
112942357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        }
113051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
113151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
11321685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
11331685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * @return has the system set this notification to be expanded
11341685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     */
11351685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    public boolean isSystemExpanded() {
11361685e634fb0b14033bd436af8d7174436699ffecSelim Cinek        return mIsSystemExpanded;
11371685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    }
11381685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
11391685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
11401685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * Set this notification to be expanded by the system.
11411685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     *
11421685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * @param expand whether the system wants this notification to be expanded.
11431685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     */
11441685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    public void setSystemExpanded(boolean expand) {
114531094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        if (expand != mIsSystemExpanded) {
114631094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            final boolean wasExpanded = isExpanded();
114731094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            mIsSystemExpanded = expand;
1148b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            notifyHeightChanged(false /* needsAnimation */);
114931094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            logExpansionEvent(false, wasExpanded);
1150ed6913b0ce99784188713975218dcff113a3d4a7Selim Cinek            if (mIsSummaryWithChildren) {
1151c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek                mChildrenContainer.updateGroupOverflow();
1152c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek            }
115331094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        }
1154dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi    }
1155dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi
1156dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi    /**
115783bc78338437a460076a4b5778ded38440ac3501Selim Cinek     * @param onKeyguard whether to prevent notification expansion
1158dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi     */
115983bc78338437a460076a4b5778ded38440ac3501Selim Cinek    public void setOnKeyguard(boolean onKeyguard) {
116083bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (onKeyguard != mOnKeyguard) {
116131094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            final boolean wasExpanded = isExpanded();
116283bc78338437a460076a4b5778ded38440ac3501Selim Cinek            mOnKeyguard = onKeyguard;
116331094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            logExpansionEvent(false, wasExpanded);
116431094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            if (wasExpanded != isExpanded()) {
1165c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek                if (mIsSummaryWithChildren) {
1166c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek                    mChildrenContainer.updateGroupOverflow();
1167c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek                }
11684b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor                notifyHeightChanged(false /* needsAnimation */);
116931094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            }
117031094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        }
11711685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    }
11721685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
11731685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
11749e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     * @return Can the underlying notification be cleared? This can be different from whether the
11759e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     *         notification can be dismissed in case notifications are sensitive on the lockscreen.
11769e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     * @see #canViewBeDismissed()
11770d3e62f3e07a69f21c1b1dfa2c8c0fb8b6c95655Dan Sandler     */
11780d3e62f3e07a69f21c1b1dfa2c8c0fb8b6c95655Dan Sandler    public boolean isClearable() {
1179506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek        if (mStatusBarNotification == null || !mStatusBarNotification.isClearable()) {
1180506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek            return false;
1181506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek        }
1182506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek        if (mIsSummaryWithChildren) {
1183506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek            List<ExpandableNotificationRow> notificationChildren =
1184506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek                    mChildrenContainer.getNotificationChildren();
1185506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek            for (int i = 0; i < notificationChildren.size(); i++) {
1186506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek                ExpandableNotificationRow child = notificationChildren.get(i);
1187506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek                if (!child.isClearable()) {
1188506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek                    return false;
1189506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek                }
1190506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek            }
1191506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek        }
1192506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek        return true;
11930d3e62f3e07a69f21c1b1dfa2c8c0fb8b6c95655Dan Sandler    }
11940d3e62f3e07a69f21c1b1dfa2c8c0fb8b6c95655Dan Sandler
11959cbadd3c08a7d7dd3412743dd04aecb16c5a1595Jorim Jaggi    @Override
11969cbadd3c08a7d7dd3412743dd04aecb16c5a1595Jorim Jaggi    public int getIntrinsicHeight() {
1197be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi        if (isUserLocked()) {
1198be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi            return getActualHeight();
1199be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi        }
1200d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        if (mGuts != null && mGuts.areGutsExposed()) {
1201d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            return mGuts.getHeight();
1202d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        } else if ((isChildInGroup() && !isGroupExpanded())) {
1203d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            return mPrivateLayout.getMinHeight();
1204d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        } else if (mSensitive && mHideSensitiveForIntrinsicHeight) {
1205d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            return getMinHeight();
120683bc78338437a460076a4b5778ded38440ac3501Selim Cinek        } else if (mIsSummaryWithChildren && !mOnKeyguard) {
1207eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek            return mChildrenContainer.getIntrinsicHeight();
120873cf02a0783e3857cae21fece9c292abcc9e1409Selim Cinek        } else if (mIsHeadsUp || mHeadsupDisappearRunning) {
120973cf02a0783e3857cae21fece9c292abcc9e1409Selim Cinek            if (isPinned() || mHeadsupDisappearRunning) {
121031aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                return getPinnedHeadsUpHeight(true /* atLeastMinHeight */);
121131aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            } else if (isExpanded()) {
1212d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                return Math.max(getMaxExpandHeight(), mHeadsUpHeight);
12138d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek            } else {
1214567e845d99840a6e556595739a15e16132eb2f1eSelim Cinek                return Math.max(getCollapsedHeight(), mHeadsUpHeight);
12158d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek            }
121631aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        } else if (isExpanded()) {
121783bc78338437a460076a4b5778ded38440ac3501Selim Cinek            return getMaxExpandHeight();
1218d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        } else {
1219567e845d99840a6e556595739a15e16132eb2f1eSelim Cinek            return getCollapsedHeight();
12201685e634fb0b14033bd436af8d7174436699ffecSelim Cinek        }
1221b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
12221685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
1223b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public boolean isGroupExpanded() {
1224eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek        return mGroupManager.isGroupExpanded(mStatusBarNotification);
1225b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
1226b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
1227263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    private void onChildrenCountChanged() {
12288fc93c90839e5d9dd52bca9dd97c198c0fe68af1Selim Cinek        mIsSummaryWithChildren = BaseStatusBar.ENABLE_CHILD_NOTIFICATIONS
1229b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                && mChildrenContainer != null && mChildrenContainer.getNotificationChildCount() > 0;
1230b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (mIsSummaryWithChildren && mChildrenContainer.getHeaderView() == null) {
1231b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mChildrenContainer.recreateNotificationHeader(mExpandClickListener,
1232b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    mEntry.notification);
1233263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        }
12346baed9e3a272b09e87f15801a389d7714d0b051fMady Mellor        getShowingLayout().updateBackgroundColor(false /* animate */);
1235eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        mPrivateLayout.updateExpandButtons(isExpandable());
1236ea4bef7386ca6c6260f292bf006d16a99b93f698Selim Cinek        updateChildrenHeaderAppearance();
1237da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        updateChildrenVisibility();
1238263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    }
1239263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek
1240b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public void updateChildrenHeaderAppearance() {
1241ed6913b0ce99784188713975218dcff113a3d4a7Selim Cinek        if (mIsSummaryWithChildren) {
1242b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mChildrenContainer.updateChildrenHeaderAppearance();
1243b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        }
1244b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    }
1245b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
12461685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
12471685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * Check whether the view state is currently expanded. This is given by the system in {@link
12481685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * #setSystemExpanded(boolean)} and can be overridden by user expansion or
12491685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * collapsing in {@link #setUserExpanded(boolean)}. Note that the visual appearance of this
12501685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * view can differ from this state, if layout params are modified from outside.
12511685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     *
12521685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * @return whether the view state is currently expanded.
12531685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     */
125483bc78338437a460076a4b5778ded38440ac3501Selim Cinek    public boolean isExpanded() {
1255e81b82ba252582753cb87ba424c82028b6e490ecSelim Cinek        return isExpanded(false /* allowOnKeyguard */);
1256e81b82ba252582753cb87ba424c82028b6e490ecSelim Cinek    }
1257e81b82ba252582753cb87ba424c82028b6e490ecSelim Cinek
1258e81b82ba252582753cb87ba424c82028b6e490ecSelim Cinek    public boolean isExpanded(boolean allowOnKeyguard) {
1259e81b82ba252582753cb87ba424c82028b6e490ecSelim Cinek        return (!mOnKeyguard || allowOnKeyguard)
1260b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek                && (!hasUserChangedExpansion() && (isSystemExpanded() || isSystemChildExpanded())
1261b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek                || isUserExpanded());
1262b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
1263b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
1264b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private boolean isSystemChildExpanded() {
1265b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        return mIsSystemChildExpanded;
1266b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
1267b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
1268b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void setSystemChildExpanded(boolean expanded) {
1269b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mIsSystemChildExpanded = expanded;
12701685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    }
12711685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
12721685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    @Override
12731685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
12741685e634fb0b14033bd436af8d7174436699ffecSelim Cinek        super.onLayout(changed, left, top, right, bottom);
12758d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        updateMaxHeights();
1276a6edc878293e49594a6aac7a0d0e41c7980ece07Mady Mellor        if (mSettingsIconRow != null) {
1277a6edc878293e49594a6aac7a0d0e41c7980ece07Mady Mellor            mSettingsIconRow.updateVerticalLocation();
1278a6edc878293e49594a6aac7a0d0e41c7980ece07Mady Mellor        }
12791685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    }
12801685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
12818d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    private void updateMaxHeights() {
1282d2319fbe6a53ac4c38ca02e4d8e32da86ed0994bSelim Cinek        int intrinsicBefore = getIntrinsicHeight();
12838d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        View expandedChild = mPrivateLayout.getExpandedChild();
12848d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        if (expandedChild == null) {
12858d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek            expandedChild = mPrivateLayout.getContractedChild();
12868d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        }
12878d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        mMaxExpandHeight = expandedChild.getHeight();
12888d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        View headsUpChild = mPrivateLayout.getHeadsUpChild();
12891f3f544f21cab3728f749ab66cd6859e9dfcf389Selim Cinek        if (headsUpChild == null) {
12901f3f544f21cab3728f749ab66cd6859e9dfcf389Selim Cinek            headsUpChild = mPrivateLayout.getContractedChild();
12918d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        }
12921f3f544f21cab3728f749ab66cd6859e9dfcf389Selim Cinek        mHeadsUpHeight = headsUpChild.getHeight();
1293d2319fbe6a53ac4c38ca02e4d8e32da86ed0994bSelim Cinek        if (intrinsicBefore != getIntrinsicHeight()) {
1294bb42b7dd4892a8ab99f2f702cad931235d1d463eSelim Cinek            notifyHeightChanged(true  /* needsAnimation */);
1295d2319fbe6a53ac4c38ca02e4d8e32da86ed0994bSelim Cinek        }
1296d2319fbe6a53ac4c38ca02e4d8e32da86ed0994bSelim Cinek    }
1297d2319fbe6a53ac4c38ca02e4d8e32da86ed0994bSelim Cinek
1298fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek    @Override
1299fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek    public void notifyHeightChanged(boolean needsAnimation) {
1300fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek        super.notifyHeightChanged(needsAnimation);
1301fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek        getShowingLayout().requestSelectLayout(needsAnimation || isUserLocked());
1302fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek    }
1303fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek
13043c76d509d362cf5086a63722ab41e04f5d539182Selim Cinek    public void setSensitive(boolean sensitive, boolean hideSensitive) {
1305ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        mSensitive = sensitive;
13063c76d509d362cf5086a63722ab41e04f5d539182Selim Cinek        mSensitiveHiddenInGeneral = hideSensitive;
1307ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    }
1308ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi
1309ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    public void setHideSensitiveForIntrinsicHeight(boolean hideSensitive) {
131060122be6747c4f79b96f6808158f8f7e7548b7d3Selim Cinek        mHideSensitiveForIntrinsicHeight = hideSensitive;
1311a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek        if (mIsSummaryWithChildren) {
1312a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek            List<ExpandableNotificationRow> notificationChildren =
1313a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek                    mChildrenContainer.getNotificationChildren();
1314a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek            for (int i = 0; i < notificationChildren.size(); i++) {
1315a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek                ExpandableNotificationRow child = notificationChildren.get(i);
1316a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek                child.setHideSensitiveForIntrinsicHeight(hideSensitive);
1317a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek            }
1318a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek        }
1319ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    }
1320ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi
1321ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    public void setHideSensitive(boolean hideSensitive, boolean animated, long delay,
1322ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            long duration) {
1323ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        boolean oldShowingPublic = mShowingPublic;
1324ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        mShowingPublic = mSensitive && hideSensitive;
1325ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        if (mShowingPublicInitialized && mShowingPublic == oldShowingPublic) {
1326ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            return;
1327ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        }
1328a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler
1329a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler        // bail out if no public version
13301685e634fb0b14033bd436af8d7174436699ffecSelim Cinek        if (mPublicLayout.getChildCount() == 0) return;
1331a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler
1332ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        if (!animated) {
1333ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            mPublicLayout.animate().cancel();
1334ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            mPrivateLayout.animate().cancel();
1335a554c707386eb8a6c6fb3a2399f23b79a1c17f74Selim Cinek            if (mChildrenContainer != null) {
1336a554c707386eb8a6c6fb3a2399f23b79a1c17f74Selim Cinek                mChildrenContainer.animate().cancel();
1337a554c707386eb8a6c6fb3a2399f23b79a1c17f74Selim Cinek                mChildrenContainer.setAlpha(1f);
1338a554c707386eb8a6c6fb3a2399f23b79a1c17f74Selim Cinek            }
1339ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            mPublicLayout.setAlpha(1f);
1340ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            mPrivateLayout.setAlpha(1f);
1341ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            mPublicLayout.setVisibility(mShowingPublic ? View.VISIBLE : View.INVISIBLE);
1342d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            updateChildrenVisibility();
1343ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        } else {
1344ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            animateShowingPublic(delay, duration);
1345ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        }
1346c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek        NotificationContentView showingLayout = getShowingLayout();
1347c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek        showingLayout.updateBackgroundColor(animated);
1348eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        mPrivateLayout.updateExpandButtons(isExpandable());
1349e5726a20824c3cb2ff369207c8d75bfcdb814f69Adrian Roos        showingLayout.setDark(isDark(), false /* animate */, 0 /* delay */);
1350ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        mShowingPublicInitialized = true;
1351ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    }
1352ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi
1353ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    private void animateShowingPublic(long delay, long duration) {
1354b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        View[] privateViews = mIsSummaryWithChildren
1355b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                ? new View[] {mChildrenContainer}
1356d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                : new View[] {mPrivateLayout};
1357d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        View[] publicViews = new View[] {mPublicLayout};
1358d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        View[] hiddenChildren = mShowingPublic ? privateViews : publicViews;
1359d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        View[] shownChildren = mShowingPublic ? publicViews : privateViews;
1360d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        for (final View hiddenView : hiddenChildren) {
1361d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            hiddenView.setVisibility(View.VISIBLE);
1362d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            hiddenView.animate().cancel();
1363d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            hiddenView.animate()
1364d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .alpha(0f)
1365d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .setStartDelay(delay)
1366d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .setDuration(duration)
1367d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .withEndAction(new Runnable() {
1368d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                        @Override
1369d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                        public void run() {
1370d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                            hiddenView.setVisibility(View.INVISIBLE);
1371d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                        }
1372d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    });
1373d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        }
1374d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        for (View showView : shownChildren) {
1375d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            showView.setVisibility(View.VISIBLE);
1376d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            showView.setAlpha(0f);
1377d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            showView.animate().cancel();
1378d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            showView.animate()
1379d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .alpha(1f)
1380d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .setStartDelay(delay)
1381d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .setDuration(duration);
1382d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        }
13830d3e62f3e07a69f21c1b1dfa2c8c0fb8b6c95655Dan Sandler    }
13840d3e62f3e07a69f21c1b1dfa2c8c0fb8b6c95655Dan Sandler
13853776fe007550451bb237c705d333247eab2a291cSelim Cinek    public boolean mustStayOnScreen() {
13863776fe007550451bb237c705d333247eab2a291cSelim Cinek        return mIsHeadsUp;
13873776fe007550451bb237c705d333247eab2a291cSelim Cinek    }
13883776fe007550451bb237c705d333247eab2a291cSelim Cinek
13899e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    /**
13909e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     * @return Whether this view is allowed to be dismissed. Only valid for visible notifications as
13919e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     *         otherwise some state might not be updated. To request about the general clearability
13929e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     *         see {@link #isClearable()}.
13939e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     */
13949e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    public boolean canViewBeDismissed() {
1395e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        return isClearable() && (!mShowingPublic || !mSensitiveHiddenInGeneral);
1396a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler    }
1397251957d76e57eb6e5f8068b37346144e10e586a4Jorim Jaggi
1398cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai    public void makeActionsVisibile() {
1399cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai        setUserExpanded(true, true);
1400cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai        if (isChildInGroup()) {
1401cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai            mGroupManager.setGroupExpanded(mStatusBarNotification, true);
1402cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai        }
1403bb42b7dd4892a8ab99f2f702cad931235d1d463eSelim Cinek        notifyHeightChanged(false /* needsAnimation */);
1404cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai    }
1405cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai
1406b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void setChildrenExpanded(boolean expanded, boolean animate) {
1407b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mChildrenExpanded = expanded;
140883bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (mChildrenContainer != null) {
140983bc78338437a460076a4b5778ded38440ac3501Selim Cinek            mChildrenContainer.setChildrenExpanded(expanded);
141083bc78338437a460076a4b5778ded38440ac3501Selim Cinek        }
14111a5d8eadd56b435843dfbc1adf3779aa7286081bMady Mellor        updateBackgroundForGroupState();
1412ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        updateClickAndFocus();
1413b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
1414b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
1415b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public static void applyTint(View v, int color) {
1416b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        int alpha;
1417b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        if (color != 0) {
1418b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            alpha = COLORED_DIVIDER_ALPHA;
1419b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        } else {
1420b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            color = 0xff000000;
1421b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            alpha = DEFAULT_DIVIDER_ALPHA;
1422b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
1423b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        if (v.getBackground() instanceof ColorDrawable) {
1424b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            ColorDrawable background = (ColorDrawable) v.getBackground();
1425b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            background.mutate();
1426b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            background.setColor(color);
1427b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            background.setAlpha(alpha);
1428b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
1429b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
1430b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
14311685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    public int getMaxExpandHeight() {
1432b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        return mMaxExpandHeight;
1433a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler    }
1434584a7aa62c54bcbd654a6696d4fbb56e124874e7Jorim Jaggi
143534958fa272c9216db4002546c3efad692b3d7775Mady Mellor    public boolean areGutsExposed() {
143634958fa272c9216db4002546c3efad692b3d7775Mady Mellor        return (mGuts != null && mGuts.areGutsExposed());
143734958fa272c9216db4002546c3efad692b3d7775Mady Mellor    }
143834958fa272c9216db4002546c3efad692b3d7775Mady Mellor
1439be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    @Override
14404222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    public boolean isContentExpandable() {
14412f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek        NotificationContentView showingLayout = getShowingLayout();
14422f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek        return showingLayout.isContentExpandable();
14434222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    }
14444222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi
14454222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    @Override
1446560e64d3d95a17123048bebe2fb06ffe4567fb78Selim Cinek    protected View getContentView() {
1447aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek        if (mIsSummaryWithChildren && !mShowingPublic) {
1448a5703187a9dba418f742fab0874a8f683b0bbb0eSelim Cinek            return mChildrenContainer;
1449a5703187a9dba418f742fab0874a8f683b0bbb0eSelim Cinek        }
1450560e64d3d95a17123048bebe2fb06ffe4567fb78Selim Cinek        return getShowingLayout();
1451560e64d3d95a17123048bebe2fb06ffe4567fb78Selim Cinek    }
1452560e64d3d95a17123048bebe2fb06ffe4567fb78Selim Cinek
1453560e64d3d95a17123048bebe2fb06ffe4567fb78Selim Cinek    @Override
1454aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek    protected void onAppearAnimationFinished(boolean wasAppearing) {
1455aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek        super.onAppearAnimationFinished(wasAppearing);
1456aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek        if (wasAppearing) {
1457aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            // During the animation the visible view might have changed, so let's make sure all
1458aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            // alphas are reset
1459aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            if (mChildrenContainer != null) {
1460aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek                mChildrenContainer.setAlpha(1.0f);
1461aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek                mChildrenContainer.setLayerType(LAYER_TYPE_NONE, null);
1462aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            }
1463aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            mPrivateLayout.setAlpha(1.0f);
1464aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            mPrivateLayout.setLayerType(LAYER_TYPE_NONE, null);
1465aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            mPublicLayout.setAlpha(1.0f);
1466aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            mPublicLayout.setLayerType(LAYER_TYPE_NONE, null);
1467aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek        }
1468aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek    }
1469aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek
1470aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek    @Override
1471b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public int getExtraBottomPadding() {
1472b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (mIsSummaryWithChildren && isGroupExpanded()) {
1473b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            return mIncreasedPaddingBetweenElements;
1474b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        }
1475b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        return 0;
1476b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    }
1477b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
1478b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    @Override
1479d552d9d8e964c102e6832610be46cf2c041e8829Jorim Jaggi    public void setActualHeight(int height, boolean notifyListeners) {
1480b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        super.setActualHeight(height, notifyListeners);
1481b53bc276d6ec093817988a358b7c2a6c63ee0c48Mady Mellor        if (mGuts != null && mGuts.areGutsExposed()) {
1482b53bc276d6ec093817988a358b7c2a6c63ee0c48Mady Mellor            mGuts.setActualHeight(height);
1483b53bc276d6ec093817988a358b7c2a6c63ee0c48Mady Mellor            return;
1484b53bc276d6ec093817988a358b7c2a6c63ee0c48Mady Mellor        }
1485eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek        int contentHeight = Math.max(getMinHeight(), height);
1486b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mPrivateLayout.setContentHeight(contentHeight);
1487b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mPublicLayout.setContentHeight(contentHeight);
148842357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        if (mIsSummaryWithChildren) {
148942357e030c095867b95e2e8a718649587c5ebf52Selim Cinek            mChildrenContainer.setActualHeight(height);
149042357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        }
1491b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi        if (mGuts != null) {
1492b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi            mGuts.setActualHeight(height);
1493b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi        }
1494be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    }
1495be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi
1496be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    @Override
1497b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public int getMaxContentHeight() {
149883bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (mIsSummaryWithChildren && !mShowingPublic) {
1499eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek            return mChildrenContainer.getMaxContentHeight();
150083bc78338437a460076a4b5778ded38440ac3501Selim Cinek        }
15012f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek        NotificationContentView showingLayout = getShowingLayout();
15022f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek        return showingLayout.getMaxHeight();
1503be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    }
1504be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi
1505be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    @Override
15064222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    public int getMinHeight() {
150731aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        if (mIsHeadsUp && mHeadsUpManager.isTrackingHeadsUp()) {
150831aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                return getPinnedHeadsUpHeight(false /* atLeastMinHeight */);
150931aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        } else if (mIsSummaryWithChildren && !isGroupExpanded() && !mShowingPublic) {
1510b55386d64aeb80f74ed21035d1e389d86be89db6Selim Cinek            return mChildrenContainer.getMinHeight();
151131aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        } else if (mIsHeadsUp) {
151231aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            return mHeadsUpHeight;
1513b55386d64aeb80f74ed21035d1e389d86be89db6Selim Cinek        }
1514816c8e4735f975f4d8bffa1a5a37be6557424ea3Selim Cinek        NotificationContentView showingLayout = getShowingLayout();
1515816c8e4735f975f4d8bffa1a5a37be6557424ea3Selim Cinek        return showingLayout.getMinHeight();
1516816c8e4735f975f4d8bffa1a5a37be6557424ea3Selim Cinek    }
1517816c8e4735f975f4d8bffa1a5a37be6557424ea3Selim Cinek
1518816c8e4735f975f4d8bffa1a5a37be6557424ea3Selim Cinek    @Override
1519567e845d99840a6e556595739a15e16132eb2f1eSelim Cinek    public int getCollapsedHeight() {
15202c58461daf909fae5a2605f0ba63da3f9c897731Selim Cinek        if (mIsSummaryWithChildren && !mShowingPublic) {
1521567e845d99840a6e556595739a15e16132eb2f1eSelim Cinek            return mChildrenContainer.getCollapsedHeight();
152283bc78338437a460076a4b5778ded38440ac3501Selim Cinek        }
1523816c8e4735f975f4d8bffa1a5a37be6557424ea3Selim Cinek        return getMinHeight();
15244222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    }
15254222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi
15264222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    @Override
1527be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    public void setClipTopAmount(int clipTopAmount) {
1528be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi        super.setClipTopAmount(clipTopAmount);
1529be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi        mPrivateLayout.setClipTopAmount(clipTopAmount);
15302f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek        mPublicLayout.setClipTopAmount(clipTopAmount);
1531b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi        if (mGuts != null) {
1532b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi            mGuts.setClipTopAmount(clipTopAmount);
1533b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi        }
1534be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    }
1535be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi
153631094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek    public boolean isMaxExpandHeightInitialized() {
153731094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        return mMaxExpandHeight != 0;
15387d447726e2cb9fae80db417012039828daab8fe7Selim Cinek    }
15392f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek
154042357e030c095867b95e2e8a718649587c5ebf52Selim Cinek    public NotificationContentView getShowingLayout() {
15412f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek        return mShowingPublic ? mPublicLayout : mPrivateLayout;
15422f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek    }
154378403d79739605511ea88b653564d81d7bf4bbbaChris Wren
154459ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi    @Override
154559ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi    public void setShowingLegacyBackground(boolean showing) {
154659ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi        super.setShowingLegacyBackground(showing);
154759ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi        mPrivateLayout.setShowingLegacyBackground(showing);
154859ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi        mPublicLayout.setShowingLegacyBackground(showing);
154959ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi    }
155059ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi
1551a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek    @Override
1552a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek    protected void updateBackgroundTint() {
1553a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        super.updateBackgroundTint();
1554b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        updateBackgroundForGroupState();
1555a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        if (mIsSummaryWithChildren) {
1556a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek            List<ExpandableNotificationRow> notificationChildren =
1557a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek                    mChildrenContainer.getNotificationChildren();
1558a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek            for (int i = 0; i < notificationChildren.size(); i++) {
1559a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek                ExpandableNotificationRow child = notificationChildren.get(i);
1560b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                child.updateBackgroundForGroupState();
1561a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek            }
1562a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        }
1563a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek    }
1564a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek
1565b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    /**
1566b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor     * Called when a group has finished animating from collapsed or expanded state.
1567b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor     */
1568b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public void onFinishedExpansionChange() {
1569b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        mGroupExpansionChanging = false;
1570b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        updateBackgroundForGroupState();
1571b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    }
1572b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
1573b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    /**
1574b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor     * Updates the parent and children backgrounds in a group based on the expansion state.
1575b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor     */
1576b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public void updateBackgroundForGroupState() {
1577b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (mIsSummaryWithChildren) {
1578b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            // Only when the group has finished expanding do we hide its background.
1579b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mShowNoBackground = isGroupExpanded() && !isGroupExpansionChanging() && !isUserLocked();
1580b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mChildrenContainer.updateHeaderForExpansion(mShowNoBackground);
1581b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            List<ExpandableNotificationRow> children = mChildrenContainer.getNotificationChildren();
1582b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            for (int i = 0; i < children.size(); i++) {
1583b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                children.get(i).updateBackgroundForGroupState();
1584b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            }
1585b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        } else if (isChildInGroup()) {
1586b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            final int childColor = getShowingLayout().getBackgroundColorForExpansionState();
1587b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            // Only show a background if the group is expanded OR if it is expanding / collapsing
1588b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            // and has a custom background color
1589b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            final boolean showBackground = isGroupExpanded()
1590b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    || ((mNotificationParent.isGroupExpansionChanging()
1591b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                            || mNotificationParent.isUserLocked()) && childColor != 0);
1592b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mShowNoBackground = !showBackground;
1593b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        } else {
1594b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            // Only children or parents ever need no background.
1595b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mShowNoBackground = false;
1596b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        }
1597b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        updateOutline();
1598a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        updateBackground();
1599a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek    }
1600a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek
16014a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos    public int getPositionOfChild(ExpandableNotificationRow childRow) {
16024a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos        if (mIsSummaryWithChildren) {
16034a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos            return mChildrenContainer.getPositionInLinearLayout(childRow);
16044a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos        }
16054a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos        return 0;
16064a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos    }
16074a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos
160878403d79739605511ea88b653564d81d7bf4bbbaChris Wren    public void setExpansionLogger(ExpansionLogger logger, String key) {
160978403d79739605511ea88b653564d81d7bf4bbbaChris Wren        mLogger = logger;
161078403d79739605511ea88b653564d81d7bf4bbbaChris Wren        mLoggingKey = key;
161178403d79739605511ea88b653564d81d7bf4bbbaChris Wren    }
161278403d79739605511ea88b653564d81d7bf4bbbaChris Wren
16136abeeb91194818e1d19f75336b03d1e305af0842Chris Wren    public void onExpandedByGesture(boolean userExpanded) {
16146abeeb91194818e1d19f75336b03d1e305af0842Chris Wren        int event = MetricsEvent.ACTION_NOTIFICATION_GESTURE_EXPANDER;
16156abeeb91194818e1d19f75336b03d1e305af0842Chris Wren        if (mGroupManager.isSummaryOfGroup(getStatusBarNotification())) {
16166abeeb91194818e1d19f75336b03d1e305af0842Chris Wren            event = MetricsEvent.ACTION_NOTIFICATION_GROUP_GESTURE_EXPANDER;
16176abeeb91194818e1d19f75336b03d1e305af0842Chris Wren        }
16186abeeb91194818e1d19f75336b03d1e305af0842Chris Wren        MetricsLogger.action(mContext, event, userExpanded);
16196abeeb91194818e1d19f75336b03d1e305af0842Chris Wren    }
16206abeeb91194818e1d19f75336b03d1e305af0842Chris Wren
16216183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek    @Override
162242357e030c095867b95e2e8a718649587c5ebf52Selim Cinek    public float getIncreasedPaddingAmount() {
162342357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        if (mIsSummaryWithChildren) {
162442357e030c095867b95e2e8a718649587c5ebf52Selim Cinek            if (isGroupExpanded()) {
162542357e030c095867b95e2e8a718649587c5ebf52Selim Cinek                return 1.0f;
162642357e030c095867b95e2e8a718649587c5ebf52Selim Cinek            } else if (isUserLocked()) {
1627f07d06212b08939809aa4128f153bd5179f81fc7Selim Cinek                return mChildrenContainer.getGroupExpandFraction();
162842357e030c095867b95e2e8a718649587c5ebf52Selim Cinek            }
162942357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        }
163042357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        return 0.0f;
163161633a8db8dfdefa84b4444a7ae668d0e24f53e9Selim Cinek    }
163261633a8db8dfdefa84b4444a7ae668d0e24f53e9Selim Cinek
163361633a8db8dfdefa84b4444a7ae668d0e24f53e9Selim Cinek    @Override
16346183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek    protected boolean disallowSingleClick(MotionEvent event) {
16356183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek        float x = event.getX();
16366183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek        float y = event.getY();
163734eda5ed70863320e41b6860a550ba6a4248c652Selim Cinek        NotificationHeaderView header = getVisibleNotificationHeader();
16386183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek        if (header != null) {
1639a883351024f8dbdf8041c551f8a8987d9357dcd8Mady Mellor            return header.isInTouchRect(x - getTranslation(), y);
16406183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek        }
16416183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek        return super.disallowSingleClick(event);
16426183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek    }
16436183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek
164478403d79739605511ea88b653564d81d7bf4bbbaChris Wren    private void logExpansionEvent(boolean userAction, boolean wasExpanded) {
1645698b1706be196de41fc6bf03cf15971c82a11949Chris Wren        boolean nowExpanded = isExpanded();
1646698b1706be196de41fc6bf03cf15971c82a11949Chris Wren        if (mIsSummaryWithChildren) {
1647698b1706be196de41fc6bf03cf15971c82a11949Chris Wren            nowExpanded = mGroupManager.isGroupExpanded(mStatusBarNotification);
1648698b1706be196de41fc6bf03cf15971c82a11949Chris Wren        }
164978403d79739605511ea88b653564d81d7bf4bbbaChris Wren        if (wasExpanded != nowExpanded && mLogger != null) {
165078403d79739605511ea88b653564d81d7bf4bbbaChris Wren            mLogger.logNotificationExpansion(mLoggingKey, userAction, nowExpanded) ;
165178403d79739605511ea88b653564d81d7bf4bbbaChris Wren        }
165278403d79739605511ea88b653564d81d7bf4bbbaChris Wren    }
1653570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek
1654e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    @Override
1655e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
1656e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        super.onInitializeAccessibilityNodeInfoInternal(info);
1657e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        if (canViewBeDismissed()) {
1658e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_DISMISS);
1659e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        }
1660e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    }
1661e9bad242f38bebadae481a22b647cc153f093070Selim Cinek
1662e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    @Override
1663e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
1664e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        if (super.performAccessibilityActionInternal(action, arguments)) {
1665e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            return true;
1666e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        }
1667e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        switch (action) {
1668e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            case AccessibilityNodeInfo.ACTION_DISMISS:
1669e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                NotificationStackScrollLayout.performDismiss(this, mGroupManager,
1670e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                        true /* fromAccessibility */);
1671e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                return true;
1672e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        }
1673e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        return false;
1674e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    }
1675e9bad242f38bebadae481a22b647cc153f093070Selim Cinek
1676e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    public boolean shouldRefocusOnDismiss() {
1677e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        return mRefocusOnDismiss || isAccessibilityFocused();
1678e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    }
1679e9bad242f38bebadae481a22b647cc153f093070Selim Cinek
1680570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek    public interface OnExpandClickListener {
168131aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        void onExpandClicked(NotificationData.Entry clickedEntry, boolean nowExpanded);
1682570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek    }
168351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren}
1684