PanelBar.java revision de84f0e77ea2bf713d15c290264059a413c2486a
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) { 154173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler final boolean visible = pv.getVisibility() == View.VISIBLE; 155978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler // adjust any other panels that may be partially visible 15608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler if (pv.getExpandedHeight() > 0f) { 157198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler if (mState == STATE_CLOSED) { 158198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler go(STATE_OPENING); 159198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler onPanelPeeked(); 160198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler } 16108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler fullyClosed = false; 16208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler final float thisFrac = pv.getExpandedFraction(); 16367eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler mPanelExpandedFractionSum += (visible ? thisFrac : 0); 16467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler if (DEBUG) LOG("panelExpansionChanged: -> %s: f=%.1f", pv.getName(), thisFrac); 16508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler if (panel == pv) { 1668e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler if (thisFrac == 1f) fullyOpenedPanel = panel; 16708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler } 16808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler } 169173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler if (pv.getExpandedHeight() > 0f) { 170173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler if (!visible) pv.setVisibility(View.VISIBLE); 171173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler } else { 172173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler if (visible) pv.setVisibility(View.GONE); 173173bae2c674b2bc25cf376cbb4e150bd86703049Daniel Sandler } 17408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler } 17567eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler mPanelExpandedFractionSum /= mPanels.size(); 176978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler if (fullyOpenedPanel != null && !mTracking) { 177978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler go(STATE_OPEN); 178978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler onPanelFullyOpened(fullyOpenedPanel); 179198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler } else if (fullyClosed && !mTracking && mState != STATE_CLOSED) { 180978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler go(STATE_CLOSED); 181978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler onAllPanelsCollapsed(); 182978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler } 18308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 18467eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler if (DEBUG) LOG("panelExpansionChanged: end state=%d [%s%s ]", mState, 1858e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler (fullyOpenedPanel!=null)?" fullyOpened":"", fullyClosed?" fullyClosed":""); 18608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler } 18708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 18808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public void collapseAllPanels(boolean animate) { 189198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler boolean waiting = false; 19008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler for (PanelView pv : mPanels) { 191198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler if (animate && !pv.isFullyCollapsed()) { 192198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler pv.collapse(); 193198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler waiting = true; 19408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler } else { 19508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler pv.setExpandedFraction(0); // just in case 19667eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler pv.setVisibility(View.GONE); 19708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler } 19808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler } 19967eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler if (DEBUG) LOG("collapseAllPanels: animate=%s waiting=%s", animate, waiting); 200c38bbc391ae4ec5945d5fa408da3994552f775ebDaniel Sandler if (!waiting && mState != STATE_CLOSED) { 201198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler // it's possible that nothing animated, so we replicate the termination 202198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler // conditions of panelExpansionChanged here 203198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler go(STATE_CLOSED); 204198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler onAllPanelsCollapsed(); 205198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler } 20608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler } 20708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 20808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public void onPanelPeeked() { 20967eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler if (DEBUG) LOG("onPanelPeeked"); 21008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler } 21108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 21208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public void onAllPanelsCollapsed() { 21367eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler if (DEBUG) LOG("onAllPanelsCollapsed"); 21408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler } 21508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 2168e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler public void onPanelFullyOpened(PanelView openPanel) { 21767eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler if (DEBUG) LOG("onPanelFullyOpened"); 21808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler } 219978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler 220978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler public void onTrackingStarted(PanelView panel) { 221978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler mTracking = true; 22267eab79051eea2d4f8fda4a2a698900ffacfb557Daniel Sandler if (DEBUG && panel != mTouchingPanel) { 223978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler LOG("shouldn't happen: onTrackingStarted(%s) != mTouchingPanel(%s)", 224978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler panel, mTouchingPanel); 225978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler } 226978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler } 227978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler 228978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler public void onTrackingStopped(PanelView panel) { 229978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler mTracking = false; 230978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler panelExpansionChanged(panel, panel.getExpandedFraction()); 231978f853d189c1857190b4a2e200c7a283e31ca14Daniel Sandler } 23208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler} 233