108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler/* 208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler * Copyright (C) 2012 The Android Open Source Project 308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler * 408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler * Licensed under the Apache License, Version 2.0 (the "License"); 508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler * you may not use this file except in compliance with the License. 608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler * You may obtain a copy of the License at 708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler * 808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler * http://www.apache.org/licenses/LICENSE-2.0 908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler * 1008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler * Unless required by applicable law or agreed to in writing, software 1108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler * distributed under the License is distributed on an "AS IS" BASIS, 1208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler * See the License for the specific language governing permissions and 1408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler * limitations under the License. 1508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler */ 1608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 1708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerpackage com.android.systemui.statusbar.phone; 1808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 1908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.content.Context; 204d179dc6ccf3eb118767e94b803484abe9552537Chet Haaseimport android.content.res.Resources; 214d179dc6ccf3eb118767e94b803484abe9552537Chet Haaseimport android.graphics.Canvas; 224d179dc6ccf3eb118767e94b803484abe9552537Chet Haaseimport android.graphics.drawable.Drawable; 2308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.util.AttributeSet; 24040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandlerimport android.util.Slog; 25040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandlerimport android.view.MotionEvent; 2613522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandlerimport android.view.View; 2713522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler 284d179dc6ccf3eb118767e94b803484abe9552537Chet Haaseimport com.android.systemui.R; 29151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandlerimport com.android.systemui.statusbar.GestureRecorder; 3008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 3108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerpublic class NotificationPanelView extends PanelView { 324d179dc6ccf3eb118767e94b803484abe9552537Chet Haase 334d179dc6ccf3eb118767e94b803484abe9552537Chet Haase Drawable mHandleBar; 34076324ae191469737afa5bbec577a718f3a31886Daniel Sandler int mHandleBarHeight; 3513522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler View mHandleView; 36040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler int mFingers; 37040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler PhoneStatusBar mStatusBar; 382017a056624e747ac91f8203728960a27da0b95aDaniel Sandler boolean mOkToFlip; 394d179dc6ccf3eb118767e94b803484abe9552537Chet Haase 4008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public NotificationPanelView(Context context, AttributeSet attrs) { 4108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler super(context, attrs); 4213522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler } 4313522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler 44040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler public void setStatusBar(PhoneStatusBar bar) { 45040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler mStatusBar = bar; 46040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler } 47040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler 4813522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler @Override 4913522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler protected void onFinishInflate() { 5013522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler super.onFinishInflate(); 514d179dc6ccf3eb118767e94b803484abe9552537Chet Haase 5213522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler Resources resources = getContext().getResources(); 534d179dc6ccf3eb118767e94b803484abe9552537Chet Haase mHandleBar = resources.getDrawable(R.drawable.status_bar_close); 54076324ae191469737afa5bbec577a718f3a31886Daniel Sandler mHandleBarHeight = resources.getDimensionPixelSize(R.dimen.close_handle_height); 5513522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler mHandleView = findViewById(R.id.handle); 56bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt 57bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt setContentDescription(resources.getString(R.string.accessibility_desc_notification_shade)); 5808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler } 5908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler 6008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler @Override 6108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler public void fling(float vel, boolean always) { 62151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler GestureRecorder gr = ((PhoneStatusBarView) mBar).mBar.getGestureRecorder(); 63151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler if (gr != null) { 64151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler gr.tag( 65151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler "fling " + ((vel > 0) ? "open" : "closed"), 66151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler "notifications,v=" + vel); 67151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler } 6808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler super.fling(vel, always); 6908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler } 704d179dc6ccf3eb118767e94b803484abe9552537Chet Haase 7113522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler // We draw the handle ourselves so that it's always glued to the bottom of the window. 724d179dc6ccf3eb118767e94b803484abe9552537Chet Haase @Override 734d179dc6ccf3eb118767e94b803484abe9552537Chet Haase protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 744d179dc6ccf3eb118767e94b803484abe9552537Chet Haase super.onLayout(changed, left, top, right, bottom); 754d179dc6ccf3eb118767e94b803484abe9552537Chet Haase if (changed) { 7613522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler final int pl = getPaddingLeft(); 7713522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler final int pr = getPaddingRight(); 7813522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler mHandleBar.setBounds(pl, 0, getWidth() - pr, (int) mHandleBarHeight); 794d179dc6ccf3eb118767e94b803484abe9552537Chet Haase } 804d179dc6ccf3eb118767e94b803484abe9552537Chet Haase } 814d179dc6ccf3eb118767e94b803484abe9552537Chet Haase 824d179dc6ccf3eb118767e94b803484abe9552537Chet Haase @Override 834d179dc6ccf3eb118767e94b803484abe9552537Chet Haase public void draw(Canvas canvas) { 844d179dc6ccf3eb118767e94b803484abe9552537Chet Haase super.draw(canvas); 8513522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler final int off = (int) (getHeight() - mHandleBarHeight - getPaddingBottom()); 8613522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler canvas.translate(0, off); 8713522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler mHandleBar.setState(mHandleView.getDrawableState()); 884d179dc6ccf3eb118767e94b803484abe9552537Chet Haase mHandleBar.draw(canvas); 8913522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler canvas.translate(0, -off); 904d179dc6ccf3eb118767e94b803484abe9552537Chet Haase } 91040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler 92040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler @Override 93040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler public boolean onTouchEvent(MotionEvent event) { 94040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler if (PhoneStatusBar.SETTINGS_DRAG_SHORTCUT && mStatusBar.mHasFlipSettings) { 95040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler switch (event.getActionMasked()) { 96040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler case MotionEvent.ACTION_DOWN: 972017a056624e747ac91f8203728960a27da0b95aDaniel Sandler mOkToFlip = getExpandedHeight() == 0; 98040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler break; 99040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler case MotionEvent.ACTION_POINTER_DOWN: 1002017a056624e747ac91f8203728960a27da0b95aDaniel Sandler if (mOkToFlip) { 101040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler float miny = event.getY(0); 102040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler float maxy = miny; 103040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler for (int i=1; i<event.getPointerCount(); i++) { 104040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler final float y = event.getY(i); 105040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler if (y < miny) miny = y; 106040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler if (y > maxy) maxy = y; 107040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler } 108040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler if (maxy - miny < mHandleBarHeight) { 109040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler if (getMeasuredHeight() < mHandleBarHeight) { 110040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler mStatusBar.switchToSettings(); 111040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler } else { 112040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler mStatusBar.flipToSettings(); 113040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler } 1142017a056624e747ac91f8203728960a27da0b95aDaniel Sandler mOkToFlip = false; 115040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler } 116040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler } 117040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler break; 118040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler } 119040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler } 120040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler return mHandleView.dispatchTouchEvent(event); 121040c2e4ace25a45bc701821da4fa786e6dd75eadDaniel Sandler } 12208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler} 123