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
5 changes: 5 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,11 @@ dependencies {
compile libraries.butterKnife
apt libraries.butterKnifeCompiler

compile libraries.retrofit2
compile libraries.rxAndroid
compile libraries.converterGson
compile libraries.adapterRxjava

compile libraries.timber

// Developer tools (Developer Settings)
Expand Down
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
package="ru.yandex.yamblz">

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

<application
android:name="ru.yandex.yamblz.App"
Expand Down
47 changes: 39 additions & 8 deletions app/src/main/java/ru/yandex/yamblz/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,44 @@

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

import ru.yandex.yamblz.developer_settings.DevMetricsProxy;
import ru.yandex.yamblz.developer_settings.DeveloperSettingsModel;
import ru.yandex.yamblz.genre.data.source.DataSource;
import ru.yandex.yamblz.genre.data.source.RemoteDataSource;
import ru.yandex.yamblz.genre.data.source.Repository;
import ru.yandex.yamblz.genre.data.source.local.CacheImpl;
import ru.yandex.yamblz.genre.data.source.local.JsonSerializer;
import ru.yandex.yamblz.genre.util.NetworkManager;
import ru.yandex.yamblz.handler.CriticalSectionsManager;
import ru.yandex.yamblz.handler.SimpleCriticalSectionHandler;
import ru.yandex.yamblz.loader.CollageLoaderManager;
import ru.yandex.yamblz.loader.CriticalSectionsCollageLoader;
import ru.yandex.yamblz.loader.SimpleCollageLoader;
import timber.log.Timber;

public class App extends Application {
public class App extends Application
{
private ApplicationComponent applicationComponent;
private DataSource artistRepository;

// Prevent need in a singleton (global) reference to the application object.
@NonNull
public static App get(@NonNull Context context) {
public static App get(@NonNull Context context)
{
return (App) context.getApplicationContext();
}

@Override
public void onCreate() {
public void onCreate()
{
super.onCreate();
applicationComponent = prepareApplicationComponent().build();

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

DeveloperSettingsModel developerSettingModel = applicationComponent.developerSettingModel();
Expand All @@ -34,18 +49,34 @@ public void onCreate() {
devMetricsProxy.apply();
}

CollageLoaderManager.init(null); // add implementation
CriticalSectionsManager.init(null); // add implementation
NetworkManager.init(getApplicationContext());
artistRepository = new Repository(
new CacheImpl(getCacheDir(), new JsonSerializer()),
new RemoteDataSource());

// первое задание, раскомментировать
//CollageLoaderManager.init(new SimpleCollageLoader(new Handler(getMainLooper())));

//второе задание, соотвественно, закомментировать
CriticalSectionsManager.init(new SimpleCriticalSectionHandler(new Handler(getMainLooper())));
CollageLoaderManager.init(new CriticalSectionsCollageLoader());
}

@NonNull
protected DaggerApplicationComponent.Builder prepareApplicationComponent() {
protected DaggerApplicationComponent.Builder prepareApplicationComponent()
{
return DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(this));
}

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

public DataSource getArtistRepository()
{
return artistRepository;
}
}
105 changes: 105 additions & 0 deletions app/src/main/java/ru/yandex/yamblz/genre/GenresFragment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package ru.yandex.yamblz.genre;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import java.io.File;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import ru.yandex.yamblz.App;
import ru.yandex.yamblz.R;
import ru.yandex.yamblz.genre.adapter.CollageAdapter;
import ru.yandex.yamblz.genre.data.entity.Artist;
import ru.yandex.yamblz.genre.data.entity.Genre;
import ru.yandex.yamblz.genre.data.source.DataSource;
import ru.yandex.yamblz.genre.data.source.RemoteDataSource;
import ru.yandex.yamblz.genre.data.source.Repository;
import ru.yandex.yamblz.genre.interfaces.GenresPresenter;
import ru.yandex.yamblz.genre.interfaces.GenresView;
import ru.yandex.yamblz.ui.fragments.BaseFragment;

public class GenresFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener, GenresView {

private GenresPresenter<GenresView> presenter;
private CollageAdapter collageAdapter;

@BindView(R.id.rv_collages)
RecyclerView recyclerView;
@BindView(R.id.swipe_view)
SwipeRefreshLayout swipeLayout;

@Override
public void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
presenter = new GenresPresenterImpl(App.get(getContext()).getArtistRepository());
}

@NonNull
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle bundle)
{
return inflater.inflate(R.layout.fragment_content, container, false);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
collageAdapter = new CollageAdapter();
recyclerView.setAdapter(collageAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
swipeLayout.setOnRefreshListener(this);
recyclerView.addOnScrollListener(new RecyclerScrollListener());
}

@Override
public void onResume()
{
super.onResume();
presenter.bind(this);
presenter.getGenres(false);
}

@Override
public void onPause()
{
super.onPause();
presenter.unsubscribe();
presenter.unbind();
}

@Override
public void showProgress(boolean show)
{
swipeLayout.setRefreshing(show);
}

@Override
public void showGenres(List<Genre> genresList) {
collageAdapter.swap(genresList);
}

@Override
public void showError(String error)
{
Toast.makeText(getContext(), error, Toast.LENGTH_SHORT).show();
}

@Override
public void onRefresh()
{
presenter.getGenres(true);
}
}
82 changes: 82 additions & 0 deletions app/src/main/java/ru/yandex/yamblz/genre/GenresPresenterImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package ru.yandex.yamblz.genre;

import java.util.List;

import ru.yandex.yamblz.genre.data.entity.Genre;
import ru.yandex.yamblz.genre.data.source.DataSource;
import ru.yandex.yamblz.genre.interfaces.GenresPresenter;
import ru.yandex.yamblz.genre.interfaces.GenresView;
import ru.yandex.yamblz.genre.util.INetworkManager;
import ru.yandex.yamblz.genre.util.NetworkManager;
import ru.yandex.yamblz.genre.util.Utils;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import rx.subscriptions.CompositeSubscription;

/**
* Created by platon on 27.07.2016.
*/
public class GenresPresenterImpl implements GenresPresenter<GenresView>
{
private GenresView genresView;
private CompositeSubscription subscriptions;
private DataSource dataSource;
private INetworkManager networkManager;

public GenresPresenterImpl(DataSource dataSource)
{
this.dataSource = dataSource;
networkManager = NetworkManager.getManager();
subscriptions = new CompositeSubscription();
}

@Override
public void getGenres(boolean forceLoad)
{
if (networkManager.networkIsAvailable())
{
genresView.showProgress(true);
if (forceLoad) dataSource.delete();

subscriptions.add(dataSource.getGenres()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(onNext, onError));
}
else
{
genresView.showError("no connection");
}
}

@Override
public void bind(GenresView view)
{
genresView = view;
}

@Override
public void unbind()
{
genresView = null;
}

@Override
public void unsubscribe()
{
subscriptions.clear();
}

private Action1<List<Genre>> onNext = genres ->
{
genresView.showProgress(false);
genresView.showGenres(genres);
};

private Action1<Throwable> onError = e ->
{
genresView.showProgress(false);
genresView.showError(e.getMessage());
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package ru.yandex.yamblz.genre;

import android.support.v7.widget.RecyclerView;

import ru.yandex.yamblz.handler.CriticalSectionsHandler;
import ru.yandex.yamblz.handler.CriticalSectionsManager;

/**
* Created by platon on 30.07.2016.
*/
public class RecyclerScrollListener extends RecyclerView.OnScrollListener
{
public static final int CS_ID = 1991;
private final CriticalSectionsHandler criticalSectionsHandler;

public RecyclerScrollListener()
{
super();
criticalSectionsHandler = CriticalSectionsManager.getHandler();
}

@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState)
{
switch (newState)
{
case RecyclerView.SCROLL_STATE_IDLE:
criticalSectionsHandler.stopSection(CS_ID);
break;

case RecyclerView.SCROLL_STATE_DRAGGING:
criticalSectionsHandler.startSection(CS_ID);
break;
}

}
}
Loading