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