DelegateViewHelper.java revision 354619c1cc1b4668c81c5368b2256335cc9e8538
1e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller/*
2e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller * Copyright (C) 2010 The Android Open Source Project
3e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller *
4e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller * Licensed under the Apache License, Version 2.0 (the "License");
5e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller * you may not use this file except in compliance with the License.
6e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller * You may obtain a copy of the License at
7e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller *
8e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller *      http://www.apache.org/licenses/LICENSE-2.0
9e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller *
10e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller * Unless required by applicable law or agreed to in writing, software
11e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller * distributed under the License is distributed on an "AS IS" BASIS,
12e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller * See the License for the specific language governing permissions and
14e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller * limitations under the License.
15e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller */
16e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
17e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Millerpackage com.android.systemui.statusbar;
18e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
19354619c1cc1b4668c81c5368b2256335cc9e8538Jim Millerimport android.util.Slog;
20e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Millerimport android.view.MotionEvent;
21e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Millerimport android.view.Surface;
22e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Millerimport android.view.View;
23e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
24354619c1cc1b4668c81c5368b2256335cc9e8538Jim Millerimport com.android.systemui.R;
25354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller
26e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Millerpublic class DelegateViewHelper {
27e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    private View mDelegateView;
28e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    private View mSourceView;
29e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    private BaseStatusBar mBar;
30e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    private int[] mTempPoint = new int[2];
31354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller    private float[] mDownPoint = new float[2];
32e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    private int mOrientation;
33354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller    private float mTriggerThreshhold;
34e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
35e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    public DelegateViewHelper(View sourceView) {
36e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        mSourceView = sourceView;
37354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller        if (mSourceView != null) {
38354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller            mTriggerThreshhold = mSourceView.getContext().getResources()
39354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller                    .getDimension(R.dimen.navbar_search_up_threshhold);
40354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller        }
41e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    }
42e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
43e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    public void setDelegateView(View view) {
44e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        mDelegateView = view;
45e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    }
46e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
47e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    public void setBar(BaseStatusBar phoneStatusBar) {
48e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        mBar = phoneStatusBar;
49e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    }
50e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
51e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    public void setOrientation(int orientation) {
52e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        mOrientation = orientation;
53e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    }
54e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
55e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    public boolean onInterceptTouchEvent(MotionEvent event) {
56e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        switch (event.getAction()) {
57e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            case MotionEvent.ACTION_DOWN:
58354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller                mDownPoint[0] = event.getX();
59354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller                mDownPoint[1] = event.getY();
60e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                break;
61e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        }
62354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller        if (mDelegateView != null) {
63354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller            if (mDelegateView.getVisibility() != View.VISIBLE && event.getAction() != MotionEvent.ACTION_CANCEL) {
64e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                final boolean isVertical = (mOrientation == Surface.ROTATION_90
65e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                        || mOrientation == Surface.ROTATION_270);
66354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller                final int historySize = event.getHistorySize();
67354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller                for (int k = 0; k < historySize + 1; k++) {
68354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller                    float x = k < historySize ? event.getHistoricalX(k) : event.getX();
69354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller                    float y = k < historySize ? event.getHistoricalY(k) : event.getY();
70354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller                    final float distance = isVertical ? (mDownPoint[0] - x) : (mDownPoint[1] - y);
71354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller                    if (distance > mTriggerThreshhold) {
72e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                        mBar.showSearchPanel();
73354619c1cc1b4668c81c5368b2256335cc9e8538Jim Miller                        break;
74e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                    }
75e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller                }
76e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            }
77e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            mSourceView.getLocationOnScreen(mTempPoint);
78e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            float deltaX = mTempPoint[0];
79e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            float deltaY = mTempPoint[1];
80e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
81e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            mDelegateView.getLocationOnScreen(mTempPoint);
82e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            deltaX -= mTempPoint[0];
83e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            deltaY -= mTempPoint[1];
84e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller
85e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            event.offsetLocation(deltaX, deltaY);
86e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            mDelegateView.dispatchTouchEvent(event);
87e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller            event.offsetLocation(-deltaX, -deltaY);
88e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        }
89e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller        return false;
90e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller    }
91e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller}