189e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver/* 289e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * Copyright (C) 2016 The Android Open Source Project 389e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * 489e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * Licensed under the Apache License, Version 2.0 (the "License"); 589e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * you may not use this file except in compliance with the License. 689e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * You may obtain a copy of the License at 789e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * 889e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * http://www.apache.org/licenses/LICENSE-2.0 989e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * 1089e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * Unless required by applicable law or agreed to in writing, software 1189e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * distributed under the License is distributed on an "AS IS" BASIS, 1289e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * See the License for the specific language governing permissions and 1489e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * limitations under the License. 1589e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver */ 1689e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver 1789e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaverpackage com.android.server.accessibility; 1889e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver 1989e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaverimport android.os.Handler; 2089e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaverimport android.os.Message; 2189e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaverimport android.util.Pair; 2289e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver 2389e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaverimport java.util.ArrayList; 2489e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaverimport java.util.List; 2589e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver 2689e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver/** 2789e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * Utility class to capture messages dispatched through a handler and control when they arrive 2889e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver * at their target. 2989e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver */ 3089e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaverpublic class MessageCapturingHandler extends Handler { 3189e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver List<Pair<Message, Long>> timedMessages = new ArrayList<>(); 3289e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver 3389e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver Handler.Callback mCallback; 3489e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver 3589e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver public MessageCapturingHandler(Handler.Callback callback) { 3689e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver mCallback = callback; 3789e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver } 3889e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver 3989e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver @Override 4089e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver public boolean sendMessageAtTime(Message message, long uptimeMillis) { 4189e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver timedMessages.add(new Pair<>(Message.obtain(message), uptimeMillis)); 4289e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver return super.sendMessageAtTime(message, uptimeMillis); 4389e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver } 4489e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver 457a6cc9b5a70217029a08bdaae701f072bf5410dePhil Weaver public void setCallback(Handler.Callback callback) { 467a6cc9b5a70217029a08bdaae701f072bf5410dePhil Weaver mCallback = callback; 477a6cc9b5a70217029a08bdaae701f072bf5410dePhil Weaver } 487a6cc9b5a70217029a08bdaae701f072bf5410dePhil Weaver 4989e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver public void sendOneMessage() { 5089e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver Message message = timedMessages.remove(0).first; 5189e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver removeMessages(message.what, message.obj); 5289e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver mCallback.handleMessage(message); 5389e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver removeStaleMessages(); 5489e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver } 5589e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver 5689e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver public void sendAllMessages() { 5789e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver while (!timedMessages.isEmpty()) { 5889e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver sendOneMessage(); 5989e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver } 6089e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver } 6189e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver 6289e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver public void sendLastMessage() { 6389e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver Message message = timedMessages.remove(timedMessages.size() - 1).first; 6489e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver removeMessages(message.what, message.obj); 6589e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver mCallback.handleMessage(message); 6689e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver removeStaleMessages(); 6789e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver } 6889e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver 6989e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver public boolean hasMessages() { 7089e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver removeStaleMessages(); 7189e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver return !timedMessages.isEmpty(); 7289e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver } 7389e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver 7489e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver private void removeStaleMessages() { 7589e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver for (int i = 0; i < timedMessages.size(); i++) { 7689e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver Message message = timedMessages.get(i).first; 7789e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver if (!hasMessages(message.what, message.obj)) { 7889e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver timedMessages.remove(i--); 7989e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver } 8089e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver } 8189e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver } 8289e3ffc66c5a05f188ff9748b48abebc247f664bPhil Weaver} 83