Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .idea/.name

This file was deleted.

6 changes: 0 additions & 6 deletions .idea/encodings.xml

This file was deleted.

10 changes: 2 additions & 8 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions app/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
/build
.idea/*
76 changes: 51 additions & 25 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,21 @@ apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'me.tatarka.retrolambda'

def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
// signingConfigs {
// Yappl {
// keyAlias keystoreProperties['keyAlias']
// keyPassword keystoreProperties['keyPassword']
// storeFile file(keystoreProperties['storeFile'])
// storePassword keystoreProperties['storePassword']
// }
// }
compileSdkVersion 23
buildToolsVersion "23.0.2"

buildToolsVersion "23.0.3"
defaultConfig {
applicationId "ru.aleien.yapplication"
minSdkVersion 15
Expand All @@ -15,7 +26,7 @@ android {
}
buildTypes {
release {
minifyEnabled false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

Expand All @@ -24,48 +35,63 @@ android {
}
}

sourceSets {
androidTest {
setRoot('src/test')
}
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

dependencies {
ext.supportVersion = '23.3.0'
compile fileTree(dir: 'libs', include: ['*.jar'])
compile "com.android.support:support-v4:$supportVersion"
compile "com.android.support:appcompat-v7:$supportVersion"
compile "com.android.support:design:$supportVersion"
ext.supportVersion = '24.1.1'
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:support-v4:24.1.1'
compile 'com.android.support:appcompat-v7:24.1.1'
compile 'com.android.support:design:24.1.1'

// Annotation heaven
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.jakewharton:butterknife:8.2.1'
apt 'com.jakewharton:butterknife-compiler:8.2.1'
compile 'javax.annotation:jsr250-api:1.0'

compile 'com.hannesdorfmann.fragmentargs:annotation:3.0.2'
apt 'com.hannesdorfmann.fragmentargs:processor:3.0.2'

compile 'frankiesardo:icepick:3.2.0'
provided 'frankiesardo:icepick-processor:3.2.0'

// UI
compile "com.android.support:cardview-v7:$supportVersion"
compile "com.android.support:recyclerview-v7:$supportVersion"
compile 'com.android.support:cardview-v7:24.1.1'
compile 'com.android.support:recyclerview-v7:24.1.1'

// Testing
testCompile 'junit:junit:4.12'
androidTestCompile "com.android.support:support-annotations:$supportVersion"
androidTestCompile 'com.android.support.test:runner:0.4.1'
testCompile "org.robolectric:robolectric:3.0"
testCompile "org.mockito:mockito-core:1.10.19"
androidTestCompile "com.android.support:support-annotations:24.1.1"
androidTestCompile 'com.android.support.test:runner:0.5'
testCompile 'org.mockito:mockito-core:2.0.99-beta'
testCompile "org.robolectric:robolectric:3.1.2"
testCompile 'org.robolectric:shadows-support-v4:3.1.2'

// Network
compile 'com.squareup.okhttp:okhttp:2.7.5'
compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.squareup.retrofit2:retrofit:2.0.0'

compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'

// Image processor
compile 'com.github.bumptech.glide:glide:3.7.0'

// DI
compile 'com.google.dagger:dagger:2.6'
apt 'com.google.dagger:dagger-compiler:2.6'
provided 'javax.annotation:jsr250-api:1.0'

// Rx
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.8'

debugCompile 'com.facebook.stetho:stetho:1.2.0'
compile 'com.jakewharton.timber:timber:4.1.2'

}
23 changes: 23 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,26 @@
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

# Butterknife
-keep public class * implements butterknife.internal.ViewBinder { public <init>(); }

# Prevent obfuscation of types which use ButterKnife annotations since the simple name
# is used to reflectively look up the generated ViewBinder.
-keep class butterknife.*
-keepclasseswithmembernames class * { @butterknife.* <methods>; }
-keepclasseswithmembernames class * { @butterknife.* <fields>; }
-keepnames class * { @butterknife.Bind *;}

# Dagger
-keepclassmembers,allowobfuscation class * {
@javax.inject.* *;
@dagger.* *;
<init>();
}

-keep class javax.inject.** { *; }
-keep class **$$ModuleAdapter
-keep class **$$InjectAdapter
-keep class **$$StaticInjection
-keep class dagger.** { *; }
5 changes: 4 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,17 @@

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

<application
android:allowBackup="true"
android:name=".App"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"

android:theme="@style/AppTheme">
<activity android:name=".ListArtistsActivity">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down
30 changes: 30 additions & 0 deletions app/src/main/java/ru/aleien/yapplication/App.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package ru.aleien.yapplication;

import android.app.Application;

import com.facebook.stetho.Stetho;

import ru.aleien.yapplication.di.AppComponent;
import ru.aleien.yapplication.di.AppModule;
import ru.aleien.yapplication.di.DaggerAppComponent;
import timber.log.Timber;

public class App extends Application {
private AppComponent component;


@Override
public void onCreate() {
super.onCreate();
if (BuildConfig.DEBUG) Timber.plant(new Timber.DebugTree());
Stetho.initializeWithDefaults(this.getApplicationContext());
component = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();

}

public AppComponent dagger() {
return component;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package ru.aleien.yapplication;

import java.io.Serializable;

import ru.aleien.yapplication.model.Artist;

public interface ArtistClickHandler {
public interface ArtistClickHandler extends Serializable {
void artistClicked(Artist artist);
}
55 changes: 46 additions & 9 deletions app/src/main/java/ru/aleien/yapplication/ArtistsPresenter.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,31 @@
package ru.aleien.yapplication;

import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.util.Log;

import java.io.Serializable;
import java.lang.ref.WeakReference;
import java.util.List;

import javax.inject.Inject;

import ru.aleien.yapplication.base.BasePresenter;
import ru.aleien.yapplication.database.DBBackend;
import ru.aleien.yapplication.dataprovider.ArtistsProvider;
import ru.aleien.yapplication.dataprovider.WebArtistsProvider;
import ru.aleien.yapplication.model.Artist;
import ru.aleien.yapplication.screens.detailedinfo.ArtistInfoFragment;
import ru.aleien.yapplication.screens.detailedinfo.ArtistInfoView;
import ru.aleien.yapplication.screens.list.ArtistsListView;
import ru.aleien.yapplication.screens.list.ArtistsRecyclerFragment;
import ru.aleien.yapplication.screens.list.ArtistsView;
import ru.aleien.yapplication.screens.tabs.ArtistsTabsFragment;
import ru.aleien.yapplication.utils.adapters.ArtistsRecyclerAdapter;
import rx.Completable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import timber.log.Timber;

/**
* Created by aleien on 09.04.16.
Expand All @@ -25,17 +34,33 @@
*/
public class ArtistsPresenter extends BasePresenter<MainView> implements ArtistsRequester, ArtistClickHandler, Serializable {
ArtistsProvider artistsProvider;
private WeakReference<ArtistsListView<RecyclerView.Adapter>> artistsListView;
private final DBBackend dbSource;
private WeakReference<ArtistsView> artistsListView;
private WeakReference<Fragment> currentFragment;

public ArtistsPresenter(Context context) {
artistsProvider = new WebArtistsProvider(this, context);
@Inject
public ArtistsPresenter(DBBackend dbSource,
// Как здесь получать интерфейс?
WebArtistsProvider artistsProvider) {
this.dbSource = dbSource;
this.artistsProvider = artistsProvider;
}

@Override
public void takeListView(ArtistsListView<RecyclerView.Adapter> list) {
public void takeListView(ArtistsView list) {
artistsListView = new WeakReference<>(list);
artistsProvider.requestData();

subscribe(dbSource.getAllArtists()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::provideData,
throwable -> Timber.e("DBError", "Error while reading cached artists")));

artistsProvider.requestData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::provideData,
e -> Timber.e(e, "takeListView -> requestData"));
}

@Override
Expand All @@ -46,7 +71,16 @@ public void takeDetailedView(ArtistInfoView info, Artist artist) {

@Override
public void provideData(List<Artist> response) {
artistsListView.get().setAdapter(new ArtistsRecyclerAdapter(response, this));
if (artistsListView != null && artistsListView.get() != null) {
artistsListView.get().showContent(response, this);
}
dbSource.clearArtists();
Completable.fromAction(() -> {
Timber.e("Working on: " + Thread.currentThread().getName());
for (Artist artist : response) {
dbSource.insertArtist(artist);
}
}).subscribeOn(Schedulers.io()).subscribe();
}

@Override
Expand All @@ -60,11 +94,14 @@ public void artistClicked(Artist artist) {
@Override
public void onStart() {
if (currentFragment == null) {
ArtistsRecyclerFragment artistsListFragment = new ArtistsRecyclerFragment();
ArtistsTabsFragment artistsListFragment = new ArtistsTabsFragment();
takeListView(artistsListFragment);
currentFragment = new WeakReference<>(artistsListFragment);
// Из-за этого места не происходит нормально восстановить фрагмент!
// Нужно как-то сообщать презентеру, что происходит ПЕРЕсоздание
// Тут просто архитектурная ошибка, не знаю, как сходу поправить
getView().changeFragmentTo(currentFragment.get(), currentFragment.get() instanceof ArtistInfoFragment);
}

getView().changeFragmentTo(currentFragment.get(), currentFragment.get() instanceof ArtistInfoFragment);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import ru.aleien.yapplication.model.Artist;
import ru.aleien.yapplication.screens.detailedinfo.ArtistInfoView;
import ru.aleien.yapplication.screens.list.ArtistsListView;
import ru.aleien.yapplication.screens.list.ArtistsView;

/**
* Created by aleien on 09.04.16.
Expand All @@ -17,6 +18,6 @@
public interface ArtistsRequester {
void takeDetailedView(ArtistInfoView infoView, Artist artist);

void takeListView(ArtistsListView<RecyclerView.Adapter> listView);
void takeListView(ArtistsView listView);
void provideData(List<Artist> response);
}
Loading