This file was deleted.

This file was deleted.

@@ -0,0 +1,39 @@
package ru.nekit.android.clean_architecture.data.network;

import android.support.annotation.NonNull;

import java.util.List;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import okhttp3.Interceptor;
import ru.nekit.android.clean_architecture.data.network.qualifier.OkHttpInterceptors;
import ru.nekit.android.clean_architecture.data.network.qualifier.OkHttpNetworkInterceptors;

import static java.util.Collections.emptyList;

/**
* Created by ru.nekit.android on 29.03.16.
*/
@Module
public class OkHttpInterceptorsModule {

@Singleton
@Provides
@NonNull
@OkHttpInterceptors
public List<Interceptor> provideOkHttpInterceptors() {
return emptyList();
}

@Singleton
@Provides
@NonNull
@OkHttpNetworkInterceptors
public List<Interceptor> provideOkHttpNetworkInterceptors() {
return emptyList();
}

}
@@ -4,27 +4,39 @@ ext {

// Android config
androidBuildToolsVersion : '23.0.2',
androidMinSdkVersion : 14,
androidMinSdkVersion : 16,
androidTargetSdkVersion : 23,
androidCompileSdkVersion : 23,
androidApplicationId : 'ru.nekit.android.mvpmeeting',
androidApplicationId : 'ru.nekit.android.clean_architecture',
androidVersionCode : 1,
androidVersionName : '1.0',

annotationApi : '22.2.0',

javaxInject : '1',
javaxAnnotationApi : '1.2',

supportLibrary : '23.2.0',
rxJava : '1.1.2',
rxAndroid : '1.1.0',
dagger : '2.1',
retrofit : '2.0.0',

// leak detector
leakCanary : '1.4-beta1',
timber : '4.1.1',

okHttp : '3.2.0',
stetho : '1.3.0',

// develope detector
leakCanary : '1.3.1',


// gradle
androidGradlePlugin : '2.1.0-alpha3',
aptGradlePlugin : '1.8',
retrolambdaGradlePlugin : '3.2.5',
jacocoGradlePlugin : '0.7.6.201602180812',
lombokGradlePlugin : '0.2.3.a2',

// test
junit : '4.12',
@@ -38,7 +50,7 @@ ext {
android : "com.android.tools.build:gradle:$versions.androidGradlePlugin",
apt : "com.neenbedankt.gradle.plugins:android-apt:$versions.aptGradlePlugin",
retrolambda : "me.tatarka:gradle-retrolambda:$versions.retrolambdaGradlePlugin",
//lombok : "me.tatarka.retrolambda.projectlombok:lombok.ast:$versions.lombokGradlePlugin",
lombok : "me.tatarka.retrolambda.projectlombok:lombok.ast:$versions.lombokGradlePlugin",
//paperwork : "hu.supercluster:paperwork-plugin:$versions.paperworkGradlePlugin",
jacoco : "org.jacoco:org.jacoco.core:$versions.jacocoGradlePlugin",
//androidDevMetrics : "com.frogermcs.androiddevmetrics:androiddevmetrics-plugin:$versions.androidDevMetricsGradlePlugin",
@@ -50,15 +62,22 @@ ext {
cardView : "com.android.support:cardview-v7:$versions.supportLibrary",
recyclerView : "com.android.support:recyclerview-v7:$versions.supportLibrary",

annotationApi : "com.android.support:support-annotations:$versions.annotationApi",

rxJava : "io.reactivex:rxjava:$versions.rxJava",
rxAndroid : "io.reactivex:rxandroid:$versions.rxAndroid",

timber : "com.jakewharton.timber:timber:$versions.timber",

retrofit : "com.squareup.retrofit2:retrofit:$versions.retrofit",
retrofitConverterGson : "com.squareup.retrofit2:converter-gson:$versions.retrofit",
retrofitRxJavaAdapter : "com.squareup.retrofit2:adapter-rxjava:$versions.retrofit",

//rxBinding : "com.jakewharton.rxbinding:rxbinding:0.4.0",

javaxInject : "javax.inject:javax.inject:$versions.javaxInject",
javaxAnnotationApi : "javax.annotation:javax.annotation-api:$versions.javaxAnnotationApi",

dagger : "com.google.dagger:dagger:$versions.dagger",
daggerCompiler : "com.google.dagger:dagger-compiler:$versions.dagger",

@@ -79,6 +98,9 @@ ext {
]

debugLibryries = [
leakCanary : "com.squareup.leakcanary:leakcanary-android:$versions.leakCanary",
leakCanaryDebug : "com.squareup.leakcanary:leakcanary-android:$versions.leakCanary",
stetho : "com.facebook.stetho:stetho:$versions.stetho",
stethoOkHttp : "com.facebook.stetho:stetho-okhttp3:$versions.stetho",
okHttpLoggingInterceptor : "com.squareup.okhttp3:logging-interceptor:$versions.okHttp",
]
}
@@ -3,7 +3,10 @@ apply plugin: 'me.tatarka.retrolambda'

dependencies {

//noinspection GroovyAssignabilityCheck
compile libraries.rxJava

//noinspection GroovyAssignabilityCheck
testCompile testLibraries.junit

}
@@ -1,4 +1,4 @@
package ru.nekit.android.mvpmeeting.domain;
package ru.nekit.android.clean_architecture.domain;

/**
* Created by MacOS on 17.03.16.
@@ -1,10 +1,11 @@
package ru.nekit.android.mvpmeeting.domain.interactors;
package ru.nekit.android.clean_architecture.domain.interactors;


import java.util.List;

import ru.nekit.android.mvpmeeting.domain.Repository;
import ru.nekit.android.mvpmeeting.domain.interactors.base.IInteractor;
import ru.nekit.android.mvpmeeting.domain.repository.IGithubRepository;
import ru.nekit.android.clean_architecture.domain.Repository;
import ru.nekit.android.clean_architecture.domain.interactors.base.IInteractor;
import ru.nekit.android.clean_architecture.domain.repository.IGithubRepository;
import rx.Observable;
import rx.Subscription;
import rx.subjects.ReplaySubject;
@@ -14,15 +15,15 @@
*/
public class ObtainRepositoriesInteractor implements IInteractor<List<Repository>, String> {

private IGithubRepository mRepository;
private final IGithubRepository mRepository;
private ReplaySubject<List<Repository>> mDelegateSubject;
private Subscription mDelegateSubscription;

public ObtainRepositoriesInteractor(IGithubRepository repository) {
mRepository = repository;
}

public Observable<List<Repository>> execute(String name) {
public Observable<List<ru.nekit.android.clean_architecture.domain.Repository>> execute(String name) {
if (mDelegateSubscription == null || mDelegateSubscription.isUnsubscribed()) {
mDelegateSubject = ReplaySubject.create();
mDelegateSubscription = mRepository.getRepositories(name).subscribe(mDelegateSubject);
@@ -1,4 +1,4 @@
package ru.nekit.android.mvpmeeting.domain.interactors.base;
package ru.nekit.android.clean_architecture.domain.interactors.base;

import rx.Observable;

@@ -1,8 +1,8 @@
package ru.nekit.android.mvpmeeting.domain.repository;
package ru.nekit.android.clean_architecture.domain.repository;

import java.util.List;

import ru.nekit.android.mvpmeeting.domain.Repository;
import ru.nekit.android.clean_architecture.domain.Repository;
import rx.Observable;

/**
@@ -18,6 +18,14 @@ android {
buildConfigField "String", "API_URL", '"https://api.github.com/"'
}
buildTypes {
debug {
applicationIdSuffix '.debug'

// Enables code coverage with Jacoco only for instrumentation tests.
// Coverage for JVM tests done by jacoco.gradle.
testCoverageEnabled true
}

release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
@@ -28,8 +36,43 @@ android {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

//TODO: explore lint
lintOptions {
textReport true
textOutput 'stdout'
fatal 'UnusedResources'

warningsAsErrors true
abortOnError true // Fail early.

disable 'GoogleAppIndexingWarning' // App does not have deep linking.
//disable 'InvalidPackage' // Okio references java.nio that does not presented in Android SDK.
}

packagingOptions {
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/services/javax.annotation.processing.Processor'
}

/*productFlavors {
internal {
applicationId 'ru.nekit.android.clean_architecture.internal'
}
production {
applicationId 'ru.nekit.android.clean_architecture'
}
}*/
}

configurations.all {
resolutionStrategy {
force 'com.android.support:support-annotations:23.1.1'
}
}
dependencies {

compile project(':domain')
@@ -43,14 +86,13 @@ dependencies {
compile libraries.rxJava
compile libraries.rxAndroid
//compile libraries.rxBinding

compile libraries.butterknife

apt libraries.daggerCompiler
compile libraries.dagger

testCompile testLibraries.junit

compile debugLibryries.leakCanary
debugCompile debugLibryries.leakCanaryDebug

}
@@ -1,4 +1,4 @@
package ru.nekit.android.mvpmeeting;
package ru.nekit.android.clean_architecture;

import android.app.Application;
import android.test.ApplicationTestCase;
@@ -1,10 +1,24 @@
package ru.nekit.android.clean_architecture.presentation.developer_settings;

import android.app.Application;
import android.support.annotation.NonNull;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;

/**
* Created by ru.nekit.android on 29.03.16.
*/
@Module
public class DeveloperSettingsModule {

@Provides
@Singleton
@NonNull
public ILeakCanaryProxy provideILeakCanaryProxy(@NonNull Application application) {
return new LeakCanaryProxy(application);
}

}
@@ -0,0 +1,35 @@
package ru.nekit.android.clean_architecture.presentation.developer_settings;

import android.app.Application;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import com.squareup.leakcanary.LeakCanary;
import com.squareup.leakcanary.RefWatcher;

/**
* Created by ru.nekit.android on 29.03.16.
*/
public class LeakCanaryProxy implements ILeakCanaryProxy {

@NonNull
private final Application application;
@Nullable
private RefWatcher watcher;

public LeakCanaryProxy(@NonNull Application application) {
this.application = application;
}

@Override
public void init() {
watcher = LeakCanary.install(application);
}

@Override
public void watch(@NonNull Object object) {
if (watcher != null) {
watcher.watch(object);
}
}
}
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ru.nekit.android.mvpmeeting">
package="ru.nekit.android.clean_architecture">

<uses-permission android:name="android.permission.INTERNET" />

<application
android:name=".presentation.GithubApp"
android:name="ru.nekit.android.clean_architecture.presentation.GithubApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".presentation.view.activities.RepositoryListActivity"
android:name="ru.nekit.android.clean_architecture.presentation.view.activities.RepositoryListActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
@@ -0,0 +1,47 @@
package ru.nekit.android.clean_architecture.presentation;

import android.app.Application;
import android.content.Context;
import android.support.annotation.NonNull;

import ru.nekit.android.clean_architecture.BuildConfig;
import ru.nekit.android.clean_architecture.presentation.internal.di.ApplicationComponent;
import ru.nekit.android.clean_architecture.presentation.internal.di.DaggerApplicationComponent;
import ru.nekit.android.clean_architecture.presentation.internal.di.modules.ApplicationModule;
import timber.log.Timber;

/**
* Created by ru.nekit.android on 08.03.16.
*/
public class GithubApp extends Application {

@NonNull
private ApplicationComponent applicationComponent;

@NonNull
public static GithubApp get(@NonNull Context context) {
return (GithubApp) context.getApplicationContext();
}

@NonNull
public ApplicationComponent getApplicationComponent() {
return applicationComponent;
}

public void onCreate() {
super.onCreate();

applicationComponent = prepareApplicationComponent().build();
applicationComponent.inject(this);

if (BuildConfig.DEBUG) {
Timber.plant(new Timber.DebugTree());
}
}

private DaggerApplicationComponent.Builder prepareApplicationComponent() {
return DaggerApplicationComponent.builder().applicationModule(new ApplicationModule(this));
}


}
@@ -0,0 +1,13 @@
package ru.nekit.android.clean_architecture.presentation.developer_settings;

import android.support.annotation.NonNull;

/**
* Created by ru.nekit.android on 29.03.16.
*/
public interface ILeakCanaryProxy {

void init();

void watch(@NonNull Object object);
}
@@ -0,0 +1,43 @@
package ru.nekit.android.clean_architecture.presentation.internal.di;

import android.support.annotation.NonNull;

import javax.inject.Singleton;

import dagger.Component;
import ru.nekit.android.clean_architecture.data.api.ApiModule;
import ru.nekit.android.clean_architecture.data.network.NetworkModule;
import ru.nekit.android.clean_architecture.data.network.OkHttpInterceptorsModule;
import ru.nekit.android.clean_architecture.presentation.GithubApp;
import ru.nekit.android.clean_architecture.presentation.developer_settings.DeveloperSettingsModule;
import ru.nekit.android.clean_architecture.presentation.developer_settings.ILeakCanaryProxy;
import ru.nekit.android.clean_architecture.presentation.internal.di.modules.ApplicationModule;
import ru.nekit.android.clean_architecture.presentation.internal.di.modules.DataModule;
import ru.nekit.android.clean_architecture.presentation.internal.di.modules.DomainModule;
import ru.nekit.android.clean_architecture.presentation.internal.di.modules.PresentationModule;
import ru.nekit.android.clean_architecture.presentation.view.fragments.RepositoryListFragment;

/**
* Created by ru.nekit.android on 08.03.16.
*/
@Singleton
@Component(modules = {
ApplicationModule.class,
PresentationModule.class,
DomainModule.class,
DataModule.class,
ApiModule.class,
NetworkModule.class,
OkHttpInterceptorsModule.class,
DeveloperSettingsModule.class
})
public interface ApplicationComponent {

void inject(@NonNull RepositoryListFragment value);

void inject(@NonNull GithubApp value);

@NonNull
ILeakCanaryProxy leakCanaryProxy();

}
@@ -0,0 +1,31 @@
package ru.nekit.android.clean_architecture.presentation.internal.di.modules;

import android.app.Application;
import android.support.annotation.NonNull;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;

/**
* Created by ru.nekit.android on 29.03.16.
*/
@Module
public class ApplicationModule {

@NonNull
private final Application application;

public ApplicationModule(@NonNull Application application) {
this.application = application;
}

@Provides
@NonNull
@Singleton
public Application provideApplication() {
return application;
}

}
@@ -1,15 +1,17 @@
package ru.nekit.android.mvpmeeting.presentation.internal.di.modules;
package ru.nekit.android.clean_architecture.presentation.internal.di.modules;

import android.support.annotation.NonNull;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import ru.nekit.android.mvpmeeting.BuildConfig;
import ru.nekit.android.mvpmeeting.domain.repository.IGithubRepository;
import ru.nekit.android.mvpmeeting.model.internal.di.qualifier.Endpoint;
import ru.nekit.android.mvpmeeting.model.internal.di.qualifier.IOThread;
import ru.nekit.android.mvpmeeting.model.internal.di.qualifier.UIThread;
import ru.nekit.android.mvpmeeting.model.repository.GithubRepository;
import ru.nekit.android.clean_architecture.BuildConfig;
import ru.nekit.android.clean_architecture.data.api.qualifier.Endpoint;
import ru.nekit.android.clean_architecture.data.api.qualifier.LongOperationThread;
import ru.nekit.android.clean_architecture.data.api.qualifier.MainThread;
import ru.nekit.android.clean_architecture.data.repository.GithubRepository;
import ru.nekit.android.clean_architecture.domain.repository.IGithubRepository;
import rx.Scheduler;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
@@ -19,31 +21,35 @@
*/

@Module
public class ModelModule {
public class DataModule {

@Provides
@Singleton
@IOThread
@LongOperationThread
@NonNull
Scheduler provideLongOperationScheduler() {
return Schedulers.io();
}

@Provides
@Singleton
@UIThread
@MainThread
@NonNull
Scheduler provideUIThreadScheduler() {
return AndroidSchedulers.mainThread();
}

@Provides
@Singleton
@NonNull
IGithubRepository provideGithubRepository(GithubRepository repository) {
return repository;
}

@Provides
@Singleton
@Endpoint
@NonNull
String provideEndpoint() {
return BuildConfig.API_URL;
}
@@ -1,11 +1,11 @@
package ru.nekit.android.mvpmeeting.presentation.internal.di.modules;
package ru.nekit.android.clean_architecture.presentation.internal.di.modules;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import ru.nekit.android.mvpmeeting.domain.interactors.ObtainRepositoriesInteractor;
import ru.nekit.android.mvpmeeting.domain.repository.IGithubRepository;
import ru.nekit.android.clean_architecture.domain.interactors.ObtainRepositoriesInteractor;
import ru.nekit.android.clean_architecture.domain.repository.IGithubRepository;

/**
* Created by ru.nekit.android on 08.03.16.
@@ -0,0 +1,31 @@
package ru.nekit.android.clean_architecture.presentation.internal.di.modules;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import ru.nekit.android.clean_architecture.presentation.model.GithubModel;
import ru.nekit.android.clean_architecture.presentation.model.IGithubModel;
import ru.nekit.android.clean_architecture.presentation.presenter.RepositoryListPresenter;
import ru.nekit.android.clean_architecture.presentation.presenter.mapper.RepositoryToModelMapper;

/**
* Created by ru.nekit.android on 08.03.16.
*/

@Module
public class PresentationModule {

@Singleton
@Provides
public RepositoryListPresenter provideRepositoryListPresenter(IGithubModel model, ru.nekit.android.clean_architecture.domain.interactors.ObtainRepositoriesInteractor interactor, RepositoryToModelMapper mapper) {
return new RepositoryListPresenter(model, interactor, mapper);
}

@Singleton
@Provides
public IGithubModel provideIGithubModel() {
return new GithubModel();
}

}
@@ -1,13 +1,13 @@
package ru.nekit.android.mvpmeeting.presentation.model;
package ru.nekit.android.clean_architecture.presentation.model;

import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;

import java.util.List;

import ru.nekit.android.mvpmeeting.presentation.model.vo.RepositoryVO;
import ru.nekit.android.mvpmeeting.presentation.presenter.viewState.LCEViewState;
import ru.nekit.android.clean_architecture.presentation.model.vo.RepositoryVO;
import ru.nekit.android.clean_architecture.presentation.presenter.viewState.LCEViewState;

/**
* Created by ru.nekit.android on 02.03.16.
@@ -84,12 +84,12 @@ public void writeToParcel(Parcel dest, int flags) {
}

@Override
public void setUserName(String userName) {
mUserName = userName;
public String getUserName() {
return mUserName;
}

@Override
public String getUserName() {
return mUserName;
public void setUserName(String userName) {
mUserName = userName;
}
}
@@ -1,14 +1,14 @@
package ru.nekit.android.mvpmeeting.presentation.model;
package ru.nekit.android.clean_architecture.presentation.model;

import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;

import java.util.List;

import ru.nekit.android.mvpmeeting.presentation.model.base.IModel;
import ru.nekit.android.mvpmeeting.presentation.model.vo.RepositoryVO;
import ru.nekit.android.mvpmeeting.presentation.presenter.viewState.LCEViewState;
import ru.nekit.android.clean_architecture.presentation.model.base.IModel;
import ru.nekit.android.clean_architecture.presentation.model.vo.RepositoryVO;
import ru.nekit.android.clean_architecture.presentation.presenter.viewState.LCEViewState;

/**
* Created by ru.nekit.android on 08.03.16.
@@ -34,6 +34,7 @@ public interface IGithubModel extends IModel, Parcelable {
@Override
void writeToParcel(Parcel dest, int flags);

void setUserName(String userName);
String getUserName();

void setUserName(String userName);
}
@@ -1,4 +1,4 @@
package ru.nekit.android.mvpmeeting.presentation.model.base;
package ru.nekit.android.clean_architecture.presentation.model.base;

/**
* Created by ru.nekit.android on 02.03.16.
@@ -1,4 +1,4 @@
package ru.nekit.android.mvpmeeting.presentation.model.vo;
package ru.nekit.android.clean_architecture.presentation.model.vo;

import android.os.Parcel;
import android.os.Parcelable;
@@ -1,25 +1,20 @@
package ru.nekit.android.mvpmeeting.presentation.presenter;
package ru.nekit.android.clean_architecture.presentation.presenter;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.TextUtils;

import java.util.List;

import ru.nekit.android.mvpmeeting.domain.interactors.ObtainRepositoriesInteractor;
import ru.nekit.android.mvpmeeting.model.utils.rx.RxTransformers;
import ru.nekit.android.mvpmeeting.presentation.model.IGithubModel;
import ru.nekit.android.mvpmeeting.presentation.model.vo.RepositoryVO;
import ru.nekit.android.mvpmeeting.presentation.presenter.base.MVPBasePresenter;
import ru.nekit.android.mvpmeeting.presentation.presenter.mapper.RepositoryToModelMapper;
import ru.nekit.android.mvpmeeting.presentation.presenter.viewState.IStateable;
import ru.nekit.android.mvpmeeting.presentation.presenter.viewState.LCEViewState;
import ru.nekit.android.mvpmeeting.presentation.view.fragments.IRepositoryListView;

import static ru.nekit.android.mvpmeeting.presentation.presenter.viewState.LCEViewState.CONTENT;
import static ru.nekit.android.mvpmeeting.presentation.presenter.viewState.LCEViewState.EMPTY;
import static ru.nekit.android.mvpmeeting.presentation.presenter.viewState.LCEViewState.ERROR;
import static ru.nekit.android.mvpmeeting.presentation.presenter.viewState.LCEViewState.LOADING;
import ru.nekit.android.clean_architecture.data.utils.rx.RxTransformers;
import ru.nekit.android.clean_architecture.domain.interactors.ObtainRepositoriesInteractor;
import ru.nekit.android.clean_architecture.presentation.model.IGithubModel;
import ru.nekit.android.clean_architecture.presentation.model.vo.RepositoryVO;
import ru.nekit.android.clean_architecture.presentation.presenter.base.MVPBasePresenter;
import ru.nekit.android.clean_architecture.presentation.presenter.mapper.RepositoryToModelMapper;
import ru.nekit.android.clean_architecture.presentation.presenter.viewState.IStateable;
import ru.nekit.android.clean_architecture.presentation.presenter.viewState.LCEViewState;
import ru.nekit.android.clean_architecture.presentation.view.fragments.IRepositoryListView;

/**
* Created by ru.nekit.android on 02.03.16.
@@ -28,17 +23,17 @@ public class RepositoryListPresenter extends MVPBasePresenter<IRepositoryListVie

private static final String BUNDLE_REPOSITORY_VIEW_MODEL_KEY = "bundle_repository_view_model_key";

private ObtainRepositoriesInteractor mInteractor;
private RepositoryToModelMapper mMapper;
private final ObtainRepositoriesInteractor mInteractor;
private final RepositoryToModelMapper mMapper;

public RepositoryListPresenter(IGithubModel model, ObtainRepositoriesInteractor interactor, RepositoryToModelMapper mapper) {
public RepositoryListPresenter(IGithubModel model, ru.nekit.android.clean_architecture.domain.interactors.ObtainRepositoriesInteractor interactor, RepositoryToModelMapper mapper) {
super(model);
mInteractor = interactor;
mMapper = mapper;
}

private void onBeforeLoad() {
setState(LOADING);
setState(LCEViewState.LOADING);
}

private void onAfterLoad() {
@@ -47,12 +42,12 @@ private void onAfterLoad() {

private void onResult(List<RepositoryVO> result) {
getModel().setRepositoriesList(result);
setState(CONTENT);
setState(LCEViewState.CONTENT);
}

private void onError(Throwable error) {
getModel().setError(error);
setState(ERROR);
setState(LCEViewState.ERROR);
}

private void setState(LCEViewState state) {
@@ -84,7 +79,7 @@ public void onCreate(@Nullable Bundle savedState) {
model = savedState.getParcelable(BUNDLE_REPOSITORY_VIEW_MODEL_KEY);
}
applyState();
if (getModel().getViewState() == LOADING) {
if (getModel().getViewState() == LCEViewState.LOADING) {
performLoad();
}
}
@@ -95,9 +90,9 @@ public void applyState() {
IRepositoryListView view = getView();
IGithubModel model = getModel();
LCEViewState state = model.getViewState();
if (state == CONTENT) {
if (state == LCEViewState.CONTENT) {
if (model.getRepositoriesList().isEmpty()) {
state = EMPTY;
state = LCEViewState.EMPTY;
}
}
switch (state) {
@@ -124,6 +119,7 @@ public void applyState() {

case ERROR:

view.hideLoading();
view.showEmptyList();
view.showError(model.getError());

@@ -1,10 +1,10 @@
package ru.nekit.android.mvpmeeting.presentation.presenter.base;
package ru.nekit.android.clean_architecture.presentation.presenter.base;

import android.os.Bundle;
import android.support.annotation.NonNull;

import ru.nekit.android.mvpmeeting.presentation.model.base.IModel;
import ru.nekit.android.mvpmeeting.presentation.view.base.IMVPView;
import ru.nekit.android.clean_architecture.presentation.model.base.IModel;
import ru.nekit.android.clean_architecture.presentation.view.base.IMVPView;

/**
* Created by ru.nekit.android on 06.03.16.
@@ -1,11 +1,11 @@
package ru.nekit.android.mvpmeeting.presentation.presenter.base;
package ru.nekit.android.clean_architecture.presentation.presenter.base;

import android.support.annotation.NonNull;

import java.lang.ref.WeakReference;

import ru.nekit.android.mvpmeeting.presentation.model.base.IModel;
import ru.nekit.android.mvpmeeting.presentation.view.base.IMVPView;
import ru.nekit.android.clean_architecture.presentation.model.base.IModel;
import ru.nekit.android.clean_architecture.presentation.view.base.IMVPView;
import rx.Subscription;
import rx.subscriptions.CompositeSubscription;

@@ -50,7 +50,7 @@ public void detachView() {
}

@Override
public boolean isAttached() {
public boolean isViewAttached() {
return mViewRef != null && mViewRef.get() != null;
}

@@ -1,11 +1,11 @@
package ru.nekit.android.mvpmeeting.presentation.presenter.mapper;
package ru.nekit.android.clean_architecture.presentation.presenter.mapper;

import javax.inject.Inject;
import javax.inject.Singleton;

import ru.nekit.android.mvpmeeting.domain.Repository;
import ru.nekit.android.mvpmeeting.model.mapper.base.BaseMapper;
import ru.nekit.android.mvpmeeting.presentation.model.vo.RepositoryVO;
import ru.nekit.android.clean_architecture.data.mapper.base.BaseMapper;
import ru.nekit.android.clean_architecture.domain.Repository;
import ru.nekit.android.clean_architecture.presentation.model.vo.RepositoryVO;

/**
* Created by ru.nekit.android on 04.03.16.
@@ -1,4 +1,4 @@
package ru.nekit.android.mvpmeeting.presentation.presenter.viewState;
package ru.nekit.android.clean_architecture.presentation.presenter.viewState;

/**
* Created by MacOS on 18.03.16.
@@ -1,4 +1,4 @@
package ru.nekit.android.mvpmeeting.presentation.presenter.viewState;
package ru.nekit.android.clean_architecture.presentation.presenter.viewState;

/**
* Created by ru.nekit.android on 06.03.16.
@@ -0,0 +1,7 @@
package ru.nekit.android.clean_architecture.presentation.presenter.viewState;

/**
* Created by MacOS on 18.03.16.
*/
interface ViewState {
}
@@ -1,6 +1,7 @@
package ru.nekit.android.mvpmeeting.presentation.view.activities;
package ru.nekit.android.clean_architecture.presentation.view.activities;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
@@ -9,16 +10,18 @@

import butterknife.Bind;
import butterknife.ButterKnife;
import ru.nekit.android.mvpmeeting.R;
import ru.nekit.android.mvpmeeting.presentation.model.vo.RepositoryVO;
import ru.nekit.android.mvpmeeting.presentation.view.fragments.RepositoryListFragment;
import ru.nekit.android.clean_architecture.R;
import ru.nekit.android.clean_architecture.presentation.model.vo.RepositoryVO;
import ru.nekit.android.clean_architecture.presentation.view.fragments.RepositoryListFragment;

public class RepositoryListActivity extends AppCompatActivity implements RepositoryListFragment.ActivityCallback {

private static final String TAG = "fragmentTag";

@Nullable
@Bind(R.id.toolbar)
Toolbar toolbar;

private FragmentManager fragmentManager;

@Override
@@ -1,4 +1,4 @@
package ru.nekit.android.mvpmeeting.presentation.view.adapters;
package ru.nekit.android.clean_architecture.presentation.view.adapters;

import android.view.LayoutInflater;
import android.view.View;
@@ -8,10 +8,10 @@
import java.lang.ref.WeakReference;
import java.util.List;

import ru.nekit.android.mvpmeeting.R;
import ru.nekit.android.mvpmeeting.presentation.model.vo.RepositoryVO;
import ru.nekit.android.mvpmeeting.presentation.presenter.RepositoryListPresenter;
import ru.nekit.android.mvpmeeting.presentation.view.adapters.base.BaseAdapter;
import ru.nekit.android.clean_architecture.R;
import ru.nekit.android.clean_architecture.presentation.model.vo.RepositoryVO;
import ru.nekit.android.clean_architecture.presentation.presenter.RepositoryListPresenter;
import ru.nekit.android.clean_architecture.presentation.view.adapters.base.BaseAdapter;

public class RepositoryListAdapter extends BaseAdapter<RepositoryVO, RepositoryListAdapter.ViewHolder> {

@@ -1,9 +1,7 @@
package ru.nekit.android.mvpmeeting.presentation.view.adapters.base;
package ru.nekit.android.clean_architecture.presentation.view.adapters.base;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

@@ -1,6 +1,6 @@
package ru.nekit.android.mvpmeeting.presentation.view.base;
package ru.nekit.android.clean_architecture.presentation.view.base;

import ru.nekit.android.mvpmeeting.presentation.model.base.IModel;
import ru.nekit.android.clean_architecture.presentation.model.base.IModel;

/**
* Created by ru.nekit.android on 06.03.16.
@@ -1,4 +1,4 @@
package ru.nekit.android.mvpmeeting.presentation.view.base;
package ru.nekit.android.clean_architecture.presentation.view.base;

/**
* Created by MacOS on 02.03.16.
@@ -0,0 +1,18 @@
package ru.nekit.android.clean_architecture.presentation.view.fragments;

import ru.nekit.android.clean_architecture.presentation.model.IGithubModel;
import ru.nekit.android.clean_architecture.presentation.model.vo.RepositoryVO;
import ru.nekit.android.clean_architecture.presentation.view.base.ILCEView;

/**
* Created by ru.nekit.android on 05.03.16.
*/
public interface IRepositoryListView extends ILCEView<IGithubModel, Throwable> {

String getUserName();

void showEmptyList();

void showRepository(RepositoryVO repository);
}

@@ -1,4 +1,4 @@
package ru.nekit.android.mvpmeeting.presentation.view.fragments;
package ru.nekit.android.clean_architecture.presentation.view.fragments;

import android.content.Context;
import android.os.Bundle;
@@ -18,13 +18,13 @@
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import ru.nekit.android.mvpmeeting.R;
import ru.nekit.android.mvpmeeting.presentation.GithubApp;
import ru.nekit.android.mvpmeeting.presentation.model.IGithubModel;
import ru.nekit.android.mvpmeeting.presentation.model.vo.RepositoryVO;
import ru.nekit.android.mvpmeeting.presentation.presenter.RepositoryListPresenter;
import ru.nekit.android.mvpmeeting.presentation.view.adapters.RepositoryListAdapter;
import ru.nekit.android.mvpmeeting.presentation.view.fragments.base.MVPBaseFragment;
import ru.nekit.android.clean_architecture.R;
import ru.nekit.android.clean_architecture.presentation.GithubApp;
import ru.nekit.android.clean_architecture.presentation.model.IGithubModel;
import ru.nekit.android.clean_architecture.presentation.model.vo.RepositoryVO;
import ru.nekit.android.clean_architecture.presentation.presenter.RepositoryListPresenter;
import ru.nekit.android.clean_architecture.presentation.view.adapters.RepositoryListAdapter;
import ru.nekit.android.clean_architecture.presentation.view.fragments.base.MVPBaseFragment;

public class RepositoryListFragment extends MVPBaseFragment<RepositoryListPresenter> implements IRepositoryListView {

@@ -54,15 +54,15 @@ public static RepositoryListFragment newInstance() {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GithubApp.getApplicationComponent().inject(this);
GithubApp.get(getContext()).getApplicationComponent().inject(this);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_repository_list, container, false);
View view = inflater.inflate(ru.nekit.android.clean_architecture.R.layout.fragment_repository_list, container, false);
ButterKnife.bind(this, view);

LinearLayoutManager llm = new LinearLayoutManager(getActivity().getApplicationContext());
@@ -71,12 +71,12 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
mAdapter = new RepositoryListAdapter(getPresenter());
recyclerView.setAdapter(mAdapter);

messageView.setText(getString(R.string.result_is_empty));
messageView.setText(getString(ru.nekit.android.clean_architecture.R.string.result_is_empty));

return view;
}

@OnClick(R.id.obtain_repositories_button)
@OnClick(ru.nekit.android.clean_architecture.R.id.obtain_repositories_button)
protected void onObtainClick() {
mPresenter.onSearchClick();
}
@@ -154,7 +154,7 @@ public void showError(Throwable e) {
@Override
public void onDestroy() {
super.onDestroy();
GithubApp.getRefWatcher().watch(this);
GithubApp.get(getContext()).getApplicationComponent().leakCanaryProxy().watch(this);
}

@Override
@@ -164,12 +164,12 @@ public void onDestroyView() {
ButterKnife.unbind(this);
}

public interface ActivityCallback {
void showRepositoryInfoFragment(RepositoryVO repository);
}

private void hideSoftKeyboard() {
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(userNameInput.getWindowToken(), 0);
}

public interface ActivityCallback {
void showRepositoryInfoFragment(RepositoryVO repository);
}
}
@@ -1,15 +1,13 @@
package ru.nekit.android.mvpmeeting.presentation.view.fragments.base;
package ru.nekit.android.clean_architecture.presentation.view.fragments.base;

import android.os.Bundle;
import android.support.annotation.CallSuper;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import ru.nekit.android.mvpmeeting.presentation.presenter.base.IMVPPresenter;
import ru.nekit.android.mvpmeeting.presentation.view.base.IMVPView;
import ru.nekit.android.clean_architecture.presentation.presenter.base.IMVPPresenter;
import ru.nekit.android.clean_architecture.presentation.view.base.IMVPView;

/**
* Created by ru.nekit.android on 05.03.16.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Deleted file not rendered
@@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".presentation.view.activities.RepositoryListActivity">
tools:context="ru.nekit.android.clean_architecture.presentation.view.activities.RepositoryListActivity">

<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
@@ -5,15 +5,16 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".presentation.view.fragments.RepositoryListFragment"
tools:context="ru.nekit.android.clean_architecture.presentation.view.fragments.RepositoryListFragment"
tools:showIn="@layout/activity_main">

<ImageView
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:src="@drawable/octocat" />
android:src="@drawable/octocat"
tools:ignore="ContentDescription" />

<RelativeLayout
android:layout_width="match_parent"
@@ -63,7 +64,8 @@
android:layout_marginLeft="5dp"
android:layout_marginStart="5dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_search_white_36dp" />
android:src="@drawable/ic_search_white_36dp"
tools:ignore="ContentDescription" />

<EditText
android:id="@+id/user_name_input"
@@ -12,7 +12,6 @@
card_view:cardCornerRadius="2dp">

<LinearLayout
android:id="@+id/layout_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground"
@@ -38,8 +37,8 @@
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:paddingTop="10dp"
android:textSize="14sp"
android:textColor="@color/secondary_text"
android:textSize="14sp"
tools:text="This is where the repository description will go" />

<View
@@ -2,5 +2,4 @@
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
(such as screen margins) for screens with more than 820dp of available width. This
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
<dimen name="activity_horizontal_margin">64dp</dimen>
</resources>
@@ -6,6 +6,5 @@
<color name="white">#ffffff</color>
<color name="white_transparent">#75ffffff</color>
<color name="secondary_text">#727272</color>
<color name="icons">#FFFFFF</color>
<color name="divider">#cbcbcb</color>
</resources>
@@ -1,10 +1,6 @@
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="horizontal_margin">12dp</dimen>
<dimen name="vertical_margin">12dp</dimen>
<dimen name="horizontal_margin_half">6dp</dimen>
<dimen name="vertical_margin_half">6dp</dimen>
<dimen name="text_size">25sp</dimen>
</resources>
@@ -0,0 +1,22 @@
package ru.nekit.android.clean_architecture.presentation.developer_settings;

import android.support.annotation.NonNull;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;

/**
* Created by ru.nekit.android on 29.03.16.
*/
@Module
public class DeveloperSettingsModule {

@Singleton
@NonNull
@Provides
public ILeakCanaryProxy provideILeakCanaryProxy() {
return new LeakCanaryProxy();
}
}
@@ -0,0 +1,18 @@
package ru.nekit.android.clean_architecture.presentation.developer_settings;

import android.support.annotation.NonNull;

/**
* Created by ru.nekit.android on 29.03.16.
*/
public class LeakCanaryProxy implements ILeakCanaryProxy {
@Override
public void init() {
//no-op
}

@Override
public void watch(@NonNull Object object) {
//no-op
}
}
@@ -1,4 +1,4 @@
package ru.nekit.android.mvpmeeting;
package ru.nekit.android.clean_architecture;

import org.junit.Test;