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