/*
* Copyright 2016 Kejun Xia
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.shipdream.lib.android.mvc.controller;
import com.shipdream.lib.android.mvc.Controller;
import com.shipdream.lib.android.mvc.Task;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.slf4j.Logger;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
public class MyController extends Controller {
public interface View {
void onResourceLoaded();
void onResourceFailed(Exception exception);
void onResourceCancelled();
}
public static final long LONG_TASK_DURATION = 100;
public void setLogger(Logger logger) {
this.logger = logger;
}
public Logger getLogger() {
return logger;
}
public View view;
@Override
public Class modelType() {
return null;
}
public Task.Monitor<Void> loadHeavyResourceSuccessfullyWithoutErrorHandlerWithDefaultExecutorService(final Object sender) {
return runTask(new Task() {
@Override
public Void execute(Monitor monitor) throws Exception {
Thread.sleep(LONG_TASK_DURATION);
view.onResourceLoaded();
return null;
}
});
}
public Task.Monitor<Void> loadHeavyResourceSuccessfullyWithoutErrorHandler(final Object sender) {
ExecutorService executorService = mock(ExecutorService.class);
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Callable callable = (Callable) invocation.getArguments()[0];
callable.call();
return null;
}
}).when(executorService).submit(any(Callable.class));
return runTask(executorService, new Task<Void>() {
@Override
public Void execute(Monitor monitor) throws Exception {
Thread.sleep(LONG_TASK_DURATION);
view.onResourceLoaded();
return null;
}
}, null);
}
public Task.Monitor<Void> loadHeavyResourceSuccessfullyWithErrorHandler(final Object sender) {
return runTask(new Task<Void>() {
@Override
public Void execute(Monitor monitor) throws Exception {
Thread.sleep(LONG_TASK_DURATION);
view.onResourceLoaded();
return null;
}
}, new Task.Callback() {
@Override
public void onException(Exception e) {
view.onResourceFailed(e);
}
});
}
public Task.Monitor<Void> loadHeavyResourceWithExceptionButWithoutCustomErrorHandler(final Object sender) {
return runTask(new Task<Void>() {
@Override
public Void execute(Monitor monitor) throws Exception {
Thread.sleep(LONG_TASK_DURATION);
throw new RuntimeException("Something went wrong");
}
});
}
public Task.Monitor<Void> loadHeavyResourceWithException(final Object sender) {
return runTask(new Task() {
@Override
public Void execute(Monitor monitor) throws Exception {
Thread.sleep(LONG_TASK_DURATION);
throw new RuntimeException("Something went wrong");
}
}, new Task.Callback<Void>() {
@Override
public void onException(Exception e) {
view.onResourceFailed(e);
}
});
}
public Task.Monitor<Void> loadHeavyResourceAndCancel(final Object sender) {
Task asyncTask = new Task<Void>() {
@Override
public Void execute(Monitor<Void> monitor) throws Exception {
Thread.sleep(LONG_TASK_DURATION);
if (monitor.getState() != Monitor.State.CANCELED) {
view.onResourceLoaded();
}
return null;
}
};
return runTask(asyncTask,
new Task.Callback() {
@Override
public void onException(Exception e) {
view.onResourceFailed(e);
}
@Override
public void onCancelled(boolean interrupted) {
super.onCancelled(interrupted);
view.onResourceCancelled();
}
});
}
public Task.Monitor<Void> loadHeavyResource(final Object sender, Task task, Task.Callback callback) {
return runTask(task,
callback);
}
}