summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/res/layout/status_bar.xml70
-rw-r--r--packages/SystemUI/res/values/dimens.xml3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java132
5 files changed, 124 insertions, 118 deletions
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index 6ed5fb7..bf20e9d 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -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: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:paddingLeft="4dip"
+ 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"
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 13cda3a..90fe558 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -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>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
index 9a3648f..f623692 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
@@ -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
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index 57528a5..45a107d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -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,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 7e44b16..2f30a38 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -153,11 +153,18 @@ public class PhoneStatusBar extends BaseStatusBar {
int mPixelFormat;
Object mQueueLock = new Object();
- // icons
- LinearLayout mIcons;
+ // 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;
- LinearLayout mStatusIcons;
// 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) {