PanelBar.java revision 50a531337e7d6d49b40a1c96636962507ccf6c61
1f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson/* 2f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * Copyright (C) 2012 The Android Open Source Project 3f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * 4f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * you may not use this file except in compliance with the License. 6f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * You may obtain a copy of the License at 7f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * 8f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * 10f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * See the License for the specific language governing permissions and 14f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson * limitations under the License. 15f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson */ 16f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 17f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonpackage com.android.systemui.statusbar.phone; 18f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 19f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport java.util.ArrayList; 20f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 21f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport android.content.Context; 22f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport android.util.AttributeSet; 234557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport android.util.Slog; 24f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport android.view.MotionEvent; 25f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport android.view.View; 26f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport android.widget.FrameLayout; 27f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 28f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonpublic class PanelBar extends FrameLayout { 294557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilson public static final boolean DEBUG = false; 304557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilson public static final String TAG = PanelBar.class.getSimpleName(); 314557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilson public static final void LOG(String fmt, Object... args) { 32f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (!DEBUG) return; 33f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson Slog.v(TAG, String.format(fmt, args)); 34f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 35f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 36f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public static final int STATE_CLOSED = 0; 37f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public static final int STATE_OPENING = 1; 38f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public static final int STATE_OPEN = 2; 39f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 40f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson PanelHolder mPanelHolder; 41f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson ArrayList<PanelView> mPanels = new ArrayList<PanelView>(); 42f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson PanelView mTouchingPanel; 43f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson private int mState = STATE_CLOSED; 44f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson private boolean mTracking; 45f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 46f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson float mPanelExpandedFractionSum; 47f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 48f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public void go(int state) { 49f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (DEBUG) LOG("go state: %d -> %d", mState, state); 50f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson mState = state; 51f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 52f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 53f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public PanelBar(Context context, AttributeSet attrs) { 54f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson super(context, attrs); 55f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 56f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 57f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson @Override 58f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson protected void onFinishInflate() { 59f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson super.onFinishInflate(); 60f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 61f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 62f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public void addPanel(PanelView pv) { 63f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson mPanels.add(pv); 64f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson pv.setBar(this); 65f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 66f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 67f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public void setPanelHolder(PanelHolder ph) { 68f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (ph == null) { 69f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson Slog.e(TAG, "setPanelHolder: null PanelHolder", new Throwable()); 70f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson return; 71f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 72f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson ph.setBar(this); 73f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson mPanelHolder = ph; 74f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson final int N = ph.getChildCount(); 75f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson for (int i=0; i<N; i++) { 76f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson final View v = ph.getChildAt(i); 77f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (v != null && v instanceof PanelView) { 78f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson addPanel((PanelView) v); 79f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 80f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 81f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 82f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 83f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public float getBarHeight() { 84f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson return getMeasuredHeight(); 85f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 86f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 87f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public PanelView selectPanelForTouch(MotionEvent touch) { 88f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson final int N = mPanels.size(); 89f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson return mPanels.get((int)(N * touch.getX() / getMeasuredWidth())); 90f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 91f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 92f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public boolean panelsEnabled() { 93f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson return true; 94f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 95f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 96f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson @Override 97f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public boolean onTouchEvent(MotionEvent event) { 98f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson // Allow subclasses to implement enable/disable semantics 99f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (!panelsEnabled()) return false; 100f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 101f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson // figure out which panel needs to be talked to here 102f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (event.getAction() == MotionEvent.ACTION_DOWN) { 103f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson final PanelView panel = selectPanelForTouch(event); 104f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (panel == null) { 105f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson // panel is not there, so we'll eat the gesture 106f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (DEBUG) LOG("PanelBar.onTouch: no panel for x=%d, bailing", event.getX()); 107f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson mTouchingPanel = null; 108f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson return true; 109f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 110f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson boolean enabled = panel.isEnabled(); 111f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (DEBUG) LOG("PanelBar.onTouch: state=%d ACTION_DOWN: panel %s %s", mState, panel, 112f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson (enabled ? "" : " (disabled)")); 113f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (!enabled) { 114f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson // panel is disabled, so we'll eat the gesture 115f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson mTouchingPanel = null; 116f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson return true; 117f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 118f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson startOpeningPanel(panel); 119f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 120f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson final boolean result = mTouchingPanel != null 121f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson ? mTouchingPanel.onTouchEvent(event) 122f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson : true; 123f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson return result; 124f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 125f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 126f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson // called from PanelView when self-expanding, too 127f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public void startOpeningPanel(PanelView panel) { 128f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (DEBUG) LOG("startOpeningPanel: " + panel); 129f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson mTouchingPanel = panel; 130f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson mPanelHolder.setSelectedPanel(mTouchingPanel); 131f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson for (PanelView pv : mPanels) { 132f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (pv != panel) { 133f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson pv.collapse(); 134f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 135f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 136f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 137f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 138f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public void panelExpansionChanged(PanelView panel, float frac) { 139f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson boolean fullyClosed = true; 140f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson PanelView fullyOpenedPanel = null; 141f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (DEBUG) LOG("panelExpansionChanged: start state=%d panel=%s", mState, panel.getName()); 142f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson mPanelExpandedFractionSum = 0f; 143f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson for (PanelView pv : mPanels) { 144f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson final boolean visible = pv.getVisibility() == View.VISIBLE; 145f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson // adjust any other panels that may be partially visible 146f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (pv.getExpandedHeight() > 0f) { 147f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (mState == STATE_CLOSED) { 148f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson go(STATE_OPENING); 149f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson onPanelPeeked(); 150f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 151f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson fullyClosed = false; 152f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson final float thisFrac = pv.getExpandedFraction(); 153f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson mPanelExpandedFractionSum += (visible ? thisFrac : 0); 154f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (DEBUG) LOG("panelExpansionChanged: -> %s: f=%.1f", pv.getName(), thisFrac); 155f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (panel == pv) { 156f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (thisFrac == 1f) fullyOpenedPanel = panel; 157f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 158f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 159f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (pv.getExpandedHeight() > 0f) { 160f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (!visible) pv.setVisibility(View.VISIBLE); 161f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } else { 162f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (visible) pv.setVisibility(View.GONE); 163f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 164f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 165f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson mPanelExpandedFractionSum /= mPanels.size(); 166f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (fullyOpenedPanel != null && !mTracking) { 167f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson go(STATE_OPEN); 168f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson onPanelFullyOpened(fullyOpenedPanel); 169f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } else if (fullyClosed && !mTracking && mState != STATE_CLOSED) { 170f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson go(STATE_CLOSED); 171f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson onAllPanelsCollapsed(); 172f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 173f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 174f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (DEBUG) LOG("panelExpansionChanged: end state=%d [%s%s ]", mState, 175f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson (fullyOpenedPanel!=null)?" fullyOpened":"", fullyClosed?" fullyClosed":""); 176f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 177f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 1786a6b612286976cc185c898803fe51e4e062bd9ebBrett Chabot public void collapseAllPanels(boolean animate) { 179f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson boolean waiting = false; 180f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson for (PanelView pv : mPanels) { 181f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (animate && !pv.isFullyCollapsed()) { 182f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson pv.collapse(); 183f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson waiting = true; 184f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } else { 185f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson pv.setExpandedFraction(0); // just in case 186f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson pv.setVisibility(View.GONE); 187f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 188f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 189f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (DEBUG) LOG("collapseAllPanels: animate=%s waiting=%s", animate, waiting); 190f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (!waiting && mState != STATE_CLOSED) { 191f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson // it's possible that nothing animated, so we replicate the termination 192f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson // conditions of panelExpansionChanged here 193f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson go(STATE_CLOSED); 194f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson onAllPanelsCollapsed(); 195f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 196f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 197f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 198f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public void onPanelPeeked() { 199f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (DEBUG) LOG("onPanelPeeked"); 200f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 201f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 202f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public void onAllPanelsCollapsed() { 203f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (DEBUG) LOG("onAllPanelsCollapsed"); 204f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 205f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 206f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public void onPanelFullyOpened(PanelView openPanel) { 207f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson if (DEBUG) LOG("onPanelFullyOpened"); 208f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson } 209f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson 210f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson public void onTrackingStarted(PanelView panel) { 211f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilson mTracking = true; 212 if (DEBUG && panel != mTouchingPanel) { 213 LOG("shouldn't happen: onTrackingStarted(%s) != mTouchingPanel(%s)", 214 panel, mTouchingPanel); 215 } 216 } 217 218 public void onTrackingStopped(PanelView panel) { 219 mTracking = false; 220 panelExpansionChanged(panel, panel.getExpandedFraction()); 221 } 222} 223