ExpandableNotificationRow.java revision 17e1b69523086a98189178fc7f2b23d74860c738
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;
39875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinekimport android.view.ViewGroup;
40b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggiimport android.view.ViewStub;
41fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggiimport android.view.accessibility.AccessibilityEvent;
42e9bad242f38bebadae481a22b647cc153f093070Selim Cinekimport android.view.accessibility.AccessibilityNodeInfo;
4398713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinekimport android.widget.Chronometer;
44cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinekimport android.widget.ImageView;
45b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
46698b1706be196de41fc6bf03cf15971c82a11949Chris Wrenimport com.android.internal.logging.MetricsLogger;
47383db5ebcc3a4a615faf249bf4f126f42e80b82eTamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
484bb593492ccf560382fac9ae533a7429cec53c94Selim Cinekimport com.android.internal.util.NotificationColorUtil;
49875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinekimport com.android.internal.widget.CachingIconView;
500242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinekimport com.android.systemui.Interpolators;
51a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandlerimport com.android.systemui.R;
520e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowskiimport com.android.systemui.classifier.FalsingManager;
53c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinekimport com.android.systemui.statusbar.notification.HybridNotificationView;
54b5605e58cb8080c8c887b1885336b707596c8094Selim Cinekimport com.android.systemui.statusbar.phone.NotificationGroupManager;
5531aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinekimport com.android.systemui.statusbar.policy.HeadsUpManager;
560cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinekimport com.android.systemui.statusbar.stack.AnimationProperties;
570cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinekimport com.android.systemui.statusbar.stack.ExpandableViewState;
58b5605e58cb8080c8c887b1885336b707596c8094Selim Cinekimport com.android.systemui.statusbar.stack.NotificationChildrenContainer;
59e9bad242f38bebadae481a22b647cc153f093070Selim Cinekimport com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
60b5605e58cb8080c8c887b1885336b707596c8094Selim Cinekimport com.android.systemui.statusbar.stack.StackScrollState;
61b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
624b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellorimport java.util.ArrayList;
63b5605e58cb8080c8c887b1885336b707596c8094Selim Cinekimport java.util.List;
64a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler
654222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggipublic class ExpandableNotificationRow extends ActivatableNotificationView {
66b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
67b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private static final int DEFAULT_DIVIDER_ALPHA = 0x29;
68b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private static final int COLORED_DIVIDER_ALPHA = 0x7B;
690242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek    private int mIconTransformContentShift;
70875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek    private int mIconTransformContentShiftNoIcon;
7101af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    private int mNotificationMinHeightLegacy;
7201af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    private int mMaxHeadsUpHeightLegacy;
7301af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    private int mMaxHeadsUpHeight;
7401af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    private int mNotificationMinHeight;
7501af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    private int mNotificationMaxHeight;
76b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    private int mIncreasedPaddingBetweenElements;
7751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
781685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /** Does this row contain layouts that can adapt to row expansion */
7951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    private boolean mExpandable;
801685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /** Has the user actively changed the expansion state of this row */
811685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    private boolean mHasUserChangedExpansion;
821685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /** If {@link #mHasUserChangedExpansion}, has the user expanded this row */
8351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    private boolean mUserExpanded;
8431aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek
8531aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek    /**
8631aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek     * Has this notification been expanded while it was pinned
8731aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek     */
8831aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek    private boolean mExpandedWhenPinned;
891685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /** Is the user touching this row */
9051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    private boolean mUserLocked;
911685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /** Are we showing the "public" version */
92a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler    private boolean mShowingPublic;
93ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    private boolean mSensitive;
943c76d509d362cf5086a63722ab41e04f5d539182Selim Cinek    private boolean mSensitiveHiddenInGeneral;
95ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    private boolean mShowingPublicInitialized;
9660122be6747c4f79b96f6808158f8f7e7548b7d3Selim Cinek    private boolean mHideSensitiveForIntrinsicHeight;
9751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
981685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
991685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * Is this notification expanded by the system. The expansion state can be overridden by the
1001685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * user expansion.
1011685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     */
1021685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    private boolean mIsSystemExpanded;
103dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi
104dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi    /**
10583bc78338437a460076a4b5778ded38440ac3501Selim Cinek     * Whether the notification is on the keyguard and the expansion is disabled.
106dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi     */
10783bc78338437a460076a4b5778ded38440ac3501Selim Cinek    private boolean mOnKeyguard;
108dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi
109b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    private Animator mTranslateAnim;
1104b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    private ArrayList<View> mTranslateableViews;
111be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    private NotificationContentView mPublicLayout;
112be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    private NotificationContentView mPrivateLayout;
1131685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    private int mMaxExpandHeight;
1148d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    private int mHeadsUpHeight;
115863834bd96bdebcf21f4c4a7d8285d4858c061e4Selim Cinek    private View mVetoButton;
1164bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek    private int mNotificationColor;
11778403d79739605511ea88b653564d81d7bf4bbbaChris Wren    private ExpansionLogger mLogger;
11878403d79739605511ea88b653564d81d7bf4bbbaChris Wren    private String mLoggingKey;
1194b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    private NotificationSettingsIconRow mSettingsIconRow;
1208d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    private NotificationGuts mGuts;
121da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek    private NotificationData.Entry mEntry;
122b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi    private StatusBarNotification mStatusBarNotification;
1233fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor    private String mAppName;
1241a521f3ea841f6db9686bbec7f950a3883d075aaSelim Cinek    private boolean mIsHeadsUp;
12598713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    private boolean mLastChronometerRunning = true;
126b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private ViewStub mChildrenContainerStub;
127b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private NotificationGroupManager mGroupManager;
128b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private boolean mChildrenExpanded;
129263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    private boolean mIsSummaryWithChildren;
130b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private NotificationChildrenContainer mChildrenContainer;
1314b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    private ViewStub mSettingsIconRowStub;
132ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek    private ViewStub mGutsStub;
133b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private boolean mIsSystemChildExpanded;
134684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    private boolean mIsPinned;
1350e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski    private FalsingManager mFalsingManager;
13631aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek    private HeadsUpManager mHeadsUpManager;
137b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi
1385eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    private boolean mJustClicked;
1395a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek    private boolean mIconAnimationRunning;
14034d93b0985063090a9bad88a1b80e1b99bae3332Selim Cinek    private boolean mShowNoBackground;
141388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek    private ExpandableNotificationRow mNotificationParent;
142570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek    private OnExpandClickListener mOnExpandClickListener;
143b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    private boolean mGroupExpansionChanging;
144b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
145eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek    private OnClickListener mExpandClickListener = new OnClickListener() {
146eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        @Override
147eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        public void onClick(View v) {
148624c02db7f1d24ec1e307530ff32d4fd5859feaeSelim Cinek            if (!mShowingPublic && mGroupManager.isSummaryOfGroup(mStatusBarNotification)) {
1491a5d8eadd56b435843dfbc1adf3779aa7286081bMady Mellor                mGroupExpansionChanging = true;
150698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                final boolean wasExpanded = mGroupManager.isGroupExpanded(mStatusBarNotification);
151698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                boolean nowExpanded = mGroupManager.toggleGroupExpansion(mStatusBarNotification);
152698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                mOnExpandClickListener.onExpandClicked(mEntry, nowExpanded);
153698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                MetricsLogger.action(mContext, MetricsEvent.ACTION_NOTIFICATION_GROUP_EXPANDER,
154698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                        nowExpanded);
155698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                logExpansionEvent(true /* userAction */, wasExpanded);
156eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek            } else {
157e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                if (v.isAccessibilityFocused()) {
158e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                    mPrivateLayout.setFocusOnVisibilityChange();
159e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                }
16031aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                boolean nowExpanded;
16131aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                if (isPinned()) {
16231aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                    nowExpanded = !mExpandedWhenPinned;
16331aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                    mExpandedWhenPinned = nowExpanded;
16431aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                } else {
16531aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                    nowExpanded = !isExpanded();
16631aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                    setUserExpanded(nowExpanded);
16731aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                }
168eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek                notifyHeightChanged(true);
16931aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                mOnExpandClickListener.onExpandClicked(mEntry, nowExpanded);
170698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                MetricsLogger.action(mContext, MetricsEvent.ACTION_NOTIFICATION_EXPANDER,
171698b1706be196de41fc6bf03cf15971c82a11949Chris Wren                        nowExpanded);
172eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek            }
173eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        }
174eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek    };
1751b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek    private boolean mForceUnlocked;
1763f19f60d654421eee5b35a92129081f08c977629Selim Cinek    private boolean mDismissed;
1773f19f60d654421eee5b35a92129081f08c977629Selim Cinek    private boolean mKeepInParent;
1783f19f60d654421eee5b35a92129081f08c977629Selim Cinek    private boolean mRemoved;
179b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    private static final Property<ExpandableNotificationRow, Float> TRANSLATE_CONTENT =
180b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            new FloatProperty<ExpandableNotificationRow>("translate") {
181b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                @Override
182b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                public void setValue(ExpandableNotificationRow object, float value) {
183b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    object.setTranslation(value);
184b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                }
185b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
186b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                @Override
187b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                public Float get(ExpandableNotificationRow object) {
188b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    return object.getTranslation();
189b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                }
190b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    };
191ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek    private OnClickListener mOnClickListener;
19273cf02a0783e3857cae21fece9c292abcc9e1409Selim Cinek    private boolean mHeadsupDisappearRunning;
193e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    private View mChildAfterViewWhenDismissed;
194e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    private View mGroupParentWhenDismissed;
195e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    private boolean mRefocusOnDismiss;
1962b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek    private float mContentTransformationAmount;
1970242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek    private boolean mIconsVisible = true;
198d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek    private boolean mAboveShelf;
199875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek    private boolean mIsLastChild;
200b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
201b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public boolean isGroupExpansionChanging() {
202b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (isChildInGroup()) {
203b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            return mNotificationParent.isGroupExpansionChanging();
204b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        }
205b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        return mGroupExpansionChanging;
206b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    }
207b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
208b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public void setGroupExpansionChanging(boolean changing) {
209b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        mGroupExpansionChanging = changing;
210b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    }
2115eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi
212599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos    @Override
213599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos    public void setActualHeightAnimating(boolean animating) {
214599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos        if (mPrivateLayout != null) {
215599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos            mPrivateLayout.setContentHeightAnimating(animating);
216599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos        }
217599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos    }
218599be34e6e3274e97512f3970a0d6edddedb8eb4Adrian Roos
2198d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    public NotificationContentView getPrivateLayout() {
2208d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        return mPrivateLayout;
2218d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    }
2228d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek
2238d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    public NotificationContentView getPublicLayout() {
2248d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        return mPublicLayout;
2258d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    }
2268d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek
227cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    public void setIconAnimationRunning(boolean running) {
228cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        setIconAnimationRunning(running, mPublicLayout);
229cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        setIconAnimationRunning(running, mPrivateLayout);
2305a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek        if (mIsSummaryWithChildren) {
231b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            setIconAnimationRunningForChild(running, mChildrenContainer.getHeaderView());
2325a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek            List<ExpandableNotificationRow> notificationChildren =
2335a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek                    mChildrenContainer.getNotificationChildren();
2345a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek            for (int i = 0; i < notificationChildren.size(); i++) {
2355a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek                ExpandableNotificationRow child = notificationChildren.get(i);
2365a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek                child.setIconAnimationRunning(running);
2375a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek            }
2385a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek        }
2395a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek        mIconAnimationRunning = running;
240cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    }
241cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek
242cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    private void setIconAnimationRunning(boolean running, NotificationContentView layout) {
243cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        if (layout != null) {
244cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            View contractedChild = layout.getContractedChild();
245cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            View expandedChild = layout.getExpandedChild();
2468d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek            View headsUpChild = layout.getHeadsUpChild();
247cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            setIconAnimationRunningForChild(running, contractedChild);
248cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            setIconAnimationRunningForChild(running, expandedChild);
2498d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek            setIconAnimationRunningForChild(running, headsUpChild);
250cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        }
251cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    }
252cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek
253cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    private void setIconAnimationRunningForChild(boolean running, View child) {
254cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        if (child != null) {
255cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            ImageView icon = (ImageView) child.findViewById(com.android.internal.R.id.icon);
256cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            setIconRunning(icon, running);
257cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            ImageView rightIcon = (ImageView) child.findViewById(
258cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                    com.android.internal.R.id.right_icon);
259cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            setIconRunning(rightIcon, running);
260cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        }
261cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    }
262cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek
263cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    private void setIconRunning(ImageView imageView, boolean running) {
264cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        if (imageView != null) {
265cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            Drawable drawable = imageView.getDrawable();
266cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            if (drawable instanceof AnimationDrawable) {
267cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                AnimationDrawable animationDrawable = (AnimationDrawable) drawable;
268cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                if (running) {
269cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                    animationDrawable.start();
270cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                } else {
271cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                    animationDrawable.stop();
272cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                }
273cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            } else if (drawable instanceof AnimatedVectorDrawable) {
274cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                AnimatedVectorDrawable animationDrawable = (AnimatedVectorDrawable) drawable;
275cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                if (running) {
276cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                    animationDrawable.start();
277cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                } else {
278cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                    animationDrawable.stop();
279cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek                }
280cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek            }
281cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek        }
282cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek    }
283cab4a60c485872848fc0fa3e65baaeb06d21a7d8Selim Cinek
284da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek    public void onNotificationUpdated(NotificationData.Entry entry) {
285da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        mEntry = entry;
286da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        mStatusBarNotification = entry.notification;
287b88b1a1dbde3364cd92d6a69a41ef2d4e2877294Adrian Roos        mPrivateLayout.onNotificationUpdated(entry);
288b88b1a1dbde3364cd92d6a69a41ef2d4e2877294Adrian Roos        mPublicLayout.onNotificationUpdated(entry);
289757d879966fdbff1b67c9ec6fd4b6c75152b991aSelim Cinek        mShowingPublicInitialized = false;
2904bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek        updateNotificationColor();
2918fc93c90839e5d9dd52bca9dd97c198c0fe68af1Selim Cinek        if (mIsSummaryWithChildren) {
292b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mChildrenContainer.recreateNotificationHeader(mExpandClickListener, mEntry.notification);
293c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek            mChildrenContainer.onNotificationUpdated();
2948fc93c90839e5d9dd52bca9dd97c198c0fe68af1Selim Cinek        }
2955a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek        if (mIconAnimationRunning) {
2965a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek            setIconAnimationRunning(true);
2975a175d9d543c4438672990aa8a820bd1292bdd6aSelim Cinek        }
298ea4bef7386ca6c6260f292bf006d16a99b93f698Selim Cinek        if (mNotificationParent != null) {
299ea4bef7386ca6c6260f292bf006d16a99b93f698Selim Cinek            mNotificationParent.updateChildrenHeaderAppearance();
300ea4bef7386ca6c6260f292bf006d16a99b93f698Selim Cinek        }
301263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        onChildrenCountChanged();
302624c02db7f1d24ec1e307530ff32d4fd5859feaeSelim Cinek        // The public layouts expand button is always visible
303624c02db7f1d24ec1e307530ff32d4fd5859feaeSelim Cinek        mPublicLayout.updateExpandButtons(true);
304da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        updateLimits();
3050242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek        updateIconVisibilities();
306da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek    }
307da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek
308da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek    private void updateLimits() {
309a1744872f4447dd370002a607c32776dffe519f5Selim Cinek        updateLimitsForView(mPrivateLayout);
310a1744872f4447dd370002a607c32776dffe519f5Selim Cinek        updateLimitsForView(mPublicLayout);
311a1744872f4447dd370002a607c32776dffe519f5Selim Cinek    }
312a1744872f4447dd370002a607c32776dffe519f5Selim Cinek
313a1744872f4447dd370002a607c32776dffe519f5Selim Cinek    private void updateLimitsForView(NotificationContentView layout) {
314a1744872f4447dd370002a607c32776dffe519f5Selim Cinek        boolean customView = layout.getContractedChild().getId()
315da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek                != com.android.internal.R.id.status_bar_latest_event_content;
316da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        boolean beforeN = mEntry.targetSdk < Build.VERSION_CODES.N;
317da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        int minHeight = customView && beforeN && !mIsSummaryWithChildren ?
318da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek                mNotificationMinHeightLegacy : mNotificationMinHeight;
319a1744872f4447dd370002a607c32776dffe519f5Selim Cinek        boolean headsUpCustom = layout.getHeadsUpChild() != null &&
320a1744872f4447dd370002a607c32776dffe519f5Selim Cinek                layout.getHeadsUpChild().getId()
321a1744872f4447dd370002a607c32776dffe519f5Selim Cinek                        != com.android.internal.R.id.status_bar_latest_event_content;
32277019c72332cb31dd1cb713ea4c66e267e6cbf39Selim Cinek        int headsUpheight = headsUpCustom && beforeN ? mMaxHeadsUpHeightLegacy
32377019c72332cb31dd1cb713ea4c66e267e6cbf39Selim Cinek                : mMaxHeadsUpHeight;
324a1744872f4447dd370002a607c32776dffe519f5Selim Cinek        layout.setHeights(minHeight, headsUpheight, mNotificationMaxHeight);
325b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi    }
326b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi
327b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi    public StatusBarNotification getStatusBarNotification() {
328b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi        return mStatusBarNotification;
329b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi    }
330b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi
331281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek    public NotificationData.Entry getEntry() {
332281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek        return mEntry;
333281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek    }
334281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek
335b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    public boolean isHeadsUp() {
336b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        return mIsHeadsUp;
337b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    }
338b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek
3391a521f3ea841f6db9686bbec7f950a3883d075aaSelim Cinek    public void setHeadsUp(boolean isHeadsUp) {
340c80fdb11f55f4c1f3ca9b5cdc7035afa2a0b9e91Selim Cinek        int intrinsicBefore = getIntrinsicHeight();
3411a521f3ea841f6db9686bbec7f950a3883d075aaSelim Cinek        mIsHeadsUp = isHeadsUp;
3428d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        mPrivateLayout.setHeadsUp(isHeadsUp);
343b41b2f6fc2bcce6da6d6ae855a2a36cfa6f7f99dSelim Cinek        if (mIsSummaryWithChildren) {
344b41b2f6fc2bcce6da6d6ae855a2a36cfa6f7f99dSelim Cinek            // The overflow might change since we allow more lines as HUN.
345b41b2f6fc2bcce6da6d6ae855a2a36cfa6f7f99dSelim Cinek            mChildrenContainer.updateGroupOverflow();
346b41b2f6fc2bcce6da6d6ae855a2a36cfa6f7f99dSelim Cinek        }
347c80fdb11f55f4c1f3ca9b5cdc7035afa2a0b9e91Selim Cinek        if (intrinsicBefore != getIntrinsicHeight()) {
348c80fdb11f55f4c1f3ca9b5cdc7035afa2a0b9e91Selim Cinek            notifyHeightChanged(false  /* needsAnimation */);
349c80fdb11f55f4c1f3ca9b5cdc7035afa2a0b9e91Selim Cinek        }
350d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek        if (isHeadsUp) {
351d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek            setAboveShelf(true);
352d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek        }
3531a521f3ea841f6db9686bbec7f950a3883d075aaSelim Cinek    }
3541a521f3ea841f6db9686bbec7f950a3883d075aaSelim Cinek
355b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void setGroupManager(NotificationGroupManager groupManager) {
356b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mGroupManager = groupManager;
35783bc78338437a460076a4b5778ded38440ac3501Selim Cinek        mPrivateLayout.setGroupManager(groupManager);
358b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
359b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
360b88b1a1dbde3364cd92d6a69a41ef2d4e2877294Adrian Roos    public void setRemoteInputController(RemoteInputController r) {
361b88b1a1dbde3364cd92d6a69a41ef2d4e2877294Adrian Roos        mPrivateLayout.setRemoteInputController(r);
362b88b1a1dbde3364cd92d6a69a41ef2d4e2877294Adrian Roos    }
363b88b1a1dbde3364cd92d6a69a41ef2d4e2877294Adrian Roos
3643fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor    public void setAppName(String appName) {
3653fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor        mAppName = appName;
3663fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor        if (mSettingsIconRow != null) {
3673fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor            mSettingsIconRow.setAppName(mAppName);
3683fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor        }
3693fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor    }
3703fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor
371b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void addChildNotification(ExpandableNotificationRow row) {
372b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        addChildNotification(row, -1);
373b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
374b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
375b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    /**
376b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     * Add a child notification to this view.
377b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     *
378b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     * @param row the row to add
379b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     * @param childIndex the index to add it at, if -1 it will be added at the end
380b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     */
381b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void addChildNotification(ExpandableNotificationRow row, int childIndex) {
382b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        if (mChildrenContainer == null) {
383b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            mChildrenContainerStub.inflate();
384b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
385b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mChildrenContainer.addNotification(row, childIndex);
386263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        onChildrenCountChanged();
387263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        row.setIsChildInGroup(true, this);
388b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
389b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
390b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void removeChildNotification(ExpandableNotificationRow row) {
391b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        if (mChildrenContainer != null) {
392b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            mChildrenContainer.removeNotification(row);
393b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
394263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        onChildrenCountChanged();
395263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        row.setIsChildInGroup(false, null);
396263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    }
397263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek
398263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    public boolean isChildInGroup() {
399a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        return mNotificationParent != null;
400263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    }
401263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek
402388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek    public ExpandableNotificationRow getNotificationParent() {
403388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek        return mNotificationParent;
404388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek    }
405388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek
406263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    /**
407263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek     * @param isChildInGroup Is this notification now in a group
408263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek     * @param parent the new parent notification
409263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek     */
410a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek    public void setIsChildInGroup(boolean isChildInGroup, ExpandableNotificationRow parent) {;
411a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        boolean childInGroup = BaseStatusBar.ENABLE_CHILD_NOTIFICATIONS && isChildInGroup;
412a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        mNotificationParent = childInGroup ? parent : null;
413a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        mPrivateLayout.setIsChildInGroup(childInGroup);
414c7d65b4e9c784a8235424c30620bacd54cc0892eMady Mellor        resetBackgroundAlpha();
415b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        updateBackgroundForGroupState();
416ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        updateClickAndFocus();
417b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (mNotificationParent != null) {
418b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mNotificationParent.updateBackgroundForGroupState();
419b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        }
420db16737031091160a3a7d080ac44ce2836402d74Selim Cinek        updateIconVisibilities();
42134d93b0985063090a9bad88a1b80e1b99bae3332Selim Cinek    }
42234d93b0985063090a9bad88a1b80e1b99bae3332Selim Cinek
42334d93b0985063090a9bad88a1b80e1b99bae3332Selim Cinek    @Override
4247210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek    public boolean onTouchEvent(MotionEvent event) {
4257210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek        if (event.getActionMasked() != MotionEvent.ACTION_DOWN
4267210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek                || !isChildInGroup() || isGroupExpanded()) {
4277210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek            return super.onTouchEvent(event);
4287210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek        } else {
4297210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek            return false;
4307210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek        }
4317210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek    }
4327210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek
4337210947e0d0e384fc34d61160c99adc2f36734e0Selim Cinek    @Override
434f062580d395a8c99631c104d6aec250f961152ddMady Mellor    protected boolean handleSlideBack() {
435f062580d395a8c99631c104d6aec250f961152ddMady Mellor        if (mSettingsIconRow != null && mSettingsIconRow.isVisible()) {
436f062580d395a8c99631c104d6aec250f961152ddMady Mellor            animateTranslateNotification(0 /* targetLeft */);
437f062580d395a8c99631c104d6aec250f961152ddMady Mellor            return true;
438f062580d395a8c99631c104d6aec250f961152ddMady Mellor        }
439f062580d395a8c99631c104d6aec250f961152ddMady Mellor        return false;
440f062580d395a8c99631c104d6aec250f961152ddMady Mellor    }
441f062580d395a8c99631c104d6aec250f961152ddMady Mellor
442f062580d395a8c99631c104d6aec250f961152ddMady Mellor    @Override
44334d93b0985063090a9bad88a1b80e1b99bae3332Selim Cinek    protected boolean shouldHideBackground() {
44434d93b0985063090a9bad88a1b80e1b99bae3332Selim Cinek        return super.shouldHideBackground() || mShowNoBackground;
445263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    }
446263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek
447263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    @Override
448263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    public boolean isSummaryWithChildren() {
449263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        return mIsSummaryWithChildren;
450b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
451b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
452b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    @Override
453b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public boolean areChildrenExpanded() {
454b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        return mChildrenExpanded;
455b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
456b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
457b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public List<ExpandableNotificationRow> getNotificationChildren() {
458b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        return mChildrenContainer == null ? null : mChildrenContainer.getNotificationChildren();
459b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
460b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
461eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek    public int getNumberOfNotificationChildren() {
462eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek        if (mChildrenContainer == null) {
463eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek            return 0;
464eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek        }
465eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek        return mChildrenContainer.getNotificationChildren().size();
466eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek    }
467eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek
468b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    /**
469b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     * Apply the order given in the list to the children.
470b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     *
471b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     * @param childOrder the new list order
472b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     * @return whether the list order has changed
473b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek     */
474b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public boolean applyChildOrder(List<ExpandableNotificationRow> childOrder) {
475b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        return mChildrenContainer != null && mChildrenContainer.applyChildOrder(childOrder);
476b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
477b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
478b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void getChildrenStates(StackScrollState resultState) {
47983bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (mIsSummaryWithChildren) {
480bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek            ExpandableViewState parentState = resultState.getViewStateForView(this);
481b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            mChildrenContainer.getState(resultState, parentState);
482b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
483b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
484b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
485b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void applyChildrenState(StackScrollState state) {
48683bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (mIsSummaryWithChildren) {
487b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            mChildrenContainer.applyState(state);
488b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
489b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
490b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
491b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void prepareExpansionChanged(StackScrollState state) {
49283bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (mIsSummaryWithChildren) {
493b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            mChildrenContainer.prepareExpansionChanged(state);
494b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
495b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
496b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
4970cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek    public void startChildAnimation(StackScrollState finalState, AnimationProperties properties) {
49883bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (mIsSummaryWithChildren) {
4990cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek            mChildrenContainer.startAnimationToState(finalState, properties);
500b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
501b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
502b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
503b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public ExpandableNotificationRow getViewAtPosition(float y) {
50443d30f03f45f3f9ad3955f5c83f4d21f26891de6Selim Cinek        if (!mIsSummaryWithChildren || !mChildrenExpanded) {
505b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            return this;
506b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        } else {
507b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            ExpandableNotificationRow view = mChildrenContainer.getViewAtPosition(y);
508b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            return view == null ? this : view;
509b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
510b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
511b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
512ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek    public NotificationGuts getGuts() {
513ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek        return mGuts;
514ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek    }
515ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek
516684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    /**
517684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * Set this notification to be pinned to the top if {@link #isHeadsUp()} is true. By doing this
518684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * the notification will be rendered on top of the screen.
519684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     *
520684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     * @param pinned whether it is pinned
521684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek     */
522684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public void setPinned(boolean pinned) {
523def35a86530200958384191d43d321dbcda16e2aSelim Cinek        int intrinsicHeight = getIntrinsicHeight();
524684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        mIsPinned = pinned;
525def35a86530200958384191d43d321dbcda16e2aSelim Cinek        if (intrinsicHeight != getIntrinsicHeight()) {
526bb42b7dd4892a8ab99f2f702cad931235d1d463eSelim Cinek            notifyHeightChanged(false /* needsAnimation */);
527def35a86530200958384191d43d321dbcda16e2aSelim Cinek        }
52831aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        if (pinned) {
52931aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            setIconAnimationRunning(true);
53031aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            mExpandedWhenPinned = false;
53131aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        } else if (mExpandedWhenPinned) {
53231aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            setUserExpanded(true);
53331aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        }
53498713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        setChronometerRunning(mLastChronometerRunning);
535b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    }
536b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek
537684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek    public boolean isPinned() {
538684a442b812a5e95d813700ffa2fd17ca72048a7Selim Cinek        return mIsPinned;
539b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    }
540b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek
541d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek    @Override
542d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek    public int getPinnedHeadsUpHeight() {
543d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek        return getPinnedHeadsUpHeight(true /* atLeastMinHeight */);
544d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek    }
545d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek
54631aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek    /**
54731aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek     * @param atLeastMinHeight should the value returned be at least the minimum height.
54831aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek     *                         Used to avoid cyclic calls
54931aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek     * @return the height of the heads up notification when pinned
55031aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek     */
551d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek    private int getPinnedHeadsUpHeight(boolean atLeastMinHeight) {
55277019c72332cb31dd1cb713ea4c66e267e6cbf39Selim Cinek        if (mIsSummaryWithChildren) {
55377019c72332cb31dd1cb713ea4c66e267e6cbf39Selim Cinek            return mChildrenContainer.getIntrinsicHeight();
55477019c72332cb31dd1cb713ea4c66e267e6cbf39Selim Cinek        }
55531aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        if(mExpandedWhenPinned) {
55631aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            return Math.max(getMaxExpandHeight(), mHeadsUpHeight);
55731aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        } else if (atLeastMinHeight) {
558567e845d99840a6e556595739a15e16132eb2f1eSelim Cinek            return Math.max(getCollapsedHeight(), mHeadsUpHeight);
55931aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        } else {
56031aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            return mHeadsUpHeight;
56131aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        }
562b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    }
563b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek
5645eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    /**
5655eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi     * Mark whether this notification was just clicked, i.e. the user has just clicked this
5665eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi     * notification in this frame.
5675eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi     */
5685eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    public void setJustClicked(boolean justClicked) {
5695eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi        mJustClicked = justClicked;
5705eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    }
5715eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi
5725eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    /**
5735eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi     * @return true if this notification has been clicked in this frame, false otherwise
5745eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi     */
5755eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    public boolean wasJustClicked() {
5765eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi        return mJustClicked;
5775eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi    }
5785eb67c22489f5fda22770d1fc824e7a8013ec025Jorim Jaggi
57998713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    public void setChronometerRunning(boolean running) {
58098713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        mLastChronometerRunning = running;
58198713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        setChronometerRunning(running, mPrivateLayout);
58298713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        setChronometerRunning(running, mPublicLayout);
58398713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        if (mChildrenContainer != null) {
58498713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            List<ExpandableNotificationRow> notificationChildren =
58598713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek                    mChildrenContainer.getNotificationChildren();
58698713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            for (int i = 0; i < notificationChildren.size(); i++) {
58798713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek                ExpandableNotificationRow child = notificationChildren.get(i);
58898713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek                child.setChronometerRunning(running);
58998713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            }
59098713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        }
59198713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    }
59298713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek
59398713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    private void setChronometerRunning(boolean running, NotificationContentView layout) {
59498713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        if (layout != null) {
59598713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            running = running || isPinned();
59698713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            View contractedChild = layout.getContractedChild();
59798713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            View expandedChild = layout.getExpandedChild();
59898713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            View headsUpChild = layout.getHeadsUpChild();
59998713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            setChronometerRunningForChild(running, contractedChild);
60098713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            setChronometerRunningForChild(running, expandedChild);
60198713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            setChronometerRunningForChild(running, headsUpChild);
60298713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        }
60398713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    }
60498713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek
60598713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    private void setChronometerRunningForChild(boolean running, View child) {
60698713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        if (child != null) {
60798713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            View chronometer = child.findViewById(com.android.internal.R.id.chronometer);
60898713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            if (chronometer instanceof Chronometer) {
60998713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek                ((Chronometer) chronometer).setStarted(running);
61098713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek            }
61198713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek        }
61298713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek    }
61398713a4fcf1061d3366b333c954fd7b8e9f12841Selim Cinek
614ea4bef7386ca6c6260f292bf006d16a99b93f698Selim Cinek    public NotificationHeaderView getNotificationHeader() {
615b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (mIsSummaryWithChildren) {
616b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            return mChildrenContainer.getHeaderView();
6178d6440dbaba4310cb517ab2a725d75be1ef934f4Selim Cinek        }
618ea4bef7386ca6c6260f292bf006d16a99b93f698Selim Cinek        return mPrivateLayout.getNotificationHeader();
6198d6440dbaba4310cb517ab2a725d75be1ef934f4Selim Cinek    }
6208d6440dbaba4310cb517ab2a725d75be1ef934f4Selim Cinek
62134eda5ed70863320e41b6860a550ba6a4248c652Selim Cinek    private NotificationHeaderView getVisibleNotificationHeader() {
622aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek        if (mIsSummaryWithChildren && !mShowingPublic) {
623b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            return mChildrenContainer.getHeaderView();
62434eda5ed70863320e41b6860a550ba6a4248c652Selim Cinek        }
62534eda5ed70863320e41b6860a550ba6a4248c652Selim Cinek        return getShowingLayout().getVisibleNotificationHeader();
62634eda5ed70863320e41b6860a550ba6a4248c652Selim Cinek    }
62734eda5ed70863320e41b6860a550ba6a4248c652Selim Cinek
628570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek    public void setOnExpandClickListener(OnExpandClickListener onExpandClickListener) {
629570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek        mOnExpandClickListener = onExpandClickListener;
630570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek    }
631570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek
632ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek    @Override
633ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek    public void setOnClickListener(@Nullable OnClickListener l) {
634ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        super.setOnClickListener(l);
635ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        mOnClickListener = l;
636ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        updateClickAndFocus();
637ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek    }
638ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek
639ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek    private void updateClickAndFocus() {
640ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        boolean normalChild = !isChildInGroup() || isGroupExpanded();
641ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        boolean clickable = mOnClickListener != null && normalChild;
642ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        if (isFocusable() != normalChild) {
643ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek            setFocusable(normalChild);
644ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        }
645ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        if (isClickable() != clickable) {
646ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek            setClickable(clickable);
647ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        }
648ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek    }
649ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek
65031aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek    public void setHeadsUpManager(HeadsUpManager headsUpManager) {
65131aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        mHeadsUpManager = headsUpManager;
65231aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek    }
65331aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek
65401af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    public void reInflateViews() {
65501af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek        initDimens();
65601af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek        if (mIsSummaryWithChildren) {
65701af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            if (mChildrenContainer != null) {
658b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                mChildrenContainer.reInflateViews(mExpandClickListener, mEntry.notification);
65901af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            }
66001af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek        }
66101af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek        if (mGuts != null) {
66201af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            View oldGuts = mGuts;
66301af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            int index = indexOfChild(oldGuts);
66401af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            removeView(oldGuts);
66501af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            mGuts = (NotificationGuts) LayoutInflater.from(mContext).inflate(
66601af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek                    R.layout.notification_guts, this, false);
66701af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            mGuts.setVisibility(oldGuts.getVisibility());
66801af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek            addView(mGuts, index);
66901af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek        }
6704b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        if (mSettingsIconRow != null) {
6714b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            View oldSettings = mSettingsIconRow;
6724b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            int settingsIndex = indexOfChild(oldSettings);
6734b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            removeView(oldSettings);
6744b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mSettingsIconRow = (NotificationSettingsIconRow) LayoutInflater.from(mContext).inflate(
6754b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor                    R.layout.notification_settings_icon_row, this, false);
6764b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mSettingsIconRow.setNotificationRowParent(ExpandableNotificationRow.this);
6773fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor            mSettingsIconRow.setAppName(mAppName);
6784b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mSettingsIconRow.setVisibility(oldSettings.getVisibility());
6794b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            addView(mSettingsIconRow, settingsIndex);
6804b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
6814b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
682de33a4ad5696173942dca363339027c892927e8dSelim Cinek        mPrivateLayout.reInflateViews();
683de33a4ad5696173942dca363339027c892927e8dSelim Cinek        mPublicLayout.reInflateViews();
68401af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    }
68501af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek
686c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek    public void setContentBackground(int customBackgroundColor, boolean animate,
687c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek            NotificationContentView notificationContentView) {
688c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek        if (getShowingLayout() == notificationContentView) {
689c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek            setTintColor(customBackgroundColor, animate);
690c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek        }
691c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek    }
692c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek
6930bd8a4b29bf92a901855d889c53186383dd2c5e7Adrian Roos    public void closeRemoteInput() {
6940bd8a4b29bf92a901855d889c53186383dd2c5e7Adrian Roos        mPrivateLayout.closeRemoteInput();
6950bd8a4b29bf92a901855d889c53186383dd2c5e7Adrian Roos        mPublicLayout.closeRemoteInput();
6960bd8a4b29bf92a901855d889c53186383dd2c5e7Adrian Roos    }
6970bd8a4b29bf92a901855d889c53186383dd2c5e7Adrian Roos
698c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    /**
699c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek     * Set by how much the single line view should be indented.
700c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek     */
701c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    public void setSingleLineWidthIndention(int indention) {
702c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek        mPrivateLayout.setSingleLineWidthIndention(indention);
703c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    }
704c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek
705c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    public int getNotificationColor() {
7064bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek        return mNotificationColor;
7074bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek    }
7084bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek
7094bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek    private void updateNotificationColor() {
7104bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek        mNotificationColor = NotificationColorUtil.resolveContrastColor(mContext,
7114bb593492ccf560382fac9ae533a7429cec53c94Selim Cinek                getStatusBarNotification().getNotification().color);
712c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    }
713c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek
714c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    public HybridNotificationView getSingleLineView() {
715c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek        return mPrivateLayout.getSingleLineView();
716c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek    }
717c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek
718f07d06212b08939809aa4128f153bd5179f81fc7Selim Cinek    public boolean isOnKeyguard() {
719f07d06212b08939809aa4128f153bd5179f81fc7Selim Cinek        return mOnKeyguard;
720f07d06212b08939809aa4128f153bd5179f81fc7Selim Cinek    }
721f07d06212b08939809aa4128f153bd5179f81fc7Selim Cinek
722c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek    public void removeAllChildren() {
723c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek        List<ExpandableNotificationRow> notificationChildren
724c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek                = mChildrenContainer.getNotificationChildren();
725c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek        ArrayList<ExpandableNotificationRow> clonedList = new ArrayList<>(notificationChildren);
726c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek        for (int i = 0; i < clonedList.size(); i++) {
727c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek            ExpandableNotificationRow row = clonedList.get(i);
7283f19f60d654421eee5b35a92129081f08c977629Selim Cinek            if (row.keepInParent()) {
7293f19f60d654421eee5b35a92129081f08c977629Selim Cinek                continue;
7303f19f60d654421eee5b35a92129081f08c977629Selim Cinek            }
731c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek            mChildrenContainer.removeNotification(row);
732c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek            row.setIsChildInGroup(false, null);
733c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek        }
734c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek        onChildrenCountChanged();
735c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek    }
736c1e389dadc234827354b95bac98a9c7146ed301cSelim Cinek
7371b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek    public void setForceUnlocked(boolean forceUnlocked) {
7381b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek        mForceUnlocked = forceUnlocked;
7391b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek        if (mIsSummaryWithChildren) {
7401b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek            List<ExpandableNotificationRow> notificationChildren = getNotificationChildren();
7411b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek            for (ExpandableNotificationRow child : notificationChildren) {
7421b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek                child.setForceUnlocked(forceUnlocked);
7431b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek            }
7441b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek        }
7451b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek    }
7461b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek
747e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    public void setDismissed(boolean dismissed, boolean fromAccessibility) {
7483f19f60d654421eee5b35a92129081f08c977629Selim Cinek        mDismissed = dismissed;
749e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        mGroupParentWhenDismissed = mNotificationParent;
750e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        mRefocusOnDismiss = fromAccessibility;
751e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        mChildAfterViewWhenDismissed = null;
752e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        if (isChildInGroup()) {
753e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            List<ExpandableNotificationRow> notificationChildren =
754e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                    mNotificationParent.getNotificationChildren();
755e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            int i = notificationChildren.indexOf(this);
756e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            if (i != -1 && i < notificationChildren.size() - 1) {
757e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                mChildAfterViewWhenDismissed = notificationChildren.get(i + 1);
758e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            }
759e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        }
7603f19f60d654421eee5b35a92129081f08c977629Selim Cinek    }
7613f19f60d654421eee5b35a92129081f08c977629Selim Cinek
7623f19f60d654421eee5b35a92129081f08c977629Selim Cinek    public boolean isDismissed() {
7633f19f60d654421eee5b35a92129081f08c977629Selim Cinek        return mDismissed;
7643f19f60d654421eee5b35a92129081f08c977629Selim Cinek    }
7653f19f60d654421eee5b35a92129081f08c977629Selim Cinek
7663f19f60d654421eee5b35a92129081f08c977629Selim Cinek    public boolean keepInParent() {
7673f19f60d654421eee5b35a92129081f08c977629Selim Cinek        return mKeepInParent;
7683f19f60d654421eee5b35a92129081f08c977629Selim Cinek    }
7693f19f60d654421eee5b35a92129081f08c977629Selim Cinek
7703f19f60d654421eee5b35a92129081f08c977629Selim Cinek    public void setKeepInParent(boolean keepInParent) {
7713f19f60d654421eee5b35a92129081f08c977629Selim Cinek        mKeepInParent = keepInParent;
7723f19f60d654421eee5b35a92129081f08c977629Selim Cinek    }
7733f19f60d654421eee5b35a92129081f08c977629Selim Cinek
7743f19f60d654421eee5b35a92129081f08c977629Selim Cinek    public boolean isRemoved() {
7753f19f60d654421eee5b35a92129081f08c977629Selim Cinek        return mRemoved;
7763f19f60d654421eee5b35a92129081f08c977629Selim Cinek    }
7773f19f60d654421eee5b35a92129081f08c977629Selim Cinek
778d009ab1e2a57648cac9de93912964e2a36ae1762Adrian Roos    public void setRemoved() {
779d009ab1e2a57648cac9de93912964e2a36ae1762Adrian Roos        mRemoved = true;
780d009ab1e2a57648cac9de93912964e2a36ae1762Adrian Roos
781d009ab1e2a57648cac9de93912964e2a36ae1762Adrian Roos        mPrivateLayout.setRemoved();
7823f19f60d654421eee5b35a92129081f08c977629Selim Cinek    }
7833f19f60d654421eee5b35a92129081f08c977629Selim Cinek
784d13956475e97da9de83f6519eab514770118e7afSelim Cinek    public NotificationChildrenContainer getChildrenContainer() {
785d13956475e97da9de83f6519eab514770118e7afSelim Cinek        return mChildrenContainer;
786d13956475e97da9de83f6519eab514770118e7afSelim Cinek    }
787d13956475e97da9de83f6519eab514770118e7afSelim Cinek
788cafa87f91da77cd2bc7f4a18bd12f6b71df23b5cSelim Cinek    public void setHeadsUpAnimatingAway(boolean headsUpAnimatingAway) {
789cafa87f91da77cd2bc7f4a18bd12f6b71df23b5cSelim Cinek        mHeadsupDisappearRunning = headsUpAnimatingAway;
790cafa87f91da77cd2bc7f4a18bd12f6b71df23b5cSelim Cinek        mPrivateLayout.setHeadsUpAnimatingAway(headsUpAnimatingAway);
791cafa87f91da77cd2bc7f4a18bd12f6b71df23b5cSelim Cinek    }
792cafa87f91da77cd2bc7f4a18bd12f6b71df23b5cSelim Cinek
793cafa87f91da77cd2bc7f4a18bd12f6b71df23b5cSelim Cinek    /**
794cafa87f91da77cd2bc7f4a18bd12f6b71df23b5cSelim Cinek     * @return if the view was just heads upped and is now animating away. During such a time the
795cafa87f91da77cd2bc7f4a18bd12f6b71df23b5cSelim Cinek     * layout needs to be kept consistent
796cafa87f91da77cd2bc7f4a18bd12f6b71df23b5cSelim Cinek     */
797cafa87f91da77cd2bc7f4a18bd12f6b71df23b5cSelim Cinek    public boolean isHeadsUpAnimatingAway() {
798cafa87f91da77cd2bc7f4a18bd12f6b71df23b5cSelim Cinek        return mHeadsupDisappearRunning;
79973cf02a0783e3857cae21fece9c292abcc9e1409Selim Cinek    }
80073cf02a0783e3857cae21fece9c292abcc9e1409Selim Cinek
801e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    public View getChildAfterViewWhenDismissed() {
802e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        return mChildAfterViewWhenDismissed;
803e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    }
804e9bad242f38bebadae481a22b647cc153f093070Selim Cinek
805e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    public View getGroupParentWhenDismissed() {
806e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        return mGroupParentWhenDismissed;
807e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    }
808e9bad242f38bebadae481a22b647cc153f093070Selim Cinek
8099e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    public void performDismiss() {
8109e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek        mVetoButton.performClick();
8119e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    }
8129e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek
8139e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    public void setOnDismissListener(OnClickListener listener) {
8149e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek        mVetoButton.setOnClickListener(listener);
8159e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    }
8169e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek
817281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek    public View getNotificationIcon() {
818281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek        NotificationHeaderView notificationHeader = getNotificationHeader();
819281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek        if (notificationHeader != null) {
820281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek            return notificationHeader.getIcon();
821281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek        }
822281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek        return null;
823281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek    }
824281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek
825281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek    /**
826281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek     * @return whether the notification is currently showing a view with an icon.
827281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek     */
828281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek    public boolean isShowingIcon() {
829281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek        if (mIsSummaryWithChildren) {
830281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek            return true;
831281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek        }
832281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek        NotificationContentView showingLayout = getShowingLayout();
833281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek        NotificationHeaderView notificationHeader = showingLayout.getVisibleNotificationHeader();
834281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek        return notificationHeader != null;
835281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek    }
836281c202784fe6eecab4cc535461f1b12c85b2cc0Selim Cinek
8370242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek    /**
8380242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek     * Set how much this notification is transformed into an icon.
8390242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek     *
8402b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek     * @param contentTransformationAmount A value from 0 to 1 indicating how much we are transformed
8412b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek     *                                 to the content away
842875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek     * @param isLastChild is this the last child in the list. If true, then the transformation is
843875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek     *                    different since it's content fades out.
8440242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek     */
8452b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek    public void setContentTransformationAmount(float contentTransformationAmount,
8462b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek            boolean isLastChild) {
847875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        boolean changeTransformation = isLastChild != mIsLastChild;
8482b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek        changeTransformation |= mContentTransformationAmount != contentTransformationAmount;
849875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        mIsLastChild = isLastChild;
8502b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek        mContentTransformationAmount = contentTransformationAmount;
851875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        if (changeTransformation) {
852875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            updateContentTransformation();
8532b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek        }
8542b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek    }
8552b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek
8562b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek    /**
8572b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek     * Set the icons to be visible of this notification.
8582b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek     */
8592b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek    public void setIconsVisible(boolean iconsVisible) {
8602b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek        if (iconsVisible != mIconsVisible) {
8612b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek            mIconsVisible = iconsVisible;
8622b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek            updateIconVisibilities();
8630242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek        }
8640242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek    }
8650242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek
866db16737031091160a3a7d080ac44ce2836402d74Selim Cinek    @Override
867db16737031091160a3a7d080ac44ce2836402d74Selim Cinek    protected void onBelowSpeedBumpChanged() {
868db16737031091160a3a7d080ac44ce2836402d74Selim Cinek        updateIconVisibilities();
869db16737031091160a3a7d080ac44ce2836402d74Selim Cinek    }
870db16737031091160a3a7d080ac44ce2836402d74Selim Cinek
871875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek    private void updateContentTransformation() {
872875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        float contentAlpha;
8732b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek        float translationY = -mContentTransformationAmount * mIconTransformContentShift;
874875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        if (mIsLastChild) {
8752b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek            contentAlpha = 1.0f - mContentTransformationAmount;
876875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            contentAlpha = Math.min(contentAlpha / 0.5f, 1.0f);
8770242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek            contentAlpha = Interpolators.ALPHA_OUT.getInterpolation(contentAlpha);
878875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            translationY *= 0.4f;
879875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        } else {
880875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            contentAlpha = 1.0f;
881875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        }
882875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        mPublicLayout.setAlpha(contentAlpha);
883875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        mPrivateLayout.setAlpha(contentAlpha);
884875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        mPublicLayout.setTranslationY(translationY);
885875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        mPrivateLayout.setTranslationY(translationY);
886875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        if (mChildrenContainer != null) {
887875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            mChildrenContainer.setAlpha(contentAlpha);
888875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            mChildrenContainer.setTranslationY(translationY);
889875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            // TODO: handle children fade out better
8900242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek        }
8910242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek    }
8920242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek
8930242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek    private void updateIconVisibilities() {
89417e1b69523086a98189178fc7f2b23d74860c738Selim Cinek        boolean visible = isChildInGroup()
89517e1b69523086a98189178fc7f2b23d74860c738Selim Cinek                || (isBelowSpeedBump() && !NotificationShelf.SHOW_AMBIENT_ICONS)
89617e1b69523086a98189178fc7f2b23d74860c738Selim Cinek                || mIconsVisible;
897db16737031091160a3a7d080ac44ce2836402d74Selim Cinek        mPublicLayout.setIconsVisible(visible);
898db16737031091160a3a7d080ac44ce2836402d74Selim Cinek        mPrivateLayout.setIconsVisible(visible);
899db16737031091160a3a7d080ac44ce2836402d74Selim Cinek        if (mChildrenContainer != null) {
900db16737031091160a3a7d080ac44ce2836402d74Selim Cinek            mChildrenContainer.setIconsVisible(visible);
9010242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek        }
9020242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek    }
9030242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek
904875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek    /**
905875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek     * Get the relative top padding of a view relative to this view. This recursively walks up the
906875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek     * hierarchy and does the corresponding measuring.
907875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek     *
908875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek     * @param view the view to the the padding for. The requested view has to be a child of this
909875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek     *             notification.
910875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek     * @return the toppadding
911875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek     */
912875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek    public int getRelativeTopPadding(View view) {
913875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        int topPadding = 0;
914875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        while (view.getParent() instanceof ViewGroup) {
915875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            topPadding += view.getTop();
916875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            view = (View) view.getParent();
917875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            if (view instanceof ExpandableNotificationRow) {
918875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek                return topPadding;
919875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            }
920875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        }
921875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        return topPadding;
922875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek    }
923875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek
92478403d79739605511ea88b653564d81d7bf4bbbaChris Wren    public interface ExpansionLogger {
92578403d79739605511ea88b653564d81d7bf4bbbaChris Wren        public void logNotificationExpansion(String key, boolean userAction, boolean expanded);
92678403d79739605511ea88b653564d81d7bf4bbbaChris Wren    }
9271685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
92851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public ExpandableNotificationRow(Context context, AttributeSet attrs) {
92951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        super(context, attrs);
9300e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        mFalsingManager = FalsingManager.getInstance(context);
93101af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek        initDimens();
93201af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    }
93301af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek
93401af334b70c8ad47c8ce1f465e458863ebe9eae2Selim Cinek    private void initDimens() {
935f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        mNotificationMinHeightLegacy = getFontScaledHeight(R.dimen.notification_min_height_legacy);
936f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        mNotificationMinHeight = getFontScaledHeight(R.dimen.notification_min_height);
937f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        mNotificationMaxHeight = getFontScaledHeight(R.dimen.notification_max_height);
938f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        mMaxHeadsUpHeightLegacy = getFontScaledHeight(
93977019c72332cb31dd1cb713ea4c66e267e6cbf39Selim Cinek                R.dimen.notification_max_heads_up_height_legacy);
940f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        mMaxHeadsUpHeight = getFontScaledHeight(R.dimen.notification_max_heads_up_height);
941b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        mIncreasedPaddingBetweenElements = getResources()
942b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                .getDimensionPixelSize(R.dimen.notification_divider_height_increased);
943875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        mIconTransformContentShiftNoIcon = getResources().getDimensionPixelSize(
9440242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek                R.dimen.notification_icon_transform_content_shift);
945f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek    }
946f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek
947f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek    /**
948f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek     * @param dimenId the dimen to look up
949f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek     * @return the font scaled dimen as if it were in sp but doesn't shrink sizes below dp
950f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek     */
951f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek    private int getFontScaledHeight(int dimenId) {
952f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        int dimensionPixelSize = getResources().getDimensionPixelSize(dimenId);
953f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        float factor = Math.max(1.0f, getResources().getDisplayMetrics().scaledDensity /
954f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek                getResources().getDisplayMetrics().density);
955f619ffccd77c20702d45bd2bd63b626e41b08018Selim Cinek        return (int) (dimensionPixelSize * factor);
95651c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
95751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
958a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer    /**
959a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer     * Resets this view so it can be re-used for an updated notification.
960a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer     */
96122f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer    @Override
962a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer    public void reset() {
96322f2ee567dd1b1a42432251229bcb2f05c1c4700Christoph Studer        super.reset();
96478403d79739605511ea88b653564d81d7bf4bbbaChris Wren        final boolean wasExpanded = isExpanded();
965a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer        mExpandable = false;
966a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer        mHasUserChangedExpansion = false;
967a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer        mUserLocked = false;
968a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer        mShowingPublic = false;
969ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        mSensitive = false;
970ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        mShowingPublicInitialized = false;
971a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer        mIsSystemExpanded = false;
97283bc78338437a460076a4b5778ded38440ac3501Selim Cinek        mOnKeyguard = false;
97351d94917c7dc53845701702bfd63f102a3a2dbc8Selim Cinek        mPublicLayout.reset();
97451d94917c7dc53845701702bfd63f102a3a2dbc8Selim Cinek        mPrivateLayout.reset();
97531094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        resetHeight();
9764b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        resetTranslation();
97731094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        logExpansionEvent(false, wasExpanded);
97831094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek    }
97931094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek
98031094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek    public void resetHeight() {
98131094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        onHeightReset();
9826e28a678c7f9fe2cae5a51bfdbab3071a2d8d0baSelim Cinek        requestLayout();
983a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer    }
984a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer
985251957d76e57eb6e5f8068b37346144e10e586a4Jorim Jaggi    @Override
986251957d76e57eb6e5f8068b37346144e10e586a4Jorim Jaggi    protected void onFinishInflate() {
987251957d76e57eb6e5f8068b37346144e10e586a4Jorim Jaggi        super.onFinishInflate();
988be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi        mPublicLayout = (NotificationContentView) findViewById(R.id.expandedPublic);
989fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek        mPublicLayout.setContainingNotification(this);
990be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi        mPrivateLayout = (NotificationContentView) findViewById(R.id.expanded);
991eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        mPrivateLayout.setExpandClickListener(mExpandClickListener);
992fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek        mPrivateLayout.setContainingNotification(this);
993eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        mPublicLayout.setExpandClickListener(mExpandClickListener);
9944b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mSettingsIconRowStub = (ViewStub) findViewById(R.id.settings_icon_row_stub);
9954b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mSettingsIconRowStub.setOnInflateListener(new ViewStub.OnInflateListener() {
9964b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            @Override
9974b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            public void onInflate(ViewStub stub, View inflated) {
9984b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor                mSettingsIconRow = (NotificationSettingsIconRow) inflated;
9994b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor                mSettingsIconRow.setNotificationRowParent(ExpandableNotificationRow.this);
10003fd273e6113fb1b8986314a03ab6d7e90efd0beaMady Mellor                mSettingsIconRow.setAppName(mAppName);
10014b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            }
10024b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        });
1003ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek        mGutsStub = (ViewStub) findViewById(R.id.notification_guts_stub);
1004ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek        mGutsStub.setOnInflateListener(new ViewStub.OnInflateListener() {
1005b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi            @Override
1006b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi            public void onInflate(ViewStub stub, View inflated) {
1007b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi                mGuts = (NotificationGuts) inflated;
1008b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi                mGuts.setClipTopAmount(getClipTopAmount());
1009b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi                mGuts.setActualHeight(getActualHeight());
1010ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek                mGutsStub = null;
1011b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi            }
1012b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi        });
1013b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mChildrenContainerStub = (ViewStub) findViewById(R.id.child_container_stub);
1014b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mChildrenContainerStub.setOnInflateListener(new ViewStub.OnInflateListener() {
1015b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
1016b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            @Override
1017b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            public void onInflate(ViewStub stub, View inflated) {
1018b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek                mChildrenContainer = (NotificationChildrenContainer) inflated;
1019388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek                mChildrenContainer.setNotificationParent(ExpandableNotificationRow.this);
1020c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek                mChildrenContainer.onNotificationUpdated();
10214b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor                mTranslateableViews.add(mChildrenContainer);
1022b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            }
1023b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        });
1024863834bd96bdebcf21f4c4a7d8285d4858c061e4Selim Cinek        mVetoButton = findViewById(R.id.veto);
10259e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek        mVetoButton.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
10269e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek        mVetoButton.setContentDescription(mContext.getString(
10279e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek                R.string.accessibility_remove_notification));
10284b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
10294b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        // Add the views that we translate to reveal the gear
10304b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mTranslateableViews = new ArrayList<View>();
10314b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        for (int i = 0; i < getChildCount(); i++) {
10324b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mTranslateableViews.add(getChildAt(i));
10334b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
10344b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        // Remove views that don't translate
10354b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mTranslateableViews.remove(mVetoButton);
10364b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mTranslateableViews.remove(mSettingsIconRowStub);
10374b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mTranslateableViews.remove(mChildrenContainerStub);
10384b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        mTranslateableViews.remove(mGutsStub);
10394b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    }
10404b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
10419e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    public View getVetoButton() {
10429e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek        return mVetoButton;
10439e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    }
10449e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek
10454b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    public void resetTranslation() {
104632c638a597dccbe4be600fd483060ee1466fdb04Mady Mellor        if (mTranslateAnim != null) {
104732c638a597dccbe4be600fd483060ee1466fdb04Mady Mellor            mTranslateAnim.cancel();
104832c638a597dccbe4be600fd483060ee1466fdb04Mady Mellor        }
10494b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        if (mTranslateableViews != null) {
10504b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            for (int i = 0; i < mTranslateableViews.size(); i++) {
10514b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor                mTranslateableViews.get(i).setTranslationX(0);
10524b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            }
10534b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
1054b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        invalidateOutline();
10554b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        if (mSettingsIconRow != null) {
10564b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mSettingsIconRow.resetState();
10574b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
10584b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    }
10594b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
10604b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    public void animateTranslateNotification(final float leftTarget) {
10614b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        if (mTranslateAnim != null) {
10624b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mTranslateAnim.cancel();
10634b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
1064b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        mTranslateAnim = getTranslateViewAnimator(leftTarget, null /* updateListener */);
106534958fa272c9216db4002546c3efad692b3d7775Mady Mellor        if (mTranslateAnim != null) {
106634958fa272c9216db4002546c3efad692b3d7775Mady Mellor            mTranslateAnim.start();
106734958fa272c9216db4002546c3efad692b3d7775Mady Mellor        }
106834958fa272c9216db4002546c3efad692b3d7775Mady Mellor    }
106934958fa272c9216db4002546c3efad692b3d7775Mady Mellor
107034958fa272c9216db4002546c3efad692b3d7775Mady Mellor    @Override
107134958fa272c9216db4002546c3efad692b3d7775Mady Mellor    public void setTranslation(float translationX) {
107234958fa272c9216db4002546c3efad692b3d7775Mady Mellor        if (areGutsExposed()) {
107334958fa272c9216db4002546c3efad692b3d7775Mady Mellor            // Don't translate if guts are showing.
107434958fa272c9216db4002546c3efad692b3d7775Mady Mellor            return;
107534958fa272c9216db4002546c3efad692b3d7775Mady Mellor        }
107634958fa272c9216db4002546c3efad692b3d7775Mady Mellor        // Translate the group of views
107734958fa272c9216db4002546c3efad692b3d7775Mady Mellor        for (int i = 0; i < mTranslateableViews.size(); i++) {
107834958fa272c9216db4002546c3efad692b3d7775Mady Mellor            if (mTranslateableViews.get(i) != null) {
107934958fa272c9216db4002546c3efad692b3d7775Mady Mellor                mTranslateableViews.get(i).setTranslationX(translationX);
108034958fa272c9216db4002546c3efad692b3d7775Mady Mellor            }
108134958fa272c9216db4002546c3efad692b3d7775Mady Mellor        }
1082b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        invalidateOutline();
108334958fa272c9216db4002546c3efad692b3d7775Mady Mellor        if (mSettingsIconRow != null) {
108434958fa272c9216db4002546c3efad692b3d7775Mady Mellor            mSettingsIconRow.updateSettingsIcons(translationX, getMeasuredWidth());
108534958fa272c9216db4002546c3efad692b3d7775Mady Mellor        }
108634958fa272c9216db4002546c3efad692b3d7775Mady Mellor    }
108734958fa272c9216db4002546c3efad692b3d7775Mady Mellor
108834958fa272c9216db4002546c3efad692b3d7775Mady Mellor    @Override
108934958fa272c9216db4002546c3efad692b3d7775Mady Mellor    public float getTranslation() {
109034958fa272c9216db4002546c3efad692b3d7775Mady Mellor        if (mTranslateableViews != null && mTranslateableViews.size() > 0) {
109134958fa272c9216db4002546c3efad692b3d7775Mady Mellor            // All of the views in the list should have same translation, just use first one.
109234958fa272c9216db4002546c3efad692b3d7775Mady Mellor            return mTranslateableViews.get(0).getTranslationX();
109334958fa272c9216db4002546c3efad692b3d7775Mady Mellor        }
109434958fa272c9216db4002546c3efad692b3d7775Mady Mellor        return 0;
109534958fa272c9216db4002546c3efad692b3d7775Mady Mellor    }
109634958fa272c9216db4002546c3efad692b3d7775Mady Mellor
109734958fa272c9216db4002546c3efad692b3d7775Mady Mellor    public Animator getTranslateViewAnimator(final float leftTarget,
109834958fa272c9216db4002546c3efad692b3d7775Mady Mellor            AnimatorUpdateListener listener) {
1099723f1f996fd78f08e5e91ed57420bd431e11f903Mady Mellor        if (mTranslateAnim != null) {
1100723f1f996fd78f08e5e91ed57420bd431e11f903Mady Mellor            mTranslateAnim.cancel();
1101723f1f996fd78f08e5e91ed57420bd431e11f903Mady Mellor        }
110234958fa272c9216db4002546c3efad692b3d7775Mady Mellor        if (areGutsExposed()) {
110334958fa272c9216db4002546c3efad692b3d7775Mady Mellor            // No translation if guts are exposed.
110434958fa272c9216db4002546c3efad692b3d7775Mady Mellor            return null;
110534958fa272c9216db4002546c3efad692b3d7775Mady Mellor        }
1106b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        final ObjectAnimator translateAnim = ObjectAnimator.ofFloat(this, TRANSLATE_CONTENT,
1107b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                leftTarget);
1108b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (listener != null) {
1109b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            translateAnim.addUpdateListener(listener);
1110b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        }
1111b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        translateAnim.addListener(new AnimatorListenerAdapter() {
1112b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            boolean cancelled = false;
1113723f1f996fd78f08e5e91ed57420bd431e11f903Mady Mellor
1114b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            @Override
1115b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            public void onAnimationCancel(Animator anim) {
1116b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                cancelled = true;
1117b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            }
1118723f1f996fd78f08e5e91ed57420bd431e11f903Mady Mellor
1119b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            @Override
1120b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            public void onAnimationEnd(Animator anim) {
1121b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                if (!cancelled && mSettingsIconRow != null && leftTarget == 0) {
1122b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    mSettingsIconRow.resetState();
1123b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    mTranslateAnim = null;
1124723f1f996fd78f08e5e91ed57420bd431e11f903Mady Mellor                }
11254b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            }
1126b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        });
1127b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        mTranslateAnim = translateAnim;
1128b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        return translateAnim;
11294b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    }
11304b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
11314b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    public float getSpaceForGear() {
11324b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        if (mSettingsIconRow != null) {
11334b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            return mSettingsIconRow.getSpaceForGear();
11344b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
11354b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        return 0;
11364b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    }
11374b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
11384b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    public NotificationSettingsIconRow getSettingsRow() {
11394b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        if (mSettingsIconRow == null) {
11404b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor            mSettingsIconRowStub.inflate();
11414b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        }
11424b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor        return mSettingsIconRow;
11434b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor    }
11444b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor
1145ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek    public void inflateGuts() {
1146ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek        if (mGuts == null) {
1147ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek            mGutsStub.inflate();
1148ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek        }
1149ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek    }
1150ab29aebf00a0ebd286a92d129f35c182b6888f3bSelim Cinek
1151da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek    private void updateChildrenVisibility() {
1152d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        mPrivateLayout.setVisibility(!mShowingPublic && !mIsSummaryWithChildren ? VISIBLE
1153d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                : INVISIBLE);
1154ef5127ea5f34f7a4c961021f6b691174bcb81d2eSelim Cinek        if (mChildrenContainer != null) {
1155ef5127ea5f34f7a4c961021f6b691174bcb81d2eSelim Cinek            mChildrenContainer.setVisibility(!mShowingPublic && mIsSummaryWithChildren ? VISIBLE
1156ef5127ea5f34f7a4c961021f6b691174bcb81d2eSelim Cinek                    : INVISIBLE);
1157b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mChildrenContainer.updateHeaderVisibility(!mShowingPublic && mIsSummaryWithChildren
1158b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    ? VISIBLE
1159ef5127ea5f34f7a4c961021f6b691174bcb81d2eSelim Cinek                    : INVISIBLE);
1160b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
1161da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        // The limits might have changed if the view suddenly became a group or vice versa
1162da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        updateLimits();
1163b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
1164b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
1165fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi    @Override
1166a54956a0bc611b1e9b3914edc7a604b59688f6b7Alan Viverette    public boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) {
1167a54956a0bc611b1e9b3914edc7a604b59688f6b7Alan Viverette        if (super.onRequestSendAccessibilityEventInternal(child, event)) {
1168fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            // Add a record for the entire layout since its content is somehow small.
1169fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            // The event comes from a leaf view that is interacted with.
1170fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            AccessibilityEvent record = AccessibilityEvent.obtain();
1171fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            onInitializeAccessibilityEvent(record);
1172fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            dispatchPopulateAccessibilityEvent(record);
1173fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            event.appendRecord(record);
1174fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi            return true;
1175fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi        }
1176fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi        return false;
1177c5dc0d0cce373fbf292e13633c114a431d747167Jorim Jaggi    }
117851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
1179e15452bb49d2531eee3086acb4763dd125f8053aJohn Spurlock    @Override
11804e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi    public void setDark(boolean dark, boolean fade, long delay) {
11814e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi        super.setDark(dark, fade, delay);
1182e15452bb49d2531eee3086acb4763dd125f8053aJohn Spurlock        final NotificationContentView showing = getShowingLayout();
1183e15452bb49d2531eee3086acb4763dd125f8053aJohn Spurlock        if (showing != null) {
11844e857f4ef0357e05806819d0488a73a12208fe8fJorim Jaggi            showing.setDark(dark, fade, delay);
1185e15452bb49d2531eee3086acb4763dd125f8053aJohn Spurlock        }
11869c7712d45ccec56a80873a83e56a83f810624b43Selim Cinek        if (mIsSummaryWithChildren) {
1187c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek            mChildrenContainer.setDark(dark, fade, delay);
11889c7712d45ccec56a80873a83e56a83f810624b43Selim Cinek        }
1189e15452bb49d2531eee3086acb4763dd125f8053aJohn Spurlock    }
1190e15452bb49d2531eee3086acb4763dd125f8053aJohn Spurlock
119151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public boolean isExpandable() {
1192388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek        if (mIsSummaryWithChildren && !mShowingPublic) {
1193388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek            return !mChildrenExpanded;
1194388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek        }
119551c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        return mExpandable;
119651c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
119751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
119851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public void setExpandable(boolean expandable) {
119951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        mExpandable = expandable;
1200eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        mPrivateLayout.updateExpandButtons(isExpandable());
120151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
120251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
12034ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek    @Override
12044ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek    public void setClipToActualHeight(boolean clipToActualHeight) {
1205084c16b8b380e7ff0d38d9e2846db321f0214931Selim Cinek        super.setClipToActualHeight(clipToActualHeight || isUserLocked());
1206084c16b8b380e7ff0d38d9e2846db321f0214931Selim Cinek        getShowingLayout().setClipToActualHeight(clipToActualHeight || isUserLocked());
12074ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek    }
12084ffd63611a0d516c9988b37e9c06e6f8390c2a2fSelim Cinek
12091685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
12101685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * @return whether the user has changed the expansion state
12111685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     */
12121685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    public boolean hasUserChangedExpansion() {
12131685e634fb0b14033bd436af8d7174436699ffecSelim Cinek        return mHasUserChangedExpansion;
12141685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    }
12151685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
121651c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public boolean isUserExpanded() {
121751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        return mUserExpanded;
121851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
121951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
12201685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
12211685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * Set this notification to be expanded by the user
12221685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     *
12231685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * @param userExpanded whether the user wants this notification to be expanded
12241685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     */
122551c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public void setUserExpanded(boolean userExpanded) {
1226388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek        setUserExpanded(userExpanded, false /* allowChildExpansion */);
1227388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek    }
1228388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek
1229388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek    /**
1230388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek     * Set this notification to be expanded by the user
1231388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek     *
1232388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek     * @param userExpanded whether the user wants this notification to be expanded
1233388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek     * @param allowChildExpansion whether a call to this method allows expanding children
1234388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek     */
1235388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek    public void setUserExpanded(boolean userExpanded, boolean allowChildExpansion) {
12360e2ffbd48bbedf47deb7f6aed96bd07e2fc96f53Blazej Magnowski        mFalsingManager.setNotificationExpanded();
1237388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek        if (mIsSummaryWithChildren && !mShowingPublic && allowChildExpansion) {
1238698b1706be196de41fc6bf03cf15971c82a11949Chris Wren            final boolean wasExpanded = mGroupManager.isGroupExpanded(mStatusBarNotification);
1239388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek            mGroupManager.setGroupExpanded(mStatusBarNotification, userExpanded);
1240698b1706be196de41fc6bf03cf15971c82a11949Chris Wren            logExpansionEvent(true /* userAction */, wasExpanded);
1241388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek            return;
1242388df6dd3d07376ecd7446cae36e1486cd313171Selim Cinek        }
1243a7fe63190cc3f95af1830886edd80acef0c334e3Christoph Studer        if (userExpanded && !mExpandable) return;
124478403d79739605511ea88b653564d81d7bf4bbbaChris Wren        final boolean wasExpanded = isExpanded();
12451685e634fb0b14033bd436af8d7174436699ffecSelim Cinek        mHasUserChangedExpansion = true;
124651c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        mUserExpanded = userExpanded;
124778403d79739605511ea88b653564d81d7bf4bbbaChris Wren        logExpansionEvent(true, wasExpanded);
124851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
124951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
1250ccd14fbcfe613eae71f0e00c39f38e5125749389Selim Cinek    public void resetUserExpansion() {
1251ccd14fbcfe613eae71f0e00c39f38e5125749389Selim Cinek        mHasUserChangedExpansion = false;
1252ccd14fbcfe613eae71f0e00c39f38e5125749389Selim Cinek        mUserExpanded = false;
1253ccd14fbcfe613eae71f0e00c39f38e5125749389Selim Cinek    }
1254ccd14fbcfe613eae71f0e00c39f38e5125749389Selim Cinek
125551c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public boolean isUserLocked() {
12561b2a05eb00746756c4d37ad76d597d909019e56fSelim Cinek        return mUserLocked && !mForceUnlocked;
125751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
125851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
125951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public void setUserLocked(boolean userLocked) {
126051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        mUserLocked = userLocked;
12618f2f6a67fad7aed720e33a6629cb65d368ebfb80Selim Cinek        mPrivateLayout.setUserExpanding(userLocked);
126242357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        if (mIsSummaryWithChildren) {
126342357e030c095867b95e2e8a718649587c5ebf52Selim Cinek            mChildrenContainer.setUserLocked(userLocked);
12647baaa9e82bebc6b3e7735828dbf67340eebc5821Selim Cinek            if (userLocked || !isGroupExpanded()) {
1265b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                updateBackgroundForGroupState();
1266b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            }
126742357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        }
126851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
126951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
12701685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
12711685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * @return has the system set this notification to be expanded
12721685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     */
12731685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    public boolean isSystemExpanded() {
12741685e634fb0b14033bd436af8d7174436699ffecSelim Cinek        return mIsSystemExpanded;
12751685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    }
12761685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
12771685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
12781685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * Set this notification to be expanded by the system.
12791685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     *
12801685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * @param expand whether the system wants this notification to be expanded.
12811685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     */
12821685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    public void setSystemExpanded(boolean expand) {
128331094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        if (expand != mIsSystemExpanded) {
128431094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            final boolean wasExpanded = isExpanded();
128531094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            mIsSystemExpanded = expand;
1286b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            notifyHeightChanged(false /* needsAnimation */);
128731094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            logExpansionEvent(false, wasExpanded);
1288ed6913b0ce99784188713975218dcff113a3d4a7Selim Cinek            if (mIsSummaryWithChildren) {
1289c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek                mChildrenContainer.updateGroupOverflow();
1290c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek            }
129131094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        }
1292dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi    }
1293dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi
1294dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi    /**
129583bc78338437a460076a4b5778ded38440ac3501Selim Cinek     * @param onKeyguard whether to prevent notification expansion
1296dce3c4cca5d4df4cc49c1a9f0537e2fecdbc45d2Jorim Jaggi     */
129783bc78338437a460076a4b5778ded38440ac3501Selim Cinek    public void setOnKeyguard(boolean onKeyguard) {
129883bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (onKeyguard != mOnKeyguard) {
129931094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            final boolean wasExpanded = isExpanded();
130083bc78338437a460076a4b5778ded38440ac3501Selim Cinek            mOnKeyguard = onKeyguard;
130131094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            logExpansionEvent(false, wasExpanded);
130231094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            if (wasExpanded != isExpanded()) {
1303c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek                if (mIsSummaryWithChildren) {
1304c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek                    mChildrenContainer.updateGroupOverflow();
1305c897bd3e91ed442b0f32c3a5b9918e9e580b62b1Selim Cinek                }
13064b80b1025f82fa7becc8e126bfa4aea39affcf65Mady Mellor                notifyHeightChanged(false /* needsAnimation */);
130731094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            }
130831094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        }
13091685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    }
13101685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
13111685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
13129e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     * @return Can the underlying notification be cleared? This can be different from whether the
13139e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     *         notification can be dismissed in case notifications are sensitive on the lockscreen.
13149e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     * @see #canViewBeDismissed()
13150d3e62f3e07a69f21c1b1dfa2c8c0fb8b6c95655Dan Sandler     */
13160d3e62f3e07a69f21c1b1dfa2c8c0fb8b6c95655Dan Sandler    public boolean isClearable() {
1317506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek        if (mStatusBarNotification == null || !mStatusBarNotification.isClearable()) {
1318506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek            return false;
1319506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek        }
1320506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek        if (mIsSummaryWithChildren) {
1321506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek            List<ExpandableNotificationRow> notificationChildren =
1322506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek                    mChildrenContainer.getNotificationChildren();
1323506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek            for (int i = 0; i < notificationChildren.size(); i++) {
1324506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek                ExpandableNotificationRow child = notificationChildren.get(i);
1325506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek                if (!child.isClearable()) {
1326506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek                    return false;
1327506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek                }
1328506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek            }
1329506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek        }
1330506deb69a744fe0fa704eda588c3a263b3f8fc2cSelim Cinek        return true;
13310d3e62f3e07a69f21c1b1dfa2c8c0fb8b6c95655Dan Sandler    }
13320d3e62f3e07a69f21c1b1dfa2c8c0fb8b6c95655Dan Sandler
13339cbadd3c08a7d7dd3412743dd04aecb16c5a1595Jorim Jaggi    @Override
13349cbadd3c08a7d7dd3412743dd04aecb16c5a1595Jorim Jaggi    public int getIntrinsicHeight() {
1335be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi        if (isUserLocked()) {
1336be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi            return getActualHeight();
1337be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi        }
1338d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        if (mGuts != null && mGuts.areGutsExposed()) {
1339d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            return mGuts.getHeight();
1340d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        } else if ((isChildInGroup() && !isGroupExpanded())) {
1341d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            return mPrivateLayout.getMinHeight();
1342d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        } else if (mSensitive && mHideSensitiveForIntrinsicHeight) {
1343d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            return getMinHeight();
134483bc78338437a460076a4b5778ded38440ac3501Selim Cinek        } else if (mIsSummaryWithChildren && !mOnKeyguard) {
1345eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek            return mChildrenContainer.getIntrinsicHeight();
134673cf02a0783e3857cae21fece9c292abcc9e1409Selim Cinek        } else if (mIsHeadsUp || mHeadsupDisappearRunning) {
134773cf02a0783e3857cae21fece9c292abcc9e1409Selim Cinek            if (isPinned() || mHeadsupDisappearRunning) {
134831aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                return getPinnedHeadsUpHeight(true /* atLeastMinHeight */);
134931aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            } else if (isExpanded()) {
1350d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                return Math.max(getMaxExpandHeight(), mHeadsUpHeight);
13518d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek            } else {
1352567e845d99840a6e556595739a15e16132eb2f1eSelim Cinek                return Math.max(getCollapsedHeight(), mHeadsUpHeight);
13538d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek            }
135431aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        } else if (isExpanded()) {
135583bc78338437a460076a4b5778ded38440ac3501Selim Cinek            return getMaxExpandHeight();
1356d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        } else {
1357567e845d99840a6e556595739a15e16132eb2f1eSelim Cinek            return getCollapsedHeight();
13581685e634fb0b14033bd436af8d7174436699ffecSelim Cinek        }
1359b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
13601685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
1361b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public boolean isGroupExpanded() {
1362eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek        return mGroupManager.isGroupExpanded(mStatusBarNotification);
1363b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
1364b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
1365263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    private void onChildrenCountChanged() {
13668fc93c90839e5d9dd52bca9dd97c198c0fe68af1Selim Cinek        mIsSummaryWithChildren = BaseStatusBar.ENABLE_CHILD_NOTIFICATIONS
1367b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                && mChildrenContainer != null && mChildrenContainer.getNotificationChildCount() > 0;
1368b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (mIsSummaryWithChildren && mChildrenContainer.getHeaderView() == null) {
1369b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mChildrenContainer.recreateNotificationHeader(mExpandClickListener,
1370b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    mEntry.notification);
1371263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek        }
13726baed9e3a272b09e87f15801a389d7714d0b051fMady Mellor        getShowingLayout().updateBackgroundColor(false /* animate */);
1373eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        mPrivateLayout.updateExpandButtons(isExpandable());
1374ea4bef7386ca6c6260f292bf006d16a99b93f698Selim Cinek        updateChildrenHeaderAppearance();
1375da42d65ea5a0eec7d1eaf48fee19ead419994b16Selim Cinek        updateChildrenVisibility();
1376263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek    }
1377263398f0175efc8bc8c965473f9565a693a0a0e0Selim Cinek
1378b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public void updateChildrenHeaderAppearance() {
1379ed6913b0ce99784188713975218dcff113a3d4a7Selim Cinek        if (mIsSummaryWithChildren) {
1380b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mChildrenContainer.updateChildrenHeaderAppearance();
1381b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        }
1382b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    }
1383b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
13841685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    /**
13851685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * Check whether the view state is currently expanded. This is given by the system in {@link
13861685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * #setSystemExpanded(boolean)} and can be overridden by user expansion or
13871685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * collapsing in {@link #setUserExpanded(boolean)}. Note that the visual appearance of this
13881685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * view can differ from this state, if layout params are modified from outside.
13891685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     *
13901685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     * @return whether the view state is currently expanded.
13911685e634fb0b14033bd436af8d7174436699ffecSelim Cinek     */
139283bc78338437a460076a4b5778ded38440ac3501Selim Cinek    public boolean isExpanded() {
1393e81b82ba252582753cb87ba424c82028b6e490ecSelim Cinek        return isExpanded(false /* allowOnKeyguard */);
1394e81b82ba252582753cb87ba424c82028b6e490ecSelim Cinek    }
1395e81b82ba252582753cb87ba424c82028b6e490ecSelim Cinek
1396e81b82ba252582753cb87ba424c82028b6e490ecSelim Cinek    public boolean isExpanded(boolean allowOnKeyguard) {
1397e81b82ba252582753cb87ba424c82028b6e490ecSelim Cinek        return (!mOnKeyguard || allowOnKeyguard)
1398b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek                && (!hasUserChangedExpansion() && (isSystemExpanded() || isSystemChildExpanded())
1399b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek                || isUserExpanded());
1400b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
1401b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
1402b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    private boolean isSystemChildExpanded() {
1403b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        return mIsSystemChildExpanded;
1404b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
1405b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
1406b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void setSystemChildExpanded(boolean expanded) {
1407b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mIsSystemChildExpanded = expanded;
14081685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    }
14091685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
14101685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    @Override
14111685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
14121685e634fb0b14033bd436af8d7174436699ffecSelim Cinek        super.onLayout(changed, left, top, right, bottom);
14138d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        updateMaxHeights();
1414a6edc878293e49594a6aac7a0d0e41c7980ece07Mady Mellor        if (mSettingsIconRow != null) {
1415a6edc878293e49594a6aac7a0d0e41c7980ece07Mady Mellor            mSettingsIconRow.updateVerticalLocation();
1416a6edc878293e49594a6aac7a0d0e41c7980ece07Mady Mellor        }
1417875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        updateContentShiftHeight();
1418875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek    }
1419875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek
1420875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek    /**
1421875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek     * Updates the content shift height such that the header is completely hidden when coming from
1422875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek     * the top.
1423875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek     */
1424875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek    private void updateContentShiftHeight() {
1425875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        NotificationHeaderView notificationHeader = getNotificationHeader();
1426875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        if (notificationHeader != null) {
1427875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            CachingIconView icon = notificationHeader.getIcon();
1428875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            mIconTransformContentShift = getRelativeTopPadding(icon) + icon.getHeight();
1429875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        } else {
1430875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek            mIconTransformContentShift = mIconTransformContentShiftNoIcon;
1431875a3a11e2bfcb10d873cd9b4272bed1edf3fe93Selim Cinek        }
14321685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    }
14331685e634fb0b14033bd436af8d7174436699ffecSelim Cinek
14348d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek    private void updateMaxHeights() {
1435d2319fbe6a53ac4c38ca02e4d8e32da86ed0994bSelim Cinek        int intrinsicBefore = getIntrinsicHeight();
14368d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        View expandedChild = mPrivateLayout.getExpandedChild();
14378d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        if (expandedChild == null) {
14388d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek            expandedChild = mPrivateLayout.getContractedChild();
14398d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        }
14408d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        mMaxExpandHeight = expandedChild.getHeight();
14418d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        View headsUpChild = mPrivateLayout.getHeadsUpChild();
14421f3f544f21cab3728f749ab66cd6859e9dfcf389Selim Cinek        if (headsUpChild == null) {
14431f3f544f21cab3728f749ab66cd6859e9dfcf389Selim Cinek            headsUpChild = mPrivateLayout.getContractedChild();
14448d490d427c0b0cc321ae61987bb3cfc1c23ff930Selim Cinek        }
14451f3f544f21cab3728f749ab66cd6859e9dfcf389Selim Cinek        mHeadsUpHeight = headsUpChild.getHeight();
1446d2319fbe6a53ac4c38ca02e4d8e32da86ed0994bSelim Cinek        if (intrinsicBefore != getIntrinsicHeight()) {
1447bb42b7dd4892a8ab99f2f702cad931235d1d463eSelim Cinek            notifyHeightChanged(true  /* needsAnimation */);
1448d2319fbe6a53ac4c38ca02e4d8e32da86ed0994bSelim Cinek        }
1449d2319fbe6a53ac4c38ca02e4d8e32da86ed0994bSelim Cinek    }
1450d2319fbe6a53ac4c38ca02e4d8e32da86ed0994bSelim Cinek
1451fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek    @Override
1452fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek    public void notifyHeightChanged(boolean needsAnimation) {
1453fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek        super.notifyHeightChanged(needsAnimation);
1454fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek        getShowingLayout().requestSelectLayout(needsAnimation || isUserLocked());
1455fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek    }
1456fa0a2d3d90fdde14784ec6351a0798bc21c2f126Selim Cinek
14573c76d509d362cf5086a63722ab41e04f5d539182Selim Cinek    public void setSensitive(boolean sensitive, boolean hideSensitive) {
1458ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        mSensitive = sensitive;
14593c76d509d362cf5086a63722ab41e04f5d539182Selim Cinek        mSensitiveHiddenInGeneral = hideSensitive;
1460ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    }
1461ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi
1462ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    public void setHideSensitiveForIntrinsicHeight(boolean hideSensitive) {
146360122be6747c4f79b96f6808158f8f7e7548b7d3Selim Cinek        mHideSensitiveForIntrinsicHeight = hideSensitive;
1464a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek        if (mIsSummaryWithChildren) {
1465a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek            List<ExpandableNotificationRow> notificationChildren =
1466a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek                    mChildrenContainer.getNotificationChildren();
1467a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek            for (int i = 0; i < notificationChildren.size(); i++) {
1468a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek                ExpandableNotificationRow child = notificationChildren.get(i);
1469a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek                child.setHideSensitiveForIntrinsicHeight(hideSensitive);
1470a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek            }
1471a52f6a17efa944adc945a61788cc3beb54c569e7Selim Cinek        }
1472ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    }
1473ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi
1474ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    public void setHideSensitive(boolean hideSensitive, boolean animated, long delay,
1475ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            long duration) {
1476ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        boolean oldShowingPublic = mShowingPublic;
1477ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        mShowingPublic = mSensitive && hideSensitive;
1478ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        if (mShowingPublicInitialized && mShowingPublic == oldShowingPublic) {
1479ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            return;
1480ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        }
1481a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler
1482a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler        // bail out if no public version
14831685e634fb0b14033bd436af8d7174436699ffecSelim Cinek        if (mPublicLayout.getChildCount() == 0) return;
1484a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler
1485ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        if (!animated) {
1486ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            mPublicLayout.animate().cancel();
1487ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            mPrivateLayout.animate().cancel();
1488a554c707386eb8a6c6fb3a2399f23b79a1c17f74Selim Cinek            if (mChildrenContainer != null) {
1489a554c707386eb8a6c6fb3a2399f23b79a1c17f74Selim Cinek                mChildrenContainer.animate().cancel();
1490a554c707386eb8a6c6fb3a2399f23b79a1c17f74Selim Cinek                mChildrenContainer.setAlpha(1f);
1491a554c707386eb8a6c6fb3a2399f23b79a1c17f74Selim Cinek            }
1492ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            mPublicLayout.setAlpha(1f);
1493ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            mPrivateLayout.setAlpha(1f);
1494ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            mPublicLayout.setVisibility(mShowingPublic ? View.VISIBLE : View.INVISIBLE);
1495d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            updateChildrenVisibility();
1496ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        } else {
1497ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi            animateShowingPublic(delay, duration);
1498ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        }
1499c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek        NotificationContentView showingLayout = getShowingLayout();
1500c317933a91b1d33cc4af9b7c6218b9ce675d05eaSelim Cinek        showingLayout.updateBackgroundColor(animated);
1501eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek        mPrivateLayout.updateExpandButtons(isExpandable());
1502ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi        mShowingPublicInitialized = true;
1503ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    }
1504ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi
1505ae44128776410abd11bd06ae700db9cc4606a773Jorim Jaggi    private void animateShowingPublic(long delay, long duration) {
1506b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        View[] privateViews = mIsSummaryWithChildren
1507b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                ? new View[] {mChildrenContainer}
1508d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                : new View[] {mPrivateLayout};
1509d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        View[] publicViews = new View[] {mPublicLayout};
1510d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        View[] hiddenChildren = mShowingPublic ? privateViews : publicViews;
1511d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        View[] shownChildren = mShowingPublic ? publicViews : privateViews;
1512d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        for (final View hiddenView : hiddenChildren) {
1513d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            hiddenView.setVisibility(View.VISIBLE);
1514d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            hiddenView.animate().cancel();
1515d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            hiddenView.animate()
1516d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .alpha(0f)
1517d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .setStartDelay(delay)
1518d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .setDuration(duration)
1519d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .withEndAction(new Runnable() {
1520d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                        @Override
1521d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                        public void run() {
1522d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                            hiddenView.setVisibility(View.INVISIBLE);
1523d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                        }
1524d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    });
1525d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        }
1526d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        for (View showView : shownChildren) {
1527d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            showView.setVisibility(View.VISIBLE);
1528d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            showView.setAlpha(0f);
1529d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            showView.animate().cancel();
1530d84a5930cca7add37e7e23305538d29959daf199Selim Cinek            showView.animate()
1531d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .alpha(1f)
1532d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .setStartDelay(delay)
1533d84a5930cca7add37e7e23305538d29959daf199Selim Cinek                    .setDuration(duration);
1534d84a5930cca7add37e7e23305538d29959daf199Selim Cinek        }
15350d3e62f3e07a69f21c1b1dfa2c8c0fb8b6c95655Dan Sandler    }
15360d3e62f3e07a69f21c1b1dfa2c8c0fb8b6c95655Dan Sandler
15373776fe007550451bb237c705d333247eab2a291cSelim Cinek    public boolean mustStayOnScreen() {
15383776fe007550451bb237c705d333247eab2a291cSelim Cinek        return mIsHeadsUp;
15393776fe007550451bb237c705d333247eab2a291cSelim Cinek    }
15403776fe007550451bb237c705d333247eab2a291cSelim Cinek
15419e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    /**
15429e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     * @return Whether this view is allowed to be dismissed. Only valid for visible notifications as
15439e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     *         otherwise some state might not be updated. To request about the general clearability
15449e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     *         see {@link #isClearable()}.
15459e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek     */
15469e624e732aa5646c83d203587be9c2c4e94c9266Selim Cinek    public boolean canViewBeDismissed() {
1547e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        return isClearable() && (!mShowingPublic || !mSensitiveHiddenInGeneral);
1548a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler    }
1549251957d76e57eb6e5f8068b37346144e10e586a4Jorim Jaggi
1550cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai    public void makeActionsVisibile() {
1551cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai        setUserExpanded(true, true);
1552cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai        if (isChildInGroup()) {
1553cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai            mGroupManager.setGroupExpanded(mStatusBarNotification, true);
1554cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai        }
1555bb42b7dd4892a8ab99f2f702cad931235d1d463eSelim Cinek        notifyHeightChanged(false /* needsAnimation */);
1556cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai    }
1557cd35def3c35f04d7fd056590d4668b5ebbc80490Ricky Wai
1558b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public void setChildrenExpanded(boolean expanded, boolean animate) {
1559b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mChildrenExpanded = expanded;
156083bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (mChildrenContainer != null) {
156183bc78338437a460076a4b5778ded38440ac3501Selim Cinek            mChildrenContainer.setChildrenExpanded(expanded);
156283bc78338437a460076a4b5778ded38440ac3501Selim Cinek        }
15631a5d8eadd56b435843dfbc1adf3779aa7286081bMady Mellor        updateBackgroundForGroupState();
1564ddf1b399d85ca417301625a55b2a3c7acab2633cSelim Cinek        updateClickAndFocus();
1565b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
1566b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
1567b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public static void applyTint(View v, int color) {
1568b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        int alpha;
1569b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        if (color != 0) {
1570b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            alpha = COLORED_DIVIDER_ALPHA;
1571b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        } else {
1572b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            color = 0xff000000;
1573b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            alpha = DEFAULT_DIVIDER_ALPHA;
1574b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
1575b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        if (v.getBackground() instanceof ColorDrawable) {
1576b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            ColorDrawable background = (ColorDrawable) v.getBackground();
1577b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            background.mutate();
1578b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            background.setColor(color);
1579b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek            background.setAlpha(alpha);
1580b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        }
1581b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    }
1582b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek
15831685e634fb0b14033bd436af8d7174436699ffecSelim Cinek    public int getMaxExpandHeight() {
1584b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        return mMaxExpandHeight;
1585a5e0f415d351ad1a9c0ffde8d93df91a2384591fDan Sandler    }
1586584a7aa62c54bcbd654a6696d4fbb56e124874e7Jorim Jaggi
158734958fa272c9216db4002546c3efad692b3d7775Mady Mellor    public boolean areGutsExposed() {
158834958fa272c9216db4002546c3efad692b3d7775Mady Mellor        return (mGuts != null && mGuts.areGutsExposed());
158934958fa272c9216db4002546c3efad692b3d7775Mady Mellor    }
159034958fa272c9216db4002546c3efad692b3d7775Mady Mellor
1591be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    @Override
15924222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    public boolean isContentExpandable() {
15932f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek        NotificationContentView showingLayout = getShowingLayout();
15942f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek        return showingLayout.isContentExpandable();
15954222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    }
15964222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi
15974222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    @Override
1598560e64d3d95a17123048bebe2fb06ffe4567fb78Selim Cinek    protected View getContentView() {
1599aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek        if (mIsSummaryWithChildren && !mShowingPublic) {
1600a5703187a9dba418f742fab0874a8f683b0bbb0eSelim Cinek            return mChildrenContainer;
1601a5703187a9dba418f742fab0874a8f683b0bbb0eSelim Cinek        }
1602560e64d3d95a17123048bebe2fb06ffe4567fb78Selim Cinek        return getShowingLayout();
1603560e64d3d95a17123048bebe2fb06ffe4567fb78Selim Cinek    }
1604560e64d3d95a17123048bebe2fb06ffe4567fb78Selim Cinek
1605560e64d3d95a17123048bebe2fb06ffe4567fb78Selim Cinek    @Override
1606aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek    protected void onAppearAnimationFinished(boolean wasAppearing) {
1607aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek        super.onAppearAnimationFinished(wasAppearing);
1608aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek        if (wasAppearing) {
1609aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            // During the animation the visible view might have changed, so let's make sure all
1610aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            // alphas are reset
1611aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            if (mChildrenContainer != null) {
1612aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek                mChildrenContainer.setAlpha(1.0f);
1613aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek                mChildrenContainer.setLayerType(LAYER_TYPE_NONE, null);
1614aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            }
1615aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            mPrivateLayout.setAlpha(1.0f);
1616aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            mPrivateLayout.setLayerType(LAYER_TYPE_NONE, null);
1617aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            mPublicLayout.setAlpha(1.0f);
1618aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek            mPublicLayout.setLayerType(LAYER_TYPE_NONE, null);
1619aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek        }
1620aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek    }
1621aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek
1622aa3901a5ee68a7256663daa88be92a5faa267c23Selim Cinek    @Override
1623b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public int getExtraBottomPadding() {
1624b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (mIsSummaryWithChildren && isGroupExpanded()) {
1625b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            return mIncreasedPaddingBetweenElements;
1626b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        }
1627b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        return 0;
1628b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    }
1629b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
1630b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    @Override
1631d552d9d8e964c102e6832610be46cf2c041e8829Jorim Jaggi    public void setActualHeight(int height, boolean notifyListeners) {
1632b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        super.setActualHeight(height, notifyListeners);
1633b53bc276d6ec093817988a358b7c2a6c63ee0c48Mady Mellor        if (mGuts != null && mGuts.areGutsExposed()) {
1634b53bc276d6ec093817988a358b7c2a6c63ee0c48Mady Mellor            mGuts.setActualHeight(height);
1635b53bc276d6ec093817988a358b7c2a6c63ee0c48Mady Mellor            return;
1636b53bc276d6ec093817988a358b7c2a6c63ee0c48Mady Mellor        }
1637eef842851026a90b6a217d8bc423454fa48df4feSelim Cinek        int contentHeight = Math.max(getMinHeight(), height);
1638b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mPrivateLayout.setContentHeight(contentHeight);
1639b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek        mPublicLayout.setContentHeight(contentHeight);
164042357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        if (mIsSummaryWithChildren) {
164142357e030c095867b95e2e8a718649587c5ebf52Selim Cinek            mChildrenContainer.setActualHeight(height);
164242357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        }
1643b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi        if (mGuts != null) {
1644b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi            mGuts.setActualHeight(height);
1645b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi        }
1646be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    }
1647be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi
1648be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    @Override
1649b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek    public int getMaxContentHeight() {
165083bc78338437a460076a4b5778ded38440ac3501Selim Cinek        if (mIsSummaryWithChildren && !mShowingPublic) {
1651eaa29ca6ff7a4c21a0729118d0e7c38750b9c93eSelim Cinek            return mChildrenContainer.getMaxContentHeight();
165283bc78338437a460076a4b5778ded38440ac3501Selim Cinek        }
16532f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek        NotificationContentView showingLayout = getShowingLayout();
16542f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek        return showingLayout.getMaxHeight();
1655be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    }
1656be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi
1657be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    @Override
16584222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    public int getMinHeight() {
165931aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        if (mIsHeadsUp && mHeadsUpManager.isTrackingHeadsUp()) {
166031aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek                return getPinnedHeadsUpHeight(false /* atLeastMinHeight */);
166131aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        } else if (mIsSummaryWithChildren && !isGroupExpanded() && !mShowingPublic) {
1662b55386d64aeb80f74ed21035d1e389d86be89db6Selim Cinek            return mChildrenContainer.getMinHeight();
166331aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        } else if (mIsHeadsUp) {
166431aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek            return mHeadsUpHeight;
1665b55386d64aeb80f74ed21035d1e389d86be89db6Selim Cinek        }
1666816c8e4735f975f4d8bffa1a5a37be6557424ea3Selim Cinek        NotificationContentView showingLayout = getShowingLayout();
1667816c8e4735f975f4d8bffa1a5a37be6557424ea3Selim Cinek        return showingLayout.getMinHeight();
1668816c8e4735f975f4d8bffa1a5a37be6557424ea3Selim Cinek    }
1669816c8e4735f975f4d8bffa1a5a37be6557424ea3Selim Cinek
1670816c8e4735f975f4d8bffa1a5a37be6557424ea3Selim Cinek    @Override
1671567e845d99840a6e556595739a15e16132eb2f1eSelim Cinek    public int getCollapsedHeight() {
16722c58461daf909fae5a2605f0ba63da3f9c897731Selim Cinek        if (mIsSummaryWithChildren && !mShowingPublic) {
1673567e845d99840a6e556595739a15e16132eb2f1eSelim Cinek            return mChildrenContainer.getCollapsedHeight();
167483bc78338437a460076a4b5778ded38440ac3501Selim Cinek        }
1675816c8e4735f975f4d8bffa1a5a37be6557424ea3Selim Cinek        return getMinHeight();
16764222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    }
16774222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi
16784222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi    @Override
1679be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    public void setClipTopAmount(int clipTopAmount) {
1680be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi        super.setClipTopAmount(clipTopAmount);
1681be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi        mPrivateLayout.setClipTopAmount(clipTopAmount);
16822f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek        mPublicLayout.setClipTopAmount(clipTopAmount);
1683b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi        if (mGuts != null) {
1684b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi            mGuts.setClipTopAmount(clipTopAmount);
1685b1cd3c1945499721d7d1ce57bdda67695ffe936bJorim Jaggi        }
1686be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi    }
1687be565dfc1c17b7ddafa9753851b8f82849fd3f42Jorim Jaggi
1688a686b2c9a91e2e6276676e5730339f7630e2f927Selim Cinek    @Override
1689a686b2c9a91e2e6276676e5730339f7630e2f927Selim Cinek    public void setClipBottomAmount(int clipBottomAmount) {
169065d418ec8957fb1af03a8cc68aed90744a5848ffSelim Cinek        if (clipBottomAmount != mClipBottomAmount) {
169165d418ec8957fb1af03a8cc68aed90744a5848ffSelim Cinek            super.setClipBottomAmount(clipBottomAmount);
169265d418ec8957fb1af03a8cc68aed90744a5848ffSelim Cinek            mPrivateLayout.setClipBottomAmount(clipBottomAmount);
169365d418ec8957fb1af03a8cc68aed90744a5848ffSelim Cinek            mPublicLayout.setClipBottomAmount(clipBottomAmount);
169465d418ec8957fb1af03a8cc68aed90744a5848ffSelim Cinek            if (mGuts != null) {
169565d418ec8957fb1af03a8cc68aed90744a5848ffSelim Cinek                mGuts.setClipBottomAmount(clipBottomAmount);
169665d418ec8957fb1af03a8cc68aed90744a5848ffSelim Cinek            }
1697a686b2c9a91e2e6276676e5730339f7630e2f927Selim Cinek        }
1698b3dadccbc5c7040260a51a3e17efcb74aeec6a11Selim Cinek        if (mChildrenContainer != null) {
169965d418ec8957fb1af03a8cc68aed90744a5848ffSelim Cinek            // We have to update this even if it hasn't changed, since the children locations can
170065d418ec8957fb1af03a8cc68aed90744a5848ffSelim Cinek            // have changed
1701b3dadccbc5c7040260a51a3e17efcb74aeec6a11Selim Cinek            mChildrenContainer.setClipBottomAmount(clipBottomAmount);
1702b3dadccbc5c7040260a51a3e17efcb74aeec6a11Selim Cinek        }
1703a686b2c9a91e2e6276676e5730339f7630e2f927Selim Cinek    }
1704a686b2c9a91e2e6276676e5730339f7630e2f927Selim Cinek
170531094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek    public boolean isMaxExpandHeightInitialized() {
170631094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek        return mMaxExpandHeight != 0;
17077d447726e2cb9fae80db417012039828daab8fe7Selim Cinek    }
17082f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek
170942357e030c095867b95e2e8a718649587c5ebf52Selim Cinek    public NotificationContentView getShowingLayout() {
17102f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek        return mShowingPublic ? mPublicLayout : mPrivateLayout;
17112f0df8ae038dbb873bf2e11e1e13c75cf95b0198Selim Cinek    }
171278403d79739605511ea88b653564d81d7bf4bbbaChris Wren
171359ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi    @Override
171459ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi    public void setShowingLegacyBackground(boolean showing) {
171559ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi        super.setShowingLegacyBackground(showing);
171659ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi        mPrivateLayout.setShowingLegacyBackground(showing);
171759ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi        mPublicLayout.setShowingLegacyBackground(showing);
171859ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi    }
171959ec304eaebf1bc4098d6feb6cca9039c8b70d3dJorim Jaggi
1720a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek    @Override
1721a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek    protected void updateBackgroundTint() {
1722a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        super.updateBackgroundTint();
1723b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        updateBackgroundForGroupState();
1724a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        if (mIsSummaryWithChildren) {
1725a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek            List<ExpandableNotificationRow> notificationChildren =
1726a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek                    mChildrenContainer.getNotificationChildren();
1727a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek            for (int i = 0; i < notificationChildren.size(); i++) {
1728a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek                ExpandableNotificationRow child = notificationChildren.get(i);
1729b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                child.updateBackgroundForGroupState();
1730a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek            }
1731a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        }
1732a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek    }
1733a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek
1734b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    /**
1735b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor     * Called when a group has finished animating from collapsed or expanded state.
1736b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor     */
1737b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public void onFinishedExpansionChange() {
1738b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        mGroupExpansionChanging = false;
1739b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        updateBackgroundForGroupState();
1740b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    }
1741b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor
1742b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    /**
1743b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor     * Updates the parent and children backgrounds in a group based on the expansion state.
1744b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor     */
1745b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor    public void updateBackgroundForGroupState() {
1746b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        if (mIsSummaryWithChildren) {
1747b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            // Only when the group has finished expanding do we hide its background.
1748b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mShowNoBackground = isGroupExpanded() && !isGroupExpansionChanging() && !isUserLocked();
1749b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mChildrenContainer.updateHeaderForExpansion(mShowNoBackground);
1750b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            List<ExpandableNotificationRow> children = mChildrenContainer.getNotificationChildren();
1751b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            for (int i = 0; i < children.size(); i++) {
1752b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                children.get(i).updateBackgroundForGroupState();
1753b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            }
1754b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        } else if (isChildInGroup()) {
1755b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            final int childColor = getShowingLayout().getBackgroundColorForExpansionState();
1756b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            // Only show a background if the group is expanded OR if it is expanding / collapsing
1757b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            // and has a custom background color
1758b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            final boolean showBackground = isGroupExpanded()
1759b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                    || ((mNotificationParent.isGroupExpansionChanging()
1760b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor                            || mNotificationParent.isUserLocked()) && childColor != 0);
1761b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mShowNoBackground = !showBackground;
1762b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        } else {
1763b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            // Only children or parents ever need no background.
1764b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor            mShowNoBackground = false;
1765b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        }
1766b0a824687f56b6950338aad169d8d837f8ed657bMady Mellor        updateOutline();
1767a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek        updateBackground();
1768a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek    }
1769a6c6bfb61ba14b0467b73082d591c834576cddf4Selim Cinek
17704a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos    public int getPositionOfChild(ExpandableNotificationRow childRow) {
17714a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos        if (mIsSummaryWithChildren) {
17724a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos            return mChildrenContainer.getPositionInLinearLayout(childRow);
17734a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos        }
17744a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos        return 0;
17754a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos    }
17764a5796765041dcb45ce782fc7ec5866b89fe0df0Adrian Roos
177778403d79739605511ea88b653564d81d7bf4bbbaChris Wren    public void setExpansionLogger(ExpansionLogger logger, String key) {
177878403d79739605511ea88b653564d81d7bf4bbbaChris Wren        mLogger = logger;
177978403d79739605511ea88b653564d81d7bf4bbbaChris Wren        mLoggingKey = key;
178078403d79739605511ea88b653564d81d7bf4bbbaChris Wren    }
178178403d79739605511ea88b653564d81d7bf4bbbaChris Wren
17826abeeb91194818e1d19f75336b03d1e305af0842Chris Wren    public void onExpandedByGesture(boolean userExpanded) {
17836abeeb91194818e1d19f75336b03d1e305af0842Chris Wren        int event = MetricsEvent.ACTION_NOTIFICATION_GESTURE_EXPANDER;
17846abeeb91194818e1d19f75336b03d1e305af0842Chris Wren        if (mGroupManager.isSummaryOfGroup(getStatusBarNotification())) {
17856abeeb91194818e1d19f75336b03d1e305af0842Chris Wren            event = MetricsEvent.ACTION_NOTIFICATION_GROUP_GESTURE_EXPANDER;
17866abeeb91194818e1d19f75336b03d1e305af0842Chris Wren        }
17876abeeb91194818e1d19f75336b03d1e305af0842Chris Wren        MetricsLogger.action(mContext, event, userExpanded);
17886abeeb91194818e1d19f75336b03d1e305af0842Chris Wren    }
17896abeeb91194818e1d19f75336b03d1e305af0842Chris Wren
17906183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek    @Override
179142357e030c095867b95e2e8a718649587c5ebf52Selim Cinek    public float getIncreasedPaddingAmount() {
179242357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        if (mIsSummaryWithChildren) {
179342357e030c095867b95e2e8a718649587c5ebf52Selim Cinek            if (isGroupExpanded()) {
179442357e030c095867b95e2e8a718649587c5ebf52Selim Cinek                return 1.0f;
179542357e030c095867b95e2e8a718649587c5ebf52Selim Cinek            } else if (isUserLocked()) {
1796f07d06212b08939809aa4128f153bd5179f81fc7Selim Cinek                return mChildrenContainer.getGroupExpandFraction();
179742357e030c095867b95e2e8a718649587c5ebf52Selim Cinek            }
179842357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        }
179942357e030c095867b95e2e8a718649587c5ebf52Selim Cinek        return 0.0f;
180061633a8db8dfdefa84b4444a7ae668d0e24f53e9Selim Cinek    }
180161633a8db8dfdefa84b4444a7ae668d0e24f53e9Selim Cinek
180261633a8db8dfdefa84b4444a7ae668d0e24f53e9Selim Cinek    @Override
18036183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek    protected boolean disallowSingleClick(MotionEvent event) {
18046183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek        float x = event.getX();
18056183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek        float y = event.getY();
180634eda5ed70863320e41b6860a550ba6a4248c652Selim Cinek        NotificationHeaderView header = getVisibleNotificationHeader();
18076183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek        if (header != null) {
1808a883351024f8dbdf8041c551f8a8987d9357dcd8Mady Mellor            return header.isInTouchRect(x - getTranslation(), y);
18096183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek        }
18106183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek        return super.disallowSingleClick(event);
18116183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek    }
18126183d12926a189b08cc3be8d9c78470617e63db0Selim Cinek
181378403d79739605511ea88b653564d81d7bf4bbbaChris Wren    private void logExpansionEvent(boolean userAction, boolean wasExpanded) {
1814698b1706be196de41fc6bf03cf15971c82a11949Chris Wren        boolean nowExpanded = isExpanded();
1815698b1706be196de41fc6bf03cf15971c82a11949Chris Wren        if (mIsSummaryWithChildren) {
1816698b1706be196de41fc6bf03cf15971c82a11949Chris Wren            nowExpanded = mGroupManager.isGroupExpanded(mStatusBarNotification);
1817698b1706be196de41fc6bf03cf15971c82a11949Chris Wren        }
181878403d79739605511ea88b653564d81d7bf4bbbaChris Wren        if (wasExpanded != nowExpanded && mLogger != null) {
181978403d79739605511ea88b653564d81d7bf4bbbaChris Wren            mLogger.logNotificationExpansion(mLoggingKey, userAction, nowExpanded) ;
182078403d79739605511ea88b653564d81d7bf4bbbaChris Wren        }
182178403d79739605511ea88b653564d81d7bf4bbbaChris Wren    }
1822570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek
1823e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    @Override
1824e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
1825e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        super.onInitializeAccessibilityNodeInfoInternal(info);
1826e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        if (canViewBeDismissed()) {
1827e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_DISMISS);
1828e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        }
1829e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    }
1830e9bad242f38bebadae481a22b647cc153f093070Selim Cinek
1831e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    @Override
1832e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
1833e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        if (super.performAccessibilityActionInternal(action, arguments)) {
1834e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            return true;
1835e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        }
1836e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        switch (action) {
1837e9bad242f38bebadae481a22b647cc153f093070Selim Cinek            case AccessibilityNodeInfo.ACTION_DISMISS:
1838e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                NotificationStackScrollLayout.performDismiss(this, mGroupManager,
1839e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                        true /* fromAccessibility */);
1840e9bad242f38bebadae481a22b647cc153f093070Selim Cinek                return true;
1841e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        }
1842e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        return false;
1843e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    }
1844e9bad242f38bebadae481a22b647cc153f093070Selim Cinek
1845e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    public boolean shouldRefocusOnDismiss() {
1846e9bad242f38bebadae481a22b647cc153f093070Selim Cinek        return mRefocusOnDismiss || isAccessibilityFocused();
1847e9bad242f38bebadae481a22b647cc153f093070Selim Cinek    }
1848e9bad242f38bebadae481a22b647cc153f093070Selim Cinek
1849570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek    public interface OnExpandClickListener {
185031aada4ef4ff37f8cdc110b196c06918841647c7Selim Cinek        void onExpandClicked(NotificationData.Entry clickedEntry, boolean nowExpanded);
1851570981d5f1bcd0e5186cc02655254a0606b6ec14Selim Cinek    }
1852bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek
1853bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek    @Override
1854bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek    public ExpandableViewState createNewViewState(StackScrollState stackScrollState) {
1855bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek        return new NotificationViewState(stackScrollState);
1856bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek    }
1857bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek
1858d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek    @Override
1859d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek    public boolean isAboveShelf() {
1860d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek        return mIsPinned || mHeadsupDisappearRunning || (mIsHeadsUp && mAboveShelf);
1861d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek    }
1862d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek
1863d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek    public void setAboveShelf(boolean aboveShelf) {
1864d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek        mAboveShelf = aboveShelf;
1865d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek    }
1866d127d7923191c5023db423952d639f6ec8aa86ccSelim Cinek
18670cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek    public class NotificationViewState extends ExpandableViewState {
1868bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek
1869bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek        private final StackScrollState mOverallState;
18700242fbb9fdd7db0398a197d0e63d20dcac7cd916Selim Cinek
1871bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek
1872bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek        private NotificationViewState(StackScrollState stackScrollState) {
1873bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek            mOverallState = stackScrollState;
1874bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek        }
1875bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek
1876bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek        @Override
1877bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek        public void applyToView(View view) {
1878bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek            super.applyToView(view);
1879bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek            if (view instanceof ExpandableNotificationRow) {
1880bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek                ExpandableNotificationRow row = (ExpandableNotificationRow) view;
1881bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek                row.applyChildrenState(mOverallState);
1882bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek            }
1883bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek        }
18840cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek
18850cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek        @Override
18862b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek        protected void onYTranslationAnimationFinished(View view) {
18872b549f4bd436787bd2543812b24add2d8c5b53eeSelim Cinek            super.onYTranslationAnimationFinished(view);
18880cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek            if (mHeadsupDisappearRunning) {
1889cafa87f91da77cd2bc7f4a18bd12f6b71df23b5cSelim Cinek                setHeadsUpAnimatingAway(false);
18900cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek            }
18910cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek        }
18920cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek
18930cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek        @Override
18940cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek        public void animateTo(View child, AnimationProperties properties) {
18950cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek            super.animateTo(child, properties);
18960cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek            if (child instanceof ExpandableNotificationRow) {
18970cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek                ExpandableNotificationRow row = (ExpandableNotificationRow) child;
18980cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek                row.startChildAnimation(mOverallState, properties);
18990cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek            }
19000cfbef45f037efe966a5f57af63a328f6fd5d989Selim Cinek        }
1901bbcebde5f47d070d82270a367bec2f375c55d359Selim Cinek    }
190251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren}
1903