PanelBar.java revision d0b2f7ddcac251acfe88092ecef4abb63b3e248b
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
83d0b2f7ddcac251acfe88092ecef4abb63b3e248bAdrian Roos    public void setBouncerShowing(boolean showing) {
84d0b2f7ddcac251acfe88092ecef4abb63b3e248bAdrian Roos        if (mPanelHolder != null) {
85d0b2f7ddcac251acfe88092ecef4abb63b3e248bAdrian Roos            mPanelHolder.setImportantForAccessibility(
86d0b2f7ddcac251acfe88092ecef4abb63b3e248bAdrian Roos                    showing ? IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
87d0b2f7ddcac251acfe88092ecef4abb63b3e248bAdrian Roos                            : IMPORTANT_FOR_ACCESSIBILITY_AUTO);
88d0b2f7ddcac251acfe88092ecef4abb63b3e248bAdrian Roos        }
89d0b2f7ddcac251acfe88092ecef4abb63b3e248bAdrian Roos    }
90d0b2f7ddcac251acfe88092ecef4abb63b3e248bAdrian Roos
9108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public float getBarHeight() {
9208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return getMeasuredHeight();
9308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
9408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
95efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler    public PanelView selectPanelForTouch(MotionEvent touch) {
96cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        final int N = mPanels.size();
97efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        return mPanels.get((int)(N * touch.getX() / getMeasuredWidth()));
98cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    }
99cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
1005050813f15a1d39d49cb8eca5a3aa6df43c4d450Daniel Sandler    public boolean panelsEnabled() {
1011e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler        return true;
1021e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler    }
1031e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler
10408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    @Override
10508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public boolean onTouchEvent(MotionEvent event) {
1061e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler        // Allow subclasses to implement enable/disable semantics
1072b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler        if (!panelsEnabled()) {
1082b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler            if (event.getAction() == MotionEvent.ACTION_DOWN) {
109cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock                Log.v(TAG, String.format("onTouch: all panels disabled, ignoring touch at (%d,%d)",
1102b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler                        (int) event.getX(), (int) event.getY()));
1112b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler            }
1122b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler            return false;
1132b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler        }
1141e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler
11508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        // figure out which panel needs to be talked to here
11608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (event.getAction() == MotionEvent.ACTION_DOWN) {
117efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            final PanelView panel = selectPanelForTouch(event);
118efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            if (panel == null) {
119efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                // panel is not there, so we'll eat the gesture
120cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock                Log.v(TAG, String.format("onTouch: no panel for touch at (%d,%d)",
1212b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler                        (int) event.getX(), (int) event.getY()));
122efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                mTouchingPanel = null;
123efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                return true;
124efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            }
125919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock            boolean enabled = panel.isEnabled();
12667eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler            if (DEBUG) LOG("PanelBar.onTouch: state=%d ACTION_DOWN: panel %s %s", mState, panel,
127919adac28bd6a9888c3bbd53a1736f260bc76bbfJohn Spurlock                    (enabled ? "" : " (disabled)"));
128efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            if (!enabled) {
129efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                // panel is disabled, so we'll eat the gesture
130cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock                Log.v(TAG, String.format(
1312b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler                        "onTouch: panel (%s) is disabled, ignoring touch at (%d,%d)",
1322b99a49c2e2dec29d350b662d5b45bca59cfd5c6Daniel Sandler                        panel, (int) event.getX(), (int) event.getY()));
133efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                mTouchingPanel = null;
134efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                return true;
135efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler            }
136198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            startOpeningPanel(panel);
13708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        }
138efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler        final boolean result = mTouchingPanel != null
139040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler                ? mTouchingPanel.onTouchEvent(event)
140efb0faf1c043777762eecfef87ec575632c365e1Daniel Sandler                : true;
14108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return result;
14208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
14308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
144198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    // called from PanelView when self-expanding, too
145198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public void startOpeningPanel(PanelView panel) {
14667eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("startOpeningPanel: " + panel);
147198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        mTouchingPanel = panel;
148198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        mPanelHolder.setSelectedPanel(mTouchingPanel);
14967eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        for (PanelView pv : mPanels) {
15067eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler            if (pv != panel) {
151f3b3bee12994a24b60bd447dede9e8791151fcc9Jorim Jaggi                pv.collapse(false /* delayed */, 1.0f /* speedUpFactor */);
15267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler            }
15367eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        }
154198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    }
155198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
156b472b347b51f84489217bb5d9c3beeeda1e4e626Jorim Jaggi    /**
157b472b347b51f84489217bb5d9c3beeeda1e4e626Jorim Jaggi     * @param panel the panel which changed its expansion state
158b472b347b51f84489217bb5d9c3beeeda1e4e626Jorim Jaggi     * @param frac the fraction from the expansion in [0, 1]
159b472b347b51f84489217bb5d9c3beeeda1e4e626Jorim Jaggi     * @param expanded whether the panel is currently expanded; this is independent from the
160b472b347b51f84489217bb5d9c3beeeda1e4e626Jorim Jaggi     *                 fraction as the panel also might be expanded if the fraction is 0
161b472b347b51f84489217bb5d9c3beeeda1e4e626Jorim Jaggi     */
162b472b347b51f84489217bb5d9c3beeeda1e4e626Jorim Jaggi    public void panelExpansionChanged(PanelView panel, float frac, boolean expanded) {
16308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        boolean fullyClosed = true;
1648e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        PanelView fullyOpenedPanel = null;
16567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("panelExpansionChanged: start state=%d panel=%s", mState, panel.getName());
16667eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        mPanelExpandedFractionSum = 0f;
16708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        for (PanelView pv : mPanels) {
168b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek            pv.setVisibility(expanded ? View.VISIBLE : View.INVISIBLE);
169978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler            // adjust any other panels that may be partially visible
170b472b347b51f84489217bb5d9c3beeeda1e4e626Jorim Jaggi            if (expanded) {
171198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler                if (mState == STATE_CLOSED) {
172198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler                    go(STATE_OPENING);
173198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler                    onPanelPeeked();
174198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler                }
17508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                fullyClosed = false;
17608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                final float thisFrac = pv.getExpandedFraction();
177b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek                mPanelExpandedFractionSum += thisFrac;
17867eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler                if (DEBUG) LOG("panelExpansionChanged:  -> %s: f=%.1f", pv.getName(), thisFrac);
17908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                if (panel == pv) {
1808e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler                    if (thisFrac == 1f) fullyOpenedPanel = panel;
18108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                }
18208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            }
18308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        }
18467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        mPanelExpandedFractionSum /= mPanels.size();
185978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler        if (fullyOpenedPanel != null && !mTracking) {
186978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler            go(STATE_OPEN);
187978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler            onPanelFullyOpened(fullyOpenedPanel);
188198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        } else if (fullyClosed && !mTracking && mState != STATE_CLOSED) {
189978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler            go(STATE_CLOSED);
190978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler            onAllPanelsCollapsed();
191978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler        }
19208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
19367eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("panelExpansionChanged: end state=%d [%s%s ]", mState,
1948e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler                (fullyOpenedPanel!=null)?" fullyOpened":"", fullyClosed?" fullyClosed":"");
19508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
19608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
197f3b3bee12994a24b60bd447dede9e8791151fcc9Jorim Jaggi    public void collapseAllPanels(boolean animate, boolean delayed, float speedUpFactor) {
198198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        boolean waiting = false;
19908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        for (PanelView pv : mPanels) {
200198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            if (animate && !pv.isFullyCollapsed()) {
201f3b3bee12994a24b60bd447dede9e8791151fcc9Jorim Jaggi                pv.collapse(delayed, speedUpFactor);
202198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler                waiting = true;
20308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            } else {
204dbbf45e79affa3e29b0f376719d297fe9c1f8a37Jorim Jaggi                pv.resetViews();
20508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                pv.setExpandedFraction(0); // just in case
2069764218ff979f735aee2f1189e3547d5f3b02f83John Spurlock                pv.cancelPeek();
20708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            }
20808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        }
20967eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("collapseAllPanels: animate=%s waiting=%s", animate, waiting);
210c38bbc391ae4ec5945d5fa408da3994552f775ebDaniel Sandler        if (!waiting && mState != STATE_CLOSED) {
211209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock            // it's possible that nothing animated, so we replicate the termination
212198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            // conditions of panelExpansionChanged here
213198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            go(STATE_CLOSED);
214198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            onAllPanelsCollapsed();
215198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        }
21608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
21708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
21808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onPanelPeeked() {
21967eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("onPanelPeeked");
22008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
22108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
22208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onAllPanelsCollapsed() {
22367eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("onAllPanelsCollapsed");
22408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
22508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
2268e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    public void onPanelFullyOpened(PanelView openPanel) {
22767eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG) LOG("onPanelFullyOpened");
22808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
229978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler
230978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler    public void onTrackingStarted(PanelView panel) {
231978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler        mTracking = true;
23267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler        if (DEBUG && panel != mTouchingPanel) {
233978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler            LOG("shouldn't happen: onTrackingStarted(%s) != mTouchingPanel(%s)",
234978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler                    panel, mTouchingPanel);
235978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler        }
236978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler    }
237978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler
2382fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    public void onTrackingStopped(PanelView panel, boolean expand) {
239978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler        mTracking = false;
240978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler    }
2412fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi
2422fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    public void onExpandingFinished() {
2432fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi
2442fbad7b6a724cf0a5b98b66fe639d58f5ab10af3Jorim Jaggi    }
245dbbcfbe8aea1944fc0b0ecbf531034bcd5b5770aSelim Cinek
246dbbcfbe8aea1944fc0b0ecbf531034bcd5b5770aSelim Cinek    public void onClosingFinished() {
247dbbcfbe8aea1944fc0b0ecbf531034bcd5b5770aSelim Cinek
248dbbcfbe8aea1944fc0b0ecbf531034bcd5b5770aSelim Cinek    }
24908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler}
250