1d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka/*
2d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * Copyright (C) 2010 The Android Open Source Project
3d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka *
4d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * Licensed under the Apache License, Version 2.0 (the "License");
5d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * you may not use this file except in compliance with the License.
6d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * You may obtain a copy of the License at
7d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka *
8d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka *      http://www.apache.org/licenses/LICENSE-2.0
9d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka *
10d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * Unless required by applicable law or agreed to in writing, software
11d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * distributed under the License is distributed on an "AS IS" BASIS,
12d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * See the License for the specific language governing permissions and
14d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka * limitations under the License.
15d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka */
16d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
17d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurkapackage com.android.launcher2;
18d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
19d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurkapublic class SpringLoadedDragController implements OnAlarmListener {
20d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    // how long the user must hover over a mini-screen before it unshrinks
213bc21c35fa167ac233e19df0c9a01b0a07173ed8Winson Chung    final long ENTER_SPRING_LOAD_HOVER_TIME = 500;
221c4cf4a11f3f7f24bbf65f958fdd22295d0bbd55Winson Chung    final long ENTER_SPRING_LOAD_CANCEL_HOVER_TIME = 950;
23d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    final long EXIT_SPRING_LOAD_HOVER_TIME = 200;
24d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
25d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    Alarm mAlarm;
26d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
27d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    // the screen the user is currently hovering over, if any
28d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    private CellLayout mScreen;
29d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    private Launcher mLauncher;
30d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
31d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public SpringLoadedDragController(Launcher launcher) {
32d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        mLauncher = launcher;
33d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        mAlarm = new Alarm();
34d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        mAlarm.setOnAlarmListener(this);
35d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
36d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
37b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung    public void cancel() {
38b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung        mAlarm.cancelAlarm();
39d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
40d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
41b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung    // Set a new alarm to expire for the screen that we are hovering over now
42b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung    public void setAlarm(CellLayout cl) {
43b8dffaffa187f1d8d8b0fde10a9fd109d39874ffWinson Chung        mAlarm.cancelAlarm();
441c4cf4a11f3f7f24bbf65f958fdd22295d0bbd55Winson Chung        mAlarm.setAlarm((cl == null) ? ENTER_SPRING_LOAD_CANCEL_HOVER_TIME :
451c4cf4a11f3f7f24bbf65f958fdd22295d0bbd55Winson Chung            ENTER_SPRING_LOAD_HOVER_TIME);
46b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung        mScreen = cl;
47d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
48d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka
49d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    // this is called when our timer runs out
50d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    public void onAlarm(Alarm alarm) {
51d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        if (mScreen != null) {
52b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung            // Snap to the screen that we are hovering over now
53b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung            Workspace w = mLauncher.getWorkspace();
54b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung            int page = w.indexOfChild(mScreen);
55b8dffaffa187f1d8d8b0fde10a9fd109d39874ffWinson Chung            if (page != w.getCurrentPage()) {
56b8dffaffa187f1d8d8b0fde10a9fd109d39874ffWinson Chung                w.snapToPage(page);
57b8dffaffa187f1d8d8b0fde10a9fd109d39874ffWinson Chung            }
58c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung        } else {
59c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung            mLauncher.getDragController().cancelDrag();
60d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka        }
61d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka    }
62d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka}
63