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