summaryrefslogtreecommitdiff
path: root/services/java/com/android/server/status/StatusBarView.java
diff options
context:
space:
mode:
Diffstat (limited to 'services/java/com/android/server/status/StatusBarView.java')
-rw-r--r--services/java/com/android/server/status/StatusBarView.java134
1 files changed, 134 insertions, 0 deletions
diff --git a/services/java/com/android/server/status/StatusBarView.java b/services/java/com/android/server/status/StatusBarView.java
new file mode 100644
index 000000000000..35dfb8110613
--- /dev/null
+++ b/services/java/com/android/server/status/StatusBarView.java
@@ -0,0 +1,134 @@
+package com.android.server.status;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.widget.FrameLayout;
+
+import com.android.internal.R;
+
+public class StatusBarView extends FrameLayout {
+ private static final String TAG = "StatusBarView";
+
+ StatusBarService mService;
+ boolean mTracking;
+ int mStartX, mStartY;
+ ViewGroup mNotificationIcons;
+ ViewGroup mStatusIcons;
+ View mDate;
+ FixedSizeDrawable mBackground;
+
+ public StatusBarView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mNotificationIcons = (ViewGroup)findViewById(R.id.notificationIcons);
+ mStatusIcons = (ViewGroup)findViewById(R.id.statusIcons);
+ mDate = findViewById(R.id.date);
+
+ mBackground = new FixedSizeDrawable(mDate.getBackground());
+ mBackground.setFixedBounds(0, 0, 0, 0);
+ mDate.setBackgroundDrawable(mBackground);
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mService.onBarViewAttached();
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ mService.updateExpandedViewPos(StatusBarService.EXPANDED_LEAVE_ALONE);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ super.onLayout(changed, l, t, r, b);
+
+ // put the date date view quantized to the icons
+ int oldDateRight = mDate.getRight();
+ int newDateRight;
+
+ newDateRight = getDateSize(mNotificationIcons, oldDateRight,
+ getViewOffset(mNotificationIcons));
+ if (newDateRight < 0) {
+ int offset = getViewOffset(mStatusIcons);
+ if (oldDateRight < offset) {
+ newDateRight = oldDateRight;
+ } else {
+ newDateRight = getDateSize(mStatusIcons, oldDateRight, offset);
+ if (newDateRight < 0) {
+ newDateRight = r;
+ }
+ }
+ }
+ int max = r - getPaddingRight();
+ if (newDateRight > max) {
+ newDateRight = max;
+ }
+
+ mDate.layout(mDate.getLeft(), mDate.getTop(), newDateRight, mDate.getBottom());
+ mBackground.setFixedBounds(-mDate.getLeft(), -mDate.getTop(), (r-l), (b-t));
+ }
+
+ /**
+ * Gets the left position of v in this view. Throws if v is not
+ * a child of this.
+ */
+ private int getViewOffset(View v) {
+ int offset = 0;
+ while (v != this) {
+ offset += v.getLeft();
+ ViewParent p = v.getParent();
+ if (v instanceof View) {
+ v = (View)p;
+ } else {
+ throw new RuntimeException(v + " is not a child of " + this);
+ }
+ }
+ return offset;
+ }
+
+ private int getDateSize(ViewGroup g, int w, int offset) {
+ final int N = g.getChildCount();
+ for (int i=0; i<N; i++) {
+ View v = g.getChildAt(i);
+ int l = v.getLeft() + offset;
+ int r = v.getRight() + offset;
+ if (w >= l && w <= r) {
+ return r;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Ensure that, if there is no target under us to receive the touch,
+ * that we process it ourself. This makes sure that onInterceptTouchEvent()
+ * is always called for the entire gesture.
+ */
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (event.getAction() != MotionEvent.ACTION_DOWN) {
+ mService.interceptTouchEvent(event);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent event) {
+ return mService.interceptTouchEvent(event)
+ ? true : super.onInterceptTouchEvent(event);
+ }
+}
+