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