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