UrlBarAutoShowManager.java revision 718a24d6c9671fe2da4112a3b5f30fd3939b38e8
1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.browser;
17
18import android.view.MotionEvent;
19import android.view.View;
20import android.view.View.OnTouchListener;
21import android.view.ViewConfiguration;
22import android.webkit.WebView;
23
24import com.android.browser.BrowserWebView.OnScrollChangedListener;
25
26/**
27 * Helper class to manage when to show the URL bar based off of touch
28 * input, and when to begin the hide timer.
29 */
30public class UrlBarAutoShowManager implements OnTouchListener,
31        OnScrollChangedListener {
32
33    private static float V_TRIGGER_ANGLE = .9f;
34
35    private BrowserWebView mTarget;
36    private BaseUi mUi;
37
38    private int mSlop;
39
40    private float mStartTouchX;
41    private float mStartTouchY;
42    private float mLastTouchX;
43    private float mLastTouchY;
44    private boolean mIsTracking;
45    private boolean mHasTriggered;
46
47    public UrlBarAutoShowManager(BaseUi ui) {
48        mUi = ui;
49        ViewConfiguration config = ViewConfiguration.get(mUi.getActivity());
50        mSlop = config.getScaledTouchSlop() * 2;
51    }
52
53    public void setTarget(BrowserWebView v) {
54        if (mTarget == v) return;
55
56        if (mTarget != null) {
57            mTarget.setOnTouchListener(null);
58            mTarget.setOnScrollChangedListener(null);
59        }
60        mTarget = v;
61        if (mTarget != null) {
62            mTarget.setOnTouchListener(this);
63            mTarget.setOnScrollChangedListener(this);
64        }
65    }
66
67    @Override
68    public void onScrollChanged(int l, int t, int oldl, int oldt) {
69        if (t != oldt) {
70            if (t != 0) {
71                // If it is showing, extend it
72                if (mUi.isTitleBarShowing()) {
73                    mUi.showTitleBarForDuration();
74                }
75            } else {
76                mUi.suggestHideTitleBar();
77            }
78        }
79    }
80
81    void stopTracking() {
82        if (mIsTracking) {
83            mIsTracking = false;
84            if (mUi.isTitleBarShowing()) {
85                mUi.showTitleBarForDuration();
86            }
87        }
88    }
89
90    @Override
91    public boolean onTouch(View v, MotionEvent event) {
92        if (event.getPointerCount() > 1) {
93            stopTracking();
94        }
95        switch (event.getAction()) {
96        case MotionEvent.ACTION_DOWN:
97            if (!mIsTracking && event.getPointerCount() == 1) {
98                mStartTouchY = event.getY();
99                mStartTouchX = event.getX();
100                mIsTracking = true;
101                mHasTriggered = false;
102            }
103            break;
104        case MotionEvent.ACTION_MOVE:
105            if (mIsTracking && !mHasTriggered) {
106                WebView web = (WebView) v;
107                float dy = event.getY() - mStartTouchY;
108                float ady = Math.abs(dy);
109                float adx = Math.abs(event.getX() - mStartTouchX);
110                if (ady > mSlop) {
111                    mHasTriggered = true;
112                    float angle = (float) Math.atan2(ady, adx);
113                    if (dy > mSlop && angle > V_TRIGGER_ANGLE
114                            && !mUi.isTitleBarShowing()
115                            && web.getVisibleTitleHeight() == 0) {
116                        mUi.showTitleBar();
117                    }
118                }
119            }
120            break;
121        case MotionEvent.ACTION_CANCEL:
122        case MotionEvent.ACTION_UP:
123            stopTracking();
124            break;
125        }
126        return false;
127    }
128
129}
130