Skip to content
Open
3 changes: 3 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,14 @@ dependencies {
compile libraries.supportDesign
compile libraries.supportRecyclerView
compile libraries.supportCardView
compile libraries.rx

compile libraries.butterKnife
apt libraries.butterKnifeCompiler

compile libraries.timber
compile libraries.rx
compile libraries.rxAndroid

// Developer tools (Developer Settings)
compile libraries.stetho
Expand Down
6 changes: 4 additions & 2 deletions app/src/main/java/ru/yandex/yamblz/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
import android.content.Context;
import android.support.annotation.NonNull;

import ru.yandex.yamblz.artists.utils.DataSingleton;
import ru.yandex.yamblz.developer_settings.DevMetricsProxy;
import ru.yandex.yamblz.developer_settings.DeveloperSettingsModel;
import ru.yandex.yamblz.handler.CriticalSectionsManager;
import ru.yandex.yamblz.handler.StubCriticalSectionsHandler;
import ru.yandex.yamblz.loader.CollageLoaderManager;
import timber.log.Timber;

Expand All @@ -23,7 +25,6 @@ public static App get(@NonNull Context context) {
public void onCreate() {
super.onCreate();
applicationComponent = prepareApplicationComponent().build();

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

Expand All @@ -35,7 +36,8 @@ public void onCreate() {
}

CollageLoaderManager.init(null); // add implementation
CriticalSectionsManager.init(null); // add implementation
CriticalSectionsManager.init(new StubCriticalSectionsHandler()); // add implementation
DataSingleton.init(this);
}

@NonNull
Expand Down
63 changes: 63 additions & 0 deletions app/src/main/java/ru/yandex/yamblz/artists/ArtistModel.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package ru.yandex.yamblz.artists;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

//Модель артиста,генерируется из jsonObject
public class ArtistModel {
protected JSONObject json;
public long id;
public String name;
public String smallImageUrl;
public String bigImageUrl;
public ArrayList<String> genres;
public int tracks;
public int albums;
public String link;
public String description;

public ArtistModel(){
genres=new ArrayList<>();
}

public ArtistModel(JSONObject artist){
this();
changeData(artist);
}

public void changeData(JSONObject json){
this.json = json;
genres.clear();
try {
id=json.getLong("id");
name=json.getString("name");
JSONArray genresJsonArray=json.getJSONArray("genres");
for (int i = 0; i < genresJsonArray.length(); i++) {
genres.add(genresJsonArray.getString(i));
}
smallImageUrl=json.getJSONObject("cover").getString("small");
bigImageUrl=json.getJSONObject("cover").getString("big");
tracks=json.getInt("tracks");
albums=json.getInt("albums");
if(json.has("link")){
link=json.getString("link");
}else{
link="";
}

description=json.getString("description");
if(!description.isEmpty()){//игнорируем пустые строки
description=Character.toUpperCase(description.charAt(0))+description.substring(1,description.length());
}
} catch (JSONException e) {
e.printStackTrace();
}
}

public JSONObject getJson() {
return json;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package ru.yandex.yamblz.artists;

import android.os.Bundle;
import android.support.v4.app.Fragment;


//retain fragment для загрузки данные,не имеет ui,нужен только
//для сохранения и доступа к DataLoadingModel
public class DataLoadingFragment extends Fragment {
private final DataLoadingModel dataLoadingModel;

public DataLoadingFragment() {
dataLoadingModel = new DataLoadingModel();
}

@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}

public DataLoadingModel getDataLoadingModel() {
return dataLoadingModel;
}
}
156 changes: 156 additions & 0 deletions app/src/main/java/ru/yandex/yamblz/artists/DataLoadingModel.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package ru.yandex.yamblz.artists;

import android.database.Observable;
import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import ru.yandex.yamblz.artists.utils.DataSingleton;

/*модель для асинхронной загрузки данных.
Можно подписатся на события:начала загрузки,ошибки,успеха
//при добавление слушателя,если данные сенйчас грузятся,
у слушателя вызавется onLoadingStart
*/
public class DataLoadingModel {


private static final String TAG = "DataLoadingModel";

private final DataLoadingObservable mObservable = new DataLoadingObservable();
private LoadAsyncTask loadingTask;
private boolean isWorking;

public DataLoadingModel() {
}

public void loadData() {
if (isWorking) {
return;
}
mObservable.notifyStarted();
isWorking = true;
loadingTask = new LoadAsyncTask();
loadingTask.execute();
}

public void stopLoadData() {
if (isWorking) {
loadingTask.cancel(true);
isWorking = false;
}
}

public void registerObserver(final Observer observer) {
mObservable.registerObserver(observer);
if (isWorking) {
observer.onLoadingStart(this);
}
}

public void unregisterObserver(final Observer observer) {
mObservable.unregisterObserver(observer);
}

public interface Observer {
void onLoadingStart(DataLoadingModel signInModel);

void onLoadingSucceeded(DataLoadingModel signInModel);

void onLoadingFailed(DataLoadingModel signInModel);
}

private class DataLoadingObservable extends Observable<Observer> {
public void notifyStarted() {
for (final Observer observer : mObservers) {
observer.onLoadingStart(DataLoadingModel.this);
}
}

public void notifySucceeded() {
for (final Observer observer : mObservers) {
observer.onLoadingSucceeded(DataLoadingModel.this);
}
}

public void notifyFailed() {
for (final Observer observer : mObservers) {
observer.onLoadingFailed(DataLoadingModel.this);
}
}
}
private class LoadAsyncTask extends AsyncTask<Void, Void, Boolean> {

protected String loadArtistsFromWeb() {
URL url = null;
BufferedReader reader = null;
String result=null;
try {
url = new URL("http://download.cdn.yandex.net/mobilization-2016/artists.json");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream();
StringBuilder buffer = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
result=buffer.toString();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if(reader!=null) try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;

}

protected boolean readArtistJson() {
if (DataSingleton.get().hasData()) {
Log.i(TAG, "already loaded");
return true;
} else {
String jsonString = loadArtistsFromWeb();
if (jsonString == null) {
Log.i(TAG, "failed to load data");
return false;
} else {
DataSingleton.get().setData(jsonString);
return true;
}
}

}

@Override
protected Boolean doInBackground(Void... voids) {
return readArtistJson();
}

@Override
protected void onPostExecute(Boolean success) {
super.onPostExecute(success);
isWorking = false;
if (success) {
Log.i(TAG,"successfully get data");
mObservable.notifySucceeded();
} else {
Log.i(TAG,"error while get data");
mObservable.notifyFailed();
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package ru.yandex.yamblz.artists;

import android.app.ProgressDialog;
import android.content.Context;
import android.util.Log;

public class DefaultLoadingObserver implements DataLoadingModel.Observer {

private ProgressDialog progressDialog;
private Context context;
private static final String TAG = "DefaultLoadingObserver";

public DefaultLoadingObserver(Context context){
this.context=context;
}

@Override
public void onLoadingStart(DataLoadingModel loadingModel) {
if(progressDialog==null){
progressDialog = new ProgressDialog(context);
}
progressDialog.setCancelable(false);
progressDialog.setMessage("Loading...");
progressDialog.show();
Log.i(TAG, "start getting data");
}

@Override
public void onLoadingSucceeded(DataLoadingModel loadingModel) {
Log.i(TAG, "successfully get data");
progressDialog.dismiss();
dispose();

}

@Override
public void onLoadingFailed(DataLoadingModel loadingModel) {
progressDialog.dismiss();
Log.i(TAG, "failed get data");
dispose();
}

public void dispose(){
if(progressDialog!=null)progressDialog.dismiss();
}

}
Loading