PanelBar.java revision 978f853d189c1857190b4a2e200c7a283e31ca14
1package com.android.systemui.statusbar.phone; 2 3import java.util.ArrayList; 4 5import android.content.Context; 6import android.util.AttributeSet; 7import android.util.Slog; 8import android.view.MotionEvent; 9import android.widget.FrameLayout; 10 11public class PanelBar extends FrameLayout { 12 public static final boolean DEBUG = false; 13 public static final String TAG = PanelView.class.getSimpleName(); 14 public static final void LOG(String fmt, Object... args) { 15 if (!DEBUG) return; 16 Slog.v(TAG, String.format(fmt, args)); 17 } 18 19 private PanelHolder mPanelHolder; 20 private ArrayList<PanelView> mPanels = new ArrayList<PanelView>(); 21 protected PanelView mTouchingPanel; 22 private static final int STATE_CLOSED = 0; 23 private static final int STATE_TRANSITIONING = 1; 24 private static final int STATE_OPEN = 2; 25 private int mState = STATE_CLOSED; 26 private boolean mTracking; 27 28 private void go(int state) { 29 LOG("go state: %d -> %d", mState, state); 30 mState = state; 31 } 32 33 public PanelBar(Context context, AttributeSet attrs) { 34 super(context, attrs); 35 } 36 37 @Override 38 protected void onFinishInflate() { 39 super.onFinishInflate(); 40 } 41 42 public void addPanel(PanelView pv) { 43 mPanels.add(pv); 44 pv.setBar(this); 45 } 46 47 public void setPanelHolder(PanelHolder ph) { 48 if (ph == null) { 49 Slog.e(TAG, "setPanelHolder: null PanelHolder", new Throwable()); 50 return; 51 } 52 ph.setBar(this); 53 mPanelHolder = ph; 54 final int N = ph.getChildCount(); 55 for (int i=0; i<N; i++) { 56 final PanelView v = (PanelView) ph.getChildAt(i); 57 if (v != null) { 58 addPanel(v); 59 } 60 } 61 } 62 63 public float getBarHeight() { 64 return getMeasuredHeight(); 65 } 66 67 @Override 68 public boolean onTouchEvent(MotionEvent event) { 69 // figure out which panel needs to be talked to here 70 if (event.getAction() == MotionEvent.ACTION_DOWN) { 71 final int N = mPanels.size(); 72 final int i = (int)(N * event.getX() / getMeasuredWidth()); 73 mTouchingPanel = mPanels.get(i); 74 mPanelHolder.setSelectedPanel(mTouchingPanel); 75 LOG("PanelBar.onTouch: state=%d ACTION_DOWN: panel %d", mState, i); 76 if (mState == STATE_CLOSED || mState == STATE_OPEN) { 77 go(STATE_TRANSITIONING); 78 onPanelPeeked(); 79 } 80 } 81 final boolean result = mTouchingPanel.getHandle().dispatchTouchEvent(event); 82 return result; 83 } 84 85 public void panelExpansionChanged(PanelView panel, float frac) { 86 boolean fullyClosed = true; 87 PanelView fullyOpenedPanel = null; 88 LOG("panelExpansionChanged: start state=%d panel=%s", mState, panel.getName()); 89 for (PanelView pv : mPanels) { 90 // adjust any other panels that may be partially visible 91 if (pv.getExpandedHeight() > 0f) { 92 fullyClosed = false; 93 final float thisFrac = pv.getExpandedFraction(); 94 LOG("panelExpansionChanged: -> %s: f=%.1f", pv.getName(), thisFrac); 95 if (panel == pv) { 96 if (thisFrac == 1f) fullyOpenedPanel = panel; 97 } else { 98 pv.setExpandedFraction(1f-frac); 99 } 100 } 101 } 102 if (fullyOpenedPanel != null && !mTracking) { 103 go(STATE_OPEN); 104 onPanelFullyOpened(fullyOpenedPanel); 105 } else if (fullyClosed && !mTracking) { 106 go(STATE_CLOSED); 107 onAllPanelsCollapsed(); 108 } 109 110 LOG("panelExpansionChanged: end state=%d [%s%s ]", mState, 111 (fullyOpenedPanel!=null)?" fullyOpened":"", fullyClosed?" fullyClosed":""); 112 } 113 114 public void collapseAllPanels(boolean animate) { 115 for (PanelView pv : mPanels) { 116 if (animate && pv == mTouchingPanel) { 117 mTouchingPanel.collapse(); 118 } else { 119 pv.setExpandedFraction(0); // just in case 120 } 121 } 122 } 123 124 public void onPanelPeeked() { 125 LOG("onPanelPeeked"); 126 } 127 128 public void onAllPanelsCollapsed() { 129 LOG("onAllPanelsCollapsed"); 130 } 131 132 public void onPanelFullyOpened(PanelView openPanel) { 133 LOG("onPanelFullyOpened"); 134 } 135 136 public void onTrackingStarted(PanelView panel) { 137 mTracking = true; 138 if (panel != mTouchingPanel) { 139 LOG("shouldn't happen: onTrackingStarted(%s) != mTouchingPanel(%s)", 140 panel, mTouchingPanel); 141 } 142 } 143 144 public void onTrackingStopped(PanelView panel) { 145 mTracking = false; 146 panelExpansionChanged(panel, panel.getExpandedFraction()); 147 } 148} 149