124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard/*
224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * Copyright (C) 2013 The Android Open Source Project
324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard *
424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * Licensed under the Apache License, Version 2.0 (the "License");
524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * you may not use this file except in compliance with the License.
624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * You may obtain a copy of the License at
724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard *
824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard *      http://www.apache.org/licenses/LICENSE-2.0
924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard *
1024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * Unless required by applicable law or agreed to in writing, software
1124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * distributed under the License is distributed on an "AS IS" BASIS,
1224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * See the License for the specific language governing permissions and
1424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard * limitations under the License.
1524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard */
1624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
1724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardpackage com.android.gallery3d.filtershow.pipeline;
1824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
1924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport android.content.Context;
2024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport android.os.Handler;
2124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport android.os.Message;
2224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
2324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardpublic abstract class ProcessingTask {
2424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private ProcessingTaskController mTaskController;
2524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private Handler mProcessingHandler;
2624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private Handler mResultHandler;
2724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    private int mType;
28db5d060e8077f70d650e1ce56618f953114551e0nicolasroard    private static final int DELAY = 300;
2924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
3024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    static interface Request {}
3124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    static interface Update {}
3224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    static interface Result {}
3324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
34db5d060e8077f70d650e1ce56618f953114551e0nicolasroard    public boolean postRequest(Request message) {
3524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        Message msg = mProcessingHandler.obtainMessage(mType);
3624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        msg.obj = message;
37db5d060e8077f70d650e1ce56618f953114551e0nicolasroard        if (isPriorityTask()) {
38db5d060e8077f70d650e1ce56618f953114551e0nicolasroard            if (mProcessingHandler.hasMessages(getType())) {
39db5d060e8077f70d650e1ce56618f953114551e0nicolasroard                return false;
40db5d060e8077f70d650e1ce56618f953114551e0nicolasroard            }
41db5d060e8077f70d650e1ce56618f953114551e0nicolasroard            mProcessingHandler.sendMessageAtFrontOfQueue(msg);
42db5d060e8077f70d650e1ce56618f953114551e0nicolasroard        } else if (isDelayedTask()) {
43db5d060e8077f70d650e1ce56618f953114551e0nicolasroard            if (mProcessingHandler.hasMessages(getType())) {
44db5d060e8077f70d650e1ce56618f953114551e0nicolasroard                mProcessingHandler.removeMessages(getType());
45db5d060e8077f70d650e1ce56618f953114551e0nicolasroard            }
46db5d060e8077f70d650e1ce56618f953114551e0nicolasroard            mProcessingHandler.sendMessageDelayed(msg, DELAY);
47db5d060e8077f70d650e1ce56618f953114551e0nicolasroard        } else {
48db5d060e8077f70d650e1ce56618f953114551e0nicolasroard            mProcessingHandler.sendMessage(msg);
49db5d060e8077f70d650e1ce56618f953114551e0nicolasroard        }
50db5d060e8077f70d650e1ce56618f953114551e0nicolasroard        return true;
5124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
5224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
5324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public void postUpdate(Update message) {
5424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        Message msg = mResultHandler.obtainMessage(mType);
5524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        msg.obj = message;
5624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        msg.arg1 = ProcessingTaskController.UPDATE;
5724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        mResultHandler.sendMessage(msg);
5824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
5924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
6024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public void processRequest(Request message) {
6124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        Object result = doInBackground(message);
6224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        Message msg = mResultHandler.obtainMessage(mType);
6324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        msg.obj = result;
6424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        msg.arg1 = ProcessingTaskController.RESULT;
6524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        mResultHandler.sendMessage(msg);
6624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
6724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
6824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public void added(ProcessingTaskController taskController) {
6924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        mTaskController = taskController;
7024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        mResultHandler = taskController.getResultHandler();
7124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        mProcessingHandler = taskController.getProcessingHandler();
7224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        mType = taskController.getReservedType();
7324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
7424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
7524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public int getType() {
7624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        return mType;
7724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
7824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
7924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public Context getContext() {
8024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard        return mTaskController.getContext();
8124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    }
8224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard
8324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public abstract Result doInBackground(Request message);
8424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public abstract void onResult(Result message);
8524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard    public void onUpdate(Update message) {}
86db5d060e8077f70d650e1ce56618f953114551e0nicolasroard    public boolean isPriorityTask() { return false; }
87db5d060e8077f70d650e1ce56618f953114551e0nicolasroard    public boolean isDelayedTask() { return false; }
8824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard}
89