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); } }