1fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler/*
2fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * Copyright (C) 2011 The Android Open Source Project
3fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler *
4fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * Licensed under the Apache License, Version 2.0 (the "License");
5fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * you may not use this file except in compliance with the License.
6fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * You may obtain a copy of the License at
7fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler *
8fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler *      http://www.apache.org/licenses/LICENSE-2.0
9fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler *
10fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * Unless required by applicable law or agreed to in writing, software
11fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * distributed under the License is distributed on an "AS IS" BASIS,
12fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * See the License for the specific language governing permissions and
14fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler * limitations under the License.
15fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler */
16fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler
17fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerpackage com.android.systemui.statusbar.policy;
18fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler
19eda110fdf13021704111c6939abfafdca3d16f9cChris Wrenimport android.app.Notification;
20fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.content.Context;
21fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.content.res.Configuration;
22fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.graphics.Rect;
23fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.util.AttributeSet;
24fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.util.Log;
25fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.view.MotionEvent;
26fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.view.View;
27fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.view.ViewConfiguration;
28fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.view.ViewGroup;
290f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wrenimport android.widget.FrameLayout;
30fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport android.widget.LinearLayout;
31fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler
3251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wrenimport com.android.systemui.ExpandHelper;
33fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport com.android.systemui.R;
34fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport com.android.systemui.SwipeHelper;
35fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandlerimport com.android.systemui.statusbar.BaseStatusBar;
3651c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wrenimport com.android.systemui.statusbar.NotificationData;
37fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler
380f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wrenpublic class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.Callback, ExpandHelper.Callback {
39157026f820f9ff08a63c78368f928a505cb11ec5Chris Wren    private static final String TAG = "HeadsUpNotificationView";
40fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    private static final boolean DEBUG = false;
416d15a364f26bd61122bfdd127eee225ca65206f5Chris Wren    private static final boolean SPEW = DEBUG;
42fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler
43fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    Rect mTmpRect = new Rect();
44fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler
4551c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    private final int mTouchSensitivityDelay;
46fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    private SwipeHelper mSwipeHelper;
47209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock
4851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    private BaseStatusBar mBar;
4951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    private ExpandHelper mExpandHelper;
5051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    private long mStartTouchTime;
5151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
52fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    private ViewGroup mContentHolder;
530f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    private ViewGroup mContentSlider;
54209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock
5551c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    private NotificationData.Entry mHeadsUp;
56fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler
57157026f820f9ff08a63c78368f928a505cb11ec5Chris Wren    public HeadsUpNotificationView(Context context, AttributeSet attrs) {
58fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        this(context, attrs, 0);
59fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    }
60fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler
61157026f820f9ff08a63c78368f928a505cb11ec5Chris Wren    public HeadsUpNotificationView(Context context, AttributeSet attrs, int defStyle) {
62fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        super(context, attrs, defStyle);
6351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        mTouchSensitivityDelay = getResources().getInteger(R.integer.heads_up_sensitivity_delay);
6451c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        if (DEBUG) Log.v(TAG, "create() " + mTouchSensitivityDelay);
65fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    }
66fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler
670f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    public void setBar(BaseStatusBar bar) {
680f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        mBar = bar;
690f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    }
700f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
710f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    public ViewGroup getHolder() {
720f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        return mContentHolder;
730f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    }
740f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
750f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    public boolean setNotification(NotificationData.Entry headsUp) {
760f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        mHeadsUp = headsUp;
770f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        mHeadsUp.row.setExpanded(false);
780f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        if (mContentHolder == null) {
790f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren            // too soon!
800f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren            return false;
810f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        }
820f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        mContentHolder.setX(0);
830f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        mContentHolder.setVisibility(View.VISIBLE);
840f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        mContentHolder.setAlpha(1f);
850f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        mContentHolder.removeAllViews();
860f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        mContentHolder.addView(mHeadsUp.row);
874c91312d55d0521bc9944514f8a7c9b943fc4f2bChris Wren        mSwipeHelper.snapChild(mContentSlider, 1f);
880f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        mStartTouchTime = System.currentTimeMillis() + mTouchSensitivityDelay;
890f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        return true;
900f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    }
910f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
926d15a364f26bd61122bfdd127eee225ca65206f5Chris Wren    public boolean isClearable() {
936d15a364f26bd61122bfdd127eee225ca65206f5Chris Wren        return mHeadsUp == null || mHeadsUp.notification.isClearable();
940f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    }
950f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
960f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    public void setMargin(int notificationPanelMarginPx) {
976d15a364f26bd61122bfdd127eee225ca65206f5Chris Wren        if (SPEW) Log.v(TAG, "setMargin() " + notificationPanelMarginPx);
980f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        if (mContentSlider != null) {
990f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren            FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mContentSlider.getLayoutParams();
1000f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren            lp.setMarginStart(notificationPanelMarginPx);
1010f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren            mContentSlider.setLayoutParams(lp);
1020f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        }
1030f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    }
1040f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
1050f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    // LinearLayout methods
1060f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
1070f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    @Override
1080f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    public void onDraw(android.graphics.Canvas c) {
1090f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        super.onDraw(c);
1100f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        if (DEBUG) {
1110f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren            //Log.d(TAG, "onDraw: canvas height: " + c.getHeight() + "px; measured height: "
1120f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren            //        + getMeasuredHeight() + "px");
1130f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren            c.save();
1140f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren            c.clipRect(6, 6, c.getWidth() - 6, getMeasuredHeight() - 6,
1150f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren                    android.graphics.Region.Op.DIFFERENCE);
1160f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren            c.drawColor(0xFFcc00cc);
1170f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren            c.restore();
1180f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        }
1190f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    }
1200f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
1210f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    // ViewGroup methods
1220f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
123fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    @Override
124fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    public void onAttachedToWindow() {
125fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        float densityScale = getResources().getDisplayMetrics().density;
126fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop();
127fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop);
128209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock
12951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_min_height);
13051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_max_height);
13151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        mExpandHelper = new ExpandHelper(mContext, this, minHeight, maxHeight);
13251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
1330f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        mContentHolder = (ViewGroup) findViewById(R.id.content_holder);
1340f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        mContentSlider = (ViewGroup) findViewById(R.id.content_slider);
1350f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
136157026f820f9ff08a63c78368f928a505cb11ec5Chris Wren        if (mHeadsUp != null) {
137fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler            // whoops, we're on already!
13851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren            setNotification(mHeadsUp);
139fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        }
140fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    }
141209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock
142fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    @Override
143fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    public boolean onInterceptTouchEvent(MotionEvent ev) {
144fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        if (DEBUG) Log.v(TAG, "onInterceptTouchEvent()");
14551c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        if (System.currentTimeMillis() < mStartTouchTime) {
14651c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren            return true;
14751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        }
14851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        return mSwipeHelper.onInterceptTouchEvent(ev)
14951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren                || mExpandHelper.onInterceptTouchEvent(ev)
15051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren                || super.onInterceptTouchEvent(ev);
151fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    }
152fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler
1530f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    // View methods
1540f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
155fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    @Override
156fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    public boolean onTouchEvent(MotionEvent ev) {
15751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        if (System.currentTimeMillis() < mStartTouchTime) {
15851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren            return false;
15951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        }
16051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        mBar.resetHeadsUpDecayTimer();
16151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        return mSwipeHelper.onTouchEvent(ev)
16251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren                || mExpandHelper.onTouchEvent(ev)
16351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren                || super.onTouchEvent(ev);
164fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    }
165fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler
166fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    @Override
167fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    protected void onConfigurationChanged(Configuration newConfig) {
168fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        super.onConfigurationChanged(newConfig);
169fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        float densityScale = getResources().getDisplayMetrics().density;
170fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        mSwipeHelper.setDensityScale(densityScale);
171fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop();
172fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler        mSwipeHelper.setPagingTouchSlop(pagingTouchSlop);
173fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler    }
174fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler
1750f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    // ExpandHelper.Callback methods
17651c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
17751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    @Override
17851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public View getChildAtRawPosition(float x, float y) {
17951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        return getChildAtPosition(x, y);
18051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
18151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
18251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    @Override
18351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public View getChildAtPosition(float x, float y) {
18451c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        return mHeadsUp == null ? null : mHeadsUp.row;
18551c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
18651c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
18751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    @Override
18851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public boolean canChildBeExpanded(View v) {
18951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        return mHeadsUp != null && mHeadsUp.row == v && mHeadsUp.row.isExpandable();
19051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
19151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
19251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    @Override
19351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public void setUserExpandedChild(View v, boolean userExpanded) {
19451c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        if (mHeadsUp != null && mHeadsUp.row == v) {
19551c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren            mHeadsUp.row.setUserExpanded(userExpanded);
19651c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        }
19751c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
19851c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren
19951c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    @Override
20051c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    public void setUserLockedChild(View v, boolean userLocked) {
20151c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        if (mHeadsUp != null && mHeadsUp.row == v) {
20251c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren            mHeadsUp.row.setUserLocked(userLocked);
20351c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren        }
20451c7510e493680b4aca1ed7695b35c52d2cd63ffChris Wren    }
205eda110fdf13021704111c6939abfafdca3d16f9cChris Wren
2060f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    // SwipeHelper.Callback methods
2070f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
2080f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    @Override
2090f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    public boolean canChildBeDismissed(View v) {
2100f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        return true;
2110f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    }
2120f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
2130f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    @Override
2140f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    public void onChildDismissed(View v) {
2150f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        Log.v(TAG, "User swiped heads up to dismiss");
2160f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        mBar.onHeadsUpDismissed();
2170f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    }
2180f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
2190f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    @Override
2200f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    public void onBeginDrag(View v) {
2210f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    }
2220f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
2230f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    @Override
2240f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    public void onDragCancelled(View v) {
2250f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        mContentHolder.setAlpha(1f); // sometimes this isn't quite reset
2260f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    }
2270f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
2280f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    @Override
2290f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    public View getChildAtPosition(MotionEvent ev) {
2300f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren        return mContentSlider;
2310f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    }
2320f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren
2330f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    @Override
2340f2aa68e3c8356b0adcd91a3156ce6934c8b85f2Chris Wren    public View getChildContentView(View v) {
2354c91312d55d0521bc9944514f8a7c9b943fc4f2bChris Wren        return mContentSlider;
236eda110fdf13021704111c6939abfafdca3d16f9cChris Wren    }
237fa7887bebf57f3dcb8283d73e69ba1daa115225fDaniel Sandler}