/* * Copyright (C) 2016 Naman Dwivedi * * Licensed under the GNU General Public License v3 * * This is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. */ package com.naman14.algovisualizer.algorithm; import android.app.Activity; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; import com.naman14.algovisualizer.AlgoCompletionListener; import com.naman14.algovisualizer.LogFragment; import java.util.concurrent.atomic.AtomicBoolean; public class Algorithm extends HandlerThread { public static final String KEY_ALGORITHM = "key_algorithm"; public static final String COMMAND_START_ALGORITHM = "start"; public static final String BUBBLE_SORT = "bubble_sort"; public static final String INSERTION_SORT = "insertion_sort"; public static final String SELECTION_SORT = "selection_sort"; public static final String BINARY_SEARCH = "binary_search"; public static final String LINEAR_SEARCH = "linear_search"; public static final String BST_INSERT = "bst_insert"; public static final String BST_SEARCH = "bst_search"; public static final String LINKED_LIST = "linked_list"; public static final String STACK = "stack"; public static final String QUEUE = "queue"; public static final String BFS = "bfs"; public static final String DFS = "dfs"; public static final String DIJKSTRA = "dijkstra"; public static final String BELLMAN_FORD = "bellman_ford"; public LogFragment logFragment; public Activity activity; public AlgoCompletionListener completionListener; private boolean started; private final AtomicBoolean paused = new AtomicBoolean(false); private final Object pauseLock = new Object(); private Handler workerHandler; public Algorithm() { super(""); } public void sleep() { sleepFor(500); } public void sleepFor(long time) { try { sleep(time); if (isPaused()) pauseExecution(); else resumeExecution(); } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); } } public void startExecution() { started = true; } public void setPaused(boolean b) { paused.set(b); if (!b) { synchronized (getPauseLock()) { getPauseLock().notify(); } } } private void pauseExecution() { if (paused.get()) { synchronized (getPauseLock()) { if (paused.get()) { try { getPauseLock().wait(); } catch (InterruptedException ignored) { } } } } } private void resumeExecution() { synchronized (pauseLock) { pauseLock.notifyAll(); } } Object getPauseLock() { return pauseLock; } public boolean isPaused() { return paused.get(); } public boolean isStarted() { return started; } public void setStarted(boolean started) { this.started = started; } public void addLog(final String log) { if (logFragment != null) { activity.runOnUiThread(new Runnable() { @Override public void run() { logFragment.addLog(log); } }); } } public void clearLog() { if (logFragment!=null) { activity.runOnUiThread(new Runnable() { @Override public void run() { logFragment.clearLog(); } }); } } public void logArray(String message, final int[] array) { String arrayString = ""; for (int i : array) { arrayString = arrayString.concat(" " + String.valueOf(i) + " "); } addLog(message + "[ "+arrayString +" ] total items - "+ array.length); } public void setCompletionListener(AlgoCompletionListener completionListener) { this.completionListener = completionListener; } public void prepareHandler(final DataHandler dataHandler) { workerHandler = new Handler(getLooper(), new Handler.Callback() { @Override public boolean handleMessage(Message msg) { if (msg.obj instanceof String) { dataHandler.onMessageReceived((String) msg.obj); } else { dataHandler.onDataRecieved(msg.obj); } return true; } }); } public void sendData(Object data) { workerHandler.obtainMessage(1, data).sendToTarget(); } public void sendMessage(String message) { workerHandler.obtainMessage(1, message).sendToTarget(); } public void completed() { started = false; if (completionListener != null) { activity.runOnUiThread(new Runnable() { @Override public void run() { completionListener.onAlgoCompleted(); } }); } } }