PanelBar.java revision 08d05e3d1d6ade6924266296033981a96b47d5fb
108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerpackage com.android.systemui.statusbar.phone;
208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport java.util.ArrayList;
408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.content.Context;
608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.util.AttributeSet;
708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.util.Slog;
808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.view.MotionEvent;
908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.widget.FrameLayout;
1008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
1108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerpublic class PanelBar extends FrameLayout {
1208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public static final boolean DEBUG = true;
1308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public static final String TAG = PanelView.class.getSimpleName();
1408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public static final void LOG(String fmt, Object... args) {
1508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (!DEBUG) return;
1608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        Slog.v(TAG, String.format(fmt, args));
1708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
1808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
1908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    private PanelHolder mPanelHolder;
2008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    private ArrayList<PanelView> mPanels = new ArrayList<PanelView>();
2108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    private PanelView mTouchingPanel;
2208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
2308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public PanelBar(Context context, AttributeSet attrs) {
2408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        super(context, attrs);
2508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
2608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
2708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    @Override
2808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    protected void onFinishInflate() {
2908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        super.onFinishInflate();
3008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
3108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
3208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void addPanel(PanelView pv) {
3308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mPanels.add(pv);
3408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        pv.setBar(this);
3508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
3608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
3708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void setPanelHolder(PanelHolder ph) {
3808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (ph == null) {
3908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            Slog.e(TAG, "setPanelHolder: null PanelHolder", new Throwable());
4008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            return;
4108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        }
4208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        ph.setBar(this);
4308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mPanelHolder = ph;
4408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        final int N = ph.getChildCount();
4508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        for (int i=0; i<N; i++) {
4608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            final PanelView v = (PanelView) ph.getChildAt(i);
4708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            if (v != null) {
4808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                addPanel(v);
4908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            }
5008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        }
5108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
5208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
5308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public float getBarHeight() {
5408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return getMeasuredHeight();
5508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
5608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
5708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    @Override
5808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public boolean onTouchEvent(MotionEvent event) {
5908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        // figure out which panel needs to be talked to here
6008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (event.getAction() == MotionEvent.ACTION_DOWN) {
6108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            final int N = mPanels.size();
6208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            final int i = (int)(N * event.getX() / getMeasuredWidth());
6308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            mTouchingPanel = mPanels.get(i);
6408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            mPanelHolder.setSelectedPanel(mTouchingPanel);
6508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            LOG("PanelBar.onTouch: ACTION_DOWN: panel %d", i);
6608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            onPanelPeeked();
6708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        }
6808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        final boolean result = mTouchingPanel.getHandle().dispatchTouchEvent(event);
6908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return result;
7008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
7108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
7208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void panelExpansionChanged(PanelView panel, float frac) {
7308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        boolean fullyClosed = true;
7408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        boolean fullyOpened = false;
7508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        for (PanelView pv : mPanels) {
7608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            if (pv.getExpandedHeight() > 0f) {
7708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                fullyClosed = false;
7808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                final float thisFrac = pv.getExpandedFraction();
7908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                LOG("panel %s: f=%.1f", pv, thisFrac);
8008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                if (panel == pv) {
8108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                    if (thisFrac == 1f) fullyOpened = true;
8208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                } else {
8308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                    pv.setExpandedFraction(1f-frac);
8408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                }
8508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            }
8608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        }
8708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (fullyOpened) onPanelFullyOpened();
8808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (fullyClosed) onAllPanelsCollapsed();
8908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        else onPanelPeeked();
9008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
9108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        LOG("panelExpansionChanged: [%s%s ]", fullyOpened?" fullyOpened":"", fullyClosed?" fullyClosed":"");
9208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
9308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
9408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void collapseAllPanels(boolean animate) {
9508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        for (PanelView pv : mPanels) {
9608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            if (animate && pv == mTouchingPanel) {
9708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                mTouchingPanel.collapse();
9808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            } else {
9908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler                pv.setExpandedFraction(0); // just in case
10008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            }
10108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        }
10208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
10308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
10408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onPanelPeeked() {
10508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        LOG("onPanelPeeked");
10608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
10708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
10808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onAllPanelsCollapsed() {
10908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        LOG("onAllPanelsCollapsed");
11008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
11108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
11208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onPanelFullyOpened() {
11308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        LOG("onPanelFullyOpened");
11408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    }
11508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler}
116