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.HandlerThread; 2224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport android.os.Message; 2324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport android.util.Log; 2424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 2524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardimport java.util.HashMap; 2624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 2724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroardpublic class ProcessingTaskController implements Handler.Callback { 2824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private static final String LOGTAG = "ProcessingTaskController"; 2924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 3024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private Context mContext; 3124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private HandlerThread mHandlerThread = null; 3224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private Handler mProcessingHandler = null; 3324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private int mCurrentType; 3424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private HashMap<Integer, ProcessingTask> mTasks = new HashMap<Integer, ProcessingTask>(); 3524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 3624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public final static int RESULT = 1; 3724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public final static int UPDATE = 2; 3824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 3924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard private final Handler mResultHandler = new Handler() { 4024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard @Override 4124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public void handleMessage(Message msg) { 4224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard ProcessingTask task = mTasks.get(msg.what); 4324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard if (task != null) { 4424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard if (msg.arg1 == RESULT) { 4524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard task.onResult((ProcessingTask.Result) msg.obj); 4624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } else if (msg.arg1 == UPDATE) { 4724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard task.onUpdate((ProcessingTask.Update) msg.obj); 4824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } else { 4924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard Log.w(LOGTAG, "received unknown message! " + msg.arg1); 5024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 5124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 5224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 5324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard }; 5424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 5524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard @Override 5624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public boolean handleMessage(Message msg) { 5724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard ProcessingTask task = mTasks.get(msg.what); 5824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard if (task != null) { 5924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard task.processRequest((ProcessingTask.Request) msg.obj); 6024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard return true; 6124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 6224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard return false; 6324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 6424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 6524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public ProcessingTaskController(Context context) { 6624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mContext = context; 6724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mHandlerThread = new HandlerThread("ProcessingTaskController", 6824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard android.os.Process.THREAD_PRIORITY_FOREGROUND); 6924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mHandlerThread.start(); 7024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mProcessingHandler = new Handler(mHandlerThread.getLooper(), this); 7124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 7224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 7324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public Handler getProcessingHandler() { 7424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard return mProcessingHandler; 7524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 7624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 7724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public Handler getResultHandler() { 7824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard return mResultHandler; 7924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 8024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 8124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public int getReservedType() { 8224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard return mCurrentType++; 8324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 8424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 8524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public Context getContext() { 8624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard return mContext; 8724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 8824d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 8924d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public void add(ProcessingTask task) { 9024d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard task.added(this); 9124d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mTasks.put(task.getType(), task); 9224d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 9324d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard 9424d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard public void quit() { 9524d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard mHandlerThread.quit(); 9624d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard } 9724d6ec7beb37eb3a5449f1fa49b4adb123391d24nicolasroard} 98