am 509e2ced: Merge "Improvements to notification/settings panels:" into jb-mr1-dev

* commit '509e2ced819ebaece2abb21693cb2046b5524c5b':
  Improvements to notification/settings panels:
This commit is contained in:
Daniel Sandler
2012-09-25 12:50:25 -07:00
committed by Android Git Automerger
5 changed files with 125 additions and 119 deletions

View File

@@ -35,13 +35,13 @@
android:layout_width="@dimen/status_bar_icon_size"
android:layout_height="match_parent"
android:paddingLeft="6dip"
android:paddingBottom="2dip"
android:paddingBottom="2dip"
android:src="@drawable/ic_sysbar_lights_out_dot_small"
android:scaleType="center"
android:visibility="gone"
/>
<LinearLayout android:id="@+id/icons"
<LinearLayout android:id="@+id/status_bar_contents"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="6dip"
@@ -50,7 +50,7 @@
>
<LinearLayout
android:id="@+id/notification_icon_area"
android:id="@+id/notification_icon_area"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1"
@@ -71,42 +71,48 @@
android:orientation="horizontal"/>
</LinearLayout>
<LinearLayout android:id="@+id/statusIcons"
<LinearLayout android:id="@+id/system_icon_area"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal"/>
android:orientation="horizontal">
<LinearLayout
android:id="@+id/signal_battery_cluster"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingLeft="2dp"
android:orientation="horizontal"
android:gravity="center"
>
<include layout="@layout/signal_cluster_view"
android:id="@+id/signal_cluster"
<LinearLayout android:id="@+id/statusIcons"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<ImageView
android:id="@+id/battery"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal"/>
<LinearLayout
android:id="@+id/signal_battery_cluster"
android:layout_width="wrap_content"
android:paddingLeft="4dip"
android:layout_height="match_parent"
android:paddingLeft="2dp"
android:orientation="horizontal"
android:gravity="center"
>
<include layout="@layout/signal_cluster_view"
android:id="@+id/signal_cluster"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<ImageView
android:id="@+id/battery"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:paddingLeft="4dip"
/>
</LinearLayout>
<com.android.systemui.statusbar.policy.Clock
android:id="@+id/clock"
android:textAppearance="@style/TextAppearance.StatusBar.Clock"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:singleLine="true"
android:paddingLeft="6dip"
android:gravity="center_vertical|left"
/>
</LinearLayout>
<com.android.systemui.statusbar.policy.Clock
android:id="@+id/clock"
android:textAppearance="@style/TextAppearance.StatusBar.Clock"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:singleLine="true"
android:paddingLeft="6dip"
android:gravity="center_vertical|left"
/>
</LinearLayout>
<LinearLayout android:id="@+id/ticker"

View File

@@ -107,6 +107,9 @@
<!-- Cap on overall resulting fling speed (s^-1) -->
<dimen name="fling_gesture_max_output_velocity">3000dp</dimen>
<!-- Minimum distance a fling must travel (anti-jitter) -->
<dimen name="fling_gesture_min_dist">10dp</dimen>
<!-- Minimum fraction of the display a gesture must travel, at any velocity, to qualify as a
collapse request -->
<item type="dimen" name="collapse_min_display_fraction">10%</item>

View File

@@ -6,6 +6,7 @@ import android.content.Context;
import android.util.AttributeSet;
import android.util.Slog;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
public class PanelBar extends FrameLayout {
@@ -101,6 +102,7 @@ public class PanelBar extends FrameLayout {
PanelView fullyOpenedPanel = null;
LOG("panelExpansionChanged: start state=%d panel=%s", mState, panel.getName());
for (PanelView pv : mPanels) {
final boolean visible = pv.getVisibility() == View.VISIBLE;
// adjust any other panels that may be partially visible
if (pv.getExpandedHeight() > 0f) {
if (mState == STATE_CLOSED) {
@@ -116,6 +118,11 @@ public class PanelBar extends FrameLayout {
pv.setExpandedFraction(1f-frac);
}
}
if (pv.getExpandedHeight() > 0f) {
if (!visible) pv.setVisibility(View.VISIBLE);
} else {
if (visible) pv.setVisibility(View.GONE);
}
}
if (fullyOpenedPanel != null && !mTracking) {
go(STATE_OPEN);
@@ -138,6 +145,7 @@ public class PanelBar extends FrameLayout {
} else {
pv.setExpandedFraction(0); // just in case
}
pv.setVisibility(View.GONE);
}
if (!waiting) {
// it's possible that nothing animated, so we replicate the termination

View File

@@ -37,6 +37,8 @@ public class PanelView extends FrameLayout {
private float mExpandMinDisplayFraction; // classic value: 0.5 (drag open halfway to expand)
private float mFlingGestureMaxXVelocityPx; // classic value: 150px/s
private float mFlingGestureMinDistPx;
private float mExpandAccelPx; // classic value: 2000px/s/s
private float mCollapseAccelPx; // classic value: 2000px/s/s (will be negated to collapse "up")
@@ -78,6 +80,8 @@ public class PanelView extends FrameLayout {
private float mVel, mAccel;
private int mFullHeight = 0;
private String mViewName;
protected float mInitialTouchY;
protected float mFinalTouchY;
private void animationTick(long dtms) {
if (!mTimeAnimator.isStarted()) {
@@ -88,7 +92,14 @@ public class PanelView extends FrameLayout {
mTimeAnimator.start();
mRubberbanding = STRETCH_PAST_CONTENTS && mExpandedHeight > getFullHeight();
mClosing = (mExpandedHeight > 0 && mVel < 0) || mRubberbanding;
if (mRubberbanding) {
mClosing = true;
} else if (mVel == 0) {
// if the panel is less than halfway open, close it
mClosing = (mFinalTouchY / getFullHeight()) < 0.5f;
} else {
mClosing = mExpandedHeight > 0 && mVel < 0;
}
} else if (dtms > 0) {
final float dt = dtms * 0.001f; // ms -> s
LOG("tick: v=%.2fpx/s dt=%.4fs", mVel, dt);
@@ -159,6 +170,8 @@ public class PanelView extends FrameLayout {
mFlingExpandMinVelocityPx = res.getDimension(R.dimen.fling_expand_min_velocity);
mFlingCollapseMinVelocityPx = res.getDimension(R.dimen.fling_collapse_min_velocity);
mFlingGestureMinDistPx = res.getDimension(R.dimen.fling_gesture_min_dist);
mCollapseMinDisplayFraction = res.getFraction(R.dimen.collapse_min_display_fraction, 1, 1);
mExpandMinDisplayFraction = res.getFraction(R.dimen.expand_min_display_fraction, 1, 1);
@@ -207,6 +220,7 @@ public class PanelView extends FrameLayout {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mTracking = true;
mInitialTouchY = y;
mVelocityTracker = VelocityTracker.obtain();
trackMovement(event);
mBar.onTrackingStarted(PanelView.this);
@@ -223,6 +237,7 @@ public class PanelView extends FrameLayout {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mFinalTouchY = y;
mTracking = false;
mBar.onTrackingStopped(PanelView.this);
trackMovement(event);
@@ -243,11 +258,21 @@ public class PanelView extends FrameLayout {
if (vel > mFlingGestureMaxOutputVelocityPx) {
vel = mFlingGestureMaxOutputVelocityPx;
}
// if you've barely moved your finger, we treat the velocity as 0
// preventing spurious flings due to touch screen jitter
final float deltaY = (float)Math.abs(mFinalTouchY - mInitialTouchY);
if (deltaY < mFlingGestureMinDistPx
|| vel < mFlingGestureMinDistPx) {
vel = 0;
}
if (negative) {
vel = -vel;
}
LOG("gesture: vraw=(%f,%f) vnorm=(%f,%f) vlinear=%f",
LOG("gesture: dy=%f vraw=(%f,%f) vnorm=(%f,%f) vlinear=%f",
deltaY,
mVelocityTracker.getXVelocity(),
mVelocityTracker.getYVelocity(),
xVel, yVel,

View File

@@ -153,11 +153,18 @@ public class PhoneStatusBar extends BaseStatusBar {
int mPixelFormat;
Object mQueueLock = new Object();
// icons
LinearLayout mIcons;
IconMerger mNotificationIcons;
View mMoreIcon;
// viewgroup containing the normal contents of the statusbar
LinearLayout mStatusBarContents;
// right-hand icons
LinearLayout mSystemIconArea;
// left-hand icons
LinearLayout mStatusIcons;
// the icons themselves
IconMerger mNotificationIcons;
// [+>
View mMoreIcon;
// expanded notifications
PanelView mNotificationPanel; // the sliding/resizing panel within the notification window
@@ -226,8 +233,8 @@ public class PhoneStatusBar extends BaseStatusBar {
int[] mAbsPos = new int[2];
Runnable mPostCollapseCleanup = null;
private AnimatorSet mLightsOutAnimation;
private AnimatorSet mLightsOnAnimation;
private Animator mLightsOutAnimation;
private Animator mLightsOnAnimation;
// for disabling the status bar
int mDisabled = 0;
@@ -245,9 +252,9 @@ public class PhoneStatusBar extends BaseStatusBar {
@Override
public void onAnimationEnd(Animator animation) {
// double-check to avoid races
if (mIcons.getAlpha() == 0) {
if (mStatusBarContents.getAlpha() == 0) {
Slog.d(TAG, "makeIconsInvisible");
mIcons.setVisibility(View.INVISIBLE);
mStatusBarContents.setVisibility(View.INVISIBLE);
}
}
};
@@ -307,8 +314,7 @@ public class PhoneStatusBar extends BaseStatusBar {
mNotificationPanelIsFullScreenWidth =
(mNotificationPanel.getLayoutParams().width == ViewGroup.LayoutParams.MATCH_PARENT);
mNotificationPanel.setSystemUiVisibility(
View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER
| (mNotificationPanelIsFullScreenWidth ? 0 : View.STATUS_BAR_DISABLE_SYSTEM_INFO));
View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER | View.STATUS_BAR_DISABLE_NOTIFICATION_ICONS);
if (!ActivityManager.isHighEndGfx()) {
mStatusBarWindow.setBackground(null);
@@ -343,10 +349,12 @@ public class PhoneStatusBar extends BaseStatusBar {
// figure out which pixel-format to use for the status bar.
mPixelFormat = PixelFormat.OPAQUE;
mSystemIconArea = (LinearLayout) mStatusBarView.findViewById(R.id.system_icon_area);
mStatusIcons = (LinearLayout)mStatusBarView.findViewById(R.id.statusIcons);
mNotificationIcons = (IconMerger)mStatusBarView.findViewById(R.id.notificationIcons);
mNotificationIcons.setOverflowIndicator(mMoreIcon);
mIcons = (LinearLayout)mStatusBarView.findViewById(R.id.icons);
mStatusBarContents = (LinearLayout)mStatusBarView.findViewById(R.id.status_bar_contents);
mTickerView = mStatusBarView.findViewById(R.id.ticker);
mPile = (NotificationRowLayout)mStatusBarWindow.findViewById(R.id.latestItems);
@@ -431,6 +439,8 @@ public class PhoneStatusBar extends BaseStatusBar {
mSettingsPanel.setService(this);
mSettingsPanel.setup(mNetworkController, mBluetoothController, mBatteryController,
mLocationController);
mSettingsPanel.setSystemUiVisibility(
View.STATUS_BAR_DISABLE_NOTIFICATION_TICKER | View.STATUS_BAR_DISABLE_SYSTEM_INFO);
if (!ActivityManager.isHighEndGfx()) {
mSettingsPanel.setBackground(new FastColorDrawable(context.getResources().getColor(
@@ -1016,22 +1026,18 @@ public class PhoneStatusBar extends BaseStatusBar {
Slog.d(TAG, flagdbg.toString());
if ((diff & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) {
mIcons.animate().cancel();
mSystemIconArea.animate().cancel();
if ((state & StatusBarManager.DISABLE_SYSTEM_INFO) != 0) {
if (mTicking) {
mTicker.halt();
}
mIcons.animate()
mSystemIconArea.animate()
.alpha(0f)
.translationY(mNaturalBarHeight*0.5f)
//.setStartDelay(100)
.setDuration(175)
.setInterpolator(new DecelerateInterpolator(1.5f))
.setListener(mMakeIconsInvisible)
.start();
} else {
mIcons.setVisibility(View.VISIBLE);
mIcons.animate()
mSystemIconArea.setVisibility(View.VISIBLE);
mSystemIconArea.animate()
.alpha(1f)
.translationY(0)
.setStartDelay(0)
@@ -1068,13 +1074,24 @@ public class PhoneStatusBar extends BaseStatusBar {
if ((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
if (mTicking) {
mTicker.halt();
} else {
setNotificationIconVisibility(false, com.android.internal.R.anim.fade_out);
}
mNotificationIcons.animate()
.alpha(0f)
.translationY(mNaturalBarHeight*0.5f)
.setDuration(175)
.setInterpolator(new DecelerateInterpolator(1.5f))
.setListener(mMakeIconsInvisible)
.start();
} else {
if (!mExpandedVisible) {
setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in);
}
mNotificationIcons.setVisibility(View.VISIBLE);
mNotificationIcons.animate()
.alpha(1f)
.translationY(0)
.setStartDelay(0)
.setInterpolator(new DecelerateInterpolator(1.5f))
.setDuration(175)
.start();
}
} else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
if (mTicking && (state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
@@ -1340,30 +1357,11 @@ public class PhoneStatusBar extends BaseStatusBar {
private void setStatusBarLowProfile(boolean lightsOut) {
if (mLightsOutAnimation == null) {
final View notifications = mStatusBarView.findViewById(R.id.notification_icon_area);
final View systemIcons = mStatusBarView.findViewById(R.id.statusIcons);
final View signal = mStatusBarView.findViewById(R.id.signal_cluster);
final View battery = mStatusBarView.findViewById(R.id.battery);
final View clock = mStatusBarView.findViewById(R.id.clock);
mLightsOutAnimation = new AnimatorSet();
mLightsOutAnimation.playTogether(
ObjectAnimator.ofFloat(notifications, View.ALPHA, 0),
ObjectAnimator.ofFloat(systemIcons, View.ALPHA, 0),
ObjectAnimator.ofFloat(signal, View.ALPHA, 0),
ObjectAnimator.ofFloat(battery, View.ALPHA, 0.5f),
ObjectAnimator.ofFloat(clock, View.ALPHA, 0.5f)
);
mLightsOutAnimation = ObjectAnimator.ofFloat(mStatusBarContents, View.ALPHA, 0);
mLightsOutAnimation.setDuration(750);
mLightsOnAnimation = new AnimatorSet();
mLightsOnAnimation.playTogether(
ObjectAnimator.ofFloat(notifications, View.ALPHA, 1),
ObjectAnimator.ofFloat(systemIcons, View.ALPHA, 1),
ObjectAnimator.ofFloat(signal, View.ALPHA, 1),
ObjectAnimator.ofFloat(battery, View.ALPHA, 1),
ObjectAnimator.ofFloat(clock, View.ALPHA, 1)
);
mLightsOnAnimation = ObjectAnimator.ofFloat(mStatusBarContents, View.ALPHA, 1);
mLightsOnAnimation.setDuration(250);
}
@@ -1453,25 +1451,25 @@ public class PhoneStatusBar extends BaseStatusBar {
@Override
public void tickerStarting() {
mTicking = true;
mIcons.setVisibility(View.GONE);
mStatusBarContents.setVisibility(View.GONE);
mTickerView.setVisibility(View.VISIBLE);
mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_up_in, null));
mIcons.startAnimation(loadAnim(com.android.internal.R.anim.push_up_out, null));
mStatusBarContents.startAnimation(loadAnim(com.android.internal.R.anim.push_up_out, null));
}
@Override
public void tickerDone() {
mIcons.setVisibility(View.VISIBLE);
mStatusBarContents.setVisibility(View.VISIBLE);
mTickerView.setVisibility(View.GONE);
mIcons.startAnimation(loadAnim(com.android.internal.R.anim.push_down_in, null));
mStatusBarContents.startAnimation(loadAnim(com.android.internal.R.anim.push_down_in, null));
mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_down_out,
mTickingDoneListener));
}
public void tickerHalting() {
mIcons.setVisibility(View.VISIBLE);
mStatusBarContents.setVisibility(View.VISIBLE);
mTickerView.setVisibility(View.GONE);
mIcons.startAnimation(loadAnim(com.android.internal.R.anim.fade_in, null));
mStatusBarContents.startAnimation(loadAnim(com.android.internal.R.anim.fade_in, null));
mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.fade_out,
mTickingDoneListener));
}
@@ -1649,40 +1647,6 @@ public class PhoneStatusBar extends BaseStatusBar {
String.format("%dx%d", mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels));
}
void performDisableActions(int net) {
int old = mDisabled;
int diff = net ^ old;
mDisabled = net;
// act accordingly
if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) {
if ((net & StatusBarManager.DISABLE_EXPAND) != 0) {
Slog.d(TAG, "DISABLE_EXPAND: yes");
animateCollapse();
}
}
if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
if ((net & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes");
if (mTicking) {
mNotificationIcons.setVisibility(View.INVISIBLE);
mTicker.halt();
} else {
setNotificationIconVisibility(false, com.android.internal.R.anim.fade_out);
}
} else {
Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: no");
if (!mExpandedVisible) {
setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in);
}
}
} else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
if (mTicking && (net & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) {
mTicker.halt();
}
}
}
private View.OnClickListener mClearButtonListener = new View.OnClickListener() {
public void onClick(View v) {
synchronized (mNotificationData) {