PanelBar.java revision dbbf45e79affa3e29b0f376719d297fe9c1f8a37
150a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler/*
250a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler * Copyright (C) 2012 The Android Open Source Project
350a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler *
450a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler * Licensed under the Apache License, Version 2.0 (the "License");
550a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler * you may not use this file except in compliance with the License.
650a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler * You may obtain a copy of the License at
750a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler *
850a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler *      http://www.apache.org/licenses/LICENSE-2.0
950a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler *
1050a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler * Unless required by applicable law or agreed to in writing, software
1150a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler * distributed under the License is distributed on an "AS IS" BASIS,
1250a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1350a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler * See the License for the specific language governing permissions and
1450a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler * limitations under the License.
1550a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler */
1650a531337e7d6d49b40a1c96636962507ccf6c61Daniel Sandler
1708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerpackage com.android.systemui.statusbar.phone;
1808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
1908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.content.Context;
2008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.util.AttributeSet;
21cd686b5b6d4166b510df8e32138479a9559bc117John Spurlockimport android.util.Log;
2208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.view.MotionEvent;
23173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandlerimport android.view.View;
2408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.widget.FrameLayout;
2508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
26de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport java.util.ArrayList;
27de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlock
2808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerpublic class PanelBar extends FrameLayout {
29bf4aa9d5bc34df144afcab45e8045d34a0ac090aDaniel Sandler    public static final boolean DEBUG = false;
30198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public static final String TAG = PanelBar.class.getSimpleName();
3108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public static final void LOG(String fmt, Object... args) {
3208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (!DEBUG) return;
33cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock        Log.v(TAG, String.format(fmt, args));
3408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
3508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
36198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public static final int STATE_CLOSED = 0;
37198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public static final int STATE_OPENING = 1;
38198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public static final int STATE_OPEN = 2;
39198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
4067eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    PanelHolder mPanelHolder;
4167eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    ArrayList<PanelView> mPanels = new ArrayList<PanelView>();
4267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    PanelView mTouchingPanel;
43978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler    private int mState = STATE_CLOSED;
44978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler    private boolean mTracking;
45978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler
4667eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler    float mPanelExpandedFractionSum;
4767eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler
48198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public void go(int state) {
4967eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("go state: %d -> %d", mState, state);
50978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler        mState = state;
51978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler    }
5208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
5308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public PanelBar(Context context, AttributeSet attrs) {
5408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        super(context, attrs);
5508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
5608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
5708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    @Override
5808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    protected void onFinishInflate() {
5908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        super.onFinishInflate();
6008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
6108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
6208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void addPanel(PanelView pv) {
6308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mPanels.add(pv);
6408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        pv.setBar(this);
6508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
6608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
6708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void setPanelHolder(PanelHolder ph) {
6808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (ph == null) {
69cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock            Log.e(TAG, "setPanelHolder: null PanelHolder", new Throwable());
7008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            return;
7108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        }
7208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        ph.setBar(this);
7308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mPanelHolder = ph;
7408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        final int N = ph.getChildCount();
7508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        for (int i=0; i<N; i++) {
76e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            final View v = ph.getChildAt(i);
77e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler            if (v != null && v instanceof PanelView) {
78e111ad300d614a0f94e30f96ae664a1de578c48aDaniel Sandler                addPanel((PanelView) v);
7908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            }
8008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        }
8108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
8208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
8308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public float getBarHeight() {
8408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return getMeasuredHeight();
8508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
8608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
87efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    public PanelView selectPanelForTouch(MotionEvent touch) {
88cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        final int N = mPanels.size();
89efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        return mPanels.get((int)(N * touch.getX() / getMeasuredWidth()));
90cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    }
91cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
925050813f15a1d39d49cb8eca5a3aa6df43c4d450Daniel Sandler    public boolean panelsEnabled() {
931e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler        return true;
941e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler    }
951e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler
9608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    @Override
9708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public boolean onTouchEvent(MotionEvent event) {
981e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler        // Allow subclasses to implement enable/disable semantics
992b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler        if (!panelsEnabled()) {
1002b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler            if (event.getAction() == MotionEvent.ACTION_DOWN) {
101cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock                Log.v(TAG, String.format("onTouch: all panels disabled, ignoring touch at (%d,%d)",
1022b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler                        (int) event.getX(), (int) event.getY()));
1032b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler            }
1042b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler            return false;
1052b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler        }
1061e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler
10708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        // figure out which panel needs to be talked to here
10808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (event.getAction() == MotionEvent.ACTION_DOWN) {
109efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            final PanelView panel = selectPanelForTouch(event);
110efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            if (panel == null) {
111efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                // panel is not there, so we'll eat the gesture
112cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock                Log.v(TAG, String.format("onTouch: no panel for touch at (%d,%d)",
1132b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler                        (int) event.getX(), (int) event.getY()));
114efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                mTouchingPanel = null;
115efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                return true;
116efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            }
117919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock            boolean enabled = panel.isEnabled();
11867eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler            if (DEBUG) LOG("PanelBar.onTouch: state=%d ACTION_DOWN: panel %s %s", mState, panel,
119919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock                    (enabled ? "" : " (disabled)"));
120efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            if (!enabled) {
121efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                // panel is disabled, so we'll eat the gesture
122cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock                Log.v(TAG, String.format(
1232b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler                        "onTouch: panel (%s) is disabled, ignoring touch at (%d,%d)",
1242b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler                        panel, (int) event.getX(), (int) event.getY()));
125efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                mTouchingPanel = null;
126efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                return true;
127efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            }
128198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            startOpeningPanel(panel);
12908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        }
130efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        final boolean result = mTouchingPanel != null
131040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                ? mTouchingPanel.onTouchEvent(event)
132efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                : true;
13308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return result;
13408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
13508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
136198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    // called from PanelView when self-expanding, too
137198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public void startOpeningPanel(PanelView panel) {
13867eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("startOpeningPanel: " + panel);
139198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        mTouchingPanel = panel;
140198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        mPanelHolder.setSelectedPanel(mTouchingPanel);
14167eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        for (PanelView pv : mPanels) {
14267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler            if (pv != panel) {
14367eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler                pv.collapse();
14467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler            }
14567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        }
146198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    }
147198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
14808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void panelExpansionChanged(PanelView panel, float frac) {
14908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        boolean fullyClosed = true;
1508e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        PanelView fullyOpenedPanel = null;
15167eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("panelExpansionChanged: start state=%d panel=%s", mState, panel.getName());
15267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        mPanelExpandedFractionSum = 0f;
15308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        for (PanelView pv : mPanels) {
15403c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi            boolean visible = pv.getExpandedHeight() > 0;
15503c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi            pv.setVisibility(visible ? View.VISIBLE : View.GONE);
156978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler            // adjust any other panels that may be partially visible
15708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            if (pv.getExpandedHeight() > 0f) {
158198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler                if (mState == STATE_CLOSED) {
159198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler                    go(STATE_OPENING);
160198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler                    onPanelPeeked();
161198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler                }
16208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                fullyClosed = false;
16308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                final float thisFrac = pv.getExpandedFraction();
16467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler                mPanelExpandedFractionSum += (visible ? thisFrac : 0);
16567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler                if (DEBUG) LOG("panelExpansionChanged:  -> %s: f=%.1f", pv.getName(), thisFrac);
16608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                if (panel == pv) {
1678e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler                    if (thisFrac == 1f) fullyOpenedPanel = panel;
16808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                }
16908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            }
17008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        }
17167eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        mPanelExpandedFractionSum /= mPanels.size();
172978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler        if (fullyOpenedPanel != null && !mTracking) {
173978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler            go(STATE_OPEN);
174978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler            onPanelFullyOpened(fullyOpenedPanel);
175198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        } else if (fullyClosed && !mTracking && mState != STATE_CLOSED) {
176978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler            go(STATE_CLOSED);
177978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler            onAllPanelsCollapsed();
178978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler        }
17908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
18067eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("panelExpansionChanged: end state=%d [%s%s ]", mState,
1818e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler                (fullyOpenedPanel!=null)?" fullyOpened":"", fullyClosed?" fullyClosed":"");
18208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
18308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
18408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void collapseAllPanels(boolean animate) {
185198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        boolean waiting = false;
18608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        for (PanelView pv : mPanels) {
187198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            if (animate && !pv.isFullyCollapsed()) {
188198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler                pv.collapse();
189198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler                waiting = true;
19008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            } else {
191dbbf45e79affa3e29b0f376719d297fe9c1f8a37Jorim Jaggi                pv.resetViews();
19208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                pv.setExpandedFraction(0); // just in case
19367eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler                pv.setVisibility(View.GONE);
1949764218ff979f735aee2f1189e3547d5f3b02f83John Spurlock                pv.cancelPeek();
19508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            }
19608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        }
19767eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("collapseAllPanels: animate=%s waiting=%s", animate, waiting);
198c38bbc391ae4ec5945d5fa408da3994552f775ebDaniel Sandler        if (!waiting && mState != STATE_CLOSED) {
199209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock            // it's possible that nothing animated, so we replicate the termination
200198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            // conditions of panelExpansionChanged here
201198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            go(STATE_CLOSED);
202198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            onAllPanelsCollapsed();
203198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        }
20408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
20508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
20608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onPanelPeeked() {
20767eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("onPanelPeeked");
20808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
20908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
21008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onAllPanelsCollapsed() {
21167eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("onAllPanelsCollapsed");
21208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
21308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
2148e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    public void onPanelFullyOpened(PanelView openPanel) {
21567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("onPanelFullyOpened");
21608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
217978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler
218978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler    public void onTrackingStarted(PanelView panel) {
219978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler        mTracking = true;
22067eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG && panel != mTouchingPanel) {
221978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler            LOG("shouldn't happen: onTrackingStarted(%s) != mTouchingPanel(%s)",
222978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler                    panel, mTouchingPanel);
223978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler        }
224978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler    }
225978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler
2262fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    public void onTrackingStopped(PanelView panel, boolean expand) {
227978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler        mTracking = false;
228978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler    }
2292fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi
2302fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    public void onExpandingFinished() {
2312fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi
2322fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    }
23308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler}
234