1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/*
2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project
3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License");
5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License.
6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at
7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *      http://www.apache.org/licenses/LICENSE-2.0
9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software
11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS,
12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and
14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License.
15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */
16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.ui;
18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.view.MotionEvent;
20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class DownUpDetector {
22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public interface DownUpListener {
23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        void onDown(MotionEvent e);
24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        void onUp(MotionEvent e);
25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mStillDown;
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private DownUpListener mListener;
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public DownUpDetector(DownUpListener listener) {
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mListener = listener;
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void setState(boolean down, MotionEvent e) {
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (down == mStillDown) return;
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mStillDown = down;
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (down) {
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mListener.onDown(e);
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mListener.onUp(e);
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void onTouchEvent(MotionEvent ev) {
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        switch (ev.getAction() & MotionEvent.ACTION_MASK) {
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        case MotionEvent.ACTION_DOWN:
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            setState(true, ev);
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            break;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        case MotionEvent.ACTION_UP:
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        case MotionEvent.ACTION_CANCEL:
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        case MotionEvent.ACTION_POINTER_DOWN:  // Multitouch event - abort.
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            setState(false, ev);
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            break;
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public boolean isDown() {
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mStillDown;
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
62