blob: 35dfb811061376eefe2a3a03164fc109e2ea91cf [file] [log] [blame]
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);
}
}