/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.statusbar.phone; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import java.util.ArrayList; public class PanelBar extends FrameLayout { public static final boolean DEBUG = false; public static final String TAG = PanelBar.class.getSimpleName(); public static final void LOG(String fmt, Object... args) { if (!DEBUG) return; Log.v(TAG, String.format(fmt, args)); } public static final int STATE_CLOSED = 0; public static final int STATE_OPENING = 1; public static final int STATE_OPEN = 2; PanelHolder mPanelHolder; ArrayList mPanels = new ArrayList(); PanelView mTouchingPanel; private int mState = STATE_CLOSED; private boolean mTracking; float mPanelExpandedFractionSum; public void go(int state) { if (DEBUG) LOG("go state: %d -> %d", mState, state); mState = state; } public PanelBar(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { super.onFinishInflate(); } public void addPanel(PanelView pv) { mPanels.add(pv); pv.setBar(this); } public void setPanelHolder(PanelHolder ph) { if (ph == null) { Log.e(TAG, "setPanelHolder: null PanelHolder", new Throwable()); return; } ph.setBar(this); mPanelHolder = ph; final int N = ph.getChildCount(); for (int i=0; i 0; pv.setVisibility(visible ? View.VISIBLE : View.GONE); // adjust any other panels that may be partially visible if (expanded) { if (mState == STATE_CLOSED) { go(STATE_OPENING); onPanelPeeked(); } fullyClosed = false; final float thisFrac = pv.getExpandedFraction(); mPanelExpandedFractionSum += (visible ? thisFrac : 0); if (DEBUG) LOG("panelExpansionChanged: -> %s: f=%.1f", pv.getName(), thisFrac); if (panel == pv) { if (thisFrac == 1f) fullyOpenedPanel = panel; } } } mPanelExpandedFractionSum /= mPanels.size(); if (fullyOpenedPanel != null && !mTracking) { go(STATE_OPEN); onPanelFullyOpened(fullyOpenedPanel); } else if (fullyClosed && !mTracking && mState != STATE_CLOSED) { go(STATE_CLOSED); onAllPanelsCollapsed(); } if (DEBUG) LOG("panelExpansionChanged: end state=%d [%s%s ]", mState, (fullyOpenedPanel!=null)?" fullyOpened":"", fullyClosed?" fullyClosed":""); } public void collapseAllPanels(boolean animate) { boolean waiting = false; for (PanelView pv : mPanels) { if (animate && !pv.isFullyCollapsed()) { pv.collapse(true /* delayed */); waiting = true; } else { pv.resetViews(); pv.setExpandedFraction(0); // just in case pv.setVisibility(View.GONE); pv.cancelPeek(); } } if (DEBUG) LOG("collapseAllPanels: animate=%s waiting=%s", animate, waiting); if (!waiting && mState != STATE_CLOSED) { // it's possible that nothing animated, so we replicate the termination // conditions of panelExpansionChanged here go(STATE_CLOSED); onAllPanelsCollapsed(); } } public void onPanelPeeked() { if (DEBUG) LOG("onPanelPeeked"); } public void onAllPanelsCollapsed() { if (DEBUG) LOG("onAllPanelsCollapsed"); } public void onPanelFullyOpened(PanelView openPanel) { if (DEBUG) LOG("onPanelFullyOpened"); } public void onTrackingStarted(PanelView panel) { mTracking = true; if (DEBUG && panel != mTouchingPanel) { LOG("shouldn't happen: onTrackingStarted(%s) != mTouchingPanel(%s)", panel, mTouchingPanel); } } public void onTrackingStopped(PanelView panel, boolean expand) { mTracking = false; } public void onExpandingFinished() { } }