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