26
Saul Diaz @sefford [email protected] IN KOR WE TRUST

In kor we Trust

Embed Size (px)

Citation preview

Saul Diaz

@sefford

[email protected]

IN KOR WE TRUST

The Basics of the Experiment

Learn, learn, learn!

Get rid of non-UI logic on UI

Avoid memory leaking

Centralized cache & readiness

The Domain

/** Created by sefford on 9/06/13. */

public abstract class MovieitBaseRequest<T> extends Request<T> {

public MovieitBaseRequest(int method, String url, HashMap<String, String> parameters, BusManager bus, boolean hasToCache) { /* … */ }

public MovieitBaseRequest(int method, String url, BusManager bus, boolean hasToCache){ /* … */ }

private static String generateParametersString(HashMap<String, String> parameters) { /* … */ }

private static Map<String, String> initializeHeaders() { /* … */ }

@Override public Map<String, String> getHeaders() throws AuthFailureError { /* … */ }

@Override protected Response<T> parseNetworkResponse(NetworkResponse response) { return processResponse(response.getBody()); }

@Override protected void deliverResponse(T response) { bus.post(response); }

@Override public void deliverError(VolleyError error) { bus.post(error); }

public T processResponse(String json) {

T content = processJSon(json);

content = postProcess(content);

if (hasToCache) {

saveToCache(content);

}

return content;

}

protected abstract T processJSon(String json);

protected T postProcess(T content) { /* … */ }

protected abstract void saveToCache(T object);

}

Retrieval

Postprocess

Save to cache

Notify

Fetch the data (network, disk, system...)

Chance to operate through the data (sort, filter, sync…)

Persist the data on cache (d’oh)

Notify sucessful or failure completion

Provider

Strategy

Cache

Request

Driver

Bus

Domain

Presentation

Data

Executor

Interactor

Repository

Delegate

Driver

Bus

Domain

Presentation

Data

public abstract class Interactor<R extends ResponseInterface, E extends ErrorInterface> implements Runnable, InteractorNotification<R, E> {

// Postable interface allows us to hide callbacks, but we use a bus

protected Interactor(Postable postable, Loggable log, InteractorIdentification delegate) {

this.postable = postable;

this.log = log;

this.delegate = delegate;

}

@Override

public void notifySuccess(R content) {

postable.post(content);

}

}

public class StandardNetworkInteractor<R extends ResponseInterface, E extends ErrorInterface> extends NetworkInteractor<R, E> {

// NetworkInteractor defines the way to notify an error@Overridepublic void run() {

try {final R content = ((NetworkDelegate<R, E>) delegate).retrieveNetworkResponse();final R processedContent = ((NetworkDelegate<R, E>) delegate).postProcess(content);

((NetworkDelegate<R, E>) delegate).saveToCache(processedContent);notifySuccess(processedContent);

} catch (Exception x) { // Pokemon exception, but the delegate handles the correct responsenotifyError(((NetworkDelegate<R, E>) delegate).composeErrorResponse(x));

}}

}

public interface NetworkDelegate<R extends ResponseInterface, E extends ErrorInterface> extends InteractorIdentification {

R retrieveNetworkResponse() throws Exception;

R postProcess(R content);

void saveToCache(R object);

E composeErrorResponse(Exception error);}

“All Aperture technologies remain operational up to 4.000ºK.”

The Data

Repository<K , V>

BaseRepo<K , V>

ImplementsCurrent Repo Level Next Repo Level

Chain of Responsibility

+

Decorator

CRUD Interface

Hierarchial multi-level Repositories (BaseRepository)

Java Map Repositories

Android LRU Repositories (Android)

DiskLRUCache Repositories

Realm Repositories (Android)

ADA Framework Repositories

“All Aperture technologies remain operational up to 4.000ºK.”

The Presentation

Layout files

Application

Activities

Fragments

Views

Int1 Int2Int

NInt3 ...

Bus

RepositoriesModel &

Data

Presentation

Android UI Lifecycle

Facade

Presenter Presenter

Outside our happy world

Cushioning & Coordination

Handles view state

Fragment

HoloFacade LollipopFacadeHoloTabletsFacade

FragmentFacadeInterface

HoloPresenter1 HoloPresenter2 TabPresenterLolliPresenter

1

LolliPresenter

2

HoloPresenter 1 & LolliPresenter 1 implement PresenterInterface1, same with 2

HoloTabletsFacade likely to be composed of a HoloFacade

MainActivity

Flow

Control

Intent

Dispatching

Routing

Push

Services

AnalyticsNFC

ActionBar

Control

Menu

Control

StatusBar

Control

Session

MgmtLogging ...

Final thoughts

Independent of Frameworks

Testable

Independent of UI

Independent of Database

Independent of Outside World

Q & A ?

Repo: http://github.com/Sefford/kor

Gradle: compile 'com.sefford:kor-common:2.0'

compile 'com.sefford:kor-retrofit:1.1'

compile 'com.sefford:kor-android:1.0.2@aar'

Sample (WIP, Untested, Undocumented >_<U): https://github.com/Sefford/Kor-Sample

Forks & PRs are welcome <3

Thanks for playing!