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